ReactOS 0.4.16-dev-1946-g52006dd
CRegTreeOptions Class Reference

#include <regtreeoptions.h>

Inheritance diagram for CRegTreeOptions:
Collaboration diagram for CRegTreeOptions:

Public Member Functions

 CRegTreeOptions ()
 
 ~CRegTreeOptions ()
 
void AddItemsFromRegistry (HKEY hKey, HTREEITEM hParent, HTREEITEM hInsertAfter)
 
HRESULT GetSetState (HKEY hKey, DWORD &Type, LPBYTE Data, DWORD &Size, BOOL Set)
 
HRESULT GetCheckState (HKEY hKey, BOOL UseDefault=FALSE)
 
HRESULT SaveCheckState (HKEY hKey, BOOL Checked)
 
void WalkTree (WALK_TREE_CMD Command, HWND hTree, HTREEITEM hTI)
 
STDMETHOD() InitTree (HWND hTV, HKEY hKey, LPCSTR SubKey, char const *pUnknown) override
 
STDMETHOD() WalkTree (WALK_TREE_CMD Command) override
 
STDMETHOD() ToggleItem (HTREEITEM hTI) override
 
STDMETHOD() ShowHelp (HTREEITEM hTI, unsigned long Unknown) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 

Private Attributes

HWND m_hTree
 
HIMAGELIST m_hIL
 

Additional Inherited Members

- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Detailed Description

Definition at line 10 of file regtreeoptions.h.

Constructor & Destructor Documentation

◆ CRegTreeOptions()

CRegTreeOptions::CRegTreeOptions ( )

Definition at line 409 of file regtreeoptions.cpp.

410{
411 m_hTree = NULL;
412 m_hIL = NULL;
413}
HIMAGELIST m_hIL
#define NULL
Definition: types.h:112

◆ ~CRegTreeOptions()

CRegTreeOptions::~CRegTreeOptions ( )

Definition at line 415 of file regtreeoptions.cpp.

416{
417 if (m_hIL && m_hTree)
419}
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:941
#define TVSIL_NORMAL
Definition: commctrl.h:3448
#define TreeView_SetImageList(hwnd, himl, iImage)
Definition: commctrl.h:3452

Member Function Documentation

◆ AddItemsFromRegistry()

void CRegTreeOptions::AddItemsFromRegistry ( HKEY  hKey,
HTREEITEM  hParent,
HTREEITEM  hInsertAfter 
)

Definition at line 421 of file regtreeoptions.cpp.

