[CPL][SHELL32] Add icons to input, joy, sysdm, folder options (#1138)
[reactos.git] / dll / win32 / shell32 / dialogs / folder_options.cpp
index 7644568..527a359 100644 (file)
@@ -1,7 +1,8 @@
 /*
- *    Open With  Context Menu extension
+ *    Folder Options
  *
  * Copyright 2007 Johannes Anderwald <johannes.anderwald@reactos.org>
+ * Copyright 2016-2018 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 WINE_DEFAULT_DEBUG_CHANNEL (fprop);
 
-#define MAX_PROPERTY_SHEET_PAGE (32)
+// Folder Options:
+// CLASSKEY = HKEY_CLASSES_ROOT\CLSID\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}
 
-/// Folder Options:
-/// CLASSKEY = HKEY_CLASSES_ROOT\CLSID\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}
-/// DefaultIcon = %SystemRoot%\system32\SHELL32.dll,-210
-/// Verbs: Open / RunAs
-///       Cmd: rundll32.exe shell32.dll,Options_RunDLL 0
-
-/// ShellFolder Attributes: 0x0
-
-typedef struct
-{
-    WCHAR FileExtension[30];
-    WCHAR FileDescription[100];
-    WCHAR ClassKey[MAX_PATH];
-} FOLDER_FILE_TYPE_ENTRY, *PFOLDER_FILE_TYPE_ENTRY;
-
-typedef struct
-{
-    LPCWSTR szKeyName;
-    UINT ResourceID;
-} FOLDER_VIEW_ENTRY, PFOLDER_VIEW_ENTRY;
-/*
-static FOLDER_VIEW_ENTRY s_Options[] =
-{
-    { L"AlwaysShowMenus", IDS_ALWAYSSHOWMENUS },
-    { L"AutoCheckSelect", -1 },
-    { L"ClassicViewState", -1 },
-    { L"DontPrettyPath",  -1 },
-    { L"Filter", -1 },
-    { L"FolderContentsInfoTip", IDS_FOLDERCONTENTSTIP },
-    { L"FriendlyTree", -1 },
-    { L"Hidden", -1, },
-    { L"HideFileExt", IDS_HIDEFILEEXT },
-    { L"HideIcons", -1},
-    { L"IconsOnly", -1},
-    { L"ListviewAlphaSelect", -1},
-    { L"ListviewShadow", -1},
-    { L"ListviewWatermark", -1},
-    { L"MapNetDrvBtn", -1},
-    { L"PersistBrowsers", -1},
-    { L"SeperateProcess", IDS_SEPERATEPROCESS},
-    { L"ServerAdminUI", -1},
-    { L"SharingWizardOn", IDS_USESHAREWIZARD},
-    { L"ShowCompColor", IDS_COMPCOLOR},
-    { L"ShowInfoTip", IDS_SHOWINFOTIP},
-    { L"ShowPreviewHandlers", -1},
-    { L"ShowSuperHidden", IDS_HIDEOSFILES},
-    { L"ShowTypeOverlay", -1},
-    { L"Start_ShowMyGames", -1},
-    { L"StartMenuInit", -1},
-    { L"SuperHidden", -1},
-    { L"TypeAhead", -1},
-    { L"Webview", -1},
-    { NULL, -1}
-
-};
-*/
-
-EXTERN_C HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj);
-
-static
-INT_PTR
-CALLBACK
-FolderOptionsGeneralDlg(
-    HWND hwndDlg,
-    UINT uMsg,
-    WPARAM wParam,
-    LPARAM lParam
-)
-{
-    return FALSE;
-}
-
-static
-VOID
-InitializeFolderOptionsListCtrl(HWND hwndDlg)
-{
-    RECT clientRect;
-    LVCOLUMNW col;
-    WCHAR szName[50];
-    HWND hDlgCtrl;
-
-    hDlgCtrl = GetDlgItem(hwndDlg, 14003);
-
-    if (!LoadStringW(shell32_hInstance, IDS_COLUMN_EXTENSION, szName, sizeof(szName) / sizeof(WCHAR)))
-        szName[0] = 0;
-    szName[(sizeof(szName)/sizeof(WCHAR))-1] = 0;
-
-    GetClientRect(hDlgCtrl, &clientRect);
-    ZeroMemory(&col, sizeof(LV_COLUMN));
-    col.mask      = LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;
-    col.iSubItem  = 0;
-    col.pszText = szName;
-    col.fmt = LVCFMT_LEFT;
-    col.cx        = (clientRect.right - clientRect.left) - GetSystemMetrics(SM_CXVSCROLL);
-    (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMN, 0, (LPARAM)&col);
+/////////////////////////////////////////////////////////////////////////////
+// strings
 
+// path to shell32
+LPCWSTR g_pszShell32 = L"%SystemRoot%\\system32\\shell32.dll";
 
+// the space characters
+LPCWSTR g_pszSpace = L" \t\n\r\f\v";
 
-}
+/////////////////////////////////////////////////////////////////////////////
+// utility functions
 
