//********************************************************************* //* 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 // // 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; }