[WINHTTP] Sync with Wine Staging 3.9. CORE-14656
[reactos.git] / dll / cpl / intl / advanced.c
index 48a66bf..dd42d3f 100644 (file)
 #include "intl.h"
+#include <wingdi.h>
+
+#include <debug.h>
 
 typedef struct CPStruct
 {
-    WORD    Status;
-    UINT    CPage;
-    HANDLE  hCPage;
-    TCHAR   Name[MAX_PATH];
-    struct  CPStruct *NextItem;
-} CPAGE, *LPCPAGE;
-
-static LPCPAGE PCPage = NULL;
-static HINF hIntlInf;
+    UINT CodePage;
+    DWORD Flags;
+    WCHAR Name[MAX_PATH];
+    struct CPStruct *NextItem;
+} CPAGE, *PCPAGE;
+
+#define CODEPAGE_INSTALLED      0x00000001
+#define CODEPAGE_NOT_REMOVEABLE 0x00000002
+#define CODEPAGE_INSTALL        0x00000004
+#define CODEPAGE_REMOVE         0x00000008
+
+static PCPAGE PCPage = NULL;
 static BOOL bSpain = FALSE;
 static HWND hLangList;
 
 static BOOL
-GetSupportedCP(VOID)
+GetSupportedCP(
+    HINF hInf)
 {
-    UINT uiCPage, Number;
-    LONG Count;
-    INFCONTEXT infCont;
-    LPCPAGE lpCPage;
-    HANDLE hCPage;
+    WCHAR szSection[MAX_PATH];
+    INFCONTEXT Context, Context2;
+    PCPAGE pCodePage;
     CPINFOEX cpInfEx;
-    //TCHAR Section[MAX_PATH];
+    UINT uiCodePage;
 
-    Count = SetupGetLineCount(hIntlInf, _T("CodePages"));
-    if (Count <= 0) return FALSE;
+    if (!SetupFindFirstLine(hInf,
+                            L"CodePages",
+                            NULL,
+                            &Context))
+        return FALSE;
 
-    for (Number = 0; Number < (UINT)Count; Number++)
+    for (;;)
     {
-        if (SetupGetLineByIndex(hIntlInf, _T("CodePages"), Number, &infCont) &&
-            SetupGetIntField(&infCont, 0, (PINT)&uiCPage))
+        if (SetupGetIntField(&Context, 0, (PINT)&uiCodePage))
         {
-            if (!(hCPage = GlobalAlloc(GHND, sizeof(CPAGE)))) return FALSE;
+            pCodePage = HeapAlloc(GetProcessHeap(), 0, sizeof(CPAGE));
+            if (pCodePage == NULL)
+                return FALSE;
 
-            lpCPage            = GlobalLock(hCPage);
-            lpCPage->CPage     = uiCPage;
-            lpCPage->hCPage    = hCPage;
-            lpCPage->Status    = 0;
-            (lpCPage->Name)[0] = 0;
+            pCodePage->CodePage = uiCodePage;
+            pCodePage->Flags = 0;
+            (pCodePage->Name)[0] = UNICODE_NULL;
 
-            if (GetCPInfoEx(uiCPage, 0, &cpInfEx))
+            if (GetCPInfoExW(uiCodePage, 0, &cpInfEx))
             {
-                _tcscpy(lpCPage->Name, cpInfEx.CodePageName);
+                wcscpy(pCodePage->Name, cpInfEx.CodePageName);
             }
-            else if (!SetupGetStringField(&infCont, 1, lpCPage->Name, MAX_PATH, NULL))
+            else
             {
-                GlobalUnlock(hCPage);
-                GlobalFree(hCPage);
-                continue;
+                SetupGetStringFieldW(&Context, 1, pCodePage->Name, MAX_PATH, NULL);
             }
 
-            lpCPage->NextItem = PCPage;
-            PCPage = lpCPage;
+            if (wcslen(pCodePage->Name) != 0)
+            {
+                pCodePage->NextItem = PCPage;
+                PCPage = pCodePage;
+
+                wsprintf(szSection, L"CODEPAGE_REMOVE_%d", uiCodePage);
+
+                if ((uiCodePage == GetACP()) ||
+                    (uiCodePage == GetOEMCP()) ||
+                    (!SetupFindFirstLineW(hInf, szSection, L"AddReg", &Context2)))
+                {
+                    pCodePage->Flags |= CODEPAGE_NOT_REMOVEABLE;
+                }
+            }
+            else
+            {
+                HeapFree(GetProcessHeap(), 0, pCodePage);
+            }
         }
+
+        if (!SetupFindNextLine(&Context, &Context))
+            break;
     }
 
     return TRUE;
 }
 
 static BOOL CALLBACK
