windows-nt/Source/XPSP1/NT/shell/cpls/inetcpl/advanced.cpp
2020-09-26 16:20:57 +08:00

1191 lines
41 KiB
C++

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1996 **
//*********************************************************************
//
// ADVANCED.C - "Advanced" Property Sheet
//
// HISTORY:
//
// 6/22/96 t-gpease created
// 5/27/97 t-ashlm rewrote
//
#include "inetcplp.h"
#include <mluisupp.h>
//
// Private Calls and structures
//
TCHAR g_szUnderline[3][64];
// Reads a STRING and determines BOOL value: "yes" = TRUE | "no" = FALSE
BOOL RegGetBooleanString(HUSKEY huskey, LPTSTR RegValue, BOOL Value);
// Writes a STRING depending on the BOOL: TRUE = "yes" | FALSE = "no"
BOOL RegSetBooleanString(HUSKEY huskey, LPTSTR RegValue, BOOL Value);
// Reads a STRING of R,G,B values and returns a COLOREF.
COLORREF RegGetColorRefString( HUSKEY huskey, LPTSTR RegValue, COLORREF Value);
// Writes a STRING of R,G,B comma separated values.
COLORREF RegSetColorRefString( HUSKEY huskey, LPTSTR RegValue, COLORREF Value);
BOOL _AorW_GetFileNameFromBrowse(HWND hDlg,
LPWSTR pszFilename,
UINT cchFilename,
LPCWSTR pszWorkingDir,
LPCWSTR pszExt,
LPCWSTR pszFilter,
LPCWSTR pszTitle);
//
// Reg keys
//
#define REGSTR_PATH_ADVANCEDLIST REGSTR_PATH_IEXPLORER TEXT("\\AdvancedOptions")
typedef struct {
HWND hDlg; // handle of our dialog
HWND hwndTree; // handle to the treeview
IRegTreeOptions *pTO; // pointer to RegTreeOptions interface
BOOL fChanged;
BOOL fShowIEOnDesktop;
} ADVANCEDPAGE, *LPADVANCEDPAGE;
BOOL IsShowIEOnDesktopEnabled()
{
HKEY hk;
if (SUCCEEDED(SHRegGetCLSIDKey(CLSID_Internet, TEXT("ShellFolder"), TRUE, FALSE, &hk)))
{
DWORD dwValue = 0, cbSize = SIZEOF(dwValue);
SHGetValueW(hk, NULL, TEXT("Attributes"), NULL, (BYTE *)&dwValue, &cbSize);
RegCloseKey(hk);
return (dwValue & SFGAO_NONENUMERATED) != SFGAO_NONENUMERATED;;
}
return TRUE;
}
#define IE_DESKTOP_NAMESPACE_KEY TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\Namespace\\{FBF23B42-E3F0-101B-8488-00AA003E56F8}")
void ShowIEOnDesktop(BOOL fShow)
{
switch (GetUIVersion())
{
case 3:
// win95 shell
if (fShow)
{
TCHAR szTheInternet[MAX_PATH];
int cch = MLLoadString(IDS_THE_INTERNET, szTheInternet, ARRAYSIZE(szTheInternet));
SHSetValue(HKEY_LOCAL_MACHINE, IE_DESKTOP_NAMESPACE_KEY, NULL, REG_SZ,
szTheInternet, (cch + 1) * sizeof(TCHAR));
}
else
{
SHDeleteKey(HKEY_LOCAL_MACHINE, IE_DESKTOP_NAMESPACE_KEY);
}
break;
case 4:
// IE4 integrated shell
// doesnt have peruser, so we need to just
// delete it by marking it NONENUMERATED
{
HKEY hk;
if (SUCCEEDED(SHRegGetCLSIDKey(CLSID_Internet, TEXT("ShellFolder"), FALSE, FALSE, &hk)))
{
DWORD dwValue = 0, cbSize = SIZEOF(dwValue);
SHGetValue(hk, NULL, TEXT("Attributes"), NULL, (BYTE *)&dwValue, &cbSize);
dwValue = (dwValue & ~SFGAO_NONENUMERATED) | (fShow ? 0 : SFGAO_NONENUMERATED);
SHSetValueW(hk, NULL, TEXT("Attributes"), REG_DWORD, (BYTE *)&dwValue, SIZEOF(dwValue));
RegCloseKey(hk);
}
}
break;
default:
// do nothing since just changing the settings
// in the right place sets up the PER-USER
// stuff correctly
break;
}
}
// AdvancedDlgInit()
//
// Initializes Advanced property sheet
//
// History:
//
// 6/13/96 t-gpease created
// 5/27/96 t-ashlm rewrote
//
BOOL AdvancedDlgInit(HWND hDlg)
{
LPADVANCEDPAGE pAdv;
HTREEITEM htvi;
HRESULT hr;
pAdv = (LPADVANCEDPAGE)LocalAlloc(LPTR, sizeof(*pAdv));
if (!pAdv)
{
EndDialog(hDlg, 0);
return FALSE; // no memory?
}
TraceMsg(TF_GENERAL, "\nInitializing Advanced Tab\n");
pAdv->fShowIEOnDesktop = IsShowIEOnDesktopEnabled();
InitCommonControls();
// tell dialog where to get info
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pAdv);
// save dialog handle
pAdv->hDlg = hDlg;
pAdv->hwndTree = GetDlgItem( pAdv->hDlg, IDC_ADVANCEDTREE );
CoInitialize(0);
hr = CoCreateInstance(CLSID_CRegTreeOptions, NULL, CLSCTX_INPROC_SERVER,
IID_IRegTreeOptions, (LPVOID *)&(pAdv->pTO));
if (SUCCEEDED(hr))
{
#ifdef UNICODE // InitTree takes Ansi string
char szRegPath[REGSTR_MAX_VALUE_LENGTH];
SHTCharToAnsi(REGSTR_PATH_ADVANCEDLIST, szRegPath, ARRAYSIZE(szRegPath));
hr = pAdv->pTO->InitTree(pAdv->hwndTree, HKEY_LOCAL_MACHINE, szRegPath, NULL);
#else
hr = pAdv->pTO->InitTree(pAdv->hwndTree, HKEY_LOCAL_MACHINE, REGSTR_PATH_ADVANCEDLIST, NULL);
#endif
}
// find the first root and make sure that it is visible
htvi = TreeView_GetRoot( pAdv->hwndTree );
TreeView_EnsureVisible( pAdv->hwndTree, htvi );
if (g_restrict.fAdvanced)
{
EnableDlgItem(hDlg, IDC_RESTORE_DEFAULT, FALSE);
}
return SUCCEEDED(hr) ? TRUE : FALSE;
}
#define REGKEY_DECLINED_IOD TEXT("Software\\Microsoft\\Active Setup\\Declined Install On Demand IEv5.PP2")
#define REGKEY_DECLINED_COMPONENTS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Declined Components IE5.pp2")
//
// AdvancedDlgOnCommand
//
// Handles Advanced property sheet window commands
//
// History:
// 6/13/96 t-gpease created
// 5/27/97 t-ashlm rewrote
//
void AdvancedDlgOnCommand(LPADVANCEDPAGE pAdv, UINT id, UINT nCmd)
{
switch (id)
{
case IDC_RESTORE_DEFAULT:
if (nCmd == BN_CLICKED)
{
// forget all Install On Demands that the user requested we
// never ask again
// Warning : if you ever have subkeys - these will fail on NT
RegDeleteKey(HKEY_CURRENT_USER, REGKEY_DECLINED_IOD);
// forget all code downloads that user said No to
RegDeleteKey(HKEY_CURRENT_USER, REGKEY_DECLINED_COMPONENTS);
pAdv->pTO->WalkTree(WALK_TREE_RESTORE);
pAdv->fChanged = TRUE;
ENABLEAPPLY(pAdv->hDlg);
}
break;
}
}
//
// AdvancedDlgOnNotify()
//
// Handles Advanced property sheets WM_NOTIFY messages
//
// History:
//
// 6/13/96 t-gpease created
//
void AdvancedDlgOnNotify(LPADVANCEDPAGE pAdv, LPNMHDR psn)
{
SetWindowLongPtr( pAdv->hDlg, DWLP_MSGRESULT, (LONG_PTR)0); // handled
switch (psn->code) {
case TVN_KEYDOWN:
{
TV_KEYDOWN *pnm = (TV_KEYDOWN*)psn;
if (pnm->wVKey == VK_SPACE)
{
if (!g_restrict.fAdvanced)
{
pAdv->pTO->ToggleItem((HTREEITEM)SendMessage(pAdv->hwndTree, TVM_GETNEXTITEM, TVGN_CARET, NULL));
ENABLEAPPLY(pAdv->hDlg);
pAdv->fChanged = TRUE;
// Return TRUE so that the treeview swallows the space key. Otherwise
// it tries to search for an element starting with a space and beeps.
SetWindowLongPtr(pAdv->hDlg, DWLP_MSGRESULT, TRUE);
}
}
break;
}
case NM_CLICK:
case NM_DBLCLK:
{ // is this click in our tree?
if ( psn->idFrom == IDC_ADVANCEDTREE )
{ // yes...
TV_HITTESTINFO ht;
GetCursorPos( &ht.pt ); // get where we were hit
ScreenToClient( pAdv->hwndTree, &ht.pt ); // translate it to our window
// retrieve the item hit
if (!g_restrict.fAdvanced)
{
pAdv->pTO->ToggleItem(TreeView_HitTest( pAdv->hwndTree, &ht));
ENABLEAPPLY(pAdv->hDlg);
pAdv->fChanged = TRUE;
}
}
}
break;
case PSN_QUERYCANCEL:
case PSN_KILLACTIVE:
case PSN_RESET:
SetWindowLongPtr(pAdv->hDlg, DWLP_MSGRESULT, FALSE);
break;
case PSN_APPLY:
{
if (pAdv->fChanged)
{
pAdv->pTO->WalkTree( WALK_TREE_SAVE );
// Now see if the user changed the "Show Internet Explorer on the Desktop"
// setting.
if (pAdv->fShowIEOnDesktop != IsShowIEOnDesktopEnabled())
{
pAdv->fShowIEOnDesktop = !pAdv->fShowIEOnDesktop;
// They did, so now see if it's integrated shell or not.
ShowIEOnDesktop(pAdv->fShowIEOnDesktop);
// Now refresh the desktop
SHITEMID mkid = {0};
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST | SHCNF_FLUSHNOWAIT, &mkid, NULL);
}
InternetSetOption( NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
UpdateAllWindows();
pAdv->fChanged = FALSE;
}
}
break;
}
}
//
// AdvancedDlgProc
//
// SubDialogs:
// Temporary Internet Files (cache)
//
// History:
//
// 6/12/96 t-gpease created
// 5/27/97 t-ashlm rewrote
//
INT_PTR CALLBACK AdvancedDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LPADVANCEDPAGE pAdv;
if (uMsg == WM_INITDIALOG)
return AdvancedDlgInit(hDlg);
else
pAdv = (LPADVANCEDPAGE)GetWindowLongPtr(hDlg, DWLP_USER);
if (!pAdv)
return FALSE;
switch (uMsg)
{
case WM_NOTIFY:
AdvancedDlgOnNotify(pAdv, (LPNMHDR)lParam);
return TRUE;
break;
case WM_COMMAND:
AdvancedDlgOnCommand(pAdv, LOWORD(wParam), HIWORD(wParam));
return TRUE;
break;
case WM_HELP: // F1
{
LPHELPINFO lphelpinfo;
lphelpinfo = (LPHELPINFO)lParam;
if (lphelpinfo->iCtrlId != IDC_ADVANCEDTREE)
{
ResWinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE,
HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
}
else
{
HTREEITEM hItem;
//Is this help invoked throught F1 key
if (GetAsyncKeyState(VK_F1) < 0)
{
// Yes. WE need to give help for the currently selected item
hItem = TreeView_GetSelection(pAdv->hwndTree);
}
else
{
//No, We need to give help for the item at the cursor position
TV_HITTESTINFO ht;
ht.pt =((LPHELPINFO)lParam)->MousePos;
ScreenToClient(pAdv->hwndTree, &ht.pt); // Translate it to our window
hItem = TreeView_HitTest(pAdv->hwndTree, &ht);
}
if (FAILED(pAdv->pTO->ShowHelp(hItem, HELP_WM_HELP)))
{
ResWinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE,
HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
}
}
break;
}
case WM_CONTEXTMENU: // right mouse click
{
TV_HITTESTINFO ht;
GetCursorPos( &ht.pt ); // get where we were hit
ScreenToClient( pAdv->hwndTree, &ht.pt ); // translate it to our window
// retrieve the item hit
if (FAILED(pAdv->pTO->ShowHelp(TreeView_HitTest( pAdv->hwndTree, &ht),HELP_CONTEXTMENU)))
{
ResWinHelp( (HWND) wParam, IDS_HELPFILE,
HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
}
break;
}
case WM_DESTROY:
// destroying this deliberately flushes its update (see WM_DESTROY in the UpdateWndProc);
#ifndef UNIX
// Should only be destroyed in Process Detach.
if (g_hwndUpdate)
DestroyWindow(g_hwndUpdate);
#endif
// free the tree
if (pAdv->pTO)
{
pAdv->pTO->WalkTree( WALK_TREE_DELETE );
pAdv->pTO->Release();
pAdv->pTO=NULL;
}
// free local memory
ASSERT(pAdv);
LocalFree(pAdv);
// make sure we don't re-enter
SetWindowLongPtr( hDlg, DWLP_USER, (LONG)NULL );
CoUninitialize();
break;
} // switch
return FALSE; // not handled
} // AdvancedDlgProc
//////////////////////////////////////////////
//
// Buttons on bottom
//
////////////////////////////////////////////////////////////////////////////////////////////
typedef struct tagCOLORSINFO {
HWND hDlg;
BOOL fUseWindowsDefaults;
COLORREF colorWindowText;
COLORREF colorWindowBackground;
COLORREF colorLinkViewed;
COLORREF colorLinkNotViewed;
COLORREF colorLinkHover;
BOOL fUseHoverColor;
} COLORSINFO, *LPCOLORSINFO;
VOID Color_DrawButton(HWND hDlg, LPDRAWITEMSTRUCT lpdis, COLORREF the_color )
{
SIZE thin = { GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER) };
RECT rc = lpdis->rcItem;
HDC hdc = lpdis->hDC;
BOOL bFocus = ((lpdis->itemState & ODS_FOCUS) && !(lpdis->itemState & ODS_DISABLED));
if (!thin.cx) thin.cx = 1;
if (!thin.cy) thin.cy = 1;
FillRect(hdc, &rc, GetSysColorBrush(COLOR_3DFACE));
// Draw any caption
TCHAR szCaption[80];
int cxButton = 23*(rc.bottom - rc.top)/12;
if (GetWindowText(lpdis->hwndItem, szCaption, ARRAYSIZE(szCaption)))
{
COLORREF crText;
RECT rcText = rc;
rcText.right -= cxButton;
int nOldMode = SetBkMode(hdc, TRANSPARENT);
if (lpdis->itemState & ODS_DISABLED)
{
// Draw disabled text using the embossed look
crText = SetTextColor(hdc, GetSysColor(COLOR_BTNHIGHLIGHT));
RECT rcOffset = rcText;
OffsetRect(&rcOffset, 1, 1);
DrawText(hdc, szCaption, -1, &rcOffset, DT_VCENTER|DT_SINGLELINE);
SetTextColor(hdc, GetSysColor(COLOR_BTNSHADOW));
}
else
{
crText = SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
}
DrawText(hdc, szCaption, -1, &rcText, DT_VCENTER|DT_SINGLELINE);
SetTextColor(hdc, crText);
SetBkMode(hdc, nOldMode);
}
// Draw the button portion
rc.left = rc.right - cxButton;
if (lpdis->itemState & ODS_SELECTED)
{
DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
OffsetRect(&rc, 1, 1);
}
else
{
DrawEdge(hdc, &rc, EDGE_RAISED, BF_RECT | BF_ADJUST);
}
if (bFocus)
{
InflateRect(&rc, -thin.cx, -thin.cy);
DrawFocusRect(hdc, &rc);
InflateRect(&rc, thin.cx, thin.cy);
}
// color sample
if ( !(lpdis->itemState & ODS_DISABLED) )
{
HBRUSH hBrush;
InflateRect(&rc, -2 * thin.cx, -2 * thin.cy);
FrameRect(hdc, &rc, GetSysColorBrush(COLOR_BTNTEXT));
InflateRect(&rc, -thin.cx, -thin.cy);
hBrush = CreateSolidBrush( the_color );
FillRect(hdc, &rc, hBrush);
DeleteObject(hBrush);
}
}
COLORREF g_CustomColors[16] = { 0 };
// ChooseColorW is yet implemented in comdlg32.dll
BOOL UseColorPicker( HWND hWnd, COLORREF *the_color, int extra_flags )
{
// Make a local copy of the custom colors so they are not saved if the
// color picker dialog is cancelled
COLORREF customColors[16];
memcpy(customColors, g_CustomColors, sizeof(customColors));
CHOOSECOLORA cc;
cc.lStructSize = sizeof(cc);
cc.hwndOwner = hWnd;
cc.hInstance = NULL;
cc.rgbResult = (DWORD) *the_color;
cc.lpCustColors = customColors;
cc.Flags = CC_RGBINIT | extra_flags;
cc.lCustData = (DWORD) NULL;
cc.lpfnHook = NULL;
cc.lpTemplateName = NULL;
if (ChooseColorA(&cc))
{
*the_color = cc.rgbResult;
memcpy(g_CustomColors, customColors, sizeof(g_CustomColors));
InvalidateRect( hWnd, NULL, FALSE );
return TRUE;
}
TraceMsg(TF_GENERAL, "\nChooseColor() return 0\n");
return FALSE;
}
VOID AppearanceDimFields( HWND hDlg )
{
// reverse the function of the check.... if CHECKED turn off the color
// selectors.
BOOL setting = !IsDlgButtonChecked( hDlg, IDC_GENERAL_APPEARANCE_USE_CUSTOM_COLORS_CHECKBOX ) && !g_restrict.fColors;
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_COLOR_TEXT), setting);
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_COLOR_TEXT_LABEL), setting);
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_COLOR_BACKGROUND), setting);
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_COLOR_BACKGROUND_LABEL), setting);
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_COLOR_HOVER),
IsDlgButtonChecked(hDlg, IDC_GENERAL_APPEARANCE_USE_HOVER_COLOR_CHECKBOX) && !g_restrict.fLinks);
}
BOOL General_DrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam, LPCOLORSINFO pci)
{
switch (GET_WM_COMMAND_ID(wParam, lParam))
{
case IDC_GENERAL_APPEARANCE_COLOR_TEXT:
Color_DrawButton(hDlg, (LPDRAWITEMSTRUCT)lParam, pci->colorWindowText);
return TRUE;
case IDC_GENERAL_APPEARANCE_COLOR_BACKGROUND:
Color_DrawButton(hDlg, (LPDRAWITEMSTRUCT)lParam, pci->colorWindowBackground);
return TRUE;
case IDC_GENERAL_APPEARANCE_COLOR_LINKS:
Color_DrawButton(hDlg, (LPDRAWITEMSTRUCT)lParam, pci->colorLinkNotViewed);
return TRUE;
case IDC_GENERAL_APPEARANCE_COLOR_VISITED_LINKS:
Color_DrawButton(hDlg, (LPDRAWITEMSTRUCT)lParam, pci->colorLinkViewed);
return TRUE;
case IDC_GENERAL_APPEARANCE_COLOR_HOVER:
Color_DrawButton(hDlg, (LPDRAWITEMSTRUCT)lParam, pci->colorLinkHover);
return TRUE;
}
return FALSE;
}
INT_PTR CALLBACK ColorsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
LPCOLORSINFO pci = (LPCOLORSINFO) GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg)
{
case WM_INITDIALOG:
{
DWORD cb = sizeof(DWORD);
HUSKEY huskey;
pci = (LPCOLORSINFO)LocalAlloc(LPTR, sizeof(COLORSINFO));
if (!pci)
{
EndDialog(hDlg, IDCANCEL);
return FALSE;
}
// tell dialog where to get info
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pci);
// save the handle to the page
pci->hDlg = hDlg;
// set default values
pci->fUseWindowsDefaults = TRUE;
pci->colorWindowText = RGB(0,0,0);
pci->colorWindowBackground = RGB(192,192,192);
pci->colorLinkViewed = RGB(0, 128, 128);
pci->colorLinkNotViewed = RGB(0, 0, 255);
pci->colorLinkHover = RGB(255, 0, 0);
pci->fUseHoverColor = TRUE;
if (SHRegOpenUSKey(REGSTR_PATH_IEXPLORER,
KEY_READ|KEY_WRITE, // samDesired
NULL, // hUSKeyRelative
&huskey,
FALSE) == ERROR_SUCCESS)
{
HUSKEY huskeySub;
if (SHRegOpenUSKey(REGSTR_KEY_MAIN,
KEY_READ|KEY_WRITE,
huskey,
&huskeySub,
FALSE) == ERROR_SUCCESS)
{
pci->fUseWindowsDefaults = RegGetBooleanString(huskeySub,
REGSTR_VAL_USEDLGCOLORS, pci->fUseWindowsDefaults);
SHRegCloseUSKey(huskeySub);
}
if (SHRegOpenUSKey(REGSTR_KEY_IE_SETTINGS,
KEY_READ|KEY_WRITE,
huskey,
&huskeySub,
FALSE) == ERROR_SUCCESS)
{
pci->colorWindowText = RegGetColorRefString(huskeySub,
REGSTR_VAL_TEXTCOLOR, pci->colorWindowText);
pci->colorWindowBackground = RegGetColorRefString(huskeySub,
REGSTR_VAL_BACKGROUNDCOLOR, pci->colorWindowBackground);
pci->colorLinkViewed = RegGetColorRefString(huskeySub,
REGSTR_VAL_ANCHORCOLORVISITED, pci->colorLinkViewed);
pci->colorLinkNotViewed = RegGetColorRefString(huskeySub,
REGSTR_VAL_ANCHORCOLOR, pci->colorLinkNotViewed);
pci->colorLinkHover = RegGetColorRefString(huskeySub,
REGSTR_VAL_ANCHORCOLORHOVER, pci->colorLinkHover);
pci->fUseHoverColor = RegGetBooleanString(huskeySub,
REGSTR_VAL_USEHOVERCOLOR, pci->fUseHoverColor);
SHRegCloseUSKey(huskeySub);
}
SHRegCloseUSKey(huskey);
}
cb = sizeof(g_CustomColors);
SHRegGetUSValue(REGSTR_PATH_IE_SETTINGS, REGSTR_VAL_IE_CUSTOMCOLORS, NULL, (LPBYTE)&g_CustomColors,
&cb, FALSE, NULL, NULL);
//
// select appropriate dropdown item here for underline links
//
CheckDlgButton(hDlg, IDC_GENERAL_APPEARANCE_USE_CUSTOM_COLORS_CHECKBOX, pci->fUseWindowsDefaults);
CheckDlgButton(hDlg, IDC_GENERAL_APPEARANCE_USE_HOVER_COLOR_CHECKBOX, pci->fUseHoverColor);
AppearanceDimFields(hDlg);
if (g_restrict.fLinks)
{
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_COLOR_LINKS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_COLOR_VISITED_LINKS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_USE_HOVER_COLOR_CHECKBOX), FALSE);
}
if (g_restrict.fColors)
{
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_COLOR_TEXT), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_COLOR_BACKGROUND), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_GENERAL_APPEARANCE_USE_CUSTOM_COLORS_CHECKBOX), FALSE);
}
return TRUE;
}
case WM_DRAWITEM:
return General_DrawItem(hDlg, wParam, lParam, pci);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
{
HUSKEY huskey;
if (SHRegOpenUSKey(REGSTR_PATH_IEXPLORER,
KEY_WRITE, // samDesired
NULL, // hUSKeyRelative
&huskey,
FALSE) == ERROR_SUCCESS)
{
HUSKEY huskeySub;
if (SHRegOpenUSKey(REGSTR_KEY_MAIN,
KEY_WRITE,
huskey,
&huskeySub,
FALSE) == ERROR_SUCCESS)
{
pci->fUseWindowsDefaults = RegSetBooleanString(huskeySub,
REGSTR_VAL_USEDLGCOLORS, pci->fUseWindowsDefaults);
SHRegCloseUSKey(huskeySub);
}
if (SHRegOpenUSKey(REGSTR_KEY_IE_SETTINGS,
KEY_WRITE,
huskey,
&huskeySub,
FALSE) == ERROR_SUCCESS)
{
pci->colorWindowText = RegSetColorRefString(huskeySub,
REGSTR_VAL_TEXTCOLOR, pci->colorWindowText);
pci->colorWindowBackground = RegSetColorRefString(huskeySub,
REGSTR_VAL_BACKGROUNDCOLOR, pci->colorWindowBackground);
pci->colorLinkViewed = RegSetColorRefString(huskeySub,
REGSTR_VAL_ANCHORCOLORVISITED, pci->colorLinkViewed);
pci->colorLinkNotViewed = RegSetColorRefString(huskeySub,
REGSTR_VAL_ANCHORCOLOR, pci->colorLinkNotViewed);
pci->colorLinkHover = RegSetColorRefString(huskeySub,
REGSTR_VAL_ANCHORCOLORHOVER, pci->colorLinkHover);
pci->fUseHoverColor = RegSetBooleanString(huskeySub,
REGSTR_VAL_USEHOVERCOLOR, pci->fUseHoverColor);
SHRegCloseUSKey(huskeySub);
}
SHRegCloseUSKey(huskey);
}
// custom colors
SHRegSetUSValue(REGSTR_PATH_IE_SETTINGS, REGSTR_VAL_IE_CUSTOMCOLORS, REGSTR_VAL_IE_CUSTOMCOLORS_TYPE, (LPBYTE)&g_CustomColors,
sizeof(g_CustomColors), SHREGSET_FORCE_HKCU);
// refresh the browser
UpdateAllWindows();
EndDialog(hDlg, IDOK);
break;
}
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
break;
case IDC_GENERAL_APPEARANCE_USE_CUSTOM_COLORS_CHECKBOX:
if ( GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED )
{
pci->fUseWindowsDefaults =
IsDlgButtonChecked(hDlg, IDC_GENERAL_APPEARANCE_USE_CUSTOM_COLORS_CHECKBOX);
AppearanceDimFields(hDlg);
}
break;
case IDC_GENERAL_APPEARANCE_USE_HOVER_COLOR_CHECKBOX:
if ( GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED )
{
pci->fUseHoverColor =
IsDlgButtonChecked(hDlg, IDC_GENERAL_APPEARANCE_USE_HOVER_COLOR_CHECKBOX);
AppearanceDimFields(hDlg);
}
break;
case IDC_GENERAL_APPEARANCE_COLOR_TEXT:
if ( GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED )
{
UseColorPicker( hDlg, &pci->colorWindowText, CC_SOLIDCOLOR);
}
break;
case IDC_GENERAL_APPEARANCE_COLOR_BACKGROUND:
if ( GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED )
{
UseColorPicker( hDlg, &pci->colorWindowBackground, CC_SOLIDCOLOR);
}
break;
case IDC_GENERAL_APPEARANCE_COLOR_LINKS:
if ( GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED )
{
UseColorPicker( hDlg, &pci->colorLinkNotViewed, CC_SOLIDCOLOR);
}
break;
case IDC_GENERAL_APPEARANCE_COLOR_VISITED_LINKS:
if ( GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED )
{
UseColorPicker( hDlg, &pci->colorLinkViewed, CC_SOLIDCOLOR);
}
break;
case IDC_GENERAL_APPEARANCE_COLOR_HOVER:
if ( GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED )
{
UseColorPicker( hDlg, &pci->colorLinkHover, CC_SOLIDCOLOR);
}
break;
default:
return FALSE;
}
return TRUE;
break;
case WM_HELP: // F1
ResWinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE,
HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
break;
case WM_CONTEXTMENU: // right mouse click
ResWinHelp( (HWND) wParam, IDS_HELPFILE,
HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
break;
case WM_DESTROY:
ASSERT(pci);
if (pci)
{
LocalFree(pci);
}
break;
}
return FALSE;
}
typedef struct tagACCESSIBILITYINFO
{
HWND hDlg;
BOOL fMyColors;
BOOL fMyFontStyle;
BOOL fMyFontSize;
BOOL fMyStyleSheet;
TCHAR szStyleSheetPath[MAX_PATH];
} ACCESSIBILITYINFO, *LPACCESSIBILITYINFO;
INT_PTR CALLBACK AccessibilityDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
LPACCESSIBILITYINFO pai = (LPACCESSIBILITYINFO) GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg)
{
case WM_INITDIALOG:
{
HKEY hkey;
DWORD cb;
pai = (LPACCESSIBILITYINFO)LocalAlloc(LPTR, sizeof(ACCESSIBILITYINFO));
if (!pai)
{
EndDialog(hDlg, IDCANCEL);
return FALSE;
}
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pai);
pai->hDlg = hDlg;
if (RegCreateKeyEx(HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Internet Explorer\\Settings"),
0, NULL, 0,
KEY_READ,
NULL,
&hkey,
NULL) == ERROR_SUCCESS)
{
cb = sizeof(pai->fMyColors);
RegQueryValueEx(hkey, TEXT("Always Use My Colors"), NULL, NULL, (LPBYTE)&(pai->fMyColors), &cb);
cb = sizeof(pai->fMyFontStyle);
RegQueryValueEx(hkey, TEXT("Always Use My Font Face"), NULL, NULL, (LPBYTE)&(pai->fMyFontStyle),&cb);
cb = sizeof(pai->fMyFontSize);
RegQueryValueEx(hkey, TEXT("Always Use My Font Size"), NULL, NULL, (LPBYTE)&(pai->fMyFontSize),&cb);
RegCloseKey(hkey);
}
if (RegCreateKeyEx(HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Internet Explorer\\Styles"),
0, NULL, 0,
KEY_READ,
NULL,
&hkey,
NULL) == ERROR_SUCCESS)
{
cb = sizeof(pai->fMyStyleSheet);
RegQueryValueEx(hkey, TEXT("Use My Stylesheet"), NULL, NULL, (LPBYTE)&(pai->fMyStyleSheet),&cb);
cb = sizeof(pai->szStyleSheetPath);
RegQueryValueEx(hkey, TEXT("User Stylesheet"), NULL, NULL, (LPBYTE)&(pai->szStyleSheetPath), &cb);
RegCloseKey(hkey);
}
CheckDlgButton(hDlg, IDC_CHECK_COLOR, pai->fMyColors);
CheckDlgButton(hDlg, IDC_CHECK_FONT_STYLE, pai->fMyFontStyle);
CheckDlgButton(hDlg, IDC_CHECK_FONT_SIZE, pai->fMyFontSize);
CheckDlgButton(hDlg, IDC_CHECK_USE_MY_STYLESHEET, pai->fMyStyleSheet);
SetDlgItemText(hDlg, IDC_EDIT_STYLESHEET, pai->szStyleSheetPath);
SHAutoComplete(GetDlgItem(hDlg, IDC_EDIT_STYLESHEET), SHACF_DEFAULT);
if (!pai->fMyStyleSheet || g_restrict.fAccessibility)
{
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_STYLESHEET), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_STYLESHEET), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STYLESHEET_BROWSE), FALSE);
}
if (g_restrict.fAccessibility)
{
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_COLOR), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_FONT_STYLE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_FONT_SIZE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_USE_MY_STYLESHEET), FALSE);
}
break;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
{
HKEY hkey;
GetDlgItemText(hDlg, IDC_EDIT_STYLESHEET, pai->szStyleSheetPath, sizeof(pai->szStyleSheetPath));
if (!PathFileExists(pai->szStyleSheetPath) && IsDlgButtonChecked(hDlg, IDC_CHECK_USE_MY_STYLESHEET))
{
MLShellMessageBox(hDlg, MAKEINTRESOURCEW(IDS_FILENOTFOUND), NULL, MB_ICONHAND|MB_OK);
break;
}
if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Internet Explorer\\Settings"),0, KEY_WRITE, &hkey) == ERROR_SUCCESS)
{
DWORD cb;
cb = sizeof(pai->fMyColors);
pai->fMyColors = IsDlgButtonChecked(hDlg, IDC_CHECK_COLOR);
RegSetValueEx(hkey, TEXT("Always Use My Colors"), NULL, REG_DWORD, (LPBYTE)&(pai->fMyColors), cb);
cb = sizeof(pai->fMyFontStyle);
pai->fMyFontStyle = IsDlgButtonChecked(hDlg, IDC_CHECK_FONT_STYLE);
RegSetValueEx(hkey, TEXT("Always Use My Font Face"), NULL, REG_DWORD, (LPBYTE)&(pai->fMyFontStyle), cb);
cb = sizeof(pai->fMyFontSize);
pai->fMyFontSize = IsDlgButtonChecked(hDlg, IDC_CHECK_FONT_SIZE);
RegSetValueEx(hkey, TEXT("Always Use My Font Size"), NULL, REG_DWORD, (LPBYTE)&(pai->fMyFontSize),cb);
RegCloseKey(hkey);
}
if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Internet Explorer\\Styles"), 0, KEY_WRITE, &hkey) == ERROR_SUCCESS)
{
DWORD cb;
#ifndef UNIX
cb = sizeof(pai->szStyleSheetPath);
#else
// We don't know if this is exactly what we need to do, so we ifdef it.
cb = (_tcslen(pai->szStyleSheetPath) + 1) * sizeof(TCHAR);
#endif
RegSetValueEx(hkey, TEXT("User Stylesheet"), NULL, REG_SZ, (LPBYTE)&(pai->szStyleSheetPath),cb);
cb = sizeof(pai->fMyStyleSheet);
pai->fMyStyleSheet = IsDlgButtonChecked(hDlg, IDC_CHECK_USE_MY_STYLESHEET);
RegSetValueEx(hkey, TEXT("Use My Stylesheet"), NULL, REG_DWORD, (LPBYTE)&(pai->fMyStyleSheet),cb);
RegCloseKey(hkey);
}
UpdateAllWindows(); // refresh the browser
EndDialog(hDlg, IDOK);
break;
}
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
break;
case IDC_CHECK_USE_MY_STYLESHEET:
{
DWORD fChecked;
fChecked = IsDlgButtonChecked(hDlg, IDC_CHECK_USE_MY_STYLESHEET);
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_STYLESHEET), fChecked);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_STYLESHEET), fChecked);
EnableWindow(GetDlgItem(hDlg, IDC_STYLESHEET_BROWSE), fChecked);
EnableWindow(GetDlgItem(hDlg,IDOK), IsDlgButtonChecked(hDlg, IDC_CHECK_USE_MY_STYLESHEET) ? (GetWindowTextLength(GetDlgItem(hDlg, IDC_EDIT_STYLESHEET)) ? TRUE:FALSE) : TRUE);
break;
}
case IDC_EDIT_STYLESHEET:
switch(HIWORD(wParam))
{
case EN_CHANGE:
EnableWindow(GetDlgItem(hDlg,IDOK), IsDlgButtonChecked(hDlg, IDC_CHECK_USE_MY_STYLESHEET) ? (GetWindowTextLength(GetDlgItem(hDlg, IDC_EDIT_STYLESHEET)) ? TRUE:FALSE) : TRUE);
break;
}
break;
case IDC_STYLESHEET_BROWSE:
{
TCHAR szFilenameBrowse[MAX_PATH];
int ret;
TCHAR szExt[MAX_PATH];
TCHAR szFilter[MAX_PATH];
szFilenameBrowse[0] = 0;
// why is IDS_STYLESHEET_EXT in shdoclc.rc?
MLLoadString(IDS_STYLESHEET_EXT, szExt, ARRAYSIZE(szExt));
int cchFilter = MLLoadShellLangString(IDS_STYLESHEET_FILTER, szFilter, ARRAYSIZE(szFilter)-1);
// Make sure we have a double null termination on the filter
szFilter[cchFilter + 1] = 0;
ret = _AorW_GetFileNameFromBrowse(hDlg, szFilenameBrowse, ARRAYSIZE(szFilenameBrowse), NULL, szExt,
szFilter, NULL);
if (ret > 0)
{
SetDlgItemText(hDlg, IDC_EDIT_STYLESHEET, szFilenameBrowse);
}
break;
}
default:
return FALSE;
}
return TRUE;
break;
case WM_HELP: // F1
ResWinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE,
HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
break;
case WM_CONTEXTMENU: // right mouse click
ResWinHelp( (HWND) wParam, IDS_HELPFILE,
HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
break;
case WM_DESTROY:
ASSERT(pai);
if (pai)
{
LocalFree(pai);
}
break;
}
return FALSE;
}
#define TEMP_SMALL_BUF_SZ 256
inline BOOL IsNotResource(LPCWSTR pszItem)
{
return (HIWORD(pszItem) != 0);
}
BOOL WINAPI _AorW_GetFileNameFromBrowse
(
HWND hwnd,
LPWSTR pszFilePath, // IN OUT
UINT cchFilePath,
LPCWSTR pszWorkingDir, //IN OPTIONAL
LPCWSTR pszDefExt, //IN OPTIONAL
LPCWSTR pszFilters, //IN OPTIONAL
LPCWSTR pszTitle //IN OPTIONAL
)
{
BOOL bResult;
#ifndef UNIX
// Determine which version of NT or Windows we're running on
OSVERSIONINFOA osvi;
osvi.dwOSVersionInfoSize = sizeof(osvi);
GetVersionExA(&osvi);
BOOL fRunningOnNT = (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId);
if (fRunningOnNT)
{
#endif
bResult = GetFileNameFromBrowse(hwnd,
pszFilePath,
cchFilePath,
pszWorkingDir,
pszDefExt,
pszFilters,
pszTitle);
#ifndef UNIX
}
else
{
// Thunk to ansi
CHAR szFilters[TEMP_SMALL_BUF_SZ*2];
CHAR szPath[MAX_PATH];
CHAR szDir[MAX_PATH];
CHAR szExt[TEMP_SMALL_BUF_SZ];
CHAR szTitle[TEMP_SMALL_BUF_SZ];
// Always move pszFilePath stuff to szPath buffer. Should never be a resourceid.
SHUnicodeToAnsi(pszFilePath, szPath, ARRAYSIZE(szPath));
if (IsNotResource(pszWorkingDir))
{
SHUnicodeToAnsi(pszWorkingDir, szDir, ARRAYSIZE(szDir));
pszWorkingDir = (LPCWSTR)szDir;
}
if (IsNotResource(pszDefExt))
{
SHUnicodeToAnsi(pszDefExt, szExt, ARRAYSIZE(szExt));
pszDefExt = (LPCWSTR)szExt;
}
if (IsNotResource(pszFilters))
{
int nIndex = 1;
// Find the double terminator
while (pszFilters[nIndex] || pszFilters[nIndex-1])
nIndex++;
// nIndex+1 looks like bunk unless it goes past the terminator
WideCharToMultiByte(CP_ACP, 0, (LPCTSTR)pszFilters, nIndex+1, szFilters, ARRAYSIZE(szFilters), NULL, NULL);
pszFilters = (LPCWSTR)szFilters;
}
if (IsNotResource(pszTitle))
{
SHUnicodeToAnsi(pszTitle, szTitle, ARRAYSIZE(szTitle));
pszTitle = (LPCWSTR)szTitle;
}
bResult = GetFileNameFromBrowse(hwnd, (LPWSTR)szPath, ARRAYSIZE(szPath), pszWorkingDir, pszDefExt, pszFilters, pszTitle);
SHAnsiToUnicode(szPath, pszFilePath, cchFilePath);
}
#endif
return bResult;
}