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 bIsKeySelected = FALSE;
104 HKEY hRootKey = NULL;
106 keyName = GetItemPath(hwndTV, TreeView_GetSelection(hwndTV), &hRootKey);
107 if (keyName && *keyName) { /* can't modify root keys */
108 bIsKeySelected = TRUE;
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, (bIsKeySelected ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
113 EnableMenuItem(hMenu, ID_EDIT_DELETE, (bIsKeySelected ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
114 EnableMenuItem(hMenu, ID_EDIT_RENAME, (bIsKeySelected ? 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_PTR 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, 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);
334 static BOOL ExportRegistryFile(HWND hWnd)
337 TCHAR ExportKeyPath[_MAX_PATH];
340 ExportKeyPath[0] = _T('\0');
341 InitOpenFileName(hWnd, &ofn);
342 LoadString(hInst, IDS_FILEDIALOG_EXPORT_TITLE, title, COUNT_OF(title));
343 ofn.lpstrTitle = title;
345 ofn.Flags = OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
346 ofn.lpfnHook = ExportRegistryFile_OFNHookProc;
347 ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORT_TEMPLATE);
348 if (GetSaveFileName(&ofn)) {
350 result = export_registry_key(ofn.lpstrFile, (LPTSTR)ofn.lCustData);
352 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
356 CheckCommDlgError(hWnd);
361 static BOOL PrintRegistryHive(HWND hWnd, LPCTSTR path)
366 ZeroMemory(&pd, sizeof(PRINTDLG));
367 pd.lStructSize = sizeof(PRINTDLG);
369 pd.hDevMode = NULL; /* Don't forget to free or store hDevMode*/
370 pd.hDevNames = NULL; /* Don't forget to free or store hDevNames*/
371 pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
373 pd.nFromPage = 0xFFFF;
376 pd.nMaxPage = 0xFFFF;
378 /* GDI calls to render output. */
379 DeleteDC(pd.hDC); /* Delete DC when done.*/
385 hResult = PrintDlgEx(&pd);
386 if (hResult == S_OK) {
387 switch (pd.dwResultAction) {
388 case PD_RESULT_APPLY:
389 /*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. */
391 case PD_RESULT_CANCEL:
392 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
394 case PD_RESULT_PRINT:
395 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
403 /*Insufficient memory. */
406 /* One or more arguments are invalid. */
409 /*Invalid pointer. */
415 /*Unspecified error. */
426 static BOOL CopyKeyName(HWND hWnd, LPCTSTR keyName)
430 result = OpenClipboard(hWnd);
432 result = EmptyClipboard();
434 int len = (_tcslen(keyName)+1)*sizeof(TCHAR);
435 HANDLE hClipData = GlobalAlloc(GHND, len);
436 LPVOID pLoc = GlobalLock(hClipData);
437 _tcscpy(pLoc, keyName);
438 GlobalUnlock(hClipData);
439 hClipData = SetClipboardData(CF_TEXT, hClipData);
442 /* error emptying clipboard*/
443 /* DWORD dwError = GetLastError(); */
446 if (!CloseClipboard()) {
447 /* error closing clipboard*/
448 /* DWORD dwError = GetLastError(); */
452 /* error opening clipboard*/
453 /* DWORD dwError = GetLastError(); */
459 static INT_PTR CALLBACK find_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
461 HWND hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_NAME);
465 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
466 CheckDlgButton(hwndDlg, IDC_FIND_KEYS, searchMask&SEARCH_KEYS ? BST_CHECKED : BST_UNCHECKED);
467 CheckDlgButton(hwndDlg, IDC_FIND_VALUES, searchMask&SEARCH_VALUES ? BST_CHECKED : BST_UNCHECKED);
468 CheckDlgButton(hwndDlg, IDC_FIND_CONTENT, searchMask&SEARCH_CONTENT ? BST_CHECKED : BST_UNCHECKED);
469 CheckDlgButton(hwndDlg, IDC_FIND_WHOLE, searchMask&SEARCH_WHOLE ? BST_CHECKED : BST_UNCHECKED);
470 SendMessage(hwndValue, EM_SETLIMITTEXT, 127, 0);
471 SetWindowText(hwndValue, searchString);
474 switch(LOWORD(wParam)) {
476 if (HIWORD(wParam) == EN_UPDATE) {
477 EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(hwndValue)>0);
482 if (GetWindowTextLength(hwndValue)>0) {
484 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_KEYS)) mask |= SEARCH_KEYS;
485 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_VALUES)) mask |= SEARCH_VALUES;
486 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_CONTENT)) mask |= SEARCH_CONTENT;
487 if (IsDlgButtonChecked(hwndDlg, IDC_FIND_WHOLE)) mask |= SEARCH_WHOLE;
489 GetWindowText(hwndValue, searchString, 128);
490 EndDialog(hwndDlg, IDOK);
494 EndDialog(hwndDlg, IDCANCEL);
502 static INT_PTR CALLBACK addtofavorites_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
504 HWND hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_NAME);
508 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
509 SendMessage(hwndValue, EM_SETLIMITTEXT, 127, 0);
512 switch(LOWORD(wParam)) {
514 if (HIWORD(wParam) == EN_UPDATE) {
515 EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(hwndValue)>0);
520 if (GetWindowTextLength(hwndValue)>0) {
521 GetWindowText(hwndValue, favoriteName, 128);
522 EndDialog(hwndDlg, IDOK);
526 EndDialog(hwndDlg, IDCANCEL);
534 static INT_PTR CALLBACK removefavorite_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
536 HWND hwndList = GetDlgItem(hwndDlg, IDC_NAME_LIST);
539 case WM_INITDIALOG: {
542 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
543 if (RegOpenKeyEx(HKEY_CURRENT_USER, favoritesKey,
544 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
545 TCHAR namebuf[KEY_MAX_LEN];
547 DWORD ksize, vsize, type;
551 vsize = sizeof(valuebuf);
552 error = RegEnumValue(hKey, i, namebuf, &ksize, NULL, &type, valuebuf, &vsize);
553 if (error != ERROR_SUCCESS)
555 if (type == REG_SZ) {
556 SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)namebuf);
559 } while(error == ERROR_SUCCESS);
564 EnableWindow(GetDlgItem(hwndDlg, IDOK), i != 0);
565 SendMessage(hwndList, LB_SETCURSEL, 0, 0);
569 switch(LOWORD(wParam)) {
571 if (HIWORD(wParam) == LBN_SELCHANGE) {
572 EnableWindow(GetDlgItem(hwndDlg, IDOK), lParam != -1);
577 int pos = SendMessage(hwndList, LB_GETCURSEL, 0, 0);
578 int len = SendMessage(hwndList, LB_GETTEXTLEN, pos, 0);
580 LPTSTR lpName = HeapAlloc(GetProcessHeap(), 0, sizeof(TCHAR)*(len+1));
581 SendMessage(hwndList, LB_GETTEXT, pos, (LPARAM)lpName);
584 _tcscpy(favoriteName, lpName);
585 EndDialog(hwndDlg, IDOK);
586 HeapFree(GetProcessHeap(), 0, lpName);
591 EndDialog(hwndDlg, IDCANCEL);
599 /*******************************************************************************
601 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
603 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
606 static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
611 TCHAR newKey[MAX_NEW_KEY_LEN];
614 keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
615 valueName = GetValueName(g_pChildWnd->hListWnd);
617 if (LOWORD(wParam) >= ID_FAVORITE_FIRST && LOWORD(wParam) <= ID_FAVORITE_LAST) {
619 if (RegOpenKeyEx(HKEY_CURRENT_USER, favoritesKey,
620 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
621 TCHAR namebuf[KEY_MAX_LEN];
623 DWORD ksize = KEY_MAX_LEN, vsize = sizeof(valuebuf), type = 0;
624 if (RegEnumValue(hKey, LOWORD(wParam) - ID_FAVORITE_FIRST, namebuf, &ksize, NULL,
625 &type, valuebuf, &vsize) == ERROR_SUCCESS) {
626 SendMessage( g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET,
627 (LPARAM) FindPathInTree(g_pChildWnd->hTreeWnd, (TCHAR *)valuebuf) );
633 switch (LOWORD(wParam)) {
634 case ID_REGISTRY_IMPORTREGISTRYFILE:
635 ImportRegistryFile(hWnd);
637 case ID_REGISTRY_EXPORTREGISTRYFILE:
638 ExportRegistryFile(hWnd);
640 case ID_REGISTRY_CONNECTNETWORKREGISTRY:
642 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY:
644 case ID_REGISTRY_PRINT:
645 PrintRegistryHive(hWnd, _T(""));
648 if (GetFocus() == g_pChildWnd->hTreeWnd) {
649 if (keyPath == 0 || *keyPath == 0) {
650 MessageBeep(MB_ICONHAND);
651 } else if (DeleteKey(hWnd, hKeyRoot, keyPath)) {
652 DeleteNode(g_pChildWnd->hTreeWnd, 0);
654 } else if (GetFocus() == g_pChildWnd->hListWnd) {
655 if (DeleteValue(hWnd, hKeyRoot, keyPath, valueName))
656 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
660 if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName))
661 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, valueName);
664 case ID_EDIT_FINDNEXT:
667 if (LOWORD(wParam) == ID_EDIT_FIND &&
668 DialogBox(0, MAKEINTRESOURCE(IDD_FIND), hWnd, find_dlgproc) != IDOK)
672 hItem = TreeView_GetSelection(g_pChildWnd->hTreeWnd);
674 int row = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_FOCUSED);
675 HCURSOR hcursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT));
676 hItem = FindNext(g_pChildWnd->hTreeWnd, hItem, searchString, searchMask, &row);
677 SetCursor(hcursorOld);
679 SendMessage( g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem );
680 InvalidateRect(g_pChildWnd->hTreeWnd, NULL, TRUE);
681 UpdateWindow(g_pChildWnd->hTreeWnd);
683 ListView_SetItemState(g_pChildWnd->hListWnd, -1, 0, LVIS_FOCUSED|LVIS_SELECTED);
684 ListView_SetItemState(g_pChildWnd->hListWnd, row, LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED);
685 SetFocus(g_pChildWnd->hListWnd);
687 SetFocus(g_pChildWnd->hTreeWnd);
690 error(hWnd, IDS_NOTFOUND, searchString);
695 case ID_EDIT_COPYKEYNAME:
697 LPTSTR fullPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
699 CopyKeyName(hWnd, fullPath);
700 HeapFree(GetProcessHeap(), 0, fullPath);
704 case ID_EDIT_NEW_KEY:
705 if (CreateKey(hWnd, hKeyRoot, keyPath, newKey)) {
706 if (InsertNode(g_pChildWnd->hTreeWnd, 0, newKey))
707 StartKeyRename(g_pChildWnd->hTreeWnd);
710 case ID_EDIT_NEW_STRINGVALUE:
713 case ID_EDIT_NEW_BINARYVALUE:
714 valueType = REG_BINARY;
716 case ID_EDIT_NEW_DWORDVALUE:
717 valueType = REG_DWORD;
720 if (CreateValue(hWnd, hKeyRoot, keyPath, valueType, newKey)) {
721 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, newKey);
722 StartValueRename(g_pChildWnd->hListWnd);
723 /* FIXME: start rename */
727 if (keyPath == 0 || *keyPath == 0) {
728 MessageBeep(MB_ICONHAND);
729 } else if (GetFocus() == g_pChildWnd->hTreeWnd) {
730 StartKeyRename(g_pChildWnd->hTreeWnd);
731 } else if (GetFocus() == g_pChildWnd->hListWnd) {
732 StartValueRename(g_pChildWnd->hListWnd);
736 case ID_REGISTRY_PRINTERSETUP:
739 /*PAGESETUPDLG psd;*/
740 /*PageSetupDlg(&psd);*/
742 case ID_REGISTRY_OPENLOCAL:
744 case ID_REGISTRY_EXIT:
747 case ID_FAVORITES_ADDTOFAVORITES:
750 LPTSTR lpKeyPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
752 if (DialogBox(0, MAKEINTRESOURCE(IDD_ADDFAVORITE), hWnd, addtofavorites_dlgproc) == IDOK) {
753 if (RegCreateKeyEx(HKEY_CURRENT_USER, favoritesKey,
755 KEY_READ|KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
756 RegSetValueEx(hKey, favoriteName, 0, REG_SZ, (BYTE *)lpKeyPath, (_tcslen(lpKeyPath)+1)*sizeof(TCHAR));
760 HeapFree(GetProcessHeap(), 0, lpKeyPath);
764 case ID_FAVORITES_REMOVEFAVORITE:
766 if (DialogBox(0, MAKEINTRESOURCE(IDD_DELFAVORITE), hWnd, removefavorite_dlgproc) == IDOK) {
768 if (RegOpenKeyEx(HKEY_CURRENT_USER, favoritesKey,
769 0, KEY_READ|KEY_WRITE, &hKey) == ERROR_SUCCESS) {
770 RegDeleteValue(hKey, favoriteName);
776 case ID_VIEW_REFRESH:
777 RefreshTreeView(g_pChildWnd->hTreeWnd);
778 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
780 /*case ID_OPTIONS_TOOLBAR:*/
781 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
783 case ID_VIEW_STATUSBAR:
784 toggle_child(hWnd, LOWORD(wParam), hStatusBar);
786 case ID_HELP_HELPTOPICS:
787 WinHelp(hWnd, _T("regedit"), HELP_FINDER, 0);
792 case ID_VIEW_SPLIT: {
795 GetClientRect(g_pChildWnd->hWnd, &rt);
796 pt.x = rt.left + g_pChildWnd->nSplitPos;
797 pt.y = (rt.bottom / 2);
799 if(ClientToScreen(g_pChildWnd->hWnd, &pts)) {
800 SetCursorPos(pts.x, pts.y);
801 SetCursor(LoadCursor(0, IDC_SIZEWE));
802 SendMessage(g_pChildWnd->hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y));
813 /********************************************************************************
815 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
817 * PURPOSE: Processes messages for the main frame window.
819 * WM_COMMAND - process the application menu
820 * WM_DESTROY - post a quit message and return
824 LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
828 CreateWindowEx(0, szChildClass, _T("regedit child window"), WS_CHILD | WS_VISIBLE,
829 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
830 hWnd, NULL, hInst, 0);
833 if (!_CmdWndProc(hWnd, message, wParam, lParam))
834 return DefWindowProc(hWnd, message, wParam, lParam);
838 SetFocus(g_pChildWnd->hWnd);
841 resize_frame_client(hWnd);
845 case WM_ENTERMENULOOP:
846 OnEnterMenuLoop(hWnd);
848 case WM_EXITMENULOOP:
849 OnExitMenuLoop(hWnd);
851 case WM_INITMENUPOPUP:
853 OnInitMenuPopup(hWnd, (HMENU)wParam, LOWORD(lParam));
856 OnMenuSelect(hWnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam);
859 WinHelp(hWnd, _T("regedit"), HELP_QUIT, 0);
862 return DefWindowProc(hWnd, message, wParam, lParam);