-InstalledCPProc(LPTSTR lpStr)
+InstalledCPProc(PWSTR lpStr)
 {
-    LPCPAGE lpCP;
+    PCPAGE lpCP;
     UINT uiCP;
 
     lpCP = PCPage;
-    uiCP = _ttol(lpStr);
+    uiCP = _wtol(lpStr);
 
     for (;;)
     {
-        if (!lpCP) break;
-        if (lpCP->CPage == uiCP)
+        if (!lpCP)
+            break;
+
+        if (lpCP->CodePage == uiCP)
         {
-            lpCP->Status |= 0x0001;
+            lpCP->Flags |= CODEPAGE_INSTALLED;
             break;
         }
+
         lpCP = lpCP->NextItem;
     }
 
@@ -86,17 +113,15 @@ InstalledCPProc(LPTSTR lpStr)
 static VOID
 InitCodePagesList(HWND hwndDlg)
 {
-    LPCPAGE lpCPage;
+    PCPAGE pCodePage;
     INT ItemIndex;
     HWND hList;
     LV_COLUMN column;
     LV_ITEM item;
     RECT ListRect;
+    HINF hIntlInf;
 
-    hList = GetDlgItem(hwndDlg, IDC_CONV_TABLES);
-
-    hIntlInf = SetupOpenInfFile(_T("intl.inf"), NULL, INF_STYLE_WIN4, NULL);
-
+    hIntlInf = SetupOpenInfFileW(L"intl.inf", NULL, INF_STYLE_WIN4, NULL);
     if (hIntlInf == INVALID_HANDLE_VALUE)
         return;
 
@@ -107,40 +132,46 @@ InitCodePagesList(HWND hwndDlg)
         return;
     }
 
-    if (!GetSupportedCP())
+    if (!GetSupportedCP(hIntlInf))
         return;
 
     SetupCloseInfFile(hIntlInf);
 
-    if (!EnumSystemCodePages(InstalledCPProc, CP_INSTALLED))
-        return;
+    if (!EnumSystemCodePagesW(InstalledCPProc, CP_INSTALLED))
+    {
+        /* Hack: EnumSystemCodePages returns FALSE on successful completion! */
+        /* return; */
+    }
+
+    hList = GetDlgItem(hwndDlg, IDC_CONV_TABLES);
 
     ZeroMemory(&column, sizeof(LV_COLUMN));
-    column.mask = LVCF_FMT|LVCF_TEXT|LVCF_WIDTH;
-    column.fmt  = LVCFMT_LEFT;
+    column.mask = LVCF_FMT | LVCF_WIDTH;
+    column.fmt = LVCFMT_LEFT;
     GetClientRect(hList, &ListRect);
-    column.cx   = ListRect.right - GetSystemMetrics(SM_CYHSCROLL);
-    (VOID) ListView_InsertColumn(hList, 0, &column);
+    column.cx = ListRect.right - GetSystemMetrics(SM_CYHSCROLL);
+    ListView_InsertColumn(hList, 0, &column);
 
-    (VOID) ListView_SetExtendedListViewStyle(hList, LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT);
+    (VOID) ListView_SetExtendedListViewStyle(hList, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
 
-    lpCPage = PCPage;
+    pCodePage = PCPage;
 
     for (;;)
     {
-        if (!lpCPage) break;
+        if (pCodePage == NULL)
+            break;
+
         ZeroMemory(&item, sizeof(LV_ITEM));
-        item.mask      = LVIF_TEXT|LVIF_PARAM|LVIF_STATE;
+        item.mask      = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
         item.state     = 0;
         item.stateMask = LVIS_STATEIMAGEMASK;
-        item.pszText   = lpCPage->Name;
-        item.lParam    = (LPARAM)lpCPage;
+        item.pszText   = pCodePage->Name;
+        item.lParam    = (LPARAM)pCodePage;
 
         ItemIndex = ListView_InsertItem(hList, &item);
-
-        if (ItemIndex >= 0)
+        if (ItemIndex != -1)
         {
-            if (lpCPage->Status & 0x0001)
+            if (pCodePage->Flags & CODEPAGE_INSTALLED)
             {
                 ListView_SetItemState(hList, ItemIndex,
                                       INDEXTOSTATEIMAGEMASK(LVIS_SELECTED),
@@ -154,26 +185,26 @@ InitCodePagesList(HWND hwndDlg)
             }
         }
 
-        lpCPage = lpCPage->NextItem;
+        pCodePage = pCodePage->NextItem;
     }
 }
 
 static BOOL CALLBACK
-LocalesEnumProc(LPTSTR lpLocale)
+LocalesEnumProc(PWSTR lpLocale)
 {
     LCID lcid;
-    TCHAR lang[255];
+    WCHAR lang[255];
     INT index;
     BOOL bNoShow = FALSE;
 
-    lcid = _tcstoul(lpLocale, NULL, 16);
+    lcid = wcstoul(lpLocale, NULL, 16);
 
     if (lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH), SORT_DEFAULT) ||
         lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT))
     {
         if (bSpain == FALSE)
         {
-            LoadString(hApplet, IDS_SPAIN, lang, 255);
+            LoadStringW(hApplet, IDS_SPAIN, lang, 255);
             bSpain = TRUE;
         }
         else
@@ -183,39 +214,41 @@ LocalesEnumProc(LPTSTR lpLocale)
     }
     else
     {
-        GetLocaleInfo(lcid, LOCALE_SLANGUAGE, lang, sizeof(lang)/sizeof(TCHAR));
+        GetLocaleInfoW(lcid, LOCALE_SLANGUAGE, lang, sizeof(lang)/sizeof(WCHAR));
     }
 
     if (bNoShow == FALSE)
     {
-    index = SendMessage(hLangList,
-                        CB_ADDSTRING,
-                        0,
-                        (LPARAM)lang);
-
-    SendMessage(hLangList,
-                CB_SETITEMDATA,
-                index,
-                (LPARAM)lcid);
+        index = SendMessageW(hLangList,
+                             CB_ADDSTRING,
+                             0,
+                             (LPARAM)lang);
+
+        SendMessageW(hLangList,
+                     CB_SETITEMDATA,
+                     index,
+                     (LPARAM)lcid);
     }
 
     return TRUE;
 }
 
 static VOID
