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, (LPARAM
)&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_PTR 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)
311 static const WCHAR filterW
[] = {'%','s','%','c','*','.','r','e','g','%','c','%','s','%','c','*','.','r','e','g','%','c','%','s','%','c','*','.','*','%','c',0};
312 WCHAR filter_reg
[MAX_PATH
], filter_reg4
[MAX_PATH
], filter_all
[MAX_PATH
];
314 LoadStringW(hInst
, IDS_FILEDIALOG_FILTER_REG
, filter_reg
, MAX_PATH
);
315 LoadStringW(hInst
, IDS_FILEDIALOG_FILTER_REG4
, filter_reg4
, MAX_PATH
);
316 LoadStringW(hInst
, IDS_FILEDIALOG_FILTER_ALL
, filter_all
, MAX_PATH
);
317 snprintfW( FilterBuffer
, MAX_PATH
, filterW
, filter_reg
, 0, 0, filter_reg4
, 0, 0, filter_all
, 0, 0 );
319 pofn
->lpstrFilter
= FilterBuffer
;
320 pofn
->nFilterIndex
= 2;
321 pofn
->lpstrFile
= FileNameBuffer
;
322 pofn
->nMaxFile
= _MAX_PATH
;
323 pofn
->lpstrFileTitle
= FileTitleBuffer
;
324 pofn
->nMaxFileTitle
= _MAX_PATH
;
325 pofn
->Flags
= OFN_HIDEREADONLY
;
326 /* some other fields may be set by the caller */
330 static BOOL
import_registry_filename(LPTSTR filename
)
333 FILE* reg_file
= fopen(filename
, "r");
338 Success
= import_registry_file(reg_file
);
340 if(fclose(reg_file
) != 0)
346 static BOOL
ImportRegistryFile(HWND hWnd
)
351 InitOpenFileName(hWnd
, &ofn
);
352 ofn
.Flags
|= OFN_ENABLESIZING
;
353 LoadStringW(hInst
, IDS_FILEDIALOG_IMPORT_TITLE
, title
, COUNT_OF(title
));
354 ofn
.lpstrTitle
= title
;
355 if (GetOpenFileNameW(&ofn
)) {
356 CHAR
* fileA
= GetMultiByteString(ofn
.lpstrFile
);
357 if (!import_registry_filename(fileA
)) {
358 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
359 HeapFree(GetProcessHeap(), 0, fileA
);
362 HeapFree(GetProcessHeap(), 0, fileA
);
364 CheckCommDlgError(hWnd
);
366 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
371 static BOOL
ExportRegistryFile(HWND hWnd
)
376 InitOpenFileName(hWnd
, &ofn
);
377 LoadStringW(hInst
, IDS_FILEDIALOG_EXPORT_TITLE
, title
, COUNT_OF(title
));
378 ofn
.lpstrTitle
= title
;
379 ofn
.Flags
= OFN_ENABLETEMPLATE
| OFN_ENABLEHOOK
| OFN_EXPLORER
| OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT
;
380 ofn
.lpfnHook
= ExportRegistryFile_OFNHookProc
;
381 ofn
.lpTemplateName
= MAKEINTRESOURCEW(IDD_EXPORT_TEMPLATE
);
382 if (GetSaveFileNameW(&ofn
)) {
384 result
= export_registry_key(ofn
.lpstrFile
, (LPWSTR
)ofn
.lCustData
, ofn
.nFilterIndex
);
386 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
390 CheckCommDlgError(hWnd
);
395 static BOOL
PrintRegistryHive(HWND hWnd
, LPCWSTR path
)
400 ZeroMemory(&pd
, sizeof(PRINTDLG
));
401 pd
.lStructSize
= sizeof(PRINTDLG
);
403 pd
.hDevMode
= NULL
; /* Don't forget to free or store hDevMode*/
404 pd
.hDevNames
= NULL
; /* Don't forget to free or store hDevNames*/
405 pd
.Flags
= PD_USEDEVMODECOPIESANDCOLLATE
| PD_RETURNDC
;
407 pd
.nFromPage
= 0xFFFF;
410 pd
.nMaxPage
= 0xFFFF;
411 if (PrintDlgW(&pd
)) {
412 /* GDI calls to render output. */
413 DeleteDC(pd
.hDC
); /* Delete DC when done.*/
419 hResult
= PrintDlgExW(&pd
);
420 if (hResult
== S_OK
) {
421 switch (pd
.dwResultAction
) {
422 case PD_RESULT_APPLY
:
423 /*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. */
425 case PD_RESULT_CANCEL
:
426 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
428 case PD_RESULT_PRINT
:
429 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
437 /*Insufficient memory. */
440 /* One or more arguments are invalid. */
443 /*Invalid pointer. */
449 /*Unspecified error. */
460 static BOOL
CopyKeyName(HWND hWnd
, LPCWSTR keyName
)
464 result
= OpenClipboard(hWnd
);
466 result
= EmptyClipboard();
468 int len
= (lstrlenW(keyName
)+1)*sizeof(WCHAR
);
469 HANDLE hClipData
= GlobalAlloc(GHND
, len
);
470 LPVOID pLoc
= GlobalLock(hClipData
);
471 lstrcpyW(pLoc
, keyName
);
472 GlobalUnlock(hClipData
);
473 hClipData
= SetClipboardData(CF_UNICODETEXT
, hClipData
);
476 /* error emptying clipboard*/
477 /* DWORD dwError = GetLastError(); */
480 if (!CloseClipboard()) {
481 /* error closing clipboard*/
482 /* DWORD dwError = GetLastError(); */
486 /* error opening clipboard*/
487 /* DWORD dwError = GetLastError(); */
493 static INT_PTR CALLBACK
find_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
495 HWND hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_NAME
);
499 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), FALSE
);
500 CheckDlgButton(hwndDlg
, IDC_FIND_KEYS
, searchMask
&SEARCH_KEYS
? BST_CHECKED
: BST_UNCHECKED
);
501 CheckDlgButton(hwndDlg
, IDC_FIND_VALUES
, searchMask
&SEARCH_VALUES
? BST_CHECKED
: BST_UNCHECKED
);
502 CheckDlgButton(hwndDlg
, IDC_FIND_CONTENT
, searchMask
&SEARCH_CONTENT
? BST_CHECKED
: BST_UNCHECKED
);
503 CheckDlgButton(hwndDlg
, IDC_FIND_WHOLE
, searchMask
&SEARCH_WHOLE
? BST_CHECKED
: BST_UNCHECKED
);
504 SendMessageW(hwndValue
, EM_SETLIMITTEXT
, 127, 0);
505 SetWindowTextW(hwndValue
, searchString
);
508 switch(LOWORD(wParam
)) {
510 if (HIWORD(wParam
) == EN_UPDATE
) {
511 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), GetWindowTextLengthW(hwndValue
)>0);
516 if (GetWindowTextLengthW(hwndValue
)>0) {
518 if (IsDlgButtonChecked(hwndDlg
, IDC_FIND_KEYS
)) mask
|= SEARCH_KEYS
;
519 if (IsDlgButtonChecked(hwndDlg
, IDC_FIND_VALUES
)) mask
|= SEARCH_VALUES
;
520 if (IsDlgButtonChecked(hwndDlg
, IDC_FIND_CONTENT
)) mask
|= SEARCH_CONTENT
;
521 if (IsDlgButtonChecked(hwndDlg
, IDC_FIND_WHOLE
)) mask
|= SEARCH_WHOLE
;
523 GetWindowTextW(hwndValue
, searchString
, 128);
524 EndDialog(hwndDlg
, IDOK
);
528 EndDialog(hwndDlg
, IDCANCEL
);
536 static INT_PTR CALLBACK
addtofavorites_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
538 HWND hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_NAME
);
543 HKEY hKeyRoot
= NULL
;
544 LPWSTR ItemPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, NULL
, &hKeyRoot
);
546 if(!ItemPath
|| !*ItemPath
)
547 ItemPath
= GetItemFullPath(g_pChildWnd
->hTreeWnd
, NULL
, FALSE
);
548 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), FALSE
);
549 SetWindowTextW(hwndValue
, ItemPath
);
550 SendMessageW(hwndValue
, EM_SETLIMITTEXT
, 127, 0);
551 HeapFree(GetProcessHeap(), 0, ItemPath
);
555 switch(LOWORD(wParam
)) {
557 if (HIWORD(wParam
) == EN_UPDATE
) {
558 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), GetWindowTextLength(hwndValue
)>0);
563 if (GetWindowTextLengthW(hwndValue
)>0) {
564 GetWindowTextW(hwndValue
, favoriteName
, 128);
565 EndDialog(hwndDlg
, IDOK
);
569 EndDialog(hwndDlg
, IDCANCEL
);
577 static INT_PTR CALLBACK
removefavorite_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
579 HWND hwndList
= GetDlgItem(hwndDlg
, IDC_NAME_LIST
);
582 case WM_INITDIALOG
: {
585 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), FALSE
);
586 if (RegOpenKeyExW(HKEY_CURRENT_USER
, favoritesKey
,
587 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
) {
588 WCHAR namebuf
[KEY_MAX_LEN
];
590 DWORD ksize
, vsize
, type
;
594 vsize
= sizeof(valuebuf
);
595 error
= RegEnumValueW(hKey
, i
, namebuf
, &ksize
, NULL
, &type
, valuebuf
, &vsize
);
596 if (error
!= ERROR_SUCCESS
)
598 if (type
== REG_SZ
) {
599 SendMessageW(hwndList
, LB_ADDSTRING
, 0, (LPARAM
)namebuf
);
602 } while(error
== ERROR_SUCCESS
);
607 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), i
!= 0);
608 SendMessageW(hwndList
, LB_SETCURSEL
, 0, 0);
612 switch(LOWORD(wParam
)) {
614 if (HIWORD(wParam
) == LBN_SELCHANGE
) {
615 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), lParam
!= -1);
620 int pos
= SendMessageW(hwndList
, LB_GETCURSEL
, 0, 0);
621 int len
= SendMessageW(hwndList
, LB_GETTEXTLEN
, pos
, 0);
623 LPWSTR lpName
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*(len
+1));
624 SendMessageW(hwndList
, LB_GETTEXT
, pos
, (LPARAM
)lpName
);
627 lstrcpyW(favoriteName
, lpName
);
628 EndDialog(hwndDlg
, IDOK
);
629 HeapFree(GetProcessHeap(), 0, lpName
);
634 EndDialog(hwndDlg
, IDCANCEL
);
642 /*******************************************************************************
644 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
646 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
649 static BOOL
_CmdWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
654 BOOL firstItem
= TRUE
;
656 if (LOWORD(wParam
) >= ID_FAVORITE_FIRST
&& LOWORD(wParam
) <= ID_FAVORITE_LAST
) {
658 if (RegOpenKeyExW(HKEY_CURRENT_USER
, favoritesKey
,
659 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
) {
660 WCHAR namebuf
[KEY_MAX_LEN
];
662 DWORD ksize
= KEY_MAX_LEN
, vsize
= sizeof(valuebuf
), type
= 0;
663 if (RegEnumValueW(hKey
, LOWORD(wParam
) - ID_FAVORITE_FIRST
, namebuf
, &ksize
, NULL
,
664 &type
, valuebuf
, &vsize
) == ERROR_SUCCESS
) {
665 SendMessageW( g_pChildWnd
->hTreeWnd
, TVM_SELECTITEM
, TVGN_CARET
,
666 (LPARAM
) FindPathInTree(g_pChildWnd
->hTreeWnd
, (WCHAR
*)valuebuf
) );
672 switch (LOWORD(wParam
)) {
673 case ID_REGISTRY_IMPORTREGISTRYFILE
:
674 ImportRegistryFile(hWnd
);
677 case ID_REGISTRY_EXPORTREGISTRYFILE
:
678 ExportRegistryFile(hWnd
);
680 case ID_REGISTRY_CONNECTNETWORKREGISTRY
:
682 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY
:
684 case ID_REGISTRY_PRINT
:
686 const WCHAR empty
= 0;
687 PrintRegistryHive(hWnd
, &empty
);
692 HWND hWndDelete
= GetFocus();
693 if (hWndDelete
== g_pChildWnd
->hTreeWnd
) {
694 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
695 if (keyPath
== 0 || *keyPath
== 0) {
696 MessageBeep(MB_ICONHAND
);
697 } else if (DeleteKey(hWnd
, hKeyRoot
, keyPath
)) {
698 DeleteNode(g_pChildWnd
->hTreeWnd
, 0);
700 HeapFree(GetProcessHeap(), 0, keyPath
);
701 } else if (hWndDelete
== g_pChildWnd
->hListWnd
) {
702 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
703 curIndex
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_SELECTED
);
704 while(curIndex
!= -1) {
705 WCHAR
* valueName
= GetItemText(g_pChildWnd
->hListWnd
, curIndex
);
707 curIndex
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, curIndex
, LVNI_SELECTED
);
708 if(curIndex
!= -1 && firstItem
) {
709 if (MessageBoxW(hWnd
, MAKEINTRESOURCEW(IDS_DELETE_BOX_TEXT_MULTIPLE
),
710 MAKEINTRESOURCEW(IDS_DELETE_BOX_TITLE
),
711 MB_YESNO
| MB_ICONEXCLAMATION
) != IDYES
)
715 if (!DeleteValue(hWnd
, hKeyRoot
, keyPath
, valueName
, curIndex
==-1 && firstItem
))
717 HeapFree(GetProcessHeap(), 0, valueName
);
721 HeapFree(GetProcessHeap(), 0, valueName
);
723 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
, NULL
);
724 HeapFree(GetProcessHeap(), 0, keyPath
);
725 } else if (IsChild(g_pChildWnd
->hTreeWnd
, hWndDelete
) ||
726 IsChild(g_pChildWnd
->hListWnd
, hWndDelete
)) {
727 SendMessage(hWndDelete
, WM_KEYDOWN
, VK_DELETE
, 0);
733 LPCWSTR valueName
= GetValueName(g_pChildWnd
->hListWnd
);
734 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
735 if (ModifyValue(hWnd
, hKeyRoot
, keyPath
, valueName
))
736 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
, valueName
);
737 HeapFree(GetProcessHeap(), 0, keyPath
);
741 case ID_EDIT_FINDNEXT
:
744 if (LOWORD(wParam
) == ID_EDIT_FIND
&&
745 DialogBox(0, MAKEINTRESOURCE(IDD_FIND
), hWnd
, find_dlgproc
) != IDOK
)
749 hItem
= TreeView_GetSelection(g_pChildWnd
->hTreeWnd
);
751 int row
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_FOCUSED
);
752 HCURSOR hcursorOld
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
753 hItem
= FindNext(g_pChildWnd
->hTreeWnd
, hItem
, searchString
, searchMask
, &row
);
754 SetCursor(hcursorOld
);
756 SendMessageW( g_pChildWnd
->hTreeWnd
, TVM_SELECTITEM
, TVGN_CARET
, (LPARAM
) hItem
);
757 InvalidateRect(g_pChildWnd
->hTreeWnd
, NULL
, TRUE
);
758 UpdateWindow(g_pChildWnd
->hTreeWnd
);
760 ListView_SetItemState(g_pChildWnd
->hListWnd
, -1, 0, LVIS_FOCUSED
|LVIS_SELECTED
);
761 ListView_SetItemState(g_pChildWnd
->hListWnd
, row
, LVIS_FOCUSED
|LVIS_SELECTED
, LVIS_FOCUSED
|LVIS_SELECTED
);
762 SetFocus(g_pChildWnd
->hListWnd
);
764 SetFocus(g_pChildWnd
->hTreeWnd
);
767 error(hWnd
, IDS_NOTFOUND
, searchString
);
772 case ID_EDIT_COPYKEYNAME
:
774 LPWSTR fullPath
= GetItemFullPath(g_pChildWnd
->hTreeWnd
, NULL
, FALSE
);
776 CopyKeyName(hWnd
, fullPath
);
777 HeapFree(GetProcessHeap(), 0, fullPath
);
781 case ID_EDIT_NEW_KEY
:
783 WCHAR newKeyW
[MAX_NEW_KEY_LEN
];
784 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
785 if (CreateKey(hWnd
, hKeyRoot
, keyPath
, newKeyW
)) {
786 if (InsertNode(g_pChildWnd
->hTreeWnd
, 0, newKeyW
))
787 StartKeyRename(g_pChildWnd
->hTreeWnd
);
789 HeapFree(GetProcessHeap(), 0, keyPath
);
792 case ID_EDIT_NEW_STRINGVALUE
:
795 case ID_EDIT_NEW_MULTI_STRINGVALUE
:
796 valueType
= REG_MULTI_SZ
;
798 case ID_EDIT_NEW_BINARYVALUE
:
799 valueType
= REG_BINARY
;
801 case ID_EDIT_NEW_DWORDVALUE
:
802 valueType
= REG_DWORD
;
806 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
807 WCHAR newKey
[MAX_NEW_KEY_LEN
];
808 if (CreateValue(hWnd
, hKeyRoot
, keyPath
, valueType
, newKey
)) {
809 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
, newKey
);
810 StartValueRename(g_pChildWnd
->hListWnd
);
812 HeapFree(GetProcessHeap(), 0, keyPath
);
817 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
818 if (keyPath
== 0 || *keyPath
== 0) {
819 MessageBeep(MB_ICONHAND
);
820 } else if (GetFocus() == g_pChildWnd
->hTreeWnd
) {
821 StartKeyRename(g_pChildWnd
->hTreeWnd
);
822 } else if (GetFocus() == g_pChildWnd
->hListWnd
) {
823 StartValueRename(g_pChildWnd
->hListWnd
);
825 HeapFree(GetProcessHeap(), 0, keyPath
);
828 case ID_REGISTRY_PRINTERSETUP
:
831 /*PAGESETUPDLG psd;*/
832 /*PageSetupDlg(&psd);*/
834 case ID_REGISTRY_OPENLOCAL
:
836 case ID_REGISTRY_EXIT
:
839 case ID_FAVORITES_ADDTOFAVORITES
:
842 LPWSTR lpKeyPath
= GetItemFullPath(g_pChildWnd
->hTreeWnd
, NULL
, FALSE
);
844 if (DialogBox(0, MAKEINTRESOURCE(IDD_ADDFAVORITE
), hWnd
, addtofavorites_dlgproc
) == IDOK
) {
845 if (RegCreateKeyExW(HKEY_CURRENT_USER
, favoritesKey
,
847 KEY_READ
|KEY_WRITE
, NULL
, &hKey
, NULL
) == ERROR_SUCCESS
) {
848 RegSetValueExW(hKey
, favoriteName
, 0, REG_SZ
, (BYTE
*)lpKeyPath
, (lstrlenW(lpKeyPath
)+1)*sizeof(WCHAR
));
852 HeapFree(GetProcessHeap(), 0, lpKeyPath
);
856 case ID_FAVORITES_REMOVEFAVORITE
:
858 if (DialogBox(0, MAKEINTRESOURCE(IDD_DELFAVORITE
), hWnd
, removefavorite_dlgproc
) == IDOK
) {
860 if (RegOpenKeyExW(HKEY_CURRENT_USER
, favoritesKey
,
861 0, KEY_READ
|KEY_WRITE
, &hKey
) == ERROR_SUCCESS
) {
862 RegDeleteValueW(hKey
, favoriteName
);
868 case ID_VIEW_REFRESH
:
870 WCHAR
* keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
871 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
872 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
, NULL
);
873 HeapFree(GetProcessHeap(), 0, keyPath
);
876 /*case ID_OPTIONS_TOOLBAR:*/
877 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
879 case ID_VIEW_STATUSBAR
:
880 toggle_child(hWnd
, LOWORD(wParam
), hStatusBar
);
882 case ID_HELP_HELPTOPICS
:
884 const WCHAR help_regedit
[] = {'r','e','g','e','d','i','t',0};
885 WinHelpW(hWnd
, help_regedit
, HELP_FINDER
, 0);
891 case ID_VIEW_SPLIT
: {
894 GetClientRect(g_pChildWnd
->hWnd
, &rt
);
895 pt
.x
= rt
.left
+ g_pChildWnd
->nSplitPos
;
896 pt
.y
= (rt
.bottom
/ 2);
898 if(ClientToScreen(g_pChildWnd
->hWnd
, &pts
)) {
899 SetCursorPos(pts
.x
, pts
.y
);
900 SetCursor(LoadCursor(0, IDC_SIZEWE
));
901 SendMessageW(g_pChildWnd
->hWnd
, WM_LBUTTONDOWN
, 0, MAKELPARAM(pt
.x
, pt
.y
));
912 /********************************************************************************
914 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
916 * PURPOSE: Processes messages for the main frame window.
918 * WM_COMMAND - process the application menu
919 * WM_DESTROY - post a quit message and return
923 LRESULT CALLBACK
FrameWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
927 CreateWindowEx(0, szChildClass
, _T("regedit child window"), WS_CHILD
| WS_VISIBLE
,
928 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
929 hWnd
, NULL
, hInst
, 0);
932 if (!_CmdWndProc(hWnd
, message
, wParam
, lParam
))
933 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
937 SetFocus(g_pChildWnd
->hWnd
);
940 resize_frame_client(hWnd
);
944 case WM_ENTERMENULOOP
:
945 OnEnterMenuLoop(hWnd
);
947 case WM_EXITMENULOOP
:
948 OnExitMenuLoop(hWnd
);
950 case WM_INITMENUPOPUP
:
952 OnInitMenuPopup(hWnd
, (HMENU
)wParam
, LOWORD(lParam
));
955 OnMenuSelect(hWnd
, LOWORD(wParam
), HIWORD(wParam
), (HMENU
)lParam
);
959 const WCHAR help_regedit
[] = {'r','e','g','e','d','i','t',0};
960 WinHelpW(hWnd
, help_regedit
, HELP_QUIT
, 0);
964 return DefWindowProc(hWnd
, message
, wParam
, lParam
);