-static
-INT_PTR
-CALLBACK
-FolderOptionsViewDlg(
-    HWND hwndDlg,
-    UINT uMsg,
-    WPARAM wParam,
-    LPARAM lParam
-)
+HBITMAP Create24BppBitmap(HDC hDC, INT cx, INT cy)
 {
-    switch(uMsg)
-    {
-        case WM_INITDIALOG:
-            InitializeFolderOptionsListCtrl(hwndDlg);
-            return TRUE;
-    }
-
-    return FALSE;
-
+    BITMAPINFO bi;
+    LPVOID pvBits;
+
+    ZeroMemory(&bi, sizeof(bi));
+    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    bi.bmiHeader.biWidth = cx;
+    bi.bmiHeader.biHeight = cy;
+    bi.bmiHeader.biPlanes = 1;
+    bi.bmiHeader.biBitCount = 24;
+    bi.bmiHeader.biCompression = BI_RGB;
+
+    HBITMAP hbm = CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, &pvBits, NULL, 0);
+    return hbm;
 }
 
-static
-VOID
-InitializeFileTypesListCtrlColumns(HWND hDlgCtrl)
+HBITMAP BitmapFromIcon(HICON hIcon, INT cx, INT cy)
 {
-    RECT clientRect;
-    LVCOLUMNW col;
-    WCHAR szName[50];
-    DWORD dwStyle;
-    int columnSize = 140;
+    HDC hDC = CreateCompatibleDC(NULL);
+    if (!hDC)
+        return NULL;
 
-
-    if (!LoadStringW(shell32_hInstance, IDS_COLUMN_EXTENSION, szName, sizeof(szName) / sizeof(WCHAR)))
+    HBITMAP hbm = Create24BppBitmap(hDC, cx, cy);
+    if (!hbm)
     {
-        /* default to english */
-        wcscpy(szName, L"Extensions");
+        DeleteDC(hDC);
+        return NULL;
     }
 
-    /* make sure its null terminated */
-    szName[(sizeof(szName)/sizeof(WCHAR))-1] = 0;
-
-    GetClientRect(hDlgCtrl, &clientRect);
-    ZeroMemory(&col, sizeof(LV_COLUMN));
-    columnSize = 140; //FIXME
-    col.iSubItem   = 0;
-    col.mask      = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT;
-    col.fmt = LVCFMT_FIXED_WIDTH;
-    col.cx         = columnSize | LVCFMT_LEFT;
-    col.cchTextMax = wcslen(szName);
-    col.pszText    = szName;
-    (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM)&col);
-
-    if (!LoadStringW(shell32_hInstance, IDS_FILE_TYPES, szName, sizeof(szName) / sizeof(WCHAR)))
+    HGDIOBJ hbmOld = SelectObject(hDC, hbm);
     {
-        /* default to english */
-        wcscpy(szName, L"FileTypes");
+        RECT rc = { 0, 0, cx, cy };
+        FillRect(hDC, &rc, HBRUSH(COLOR_3DFACE + 1));
+        if (hIcon)
+        {
+            DrawIconEx(hDC, 0, 0, hIcon, cx, cy, 0, NULL, DI_NORMAL);
+        }
     }
