winecfg: Values list should be NULL-terminated.
[wine/dcerpc.git] / programs / regedit / framewnd.c
bloba2d94bf8043c9b7378563039467826ea2afe6943
1 /*
2 * Regedit frame window
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 */
23 #include <windows.h>
24 #include <tchar.h>
25 #include <commctrl.h>
26 #include <commdlg.h>
27 #include <cderr.h>
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <shellapi.h>
32 #include "main.h"
33 #include "regproc.h"
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)
55 RECT rt;
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)
74 RECT rect;
76 GetClientRect(hWnd, &rect);
77 resize_frame_rect(hWnd, &rect);
80 /********************************************************************************/
82 static void OnEnterMenuLoop(HWND hWnd)
84 int nParts;
86 /* Update the status bar pane sizes */
87 nParts = -1;
88 SendMessage(hStatusBar, SB_SETPARTS, 1, (long)&nParts);
89 bInMenuLoop = TRUE;
90 SendMessage(hStatusBar, SB_SETTEXT, (WPARAM)0, (LPARAM)_T(""));
93 static void OnExitMenuLoop(HWND hWnd)
95 bInMenuLoop = FALSE;
96 /* Update the status bar pane sizes*/
97 SetupStatusBar(hWnd, TRUE);
98 UpdateStatusBar();
101 static void UpdateMenuItems(HMENU hMenu) {
102 HWND hwndTV = g_pChildWnd->hTreeWnd;
103 BOOL bIsKeySelected = FALSE;
104 HKEY hRootKey = NULL;
105 LPCTSTR keyName;
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)
122 if (wItem == 3) {
123 HKEY hKey;
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];
129 BYTE valuebuf[4096];
130 int i = 0;
131 BOOL sep = FALSE;
132 DWORD ksize, vsize, type;
133 LONG error;
134 do {
135 ksize = KEY_MAX_LEN;
136 vsize = sizeof(valuebuf);
137 error = RegEnumValue(hKey, i, namebuf, &ksize, NULL, &type, valuebuf, &vsize);
138 if (error != ERROR_SUCCESS)
139 break;
140 if (type == REG_SZ) {
141 if (!sep) {
142 AppendMenu(hMenu, MF_SEPARATOR, -1, NULL);
143 sep = TRUE;
145 AppendMenu(hMenu, MF_STRING, ID_FAVORITE_FIRST+i, namebuf);
147 i++;
148 } while(error == ERROR_SUCCESS);
149 RegCloseKey(hKey);
152 UpdateMenuItems(hMenu);
155 static void OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu)
157 TCHAR str[100];
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*/
167 LPTSTR lpsz = str;
168 /* first newline terminates actual string*/
169 lpsz = _tcschr(lpsz, '\n');
170 if (lpsz != NULL)
171 *lpsz = '\0';
173 SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)str);
176 void SetupStatusBar(HWND hWnd, BOOL bResize)
178 RECT rc;
179 int nParts;
180 GetClientRect(hWnd, &rc);
181 nParts = rc.right;
182 /* nParts = -1;*/
183 if (bResize)
184 SendMessage(hStatusBar, WM_SIZE, 0, 0);
185 SendMessage(hStatusBar, SB_SETPARTS, 1, (LPARAM)&nParts);
186 UpdateStatusBar();
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:
211 break;
212 case CDERR_FINDRESFAILURE:
213 break;
214 case CDERR_NOHINSTANCE:
215 break;
216 case CDERR_INITIALIZATION:
217 break;
218 case CDERR_NOHOOK:
219 break;
220 case CDERR_LOCKRESFAILURE:
221 break;
222 case CDERR_NOTEMPLATE:
223 break;
224 case CDERR_LOADRESFAILURE:
225 break;
226 case CDERR_STRUCTSIZE:
227 break;
228 case CDERR_LOADSTRFAILURE:
229 break;
230 case FNERR_BUFFERTOOSMALL:
231 break;
232 case CDERR_MEMALLOCFAILURE:
233 break;
234 case FNERR_INVALIDFILENAME:
235 break;
236 case CDERR_MEMLOCKFAILURE:
237 break;
238 case FNERR_SUBCLASSFAILURE:
239 break;
240 default:
241 break;
243 return TRUE;
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);
254 else
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;
261 OFNOTIFY *pOfNotify;
262 LPTSTR path;
264 switch (uiMsg) {
265 case WM_INITDIALOG:
266 pOpenFileName = (OPENFILENAME*)lParam;
267 break;
268 case WM_COMMAND:
269 if (LOWORD(wParam) == IDC_EXPORT_PATH && HIWORD(wParam) == EN_UPDATE)
270 CheckRadioButton(hdlg, IDC_EXPORT_ALL, IDC_EXPORT_SELECTED, IDC_EXPORT_SELECTED);
271 break;
272 case WM_NOTIFY:
273 pOfNotify = (OFNOTIFY*)lParam;
274 switch (pOfNotify->hdr.code)
276 case CDN_INITDONE:
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);
281 break;
282 case CDN_FILEOK:
283 ExportRegistryFile_StoreSelection(hdlg, pOpenFileName);
284 break;
286 break;
287 default:
288 break;
290 return 0L;
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 */
311 return TRUE;
314 static BOOL ImportRegistryFile(HWND hWnd)
316 OPENFILENAME ofn;
317 TCHAR title[128];
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);*/
325 return FALSE;
327 } else {
328 CheckCommDlgError(hWnd);
330 return TRUE;
334 static BOOL ExportRegistryFile(HWND hWnd)
336 OPENFILENAME ofn;
337 TCHAR ExportKeyPath[_MAX_PATH];
338 TCHAR title[128];
340 ExportKeyPath[0] = _T('\0');
341 InitOpenFileName(hWnd, &ofn);
342 LoadString(hInst, IDS_FILEDIALOG_EXPORT_TITLE, title, COUNT_OF(title));
343 ofn.lpstrTitle = title;
344 ofn.lCustData = 0;
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)) {
349 BOOL result;
350 result = export_registry_key(ofn.lpstrFile, (LPTSTR)ofn.lCustData);
351 if (!result) {
352 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
353 return FALSE;
355 } else {
356 CheckCommDlgError(hWnd);
358 return TRUE;
361 static BOOL PrintRegistryHive(HWND hWnd, LPCTSTR path)
363 #if 1
364 PRINTDLG pd;
366 ZeroMemory(&pd, sizeof(PRINTDLG));
367 pd.lStructSize = sizeof(PRINTDLG);
368 pd.hwndOwner = hWnd;
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;
372 pd.nCopies = 1;
373 pd.nFromPage = 0xFFFF;
374 pd.nToPage = 0xFFFF;
375 pd.nMinPage = 1;
376 pd.nMaxPage = 0xFFFF;
377 if (PrintDlg(&pd)) {
378 /* GDI calls to render output. */
379 DeleteDC(pd.hDC); /* Delete DC when done.*/
381 #else
382 HRESULT hResult;
383 PRINTDLGEX pd;
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. */
390 break;
391 case PD_RESULT_CANCEL:
392 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
393 break;
394 case PD_RESULT_PRINT:
395 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
396 break;
397 default:
398 break;
400 } else {
401 switch (hResult) {
402 case E_OUTOFMEMORY:
403 /*Insufficient memory. */
404 break;
405 case E_INVALIDARG:
406 /* One or more arguments are invalid. */
407 break;
408 case E_POINTER:
409 /*Invalid pointer. */
410 break;
411 case E_HANDLE:
412 /*Invalid handle. */
413 break;
414 case E_FAIL:
415 /*Unspecified error. */
416 break;
417 default:
418 break;
420 return FALSE;
422 #endif
423 return TRUE;
426 static BOOL CopyKeyName(HWND hWnd, LPCTSTR keyName)
428 BOOL result;
430 result = OpenClipboard(hWnd);
431 if (result) {
432 result = EmptyClipboard();
433 if (result) {
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);
441 } else {
442 /* error emptying clipboard*/
443 /* DWORD dwError = GetLastError(); */
446 if (!CloseClipboard()) {
447 /* error closing clipboard*/
448 /* DWORD dwError = GetLastError(); */
451 } else {
452 /* error opening clipboard*/
453 /* DWORD dwError = GetLastError(); */
456 return result;
459 static INT_PTR CALLBACK find_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
461 HWND hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_NAME);
463 switch(uMsg) {
464 case WM_INITDIALOG:
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);
472 return TRUE;
473 case WM_COMMAND:
474 switch(LOWORD(wParam)) {
475 case IDC_VALUE_NAME:
476 if (HIWORD(wParam) == EN_UPDATE) {
477 EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(hwndValue)>0);
478 return TRUE;
480 break;
481 case IDOK:
482 if (GetWindowTextLength(hwndValue)>0) {
483 int mask = 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;
488 searchMask = mask;
489 GetWindowText(hwndValue, searchString, 128);
490 EndDialog(hwndDlg, IDOK);
492 return TRUE;
493 case IDCANCEL:
494 EndDialog(hwndDlg, IDCANCEL);
495 return TRUE;
497 break;
499 return FALSE;
502 static INT_PTR CALLBACK addtofavorites_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
504 HWND hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_NAME);
506 switch(uMsg) {
507 case WM_INITDIALOG:
508 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
509 SendMessage(hwndValue, EM_SETLIMITTEXT, 127, 0);
510 return TRUE;
511 case WM_COMMAND:
512 switch(LOWORD(wParam)) {
513 case IDC_VALUE_NAME:
514 if (HIWORD(wParam) == EN_UPDATE) {
515 EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(hwndValue)>0);
516 return TRUE;
518 break;
519 case IDOK:
520 if (GetWindowTextLength(hwndValue)>0) {
521 GetWindowText(hwndValue, favoriteName, 128);
522 EndDialog(hwndDlg, IDOK);
524 return TRUE;
525 case IDCANCEL:
526 EndDialog(hwndDlg, IDCANCEL);
527 return TRUE;
529 break;
531 return FALSE;
534 static INT_PTR CALLBACK removefavorite_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
536 HWND hwndList = GetDlgItem(hwndDlg, IDC_NAME_LIST);
538 switch(uMsg) {
539 case WM_INITDIALOG: {
540 HKEY hKey;
541 int i = 0;
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];
546 BYTE valuebuf[4096];
547 DWORD ksize, vsize, type;
548 LONG error;
549 do {
550 ksize = KEY_MAX_LEN;
551 vsize = sizeof(valuebuf);
552 error = RegEnumValue(hKey, i, namebuf, &ksize, NULL, &type, valuebuf, &vsize);
553 if (error != ERROR_SUCCESS)
554 break;
555 if (type == REG_SZ) {
556 SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)namebuf);
558 i++;
559 } while(error == ERROR_SUCCESS);
560 RegCloseKey(hKey);
562 else
563 return FALSE;
564 EnableWindow(GetDlgItem(hwndDlg, IDOK), i != 0);
565 SendMessage(hwndList, LB_SETCURSEL, 0, 0);
566 return TRUE;
568 case WM_COMMAND:
569 switch(LOWORD(wParam)) {
570 case IDC_NAME_LIST:
571 if (HIWORD(wParam) == LBN_SELCHANGE) {
572 EnableWindow(GetDlgItem(hwndDlg, IDOK), lParam != -1);
573 return TRUE;
575 break;
576 case IDOK: {
577 int pos = SendMessage(hwndList, LB_GETCURSEL, 0, 0);
578 int len = SendMessage(hwndList, LB_GETTEXTLEN, pos, 0);
579 if (len>0) {
580 LPTSTR lpName = HeapAlloc(GetProcessHeap(), 0, sizeof(TCHAR)*(len+1));
581 SendMessage(hwndList, LB_GETTEXT, pos, (LPARAM)lpName);
582 if (len>127)
583 lpName[127] = '\0';
584 _tcscpy(favoriteName, lpName);
585 EndDialog(hwndDlg, IDOK);
586 HeapFree(GetProcessHeap(), 0, lpName);
588 return TRUE;
590 case IDCANCEL:
591 EndDialog(hwndDlg, IDCANCEL);
592 return TRUE;
594 break;
596 return FALSE;
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)
608 HKEY hKeyRoot = 0;
609 LPCTSTR keyPath;
610 LPCTSTR valueName;
611 TCHAR newKey[MAX_NEW_KEY_LEN];
612 DWORD valueType;
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) {
618 HKEY hKey;
619 if (RegOpenKeyEx(HKEY_CURRENT_USER, favoritesKey,
620 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
621 TCHAR namebuf[KEY_MAX_LEN];
622 BYTE valuebuf[4096];
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) );
629 RegCloseKey(hKey);
631 return TRUE;
633 switch (LOWORD(wParam)) {
634 case ID_REGISTRY_IMPORTREGISTRYFILE:
635 ImportRegistryFile(hWnd);
636 break;
637 case ID_REGISTRY_EXPORTREGISTRYFILE:
638 ExportRegistryFile(hWnd);
639 break;
640 case ID_REGISTRY_CONNECTNETWORKREGISTRY:
641 break;
642 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY:
643 break;
644 case ID_REGISTRY_PRINT:
645 PrintRegistryHive(hWnd, _T(""));
646 break;
647 case ID_EDIT_DELETE:
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);
658 break;
659 case ID_EDIT_MODIFY:
660 if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName))
661 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, valueName);
662 break;
663 case ID_EDIT_FIND:
664 case ID_EDIT_FINDNEXT:
666 HTREEITEM hItem;
667 if (LOWORD(wParam) == ID_EDIT_FIND &&
668 DialogBox(0, MAKEINTRESOURCE(IDD_FIND), hWnd, find_dlgproc) != IDOK)
669 break;
670 if (!*searchString)
671 break;
672 hItem = TreeView_GetSelection(g_pChildWnd->hTreeWnd);
673 if (hItem) {
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);
678 if (hItem) {
679 SendMessage( g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem );
680 InvalidateRect(g_pChildWnd->hTreeWnd, NULL, TRUE);
681 UpdateWindow(g_pChildWnd->hTreeWnd);
682 if (row != -1) {
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);
686 } else {
687 SetFocus(g_pChildWnd->hTreeWnd);
689 } else {
690 error(hWnd, IDS_NOTFOUND, searchString);
693 break;
695 case ID_EDIT_COPYKEYNAME:
697 LPTSTR fullPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
698 if (fullPath) {
699 CopyKeyName(hWnd, fullPath);
700 HeapFree(GetProcessHeap(), 0, fullPath);
702 break;
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);
709 break;
710 case ID_EDIT_NEW_STRINGVALUE:
711 valueType = REG_SZ;
712 goto create_value;
713 case ID_EDIT_NEW_MULTI_STRINGVALUE:
714 valueType = REG_MULTI_SZ;
715 goto create_value;
716 case ID_EDIT_NEW_BINARYVALUE:
717 valueType = REG_BINARY;
718 goto create_value;
719 case ID_EDIT_NEW_DWORDVALUE:
720 valueType = REG_DWORD;
721 /* fall through */
722 create_value:
723 if (CreateValue(hWnd, hKeyRoot, keyPath, valueType, newKey)) {
724 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, newKey);
725 StartValueRename(g_pChildWnd->hListWnd);
726 /* FIXME: start rename */
728 break;
729 case ID_EDIT_RENAME:
730 if (keyPath == 0 || *keyPath == 0) {
731 MessageBeep(MB_ICONHAND);
732 } else if (GetFocus() == g_pChildWnd->hTreeWnd) {
733 StartKeyRename(g_pChildWnd->hTreeWnd);
734 } else if (GetFocus() == g_pChildWnd->hListWnd) {
735 StartValueRename(g_pChildWnd->hListWnd);
737 break;
738 case ID_REGISTRY_PRINTERSETUP:
739 /*PRINTDLG pd;*/
740 /*PrintDlg(&pd);*/
741 /*PAGESETUPDLG psd;*/
742 /*PageSetupDlg(&psd);*/
743 break;
744 case ID_REGISTRY_OPENLOCAL:
745 break;
746 case ID_REGISTRY_EXIT:
747 DestroyWindow(hWnd);
748 break;
749 case ID_FAVORITES_ADDTOFAVORITES:
751 HKEY hKey;
752 LPTSTR lpKeyPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
753 if (lpKeyPath) {
754 if (DialogBox(0, MAKEINTRESOURCE(IDD_ADDFAVORITE), hWnd, addtofavorites_dlgproc) == IDOK) {
755 if (RegCreateKeyEx(HKEY_CURRENT_USER, favoritesKey,
756 0, NULL, 0,
757 KEY_READ|KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
758 RegSetValueEx(hKey, favoriteName, 0, REG_SZ, (BYTE *)lpKeyPath, (_tcslen(lpKeyPath)+1)*sizeof(TCHAR));
759 RegCloseKey(hKey);
762 HeapFree(GetProcessHeap(), 0, lpKeyPath);
764 break;
766 case ID_FAVORITES_REMOVEFAVORITE:
768 if (DialogBox(0, MAKEINTRESOURCE(IDD_DELFAVORITE), hWnd, removefavorite_dlgproc) == IDOK) {
769 HKEY hKey;
770 if (RegOpenKeyEx(HKEY_CURRENT_USER, favoritesKey,
771 0, KEY_READ|KEY_WRITE, &hKey) == ERROR_SUCCESS) {
772 RegDeleteValue(hKey, favoriteName);
773 RegCloseKey(hKey);
776 break;
778 case ID_VIEW_REFRESH:
779 RefreshTreeView(g_pChildWnd->hTreeWnd);
780 RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
781 break;
782 /*case ID_OPTIONS_TOOLBAR:*/
783 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
784 /* break;*/
785 case ID_VIEW_STATUSBAR:
786 toggle_child(hWnd, LOWORD(wParam), hStatusBar);
787 break;
788 case ID_HELP_HELPTOPICS:
789 WinHelp(hWnd, _T("regedit"), HELP_FINDER, 0);
790 break;
791 case ID_HELP_ABOUT:
792 ShowAboutBox(hWnd);
793 break;
794 case ID_VIEW_SPLIT: {
795 RECT rt;
796 POINT pt, pts;
797 GetClientRect(g_pChildWnd->hWnd, &rt);
798 pt.x = rt.left + g_pChildWnd->nSplitPos;
799 pt.y = (rt.bottom / 2);
800 pts = pt;
801 if(ClientToScreen(g_pChildWnd->hWnd, &pts)) {
802 SetCursorPos(pts.x, pts.y);
803 SetCursor(LoadCursor(0, IDC_SIZEWE));
804 SendMessage(g_pChildWnd->hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y));
806 return TRUE;
808 default:
809 return FALSE;
812 return TRUE;
815 /********************************************************************************
817 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
819 * PURPOSE: Processes messages for the main frame window.
821 * WM_COMMAND - process the application menu
822 * WM_DESTROY - post a quit message and return
826 LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
828 switch (message) {
829 case WM_CREATE:
830 CreateWindowEx(0, szChildClass, _T("regedit child window"), WS_CHILD | WS_VISIBLE,
831 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
832 hWnd, NULL, hInst, 0);
833 break;
834 case WM_COMMAND:
835 if (!_CmdWndProc(hWnd, message, wParam, lParam))
836 return DefWindowProc(hWnd, message, wParam, lParam);
837 break;
838 case WM_ACTIVATE:
839 if (LOWORD(hWnd))
840 SetFocus(g_pChildWnd->hWnd);
841 break;
842 case WM_SIZE:
843 resize_frame_client(hWnd);
844 break;
845 case WM_TIMER:
846 break;
847 case WM_ENTERMENULOOP:
848 OnEnterMenuLoop(hWnd);
849 break;
850 case WM_EXITMENULOOP:
851 OnExitMenuLoop(hWnd);
852 break;
853 case WM_INITMENUPOPUP:
854 if (!HIWORD(lParam))
855 OnInitMenuPopup(hWnd, (HMENU)wParam, LOWORD(lParam));
856 break;
857 case WM_MENUSELECT:
858 OnMenuSelect(hWnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam);
859 break;
860 case WM_DESTROY:
861 WinHelp(hWnd, _T("regedit"), HELP_QUIT, 0);
862 PostQuitMessage(0);
863 default:
864 return DefWindowProc(hWnd, message, wParam, lParam);
866 return 0;