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 */
35 /********************************************************************************
36 * Global and Local Variables:
39 static TCHAR favoritesKey[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\RegEdit\\Favorites");
40 static BOOL bInMenuLoop = FALSE; /* Tells us if we are in the menu loop */
41 static TCHAR favoriteName[128];
42 static TCHAR searchString[128];
43 static int searchMask = SEARCH_KEYS | SEARCH_VALUES | SEARCH_CONTENT;
45 static TCHAR FileNameBuffer[_MAX_PATH];
46 static TCHAR FileTitleBuffer[_MAX_PATH];
47 static TCHAR FilterBuffer[_MAX_PATH];
49 /*******************************************************************************
50 * Local module support methods
53 static void resize_frame_rect(HWND hWnd, PRECT prect)
57 if (IsWindowVisible(hToolBar)) {
58 SendMessage(hToolBar, WM_SIZE, 0, 0);
59 GetClientRect(hToolBar, &rt);
60 prect->top = rt.bottom+3;
61 prect->bottom -= rt.bottom+3;
64 if (IsWindowVisible(hStatusBar)) {
65 SetupStatusBar(hWnd, TRUE);
66 GetClientRect(hStatusBar, &rt);
67 prect->bottom -= rt.bottom;
69 MoveWindow(g_pChildWnd->hWnd, prect->left, prect->top, prect->right, prect->bottom, TRUE);
72 static void resize_frame_client(HWND hWnd)
76 GetClientRect(hWnd, &rect);
77 resize_frame_rect(hWnd, &rect);
80 /********************************************************************************/
82 static void OnEnterMenuLoop(HWND hWnd)
86 /* Update the status bar pane sizes */
88 SendMessage(hStatusBar, SB_SETPARTS, 1, (long)&nParts);
90 SendMessage(hStatusBar, SB_SETTEXT, (WPARAM)0, (LPARAM)_T(""));
93 static void OnExitMenuLoop(HWND hWnd)
96 /* Update the status bar pane sizes*/
97 SetupStatusBar(hWnd, TRUE);
101 static void UpdateMenuItems(HMENU hMenu) {
102 HWND hwndTV = g_pChildWnd->hTreeWnd;
103 BOOL bAllowEdit = FALSE;
104 HKEY hRootKey = NULL;
106 keyName = GetItemPath(hwndTV, TreeView_GetSelection(hwndTV), &hRootKey);
107 if (GetFocus() != hwndTV || (keyName && *keyName)) { /* can't modify root keys, but allow for their values */
110 EnableMenuItem(hMenu, ID_EDIT_FIND, MF_ENABLED | MF_BYCOMMAND);
111 EnableMenuItem(hMenu, ID_EDIT_FINDNEXT, MF_ENABLED | MF_BYCOMMAND);
112 EnableMenuItem(hMenu, ID_EDIT_MODIFY, (bAllowEdit ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
113 EnableMenuItem(hMenu, ID_EDIT_DELETE, (bAllowEdit ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
114 EnableMenuItem(hMenu, ID_EDIT_RENAME, (bAllowEdit ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
115 EnableMenuItem(hMenu, ID_FAVORITES_ADDTOFAVORITES, (hRootKey ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
116 EnableMenuItem(hMenu, ID_FAVORITES_REMOVEFAVORITE,
117 (GetMenuItemCount(hMenu)>2 ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
120 static void OnInitMenuPopup(HWND hWnd, HMENU hMenu, short wItem)
124 while(GetMenuItemCount(hMenu)>2)
125 DeleteMenu(hMenu, 2, MF_BYPOSITION);
126 if (RegOpenKeyEx(HKEY_CURRENT_USER, favoritesKey,
127 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
128 TCHAR namebuf[KEY_MAX_LEN];
132 DWORD ksize, vsize, type;
136 vsize = sizeof(valuebuf);
137 error = RegEnumValue(hKey, i, namebuf, &ksize, NULL, &type, valuebuf, &vsize);
138 if (error != ERROR_SUCCESS)
140 if (type == REG_SZ) {
142 AppendMenu(hMenu, MF_SEPARATOR, -1, NULL);
145 AppendMenu(hMenu, MF_STRING, ID_FAVORITE_FIRST+i, namebuf);
148 } while(error == ERROR_SUCCESS);
152 UpdateMenuItems(hMenu);
155 static void OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu)
159 _tcscpy(str, _T(""));
160 if (nFlags & MF_POPUP) {
161 if (hSysMenu != GetMenu(hWnd)) {
162 if (nItemID == 2) nItemID = 5;
165 if (LoadString(hInst, nItemID, str, 100)) {
166 /* load appropriate string*/
168 /* first newline terminates actual string*/
169 lpsz = _tcschr(lpsz, '\n');
173 SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)str);
176 void SetupStatusBar(HWND hWnd, BOOL bResize)
180 GetClientRect(hWnd, &rc);
184 SendMessage(hStatusBar, WM_SIZE, 0, 0);
185 SendMessage(hStatusBar, SB_SETPARTS, 1, (LPARAM)&nParts);
189 void UpdateStatusBar(void)
191 LPTSTR fullPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, TRUE);
192 SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)fullPath);
193 HeapFree(GetProcessHeap(), 0, fullPath);
196 static void toggle_child(HWND hWnd, UINT cmd, HWND hchild)
198 BOOL vis = IsWindowVisible(hchild);
199 HMENU hMenuView = GetSubMenu(hMenuFrame, ID_VIEW_MENU);
201 CheckMenuItem(hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED);
202 ShowWindow(hchild, vis?SW_HIDE:SW_SHOW);
203 resize_frame_client(hWnd);
206 static BOOL CheckCommDlgError(HWND hWnd)
208 DWORD dwErrorCode = CommDlgExtendedError();
209 switch (dwErrorCode) {
210 case CDERR_DIALOGFAILURE:
212 case CDERR_FINDRESFAILURE:
214 case CDERR_NOHINSTANCE:
216 case CDERR_INITIALIZATION:
220 case CDERR_LOCKRESFAILURE:
222 case CDERR_NOTEMPLATE:
224 case CDERR_LOADRESFAILURE:
226 case CDERR_STRUCTSIZE:
228 case CDERR_LOADSTRFAILURE:
230 case FNERR_BUFFERTOOSMALL:
232 case CDERR_MEMALLOCFAILURE:
234 case FNERR_INVALIDFILENAME:
236 case CDERR_MEMLOCKFAILURE:
238 case FNERR_SUBCLASSFAILURE:
246 static void ExportRegistryFile_StoreSelection(HWND hdlg, OPENFILENAME *pOpenFileName)
248 if (IsDlgButtonChecked(hdlg, IDC_EXPORT_SELECTED))
250 INT len = SendDlgItemMessage(hdlg, IDC_EXPORT_PATH, WM_GETTEXTLENGTH, 0, 0);
251 pOpenFileName->lCustData = (LPARAM)HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(TCHAR));
252 SendDlgItemMessage(hdlg, IDC_EXPORT_PATH, WM_GETTEXT, len+1, pOpenFileName->lCustData);
255 pOpenFileName->lCustData = (LPARAM)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TCHAR));
258 static UINT CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
260 static OPENFILENAME* pOpenFileName;
266 pOpenFileName = (OPENFILENAME*)lParam;
269 if (LOWORD(wParam) == IDC_EXPORT_PATH && HIWORD(wParam) == EN_UPDATE)
270 CheckRadioButton(hdlg, IDC_EXPORT_ALL, IDC_EXPORT_SELECTED, IDC_EXPORT_SELECTED);
273 pOfNotify = (OFNOTIFY*)lParam;
274 switch (pOfNotify->hdr.code)
277 path = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
278 SendDlgItemMessage(hdlg, IDC_EXPORT_PATH, WM_SETTEXT, 0, (LPARAM)path);
279 HeapFree(GetProcessHeap(), 0, path);
280 CheckRadioButton(hdlg, IDC_EXPORT_ALL, IDC_EXPORT_SELECTED, pOpenFileName->lCustData ? IDC_EXPORT_SELECTED : IDC_EXPORT_ALL);
283 ExportRegistryFile_StoreSelection(hdlg, pOpenFileName);
294 static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME *pofn)
296 memset(pofn, 0, sizeof(OPENFILENAME));
297 pofn->lStructSize = sizeof(OPENFILENAME);
298 pofn->hwndOwner = hWnd;
299 pofn->hInstance = hInst;
301 if (FilterBuffer[0] == 0)
302 LoadString(hInst, IDS_FILEDIALOG_FILTER, FilterBuffer, _MAX_PATH);
303 pofn->lpstrFilter = FilterBuffer;
304 pofn->nFilterIndex = 1;
305 pofn->lpstrFile = FileNameBuffer;
306 pofn->nMaxFile = _MAX_PATH;
307 pofn->lpstrFileTitle = FileTitleBuffer;
308 pofn->nMaxFileTitle = _MAX_PATH;
309 pofn->Flags = OFN_HIDEREADONLY;
310 /* some other fields may be set by the caller */
314 static BOOL ImportRegistryFile(HWND hWnd)
319 InitOpenFileName(hWnd, &ofn);
320 LoadString(hInst, IDS_FILEDIALOG_IMPORT_TITLE, title, COUNT_OF(title));
321 ofn.lpstrTitle = title;
322 if (GetOpenFileName(&ofn)) {
323 if (!import_registry_file(ofn.lpstrFile)) {
324 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
328 CheckCommDlgError(hWnd);
330 RefreshTreeView(g_pChildWnd->hTreeWnd);
335 static BOOL ExportRegistryFile(HWND hWnd, BOOL export_branch)
338 TCHAR ExportKeyPath[_MAX_PATH];
341 ExportKeyPath[0] = _T('\0');
342 InitOpenFileName(hWnd, &ofn);
343 LoadString(hInst, IDS_FILEDIALOG_EXPORT_TITLE, title, COUNT_OF(title));
344 ofn.lpstrTitle = title;
345 ofn.lCustData = export_branch;
346 ofn.Flags = OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
347 ofn.lpfnHook = ExportRegistryFile_OFNHookProc;
348 ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORT_TEMPLATE);
349 if (GetSaveFileName(&ofn)) {
351 result = export_registry_key(ofn.lpstrFile, (LPTSTR)ofn.lCustData);
353 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
357 CheckCommDlgError(hWnd);
362 static BOOL PrintRegistryHive(HWND hWnd, LPCTSTR path)
367 ZeroMemory(&pd, sizeof(PRINTDLG));
368 pd.lStructSize = sizeof(PRINTDLG);
370 pd.hDevMode = NULL; /* Don't forget to free or store hDevMode*/
371 pd.hDevNames = NULL; /* Don't forget to free or store hDevNames*/
372 pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
374 pd.nFromPage = 0xFFFF;
377 pd.nMaxPage = 0xFFFF;
379 /* GDI calls to render output. */
380 DeleteDC(pd.hDC); /* Delete DC when done.*/
386 hResult = PrintDlgEx(&pd);
387 if (hResult == S_OK) {
388 switch (pd.dwResultAction) {
389 case PD_RESULT_APPLY:
390 /*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. */
392 case PD_RESULT_CANCEL:
393 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
395 case PD_RESULT_PRINT:
396 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
404 /*Insufficient memory. */
407 /* One or more arguments are invalid. */
410 /*Invalid pointer. */
416 /*Unspecified error. */
427 static BOOL CopyKeyName(HWND hWnd, LPCTSTR keyName)
431 result = OpenClipboard(hWnd);
433 result = EmptyClipboard();
435 int len = (_tcslen(keyName)+1)*sizeof(TCHAR);
436 HANDLE hClipData = GlobalAlloc(GHND, len);
437 LPVOID pLoc = GlobalLock(hClipData);
438 _tcscpy(pLoc, keyName);
439 GlobalUnlock(hClipData);
440 hClipData = SetClipboardData(CF_TEXT, hClipData);
443 /* error emptying clipboard*/
444 /* DWORD dwError = GetLastError(); */
447 if (!CloseClipboard()) {
448 /* error closing clipboard*/
449 /* DWORD dwError = GetLastError(); */
453 /* error opening clipboard*/
454 /* DWORD dwError = GetLastError(); */
460 static INT_PTR CALLBACK find_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
462 HWND hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_NAME);
466 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
467 CheckDlgButton(hwndDlg, IDC_FIND_KEYS, searchMask&SEARCH_KEYS ? BST_CHECKED : BST_UNCHECKED);
468 CheckDlgButton(hwndDlg, IDC_FIND_VALUES, searchMask&SEARCH_VALUES ? BST_CHECKED : BST_UNCHECKED);
469 CheckDlgButton(hwndDlg, IDC_FIND_CONTENT, searchMask&SEARCH_CONTENT ? BST_CHECKED : BST_UNCHECKED);
470 CheckDlgButton(hwndDlg, IDC_FIND_WHOLE, searchMask&SEARCH_WHOLE ? BST_CHECKED : BST_UNCHECKED);
471 SendMessage(hwndValue, EM_SETLIMITTEXT, 127, 0);
472 SetWindowText(hwndValue, searchString);
475 switch(LOWORD(wParam)) {
477 if (HIWORD(wParam) == EN_UPDATE) {
478 EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(hwndValue)>0);
483 if (GetWindowTextLength(hwndValue)>0) {
485 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_KEYS)) mask |= SEARCH_KEYS;
486 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_VALUES)) mask |= SEARCH_VALUES;
487 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_CONTENT)) mask |= SEARCH_CONTENT;
488 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_WHOLE)) mask |= SEARCH_WHOLE;
490 GetWindowText(hwndValue, searchString, 128);
491 EndDialog(hwndDlg, IDOK);
495 EndDialog(hwndDlg, IDCANCEL);
503 static INT_PTR CALLBACK addtofavorites_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
505 HWND hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_NAME);
510 HKEY hKeyRoot = NULL;
511 LPSTR ItemPath = GetItemPath(g_pChildWnd->hTreeWnd, NULL, &hKeyRoot);
513 if(!ItemPath || !*ItemPath)
514 ItemPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
515 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
516 SetWindowText(hwndValue, ItemPath);
517 SendMessage(hwndValue, EM_SETLIMITTEXT, 127, 0);
521 switch(LOWORD(wParam)) {
523 if (HIWORD(wParam) == EN_UPDATE) {
524 EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(hwndValue)>0);
529 if (GetWindowTextLength(hwndValue)>0) {
530 GetWindowText(hwndValue, favoriteName, 128);
531 EndDialog(hwndDlg, IDOK);
535 EndDialog(hwndDlg, IDCANCEL);
543 static INT_PTR CALLBACK removefavorite_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
545 HWND hwndList = GetDlgItem(hwndDlg, IDC_NAME_LIST);
548 case WM_INITDIALOG: {
551 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
552 if (RegOpenKeyEx(HKEY_CURRENT_USER, favoritesKey,
553 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
554 TCHAR namebuf[KEY_MAX_LEN];
556 DWORD ksize, vsize, type;
560 vsize = sizeof(valuebuf);
561 error = RegEnumValue(hKey, i, namebuf, &ksize, NULL, &type, valuebuf, &vsize);
562 if (error != ERROR_SUCCESS)
564 if (type == REG_SZ) {
565 SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)namebuf);
568 } while(error == ERROR_SUCCESS);
573 EnableWindow(GetDlgItem(hwndDlg, IDOK), i != 0);
574 SendMessage(hwndList, LB_SETCURSEL, 0, 0);
578 switch(LOWORD(wParam)) {
580 if (HIWORD(wParam) == LBN_SELCHANGE) {
581 EnableWindow(GetDlgItem(hwndDlg, IDOK), lParam != -1);
586 int pos = SendMessage(hwndList, LB_GETCURSEL, 0, 0);
587 int len = SendMessage(hwndList, LB_GETTEXTLEN, pos, 0);
589 LPTSTR lpName = HeapAlloc(GetProcessHeap(), 0, sizeof(TCHAR)*(len+1));
590 SendMessage(hwndList, LB_GETTEXT, pos, (LPARAM)lpName);
593 _tcscpy(favoriteName, lpName);
594 EndDialog(hwndDlg, IDOK);
595 HeapFree(GetProcessHeap(), 0, lpName);
600 EndDialog(hwndDlg, IDCANCEL);
608 /*******************************************************************************
610 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
612 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
615 static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
620 TCHAR newKey[MAX_NEW_KEY_LEN];
623 keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
624 valueName = GetValueName(g_pChildWnd->hListWnd);
626 if (LOWORD(wParam) >= ID_FAVORITE_FIRST && LOWORD(wParam) <= ID_FAVORITE_LAST) {
628 if (RegOpenKeyEx(HKEY_CURRENT_USER, favoritesKey,
629 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
630 TCHAR namebuf[KEY_MAX_LEN];
632 DWORD ksize = KEY_MAX_LEN, vsize = sizeof(valuebuf), type = 0;
633 if (RegEnumValue(hKey, LOWORD(wParam) - ID_FAVORITE_FIRST, namebuf, &ksize, NULL,
634 &type, valuebuf, &vsize) == ERROR_SUCCESS) {
635 SendMessage( g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET,
636 (LPARAM) FindPathInTree(g_pChildWnd->hTreeWnd, (TCHAR *)valuebuf) );
642 switch (LOWORD(wParam)) {
643 case ID_REGISTRY_IMPORTREGISTRYFILE:
644 ImportRegistryFile(hWnd);
647 ExportRegistryFile(hWnd, TRUE);
649 case ID_REGISTRY_EXPORTREGISTRYFILE:
650 ExportRegistryFile(hWnd, FALSE);
652 case ID_REGISTRY_CONNECTNETWORKREGISTRY:
654 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY:
656 case ID_REGISTRY_PRINT:
657 PrintRegistryHive(hWnd, _T(""));
660 if (GetFocus() == g_pChildWnd->hTreeWnd) {
661 if (keyPath == 0 || *keyPath == 0) {
662 MessageBeep(MB_ICONHAND);
663 } else if (DeleteKey(hWnd, hKeyRoot, keyPath)) {
664 DeleteNode(g_pChildWnd->hTreeWnd, 0);
666 } else if (GetFocus() == g_pChildWnd->hListWnd) {
667 if (DeleteValue(hWnd, hKeyRoot, keyPath, valueName))
668 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
672 if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName))
673 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, valueName);
676 case ID_EDIT_FINDNEXT:
679 if (LOWORD(wParam) == ID_EDIT_FIND &&
680 DialogBox(0, MAKEINTRESOURCE(IDD_FIND), hWnd, find_dlgproc) != IDOK)
684 hItem = TreeView_GetSelection(g_pChildWnd->hTreeWnd);
686 int row = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_FOCUSED);
687 HCURSOR hcursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT));
688 hItem = FindNext(g_pChildWnd->hTreeWnd, hItem, searchString, searchMask, &row);
689 SetCursor(hcursorOld);
691 SendMessage( g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem );
692 InvalidateRect(g_pChildWnd->hTreeWnd, NULL, TRUE);
693 UpdateWindow(g_pChildWnd->hTreeWnd);
695 ListView_SetItemState(g_pChildWnd->hListWnd, -1, 0, LVIS_FOCUSED|LVIS_SELECTED);
696 ListView_SetItemState(g_pChildWnd->hListWnd, row, LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED);
697 SetFocus(g_pChildWnd->hListWnd);
699 SetFocus(g_pChildWnd->hTreeWnd);
702 error(hWnd, IDS_NOTFOUND, searchString);
707 case ID_EDIT_COPYKEYNAME:
709 LPTSTR fullPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
711 CopyKeyName(hWnd, fullPath);
712 HeapFree(GetProcessHeap(), 0, fullPath);
716 case ID_EDIT_NEW_KEY:
717 if (CreateKey(hWnd, hKeyRoot, keyPath, newKey)) {
718 if (InsertNode(g_pChildWnd->hTreeWnd, 0, newKey))
719 StartKeyRename(g_pChildWnd->hTreeWnd);
722 case ID_EDIT_NEW_STRINGVALUE:
725 case ID_EDIT_NEW_MULTI_STRINGVALUE:
726 valueType = REG_MULTI_SZ;
728 case ID_EDIT_NEW_BINARYVALUE:
729 valueType = REG_BINARY;
731 case ID_EDIT_NEW_DWORDVALUE:
732 valueType = REG_DWORD;
735 if (CreateValue(hWnd, hKeyRoot, keyPath, valueType, newKey)) {
736 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, newKey);
737 StartValueRename(g_pChildWnd->hListWnd);
738 /* FIXME: start rename */
742 if (keyPath == 0 || *keyPath == 0) {
743 MessageBeep(MB_ICONHAND);
744 } else if (GetFocus() == g_pChildWnd->hTreeWnd) {
745 StartKeyRename(g_pChildWnd->hTreeWnd);
746 } else if (GetFocus() == g_pChildWnd->hListWnd) {
747 StartValueRename(g_pChildWnd->hListWnd);
750 case ID_REGISTRY_PRINTERSETUP:
753 /*PAGESETUPDLG psd;*/
754 /*PageSetupDlg(&psd);*/
756 case ID_REGISTRY_OPENLOCAL:
758 case ID_REGISTRY_EXIT:
761 case ID_FAVORITES_ADDTOFAVORITES:
764 LPTSTR lpKeyPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
766 if (DialogBox(0, MAKEINTRESOURCE(IDD_ADDFAVORITE), hWnd, addtofavorites_dlgproc) == IDOK) {
767 if (RegCreateKeyEx(HKEY_CURRENT_USER, favoritesKey,
769 KEY_READ|KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
770 RegSetValueEx(hKey, favoriteName, 0, REG_SZ, (BYTE *)lpKeyPath, (_tcslen(lpKeyPath)+1)*sizeof(TCHAR));
774 HeapFree(GetProcessHeap(), 0, lpKeyPath);
778 case ID_FAVORITES_REMOVEFAVORITE:
780 if (DialogBox(0, MAKEINTRESOURCE(IDD_DELFAVORITE), hWnd, removefavorite_dlgproc) == IDOK) {
782 if (RegOpenKeyEx(HKEY_CURRENT_USER, favoritesKey,
783 0, KEY_READ|KEY_WRITE, &hKey) == ERROR_SUCCESS) {
784 RegDeleteValue(hKey, favoriteName);
790 case ID_VIEW_REFRESH:
791 RefreshTreeView(g_pChildWnd->hTreeWnd);
792 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
794 /*case ID_OPTIONS_TOOLBAR:*/
795 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
797 case ID_VIEW_STATUSBAR:
798 toggle_child(hWnd, LOWORD(wParam), hStatusBar);
800 case ID_HELP_HELPTOPICS:
801 WinHelp(hWnd, _T("regedit"), HELP_FINDER, 0);
806 case ID_VIEW_SPLIT: {
809 GetClientRect(g_pChildWnd->hWnd, &rt);
810 pt.x = rt.left + g_pChildWnd->nSplitPos;
811 pt.y = (rt.bottom / 2);
813 if(ClientToScreen(g_pChildWnd->hWnd, &pts)) {
814 SetCursorPos(pts.x, pts.y);
815 SetCursor(LoadCursor(0, IDC_SIZEWE));
816 SendMessage(g_pChildWnd->hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y));
827 /********************************************************************************
829 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
831 * PURPOSE: Processes messages for the main frame window.
833 * WM_COMMAND - process the application menu
834 * WM_DESTROY - post a quit message and return
838 LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
842 CreateWindowEx(0, szChildClass, _T("regedit child window"), WS_CHILD | WS_VISIBLE,
843 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
844 hWnd, NULL, hInst, 0);
847 if (!_CmdWndProc(hWnd, message, wParam, lParam))
848 return DefWindowProc(hWnd, message, wParam, lParam);
852 SetFocus(g_pChildWnd->hWnd);
855 resize_frame_client(hWnd);
859 case WM_ENTERMENULOOP:
860 OnEnterMenuLoop(hWnd);
862 case WM_EXITMENULOOP:
863 OnExitMenuLoop(hWnd);
865 case WM_INITMENUPOPUP:
867 OnInitMenuPopup(hWnd, (HMENU)wParam, LOWORD(lParam));
870 OnMenuSelect(hWnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam);
873 WinHelp(hWnd, _T("regedit"), HELP_QUIT, 0);
876 return DefWindowProc(hWnd, message, wParam, lParam);