-InitLanguagesList(HWND hwndDlg)
+InitLanguagesList(
+    HWND hwndDlg,
+    PGLOBALDATA pGlobalData)
 {
-    TCHAR langSel[255];
+    WCHAR langSel[255];
 
     hLangList = GetDlgItem(hwndDlg, IDC_LANGUAGE_COMBO);
 
     bSpain = FALSE;
-    EnumSystemLocales(LocalesEnumProc, LCID_SUPPORTED);
+    EnumSystemLocalesW(LocalesEnumProc, LCID_SUPPORTED);
 
     /* Select current locale */
-    GetLocaleInfo(GetUserDefaultLCID(), LOCALE_SLANGUAGE, langSel, sizeof(langSel)/sizeof(TCHAR));
+    GetLocaleInfoW(pGlobalData->SystemLCID, LOCALE_SLANGUAGE, langSel, sizeof(langSel)/sizeof(WCHAR));
 
-    SendMessage(hLangList, CB_SELECTSTRING, -1, (LPARAM)langSel);
+    SendMessageW(hLangList, CB_SELECTSTRING, -1, (LPARAM)langSel);
 }
 
 static VOID
@@ -224,44 +257,49 @@ GetCurrentDPI(LPTSTR szDPI)
     DWORD dwType, dwSize, dwDPI, dwDefDPI = 0x00000060; // Default 96 DPI
     HKEY hKey;
 
