4 * Copyright (C) 2002 Robert Dickenson <robd@reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define WIN32_LEAN_AND_MEAN /* Exclude rarely-used stuff from Windows headers */
34 #include "wine/unicode.h"
36 /********************************************************************************
37 * Global and Local Variables:
40 static WCHAR favoritesKey
[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','A','p','p','l','e','t','s','\\','R','e','g','E','d','i','t','\\','F','a','v','o','r','i','t','e','s',0};
41 static BOOL bInMenuLoop
= FALSE
; /* Tells us if we are in the menu loop */
42 static WCHAR favoriteName
[128];
43 static WCHAR searchString
[128];
44 static int searchMask
= SEARCH_KEYS
| SEARCH_VALUES
| SEARCH_CONTENT
;
46 static WCHAR FileNameBuffer
[_MAX_PATH
];
47 static WCHAR FileTitleBuffer
[_MAX_PATH
];
48 static WCHAR FilterBuffer
[_MAX_PATH
];
50 /*******************************************************************************
51 * Local module support methods
54 static void resize_frame_rect(HWND hWnd
, PRECT prect
)
58 if (IsWindowVisible(hToolBar)) {
59 SendMessageW(hToolBar, WM_SIZE, 0, 0);
60 GetClientRect(hToolBar, &rt);
61 prect->top = rt.bottom+3;
62 prect->bottom -= rt.bottom+3;
65 if (IsWindowVisible(hStatusBar
)) {
66 SetupStatusBar(hWnd
, TRUE
);
67 GetClientRect(hStatusBar
, &rt
);
68 prect
->bottom
-= rt
.bottom
;
70 MoveWindow(g_pChildWnd
->hWnd
, prect
->left
, prect
->top
, prect
->right
, prect
->bottom
, TRUE
);
73 static void resize_frame_client(HWND hWnd
)
77 GetClientRect(hWnd
, &rect
);
78 resize_frame_rect(hWnd
, &rect
);
81 /********************************************************************************/
83 static void OnEnterMenuLoop(HWND hWnd
)
88 /* Update the status bar pane sizes */
90 SendMessageW(hStatusBar
, SB_SETPARTS
, 1, (long)&nParts
);
92 SendMessageW(hStatusBar
, SB_SETTEXTW
, 0, (LPARAM
)&empty
);
95 static void OnExitMenuLoop(HWND hWnd
)
98 /* Update the status bar pane sizes*/
99 SetupStatusBar(hWnd
, TRUE
);
103 static void UpdateMenuItems(HMENU hMenu
) {
104 HWND hwndTV
= g_pChildWnd
->hTreeWnd
;
105 BOOL bAllowEdit
= FALSE
;
106 HKEY hRootKey
= NULL
;
108 keyName
= GetItemPath(hwndTV
, TreeView_GetSelection(hwndTV
), &hRootKey
);
109 if (GetFocus() != hwndTV
|| (keyName
&& *keyName
)) { /* can't modify root keys, but allow for their values */
112 EnableMenuItem(hMenu
, ID_EDIT_FIND
, MF_ENABLED
| MF_BYCOMMAND
);
113 EnableMenuItem(hMenu
, ID_EDIT_FINDNEXT
, MF_ENABLED
| MF_BYCOMMAND
);
114 EnableMenuItem(hMenu
, ID_EDIT_MODIFY
, (bAllowEdit
? MF_ENABLED
: MF_GRAYED
) | MF_BYCOMMAND
);
115 EnableMenuItem(hMenu
, ID_EDIT_DELETE
, (bAllowEdit
? MF_ENABLED
: MF_GRAYED
) | MF_BYCOMMAND
);
116 EnableMenuItem(hMenu
, ID_EDIT_RENAME
, (bAllowEdit
? MF_ENABLED
: MF_GRAYED
) | MF_BYCOMMAND
);
117 EnableMenuItem(hMenu
, ID_FAVORITES_ADDTOFAVORITES
, (hRootKey
? MF_ENABLED
: MF_GRAYED
) | MF_BYCOMMAND
);
118 EnableMenuItem(hMenu
, ID_FAVORITES_REMOVEFAVORITE
,
119 (GetMenuItemCount(hMenu
)>2 ? MF_ENABLED
: MF_GRAYED
) | MF_BYCOMMAND
);
121 HeapFree(GetProcessHeap(), 0, keyName
);
124 static void OnInitMenuPopup(HWND hWnd
, HMENU hMenu
, short wItem
)
128 while(GetMenuItemCount(hMenu
)>2)
129 DeleteMenu(hMenu
, 2, MF_BYPOSITION
);
130 if (RegOpenKeyExW(HKEY_CURRENT_USER
, favoritesKey
,
131 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
) {
132 WCHAR namebuf
[KEY_MAX_LEN
];
136 DWORD ksize
, vsize
, type
;
140 vsize
= sizeof(valuebuf
);
141 error
= RegEnumValueW(hKey
, i
, namebuf
, &ksize
, NULL
, &type
, valuebuf
, &vsize
);
142 if (error
!= ERROR_SUCCESS
)
144 if (type
== REG_SZ
) {
146 AppendMenuW(hMenu
, MF_SEPARATOR
, -1, NULL
);
149 AppendMenuW(hMenu
, MF_STRING
, ID_FAVORITE_FIRST
+i
, namebuf
);
152 } while(error
== ERROR_SUCCESS
);
156 UpdateMenuItems(hMenu
);
159 static void OnMenuSelect(HWND hWnd
, UINT nItemID
, UINT nFlags
, HMENU hSysMenu
)
164 if (nFlags
& MF_POPUP
) {
165 if (hSysMenu
!= GetMenu(hWnd
)) {
166 if (nItemID
== 2) nItemID
= 5;
169 if (LoadStringW(hInst
, nItemID
, str
, 100)) {
170 /* load appropriate string*/
172 /* first newline terminates actual string*/
173 lpsz
= strchrW(lpsz
, '\n');
177 SendMessageW(hStatusBar
, SB_SETTEXTW
, 0, (LPARAM
)str
);
180 void SetupStatusBar(HWND hWnd
, BOOL bResize
)
184 GetClientRect(hWnd
, &rc
);
188 SendMessageW(hStatusBar
, WM_SIZE
, 0, 0);
189 SendMessageW(hStatusBar
, SB_SETPARTS
, 1, (LPARAM
)&nParts
);
193 void UpdateStatusBar(void)
195 LPWSTR fullPath
= GetItemFullPath(g_pChildWnd
->hTreeWnd
, NULL
, TRUE
);
196 SendMessageW(hStatusBar
, SB_SETTEXTW
, 0, (LPARAM
)fullPath
);
197 HeapFree(GetProcessHeap(), 0, fullPath
);
200 static void toggle_child(HWND hWnd
, UINT cmd
, HWND hchild
)
202 BOOL vis
= IsWindowVisible(hchild
);
203 HMENU hMenuView
= GetSubMenu(hMenuFrame
, ID_VIEW_MENU
);
205 CheckMenuItem(hMenuView
, cmd
, vis
?MF_BYCOMMAND
:MF_BYCOMMAND
|MF_CHECKED
);
206 ShowWindow(hchild
, vis
?SW_HIDE
:SW_SHOW
);
207 resize_frame_client(hWnd
);
210 static BOOL
CheckCommDlgError(HWND hWnd
)
212 DWORD dwErrorCode
= CommDlgExtendedError();
213 switch (dwErrorCode
) {
214 case CDERR_DIALOGFAILURE
:
216 case CDERR_FINDRESFAILURE
:
218 case CDERR_NOHINSTANCE
:
220 case CDERR_INITIALIZATION
:
224 case CDERR_LOCKRESFAILURE
:
226 case CDERR_NOTEMPLATE
:
228 case CDERR_LOADRESFAILURE
:
230 case CDERR_STRUCTSIZE
:
232 case CDERR_LOADSTRFAILURE
:
234 case FNERR_BUFFERTOOSMALL
:
236 case CDERR_MEMALLOCFAILURE
:
238 case FNERR_INVALIDFILENAME
:
240 case CDERR_MEMLOCKFAILURE
:
242 case FNERR_SUBCLASSFAILURE
:
250 static void ExportRegistryFile_StoreSelection(HWND hdlg
, OPENFILENAMEW
*pOpenFileName
)
252 if (IsDlgButtonChecked(hdlg
, IDC_EXPORT_SELECTED
))
254 INT len
= SendDlgItemMessageW(hdlg
, IDC_EXPORT_PATH
, WM_GETTEXTLENGTH
, 0, 0);
255 pOpenFileName
->lCustData
= (LPARAM
)HeapAlloc(GetProcessHeap(), 0, (len
+1)*sizeof(WCHAR
));
256 SendDlgItemMessageW(hdlg
, IDC_EXPORT_PATH
, WM_GETTEXT
, len
+1, pOpenFileName
->lCustData
);
259 pOpenFileName
->lCustData
= (LPARAM
)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WCHAR
));
262 static UINT CALLBACK
ExportRegistryFile_OFNHookProc(HWND hdlg
, UINT uiMsg
, WPARAM wParam
, LPARAM lParam
)
264 static OPENFILENAMEW
* pOpenFileName
;
265 OFNOTIFYW
*pOfNotify
;
269 pOpenFileName
= (OPENFILENAMEW
*)lParam
;
272 if (LOWORD(wParam
) == IDC_EXPORT_PATH
&& HIWORD(wParam
) == EN_UPDATE
)
273 CheckRadioButton(hdlg
, IDC_EXPORT_ALL
, IDC_EXPORT_SELECTED
, IDC_EXPORT_SELECTED
);
276 pOfNotify
= (OFNOTIFYW
*)lParam
;
277 switch (pOfNotify
->hdr
.code
)
281 BOOL export_branch
= FALSE
;
282 WCHAR
* path
= GetItemFullPath(g_pChildWnd
->hTreeWnd
, NULL
, FALSE
);
283 SendDlgItemMessageW(hdlg
, IDC_EXPORT_PATH
, WM_SETTEXT
, 0, (LPARAM
)path
);
284 if (path
&& strlenW(path
) > 0)
285 export_branch
= TRUE
;
286 HeapFree(GetProcessHeap(), 0, path
);
287 CheckRadioButton(hdlg
, IDC_EXPORT_ALL
, IDC_EXPORT_SELECTED
, export_branch
? IDC_EXPORT_SELECTED
: IDC_EXPORT_ALL
);
291 ExportRegistryFile_StoreSelection(hdlg
, pOpenFileName
);
302 static BOOL
InitOpenFileName(HWND hWnd
, OPENFILENAMEW
*pofn
)
304 memset(pofn
, 0, sizeof(OPENFILENAMEW
));
305 pofn
->lStructSize
= sizeof(OPENFILENAMEW
);
306 pofn
->hwndOwner
= hWnd
;
307 pofn
->hInstance
= hInst
;
309 if (FilterBuffer
[0] == 0)
310 LoadStringW(hInst
, IDS_FILEDIALOG_FILTER
, FilterBuffer
, _MAX_PATH
);
311 pofn
->lpstrFilter
= FilterBuffer
;
312 pofn
->nFilterIndex
= 2;
313 pofn
->lpstrFile
= FileNameBuffer
;
314 pofn
->nMaxFile
= _MAX_PATH
;
315 pofn
->lpstrFileTitle
= FileTitleBuffer
;
316 pofn
->nMaxFileTitle
= _MAX_PATH
;
317 pofn
->Flags
= OFN_HIDEREADONLY
;
318 /* some other fields may be set by the caller */
322 static BOOL
import_registry_filename(LPTSTR filename
)
325 FILE* reg_file
= fopen(filename
, "r");
330 Success
= import_registry_file(reg_file
);
332 if(fclose(reg_file
) != 0)
338 static BOOL
ImportRegistryFile(HWND hWnd
)
343 InitOpenFileName(hWnd
, &ofn
);
344 LoadStringW(hInst
, IDS_FILEDIALOG_IMPORT_TITLE
, title
, COUNT_OF(title
));
345 ofn
.lpstrTitle
= title
;
346 if (GetOpenFileNameW(&ofn
)) {
347 CHAR
* fileA
= GetMultiByteString(ofn
.lpstrFile
);
348 if (!import_registry_filename(fileA
)) {
349 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
350 HeapFree(GetProcessHeap(), 0, fileA
);
353 HeapFree(GetProcessHeap(), 0, fileA
);
355 CheckCommDlgError(hWnd
);
357 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
362 static BOOL
ExportRegistryFile(HWND hWnd
)
365 WCHAR ExportKeyPath
[_MAX_PATH
];
368 ExportKeyPath
[0] = 0;
369 InitOpenFileName(hWnd
, &ofn
);
370 LoadStringW(hInst
, IDS_FILEDIALOG_EXPORT_TITLE
, title
, COUNT_OF(title
));
371 ofn
.lpstrTitle
= title
;
372 ofn
.Flags
= OFN_ENABLETEMPLATE
| OFN_ENABLEHOOK
| OFN_EXPLORER
| OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT
;
373 ofn
.lpfnHook
= ExportRegistryFile_OFNHookProc
;
374 ofn
.lpTemplateName
= MAKEINTRESOURCEW(IDD_EXPORT_TEMPLATE
);
375 if (GetSaveFileNameW(&ofn
)) {
377 result
= export_registry_key(ofn
.lpstrFile
, (LPWSTR
)ofn
.lCustData
, ofn
.nFilterIndex
);
379 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
383 CheckCommDlgError(hWnd
);
388 static BOOL
PrintRegistryHive(HWND hWnd
, LPCWSTR path
)
393 ZeroMemory(&pd
, sizeof(PRINTDLG
));
394 pd
.lStructSize
= sizeof(PRINTDLG
);
396 pd
.hDevMode
= NULL
; /* Don't forget to free or store hDevMode*/
397 pd
.hDevNames
= NULL
; /* Don't forget to free or store hDevNames*/
398 pd
.Flags
= PD_USEDEVMODECOPIESANDCOLLATE
| PD_RETURNDC
;
400 pd
.nFromPage
= 0xFFFF;
403 pd
.nMaxPage
= 0xFFFF;
404 if (PrintDlgW(&pd
)) {
405 /* GDI calls to render output. */
406 DeleteDC(pd
.hDC
); /* Delete DC when done.*/
412 hResult
= PrintDlgExW(&pd
);
413 if (hResult
== S_OK
) {
414 switch (pd
.dwResultAction
) {
415 case PD_RESULT_APPLY
:
416 /*The user clicked the Apply button and later clicked the Cancel button. This indicates that the user wants to apply the changes made in the property sheet, but does not yet want to print. The PRINTDLGEX structure contains the information specified by the user at the time the Apply button was clicked. */
418 case PD_RESULT_CANCEL
:
419 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
421 case PD_RESULT_PRINT
:
422 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
430 /*Insufficient memory. */
433 /* One or more arguments are invalid. */
436 /*Invalid pointer. */
442 /*Unspecified error. */
453 static BOOL
CopyKeyName(HWND hWnd
, LPCWSTR keyName
)
457 result
= OpenClipboard(hWnd
);
459 result
= EmptyClipboard();
461 int len
= (lstrlenW(keyName
)+1)*sizeof(WCHAR
);
462 HANDLE hClipData
= GlobalAlloc(GHND
, len
);
463 LPVOID pLoc
= GlobalLock(hClipData
);
464 lstrcpyW(pLoc
, keyName
);
465 GlobalUnlock(hClipData
);
466 hClipData
= SetClipboardData(CF_UNICODETEXT
, hClipData
);
469 /* error emptying clipboard*/
470 /* DWORD dwError = GetLastError(); */
473 if (!CloseClipboard()) {
474 /* error closing clipboard*/
475 /* DWORD dwError = GetLastError(); */
479 /* error opening clipboard*/
480 /* DWORD dwError = GetLastError(); */
486 static INT_PTR CALLBACK
find_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
488 HWND hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_NAME
);
492 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), FALSE
);
493 CheckDlgButton(hwndDlg
, IDC_FIND_KEYS
, searchMask
&SEARCH_KEYS
? BST_CHECKED
: BST_UNCHECKED
);
494 CheckDlgButton(hwndDlg
, IDC_FIND_VALUES
, searchMask
&SEARCH_VALUES
? BST_CHECKED
: BST_UNCHECKED
);
495 CheckDlgButton(hwndDlg
, IDC_FIND_CONTENT
, searchMask
&SEARCH_CONTENT
? BST_CHECKED
: BST_UNCHECKED
);
496 CheckDlgButton(hwndDlg
, IDC_FIND_WHOLE
, searchMask
&SEARCH_WHOLE
? BST_CHECKED
: BST_UNCHECKED
);
497 SendMessageW(hwndValue
, EM_SETLIMITTEXT
, 127, 0);
498 SetWindowTextW(hwndValue
, searchString
);
501 switch(LOWORD(wParam
)) {
503 if (HIWORD(wParam
) == EN_UPDATE
) {
504 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), GetWindowTextLengthW(hwndValue
)>0);
509 if (GetWindowTextLengthW(hwndValue
)>0) {
511 if (IsDlgButtonChecked(hwndDlg
, IDC_FIND_KEYS
)) mask
|= SEARCH_KEYS
;
512 if (IsDlgButtonChecked(hwndDlg
, IDC_FIND_VALUES
)) mask
|= SEARCH_VALUES
;
513 if (IsDlgButtonChecked(hwndDlg
, IDC_FIND_CONTENT
)) mask
|= SEARCH_CONTENT
;
514 if (IsDlgButtonChecked(hwndDlg
, IDC_FIND_WHOLE
)) mask
|= SEARCH_WHOLE
;
516 GetWindowTextW(hwndValue
, searchString
, 128);
517 EndDialog(hwndDlg
, IDOK
);
521 EndDialog(hwndDlg
, IDCANCEL
);
529 static INT_PTR CALLBACK
addtofavorites_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
531 HWND hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_NAME
);
536 HKEY hKeyRoot
= NULL
;
537 LPWSTR ItemPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, NULL
, &hKeyRoot
);
539 if(!ItemPath
|| !*ItemPath
)
540 ItemPath
= GetItemFullPath(g_pChildWnd
->hTreeWnd
, NULL
, FALSE
);
541 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), FALSE
);
542 SetWindowTextW(hwndValue
, ItemPath
);
543 SendMessageW(hwndValue
, EM_SETLIMITTEXT
, 127, 0);
544 HeapFree(GetProcessHeap(), 0, ItemPath
);
548 switch(LOWORD(wParam
)) {
550 if (HIWORD(wParam
) == EN_UPDATE
) {
551 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), GetWindowTextLength(hwndValue
)>0);
556 if (GetWindowTextLengthW(hwndValue
)>0) {
557 GetWindowTextW(hwndValue
, favoriteName
, 128);
558 EndDialog(hwndDlg
, IDOK
);
562 EndDialog(hwndDlg
, IDCANCEL
);
570 static INT_PTR CALLBACK
removefavorite_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
572 HWND hwndList
= GetDlgItem(hwndDlg
, IDC_NAME_LIST
);
575 case WM_INITDIALOG
: {
578 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), FALSE
);
579 if (RegOpenKeyExW(HKEY_CURRENT_USER
, favoritesKey
,
580 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
) {
581 WCHAR namebuf
[KEY_MAX_LEN
];
583 DWORD ksize
, vsize
, type
;
587 vsize
= sizeof(valuebuf
);
588 error
= RegEnumValueW(hKey
, i
, namebuf
, &ksize
, NULL
, &type
, valuebuf
, &vsize
);
589 if (error
!= ERROR_SUCCESS
)
591 if (type
== REG_SZ
) {
592 SendMessageW(hwndList
, LB_ADDSTRING
, 0, (LPARAM
)namebuf
);
595 } while(error
== ERROR_SUCCESS
);
600 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), i
!= 0);
601 SendMessageW(hwndList
, LB_SETCURSEL
, 0, 0);
605 switch(LOWORD(wParam
)) {
607 if (HIWORD(wParam
) == LBN_SELCHANGE
) {
608 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), lParam
!= -1);
613 int pos
= SendMessageW(hwndList
, LB_GETCURSEL
, 0, 0);
614 int len
= SendMessageW(hwndList
, LB_GETTEXTLEN
, pos
, 0);
616 LPWSTR lpName
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*(len
+1));
617 SendMessageW(hwndList
, LB_GETTEXT
, pos
, (LPARAM
)lpName
);
620 lstrcpyW(favoriteName
, lpName
);
621 EndDialog(hwndDlg
, IDOK
);
622 HeapFree(GetProcessHeap(), 0, lpName
);
627 EndDialog(hwndDlg
, IDCANCEL
);
635 /*******************************************************************************
637 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
639 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
642 static BOOL
_CmdWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
647 BOOL firstItem
= TRUE
;
649 if (LOWORD(wParam
) >= ID_FAVORITE_FIRST
&& LOWORD(wParam
) <= ID_FAVORITE_LAST
) {
651 if (RegOpenKeyExW(HKEY_CURRENT_USER
, favoritesKey
,
652 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
) {
653 WCHAR namebuf
[KEY_MAX_LEN
];
655 DWORD ksize
= KEY_MAX_LEN
, vsize
= sizeof(valuebuf
), type
= 0;
656 if (RegEnumValueW(hKey
, LOWORD(wParam
) - ID_FAVORITE_FIRST
, namebuf
, &ksize
, NULL
,
657 &type
, valuebuf
, &vsize
) == ERROR_SUCCESS
) {
658 SendMessageW( g_pChildWnd
->hTreeWnd
, TVM_SELECTITEM
, TVGN_CARET
,
659 (LPARAM
) FindPathInTree(g_pChildWnd
->hTreeWnd
, (WCHAR
*)valuebuf
) );
665 switch (LOWORD(wParam
)) {
666 case ID_REGISTRY_IMPORTREGISTRYFILE
:
667 ImportRegistryFile(hWnd
);
670 case ID_REGISTRY_EXPORTREGISTRYFILE
:
671 ExportRegistryFile(hWnd
);
673 case ID_REGISTRY_CONNECTNETWORKREGISTRY
:
675 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY
:
677 case ID_REGISTRY_PRINT
:
679 const WCHAR empty
= 0;
680 PrintRegistryHive(hWnd
, &empty
);
685 HWND hWndDelete
= GetFocus();
686 if (hWndDelete
== g_pChildWnd
->hTreeWnd
) {
687 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
688 if (keyPath
== 0 || *keyPath
== 0) {
689 MessageBeep(MB_ICONHAND
);
690 } else if (DeleteKey(hWnd
, hKeyRoot
, keyPath
)) {
691 DeleteNode(g_pChildWnd
->hTreeWnd
, 0);
693 HeapFree(GetProcessHeap(), 0, keyPath
);
694 } else if (hWndDelete
== g_pChildWnd
->hListWnd
) {
695 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
696 curIndex
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_SELECTED
);
697 while(curIndex
!= -1) {
698 WCHAR
* valueName
= GetItemText(g_pChildWnd
->hListWnd
, curIndex
);
700 curIndex
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, curIndex
, LVNI_SELECTED
);
701 if(curIndex
!= -1 && firstItem
) {
702 if (MessageBoxW(hWnd
, MAKEINTRESOURCEW(IDS_DELETE_BOX_TEXT_MULTIPLE
),
703 MAKEINTRESOURCEW(IDS_DELETE_BOX_TITLE
),
704 MB_YESNO
| MB_ICONEXCLAMATION
) != IDYES
)
708 if (!DeleteValue(hWnd
, hKeyRoot
, keyPath
, valueName
, curIndex
==-1 && firstItem
))
710 HeapFree(GetProcessHeap(), 0, valueName
);
714 HeapFree(GetProcessHeap(), 0, valueName
);
716 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
, NULL
);
717 HeapFree(GetProcessHeap(), 0, keyPath
);
718 } else if (IsChild(g_pChildWnd
->hTreeWnd
, hWndDelete
) ||
719 IsChild(g_pChildWnd
->hListWnd
, hWndDelete
)) {
720 SendMessage(hWndDelete
, WM_KEYDOWN
, VK_DELETE
, 0);
726 LPCWSTR valueName
= GetValueName(g_pChildWnd
->hListWnd
);
727 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
728 if (ModifyValue(hWnd
, hKeyRoot
, keyPath
, valueName
))
729 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
, valueName
);
730 HeapFree(GetProcessHeap(), 0, keyPath
);
734 case ID_EDIT_FINDNEXT
:
737 if (LOWORD(wParam
) == ID_EDIT_FIND
&&
738 DialogBox(0, MAKEINTRESOURCE(IDD_FIND
), hWnd
, find_dlgproc
) != IDOK
)
742 hItem
= TreeView_GetSelection(g_pChildWnd
->hTreeWnd
);
744 int row
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_FOCUSED
);
745 HCURSOR hcursorOld
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
746 hItem
= FindNext(g_pChildWnd
->hTreeWnd
, hItem
, searchString
, searchMask
, &row
);
747 SetCursor(hcursorOld
);
749 SendMessageW( g_pChildWnd
->hTreeWnd
, TVM_SELECTITEM
, TVGN_CARET
, (LPARAM
) hItem
);
750 InvalidateRect(g_pChildWnd
->hTreeWnd
, NULL
, TRUE
);
751 UpdateWindow(g_pChildWnd
->hTreeWnd
);
753 ListView_SetItemState(g_pChildWnd
->hListWnd
, -1, 0, LVIS_FOCUSED
|LVIS_SELECTED
);
754 ListView_SetItemState(g_pChildWnd
->hListWnd
, row
, LVIS_FOCUSED
|LVIS_SELECTED
, LVIS_FOCUSED
|LVIS_SELECTED
);
755 SetFocus(g_pChildWnd
->hListWnd
);
757 SetFocus(g_pChildWnd
->hTreeWnd
);
760 error(hWnd
, IDS_NOTFOUND
, searchString
);
765 case ID_EDIT_COPYKEYNAME
:
767 LPWSTR fullPath
= GetItemFullPath(g_pChildWnd
->hTreeWnd
, NULL
, FALSE
);
769 CopyKeyName(hWnd
, fullPath
);
770 HeapFree(GetProcessHeap(), 0, fullPath
);
774 case ID_EDIT_NEW_KEY
:
776 WCHAR newKeyW
[MAX_NEW_KEY_LEN
];
777 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
778 if (CreateKey(hWnd
, hKeyRoot
, keyPath
, newKeyW
)) {
779 if (InsertNode(g_pChildWnd
->hTreeWnd
, 0, newKeyW
))
780 StartKeyRename(g_pChildWnd
->hTreeWnd
);
782 HeapFree(GetProcessHeap(), 0, keyPath
);
785 case ID_EDIT_NEW_STRINGVALUE
:
788 case ID_EDIT_NEW_MULTI_STRINGVALUE
:
789 valueType
= REG_MULTI_SZ
;
791 case ID_EDIT_NEW_BINARYVALUE
:
792 valueType
= REG_BINARY
;
794 case ID_EDIT_NEW_DWORDVALUE
:
795 valueType
= REG_DWORD
;
799 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
800 WCHAR newKey
[MAX_NEW_KEY_LEN
];
801 if (CreateValue(hWnd
, hKeyRoot
, keyPath
, valueType
, newKey
)) {
802 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
, newKey
);
803 StartValueRename(g_pChildWnd
->hListWnd
);
805 HeapFree(GetProcessHeap(), 0, keyPath
);
810 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
811 if (keyPath
== 0 || *keyPath
== 0) {
812 MessageBeep(MB_ICONHAND
);
813 } else if (GetFocus() == g_pChildWnd
->hTreeWnd
) {
814 StartKeyRename(g_pChildWnd
->hTreeWnd
);
815 } else if (GetFocus() == g_pChildWnd
->hListWnd
) {
816 StartValueRename(g_pChildWnd
->hListWnd
);
818 HeapFree(GetProcessHeap(), 0, keyPath
);
821 case ID_REGISTRY_PRINTERSETUP
:
824 /*PAGESETUPDLG psd;*/
825 /*PageSetupDlg(&psd);*/
827 case ID_REGISTRY_OPENLOCAL
:
829 case ID_REGISTRY_EXIT
:
832 case ID_FAVORITES_ADDTOFAVORITES
:
835 LPWSTR lpKeyPath
= GetItemFullPath(g_pChildWnd
->hTreeWnd
, NULL
, FALSE
);
837 if (DialogBox(0, MAKEINTRESOURCE(IDD_ADDFAVORITE
), hWnd
, addtofavorites_dlgproc
) == IDOK
) {
838 if (RegCreateKeyExW(HKEY_CURRENT_USER
, favoritesKey
,
840 KEY_READ
|KEY_WRITE
, NULL
, &hKey
, NULL
) == ERROR_SUCCESS
) {
841 RegSetValueExW(hKey
, favoriteName
, 0, REG_SZ
, (BYTE
*)lpKeyPath
, (lstrlenW(lpKeyPath
)+1)*sizeof(WCHAR
));
845 HeapFree(GetProcessHeap(), 0, lpKeyPath
);
849 case ID_FAVORITES_REMOVEFAVORITE
:
851 if (DialogBox(0, MAKEINTRESOURCE(IDD_DELFAVORITE
), hWnd
, removefavorite_dlgproc
) == IDOK
) {
853 if (RegOpenKeyExW(HKEY_CURRENT_USER
, favoritesKey
,
854 0, KEY_READ
|KEY_WRITE
, &hKey
) == ERROR_SUCCESS
) {
855 RegDeleteValueW(hKey
, favoriteName
);
861 case ID_VIEW_REFRESH
:
863 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
864 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
865 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
, NULL
);
866 HeapFree(GetProcessHeap(), 0, keyPath
);
869 /*case ID_OPTIONS_TOOLBAR:*/
870 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
872 case ID_VIEW_STATUSBAR
:
873 toggle_child(hWnd
, LOWORD(wParam
), hStatusBar
);
875 case ID_HELP_HELPTOPICS
:
877 const WCHAR help_regedit
[] = {'r','e','g','e','d','i','t',0};
878 WinHelpW(hWnd
, help_regedit
, HELP_FINDER
, 0);
884 case ID_VIEW_SPLIT
: {
887 GetClientRect(g_pChildWnd
->hWnd
, &rt
);
888 pt
.x
= rt
.left
+ g_pChildWnd
->nSplitPos
;
889 pt
.y
= (rt
.bottom
/ 2);
891 if(ClientToScreen(g_pChildWnd
->hWnd
, &pts
)) {
892 SetCursorPos(pts
.x
, pts
.y
);
893 SetCursor(LoadCursor(0, IDC_SIZEWE
));
894 SendMessageW(g_pChildWnd
->hWnd
, WM_LBUTTONDOWN
, 0, MAKELPARAM(pt
.x
, pt
.y
));
905 /********************************************************************************
907 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
909 * PURPOSE: Processes messages for the main frame window.
911 * WM_COMMAND - process the application menu
912 * WM_DESTROY - post a quit message and return
916 LRESULT CALLBACK
FrameWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
920 CreateWindowEx(0, szChildClass
, _T("regedit child window"), WS_CHILD
| WS_VISIBLE
,
921 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
922 hWnd
, NULL
, hInst
, 0);
925 if (!_CmdWndProc(hWnd
, message
, wParam
, lParam
))
926 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
930 SetFocus(g_pChildWnd
->hWnd
);
933 resize_frame_client(hWnd
);
937 case WM_ENTERMENULOOP
:
938 OnEnterMenuLoop(hWnd
);
940 case WM_EXITMENULOOP
:
941 OnExitMenuLoop(hWnd
);
943 case WM_INITMENUPOPUP
:
945 OnInitMenuPopup(hWnd
, (HMENU
)wParam
, LOWORD(lParam
));
948 OnMenuSelect(hWnd
, LOWORD(wParam
), HIWORD(wParam
), (HMENU
)lParam
);
952 const WCHAR help_regedit
[] = {'r','e','g','e','d','i','t',0};
953 WinHelpW(hWnd
, help_regedit
, HELP_QUIT
, 0);
957 return DefWindowProc(hWnd
, message
, wParam
, lParam
);