+    SelectObject(hDC, hbmOld);
+    DeleteDC(hDC);
 
-    col.iSubItem   = 1;
-    col.cx         = clientRect.right - clientRect.left - columnSize;
-    col.cchTextMax = wcslen(szName);
-    col.pszText    = szName;
-    (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 1, (LPARAM)&col);
-
-    /* set full select style */
-    dwStyle = (DWORD) SendMessage(hDlgCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
-    dwStyle = dwStyle | LVS_EX_FULLROWSELECT;
-    SendMessage(hDlgCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
+    return hbm;
 }
 
-INT
-FindItem(HWND hDlgCtrl, WCHAR * ItemName)
+HBITMAP CreateCheckImage(HDC hDC, BOOL bCheck, BOOL bEnabled)
 {
-    LVFINDINFOW findInfo;
-    ZeroMemory(&findInfo, sizeof(LVFINDINFOW));
+    INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
+    INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
 
-    findInfo.flags = LVFI_STRING;
-    findInfo.psz = ItemName;
-    return ListView_FindItem(hDlgCtrl, 0, &findInfo);
-}
+    HBITMAP hbm = Create24BppBitmap(hDC, cxSmallIcon, cySmallIcon);
+    if (hbm == NULL)
+        return NULL;    // failure
 
-static
-VOID
-InsertFileType(HWND hDlgCtrl, WCHAR * szName, PINT iItem, WCHAR * szFile)
-{
-    PFOLDER_FILE_TYPE_ENTRY Entry;
-    HKEY hKey;
-    LVITEMW lvItem;
-    DWORD dwSize;
+    RECT Rect, BoxRect;
+    SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
+    BoxRect = Rect;
+    InflateRect(&BoxRect, -1, -1);
 
-    if (szName[0] != L'.')
+    HGDIOBJ hbmOld = SelectObject(hDC, hbm);
     {
-        /* FIXME handle URL protocol handlers */
-        return;
+        UINT uState = DFCS_BUTTONCHECK | DFCS_FLAT | DFCS_MONO;
+        if (bCheck)
+            uState |= DFCS_CHECKED;
+        if (!bEnabled)
+            uState |= DFCS_INACTIVE;
+        DrawFrameControl(hDC, &BoxRect, DFC_BUTTON, uState);
     }
+    SelectObject(hDC, hbmOld);
 
-    /* allocate file type entry */
-    Entry = (PFOLDER_FILE_TYPE_ENTRY)HeapAlloc(GetProcessHeap(), 0, sizeof(FOLDER_FILE_TYPE_ENTRY));
-
-    if (!Entry)
-        return;
+    return hbm;     // success
+}
 
-    /* open key */
-    if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szName, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
-    {
-        HeapFree(GetProcessHeap(), 0, Entry);
-        return;
-    }
+HBITMAP CreateCheckMask(HDC hDC)
+{
+    INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
+    INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
 
-    /* FIXME check for duplicates */
+    HBITMAP hbm = CreateBitmap(cxSmallIcon, cySmallIcon, 1, 1, NULL);
+    if (hbm == NULL)
+        return NULL;    // failure
 
-    /* query for the default key */
-    dwSize = sizeof(Entry->ClassKey);
-    if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)Entry->ClassKey, &dwSize) != ERROR_SUCCESS)
-    {
-        /* no link available */
-        Entry->ClassKey[0] = 0;
-    }
+    RECT Rect, BoxRect;
+    SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
+    BoxRect = Rect;
+    InflateRect(&BoxRect, -1, -1);
 