-    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontDPI"), 0, NULL,
-                       REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) != ERROR_SUCCESS)
+    if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontDPI", 0, NULL,
+                        REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) != ERROR_SUCCESS)
     {
-        _tcscpy(szDPI, _T("96"));
+        wcscpy(szDPI, L"96");
         return;
     }
 
     dwType = REG_DWORD;
     dwSize = sizeof(DWORD);
 
-    if (RegQueryValueEx(hKey, _T("LogPixels"), NULL, &dwType, (LPBYTE)&dwDPI, &dwSize) != ERROR_SUCCESS)
+    if (RegQueryValueExW(hKey, L"LogPixels", NULL, &dwType, (LPBYTE)&dwDPI, &dwSize) != ERROR_SUCCESS)
     {
-        if (RegSetValueEx(hKey, _T("LogPixels"), 0, REG_DWORD, (LPBYTE)&dwDefDPI, sizeof(DWORD)) == ERROR_SUCCESS)
+        if (RegSetValueExW(hKey, L"LogPixels", 0, REG_DWORD, (LPBYTE)&dwDefDPI, sizeof(DWORD)) == ERROR_SUCCESS)
         {
-            _tcscpy(szDPI, _T("96"));
+            wcscpy(szDPI, L"96");
             RegCloseKey(hKey);
             return;
         }
     }
-    else wsprintf(szDPI, _T("%d"), dwDPI);
+    else
+    {
+        wsprintf(szDPI, L"%d", dwDPI);
+    }
 
     RegCloseKey(hKey);
 }
 
+static
 VOID
-SetNonUnicodeLang(HWND hwnd, LCID lcid)
+SaveFontSubstitutionSettings(
+    HWND hwnd,
+    PGLOBALDATA pGlobalData)
 {
-    TCHAR szDefCP[5 + 1], szSection[MAX_PATH], szDPI[3 + 1];
+    WCHAR szDefCP[5 + 1], szSection[MAX_PATH], szDPI[3 + 1];
     HINF hFontInf;
     UINT Count;
 
-    GetLocaleInfo(MAKELCID(lcid, SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, szDefCP, sizeof(szDefCP) / sizeof(TCHAR));
+    GetLocaleInfoW(MAKELCID(pGlobalData->SystemLCID, SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, szDefCP, sizeof(szDefCP) / sizeof(WCHAR));
     GetCurrentDPI(szDPI);
 
-    wsprintf(szSection, _T("Font.CP%s.%s"), szDefCP, szDPI);
-
-    hFontInf = SetupOpenInfFile(_T("font.inf"), NULL, INF_STYLE_WIN4, NULL);
+    wsprintf(szSection, L"Font.CP%s.%s", szDefCP, szDPI);
 
+    hFontInf = SetupOpenInfFileW(L"font.inf", NULL, INF_STYLE_WIN4, NULL);
     if (hFontInf == INVALID_HANDLE_VALUE)
         return;
 
@@ -271,17 +309,115 @@ SetNonUnicodeLang(HWND hwnd, LCID lcid)
         return;
     }
 
-    Count = (UINT) SetupGetLineCount(hFontInf, szSection);
-    if (Count <= 0) return;
+    Count = (UINT)SetupGetLineCount(hFontInf, szSection);
+    if (Count <= 0)
+        return;
 
-    if (!SetupInstallFromInfSection(hwnd, hFontInf, szSection, SPINST_REGISTRY & ~SPINST_FILES,
-                                    NULL, NULL, 0, NULL, NULL, NULL, NULL))
-        MessageBox(hwnd, _T("Unable to install a new language for programs don't support unicode!"),
+    if (!SetupInstallFromInfSectionW(hwnd, hFontInf, szSection, SPINST_REGISTRY & ~SPINST_FILES,
+                                     NULL, NULL, 0, NULL, NULL, NULL, NULL))
+    {
+        MessageBoxW(hwnd, L"Unable to install a new language for programs don't support unicode!",
                    NULL, MB_ICONERROR | MB_OK);
+    }
 
     SetupCloseInfFile(hFontInf);
 }
 
+
+static
+VOID
+SaveFontLinkingSettings(
+    HWND hwnd,
+    PGLOBALDATA pGlobalData)
+{
+    /* TODO */
+}
+
+
+static
+VOID
+SaveSystemSettings(
+    PGLOBALDATA pGlobalData)
+{
+    WCHAR ACPPage[9];
+    WCHAR OEMPage[9];
+    HKEY langKey;
+    DWORD ret;
+    WCHAR value[5];
+    DWORD valuesize;
+
+    ret = GetLocaleInfoW(MAKELCID(pGlobalData->SystemLCID, SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, OEMPage, sizeof(OEMPage)/sizeof(WCHAR));
+    if (ret == 0)
+    {
+        PrintErrorMsgBox(IDS_ERROR_OEM_CODE_PAGE);
+        return;
+    }
+
+    ret = GetLocaleInfoW(MAKELCID(pGlobalData->SystemLCID, SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, ACPPage, sizeof(ACPPage)/sizeof(WCHAR));
+    if (ret == 0)
+    {
+        PrintErrorMsgBox(IDS_ERROR_ANSI_CODE_PAGE);
+        return;
+    }
+
+    /* Set codepages */
+    ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage", &langKey);
+    if (ret != ERROR_SUCCESS)
+    {
+        PrintErrorMsgBox(IDS_ERROR_NLS_CODE_REG);
+        return;
+    }
+
+    RegSetValueExW(langKey, L"OEMCP", 0, REG_SZ, (BYTE *)OEMPage, (wcslen(OEMPage) +1 ) * sizeof(WCHAR));
+    RegSetValueExW(langKey, L"ACP", 0, REG_SZ, (BYTE *)ACPPage, (wcslen(ACPPage) +1 ) * sizeof(WCHAR));
+
+    RegCloseKey(langKey);
+
+
+    wsprintf(value, L"%04hX", LANGIDFROMLCID(pGlobalData->SystemLCID));
+    valuesize = (wcslen(value) + 1) * sizeof(WCHAR);
+
+    /* Set language */
+    ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\NLS\\Language", &langKey);
+    if (ret != ERROR_SUCCESS)
+    {
+        PrintErrorMsgBox(IDS_ERROR_NLS_KEY_REG);
+        return;
+    }
+
+    RegSetValueExW(langKey, L"Default", 0, REG_SZ, (BYTE *)value, valuesize);
+    RegCloseKey(langKey);
+}
+
+
+LRESULT
+ListViewCustomDraw(
+    LPARAM lParam)
+{
+    LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
+
+    switch (lplvcd->nmcd.dwDrawStage)
+    {
+        case CDDS_PREPAINT:
+            return CDRF_NOTIFYITEMDRAW;
+
+        case CDDS_ITEMPREPAINT:
+            if (((PCPAGE)lplvcd->nmcd.lItemlParam)->Flags & CODEPAGE_NOT_REMOVEABLE)
+            {
+                lplvcd->clrText = GetSysColor(COLOR_GRAYTEXT);
+            }
+            else
+            {
+                lplvcd->clrText = GetSysColor(COLOR_WINDOWTEXT);
+            }
+            lplvcd->clrTextBk = GetSysColor(COLOR_WINDOW);
+            return CDRF_NEWFONT;
+    }
+
+    return CDRF_DODEFAULT;
+}
+
+
 /* Property page dialog callback */
 INT_PTR CALLBACK
 AdvancedPageProc(HWND hwndDlg,
@@ -289,52 +425,83 @@ AdvancedPageProc(HWND hwndDlg,
                  WPARAM wParam,
                  LPARAM lParam)
 {
-    switch(uMsg)
+    PGLOBALDATA pGlobalData;
+
+    pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
+
+    switch (uMsg)
     {
         case WM_INITDIALOG:
-        {
-            InitLanguagesList(hwndDlg);
+            pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam;
+            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
+
+            InitLanguagesList(hwndDlg, pGlobalData);
             InitCodePagesList(hwndDlg);
-        }
-        break;
+            break;
 
         case WM_COMMAND:
-        {
             switch (LOWORD(wParam))
             {
                 case IDC_LANGUAGE_COMBO:
-                {
                     if (HIWORD(wParam) == CBN_SELCHANGE)
-                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
-                }
-                break;
-            }
-        }
-        break;
+                    {
+                        LCID lcid;
+                        INT iIndex;
 
-        case WM_NOTIFY:
-        {
-            LPNMHDR lpnm = (LPNMHDR)lParam;
+                        iIndex = SendMessage(hLangList, CB_GETCURSEL, 0, 0);
+                        if (iIndex == CB_ERR)
+                            break;
 
-            if (lpnm->code == (UINT)PSN_APPLY)
-            {
-                LCID lcid;
-                INT iIndex;
+                        lcid = SendMessage(hLangList, CB_GETITEMDATA, iIndex, 0);
+                        if (lcid == (LCID)CB_ERR)
+                            break;
 
-                PropSheet_UnChanged(GetParent(hwndDlg), hwndDlg);
+                        pGlobalData->SystemLCID = lcid;
 
-                iIndex = SendMessage(hLangList, CB_GETCURSEL, 0, 0);
-                if (iIndex == CB_ERR)
+                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                    }
                     break;
 
-                lcid = SendMessage(hLangList, CB_GETITEMDATA, iIndex, 0);
-                if (lcid == (LCID)CB_ERR)
+                case IDC_APPLY_CUR_USER_DEF_PROFILE:
+                    if (HIWORD(wParam) == BN_CLICKED)
+                    {
+                        if (SendDlgItemMessageW(hwndDlg, IDC_APPLY_CUR_USER_DEF_PROFILE, BM_GETCHECK, 0, 0))
+                        {
+                            ResourceMessageBox(hwndDlg,
+                                               MB_OK | MB_ICONWARNING,
+                                               IDS_APPLY_DEFAULT_TITLE,
+                                               IDS_APPLY_DEFAULT_TEXT);
+                            pGlobalData->bApplyToDefaultUser = TRUE;
+                        }
+                        else
+                        {
+                            pGlobalData->bApplyToDefaultUser = FALSE;
+                        }
+
+                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                    }
                     break;
+            }
+            break;
 
-                SetNonUnicodeLang(hwndDlg, lcid);
+        case WM_NOTIFY:
+            if (((LPNMHDR)lParam)->code == PSN_APPLY)
+            {
+                PropSheet_UnChanged(GetParent(hwndDlg), hwndDlg);
+
+                SaveSystemSettings(pGlobalData);
+                SaveFontSubstitutionSettings(hwndDlg, pGlobalData);
+                SaveFontLinkingSettings(hwndDlg, pGlobalData);
             }
-        }
-        break;
+            else if (((LPNMHDR)lParam)->idFrom == IDC_CONV_TABLES &&
+                     ((LPNMHDR)lParam)->code == NM_CUSTOMDRAW)
+            {
+                SetWindowLongPtr(hwndDlg,
+                                 DWLP_MSGRESULT,
+                                 (LONG_PTR)ListViewCustomDraw(lParam));
+                return TRUE;
+            }
+            break;
     }
 
     return FALSE;