422{
423 for (DWORD Index = 0, cchName;;)
424 {
425 WCHAR Name[MAX_PATH], Temp[MAX_PATH];
428 break;
429
430 HKEY hItemKey, hCloseKey = NULL;
431 if (RegOpenKeyExW(hKey, Name, 0, KEY_READ, &hItemKey) != ERROR_SUCCESS)
432 continue;
433
434 TVINSERTSTRUCT tvis;
435 TVITEM &tvi = tvis.item;
437 tvi.lParam = (LPARAM)hItemKey;
439 if (GetRegString(hItemKey, L"Type", Temp, _countof(Temp)) > 0)
440 {
441 if (!lstrcmpi(Temp, L"checkbox"))
443 if (!lstrcmpi(Temp, L"radio"))
445 if (!lstrcmpi(Temp, L"group"))
447 }
448 BOOL Valid = Type != TYPE_INVALID;
449
450 if (Type == TYPE_GROUP)
451 {
452 tvi.lParam = 0;
453 hCloseKey = hItemKey;
454 tvi.iImage = AddIconFromRegistry(m_hIL, hItemKey, L"Bitmap");
455 }
456 else if (Valid)
457 {
458 HRESULT hr = GetCheckState(hItemKey);
459 Valid = SUCCEEDED(hr);
460 tvi.iImage = (Type * STATEIMAGESPERTYPE) | (hr == S_OK);
461 }
462
463 if (Valid)
464 {
465 if (SUCCEEDED(SHLoadRegUIStringW(hItemKey, L"Text", Temp, _countof(Temp))))
466 tvi.pszText = Temp;
467 else
468 tvi.pszText = Name;
469#ifdef __REACTOS__ // Grayed is a ROS extension
470 DWORD grayed = GetRegDWORD(hItemKey, L"Grayed", DWORD(FALSE));
471 if (grayed)
472 {
473 tvi.lParam = (LPARAM)HKEY_GRAYED;
474 hCloseKey = hItemKey;
475 tvi.iImage += 2; // Use disabled state image
476 if (grayed & 4)
477 tvi.iImage = (tvi.iImage & ~1) | ((grayed & 2) != 0); // Force a specific state
478 }
479#endif
480 tvi.iSelectedImage = tvi.iImage;
481 tvis.hParent = hParent;
482 tvis.hInsertAfter = hInsertAfter;
483 Valid = (tvi.hItem = TreeView_InsertItem(m_hTree, &tvis)) != NULL;
484 }
485
486 if (Valid && Type == TYPE_GROUP)
487 {
488 AddItemsFromRegistry(hItemKey, tvi.hItem, TVI_FIRST);
490 }
491 if (!Valid)
492 RegCloseKey(hItemKey);
493 if (hCloseKey && hItemKey != hCloseKey)
494 RegCloseKey(hCloseKey);
495 }
497}
Type
Definition: Type.h:7
LPCWSTR GetRegString(CRegKey &Key, LPCWSTR Name, CStringW &Value)
Definition: misc.cpp:464
#define RegCloseKey(hKey)
Definition: registry.h:49
void AddItemsFromRegistry(HKEY hKey, HTREEITEM hParent, HTREEITEM hInsertAfter)
HRESULT GetCheckState(HKEY hKey, BOOL UseDefault=FALSE)
#define ERROR_SUCCESS
Definition: deptool.c:10
LPWSTR Name
Definition: desk.c:124
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
#define MAX_PATH
Definition: compat.h:34
HRESULT WINAPI SHLoadRegUIStringW(HKEY hkey, LPCWSTR value, LPWSTR buf, DWORD size)
Definition: ordinal.c:4413
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
LONG_PTR LPARAM
Definition: minwindef.h:175
unsigned int UINT
Definition: ndis.h:50
#define KEY_READ
Definition: nt_native.h:1026
#define DWORD
Definition: nt_native.h:44
#define TVITEM
Definition: commctrl.h:3370
#define TVIF_TEXT
Definition: commctrl.h:3271
#define TreeView_Expand(hwnd, hitem, code)
Definition: commctrl.h:3425
#define TVINSERTSTRUCT
Definition: commctrl.h:3407
#define TVIF_IMAGE
Definition: commctrl.h:3272
#define TVI_FIRST
Definition: commctrl.h:3374
#define TVE_EXPAND
Definition: commctrl.h:3428
#define TVM_SORTCHILDREN
Definition: commctrl.h:3546
#define TVIF_PARAM
Definition: commctrl.h:3273
#define TreeView_InsertItem(hwnd, lpis)
Definition: commctrl.h:3417
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3276
static int AddIconFromRegistry(HIMAGELIST hIL, HKEY hKey, LPCWSTR Name)
#define HKEY_GRAYED
@ TYPE_RADIO
@ TYPE_CHECK
@ STATEIMAGESPERTYPE
@ TYPE_GROUP
@ TYPE_INVALID
static DWORD GetRegDWORD(HKEY hKey, LPCWSTR Name, PDWORD Data)
HRESULT hr
Definition: shlfolder.c:183
#define _countof(array)
Definition: sndvol32.h:70
_In_ WDFCOLLECTION _In_ ULONG Index
#define lstrcmpi
Definition: winbase.h:3622
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2521
#define SendMessage
Definition: winuser.h:5954
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by AddItemsFromRegistry(), and InitTree().

◆ GetCheckState()

HRESULT CRegTreeOptions::GetCheckState ( HKEY  hKey,
BOOL  UseDefault = FALSE 
)

Definition at line 290 of file regtreeoptions.cpp.

