windows-nt/Source/XPSP1/NT/base/fs/utils/regedit/regcdhk.c
2020-09-26 16:20:57 +08:00

419 lines
11 KiB
C

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORP., 1993-1994
*
* TITLE: REGCDHK.C
*
* VERSION: 4.0
*
* AUTHOR: Tracy Sharpe
*
* DATE: 21 Nov 1993
*
* Common dialog box hook functions for the Registry Editor.
*
*******************************************************************************/
#include "pch.h"
#include "regedit.h"
#include "regkey.h"
#include "regcdhk.h"
#include "regresid.h"
#include "reghelp.h"
// Buffer to store the starting path for a registry export or print operation.
TCHAR g_SelectedPath[SIZE_SELECTED_PATH];
// TRUE if registry operation should be applied to the entire registry or to
// only start at g_SelectedPath.
BOOL g_fRangeAll;
// Contains the resource identifier for the dialog that is currently being
// used. Assumes that there is only one instance of a hook dialog at a time.
UINT g_RegCommDlgDialogTemplate;
const DWORD s_RegCommDlgExportHelpIDs[] = {
stc32, NO_HELP,
IDC_EXPORTRANGE, IDH_REGEDIT_EXPORT,
IDC_RANGEALL, IDH_REGEDIT_EXPORT,
IDC_RANGESELECTEDPATH, IDH_REGEDIT_EXPORT,
IDC_SELECTEDPATH, IDH_REGEDIT_EXPORT,
0, 0
};
const DWORD s_RegCommDlgPrintHelpIDs[] = {
IDC_EXPORTRANGE, IDH_REGEDIT_PRINTRANGE,
IDC_RANGEALL, IDH_REGEDIT_PRINTRANGE,
IDC_RANGESELECTEDPATH, IDH_REGEDIT_PRINTRANGE,
IDC_SELECTEDPATH, IDH_REGEDIT_PRINTRANGE,
0, 0
};
BOOL
PASCAL
RegCommDlg_OnInitDialog(
HWND hWnd,
HWND hFocusWnd,
LPARAM lParam
);
LRESULT
PASCAL
RegCommDlg_OnNotify(
HWND hWnd,
int DlgItem,
LPNMHDR lpNMHdr
);
UINT_PTR
PASCAL
RegCommDlg_OnCommand(
HWND hWnd,
int DlgItem,
UINT NotificationCode
);
BOOL
PASCAL
RegCommDlg_ValidateSelectedPath(
HWND hWnd,
BOOL fIsFileDialog
);
/*******************************************************************************
*
* RegCommDlgHookProc
*
* DESCRIPTION:
* Callback procedure for the RegCommDlg common dialog box.
*
* PARAMETERS:
* hWnd, handle of RegCommDlg window.
* Message,
* wParam,
* lParam,
* (returns),
*
*******************************************************************************/
UINT_PTR
CALLBACK
RegCommDlgHookProc(
HWND hWnd,
UINT Message,
WPARAM wParam,
LPARAM lParam
)
{
int DlgItem;
const DWORD FAR* lpHelpIDs;
switch (Message) {
HANDLE_MSG(hWnd, WM_INITDIALOG, RegCommDlg_OnInitDialog);
case WM_NOTIFY:
SetDlgMsgResult(hWnd, WM_NOTIFY, HANDLE_WM_NOTIFY(hWnd, wParam,
lParam, RegCommDlg_OnNotify));
return TRUE;
case WM_COMMAND:
return RegCommDlg_OnCommand(hWnd, GET_WM_COMMAND_ID(wParam, lParam),
GET_WM_COMMAND_CMD(wParam, lParam));
case WM_HELP:
//
// We only want to intercept help messages for controls that we are
// responsible for.
//
DlgItem = GetDlgCtrlID(((LPHELPINFO) lParam)-> hItemHandle);
if (DlgItem < IDC_FIRSTREGCOMMDLGID || DlgItem >
IDC_LASTREGCOMMDLGID)
break;
lpHelpIDs = (g_RegCommDlgDialogTemplate == IDD_REGEXPORT) ?
s_RegCommDlgExportHelpIDs : s_RegCommDlgPrintHelpIDs;
WinHelp(((LPHELPINFO) lParam)-> hItemHandle, g_pHelpFileName,
HELP_WM_HELP, (ULONG_PTR) lpHelpIDs);
return TRUE;
case WM_CONTEXTMENU:
//
// We only want to intercept help messages for controls that we are
// responsible for.
//
DlgItem = GetDlgCtrlID((HWND) wParam);
if (g_RegCommDlgDialogTemplate == IDD_REGEXPORT)
lpHelpIDs = s_RegCommDlgExportHelpIDs;
else {
if (DlgItem < IDC_FIRSTREGCOMMDLGID || DlgItem >
IDC_LASTREGCOMMDLGID)
break;
lpHelpIDs = s_RegCommDlgPrintHelpIDs;
}
WinHelp((HWND) wParam, g_pHelpFileName, HELP_CONTEXTMENU,
(ULONG_PTR) lpHelpIDs);
return TRUE;
}
return FALSE;
}
/*******************************************************************************
*
* RegCommDlg_OnInitDialog
*
* DESCRIPTION:
* Initializes the RegCommDlg dialog box.
*
* PARAMETERS:
* hWnd, handle of RegCommDlg window.
* hFocusWnd, handle of control to receive the default keyboard focus.
* lParam, additional initialization data passed by dialog creation function.
* (returns), TRUE to set focus to hFocusWnd, else FALSE to prevent a
* keyboard focus from being set.
*
*******************************************************************************/
BOOL
PASCAL
RegCommDlg_OnInitDialog(
HWND hWnd,
HWND hFocusWnd,
LPARAM lParam
)
{
HWND hKeyTreeWnd;
HTREEITEM hSelectedTreeItem;
int DlgItem;
g_RegEditData.uExportFormat = FILE_TYPE_REGEDIT5;
hKeyTreeWnd = g_RegEditData.hKeyTreeWnd;
hSelectedTreeItem = TreeView_GetSelection(hKeyTreeWnd);
KeyTree_BuildKeyPath(hKeyTreeWnd, hSelectedTreeItem, g_SelectedPath,
BKP_TOSYMBOLICROOT);
SetDlgItemText(hWnd, IDC_SELECTEDPATH, g_SelectedPath);
DlgItem = (TreeView_GetParent(hKeyTreeWnd, hSelectedTreeItem) == NULL) ?
IDC_RANGEALL : IDC_RANGESELECTEDPATH;
CheckRadioButton(hWnd, IDC_RANGEALL, IDC_RANGESELECTEDPATH, DlgItem);
return TRUE;
UNREFERENCED_PARAMETER(hFocusWnd);
UNREFERENCED_PARAMETER(lParam);
}
/*******************************************************************************
*
* RegCommDlg_OnNotify
*
* DESCRIPTION:
*
* PARAMETERS:
* hWnd, handle of RegCommDlg window.
* DlgItem, identifier of control.
* lpNMHdr, control notification data.
*
*******************************************************************************/
LRESULT
PASCAL
RegCommDlg_OnNotify(
HWND hWnd,
int DlgItem,
LPNMHDR lpNMHdr
)
{
HWND hControlWnd;
RECT DialogRect;
RECT ControlRect;
int dxChange;
LPOFNOTIFY lpon;
switch (lpNMHdr-> code) {
case CDN_INITDONE:
GetWindowRect(hWnd, &DialogRect);
// Use window coordinates because it works for mirrored
// and non mirrored windows.
MapWindowPoints(NULL, hWnd, (LPPOINT)&DialogRect, 2);
hControlWnd = GetDlgItem(hWnd, IDC_EXPORTRANGE);
GetWindowRect(hControlWnd, &ControlRect);
MapWindowPoints(NULL, hWnd, (LPPOINT)&ControlRect, 2);
dxChange = DialogRect.right - ControlRect.right -
(ControlRect.left - DialogRect.left);
SetWindowPos(hControlWnd, NULL, 0, 0, ControlRect.right -
ControlRect.left + dxChange, ControlRect.bottom -
ControlRect.top, SWP_NOMOVE | SWP_NOZORDER);
hControlWnd = GetDlgItem(hWnd, IDC_SELECTEDPATH);
GetWindowRect(hControlWnd, &ControlRect);
MapWindowPoints(NULL, hWnd, (LPPOINT)&ControlRect, 2);
SetWindowPos(hControlWnd, NULL, 0, 0, ControlRect.right -
ControlRect.left + dxChange, ControlRect.bottom -
ControlRect.top, SWP_NOMOVE | SWP_NOZORDER);
break;
case CDN_TYPECHANGE:
// lpon->lpOFN->nFilterIndex corresponds to the format types in
// regdef.h
lpon = (LPOFNOTIFY) lpNMHdr;
g_RegEditData.uExportFormat = lpon->lpOFN->nFilterIndex;
break;
case CDN_FILEOK:
return ( RegCommDlg_ValidateSelectedPath(hWnd, TRUE) != FALSE );
}
return FALSE;
}
/*******************************************************************************
*
* RegCommDlg_OnCommand
*
* DESCRIPTION:
* Handles the selection of a menu item by the user, notification messages
* from a child control, or translated accelerated keystrokes for the
* RegPrint dialog box.
*
* PARAMETERS:
* hWnd, handle of RegCommDlg window.
* DlgItem, identifier of control.
* NotificationCode, notification code from control.
*
*******************************************************************************/
UINT_PTR
PASCAL
RegCommDlg_OnCommand(
HWND hWnd,
int DlgItem,
UINT NotificationCode
)
{
switch (DlgItem) {
case IDC_RANGESELECTEDPATH:
SetFocus(GetDlgItem(hWnd, IDC_SELECTEDPATH));
break;
case IDC_SELECTEDPATH:
switch (NotificationCode) {
case EN_SETFOCUS:
SendDlgItemMessage(hWnd, IDC_SELECTEDPATH, EM_SETSEL,
0, -1);
break;
case EN_CHANGE:
CheckRadioButton(hWnd, IDC_RANGEALL, IDC_RANGESELECTEDPATH,
IDC_RANGESELECTEDPATH);
break;
}
break;
case IDOK:
return ( RegCommDlg_ValidateSelectedPath(hWnd, FALSE) != FALSE );
}
return FALSE;
}
/*******************************************************************************
*
* RegCommDlg_ValidateSelectedPath
*
* DESCRIPTION:
*
* PARAMETERS:
* hWnd, handle of RegCommDlg window.
* (returns), TRUE if the registry selected path is invalid, else FALSE.
*
*******************************************************************************/
BOOL
PASCAL
RegCommDlg_ValidateSelectedPath(
HWND hWnd,
BOOL fIsFileDialog
)
{
HKEY hKey;
HWND hTitleWnd;
TCHAR Title[256];
if (!(g_fRangeAll = IsDlgButtonChecked(hWnd, IDC_RANGEALL))) {
GetDlgItemText(hWnd, IDC_SELECTEDPATH, g_SelectedPath,
sizeof(g_SelectedPath)/sizeof(TCHAR));
if (g_SelectedPath[0] == '\0')
g_fRangeAll = TRUE;
else
{
HTREEITEM hSelectedTreeItem = TreeView_GetSelection(g_RegEditData.hKeyTreeWnd);
if (EditRegistryKey(RegEdit_GetComputerItem(hSelectedTreeItem), &hKey, g_SelectedPath, ERK_OPEN) !=
ERROR_SUCCESS)
{
//
// Determine the "real" parent of this dialog and get the
// message box title from that window. Our HWND may really
// be a subdialog if we're a file dialog.
//
hTitleWnd = fIsFileDialog ? GetParent(hWnd) : hWnd;
GetWindowText(hTitleWnd, Title, sizeof(Title)/sizeof(TCHAR));
InternalMessageBox(g_hInstance, hTitleWnd,
MAKEINTRESOURCE(IDS_ERRINVALIDREGPATH), Title,
MB_ICONERROR | MB_OK);
return TRUE;
}
RegCloseKey(hKey);
}
}
return FALSE;
}