windows-nt/Source/XPSP1/NT/sdktools/tweakui/lvchk.cpp
2020-09-26 16:20:57 +08:00

70 lines
2.1 KiB
C++

/*
* lvchk - common dialog proc handler for check-listview pages
*/
#include "tweakui.h"
#pragma BEGIN_CONST_DATA
#pragma END_CONST_DATA
/*****************************************************************************
*
* Checklist_OnInitDialog
*
* Walk the items that can live on the checklist.
*
* If the item can't report its state, then don't put it on the list.
*
*****************************************************************************/
void PASCAL
Checklist_OnInitDialog(HWND hwnd, PCCHECKLISTITEM rgcli, int ccli,
UINT ids, LPVOID pvRef)
{
TCHAR tsz[MAX_PATH];
int dids;
for (dids = 0; dids < ccli; dids++) {
BOOL f = rgcli[dids].GetCheckValue(rgcli[dids].lParam, pvRef);
if (f >= 0) {
LoadString(hinstCur, ids+dids, tsz, cA(tsz));
LV_AddItem(hwnd, dids, tsz, -1, f);
}
}
}
/*****************************************************************************
*
* Checklist_OnApply
*
* Walk the items in the checklist and dork them if they have changed.
*
* The fForce flag forces us to call the callback even if nothing changed.
*
*****************************************************************************/
void PASCAL
Checklist_OnApply(HWND hdlg, PCCHECKLISTITEM rgcli, LPVOID pvRef, BOOL fForce)
{
HWND hwnd = GetDlgItem(hdlg, IDC_ICONLV);
int cItems = ListView_GetItemCount(hwnd);
LV_ITEM lvi;
for (lvi.iItem = 0; lvi.iItem < cItems; lvi.iItem++) {
BOOL fNew, fOld;
lvi.stateMask = LVIS_STATEIMAGEMASK;
Misc_LV_GetItemInfo(hwnd, &lvi, lvi.iItem, LVIF_PARAM | LVIF_STATE);
fNew = LV_IsChecked(&lvi);
fOld = rgcli[lvi.lParam].GetCheckValue(rgcli[lvi.lParam].lParam,
pvRef);
if (fOld >= 0 && (fForce || fNew != fOld)) {
if (!rgcli[lvi.lParam].SetCheckValue(fNew, rgcli[lvi.lParam].lParam,
pvRef)) {
lvi.state = INDEXTOSTATEIMAGEMASK(fOld + 1);
ListView_SetItem(hwnd, &lvi); /* Restore the state */
}
}
}
}