291{
292 BYTE CurrData[MAXVALUEDATA], CheckData[MAXVALUEDATA];
293 DWORD CurrType, CheckType, CurrSize, CheckSize, Err, Checked;
294
295 if (hKey == HKEY_GRAYED)
297
298 CheckSize = sizeof(CheckData);
299 Err = SHRegGetValueW(hKey, NULL, L"CheckedValue", SRRF_RT_ANY, &CheckType, CheckData, &CheckSize);
300 if (Err)
301 return HRESULT_FROM_WIN32(Err);
302
303 HRESULT hr = E_FAIL;
304 if (!UseDefault)
305 {
306 CurrSize = sizeof(CurrData);
307 hr = GetSetState(hKey, CurrType, CurrData, CurrSize, FALSE);
308 }
309 if (FAILED(hr))
310 {
311 CurrSize = sizeof(CurrData);
312 hr = GetDefaultValue(hKey, CurrType, CurrData, CurrSize);
313 }
314 if (FAILED(hr))
315 {
316 return hr;
317 }
318
319 CurrType = NormalizeRegType(CurrType);
320 CheckType = NormalizeRegType(CheckType);
321 if (CurrType == (UINT)REG_GET_DIRECT)
322 {
323 Checked = *(BOOL*)CurrData;
324 }
325 else if (CurrType != CheckType)
326 {
328 }
329 else if (CheckType == REG_SZ)
330 {
331 *(LPWSTR)(&CheckData[sizeof(CheckData) - sizeof(WCHAR)]) = UNICODE_NULL;
332 if (CheckSize <= sizeof(CheckData) - sizeof(WCHAR))
333 *(LPWSTR)(&CheckData[CheckSize]) = UNICODE_NULL;
334 Checked = !lstrcmpiW((LPWSTR)CheckData, (LPWSTR)CurrData);
335 }
336 else if (CheckType == REG_BINARY)
337 {
338 Checked = CheckSize == CurrSize && !memcmp(CheckData, CurrData, CurrSize);
339 }
340 else
341 {
343 }
344 return Checked ? S_OK : S_FALSE;
345}
VOID CheckSize(ULONG_PTR Base, SIZE_T InSize, SIZE_T ExpectedSize)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
HRESULT GetSetState(HKEY hKey, DWORD &Type, LPBYTE Data, DWORD &Size, BOOL Set)
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4265
#define FAILED(hr)
Definition: intsafe.h:51
#define REG_SZ
Definition: layer.c:22
@ Checked
Definition: olepro.idl:92
#define REG_BINARY
Definition: nt_native.h:1499
#define UNICODE_NULL
#define SRRF_RT_ANY
Definition: shlwapi.h:704
@ REG_GET_DIRECT
#define MAXVALUEDATA
static DWORD NormalizeRegType(DWORD Type)
static HRESULT GetDefaultValue(HKEY hKey, DWORD &Type, LPVOID Data, DWORD &Size)
WINSHLWAPI LSTATUS WINAPI SHRegGetValueW(HKEY, LPCWSTR, LPCWSTR, SRRF, LPDWORD, LPVOID, LPDWORD)
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define ERROR_BAD_FORMAT
Definition: winerror.h:236
WCHAR * LPWSTR
Definition: xmlstorage.h:184
unsigned char BYTE
Definition: xxhash.c:193

Referenced by AddItemsFromRegistry(), and WalkTree().

◆ GetSetState()

HRESULT CRegTreeOptions::GetSetState ( HKEY  hKey,
DWORD Type,
LPBYTE  Data,
DWORD Size,
BOOL  Set 
)

Definition at line 166 of file regtreeoptions.cpp.

