options.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 24k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include <trayp.h>
  3. #pragma hdrstop
  4. #define SZ_FOLDEROPTSTUBCLASS TEXT("MSGlobalFolderOptionsStub")
  5. void Cabinet_StateChanged(CABINETSTATE *pcs);
  6. void Cabinet_RefreshAll(void);
  7. BOOL UpdateDefFolderSettings(BOOL fWebView, BOOL fWebViewOld);
  8. //---------------------------------------------------------------------------
  9. const static DWORD aFolderOptsHelpIDs[] = {  // Context Help IDs
  10.     IDC_FCUS_SAME_WINDOW,        IDH_BROWSE_SAME_WINDOW,
  11.     IDC_FCUS_SEPARATE_WINDOWS,   IDH_BROWSE_SEPARATE_WINDOWS,
  12.     IDC_FCUS_WHENEVER_POSSIBLE,  IDH_SHOW_WEB_WHEN_POSSIBLE,
  13.     IDC_FCUS_WHEN_CHOOSE,        IDH_SHOW_WEB_WHEN_CHOOSE,
  14.     IDC_FCUS_SINGLECLICK,        IDH_SINGLE_CLICK_MODE,
  15.     IDC_FCUS_DOUBLECLICK,        IDH_DOUBLE_CLICK_MODE,
  16.     IDC_FCUS_ICON_IE,            IDH_TITLES_LIKE_LINKS,
  17.     IDC_FCUS_ICON_HOVER,         IDH_TITLES_WHEN_POINT,
  18.     IDC_FCUS_WEB,                IDH_ENABLE_WEB_CONTENT,
  19.     IDC_FCUS_CLASSIC,            IDH_USE_WINDOWS_CLASSIC,
  20.     IDC_FCUS_ICON_ACTIVEDESKTOP, IDH_ACTIVEDESKTOP_GEN,
  21.     IDC_FCUS_ICON_WEBVIEW,       IDH_WEB_VIEW_GEN,
  22.     IDC_FCUS_ICON_WINDOW,        IDH_BROWSE_FOLDERS_GEN,
  23.     IDC_FCUS_ICON_CLICKS,        IDH_ICON_OPEN_GEN,
  24.     IDC_FCUS_RESTORE_DEFAULTS,   IDH_RESTORE_DEFAULTS_GEN,
  25.     IDC_FCUS_WEBVIEW_GROUP_STATIC, -1,         // Suppress help for this item.
  26.     0, 0
  27. };
  28. typedef struct
  29. {
  30.     CABINETSTATE cs;      // Cached "current" CabState.
  31.     CFolderOptionsPsx *ppsx;    // to talk to our propsheet sibling
  32.     // The icons corresponding to the radio button selected are stored here.
  33.     HICON   ahIcon[IDC_FCUS_ICON_MAX - IDC_FCUS_WEB + 1];
  34. } FOLDEROPTDATA;
  35. //This functions gets/sets the current Active Desktop value
  36. // if 'set' is true then it takes the value in *pActDesk and sets the ActiveDesktop
  37. // accordingly (TRUE-Active Desktop is On, FALSE-Active Desktop is off)
  38. // if 'set' is false then it gets the ActiveDesktop state  and assigns that value to the
  39. // *pActDesk
  40. void GetSetActiveDesktop(BOOL *pActDesk, BOOL fset)
  41. {
  42.     IActiveDesktop* pad;
  43.     HRESULT hres;
  44.     //This restriction takes precedence over NOACTIVEDESKTOP.
  45.     if (SHRestricted(REST_FORCEACTIVEDESKTOPON))
  46.     {
  47.         *pActDesk = TRUE;
  48.         return;
  49.     }
  50.     else
  51.     {
  52.         if (SHRestricted(REST_NOACTIVEDESKTOP))
  53.         {
  54.             *pActDesk = FALSE;
  55.             return;
  56.         }
  57.     }
  58.     //Get a pointer to the IActiveDesktop interface
  59.     hres = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
  60.         IID_IActiveDesktop, (void**)&pad);
  61.     if(SUCCEEDED(hres))
  62.     {
  63.         COMPONENTSOPT co;
  64.         co.dwSize = sizeof(COMPONENTSOPT);
  65.         //Get the Current Options
  66.         pad->GetDesktopItemOptions(&co, NULL);
  67.         //Do we have to set new value ?
  68.         if (fset)
  69.         {
  70.             if (co.fActiveDesktop != *pActDesk)
  71.             {
  72.                 //Yes? Set the new value
  73.                 co.fActiveDesktop = *pActDesk;
  74.                 pad->SetDesktopItemOptions(&co, NULL);
  75.                 //Apply the change
  76.                 pad->ApplyChanges(AD_APPLY_REFRESH | AD_APPLY_DYNAMICREFRESH);
  77.             }
  78.         }
  79.         else
  80.         {
  81.               //No, Get the current state  and return
  82.             *pActDesk  = co.fActiveDesktop;
  83.         }
  84.         pad->Release();
  85.     }
  86. }
  87. // Reads CabinetState and Default Folder Settings
  88. void ReadStateAndSettings(HWND hDlg)
  89. {
  90.     FOLDEROPTDATA *pfod = (FOLDEROPTDATA *)GetWindowLongPtr(hDlg, DWLP_USER);
  91.     ASSERT(pfod);
  92.     pfod->ppsx->SetNeedRefresh(FALSE);
  93.     //Get the current Cabinet State
  94.     ReadCabinetState(&pfod->cs, SIZEOF(pfod->cs));
  95. }
  96. //
  97. // This function selects a given radio button among a set of radio buttons AND it sets the Icon
  98. // image corresponding to the radio button selected.
  99. void CheckRBtnAndSetIcon(HWND hDlg, int idStartBtn, int idEndBtn, int idSelectedBtn, FOLDEROPTDATA *pfod, BOOL fCheckBtn)
  100. {
  101.     //
  102.     //  Check the radio button if required
  103.     //
  104.     if(fCheckBtn)
  105.         CheckRadioButton(hDlg, idStartBtn, idEndBtn, idSelectedBtn);
  106.     //Now, select the Icon corresponding to this selection
  107.     // The following code assumes the order and sequence of the following IDs.
  108.     // So, we verify that no one has broken them inadvertently by doing the following
  109.     // compile time checks.
  110.     COMPILETIME_ASSERT((IDC_FCUS_WEB + 1)               == IDC_FCUS_CLASSIC);
  111.     COMPILETIME_ASSERT((IDC_FCUS_CLASSIC + 1)           == IDC_FCUS_WHENEVER_POSSIBLE);
  112.     COMPILETIME_ASSERT((IDC_FCUS_WHENEVER_POSSIBLE + 1) == IDC_FCUS_WHEN_CHOOSE);
  113.     COMPILETIME_ASSERT((IDC_FCUS_WHEN_CHOOSE + 1)       == IDC_FCUS_SAME_WINDOW);
  114.     COMPILETIME_ASSERT((IDC_FCUS_SAME_WINDOW + 1)       == IDC_FCUS_SEPARATE_WINDOWS);
  115.     COMPILETIME_ASSERT((IDC_FCUS_SEPARATE_WINDOWS + 1)  == IDC_FCUS_SINGLECLICK);
  116.     COMPILETIME_ASSERT((IDC_FCUS_SINGLECLICK + 1)       == IDC_FCUS_DOUBLECLICK);
  117.     COMPILETIME_ASSERT((IDC_FCUS_DOUBLECLICK + 1)       == IDC_FCUS_ICON_IE);
  118.     COMPILETIME_ASSERT((IDC_FCUS_ICON_IE + 1)           == IDC_FCUS_ICON_HOVER);
  119.     COMPILETIME_ASSERT((IDC_FCUS_ICON_HOVER + 1)        == IDC_FCUS_ICON_MAX);
  120.     COMPILETIME_ASSERT((IDI_ACTIVEDESK_ON + 1)  == IDI_ACTIVEDESK_OFF);
  121.     COMPILETIME_ASSERT((IDI_ACTIVEDESK_OFF + 1) == IDI_WEBVIEW_ON);
  122.     COMPILETIME_ASSERT((IDI_WEBVIEW_ON + 1)     == IDI_WEBVIEW_OFF);
  123.     COMPILETIME_ASSERT((IDI_WEBVIEW_OFF + 1)    == IDI_SAME_WINDOW);
  124.     COMPILETIME_ASSERT((IDI_SAME_WINDOW + 1)    == IDI_SEPARATE_WINDOW);
  125.     COMPILETIME_ASSERT((IDI_SEPARATE_WINDOW + 1)== IDI_SINGLE_CLICK);
  126.     COMPILETIME_ASSERT((IDI_SINGLE_CLICK + 1)   == IDI_DOUBLE_CLICK);
  127.     COMPILETIME_ASSERT((IDC_FCUS_ICON_ACTIVEDESKTOP + 1) == IDC_FCUS_ICON_WEBVIEW);
  128.     COMPILETIME_ASSERT((IDC_FCUS_ICON_WEBVIEW + 1)       == IDC_FCUS_ICON_WINDOW);
  129.     COMPILETIME_ASSERT((IDC_FCUS_ICON_WINDOW + 1)        == IDC_FCUS_ICON_CLICKS);
  130.     ASSERT((IDC_FCUS_ICON_MAX - IDC_FCUS_WEB + 1) == ARRAYSIZE(pfod->ahIcon));
  131.     int iIndex = idSelectedBtn - IDC_FCUS_WEB; //Calculate the index into the Icon Table
  132.     ASSERT(iIndex < ARRAYSIZE(pfod->ahIcon));
  133.     if(pfod->ahIcon[iIndex] == NULL)
  134.         pfod->ahIcon[iIndex] = (HICON)LoadImage(HINST_THISDLL, MAKEINTRESOURCE(IDI_ACTIVEDESK_ON + iIndex), IMAGE_ICON, 0,0, LR_DEFAULTSIZE);
  135.     // Set the Icon image corresponding to the Radio button selected.
  136.     SendDlgItemMessage(hDlg, IDC_FCUS_ICON_ACTIVEDESKTOP + (iIndex >> 1), STM_SETICON, (WPARAM)(pfod->ahIcon[iIndex]), 0L);
  137. }
  138. BOOL_PTR CALLBACK FolderOptionsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  139. {
  140.     static BOOL fCheckedSingleClickDialog = FALSE;
  141.     static BOOL fCheckedWebStyle = FALSE;
  142.     BOOL    fActiveDesktop;
  143.     int     idSelectedBtn;
  144.     int     i;
  145.     INSTRUMENT_WNDPROC(SHCNFI_FOLDEROPTIONS_DLGPROC, hDlg, uMsg, wParam, lParam);
  146.     FOLDEROPTDATA *pfod = (FOLDEROPTDATA *)GetWindowLongPtr(hDlg, DWLP_USER);
  147.     switch (uMsg) {
  148.     case WM_INITDIALOG:
  149.     {
  150.         pfod = (FOLDEROPTDATA *)LocalAlloc(LPTR, SIZEOF(*pfod));
  151.         if (pfod)
  152.         {
  153.             BOOL fClassicShell, fForceActiveDesktopOn;
  154.             SHELLSTATE ss = { 0 };
  155.             //Set the Folder Options data
  156.             SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pfod);
  157.             PROPSHEETPAGE *pps = (PROPSHEETPAGE *)lParam;
  158.             pfod->ppsx = (CFolderOptionsPsx *)pps->lParam;
  159.             ReadStateAndSettings(hDlg);
  160.             // No need to initialize the array of icons with zeros
  161.             // for(i = 0; i < ARRAYSIZE(pfod->ahIcon); i++)
  162.             //    pfod->ahIcon[i] = NULL;
  163.             fClassicShell = SHRestricted(REST_CLASSICSHELL);
  164.             fForceActiveDesktopOn = SHRestricted(REST_FORCEACTIVEDESKTOPON);
  165.             SHGetSetSettings(&ss, SSF_DOUBLECLICKINWEBVIEW | SSF_WIN95CLASSIC | SSF_WEBVIEW, FALSE);
  166.             //Active Desktop            
  167.             GetSetActiveDesktop(&fActiveDesktop, FALSE); // False means get
  168.             CheckRBtnAndSetIcon(hDlg,
  169.                           IDC_FCUS_WEB,
  170.                           IDC_FCUS_CLASSIC,
  171.                           (fForceActiveDesktopOn || (fActiveDesktop && !fClassicShell))? IDC_FCUS_WEB:IDC_FCUS_CLASSIC, pfod, TRUE);
  172.             if (fForceActiveDesktopOn)
  173.                 EnableWindow(GetDlgItem(hDlg, IDC_FCUS_CLASSIC), FALSE);
  174.             else
  175.             {
  176.                 if (SHRestricted(REST_NOACTIVEDESKTOP) || fClassicShell)
  177.                     EnableWindow(GetDlgItem(hDlg, IDC_FCUS_WEB), FALSE);
  178.             }
  179.             // browse folder options
  180.             CheckRBtnAndSetIcon(hDlg,
  181.                          IDC_FCUS_SAME_WINDOW,
  182.                          IDC_FCUS_SEPARATE_WINDOWS,
  183.                          pfod->cs.fNewWindowMode ? IDC_FCUS_SEPARATE_WINDOWS:IDC_FCUS_SAME_WINDOW, pfod, TRUE);
  184.             // show folders as web pages
  185.             CheckRBtnAndSetIcon(hDlg,
  186.                          IDC_FCUS_WHENEVER_POSSIBLE,
  187.                          IDC_FCUS_WHEN_CHOOSE,
  188.                          ss.fWebView && !fClassicShell? IDC_FCUS_WHENEVER_POSSIBLE : IDC_FCUS_WHEN_CHOOSE, pfod, TRUE);
  189.             if (SHRestricted(REST_NOWEBVIEW) || fClassicShell)
  190.             {
  191.                 EnableWindow(GetDlgItem(hDlg, IDC_FCUS_WHENEVER_POSSIBLE), FALSE);
  192.                 //EnableWindow(GetDlgItem(hDlg, IDC_FCUS_WHEN_CHOOSE), FALSE);
  193.                 //EnableWindow(GetDlgItem(hDlg, IDC_FCUS_WEBVIEW_GROUP_STATIC), FALSE);
  194.             }
  195.             // single/double click
  196.             CheckRBtnAndSetIcon(hDlg,
  197.                          IDC_FCUS_SINGLECLICK,IDC_FCUS_DOUBLECLICK,
  198.                          !ss.fWin95Classic
  199.                          ? (ss.fDoubleClickInWebView ? IDC_FCUS_DOUBLECLICK:IDC_FCUS_SINGLECLICK)
  200.                          : IDC_FCUS_DOUBLECLICK, pfod, TRUE);
  201.             if (fClassicShell)
  202.             {
  203.                 EnableWindow(GetDlgItem(hDlg, IDC_FCUS_SINGLECLICK), FALSE);
  204.             }
  205.             // gray out icon underline behvaior when not in single click mode
  206.             BOOL fChecked = IsDlgButtonChecked(hDlg, IDC_FCUS_SINGLECLICK);
  207.             EnableWindow(GetDlgItem(hDlg, IDC_FCUS_ICON_IE),    fChecked);
  208.             EnableWindow(GetDlgItem(hDlg, IDC_FCUS_ICON_HOVER), fChecked);
  209.             DWORD dwIconUnderline = ICON_IE;
  210.             if (!fClassicShell)
  211.             {
  212.                 DWORD cb = sizeof(dwIconUnderline);
  213.                 SHRegGetUSValue(TEXT("Software\Microsoft\Windows\CurrentVersion\Explorer"),
  214.                             TEXT("IconUnderline"),
  215.                             NULL,
  216.                             &dwIconUnderline,
  217.                             &cb,
  218.                             FALSE,
  219.                             &dwIconUnderline,
  220.                             cb);
  221.             }
  222.             CheckRBtnAndSetIcon(hDlg,
  223.                          IDC_FCUS_ICON_IE,IDC_FCUS_ICON_HOVER,
  224.                          dwIconUnderline == ICON_IE ? IDC_FCUS_ICON_IE : IDC_FCUS_ICON_HOVER, pfod, TRUE);
  225.             if (fClassicShell)
  226.             {
  227.                 EnableWindow(GetDlgItem(hDlg, IDC_FCUS_ICON_HOVER), FALSE);
  228.             }
  229.         }
  230.         else
  231.         {
  232.             // Can't use EndDialog because we weren't created by DialogBox()
  233.             DestroyWindow(hDlg);
  234.         }
  235.         return TRUE;
  236.     }
  237.     case WM_NOTIFY:
  238.         switch (((NMHDR *)lParam)->code) {
  239.         case PSN_APPLY:
  240.         {
  241.             SHELLSTATE oldss={0};
  242.             SHELLSTATE ss = { 0 };
  243.             //Active Desktop
  244.             BOOL fActiveDesktop = IsDlgButtonChecked(hDlg, IDC_FCUS_WEB);
  245.             GetSetActiveDesktop(&fActiveDesktop, TRUE); //True means set
  246.             SHGetSetSettings(&oldss, SSF_DOUBLECLICKINWEBVIEW | SSF_WIN95CLASSIC | SSF_WEBVIEW, FALSE);
  247.             BOOL fOldValue = BOOLIFY(pfod->cs.fNewWindowMode);
  248.             if (IsDlgButtonChecked(hDlg, IDC_FCUS_SAME_WINDOW))
  249.                 pfod->cs.fNewWindowMode = FALSE;
  250.             else
  251.                 pfod->cs.fNewWindowMode = TRUE;
  252.             if (fOldValue != (pfod->cs.fNewWindowMode ? 1 : 0))
  253.                 Cabinet_StateChanged( &pfod->cs );
  254.             if (IsDlgButtonChecked(hDlg, IDC_FCUS_WHENEVER_POSSIBLE))
  255.             {
  256.                 ss.fWin95Classic = FALSE;
  257.                 ss.fWebView = TRUE;
  258.             }
  259.             else
  260.             {
  261.                 ss.fWin95Classic = TRUE;
  262.                 ss.fWebView = FALSE;
  263.             }
  264.             UpdateDefFolderSettings(ss.fWebView, oldss.fWebView);
  265.             if (IsDlgButtonChecked(hDlg, IDC_FCUS_SINGLECLICK))
  266.             {
  267.                 ss.fDoubleClickInWebView = FALSE;
  268.                 ss.fWin95Classic = FALSE;
  269.             }
  270.             else
  271.             {
  272.                 ss.fDoubleClickInWebView = TRUE;
  273.                 ss.fWin95Classic = FALSE;
  274.             }
  275.             DWORD dwIconUnderline, dwOldIconUnderline, dwDefaultIconUnderline;
  276.             DWORD cb = sizeof(dwIconUnderline);
  277.             //Get the current settings for "IconUnderline"
  278.             dwDefaultIconUnderline = -1;  // not ICON_IE or will not WM_WININICHANGE
  279.             SHRegGetUSValue(TEXT("Software\Microsoft\Windows\CurrentVersion\Explorer"),
  280.                                 TEXT("IconUnderline"),
  281.                                 NULL,
  282.                                 &dwOldIconUnderline,
  283.                                 &cb,
  284.                                 FALSE,
  285.                                 &dwDefaultIconUnderline,
  286.                                 sizeof(dwDefaultIconUnderline));
  287.                                 
  288.             if (IsDlgButtonChecked(hDlg, IDC_FCUS_ICON_IE))
  289.                 dwIconUnderline = ICON_IE;
  290.             else
  291.                 dwIconUnderline = ICON_HOVER;
  292.             if(dwOldIconUnderline != dwIconUnderline) //See if this setting has changed
  293.             {
  294.                 cb = sizeof(dwIconUnderline);
  295.                 SHRegSetUSValue(TEXT("Software\Microsoft\Windows\CurrentVersion\Explorer"),
  296.                                 TEXT("IconUnderline"),
  297.                                 NULL,
  298.                                 &dwIconUnderline,
  299.                                 cb,
  300.                                 SHREGSET_DEFAULT);
  301.                 SHSendMessageBroadcast(WM_WININICHANGE, 0, (LPARAM)TEXT("Software\Microsoft\Windows\CurrentVersion\Explorer\IconUnderline"));
  302.             }
  303.             if ((ss.fWin95Classic != oldss.fWin95Classic)
  304.                     || (ss.fWebView != oldss.fWebView)
  305.                     || ss.fDoubleClickInWebView != oldss.fDoubleClickInWebView)
  306.             {
  307.                 SHGetSetSettings(&ss, SSF_WIN95CLASSIC | SSF_DOUBLECLICKINWEBVIEW | SSF_WEBVIEW, TRUE);
  308.                 Cabinet_RefreshAll();
  309.             }
  310.             return TRUE;
  311.         }
  312.         case PSN_KILLACTIVE:
  313.             // validate here
  314.             // SetWindowLongPtr(hDlg, DWLP_MSGRESULT, !ValidateLink());   // don't allow close
  315.             return TRUE;
  316.         case PSN_SETACTIVE:
  317.             if (pfod->ppsx->NeedRefresh())
  318.             {
  319.                 ReadStateAndSettings(hDlg);
  320.             }
  321.             return TRUE;
  322.         }
  323.         break;
  324.     case WM_HELP:
  325.         WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, TEXT(SHELL_HLP),
  326.            HELP_WM_HELP, (ULONG_PTR)(LPTSTR) aFolderOptsHelpIDs);
  327.         break;
  328.     case WM_CONTEXTMENU:
  329.         WinHelp((HWND) wParam, TEXT(SHELL_HLP), HELP_CONTEXTMENU,
  330.             (ULONG_PTR)(void *)aFolderOptsHelpIDs);
  331.         break;
  332.     case WM_COMMAND:
  333.         switch (idSelectedBtn = GET_WM_COMMAND_ID(wParam, lParam))
  334.         {
  335.             case IDC_FCUS_SINGLECLICK:
  336.             case IDC_FCUS_DOUBLECLICK:
  337.                 if (GET_WM_COMMAND_CMD(wParam,lParam) == BN_CLICKED)
  338.                 {
  339.                     EnableWindow(GetDlgItem(hDlg, IDC_FCUS_ICON_IE),    GET_WM_COMMAND_ID(wParam,lParam) == IDC_FCUS_SINGLECLICK);
  340.                     EnableWindow(GetDlgItem(hDlg, IDC_FCUS_ICON_HOVER), GET_WM_COMMAND_ID(wParam,lParam) == IDC_FCUS_SINGLECLICK);
  341.                 }
  342.                 //Fall through ...
  343.             case IDC_FCUS_WEB:
  344.             case IDC_FCUS_CLASSIC:
  345.             case IDC_FCUS_WHENEVER_POSSIBLE:
  346.             case IDC_FCUS_WHEN_CHOOSE:
  347.             case IDC_FCUS_SAME_WINDOW:
  348.             case IDC_FCUS_SEPARATE_WINDOWS:
  349.                 // We do not need to Check the radio button; It is alreay checked. We just need to
  350.                 // set the corresponding Icon. Hence we pass FALSE.
  351.                 fCheckedWebStyle = (GET_WM_COMMAND_ID(wParam, lParam) == IDC_FCUS_WEB);
  352.                 CheckRBtnAndSetIcon(hDlg, 0, 0, idSelectedBtn, pfod, FALSE);
  353.                 SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
  354.                 break;
  355.             case IDC_FCUS_ICON_IE:
  356.             case IDC_FCUS_ICON_HOVER:
  357.                 SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
  358.                 break;
  359.             case IDC_FCUS_RESTORE_DEFAULTS:
  360.                 //Set the "factory settings" as the default.
  361.                 CheckRBtnAndSetIcon(hDlg, IDC_FCUS_WEB, IDC_FCUS_CLASSIC, IDC_FCUS_CLASSIC, pfod, TRUE);
  362.                 // Don't set the default web view option if web view is disabled via system policy.
  363.                 if (0 == SHRestricted(REST_NOWEBVIEW))
  364.                 {
  365.                     CheckRBtnAndSetIcon(hDlg, IDC_FCUS_WHENEVER_POSSIBLE, IDC_FCUS_WHEN_CHOOSE, IDC_FCUS_WHENEVER_POSSIBLE, pfod, TRUE);
  366.                 }
  367.                 CheckRBtnAndSetIcon(hDlg, IDC_FCUS_SAME_WINDOW, IDC_FCUS_SEPARATE_WINDOWS, IDC_FCUS_SAME_WINDOW, pfod, TRUE);
  368.                 CheckRBtnAndSetIcon(hDlg, IDC_FCUS_SINGLECLICK, IDC_FCUS_DOUBLECLICK, IDC_FCUS_DOUBLECLICK, pfod, TRUE);
  369.                 CheckRadioButton(hDlg, IDC_FCUS_ICON_IE, IDC_FCUS_ICON_HOVER, IDC_FCUS_ICON_IE);
  370.                 EnableWindow(GetDlgItem(hDlg, IDC_FCUS_ICON_IE),    FALSE); //Disable
  371.                 EnableWindow(GetDlgItem(hDlg, IDC_FCUS_ICON_HOVER), FALSE); //Disable
  372.                 //Enable the "Apply" button because changes have happened.
  373.                 SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
  374.                 break;
  375.         }
  376.         break;
  377.     case WM_DESTROY:
  378.         if (pfod)
  379.         {
  380.             //Cleanup the Icons array!
  381.             for(i = 0; i < ARRAYSIZE(pfod->ahIcon); i++)
  382.             {
  383.                 if(pfod->ahIcon[i])
  384.                     DestroyIcon(pfod->ahIcon[i]);
  385.             }
  386.             SetWindowLongPtr(hDlg, DWLP_USER, 0);
  387.             LocalFree((HANDLE)pfod);
  388.         }
  389.         break;
  390.     }
  391.     return FALSE;
  392. }
  393. // Moved from defview.cpp, which never used these functions
  394. const TCHAR c_szExploreClass[]  = TEXT("ExploreWClass");
  395. const TCHAR c_szIExploreClass[] = TEXT("IEFrame");
  396. const TCHAR c_szCabinetClass[]  =
  397. #ifdef IE3CLASSNAME
  398.     TEXT("IEFrame");
  399. #else
  400.     TEXT("CabinetWClass");
  401. #endif
  402. BOOL IsNamedWindow(HWND hwnd, LPCTSTR pszClass)
  403. {
  404.     TCHAR szClass[32];
  405.     GetClassName(hwnd, szClass, ARRAYSIZE(szClass));
  406.     return lstrcmp(szClass, pszClass) == 0;
  407. }
  408. BOOL IsExplorerWindow(HWND hwnd)
  409. {
  410.     return IsNamedWindow(hwnd, c_szExploreClass);
  411. }
  412. BOOL IsTrayWindow(HWND hwnd)
  413. {
  414.     return IsNamedWindow(hwnd, TEXT(WNDCLASS_TRAYNOTIFY));
  415. }
  416. BOOL IsFolderWindow(HWND hwnd)
  417. {
  418.     TCHAR szClass[32];
  419.     GetClassName(hwnd, szClass, ARRAYSIZE(szClass));
  420.     return (lstrcmp(szClass, c_szCabinetClass) == 0) || (lstrcmp(szClass, c_szIExploreClass) == 0);
  421. }
  422. BOOL CALLBACK Cabinet_RefreshEnum(HWND hwnd, LPARAM lParam)
  423. {
  424.     if (IsFolderWindow(hwnd) || IsExplorerWindow(hwnd))
  425.     {
  426.         PostMessage(hwnd, WM_COMMAND, FCIDM_REFRESH, 0L);
  427.     }
  428.     return(TRUE);
  429. }
  430. void Cabinet_RefreshAll(void)
  431. {
  432.     HWND hwnd = FindWindowEx(NULL, NULL, TEXT(STR_DESKTOPCLASS), NULL);
  433.     if (hwnd)
  434.         PostMessage(hwnd, WM_COMMAND, FCIDM_REFRESH, 0L);
  435.     hwnd = FindWindowEx(NULL, NULL, TEXT("Shell_TrayWnd"), NULL);
  436.     if (hwnd)
  437.         PostMessage(hwnd, TM_REFRESH, 0, 0L);
  438.     EnumWindows(Cabinet_RefreshEnum, 0);
  439. }
  440. BOOL CALLBACK Folder_UpdateEnum(HWND hwnd, LPARAM lParam)
  441. {
  442.     if (IsFolderWindow(hwnd) || IsExplorerWindow(hwnd))
  443.     {
  444.         // A value of -1L for lParam will force a refresh by loading the View window
  445.         // with the new VID as specified in the global DefFolderSettings.
  446.         PostMessage(hwnd, WM_COMMAND, SFVIDM_MISC_SETWEBVIEW, lParam);
  447.     }
  448.     return(TRUE);
  449. }
  450. BOOL UpdateDefFolderSettings(BOOL fWebView, BOOL fWebViewOld)
  451. {
  452.     BOOL bRet = FALSE;
  453.     if (fWebView != fWebViewOld)
  454.     {
  455.         EnumWindows(Folder_UpdateEnum, (LPARAM) fWebView);
  456.         bRet = TRUE;
  457.     }
  458.     return bRet;
  459. }
  460. BOOL CALLBACK Cabinet_GlobalStateEnum(HWND hwnd, LPARAM lParam)
  461. {
  462.     if (IsFolderWindow(hwnd) || IsExplorerWindow(hwnd))
  463.     {
  464.         PostMessage(hwnd, CWM_GLOBALSTATECHANGE, 0, 0L);
  465.     }
  466.     return(TRUE);
  467. }
  468. void Cabinet_StateChanged(CABINETSTATE *pcs)
  469. {
  470.     // Save the new settings away...
  471.     WriteCabinetState( pcs );
  472.     EnumWindows(Cabinet_GlobalStateEnum, 0);
  473. }
  474. HWND CreateGlobalFolderOptionsStubWindow(void)
  475. {
  476.     WNDCLASS wc;
  477.     DWORD dwExStyle = WS_EX_TOOLWINDOW;
  478.     
  479.     if (!GetClassInfo(HINST_THISDLL, SZ_FOLDEROPTSTUBCLASS, &wc))
  480.     {
  481.         wc.style         = 0;
  482.         wc.lpfnWndProc   = DefWindowProc;
  483.         wc.cbClsExtra    = 0;
  484.         wc.cbWndExtra    = 0;
  485.         wc.hInstance     = HINST_THISDLL;
  486.         wc.hIcon         = NULL;
  487.         wc.hCursor       = NULL;
  488.         wc.hbrBackground = NULL;
  489.         wc.lpszMenuName  = NULL;
  490.         wc.lpszClassName = SZ_FOLDEROPTSTUBCLASS;
  491.         if (!RegisterClass(&wc))
  492.             return NULL;
  493.     }
  494.     if (IS_BIDI_LOCALIZED_SYSTEM()) {
  495.         dwExStyle |= dwExStyleRTLMirrorWnd;
  496.     }
  497.     return CreateWindowEx(dwExStyle, SZ_FOLDEROPTSTUBCLASS, c_szNULL, WS_OVERLAPPED, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, HINST_THISDLL, NULL);
  498. }
  499. BOOL CALLBACK AddPropSheetPage(HPROPSHEETPAGE hpage, LPARAM lParam)
  500. {
  501.     PROPSHEETHEADER * ppsh = (PROPSHEETHEADER *)lParam;
  502.     if (ppsh->nPages < MAXPROPPAGES)
  503.     {
  504.         ppsh->phpage[ppsh->nPages++] = hpage;
  505.         return TRUE;
  506.     }
  507.     return FALSE;
  508. }
  509. void AddPropSheetCLSID(REFCLSID clsid, PROPSHEETHEADER *ppsh)
  510. {
  511.     IShellPropSheetExt *psx;
  512.     HRESULT hres = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IShellPropSheetExt, (void **)&psx);
  513.     if (SUCCEEDED(hres)) 
  514.     {
  515.         psx->AddPages(AddPropSheetPage, (LPARAM)ppsh);
  516.         psx->Release();
  517.     }
  518. }
  519. DWORD CALLBACK GlobalFolderOptPropSheetThreadProc(void *)
  520. {
  521.     PROPSHEETHEADER psh;
  522.     HPROPSHEETPAGE rPages[MAXPROPPAGES];
  523.     HRESULT hrInit = SHCoInitialize();
  524.     HWND hwndStub = CreateGlobalFolderOptionsStubWindow();
  525.     //
  526.     // Property sheet stuff.
  527.     //
  528.     psh.dwSize = SIZEOF(psh);
  529.     psh.dwFlags = PSH_DEFAULT;
  530.     psh.hInstance = HINST_THISDLL;
  531.     psh.hwndParent = hwndStub;
  532.     psh.pszCaption = MAKEINTRESOURCE(IDS_FOLDEROPT_TITLE);
  533.     psh.nPages = 0;
  534.     psh.nStartPage = 0;
  535.     psh.phpage = rPages;
  536.     AddPropSheetCLSID(CLSID_ShellFldSetExt, &psh);
  537.     AddPropSheetCLSID(CLSID_FileTypes, &psh);
  538.     AddPropSheetCLSID(CLSID_OfflineFilesOptions, &psh);
  539.     //
  540.     // Display the property sheet.
  541.     //
  542.     PropertySheet(&psh);
  543.     //
  544.     // Clean up stub window.
  545.     //
  546.     DestroyWindow(hwndStub);
  547.     SHCoUninitialize(hrInit);
  548.     return 0;
  549. }
  550. BOOL CALLBACK FindFolderOptionsEnumProc(HWND hwnd, LPARAM lParam)
  551. {
  552.     BOOL fRet = TRUE;
  553.     HWND *phwnd = (HWND *)lParam;
  554.     TCHAR szClass[MAX_PATH];
  555.     GetClassName(hwnd, szClass, ARRAYSIZE(szClass));
  556.     if (lstrcmp(szClass, SZ_FOLDEROPTSTUBCLASS) == 0)
  557.     {
  558.         *phwnd = hwnd;
  559.         fRet = FALSE;
  560.     }
  561.     return fRet;
  562. }
  563. void DoGlobalFolderOptions(void)
  564. {
  565.     HWND hwnd = NULL;
  566.     
  567.     EnumWindows(FindFolderOptionsEnumProc, (LPARAM)&hwnd);
  568.     if (hwnd)
  569.     {
  570.         hwnd = GetLastActivePopup(hwnd);
  571.         if (hwnd && IsWindow(hwnd))
  572.         {
  573.             SetForegroundWindow(hwnd);
  574.         }
  575.     }
  576.     else
  577.     {
  578.         DWORD dwThread;
  579.         HANDLE hThread = CreateThread(NULL, 0, GlobalFolderOptPropSheetThreadProc, NULL, 
  580.             THREAD_PRIORITY_NORMAL, &dwThread);
  581.         if (hThread != NULL)
  582.         {
  583.             CloseHandle(hThread);
  584.         }
  585.     }
  586. }