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 TCHAR FileNameBuffer[_MAX_PATH];
47 static TCHAR FileTitleBuffer[_MAX_PATH];
48 static TCHAR FilterBuffer[_MAX_PATH];
50 /*******************************************************************************
51 * Local module support methods
54 static void resize_frame_rect(HWND hWnd, PRECT prect)
58 if (IsWindowVisible(hToolBar)) {
59 SendMessage(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, (WPARAM)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 = GetItemPathW(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 = GetItemFullPathW(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, OPENFILENAME *pOpenFileName)
252 if (IsDlgButtonChecked(hdlg, IDC_EXPORT_SELECTED))
254 INT len = SendDlgItemMessage(hdlg, IDC_EXPORT_PATH, WM_GETTEXTLENGTH, 0, 0);
255 pOpenFileName->lCustData = (LPARAM)HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(TCHAR));
256 SendDlgItemMessage(hdlg, IDC_EXPORT_PATH, WM_GETTEXT, len+1, pOpenFileName->lCustData);
259 pOpenFileName->lCustData = (LPARAM)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TCHAR));
262 static UINT CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
264 static OPENFILENAME* pOpenFileName;
270 pOpenFileName = (OPENFILENAME*)lParam;
273 if (LOWORD(wParam) == IDC_EXPORT_PATH && HIWORD(wParam) == EN_UPDATE)
274 CheckRadioButton(hdlg, IDC_EXPORT_ALL, IDC_EXPORT_SELECTED, IDC_EXPORT_SELECTED);
277 pOfNotify = (OFNOTIFY*)lParam;
278 switch (pOfNotify->hdr.code)
281 path = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
282 SendDlgItemMessage(hdlg, IDC_EXPORT_PATH, WM_SETTEXT, 0, (LPARAM)path);
283 HeapFree(GetProcessHeap(), 0, path);
284 CheckRadioButton(hdlg, IDC_EXPORT_ALL, IDC_EXPORT_SELECTED, pOpenFileName->lCustData ? IDC_EXPORT_SELECTED : IDC_EXPORT_ALL);
287 ExportRegistryFile_StoreSelection(hdlg, pOpenFileName);
298 static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME *pofn)
300 memset(pofn, 0, sizeof(OPENFILENAME));
301 pofn->lStructSize = sizeof(OPENFILENAME);
302 pofn->hwndOwner = hWnd;
303 pofn->hInstance = hInst;
305 if (FilterBuffer[0] == 0)
306 LoadString(hInst, IDS_FILEDIALOG_FILTER, FilterBuffer, _MAX_PATH);
307 pofn->lpstrFilter = FilterBuffer;
308 pofn->nFilterIndex = 1;
309 pofn->lpstrFile = FileNameBuffer;
310 pofn->nMaxFile = _MAX_PATH;
311 pofn->lpstrFileTitle = FileTitleBuffer;
312 pofn->nMaxFileTitle = _MAX_PATH;
313 pofn->Flags = OFN_HIDEREADONLY;
314 /* some other fields may be set by the caller */
318 static BOOL import_registry_filename(LPTSTR filename)
321 FILE* reg_file = fopen(filename, "r");
326 Success = import_registry_file(reg_file);
328 if(fclose(reg_file) != 0)
334 static BOOL ImportRegistryFile(HWND hWnd)
339 InitOpenFileName(hWnd, &ofn);
340 LoadString(hInst, IDS_FILEDIALOG_IMPORT_TITLE, title, COUNT_OF(title));
341 ofn.lpstrTitle = title;
342 if (GetOpenFileName(&ofn)) {
343 if (!import_registry_filename(ofn.lpstrFile)) {
344 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
348 CheckCommDlgError(hWnd);
350 RefreshTreeView(g_pChildWnd->hTreeWnd);
355 static BOOL ExportRegistryFile(HWND hWnd, BOOL export_branch)
358 TCHAR ExportKeyPath[_MAX_PATH];
361 ExportKeyPath[0] = _T('\0');
362 InitOpenFileName(hWnd, &ofn);
363 LoadString(hInst, IDS_FILEDIALOG_EXPORT_TITLE, title, COUNT_OF(title));
364 ofn.lpstrTitle = title;
365 ofn.lCustData = export_branch;
366 ofn.Flags = OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
367 ofn.lpfnHook = ExportRegistryFile_OFNHookProc;
368 ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORT_TEMPLATE);
369 if (GetSaveFileName(&ofn)) {
371 result = export_registry_key(ofn.lpstrFile, (LPTSTR)ofn.lCustData);
373 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
377 CheckCommDlgError(hWnd);
382 static BOOL PrintRegistryHive(HWND hWnd, LPCWSTR path)
387 ZeroMemory(&pd, sizeof(PRINTDLG));
388 pd.lStructSize = sizeof(PRINTDLG);
390 pd.hDevMode = NULL; /* Don't forget to free or store hDevMode*/
391 pd.hDevNames = NULL; /* Don't forget to free or store hDevNames*/
392 pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
394 pd.nFromPage = 0xFFFF;
397 pd.nMaxPage = 0xFFFF;
398 if (PrintDlgW(&pd)) {
399 /* GDI calls to render output. */
400 DeleteDC(pd.hDC); /* Delete DC when done.*/
406 hResult = PrintDlgExW(&pd);
407 if (hResult == S_OK) {
408 switch (pd.dwResultAction) {
409 case PD_RESULT_APPLY:
410 /*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. */
412 case PD_RESULT_CANCEL:
413 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
415 case PD_RESULT_PRINT:
416 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
424 /*Insufficient memory. */
427 /* One or more arguments are invalid. */
430 /*Invalid pointer. */
436 /*Unspecified error. */
447 static BOOL CopyKeyName(HWND hWnd, LPCWSTR keyName)
451 result = OpenClipboard(hWnd);
453 result = EmptyClipboard();
455 int len = (lstrlenW(keyName)+1)*sizeof(WCHAR);
456 HANDLE hClipData = GlobalAlloc(GHND, len);
457 LPVOID pLoc = GlobalLock(hClipData);
458 lstrcpyW(pLoc, keyName);
459 GlobalUnlock(hClipData);
460 hClipData = SetClipboardData(CF_UNICODETEXT, hClipData);
463 /* error emptying clipboard*/
464 /* DWORD dwError = GetLastError(); */
467 if (!CloseClipboard()) {
468 /* error closing clipboard*/
469 /* DWORD dwError = GetLastError(); */
473 /* error opening clipboard*/
474 /* DWORD dwError = GetLastError(); */
480 static INT_PTR CALLBACK find_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
482 HWND hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_NAME);
486 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
487 CheckDlgButton(hwndDlg, IDC_FIND_KEYS, searchMask&SEARCH_KEYS ? BST_CHECKED : BST_UNCHECKED);
488 CheckDlgButton(hwndDlg, IDC_FIND_VALUES, searchMask&SEARCH_VALUES ? BST_CHECKED : BST_UNCHECKED);
489 CheckDlgButton(hwndDlg, IDC_FIND_CONTENT, searchMask&SEARCH_CONTENT ? BST_CHECKED : BST_UNCHECKED);
490 CheckDlgButton(hwndDlg, IDC_FIND_WHOLE, searchMask&SEARCH_WHOLE ? BST_CHECKED : BST_UNCHECKED);
491 SendMessageW(hwndValue, EM_SETLIMITTEXT, 127, 0);
492 SetWindowTextW(hwndValue, searchString);
495 switch(LOWORD(wParam)) {
497 if (HIWORD(wParam) == EN_UPDATE) {
498 EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLengthW(hwndValue)>0);
503 if (GetWindowTextLengthW(hwndValue)>0) {
505 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_KEYS)) mask |= SEARCH_KEYS;
506 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_VALUES)) mask |= SEARCH_VALUES;
507 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_CONTENT)) mask |= SEARCH_CONTENT;
508 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_WHOLE)) mask |= SEARCH_WHOLE;
510 GetWindowTextW(hwndValue, searchString, 128);
511 EndDialog(hwndDlg, IDOK);
515 EndDialog(hwndDlg, IDCANCEL);
523 static INT_PTR CALLBACK addtofavorites_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
525 HWND hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_NAME);
530 HKEY hKeyRoot = NULL;
531 LPWSTR ItemPath = GetItemPathW(g_pChildWnd->hTreeWnd, NULL, &hKeyRoot);
533 if(!ItemPath || !*ItemPath)
534 ItemPath = GetItemFullPathW(g_pChildWnd->hTreeWnd, NULL, FALSE);
535 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
536 SetWindowTextW(hwndValue, ItemPath);
537 SendMessageW(hwndValue, EM_SETLIMITTEXT, 127, 0);
538 HeapFree(GetProcessHeap(), 0, ItemPath);
542 switch(LOWORD(wParam)) {
544 if (HIWORD(wParam) == EN_UPDATE) {
545 EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(hwndValue)>0);
550 if (GetWindowTextLengthW(hwndValue)>0) {
551 GetWindowTextW(hwndValue, favoriteName, 128);
552 EndDialog(hwndDlg, IDOK);
556 EndDialog(hwndDlg, IDCANCEL);
564 static INT_PTR CALLBACK removefavorite_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
566 HWND hwndList = GetDlgItem(hwndDlg, IDC_NAME_LIST);
569 case WM_INITDIALOG: {
572 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
573 if (RegOpenKeyExW(HKEY_CURRENT_USER, favoritesKey,
574 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
575 WCHAR namebuf[KEY_MAX_LEN];
577 DWORD ksize, vsize, type;
581 vsize = sizeof(valuebuf);
582 error = RegEnumValueW(hKey, i, namebuf, &ksize, NULL, &type, valuebuf, &vsize);
583 if (error != ERROR_SUCCESS)
585 if (type == REG_SZ) {
586 SendMessageW(hwndList, LB_ADDSTRING, 0, (LPARAM)namebuf);
589 } while(error == ERROR_SUCCESS);
594 EnableWindow(GetDlgItem(hwndDlg, IDOK), i != 0);
595 SendMessageW(hwndList, LB_SETCURSEL, 0, 0);
599 switch(LOWORD(wParam)) {
601 if (HIWORD(wParam) == LBN_SELCHANGE) {
602 EnableWindow(GetDlgItem(hwndDlg, IDOK), lParam != -1);
607 int pos = SendMessage(hwndList, LB_GETCURSEL, 0, 0);
608 int len = SendMessage(hwndList, LB_GETTEXTLEN, pos, 0);
610 LPWSTR lpName = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(len+1));
611 SendMessageW(hwndList, LB_GETTEXT, pos, (LPARAM)lpName);
614 lstrcpyW(favoriteName, lpName);
615 EndDialog(hwndDlg, IDOK);
616 HeapFree(GetProcessHeap(), 0, lpName);
621 EndDialog(hwndDlg, IDCANCEL);
629 /*******************************************************************************
631 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
633 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
636 static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
642 BOOL firstItem = TRUE;
644 if (LOWORD(wParam) >= ID_FAVORITE_FIRST && LOWORD(wParam) <= ID_FAVORITE_LAST) {
646 if (RegOpenKeyExW(HKEY_CURRENT_USER, favoritesKey,
647 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
648 WCHAR namebuf[KEY_MAX_LEN];
650 DWORD ksize = KEY_MAX_LEN, vsize = sizeof(valuebuf), type = 0;
651 if (RegEnumValueW(hKey, LOWORD(wParam) - ID_FAVORITE_FIRST, namebuf, &ksize, NULL,
652 &type, valuebuf, &vsize) == ERROR_SUCCESS) {
653 SendMessageW( g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET,
654 (LPARAM) FindPathInTree(g_pChildWnd->hTreeWnd, (WCHAR *)valuebuf) );
660 switch (LOWORD(wParam)) {
661 case ID_REGISTRY_IMPORTREGISTRYFILE:
662 ImportRegistryFile(hWnd);
665 ExportRegistryFile(hWnd, TRUE);
667 case ID_REGISTRY_EXPORTREGISTRYFILE:
668 ExportRegistryFile(hWnd, FALSE);
670 case ID_REGISTRY_CONNECTNETWORKREGISTRY:
672 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY:
674 case ID_REGISTRY_PRINT:
676 const WCHAR empty = 0;
677 PrintRegistryHive(hWnd, &empty);
681 if (GetFocus() == g_pChildWnd->hTreeWnd) {
682 WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
683 if (keyPath == 0 || *keyPath == 0) {
684 MessageBeep(MB_ICONHAND);
685 } else if (DeleteKey(hWnd, hKeyRoot, keyPath)) {
686 DeleteNode(g_pChildWnd->hTreeWnd, 0);
688 HeapFree(GetProcessHeap(), 0, keyPath);
689 } else if (GetFocus() == g_pChildWnd->hListWnd) {
690 WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
691 curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_SELECTED);
692 while(curIndex != -1) {
695 valueName = GetItemText(g_pChildWnd->hListWnd, curIndex);
696 curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, curIndex, LVNI_SELECTED);
697 if(curIndex != -1 && firstItem) {
698 if (MessageBoxW(hWnd, MAKEINTRESOURCEW(IDS_DELETE_BOX_TEXT_MULTIPLE),
699 MAKEINTRESOURCEW(IDS_DELETE_BOX_TITLE),
700 MB_YESNO | MB_ICONEXCLAMATION) != IDYES)
703 valueNameW = GetWideString(valueName);
704 if (!DeleteValue(hWnd, hKeyRoot, keyPath, valueNameW, curIndex==-1 && firstItem))
706 HeapFree(GetProcessHeap(), 0, valueNameW);
710 HeapFree(GetProcessHeap(), 0, valueNameW);
712 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
713 HeapFree(GetProcessHeap(), 0, keyPath);
718 LPCWSTR valueName = GetValueName(g_pChildWnd->hListWnd);
719 WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
720 if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName))
721 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, valueName);
722 HeapFree(GetProcessHeap(), 0, keyPath);
726 case ID_EDIT_FINDNEXT:
729 if (LOWORD(wParam) == ID_EDIT_FIND &&
730 DialogBox(0, MAKEINTRESOURCE(IDD_FIND), hWnd, find_dlgproc) != IDOK)
734 hItem = TreeView_GetSelection(g_pChildWnd->hTreeWnd);
736 int row = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_FOCUSED);
737 HCURSOR hcursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT));
738 hItem = FindNext(g_pChildWnd->hTreeWnd, hItem, searchString, searchMask, &row);
739 SetCursor(hcursorOld);
741 SendMessage( g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem );
742 InvalidateRect(g_pChildWnd->hTreeWnd, NULL, TRUE);
743 UpdateWindow(g_pChildWnd->hTreeWnd);
745 ListView_SetItemState(g_pChildWnd->hListWnd, -1, 0, LVIS_FOCUSED|LVIS_SELECTED);
746 ListView_SetItemState(g_pChildWnd->hListWnd, row, LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED);
747 SetFocus(g_pChildWnd->hListWnd);
749 SetFocus(g_pChildWnd->hTreeWnd);
752 CHAR* searchStringA = GetMultiByteString(searchString);
753 error(hWnd, IDS_NOTFOUND, searchStringA);
754 HeapFree(GetProcessHeap(), 0, searchStringA);
759 case ID_EDIT_COPYKEYNAME:
761 LPWSTR fullPath = GetItemFullPathW(g_pChildWnd->hTreeWnd, NULL, FALSE);
763 CopyKeyName(hWnd, fullPath);
764 HeapFree(GetProcessHeap(), 0, fullPath);
768 case ID_EDIT_NEW_KEY:
770 WCHAR newKeyW[MAX_NEW_KEY_LEN];
771 WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
772 if (CreateKey(hWnd, hKeyRoot, keyPath, newKeyW)) {
773 if (InsertNode(g_pChildWnd->hTreeWnd, 0, newKeyW))
774 StartKeyRename(g_pChildWnd->hTreeWnd);
776 HeapFree(GetProcessHeap(), 0, keyPath);
779 case ID_EDIT_NEW_STRINGVALUE:
782 case ID_EDIT_NEW_MULTI_STRINGVALUE:
783 valueType = REG_MULTI_SZ;
785 case ID_EDIT_NEW_BINARYVALUE:
786 valueType = REG_BINARY;
788 case ID_EDIT_NEW_DWORDVALUE:
789 valueType = REG_DWORD;
793 WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
794 WCHAR newKey[MAX_NEW_KEY_LEN];
795 if (CreateValue(hWnd, hKeyRoot, keyPath, valueType, newKey)) {
796 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, newKey);
797 StartValueRename(g_pChildWnd->hListWnd);
798 /* FIXME: start rename */
800 HeapFree(GetProcessHeap(), 0, keyPath);
805 WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
806 if (keyPath == 0 || *keyPath == 0) {
807 MessageBeep(MB_ICONHAND);
808 } else if (GetFocus() == g_pChildWnd->hTreeWnd) {
809 StartKeyRename(g_pChildWnd->hTreeWnd);
810 } else if (GetFocus() == g_pChildWnd->hListWnd) {
811 StartValueRename(g_pChildWnd->hListWnd);
813 HeapFree(GetProcessHeap(), 0, keyPath);
816 case ID_REGISTRY_PRINTERSETUP:
819 /*PAGESETUPDLG psd;*/
820 /*PageSetupDlg(&psd);*/
822 case ID_REGISTRY_OPENLOCAL:
824 case ID_REGISTRY_EXIT:
827 case ID_FAVORITES_ADDTOFAVORITES:
830 LPWSTR lpKeyPath = GetItemFullPathW(g_pChildWnd->hTreeWnd, NULL, FALSE);
832 if (DialogBox(0, MAKEINTRESOURCE(IDD_ADDFAVORITE), hWnd, addtofavorites_dlgproc) == IDOK) {
833 if (RegCreateKeyExW(HKEY_CURRENT_USER, favoritesKey,
835 KEY_READ|KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
836 RegSetValueExW(hKey, favoriteName, 0, REG_SZ, (BYTE *)lpKeyPath, (lstrlenW(lpKeyPath)+1)*sizeof(WCHAR));
840 HeapFree(GetProcessHeap(), 0, lpKeyPath);
844 case ID_FAVORITES_REMOVEFAVORITE:
846 if (DialogBox(0, MAKEINTRESOURCE(IDD_DELFAVORITE), hWnd, removefavorite_dlgproc) == IDOK) {
848 if (RegOpenKeyExW(HKEY_CURRENT_USER, favoritesKey,
849 0, KEY_READ|KEY_WRITE, &hKey) == ERROR_SUCCESS) {
850 RegDeleteValueW(hKey, favoriteName);
856 case ID_VIEW_REFRESH:
858 WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
859 RefreshTreeView(g_pChildWnd->hTreeWnd);
860 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
861 HeapFree(GetProcessHeap(), 0, keyPath);
864 /*case ID_OPTIONS_TOOLBAR:*/
865 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
867 case ID_VIEW_STATUSBAR:
868 toggle_child(hWnd, LOWORD(wParam), hStatusBar);
870 case ID_HELP_HELPTOPICS:
872 const WCHAR help_regedit[] = {'r','e','g','e','d','i','t',0};
873 WinHelpW(hWnd, help_regedit, HELP_FINDER, 0);
879 case ID_VIEW_SPLIT: {
882 GetClientRect(g_pChildWnd->hWnd, &rt);
883 pt.x = rt.left + g_pChildWnd->nSplitPos;
884 pt.y = (rt.bottom / 2);
886 if(ClientToScreen(g_pChildWnd->hWnd, &pts)) {
887 SetCursorPos(pts.x, pts.y);
888 SetCursor(LoadCursor(0, IDC_SIZEWE));
889 SendMessage(g_pChildWnd->hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y));
900 /********************************************************************************
902 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
904 * PURPOSE: Processes messages for the main frame window.
906 * WM_COMMAND - process the application menu
907 * WM_DESTROY - post a quit message and return
911 LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
915 CreateWindowEx(0, szChildClass, _T("regedit child window"), WS_CHILD | WS_VISIBLE,
916 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
917 hWnd, NULL, hInst, 0);
920 if (!_CmdWndProc(hWnd, message, wParam, lParam))
921 return DefWindowProc(hWnd, message, wParam, lParam);
925 SetFocus(g_pChildWnd->hWnd);
928 resize_frame_client(hWnd);
932 case WM_ENTERMENULOOP:
933 OnEnterMenuLoop(hWnd);
935 case WM_EXITMENULOOP:
936 OnExitMenuLoop(hWnd);
938 case WM_INITMENUPOPUP:
940 OnInitMenuPopup(hWnd, (HMENU)wParam, LOWORD(lParam));
943 OnMenuSelect(hWnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam);
947 const WCHAR help_regedit[] = {'r','e','g','e','d','i','t',0};
948 WinHelpW(hWnd, help_regedit, HELP_QUIT, 0);
952 return DefWindowProc(hWnd, message, wParam, lParam);