167{
168 HRESULT hr;
169 UINT SysParam = GetRegDWORD(hKey, Set ? L"SPIActionSet" : L"SPIActionGet", DWORD(0));
170 if (SysParam)
171 {
172 Size = sizeof(BOOL);
173 Type = REG_DWORD;
175 return S_OK;
176 }
177
178 // learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-iregtreeitem
179 WCHAR szTemp[42];
180 CLSID clsid;
181 if (SUCCEEDED(GetRegString(hKey, L"CLSID", szTemp, _countof(szTemp))) &&
183 {
184 IRegTreeItem *pRTI;
185 if (SUCCEEDED(hr = IUnknown_QueryService(m_pUnkSite, clsid, IID_PPV_ARG(IRegTreeItem, &pRTI))) ||
186 SUCCEEDED(hr = SHCoCreateInstance(NULL, &clsid, NULL, IID_PPV_ARG(IRegTreeItem, &pRTI))))
187 {
188 BOOL *boolptr = (BOOL*)Data;
189 Size = sizeof(BOOL);
191 hr = Set ? pRTI->SetCheckState(*boolptr) : pRTI->GetCheckState(boolptr);
192 pRTI->Release();
193 }
194 return hr;
195 }
196
197 DWORD Mask = ~DWORD(0), Offset = 0;
198 BOOL HasMask = GetRegDWORD(hKey, L"Mask", &Mask) == ERROR_SUCCESS;
199 BOOL HasOffset = GetRegDWORD(hKey, L"Offset", &Offset) == ERROR_SUCCESS;
200
202 WCHAR SubKey[MAX_PATH], Name[100];
203 hr = GetRegString(hKey, L"RegPath", SubKey, _countof(SubKey));
204 if (FAILED(hr))
205 return hr;
206 hr = GetRegString(hKey, L"ValueName", Name, _countof(Name));
207 if (FAILED(hr))
208 return hr;
209 DWORD Err, cb;
210 if (Set)
211 Err = RegCreateKeyExW(hValueKey, SubKey, 0, NULL, 0, KEY_READ | KEY_SET_VALUE, NULL, &hValueKey, NULL);
212 else
213 Err = RegOpenKeyExW(hValueKey, SubKey, 0, KEY_READ, &hValueKey);
214 if (Err)
215 return HRESULT_FROM_WIN32(Err);
216
217 if (Set && (HasMask || HasOffset))
218 {
219 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, NULL, NULL, &cb);
220 hr = HRESULT_FROM_WIN32(Err);
221 if (Err == ERROR_FILE_NOT_FOUND)
222 {
223 DWORD DefaultData = 0;
224 cb = sizeof(DefaultData);
225 hr = GetDefaultValue(hKey, Type, &DefaultData, cb);
226 if (SUCCEEDED(hr))
227 {
228 Err = SHSetValueW(hValueKey, NULL, Name, Type, &DefaultData, cb);
229 hr = HRESULT_FROM_WIN32(Err);
230 }
231 }
232
233 if (SUCCEEDED(hr))
234 {
235 Err = ERROR_OUTOFMEMORY;
236 cb = max(cb, (Offset + 1) * sizeof(DWORD));
237 if (PDWORD pBigData = (PDWORD)LocalAlloc(LPTR, cb)) // LPTR to zero extended data
238 {
239 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, &Type, pBigData, &cb);
240 Size = cb;
241 if (Err == ERROR_SUCCESS)
242 {
243 pBigData[Offset] &= ~Mask;
244 pBigData[Offset] |= *((PDWORD)Data);
245 Err = SHSetValueW(hValueKey, NULL, Name, Type, pBigData, cb);
246 }
247 LocalFree(pBigData);
248 }
249 hr = HRESULT_FROM_WIN32(Err);
250 }
251 }
252 else if (Set)
253 {
254 Err = SHSetValueW(hValueKey, NULL, Name, Type, Data, Size);
255 hr = HRESULT_FROM_WIN32(Err);
256 }
257 else
258 {
259 if (Offset && HasOffset)
260 {
261 Size = sizeof(DWORD);
262 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, NULL, NULL, &cb);
263 if (Err == ERROR_SUCCESS)
264 {
265 Err = ERROR_OUTOFMEMORY;
266 if (PDWORD pBigData = (PDWORD)LocalAlloc(LPTR, cb))
267 {
268 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, &Type, pBigData, &cb);
269 if (Offset < cb / sizeof(DWORD) && Err == ERROR_SUCCESS)
270 *((PDWORD)Data) = pBigData[Offset];
271 else
272 *((PDWORD)Data) = 0; // Value not present or offset too large
273 LocalFree(pBigData);
274 }
275 }
276 }
277 else
278 {
279 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, &Type, Data, &Size);
280 }
281
282 hr = HRESULT_FROM_WIN32(Err);
283 if (HasMask && SUCCEEDED(hr))
284 *((PDWORD)Data) &= Mask;
285 }
286 RegCloseKey(hValueKey);
287 return hr;
288}
#define HandleToLong(h)
Definition: basetsd.h:74
#define LongToHandle(h)
Definition: basetsd.h:76
HANDLE HKEY
Definition: registry.h:26
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppv)
Definition: shellole.c:197
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1501
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
unsigned int Mask
Definition: fpcontrol.c:82
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define LPTR
Definition: minwinbase.h:93
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
const CLSID * clsid
Definition: msctf.cpp:50
#define BOOL
Definition: nt_native.h:43
#define KEY_SET_VALUE
Definition: nt_native.h:1020
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
static BOOL Set
Definition: pageheap.c:10
DWORD * PDWORD
Definition: pedump.c:68
#define REG_DWORD
Definition: sdbapi.c:615
EXTERN_C BOOL WINAPI SHBoolSystemParametersInfo(UINT uiAction, PVOID pvParam)
#define max(a, b)
Definition: svc.c:63
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define IID_PPV_ARG(Itype, ppType)