-    if (Entry->ClassKey[0])
+    HGDIOBJ hbmOld = SelectObject(hDC, hbm);
     {
-        HKEY hTemp;
-        /* try open linked key */
-        if (RegOpenKeyExW(HKEY_CLASSES_ROOT, Entry->ClassKey, 0, KEY_READ, &hTemp) == ERROR_SUCCESS)
-        {
-            /* use linked key */
-            RegCloseKey(hKey);
-            hKey = hTemp;
-        }
+        FillRect(hDC, &Rect, HBRUSH(GetStockObject(WHITE_BRUSH)));
+        FillRect(hDC, &BoxRect, HBRUSH(GetStockObject(BLACK_BRUSH)));
     }
+    SelectObject(hDC, hbmOld);
 
-    /* read friendly type name */
-    if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", Entry->FileDescription, sizeof(Entry->FileDescription), NULL, 0, NULL) != ERROR_SUCCESS)
-    {
-        /* read file description */
-        dwSize = sizeof(Entry->FileDescription);
-        Entry->FileDescription[0] = 0;
+    return hbm;     // success
+}
 
-        /* read default key */
-        RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)Entry->FileDescription, &dwSize);
-    }
+HBITMAP CreateRadioImage(HDC hDC, BOOL bCheck, BOOL bEnabled)
+{
+    INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
+    INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
 
-    /* close key */
-    RegCloseKey(hKey);
+    HBITMAP hbm = Create24BppBitmap(hDC, cxSmallIcon, cySmallIcon);
+    if (hbm == NULL)
+        return NULL;    // failure
 
-    /* convert extension to upper case */
-    wcscpy(Entry->FileExtension, szName);
-    _wcsupr(Entry->FileExtension);
+    RECT Rect, BoxRect;
+    SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
+    BoxRect = Rect;
+    InflateRect(&BoxRect, -1, -1);
 
-    if (!Entry->FileDescription[0])
+    HGDIOBJ hbmOld = SelectObject(hDC, hbm);
     {
-        /* construct default 'FileExtensionFile' */
-        wcscpy(Entry->FileDescription, &Entry->FileExtension[1]);
-        wcscat(Entry->FileDescription, L" ");
-        wcscat(Entry->FileDescription, szFile);
+        UINT uState = DFCS_BUTTONRADIOIMAGE | DFCS_FLAT | DFCS_MONO;
+        if (bCheck)
+            uState |= DFCS_CHECKED;
+        if (!bEnabled)
+            uState |= DFCS_INACTIVE;
+        DrawFrameControl(hDC, &BoxRect, DFC_BUTTON, uState);
     }
+    SelectObject(hDC, hbmOld);
 
-    ZeroMemory(&lvItem, sizeof(LVITEMW));
-    lvItem.mask = LVIF_TEXT | LVIF_PARAM;
-    lvItem.iSubItem = 0;
-    lvItem.pszText = &Entry->FileExtension[1];
-    lvItem.iItem = *iItem;
-    lvItem.lParam = (LPARAM)Entry;
-    (void)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem);
-
-    ZeroMemory(&lvItem, sizeof(LVITEMW));
-    lvItem.mask = LVIF_TEXT;
-    lvItem.pszText = Entry->FileDescription;
-    lvItem.iItem = *iItem;
-    lvItem.iSubItem = 1;
-
-    (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&lvItem);
-    (*iItem)++;
+    return hbm;     // success
 }
 
-static
-int
-CALLBACK
-ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
+HBITMAP CreateRadioMask(HDC hDC)
 {
-    PFOLDER_FILE_TYPE_ENTRY Entry1, Entry2;
+    INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
+    INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
 
-    Entry1 = (PFOLDER_FILE_TYPE_ENTRY)lParam1;
-    Entry2 = (PFOLDER_FILE_TYPE_ENTRY)lParam2;
+    HBITMAP hbm = CreateBitmap(cxSmallIcon, cySmallIcon, 1, 1, NULL);
+    if (hbm == NULL)
+        return NULL;    // failure
 
-    return wcsicmp(Entry1->FileExtension, Entry2->FileExtension);
-}
+    RECT Rect, BoxRect;
+    SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
+    BoxRect = Rect;
+    InflateRect(&BoxRect, -1, -1);
 
-static
-BOOL
-InitializeFileTypesListCtrl(HWND hwndDlg)
-{
-    HWND hDlgCtrl;
-    DWORD dwIndex = 0;
-    WCHAR szName[50];
-    WCHAR szFile[100];
-    DWORD dwName;
-    LVITEMW lvItem;
-    INT iItem = 0;
-
-    hDlgCtrl = GetDlgItem(hwndDlg, 14000);
-    InitializeFileTypesListCtrlColumns(hDlgCtrl);
-
-    szFile[0] = 0;
-    if (!LoadStringW(shell32_hInstance, IDS_SHV_COLUMN1, szFile, sizeof(szFile) / sizeof(WCHAR)))
+    HGDIOBJ hbmOld = SelectObject(hDC, hbm);
     {
-        /* default to english */
-        wcscpy(szFile, L"File");
+        FillRect(hDC, &Rect, HBRUSH(GetStockObject(WHITE_BRUSH)));
+        UINT uState = DFCS_BUTTONRADIOMASK | DFCS_FLAT | DFCS_MONO;
+        DrawFrameControl(hDC, &BoxRect, DFC_BUTTON, uState);
     }
-    szFile[(sizeof(szFile)/sizeof(WCHAR))-1] = 0;
+    SelectObject(hDC, hbmOld);
 
-    dwName = sizeof(szName) / sizeof(WCHAR);
-
-    while(RegEnumKeyExW(HKEY_CLASSES_ROOT, dwIndex++, szName, &dwName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
-    {
-        InsertFileType(hDlgCtrl, szName, &iItem, szFile);
-        dwName = sizeof(szName) / sizeof(WCHAR);
-    }
-
-    /* sort list */
-    ListView_SortItems(hDlgCtrl, ListViewCompareProc, NULL);
-
-    /* select first item */
-    ZeroMemory(&lvItem, sizeof(LVITEMW));
-    lvItem.mask = LVIF_STATE;
-    lvItem.stateMask = (UINT) - 1;
-    lvItem.state = LVIS_FOCUSED | LVIS_SELECTED;
-    lvItem.iItem = 0;
-    (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&lvItem);
-
-    return TRUE;
+    return hbm;     // success
 }
 
-static
-PFOLDER_FILE_TYPE_ENTRY
-FindSelectedItem(
-    HWND hDlgCtrl)
-{
-    UINT Count, Index;
-    LVITEMW lvItem;
+/////////////////////////////////////////////////////////////////////////////
 
-    Count = ListView_GetItemCount(hDlgCtrl);
+// CMSGlobalFolderOptionsStub --- The owner window of Folder Options.
+// This window hides taskbar button of Folder Options.
+class CMSGlobalFolderOptionsStub : public CWindowImpl<CMSGlobalFolderOptionsStub>
+{
+public:
+    DECLARE_WND_CLASS_EX(_T("MSGlobalFolderOptionsStub"), 0, COLOR_WINDOWTEXT)
 
-    for (Index = 0; Index < Count; Index++)
-    {
-        ZeroMemory(&lvItem, sizeof(LVITEM));
-        lvItem.mask = LVIF_PARAM | LVIF_STATE;
-        lvItem.iItem = Index;
-        lvItem.stateMask = (UINT) - 1;
+    BEGIN_MSG_MAP(CMSGlobalFolderOptionsStub)
+    END_MSG_MAP()
+};
 
-        if (ListView_GetItem(hDlgCtrl, &lvItem))
-        {
-            if (lvItem.state & LVIS_SELECTED)
-                return (PFOLDER_FILE_TYPE_ENTRY)lvItem.lParam;
-        }
-    }
+/////////////////////////////////////////////////////////////////////////////
 
-    return NULL;
-}
+EXTERN_C HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj);
 
-static
-INT_PTR
-CALLBACK
-FolderOptionsFileTypesDlg(
-    HWND hwndDlg,
-    UINT uMsg,
-    WPARAM wParam,
-    LPARAM lParam
-)
+static int CALLBACK
+PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
 {
-    LPNMLISTVIEW lppl;
-    LVITEMW lvItem;
-    WCHAR Buffer[255], FormatBuffer[255];
-    PFOLDER_FILE_TYPE_ENTRY pItem;
-    OPENASINFO Info;
-
-    switch(uMsg)
+    // NOTE: This callback is needed to set large icon correctly.
+    HICON hIcon;
+    switch (uMsg)
     {
-        case WM_INITDIALOG:
-            InitializeFileTypesListCtrl(hwndDlg);
-            return TRUE;
-        case WM_COMMAND:
-            switch(LOWORD(wParam))
-            {
-                case 14006:
-                    pItem = FindSelectedItem(GetDlgItem(hwndDlg, 14000));
-                    if (pItem)
-                    {
-                        Info.oaifInFlags = OAIF_ALLOW_REGISTRATION | OAIF_REGISTER_EXT;
-                        Info.pcszClass = pItem->FileExtension;
-                        SHOpenWithDialog(hwndDlg, &Info);
-                    }
-                    break;
-            }
-
-            break;
-        case WM_NOTIFY:
-            lppl = (LPNMLISTVIEW) lParam;
-
-            if (lppl->hdr.code == LVN_ITEMCHANGING)
-            {
-                ZeroMemory(&lvItem, sizeof(LVITEM));
-                lvItem.mask = LVIF_PARAM;
-                lvItem.iItem = lppl->iItem;
-                if (!SendMessageW(lppl->hdr.hwndFrom, LVM_GETITEMW, 0, (LPARAM)&lvItem))
-                    return TRUE;
-
-                pItem = (PFOLDER_FILE_TYPE_ENTRY)lvItem.lParam;
-                if (!pItem)
-                    return TRUE;
-
-                if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED))
-                {
-                    /* new focused item */
-                    if (!LoadStringW(shell32_hInstance, IDS_FILE_DETAILS, FormatBuffer, sizeof(FormatBuffer) / sizeof(WCHAR)))
-                    {
-                        /* use default english format string */
-                        wcscpy(FormatBuffer, L"Details for '%s' extension");
-                    }
-
-                    /* format buffer */
-                    swprintf(Buffer, FormatBuffer, &pItem->FileExtension[1]);
-                    /* update dialog */
-                    SetDlgItemTextW(hwndDlg, 14003, Buffer);
-
-                    if (!LoadStringW(shell32_hInstance, IDS_FILE_DETAILSADV, FormatBuffer, sizeof(FormatBuffer) / sizeof(WCHAR)))
-                    {
-                        /* use default english format string */
-                        wcscpy(FormatBuffer, L"Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.");
-                    }
-                    /* format buffer */
-                    swprintf(Buffer, FormatBuffer, &pItem->FileExtension[1], &pItem->FileDescription[0], &pItem->FileDescription[0]);
-                    /* update dialog */
-                    SetDlgItemTextW(hwndDlg, 14007, Buffer);
-                }
-            }
+        case PSCB_INITIALIZED:
+        {
+            hIcon = LoadIconW(shell32_hInstance, MAKEINTRESOURCEW(IDI_SHELL_FOLDER_OPTIONS));
+            SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
             break;
+        }
     }
-
-    return FALSE;
+    return 0;
 }
 
-static
-VOID
+static VOID
 ShowFolderOptionsDialog(HWND hWnd, HINSTANCE hInst)
 {
     PROPSHEETHEADERW pinfo;
@@ -488,22 +243,36 @@ ShowFolderOptionsDialog(HWND hWnd, HINSTANCE hInst)
     if (hpage)
         hppages[num_pages++] = hpage;
 
-    szOptions[0] = L'\0';
-    LoadStringW(shell32_hInstance, IDS_FOLDER_OPTIONS, szOptions, sizeof(szOptions) / sizeof(WCHAR));
-    szOptions[(sizeof(szOptions)/sizeof(WCHAR))-1] = L'\0';
+    szOptions[0] = 0;
+    LoadStringW(shell32_hInstance, IDS_FOLDER_OPTIONS, szOptions, _countof(szOptions));
+    szOptions[_countof(szOptions) - 1] = 0;
+
+    // the stub window to hide taskbar button
+    DWORD style = WS_DISABLED | WS_CLIPSIBLINGS | WS_CAPTION;
+    DWORD exstyle = WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW;
+    CMSGlobalFolderOptionsStub stub;
+    if (!stub.Create(NULL, NULL, NULL, style, exstyle))
+    {
+        ERR("stub.Create failed\n");
+        return;
+    }
 
     memset(&pinfo, 0x0, sizeof(PROPSHEETHEADERW));
     pinfo.dwSize = sizeof(PROPSHEETHEADERW);
-    pinfo.dwFlags = PSH_NOCONTEXTHELP;
+    pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_USEICONID | PSH_USECALLBACK;
+    pinfo.hwndParent = stub;
     pinfo.nPages = num_pages;
     pinfo.phpage = hppages;
+    pinfo.pszIcon = MAKEINTRESOURCEW(IDI_SHELL_FOLDER_OPTIONS);
     pinfo.pszCaption = szOptions;
+    pinfo.pfnCallback = PropSheetProc;
 
     PropertySheetW(&pinfo);
+
+    stub.DestroyWindow();
 }
 
-static
-VOID
+static VOID
 Options_RunDLLCommon(HWND hWnd, HINSTANCE hInst, int fOptions, DWORD nCmdShow)
 {
     switch(fOptions)
@@ -511,11 +280,13 @@ Options_RunDLLCommon(HWND hWnd, HINSTANCE hInst, int fOptions, DWORD nCmdShow)
         case 0:
             ShowFolderOptionsDialog(hWnd, hInst);
             break;
+
         case 1:
             // show taskbar options dialog
             FIXME("notify explorer to show taskbar options dialog");
             //PostMessage(GetShellWindow(), WM_USER+22, fOptions, 0);
             break;
+
         default:
             FIXME("unrecognized options id %d\n", fOptions);
     }
@@ -524,7 +295,8 @@ Options_RunDLLCommon(HWND hWnd, HINSTANCE hInst, int fOptions, DWORD nCmdShow)
 /*************************************************************************
  *              Options_RunDLL (SHELL32.@)
  */
-EXTERN_C VOID WINAPI Options_RunDLL(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWORD nCmdShow)
+EXTERN_C VOID WINAPI
+Options_RunDLL(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWORD nCmdShow)
 {
     Options_RunDLLCommon(hWnd, hInst, StrToIntA(cmd), nCmdShow);
 }
@@ -532,7 +304,8 @@ EXTERN_C VOID WINAPI Options_RunDLL(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWOR
 /*************************************************************************
  *              Options_RunDLLA (SHELL32.@)
  */
-EXTERN_C VOID WINAPI Options_RunDLLA(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWORD nCmdShow)
+EXTERN_C VOID WINAPI
+Options_RunDLLA(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWORD nCmdShow)
 {
     Options_RunDLLCommon(hWnd, hInst, StrToIntA(cmd), nCmdShow);
 }
@@ -540,7 +313,8 @@ EXTERN_C VOID WINAPI Options_RunDLLA(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWO
 /*************************************************************************
  *              Options_RunDLLW (SHELL32.@)
  */
-EXTERN_C VOID WINAPI Options_RunDLLW(HWND hWnd, HINSTANCE hInst, LPCWSTR cmd, DWORD nCmdShow)
+EXTERN_C VOID WINAPI
+Options_RunDLLW(HWND hWnd, HINSTANCE hInst, LPCWSTR cmd, DWORD nCmdShow)
 {
     Options_RunDLLCommon(hWnd, hInst, StrToIntW(cmd), nCmdShow);
 }