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 Street, Fifth Floor, Boston, MA 02110-1301 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
)
122 UNREFERENCED_PARAMETER(hWnd
);
124 /* Update the status bar pane sizes */
126 SendMessage(hStatusBar
, SB_SETPARTS
, 1, (LPARAM
)&nParts
);
128 SendMessage(hStatusBar
, SB_SETTEXT
, (WPARAM
)0, (LPARAM
)_T(""));
131 static void OnExitMenuLoop(HWND hWnd
)
134 /* Update the status bar pane sizes*/
135 SetupStatusBar(hWnd
, TRUE
);
139 static void OnMenuSelect(HWND hWnd
, UINT nItemID
, UINT nFlags
, HMENU hSysMenu
)
143 _tcscpy(str
, _T(""));
144 if (nFlags
& MF_POPUP
) {
145 if (hSysMenu
!= GetMenu(hWnd
)) {
146 if (nItemID
== 2) nItemID
= 5;
149 if (LoadString(hInst
, nItemID
, str
, 100)) {
150 /* load appropriate string*/
152 /* first newline terminates actual string*/
153 lpsz
= _tcschr(lpsz
, _T('\n'));
157 SendMessage(hStatusBar
, SB_SETTEXT
, 0, (LPARAM
)str
);
160 void SetupStatusBar(HWND hWnd
, BOOL bResize
)
164 GetClientRect(hWnd
, &rc
);
168 SendMessage(hStatusBar
, WM_SIZE
, 0, 0);
169 SendMessage(hStatusBar
, SB_SETPARTS
, 1, (LPARAM
)&nParts
);
172 void UpdateStatusBar(void)
175 ZeroMemory(&nmhdr
, sizeof(NMHDR
));
176 nmhdr
.code
= TVN_SELCHANGED
;
177 SendMessage(g_pChildWnd
->hWnd
, WM_NOTIFY
, (WPARAM
)TREE_WINDOW
, (LPARAM
)&nmhdr
);
180 static void toggle_child(HWND hWnd
, UINT cmd
, HWND hchild
)
182 BOOL vis
= IsWindowVisible(hchild
);
183 HMENU hMenuView
= GetSubMenu(hMenuFrame
, ID_VIEW_MENU
);
185 CheckMenuItem(hMenuView
, cmd
, vis
?MF_BYCOMMAND
:MF_BYCOMMAND
|MF_CHECKED
);
186 ShowWindow(hchild
, vis
?SW_HIDE
:SW_SHOW
);
187 resize_frame_client(hWnd
);
190 static BOOL
CheckCommDlgError(HWND hWnd
)
192 DWORD dwErrorCode
= CommDlgExtendedError();
193 UNREFERENCED_PARAMETER(hWnd
);
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 TCHAR FileNameBuffer
[_MAX_PATH
];
232 TCHAR FileTitleBuffer
[_MAX_PATH
];
238 } FILTERPAIR
, *PFILTERPAIR
;
241 BuildFilterStrings(TCHAR
*Filter
, PFILTERPAIR Pairs
, int PairCount
)
246 for(i
= 0; i
< PairCount
; i
++)
248 c
+= LoadString(hInst
, Pairs
[i
].DisplayID
, &Filter
[c
], 255 * sizeof(TCHAR
));
250 c
+= LoadString(hInst
, Pairs
[i
].FilterID
, &Filter
[c
], 255 * sizeof(TCHAR
));
256 static BOOL
InitOpenFileName(HWND hWnd
, OPENFILENAME
* pofn
)
258 FILTERPAIR FilterPairs
[3];
259 static TCHAR Filter
[1024];
261 memset(pofn
, 0, sizeof(OPENFILENAME
));
262 pofn
->lStructSize
= sizeof(OPENFILENAME
);
263 pofn
->hwndOwner
= hWnd
;
264 pofn
->hInstance
= hInst
;
266 /* create filter string */
267 FilterPairs
[0].DisplayID
= IDS_FLT_REGFILES
;
268 FilterPairs
[0].FilterID
= IDS_FLT_REGFILES_FLT
;
269 FilterPairs
[1].DisplayID
= IDS_FLT_REGEDIT4
;
270 FilterPairs
[1].FilterID
= IDS_FLT_REGEDIT4_FLT
;
271 FilterPairs
[2].DisplayID
= IDS_FLT_ALLFILES
;
272 FilterPairs
[2].FilterID
= IDS_FLT_ALLFILES_FLT
;
273 BuildFilterStrings(Filter
, FilterPairs
, sizeof(FilterPairs
) / sizeof(FILTERPAIR
));
275 pofn
->lpstrFilter
= Filter
;
276 pofn
->lpstrFile
= FileNameBuffer
;
277 pofn
->nMaxFile
= _MAX_PATH
;
278 pofn
->lpstrFileTitle
= FileTitleBuffer
;
279 pofn
->nMaxFileTitle
= _MAX_PATH
;
280 pofn
->Flags
= OFN_HIDEREADONLY
;
284 static BOOL
ImportRegistryFile(HWND hWnd
)
289 InitOpenFileName(hWnd
, &ofn
);
290 LoadString(hInst
, IDS_IMPORT_REG_FILE
, Caption
, sizeof(Caption
)/sizeof(TCHAR
));
291 ofn
.lpstrTitle
= Caption
;
292 /* ofn.lCustData = ;*/
293 if (GetOpenFileName(&ofn
)) {
294 /* FIXME - convert to ascii */
295 if (!import_registry_file(ofn
.lpstrFile
)) {
296 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
300 get_file_name(&s
, filename
, MAX_PATH
);
302 printf("No file name is specified\n%s", usage
);
306 while (filename
[0]) {
307 if (!import_registry_file(filename
)) {
309 printf("Can't open file \"%s\"\n", filename
);
313 get_file_name(&s
, filename
, MAX_PATH
);
318 CheckCommDlgError(hWnd
);
324 static UINT_PTR CALLBACK
ExportRegistryFile_OFNHookProc(HWND hdlg
, UINT uiMsg
, WPARAM wParam
, LPARAM lParam
)
327 HWND hwndExportBranch
;
328 HWND hwndExportBranchText
;
329 UINT_PTR iResult
= 0;
331 LPTSTR pszSelectedKey
;
332 OFNOTIFY
*pOfnNotify
;
334 UNREFERENCED_PARAMETER(wParam
);
338 pOfn
= (OPENFILENAME
*) lParam
;
339 pszSelectedKey
= (LPTSTR
) pOfn
->lCustData
;
341 hwndExportAll
= GetDlgItem(hdlg
, IDC_EXPORT_ALL
);
343 SendMessage(hwndExportAll
, BM_SETCHECK
, pszSelectedKey
? BST_UNCHECKED
: BST_CHECKED
, 0);
345 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
346 if (hwndExportBranch
)
347 SendMessage(hwndExportBranch
, BM_SETCHECK
, pszSelectedKey
? BST_CHECKED
: BST_UNCHECKED
, 0);
349 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
350 if (hwndExportBranchText
)
351 SetWindowText(hwndExportBranchText
, pszSelectedKey
);
355 if (((NMHDR
*) lParam
)->code
== CDN_FILEOK
)
357 pOfnNotify
= (OFNOTIFY
*) lParam
;
358 pszSelectedKey
= (LPTSTR
) pOfnNotify
->lpOFN
->lCustData
;
360 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
361 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
362 if (hwndExportBranch
&& hwndExportBranchText
363 && (SendMessage(hwndExportBranch
, BM_GETCHECK
, 0, 0) == BST_CHECKED
))
365 GetWindowText(hwndExportBranchText
, pszSelectedKey
, _MAX_PATH
);
369 pszSelectedKey
[0] = '\0';
377 BOOL
ExportRegistryFile(HWND hWnd
)
380 TCHAR ExportKeyPath
[_MAX_PATH
];
385 /* Figure out which key path we are exporting */
386 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
387 RegKeyGetName(ExportKeyPath
, sizeof(ExportKeyPath
) / sizeof(ExportKeyPath
[0]),
388 hKeyRoot
, pszKeyPath
);
390 InitOpenFileName(hWnd
, &ofn
);
391 LoadString(hInst
, IDS_EXPORT_REG_FILE
, Caption
, sizeof(Caption
)/sizeof(TCHAR
));
392 ofn
.lpstrTitle
= Caption
;
394 /* Only set the path if a key (not the root node) is selected */
397 ofn
.lCustData
= (LPARAM
) ExportKeyPath
;
399 ofn
.Flags
= OFN_ENABLETEMPLATE
| OFN_EXPLORER
| OFN_ENABLEHOOK
;
400 ofn
.lpfnHook
= ExportRegistryFile_OFNHookProc
;
401 ofn
.lpTemplateName
= MAKEINTRESOURCE(IDD_EXPORTRANGE
);
402 if (GetSaveFileName(&ofn
)) {
404 LPSTR pszExportKeyPath
;
406 CHAR buffer
[_MAX_PATH
];
408 WideCharToMultiByte(CP_ACP
, 0, ExportKeyPath
, -1, buffer
, sizeof(buffer
), NULL
, NULL
);
409 pszExportKeyPath
= buffer
;
411 pszExportKeyPath
= ExportKeyPath
;
414 result
= export_registry_key(ofn
.lpstrFile
, pszExportKeyPath
);
416 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
420 TCHAR filename
[MAX_PATH
];
422 get_file_name(&s
, filename
, MAX_PATH
);
424 printf("No file name is specified\n%s", usage
);
429 TCHAR reg_key_name
[KEY_MAX_LEN
];
430 get_file_name(&s
, reg_key_name
, KEY_MAX_LEN
);
431 export_registry_key((CHAR
)filename
, reg_key_name
);
433 export_registry_key(filename
, NULL
);
438 CheckCommDlgError(hWnd
);
443 BOOL
PrintRegistryHive(HWND hWnd
, LPTSTR path
)
447 UNREFERENCED_PARAMETER(path
);
449 ZeroMemory(&pd
, sizeof(PRINTDLG
));
450 pd
.lStructSize
= sizeof(PRINTDLG
);
452 pd
.hDevMode
= NULL
; /* Don't forget to free or store hDevMode*/
453 pd
.hDevNames
= NULL
; /* Don't forget to free or store hDevNames*/
454 pd
.Flags
= PD_USEDEVMODECOPIESANDCOLLATE
| PD_RETURNDC
;
456 pd
.nFromPage
= 0xFFFF;
459 pd
.nMaxPage
= 0xFFFF;
461 /* GDI calls to render output. */
462 DeleteDC(pd
.hDC
); /* Delete DC when done.*/
468 hResult
= PrintDlgEx(&pd
);
469 if (hResult
== S_OK
) {
470 switch (pd
.dwResultAction
) {
471 case PD_RESULT_APPLY
:
472 /*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. */
474 case PD_RESULT_CANCEL
:
475 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
477 case PD_RESULT_PRINT
:
478 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
486 /*Insufficient memory. */
489 /* One or more arguments are invalid. */
492 /*Invalid pointer. */
498 /*Unspecified error. */
509 static void ChooseFavorite(LPCTSTR pszFavorite
)
512 TCHAR szFavoritePath
[512];
513 DWORD cbData
, dwType
;
515 if (RegOpenKeyEx(HKEY_CURRENT_USER
, s_szFavoritesRegKey
, 0, KEY_QUERY_VALUE
, &hKey
) != ERROR_SUCCESS
)
518 cbData
= (sizeof(szFavoritePath
) / sizeof(szFavoritePath
[0])) - 1;
519 memset(szFavoritePath
, 0, sizeof(szFavoritePath
));
520 if (RegQueryValueEx(hKey
, pszFavorite
, NULL
, &dwType
, (LPBYTE
) szFavoritePath
, &cbData
) != ERROR_SUCCESS
)
523 if (dwType
== REG_SZ
)
524 SelectNode(g_pChildWnd
->hTreeWnd
, szFavoritePath
);
531 BOOL
CopyKeyName(HWND hWnd
, HKEY hRootKey
, LPCTSTR keyName
)
533 BOOL bClipboardOpened
= FALSE
;
534 BOOL bSuccess
= FALSE
;
539 if (!OpenClipboard(hWnd
))
541 bClipboardOpened
= TRUE
;
543 if (!EmptyClipboard())
546 if (!RegKeyGetName(szBuffer
, sizeof(szBuffer
) / sizeof(szBuffer
[0]), hRootKey
, keyName
))
549 hGlobal
= GlobalAlloc(GMEM_MOVEABLE
, (_tcslen(szBuffer
) + 1) * sizeof(TCHAR
));
553 s
= GlobalLock(hGlobal
);
554 _tcscpy(s
, szBuffer
);
555 GlobalUnlock(hGlobal
);
558 SetClipboardData(CF_UNICODETEXT
, hGlobal
);
560 SetClipboardData(CF_TEXT
, hGlobal
);
565 if (bClipboardOpened
)
570 static BOOL
CreateNewValue(HKEY hRootKey
, LPCTSTR pszKeyPath
, DWORD dwType
)
572 TCHAR szNewValueFormat
[128];
573 TCHAR szNewValue
[128];
576 DWORD dwExistingType
, cbData
;
581 if (RegOpenKey(hRootKey
, pszKeyPath
, &hKey
) != ERROR_SUCCESS
)
584 LoadString(hInst
, IDS_NEW_VALUE
, szNewValueFormat
, sizeof(szNewValueFormat
)
585 / sizeof(szNewValueFormat
[0]));
589 _sntprintf(szNewValue
, sizeof(szNewValue
) / sizeof(szNewValue
[0]),
590 szNewValueFormat
, iIndex
++);
592 cbData
= sizeof(data
);
593 lResult
= RegQueryValueEx(hKey
, szNewValue
, NULL
, &dwExistingType
, data
, &cbData
);
595 while(lResult
== ERROR_SUCCESS
);
599 cbData
= sizeof(DWORD
);
603 cbData
= sizeof(TCHAR
);
606 cbData
= sizeof(TCHAR
) * 2;
609 cbData
= sizeof(DWORD
) * 2;
615 memset(data
, 0, cbData
);
616 lResult
= RegSetValueEx(hKey
, szNewValue
, 0, dwType
, data
, cbData
);
617 if (lResult
!= ERROR_SUCCESS
)
620 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
622 /* locate the newly added value, and get ready to rename it */
623 memset(&lvfi
, 0, sizeof(lvfi
));
624 lvfi
.flags
= LVFI_STRING
;
625 lvfi
.psz
= szNewValue
;
626 iIndex
= ListView_FindItem(g_pChildWnd
->hListWnd
, -1, &lvfi
);
628 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, iIndex
);
634 InitializeRemoteRegistryPicker(OUT IDsObjectPicker
**pDsObjectPicker
)
638 *pDsObjectPicker
= NULL
;
640 hRet
= CoCreateInstance(&CLSID_DsObjectPicker
,
642 CLSCTX_INPROC_SERVER
,
643 &IID_IDsObjectPicker
,
644 (LPVOID
*)pDsObjectPicker
);
647 DSOP_INIT_INFO InitInfo
;
648 static DSOP_SCOPE_INIT_INFO Scopes
[] =
651 sizeof(DSOP_SCOPE_INIT_INFO
),
652 DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE
| DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE
|
653 DSOP_SCOPE_TYPE_GLOBAL_CATALOG
| DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN
|
654 DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN
| DSOP_SCOPE_TYPE_WORKGROUP
|
655 DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN
| DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN
,
659 DSOP_FILTER_COMPUTERS
,
663 DSOP_DOWNLEVEL_FILTER_COMPUTERS
671 InitInfo
.cbSize
= sizeof(InitInfo
);
672 InitInfo
.pwzTargetComputer
= NULL
;
673 InitInfo
.cDsScopeInfos
= sizeof(Scopes
) / sizeof(Scopes
[0]);
674 InitInfo
.aDsScopeInfos
= Scopes
;
675 InitInfo
.flOptions
= 0;
676 InitInfo
.cAttributesToFetch
= 0;
677 InitInfo
.apwzAttributeNames
= NULL
;
679 hRet
= (*pDsObjectPicker
)->lpVtbl
->Initialize(*pDsObjectPicker
,
684 /* delete the object picker in case initialization failed! */
685 (*pDsObjectPicker
)->lpVtbl
->Release(*pDsObjectPicker
);
693 InvokeRemoteRegistryPickerDialog(IN IDsObjectPicker
*pDsObjectPicker
,
694 IN HWND hwndParent OPTIONAL
,
698 IDataObject
*pdo
= NULL
;
701 hRet
= pDsObjectPicker
->lpVtbl
->InvokeDialog(pDsObjectPicker
,
709 fe
.cfFormat
= (CLIPFORMAT
) RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST
);
711 fe
.dwAspect
= DVASPECT_CONTENT
;
713 fe
.tymed
= TYMED_HGLOBAL
;
715 hRet
= pdo
->lpVtbl
->GetData(pdo
,
720 PDS_SELECTION_LIST SelectionList
= (PDS_SELECTION_LIST
)GlobalLock(stm
.hGlobal
);
721 if (SelectionList
!= NULL
)
723 if (SelectionList
->cItems
== 1)
725 size_t nlen
= wcslen(SelectionList
->aDsSelection
[0].pwzName
);
732 SelectionList
->aDsSelection
[0].pwzName
,
733 nlen
* sizeof(WCHAR
));
735 WideCharToMultiByte(CP_ACP
,
737 SelectionList
->aDsSelection
[0].pwzName
,
744 lpBuffer
[nlen
] = L
'\0';
747 GlobalUnlock(stm
.hGlobal
);
750 ReleaseStgMedium(&stm
);
753 pdo
->lpVtbl
->Release(pdo
);
760 FreeObjectPicker(IN IDsObjectPicker
*pDsObjectPicker
)
762 pDsObjectPicker
->lpVtbl
->Release(pDsObjectPicker
);
765 /*******************************************************************************
767 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
769 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
772 static BOOL
_CmdWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
774 HKEY hKeyRoot
= 0, hKey
= 0;
778 REGSAM regsam
= KEY_READ
;
782 UNREFERENCED_PARAMETER(lParam
);
783 UNREFERENCED_PARAMETER(message
);
785 switch (LOWORD(wParam
)) {
786 case ID_REGISTRY_IMPORTREGISTRYFILE
:
787 ImportRegistryFile(hWnd
);
789 case ID_REGISTRY_EXPORTREGISTRYFILE
:
790 ExportRegistryFile(hWnd
);
792 case ID_REGISTRY_CONNECTNETWORKREGISTRY
:
794 IDsObjectPicker
*ObjectPicker
;
795 TCHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
798 hRet
= CoInitialize(NULL
);
801 hRet
= InitializeRemoteRegistryPicker(&ObjectPicker
);
804 hRet
= InvokeRemoteRegistryPickerDialog(ObjectPicker
,
807 sizeof(szComputerName
) / sizeof(szComputerName
[0]));
810 /* FIXME - connect to the registry */
813 FreeObjectPicker(ObjectPicker
);
821 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY
:
823 case ID_REGISTRY_PRINT
:
824 PrintRegistryHive(hWnd
, _T(""));
826 case ID_REGISTRY_EXIT
:
829 case ID_VIEW_STATUSBAR
:
830 toggle_child(hWnd
, LOWORD(wParam
), hStatusBar
);
832 case ID_HELP_HELPTOPICS
:
833 WinHelp(hWnd
, _T("regedit"), HELP_FINDER
, 0);
842 GetClientRect(g_pChildWnd
->hWnd
, &rt
);
843 pt
.x
= rt
.left
+ g_pChildWnd
->nSplitPos
;
844 pt
.y
= (rt
.bottom
/ 2);
846 if(ClientToScreen(g_pChildWnd
->hWnd
, &pts
))
848 SetCursorPos(pts
.x
, pts
.y
);
849 SetCursor(LoadCursor(0, IDC_SIZEWE
));
850 SendMessage(g_pChildWnd
->hWnd
, WM_LBUTTONDOWN
, 0, MAKELPARAM(pt
.x
, pt
.y
));
856 case ID_EDIT_MODIFY_BIN
:
862 keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
863 valueName
= GetValueName(g_pChildWnd
->hListWnd
, -1);
865 lRet
= RegOpenKeyEx(hKeyRoot
, keyPath
, 0, regsam
, &hKey
);
866 if (lRet
!= ERROR_SUCCESS
) hKey
= 0;
869 switch (LOWORD(wParam
)) {
871 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, FALSE
))
872 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
874 case ID_EDIT_MODIFY_BIN
:
875 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, TRUE
))
876 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
879 if (GetFocus() == g_pChildWnd
->hListWnd
)
881 if(ListView_GetSelectedCount(g_pChildWnd
->hListWnd
) == 1)
883 item
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_SELECTED
);
886 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, item
);
890 if (GetFocus() == g_pChildWnd
->hTreeWnd
)
892 /* Get focused entry of treeview (if any) */
893 HTREEITEM hItem
= TreeView_GetSelection(g_pChildWnd
->hTreeWnd
);
895 (void)TreeView_EditLabel(g_pChildWnd
->hTreeWnd
, hItem
);
900 if (GetFocus() == g_pChildWnd
->hListWnd
)
902 UINT nSelected
= ListView_GetSelectedCount(g_pChildWnd
->hListWnd
);
905 TCHAR msg
[128], caption
[128];
906 LoadString(hInst
, IDS_QUERY_DELETE_CONFIRM
, caption
, sizeof(caption
)/sizeof(TCHAR
));
907 LoadString(hInst
, (nSelected
== 1 ? IDS_QUERY_DELETE_ONE
: IDS_QUERY_DELETE_MORE
), msg
, sizeof(msg
)/sizeof(TCHAR
));
908 if(MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) == IDYES
)
914 while((ni
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, item
, LVNI_SELECTED
)) > -1)
916 valueName
= GetValueName(g_pChildWnd
->hListWnd
, item
);
917 if(RegDeleteValue(hKey
, valueName
) != ERROR_SUCCESS
)
924 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
927 LoadString(hInst
, IDS_ERR_DELVAL_CAPTION
, caption
, sizeof(caption
)/sizeof(TCHAR
));
928 LoadString(hInst
, IDS_ERR_DELETEVALUE
, msg
, sizeof(msg
)/sizeof(TCHAR
));
929 MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONSTOP
);
934 if (GetFocus() == g_pChildWnd
->hTreeWnd
)
936 if (keyPath
== 0 || *keyPath
== 0)
938 MessageBeep(MB_ICONHAND
);
940 if (DeleteKey(hWnd
, hKeyRoot
, keyPath
))
942 DeleteNode(g_pChildWnd
->hTreeWnd
, 0);
943 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
947 case ID_EDIT_NEW_STRINGVALUE
:
948 CreateNewValue(hKeyRoot
, keyPath
, REG_SZ
);
950 case ID_EDIT_NEW_BINARYVALUE
:
951 CreateNewValue(hKeyRoot
, keyPath
, REG_BINARY
);
953 case ID_EDIT_NEW_DWORDVALUE
:
954 CreateNewValue(hKeyRoot
, keyPath
, REG_DWORD
);
956 case ID_EDIT_NEW_MULTISTRINGVALUE
:
957 CreateNewValue(hKeyRoot
, keyPath
, REG_MULTI_SZ
);
959 case ID_EDIT_NEW_EXPANDABLESTRINGVALUE
:
960 CreateNewValue(hKeyRoot
, keyPath
, REG_EXPAND_SZ
);
967 case ID_EDIT_FINDNEXT
:
970 case ID_EDIT_COPYKEYNAME
:
971 CopyKeyName(hWnd
, hKeyRoot
, keyPath
);
973 case ID_EDIT_PERMISSIONS
:
974 RegKeyEditPermissions(hWnd
, hKeyRoot
, NULL
, keyPath
);
976 case ID_REGISTRY_PRINTERSETUP
:
979 /*PAGESETUPDLG psd;*/
980 /*PageSetupDlg(&psd);*/
982 case ID_REGISTRY_OPENLOCAL
:
985 case ID_VIEW_REFRESH
:
986 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
987 /*RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); */
989 /*case ID_OPTIONS_TOOLBAR:*/
990 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
992 case ID_EDIT_NEW_KEY
:
993 CreateNewKey(g_pChildWnd
->hTreeWnd
, TreeView_GetSelection(g_pChildWnd
->hTreeWnd
));
996 if ((LOWORD(wParam
) >= ID_FAVORITES_MIN
) && (LOWORD(wParam
) <= ID_FAVORITES_MAX
))
1000 TCHAR szFavorite
[512];
1002 hMenu
= GetSubMenu(GetMenu(hWnd
), FAVORITES_MENU_POSITION
);
1004 memset(&mii
, 0, sizeof(mii
));
1005 mii
.cbSize
= sizeof(mii
);
1006 mii
.fMask
= MIIM_TYPE
;
1007 mii
.fType
= MFT_STRING
;
1008 mii
.dwTypeData
= szFavorite
;
1009 mii
.cch
= sizeof(szFavorite
) / sizeof(szFavorite
[0]);
1011 if (GetMenuItemInfo(hMenu
, LOWORD(wParam
) - ID_FAVORITES_MIN
, TRUE
, &mii
))
1013 ChooseFavorite(szFavorite
);
1028 /********************************************************************************
1030 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
1032 * PURPOSE: Processes messages for the main frame window.
1034 * WM_COMMAND - process the application menu
1035 * WM_DESTROY - post a quit message and return
1039 LRESULT CALLBACK
FrameWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1043 CreateWindowEx(0, szChildClass
, NULL
, WS_CHILD
| WS_VISIBLE
,
1044 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
1045 hWnd
, (HMENU
)0, hInst
, 0);
1048 if (!_CmdWndProc(hWnd
, message
, wParam
, lParam
))
1049 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
1053 SetFocus(g_pChildWnd
->hWnd
);
1056 resize_frame_client(hWnd
);
1063 case WM_ENTERMENULOOP
:
1064 OnEnterMenuLoop(hWnd
);
1066 case WM_EXITMENULOOP
:
1067 OnExitMenuLoop(hWnd
);
1070 OnMenuSelect(hWnd
, LOWORD(wParam
), HIWORD(wParam
), (HMENU
)lParam
);
1073 WinHelp(hWnd
, _T("regedit"), HELP_QUIT
, 0);
1076 return DefWindowProc(hWnd
, message
, wParam
, lParam
);