Referenced by GetCheckState(), and SaveCheckState().

◆ InitTree()

HRESULT STDMETHODCALLTYPE CRegTreeOptions::InitTree ( HWND  hTV,
HKEY  hKey,
LPCSTR  SubKey,
char const pUnknown 
)
override

Definition at line 499 of file regtreeoptions.cpp.

500{
502 m_hTree = hTV;
503
506 if (hIL)
508
512 {
515 }
516
518 return E_NOTIMPL;
519}
PRTL_UNICODE_STRING_BUFFER Path
#define E_NOTIMPL
Definition: ddrawi.h:99
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
Definition: string.c:2673
_In_ PUNKNOWN pUnknown
Definition: drmk.h:76
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1022
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define TreeView_EnsureVisible(hwnd, hitem)
Definition: commctrl.h:3550
#define TVI_ROOT
Definition: commctrl.h:3373
#define TreeView_GetRoot(hwnd)
Definition: commctrl.h:3480
static HIMAGELIST CreateStateImages(UINT ImageSize)
#define SM_CXSMICON
Definition: winuser.h:1023
int WINAPI GetSystemMetrics(_In_ int)

◆ SaveCheckState()

HRESULT CRegTreeOptions::SaveCheckState ( HKEY  hKey,
BOOL  Checked 
)

Definition at line 347 of file regtreeoptions.cpp.

348{
350 DWORD Type = REG_DWORD, Size = sizeof(Data);
351 *((PDWORD)Data) = Checked;
352 LPCWSTR Name = Checked ? L"CheckedValue" : L"UncheckedValue";
354 if (Err == ERROR_FILE_NOT_FOUND)
355 Err = ERROR_SUCCESS;
356 return Err ? HRESULT_FROM_WIN32(Err) : GetSetState(hKey, Type, Data, Size, TRUE);
357}
#define TRUE
Definition: types.h:120
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by WalkTree().

◆ ShowHelp()

HRESULT STDMETHODCALLTYPE CRegTreeOptions::ShowHelp ( HTREEITEM  hTI,
unsigned long  Unknown 
)
override

Definition at line 571 of file regtreeoptions.cpp.

572{
573 return E_NOTIMPL;
574}

◆ ToggleItem()

HRESULT STDMETHODCALLTYPE CRegTreeOptions::ToggleItem ( HTREEITEM  hTI)
override

Definition at line 531 of file regtreeoptions.cpp.

