- enumerate all file types for folder options namespace applet
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 24 Jul 2008 21:26:36 +0000 (21:26 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 24 Jul 2008 21:26:36 +0000 (21:26 +0000)
- use mui string when available
- load the title from shell32 module base
- remove PSH_PROPTITLE flag

svn path=/trunk/; revision=34757

reactos/dll/win32/shell32/folder_options.c

index a85938b..e17cc3b 100644 (file)
@@ -80,6 +80,105 @@ FolderOptionsViewDlg(
     return FALSE;
 }
 
+VOID
+InitializeFileTypesListCtrlColumns(HWND hDlgCtrl)
+{
+    RECT clientRect;
+    LVCOLUMNW col;
+    WCHAR szName[50];
+
+    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)ListView_InsertColumnW(hDlgCtrl, 0, &col);
+}
+INT
+FindItem(HWND hDlgCtrl, WCHAR * ItemName)
+{
+    LVFINDINFOW findInfo;
+    ZeroMemory(&findInfo, sizeof(LVFINDINFOW));
+
+    findInfo.flags = LVFI_STRING;
+    findInfo.psz = ItemName;
+    return ListView_FindItem(hDlgCtrl, 0, &findInfo);
+}
+
+VOID
+InsertFileType(HWND hDlgCtrl, WCHAR * szName, DWORD Size, INT iItem)
+{
+    WCHAR szPath[100];
+    HKEY hKey;
+    LVITEMW lvItem;
+    DWORD dwSize;
+
+    if (FindItem(hDlgCtrl, szName) != -1)
+        return;
+
+    wcscpy(szPath, szName);
+    /* get the name */
+    if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szPath, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
+    {
+        if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", szName, Size, NULL, 0, NULL) != ERROR_SUCCESS)
+        {
+            dwSize = Size;
+            if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szName, &dwSize) != ERROR_SUCCESS)
+            {
+                wcscpy(szName, szPath);
+            }
+        }
+        RegCloseKey(hKey);
+        szName[(Size/sizeof(WCHAR))-1] = 0;
+    }
+    wcscat(szPath, L"\\shell");
+
+    ZeroMemory(&lvItem, sizeof(LVITEMW));
+    lvItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
+    lvItem.state = LVIS_SELECTED; 
+    lvItem.pszText = szName;
+    lvItem.iItem = iItem;
+
+    if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szPath, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
+    {
+        lvItem.lParam = 0;
+        (void)ListView_InsertItemW(hDlgCtrl, &lvItem);
+        RegCloseKey(hKey);
+    }
+}
+
+BOOL
+InitializeFileTypesListCtrl(HWND hwndDlg)
+{
+    HWND hDlgCtrl;
+    DWORD dwIndex = 0;
+    WCHAR szName[50];
+    DWORD dwName;
+    INT iItem = 0;
+
+
+    hDlgCtrl = GetDlgItem(hwndDlg, 14000);
+    InitializeFileTypesListCtrlColumns(hDlgCtrl);
+
+
+
+    dwName = sizeof(szName) / sizeof(WCHAR);
+
+    while(RegEnumKeyExW(HKEY_CLASSES_ROOT, dwIndex++, szName, &dwName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+    {
+        InsertFileType(hDlgCtrl, szName, sizeof(szName), iItem++);
+        dwName = sizeof(szName) / sizeof(WCHAR);
+    }
+    return TRUE;
+}
+
+
 INT_PTR
 CALLBACK
 FolderOptionsFileTypesDlg(
@@ -89,7 +188,12 @@ FolderOptionsFileTypesDlg(
     LPARAM lParam
 )
 {
-
+    switch(uMsg)
+    {
+        case WM_INITDIALOG:
+            InitializeFileTypesListCtrl(hwndDlg);
+            return TRUE;
+    }
 
 
     return FALSE;
@@ -102,7 +206,7 @@ ShowFolderOptionsDialog(HWND hWnd, HINSTANCE hInst)
     PROPSHEETHEADERW pinfo;
     HPROPSHEETPAGE hppages[3];
     HPROPSHEETPAGE hpage;
-       UINT num_pages = 0;
+    UINT num_pages = 0;
     WCHAR szOptions[100];
 
     hpage = SH_CreatePropertySheetPage("FOLDER_OPTIONS_GENERAL_DLG", FolderOptionsGeneralDlg, 0, NULL);
@@ -116,14 +220,14 @@ ShowFolderOptionsDialog(HWND hWnd, HINSTANCE hInst)
     hpage = SH_CreatePropertySheetPage("FOLDER_OPTIONS_FILETYPES_DLG", FolderOptionsFileTypesDlg, 0, NULL);
     if (hpage)
         hppages[num_pages++] = hpage;
-    
+
     szOptions[0] = L'\0';
-    LoadStringW(hInst, IDS_FOLDER_OPTIONS, szOptions, sizeof(szOptions) / sizeof(WCHAR));
-    szOptions[99] = L'\0';
-    
+    LoadStringW(shell32_hInstance, IDS_FOLDER_OPTIONS, szOptions, sizeof(szOptions) / sizeof(WCHAR));
+    szOptions[(sizeof(szOptions)/sizeof(WCHAR))-1] = L'\0';
+
     memset(&pinfo, 0x0, sizeof(PROPSHEETHEADERW));
     pinfo.dwSize = sizeof(PROPSHEETHEADERW);
-    pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE;
+    pinfo.dwFlags = PSH_NOCONTEXTHELP;
     pinfo.nPages = num_pages;
     pinfo.u3.phpage = hppages;
     pinfo.pszCaption = szOptions;