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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 /********************************************************************************
24 * Global and Local Variables:
27 #define FAVORITES_MENU_POSITION 3
29 static TCHAR s_szFavoritesRegKey
[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\Favorites");
31 static BOOL bInMenuLoop
= FALSE
; /* Tells us if we are in the menu loop */
33 /*******************************************************************************
34 * Local module support methods
37 static void resize_frame_rect(HWND hWnd
, PRECT prect
)
41 if (IsWindowVisible(hToolBar)) {
42 SendMessage(hToolBar, WM_SIZE, 0, 0);
43 GetClientRect(hToolBar, &rt);
44 prect->top = rt.bottom+3;
45 prect->bottom -= rt.bottom+3;
48 if (IsWindowVisible(hStatusBar
)) {
49 SetupStatusBar(hWnd
, TRUE
);
50 GetClientRect(hStatusBar
, &rt
);
51 prect
->bottom
-= rt
.bottom
;
53 MoveWindow(g_pChildWnd
->hWnd
, prect
->left
, prect
->top
, prect
->right
, prect
->bottom
, TRUE
);
56 static void resize_frame_client(HWND hWnd
)
60 GetClientRect(hWnd
, &rect
);
61 resize_frame_rect(hWnd
, &rect
);
64 /********************************************************************************/
66 static void OnInitMenu(HWND hWnd
)
70 DWORD dwIndex
, cbValueName
, cbValueData
, dwType
;
71 TCHAR szValueName
[256];
72 BYTE abValueData
[256];
73 static int s_nFavoriteMenuSubPos
= -1;
75 BOOL bDisplayedAny
= FALSE
;
77 /* Find Favorites menu and clear it out */
78 hMenu
= GetSubMenu(GetMenu(hWnd
), FAVORITES_MENU_POSITION
);
81 if (s_nFavoriteMenuSubPos
< 0)
83 s_nFavoriteMenuSubPos
= GetMenuItemCount(hMenu
);
87 while(RemoveMenu(hMenu
, s_nFavoriteMenuSubPos
, MF_BYPOSITION
))
91 lResult
= RegOpenKey(HKEY_CURRENT_USER
, s_szFavoritesRegKey
, &hKey
);
92 if (lResult
!= ERROR_SUCCESS
)
98 cbValueName
= sizeof(szValueName
) / sizeof(szValueName
[0]);
99 cbValueData
= sizeof(abValueData
);
100 lResult
= RegEnumValue(hKey
, dwIndex
, szValueName
, &cbValueName
, NULL
, &dwType
, abValueData
, &cbValueData
);
101 if ((lResult
== ERROR_SUCCESS
) && (dwType
== REG_SZ
))
105 AppendMenu(hMenu
, MF_SEPARATOR
, 0, NULL
);
106 bDisplayedAny
= TRUE
;
108 AppendMenu(hMenu
, 0, ID_FAVORITES_MIN
+ GetMenuItemCount(hMenu
), szValueName
);
112 while(lResult
== ERROR_SUCCESS
);
119 static void OnEnterMenuLoop(HWND hWnd
)
123 /* Update the status bar pane sizes */
125 SendMessage(hStatusBar
, SB_SETPARTS
, 1, (LPARAM
)&nParts
);
127 SendMessage(hStatusBar
, SB_SETTEXT
, (WPARAM
)0, (LPARAM
)_T(""));
130 static void OnExitMenuLoop(HWND hWnd
)
133 /* Update the status bar pane sizes*/
134 SetupStatusBar(hWnd
, TRUE
);
138 static void OnMenuSelect(HWND hWnd
, UINT nItemID
, UINT nFlags
, HMENU hSysMenu
)
142 _tcscpy(str
, _T(""));
143 if (nFlags
& MF_POPUP
) {
144 if (hSysMenu
!= GetMenu(hWnd
)) {
145 if (nItemID
== 2) nItemID
= 5;
148 if (LoadString(hInst
, nItemID
, str
, 100)) {
149 /* load appropriate string*/
151 /* first newline terminates actual string*/
152 lpsz
= _tcschr(lpsz
, '\n');
156 SendMessage(hStatusBar
, SB_SETTEXT
, 0, (LPARAM
)str
);
159 void SetupStatusBar(HWND hWnd
, BOOL bResize
)
163 GetClientRect(hWnd
, &rc
);
167 SendMessage(hStatusBar
, WM_SIZE
, 0, 0);
168 SendMessage(hStatusBar
, SB_SETPARTS
, 1, (LPARAM
)&nParts
);
171 void UpdateStatusBar(void)
176 size
= sizeof(text
)/sizeof(TCHAR
);
177 GetComputerName(text
, &size
);
178 SendMessage(hStatusBar
, SB_SETTEXT
, 0, (LPARAM
)text
);
181 static void toggle_child(HWND hWnd
, UINT cmd
, HWND hchild
)
183 BOOL vis
= IsWindowVisible(hchild
);
184 HMENU hMenuView
= GetSubMenu(hMenuFrame
, ID_VIEW_MENU
);
186 CheckMenuItem(hMenuView
, cmd
, vis
?MF_BYCOMMAND
:MF_BYCOMMAND
|MF_CHECKED
);
187 ShowWindow(hchild
, vis
?SW_HIDE
:SW_SHOW
);
188 resize_frame_client(hWnd
);
191 static BOOL
CheckCommDlgError(HWND hWnd
)
193 DWORD dwErrorCode
= CommDlgExtendedError();
194 switch (dwErrorCode
) {
195 case CDERR_DIALOGFAILURE
:
197 case CDERR_FINDRESFAILURE
:
199 case CDERR_NOHINSTANCE
:
201 case CDERR_INITIALIZATION
:
205 case CDERR_LOCKRESFAILURE
:
207 case CDERR_NOTEMPLATE
:
209 case CDERR_LOADRESFAILURE
:
211 case CDERR_STRUCTSIZE
:
213 case CDERR_LOADSTRFAILURE
:
215 case FNERR_BUFFERTOOSMALL
:
217 case CDERR_MEMALLOCFAILURE
:
219 case FNERR_INVALIDFILENAME
:
221 case CDERR_MEMLOCKFAILURE
:
223 case FNERR_SUBCLASSFAILURE
:
231 #define MAX_CUSTOM_FILTER_SIZE 50
232 TCHAR CustomFilterBuffer
[MAX_CUSTOM_FILTER_SIZE
];
233 TCHAR FileNameBuffer
[_MAX_PATH
];
234 TCHAR FileTitleBuffer
[_MAX_PATH
];
240 } FILTERPAIR
, *PFILTERPAIR
;
243 BuildFilterStrings(TCHAR
*Filter
, PFILTERPAIR Pairs
, int PairCount
)
248 for(i
= 0; i
< PairCount
; i
++)
250 c
+= LoadString(hInst
, Pairs
[i
].DisplayID
, &Filter
[c
], 255 * sizeof(TCHAR
));
252 c
+= LoadString(hInst
, Pairs
[i
].FilterID
, &Filter
[c
], 255 * sizeof(TCHAR
));
258 static BOOL
InitOpenFileName(HWND hWnd
, OPENFILENAME
* pofn
)
260 FILTERPAIR FilterPairs
[3];
261 static TCHAR Filter
[1024];
263 memset(pofn
, 0, sizeof(OPENFILENAME
));
264 pofn
->lStructSize
= sizeof(OPENFILENAME
);
265 pofn
->hwndOwner
= hWnd
;
266 pofn
->hInstance
= hInst
;
268 /* create filter string */
269 FilterPairs
[0].DisplayID
= IDS_FLT_REGFILES
;
270 FilterPairs
[0].FilterID
= IDS_FLT_REGFILES_FLT
;
271 FilterPairs
[1].DisplayID
= IDS_FLT_REGEDIT4
;
272 FilterPairs
[1].FilterID
= IDS_FLT_REGEDIT4_FLT
;
273 FilterPairs
[2].DisplayID
= IDS_FLT_ALLFILES
;
274 FilterPairs
[2].FilterID
= IDS_FLT_ALLFILES_FLT
;
275 BuildFilterStrings(Filter
, FilterPairs
, sizeof(FilterPairs
) / sizeof(FILTERPAIR
));
277 pofn
->lpstrFilter
= Filter
;
278 pofn
->lpstrCustomFilter
= CustomFilterBuffer
;
279 pofn
->nMaxCustFilter
= MAX_CUSTOM_FILTER_SIZE
;
280 pofn
->nFilterIndex
= 0;
281 pofn
->lpstrFile
= FileNameBuffer
;
282 pofn
->nMaxFile
= _MAX_PATH
;
283 pofn
->lpstrFileTitle
= FileTitleBuffer
;
284 pofn
->nMaxFileTitle
= _MAX_PATH
;
285 /* pofn->lpstrInitialDir = _T("");*/
286 /* pofn->lpstrTitle = _T("Import Registry File");*/
287 /* pofn->Flags = OFN_ENABLETEMPLATE + OFN_EXPLORER + OFN_ENABLESIZING;*/
288 pofn
->Flags
= OFN_HIDEREADONLY
;
289 /* pofn->nFileOffset = ;*/
290 /* pofn->nFileExtension = ;*/
291 /* pofn->lpstrDefExt = _T("");*/
292 /* pofn->lCustData = ;*/
293 /* pofn->lpfnHook = ImportRegistryFile_OFNHookProc;*/
294 /* pofn->lpTemplateName = _T("ID_DLG_IMPORT_REGFILE");*/
295 /* pofn->lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);*/
296 /* pofn->FlagsEx = ;*/
300 static BOOL
ImportRegistryFile(HWND hWnd
)
305 InitOpenFileName(hWnd
, &ofn
);
306 LoadString(hInst
, IDS_IMPORT_REG_FILE
, Caption
, sizeof(Caption
)/sizeof(TCHAR
));
307 ofn
.lpstrTitle
= Caption
;
308 /* ofn.lCustData = ;*/
309 if (GetOpenFileName(&ofn
)) {
310 /* FIXME - convert to ascii */
311 if (!import_registry_file(ofn
.lpstrFile
)) {
312 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
316 get_file_name(&s
, filename
, MAX_PATH
);
318 printf("No file name is specified\n%s", usage
);
322 while (filename
[0]) {
323 if (!import_registry_file(filename
)) {
325 printf("Can't open file \"%s\"\n", filename
);
329 get_file_name(&s
, filename
, MAX_PATH
);
334 CheckCommDlgError(hWnd
);
340 static UINT_PTR CALLBACK
ExportRegistryFile_OFNHookProc(HWND hdlg
, UINT uiMsg
, WPARAM wParam
, LPARAM lParam
)
343 HWND hwndExportBranch
;
344 HWND hwndExportBranchText
;
345 UINT_PTR iResult
= 0;
347 LPTSTR pszSelectedKey
;
348 OFNOTIFY
*pOfnNotify
;
352 pOfn
= (OPENFILENAME
*) lParam
;
353 pszSelectedKey
= (LPTSTR
) pOfn
->lCustData
;
355 hwndExportAll
= GetDlgItem(hdlg
, IDC_EXPORT_ALL
);
357 SendMessage(hwndExportAll
, BM_SETCHECK
, pszSelectedKey
[0] ? BST_UNCHECKED
: BST_CHECKED
, 0);
359 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
360 if (hwndExportBranch
)
361 SendMessage(hwndExportBranch
, BM_SETCHECK
, pszSelectedKey
[0] ? BST_CHECKED
: BST_UNCHECKED
, 0);
363 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
364 if (hwndExportBranchText
)
365 SetWindowText(hwndExportBranchText
, pszSelectedKey
);
369 if (((NMHDR
*) lParam
)->code
== CDN_FILEOK
)
371 pOfnNotify
= (OFNOTIFY
*) lParam
;
372 pszSelectedKey
= (LPTSTR
) pOfnNotify
->lpOFN
->lCustData
;
374 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
375 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
376 if (hwndExportBranch
&& hwndExportBranchText
377 && (SendMessage(hwndExportBranch
, BM_GETCHECK
, 0, 0) == BST_CHECKED
))
379 GetWindowText(hwndExportBranchText
, pszSelectedKey
, _MAX_PATH
);
383 pszSelectedKey
[0] = '\0';
391 BOOL
ExportRegistryFile(HWND hWnd
)
394 TCHAR ExportKeyPath
[_MAX_PATH
];
399 /* Figure out which key path we are exporting */
400 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
401 RegKeyGetName(ExportKeyPath
, sizeof(ExportKeyPath
) / sizeof(ExportKeyPath
[0]),
402 hKeyRoot
, pszKeyPath
);
404 InitOpenFileName(hWnd
, &ofn
);
405 LoadString(hInst
, IDS_EXPORT_REG_FILE
, Caption
, sizeof(Caption
)/sizeof(TCHAR
));
406 ofn
.lpstrTitle
= Caption
;
407 ofn
.lCustData
= (LPARAM
) ExportKeyPath
;
408 ofn
.Flags
= OFN_ENABLETEMPLATE
| OFN_EXPLORER
| OFN_ENABLEHOOK
;
409 ofn
.lpfnHook
= ExportRegistryFile_OFNHookProc
;
410 ofn
.lpTemplateName
= MAKEINTRESOURCE(IDD_EXPORTRANGE
);
411 if (GetSaveFileName(&ofn
)) {
413 LPSTR pszExportKeyPath
;
415 CHAR buffer
[_MAX_PATH
];
417 WideCharToMultiByte(CP_ACP
, 0, ExportKeyPath
, -1, buffer
, sizeof(buffer
), NULL
, NULL
);
418 pszExportKeyPath
= buffer
;
420 pszExportKeyPath
= ExportKeyPath
;
423 result
= export_registry_key(ofn
.lpstrFile
, pszExportKeyPath
);
425 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
429 TCHAR filename
[MAX_PATH
];
431 get_file_name(&s
, filename
, MAX_PATH
);
433 printf("No file name is specified\n%s", usage
);
438 TCHAR reg_key_name
[KEY_MAX_LEN
];
439 get_file_name(&s
, reg_key_name
, KEY_MAX_LEN
);
440 export_registry_key((CHAR
)filename
, reg_key_name
);
442 export_registry_key(filename
, NULL
);
447 CheckCommDlgError(hWnd
);
452 BOOL
PrintRegistryHive(HWND hWnd
, LPTSTR path
)
457 ZeroMemory(&pd
, sizeof(PRINTDLG
));
458 pd
.lStructSize
= sizeof(PRINTDLG
);
460 pd
.hDevMode
= NULL
; /* Don't forget to free or store hDevMode*/
461 pd
.hDevNames
= NULL
; /* Don't forget to free or store hDevNames*/
462 pd
.Flags
= PD_USEDEVMODECOPIESANDCOLLATE
| PD_RETURNDC
;
464 pd
.nFromPage
= 0xFFFF;
467 pd
.nMaxPage
= 0xFFFF;
469 /* GDI calls to render output. */
470 DeleteDC(pd
.hDC
); /* Delete DC when done.*/
476 hResult
= PrintDlgEx(&pd
);
477 if (hResult
== S_OK
) {
478 switch (pd
.dwResultAction
) {
479 case PD_RESULT_APPLY
:
480 /*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. */
482 case PD_RESULT_CANCEL
:
483 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
485 case PD_RESULT_PRINT
:
486 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
494 /*Insufficient memory. */
497 /* One or more arguments are invalid. */
500 /*Invalid pointer. */
506 /*Unspecified error. */
517 static void ChooseFavorite(LPCTSTR pszFavorite
)
520 TCHAR szFavoritePath
[512];
521 DWORD cbData
, dwType
;
523 if (RegOpenKeyEx(HKEY_CURRENT_USER
, s_szFavoritesRegKey
, 0, KEY_QUERY_VALUE
, &hKey
) != ERROR_SUCCESS
)
526 cbData
= (sizeof(szFavoritePath
) / sizeof(szFavoritePath
[0])) - 1;
527 memset(szFavoritePath
, 0, sizeof(szFavoritePath
));
528 if (RegQueryValueEx(hKey
, pszFavorite
, NULL
, &dwType
, (LPBYTE
) szFavoritePath
, &cbData
) != ERROR_SUCCESS
)
531 if (dwType
== REG_SZ
)
532 SelectNode(g_pChildWnd
->hTreeWnd
, szFavoritePath
);
539 BOOL
CopyKeyName(HWND hWnd
, HKEY hRootKey
, LPCTSTR keyName
)
541 BOOL bClipboardOpened
= FALSE
;
542 BOOL bSuccess
= FALSE
;
547 if (!OpenClipboard(hWnd
))
549 bClipboardOpened
= TRUE
;
551 if (!EmptyClipboard())
554 if (!RegKeyGetName(szBuffer
, sizeof(szBuffer
) / sizeof(szBuffer
[0]), hRootKey
, keyName
))
557 hGlobal
= GlobalAlloc(GMEM_MOVEABLE
, (_tcslen(szBuffer
) + 1) * sizeof(TCHAR
));
561 s
= GlobalLock(hGlobal
);
562 _tcscpy(s
, szBuffer
);
563 GlobalUnlock(hGlobal
);
566 SetClipboardData(CF_UNICODETEXT
, hGlobal
);
568 SetClipboardData(CF_TEXT
, hGlobal
);
573 if (bClipboardOpened
)
578 static BOOL
CreateNewValue(HKEY hRootKey
, LPCTSTR pszKeyPath
, DWORD dwType
)
580 TCHAR szNewValueFormat
[128];
581 TCHAR szNewValue
[128];
584 DWORD dwExistingType
, cbData
;
589 if (RegOpenKey(hRootKey
, pszKeyPath
, &hKey
) != ERROR_SUCCESS
)
592 LoadString(hInst
, IDS_NEW_VALUE
, szNewValueFormat
, sizeof(szNewValueFormat
)
593 / sizeof(szNewValueFormat
[0]));
597 _sntprintf(szNewValue
, sizeof(szNewValue
) / sizeof(szNewValue
[0]),
598 szNewValueFormat
, iIndex
++);
600 cbData
= sizeof(data
);
601 lResult
= RegQueryValueEx(hKey
, szNewValue
, NULL
, &dwExistingType
, data
, &cbData
);
603 while(lResult
== ERROR_SUCCESS
);
607 cbData
= sizeof(DWORD
);
611 cbData
= sizeof(TCHAR
);
614 cbData
= sizeof(TCHAR
) * 2;
617 cbData
= sizeof(DWORD
) * 2;
623 memset(data
, 0, cbData
);
624 lResult
= RegSetValueEx(hKey
, szNewValue
, 0, dwType
, data
, cbData
);
625 if (lResult
!= ERROR_SUCCESS
)
628 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
630 /* locate the newly added value, and get ready to rename it */
631 memset(&lvfi
, 0, sizeof(lvfi
));
632 lvfi
.flags
= LVFI_STRING
;
633 lvfi
.psz
= szNewValue
;
634 iIndex
= ListView_FindItem(g_pChildWnd
->hListWnd
, -1, &lvfi
);
636 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, iIndex
);
642 InitializeRemoteRegistryPicker(OUT IDsObjectPicker
**pDsObjectPicker
)
646 *pDsObjectPicker
= NULL
;
648 hRet
= CoCreateInstance(&CLSID_DsObjectPicker
,
650 CLSCTX_INPROC_SERVER
,
651 &IID_IDsObjectPicker
,
652 (LPVOID
*)pDsObjectPicker
);
655 DSOP_INIT_INFO InitInfo
;
656 static DSOP_SCOPE_INIT_INFO Scopes
[] =
659 sizeof(DSOP_SCOPE_INIT_INFO
),
660 DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE
| DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE
|
661 DSOP_SCOPE_TYPE_GLOBAL_CATALOG
| DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN
|
662 DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN
| DSOP_SCOPE_TYPE_WORKGROUP
|
663 DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN
| DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN
,
667 DSOP_FILTER_COMPUTERS
,
671 DSOP_DOWNLEVEL_FILTER_COMPUTERS
679 InitInfo
.cbSize
= sizeof(InitInfo
);
680 InitInfo
.pwzTargetComputer
= NULL
;
681 InitInfo
.cDsScopeInfos
= sizeof(Scopes
) / sizeof(Scopes
[0]);
682 InitInfo
.aDsScopeInfos
= Scopes
;
683 InitInfo
.flOptions
= 0;
684 InitInfo
.cAttributesToFetch
= 0;
685 InitInfo
.apwzAttributeNames
= NULL
;
687 hRet
= (*pDsObjectPicker
)->lpVtbl
->Initialize(*pDsObjectPicker
,
692 /* delete the object picker in case initialization failed! */
693 (*pDsObjectPicker
)->lpVtbl
->Release(*pDsObjectPicker
);
701 InvokeRemoteRegistryPickerDialog(IN IDsObjectPicker
*pDsObjectPicker
,
702 IN HWND hwndParent OPTIONAL
,
706 IDataObject
*pdo
= NULL
;
709 hRet
= pDsObjectPicker
->lpVtbl
->InvokeDialog(pDsObjectPicker
,
717 fe
.cfFormat
= RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST
);
719 fe
.dwAspect
= DVASPECT_CONTENT
;
721 fe
.tymed
= TYMED_HGLOBAL
;
723 hRet
= pdo
->lpVtbl
->GetData(pdo
,
728 PDS_SELECTION_LIST SelectionList
= (PDS_SELECTION_LIST
)GlobalLock(stm
.hGlobal
);
729 if (SelectionList
!= NULL
)
731 if (SelectionList
->cItems
== 1)
733 UINT nlen
= wcslen(SelectionList
->aDsSelection
[0].pwzName
);
740 SelectionList
->aDsSelection
[0].pwzName
,
741 nlen
* sizeof(WCHAR
));
743 WideCharToMultiByte(CP_ACP
,
745 SelectionList
->aDsSelection
[0].pwzName
,
752 lpBuffer
[nlen
] = L
'\0';
755 GlobalUnlock(stm
.hGlobal
);
758 ReleaseStgMedium(&stm
);
761 pdo
->lpVtbl
->Release(pdo
);
768 FreeObjectPicker(IN IDsObjectPicker
*pDsObjectPicker
)
770 pDsObjectPicker
->lpVtbl
->Release(pDsObjectPicker
);
773 /*******************************************************************************
775 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
777 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
780 static BOOL
_CmdWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
782 HKEY hKeyRoot
= 0, hKey
= 0;
786 REGSAM regsam
= KEY_READ
;
790 switch (LOWORD(wParam
)) {
791 case ID_REGISTRY_IMPORTREGISTRYFILE
:
792 ImportRegistryFile(hWnd
);
794 case ID_REGISTRY_EXPORTREGISTRYFILE
:
795 ExportRegistryFile(hWnd
);
797 case ID_REGISTRY_CONNECTNETWORKREGISTRY
:
799 IDsObjectPicker
*ObjectPicker
;
800 TCHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
803 hRet
= CoInitialize(NULL
);
806 hRet
= InitializeRemoteRegistryPicker(&ObjectPicker
);
809 hRet
= InvokeRemoteRegistryPickerDialog(ObjectPicker
,
812 sizeof(szComputerName
) / sizeof(szComputerName
[0]));
815 /* FIXME - connect to the registry */
818 FreeObjectPicker(ObjectPicker
);
826 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY
:
828 case ID_REGISTRY_PRINT
:
829 PrintRegistryHive(hWnd
, _T(""));
831 case ID_REGISTRY_EXIT
:
834 case ID_VIEW_STATUSBAR
:
835 toggle_child(hWnd
, LOWORD(wParam
), hStatusBar
);
837 case ID_HELP_HELPTOPICS
:
838 WinHelp(hWnd
, _T("regedit"), HELP_FINDER
, 0);
847 GetClientRect(g_pChildWnd
->hWnd
, &rt
);
848 pt
.x
= rt
.left
+ g_pChildWnd
->nSplitPos
;
849 pt
.y
= (rt
.bottom
/ 2);
851 if(ClientToScreen(g_pChildWnd
->hWnd
, &pts
))
853 SetCursorPos(pts
.x
, pts
.y
);
854 SetCursor(LoadCursor(0, IDC_SIZEWE
));
855 SendMessage(g_pChildWnd
->hWnd
, WM_LBUTTONDOWN
, 0, MAKELPARAM(pt
.x
, pt
.y
));
861 case ID_EDIT_MODIFY_BIN
:
867 keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
868 valueName
= GetValueName(g_pChildWnd
->hListWnd
, -1);
870 lRet
= RegOpenKeyEx(hKeyRoot
, keyPath
, 0, regsam
, &hKey
);
871 if (lRet
!= ERROR_SUCCESS
) hKey
= 0;
874 switch (LOWORD(wParam
)) {
876 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, FALSE
))
877 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
879 case ID_EDIT_MODIFY_BIN
:
880 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, TRUE
))
881 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
884 if(ListView_GetSelectedCount(g_pChildWnd
->hListWnd
) == 1)
886 item
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_SELECTED
);
889 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, item
);
895 if (GetFocus() == g_pChildWnd
->hListWnd
)
897 UINT nSelected
= ListView_GetSelectedCount(g_pChildWnd
->hListWnd
);
900 TCHAR msg
[128], caption
[128];
901 LoadString(hInst
, IDS_QUERY_DELETE_CONFIRM
, caption
, sizeof(caption
)/sizeof(TCHAR
));
902 LoadString(hInst
, (nSelected
== 1 ? IDS_QUERY_DELETE_ONE
: IDS_QUERY_DELETE_MORE
), msg
, sizeof(msg
)/sizeof(TCHAR
));
903 if(MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) == IDYES
)
909 while((ni
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, item
, LVNI_SELECTED
)) > -1)
911 valueName
= GetValueName(g_pChildWnd
->hListWnd
, item
);
912 if(RegDeleteValue(hKey
, valueName
) != ERROR_SUCCESS
)
919 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
922 LoadString(hInst
, IDS_ERR_DELVAL_CAPTION
, caption
, sizeof(caption
)/sizeof(TCHAR
));
923 LoadString(hInst
, IDS_ERR_DELETEVALUE
, msg
, sizeof(msg
)/sizeof(TCHAR
));
924 MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONSTOP
);
929 if (GetFocus() == g_pChildWnd
->hTreeWnd
)
931 if (keyPath
== 0 || *keyPath
== 0)
933 MessageBeep(MB_ICONHAND
);
935 if (DeleteKey(hWnd
, hKeyRoot
, keyPath
))
936 DeleteNode(g_pChildWnd
->hTreeWnd
, 0);
939 case ID_EDIT_NEW_STRINGVALUE
:
940 CreateNewValue(hKeyRoot
, keyPath
, REG_SZ
);
942 case ID_EDIT_NEW_BINARYVALUE
:
943 CreateNewValue(hKeyRoot
, keyPath
, REG_BINARY
);
945 case ID_EDIT_NEW_DWORDVALUE
:
946 CreateNewValue(hKeyRoot
, keyPath
, REG_DWORD
);
948 case ID_EDIT_NEW_MULTISTRINGVALUE
:
949 CreateNewValue(hKeyRoot
, keyPath
, REG_MULTI_SZ
);
951 case ID_EDIT_NEW_EXPANDABLESTRINGVALUE
:
952 CreateNewValue(hKeyRoot
, keyPath
, REG_EXPAND_SZ
);
959 case ID_EDIT_FINDNEXT
:
962 case ID_EDIT_COPYKEYNAME
:
963 CopyKeyName(hWnd
, hKeyRoot
, keyPath
);
965 case ID_EDIT_PERMISSIONS
:
966 RegKeyEditPermissions(hWnd
, hKeyRoot
, NULL
, keyPath
);
968 case ID_REGISTRY_PRINTERSETUP
:
971 /*PAGESETUPDLG psd;*/
972 /*PageSetupDlg(&psd);*/
974 case ID_REGISTRY_OPENLOCAL
:
977 case ID_VIEW_REFRESH
:
978 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
979 /*RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); */
981 /*case ID_OPTIONS_TOOLBAR:*/
982 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
984 case ID_EDIT_NEW_KEY
:
985 CreateNewKey(g_pChildWnd
->hTreeWnd
, TreeView_GetSelection(g_pChildWnd
->hTreeWnd
));
988 if ((LOWORD(wParam
) >= ID_FAVORITES_MIN
) && (LOWORD(wParam
) <= ID_FAVORITES_MAX
))
992 TCHAR szFavorite
[512];
994 hMenu
= GetSubMenu(GetMenu(hWnd
), FAVORITES_MENU_POSITION
);
996 memset(&mii
, 0, sizeof(mii
));
997 mii
.cbSize
= sizeof(mii
);
998 mii
.fMask
= MIIM_TYPE
;
999 mii
.fType
= MFT_STRING
;
1000 mii
.dwTypeData
= szFavorite
;
1001 mii
.cch
= sizeof(szFavorite
) / sizeof(szFavorite
[0]);
1003 if (GetMenuItemInfo(hMenu
, LOWORD(wParam
) - ID_FAVORITES_MIN
, TRUE
, &mii
))
1005 ChooseFavorite(szFavorite
);
1020 /********************************************************************************
1022 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
1024 * PURPOSE: Processes messages for the main frame window.
1026 * WM_COMMAND - process the application menu
1027 * WM_DESTROY - post a quit message and return
1031 LRESULT CALLBACK
FrameWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1035 CreateWindowEx(0, szChildClass
, NULL
, WS_CHILD
| WS_VISIBLE
,
1036 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
1037 hWnd
, (HMENU
)0, hInst
, 0);
1040 if (!_CmdWndProc(hWnd
, message
, wParam
, lParam
))
1041 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
1045 SetFocus(g_pChildWnd
->hWnd
);
1048 resize_frame_client(hWnd
);
1055 case WM_ENTERMENULOOP
:
1056 OnEnterMenuLoop(hWnd
);
1058 case WM_EXITMENULOOP
:
1059 OnExitMenuLoop(hWnd
);
1062 OnMenuSelect(hWnd
, LOWORD(wParam
), HIWORD(wParam
), (HMENU
)lParam
);
1065 WinHelp(hWnd
, _T("regedit"), HELP_QUIT
, 0);
1068 return DefWindowProc(hWnd
, message
, wParam
, lParam
);