532{
533 TVITEM tvi;
535 tvi.hItem = hTI;
536 if (!tvi.hItem || !TreeView_GetItem(m_hTree, &tvi))
537 return E_INVALIDARG;
538
539 if (tvi.iImage >= STATE_GROUP || (HKEY)tvi.lParam == HKEY_GRAYED)
540 return S_FALSE;
541
542 if (tvi.iImage <= max(STATE_CHECKOFF, STATE_CHECKON))
543 {
544 tvi.iImage ^= 1;
545 }
546 else
547 {
549 while (hRadio) // Turn off everyone in this group
550 {
551 tvi.hItem = hRadio;
552 tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
553 if (TreeView_GetItem(m_hTree, &tvi) && tvi.iImage == STATE_RADIOON && hRadio != hTI)
554 {
555 tvi.iImage ^= 1;
556 tvi.iSelectedImage = tvi.iImage;
558 }
559 hRadio = TreeView_GetNextSibling(m_hTree, hRadio);
560 }
561 tvi.iImage = STATE_RADIOON;
562 }
563
564 tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
565 tvi.hItem = hTI;
566 tvi.iSelectedImage = tvi.iImage;
568 return S_OK;
569}
@ STATE_GROUP
Definition: interpreter.c:19
#define E_INVALIDARG
Definition: ddrawi.h:101
#define TreeView_GetChild(hwnd, hitem)
Definition: commctrl.h:3471
#define TreeView_GetParent(hwnd, hitem)
Definition: commctrl.h:3474
#define TreeView_GetItem(hwnd, pitem)
Definition: commctrl.h:3495
#define TreeView_GetNextSibling(hwnd, hitem)
Definition: commctrl.h:3472
#define TreeView_SetItem(hwnd, pitem)
Definition: commctrl.h:3502
@ STATE_CHECKON
@ STATE_RADIOON
@ STATE_CHECKOFF
int iSelectedImage
Definition: treeview.c:148

◆ WalkTree() [1/2]

HRESULT STDMETHODCALLTYPE CRegTreeOptions::WalkTree ( WALK_TREE_CMD  Command)
override

Definition at line 521 of file regtreeoptions.cpp.

522{
523 for (HTREEITEM hTI = TreeView_GetRoot(m_hTree); hTI;)
524 {
525 WalkTree(Command, m_hTree, hTI);
527 }
528 return S_OK;
529}
void WalkTree(WALK_TREE_CMD Command, HWND hTree, HTREEITEM hTI)
Definition: shell.h:41

◆ WalkTree() [2/2]

void CRegTreeOptions::WalkTree ( WALK_TREE_CMD  Command,
HWND  hTree,
HTREEITEM  hTI 
)

Definition at line 359 of file regtreeoptions.cpp.

360{
361 for (HTREEITEM hChildTI = TreeView_GetChild(hTree, hTI); hChildTI;)
362 {
363 WalkTree(Command, hTree, hChildTI);
364 hChildTI = TreeView_GetNextSibling(hTree, hChildTI);
365 }
366
367 TVITEM tvi;
369 tvi.hItem = hTI;
370 if (!TreeView_GetItem(hTree, &tvi))
371 return;
372
373 HKEY hKey = (HKEY)tvi.lParam;
374 UINT State = tvi.iImage;
376 {
377 case WALK_TREE_SAVE:
380 else if (State == STATE_CHECKOFF)
382 break;
383
385 if (hKey && hKey != HKEY_GRAYED)
386 {
388 tvi.lParam = 0;
389 tvi.mask = TVIF_PARAM;
390 TreeView_SetItem(hTree, &tvi);
391 }
392 break;
393
396 if (State < STATE_GROUP)
397 {
399 if (SUCCEEDED(hr))
400 {
401 tvi.iImage = tvi.iSelectedImage = (tvi.iImage & ~1) | (hr == S_OK);
402 TreeView_SetItem(hTree, &tvi);
403 }
404 }
405 break;
406 }
407}
HRESULT SaveCheckState(HKEY hKey, BOOL Checked)
switch(r->id)
Definition: btrfs.c:3046
@ WALK_TREE_REFRESH
Definition: shlobj_undoc.h:498
@ WALK_TREE_DESTROY
Definition: shlobj_undoc.h:496
@ WALK_TREE_DEFAULT
Definition: shlobj_undoc.h:497
@ WALK_TREE_SAVE
Definition: shlobj_undoc.h:495
static HWND hTree
Definition: systempage.cpp:52

Referenced by WalkTree().

Member Data Documentation

◆ m_hIL

HIMAGELIST CRegTreeOptions::m_hIL
private

Definition at line 18 of file regtreeoptions.h.

Referenced by AddItemsFromRegistry(), CRegTreeOptions(), InitTree(), and ~CRegTreeOptions().

◆ m_hTree

HWND CRegTreeOptions::m_hTree
private

The documentation for this class was generated from the following files: