- Add sorting page and show it if a language that supports multiple sorting methods...
authorEric Kohl <eric.kohl@reactos.org>
Sat, 8 Sep 2007 22:27:41 +0000 (22:27 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 8 Sep 2007 22:27:41 +0000 (22:27 +0000)
svn path=/trunk/; revision=28960

12 files changed:
reactos/dll/cpl/intl/generalp.c
reactos/dll/cpl/intl/intl.c
reactos/dll/cpl/intl/intl.h
reactos/dll/cpl/intl/intl.rbuild
reactos/dll/cpl/intl/lang/de-DE.rc
reactos/dll/cpl/intl/lang/en-US.rc
reactos/dll/cpl/intl/lang/it-IT.rc
reactos/dll/cpl/intl/lang/ru-RU.rc
reactos/dll/cpl/intl/lang/uk-UA.rc
reactos/dll/cpl/intl/misc.c
reactos/dll/cpl/intl/resource.h
reactos/dll/cpl/intl/sort.c [new file with mode: 0644]

index d20382e..75476f1 100644 (file)
@@ -367,7 +367,26 @@ GeneralPageProc(HWND hwndDlg,
                     break;
 
                 case IDC_SETUP_BUTTON:
-                    SetupApplet(hwndDlg, uMsg, wParam, lParam);
+                    {
+                        LCID NewLcid;
+                        INT iCurSel;
+
+                        iCurSel = SendMessage(hList,
+                                              CB_GETCURSEL,
+                                              0,
+                                              0);
+                        if (iCurSel == CB_ERR)
+                            break;
+
+                        NewLcid = SendMessage(hList,
+                                              CB_GETITEMDATA,
+                                              iCurSel,
+                                              0);
+                        if (NewLcid == (LCID)CB_ERR)
+                            break;
+
+                         SetupApplet(NewLcid);
+                    }
                     break;
             }
             break;
index 8bddcc1..16a2cf3 100644 (file)
@@ -52,7 +52,7 @@ APPLET Applets[NUM_APPLETS] =
 };
 
 
-VOID
+static VOID
 InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
 {
   ZeroMemory(psp, sizeof(PROPSHEETPAGE));
index 11de0c2..293b6fe 100644 (file)
@@ -19,8 +19,6 @@ extern DWORD IsUnattendedSetupEnabled;
 extern DWORD UnattendLCID;
 
 /* intl.c */
-VOID
-InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc);
 
 /* languages.c */
 INT_PTR CALLBACK
@@ -78,8 +76,15 @@ TimePageProc(HWND hwndDlg,
             WPARAM wParam,
             LPARAM lParam);
 
+/* sort.c */
+BOOL
+IsSortPageNeeded(LCID lcid);
 
-void SetNewLocale(LCID lcid);
+INT_PTR CALLBACK
+SortPageProc(HWND hwndDlg,
+             UINT uMsg,
+             WPARAM wParam,
+             LPARAM lParam);
 
 /* misc.c */
 LPTSTR
@@ -90,7 +95,7 @@ ReplaceSubStr(LPCTSTR szSourceStr, LPCTSTR szStrToReplace, LPCTSTR szTempl);
 
 LONG
 APIENTRY
-SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam);
+SetupApplet(LCID lcid);
 
 #endif /* __CPL_INTL_H */
 
index e65b466..1f304fd 100644 (file)
@@ -23,5 +23,6 @@
        <file>misc.c</file>
        <file>languages.c</file>
        <file>advanced.c</file>
+       <file>sort.c</file>
        <file>intl.rc</file>
 </module>
index 5e6b1ab..1773230 100644 (file)
@@ -173,6 +173,19 @@ BEGIN
     COMBOBOX IDC_LONGDATEFMT_COMBO, 77, 213, 153, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
 END
 
+
+IDD_SORTPAGE DIALOGEX 0, 0, 246, 234
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Sortierung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Sortierung", -1, 7, 7, 230, 74
+    LTEXT "Sorting methods define the sorting order of characters, words, files and folders.", -1, 14, 17, 220, 25
+    LTEXT "Select a sorting method for your language:", -1, 14, 37, 220, 22
+    COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
+END
+
+
 STRINGTABLE
 BEGIN
     IDS_CUSTOMIZE_TITLE "Regionale Einstellungen bearbeiten"
index 6abbe1f..76aeb62 100644 (file)
@@ -176,6 +176,19 @@ BEGIN
     COMBOBOX IDC_LONGDATEFMT_COMBO, 77, 213, 153, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
 END
 
+
+IDD_SORTPAGE DIALOGEX 0, 0, 246, 234
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Sorting"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Sorting", -1, 7, 7, 230, 74
+    LTEXT "Sorting methods define the sorting order of characters, words, files and folders.", -1, 14, 17, 220, 25
+    LTEXT "Select a sorting method for your language:", -1, 14, 37, 220, 22
+    COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
+END
+
+
 STRINGTABLE
 BEGIN
     IDS_CUSTOMIZE_TITLE "Customize Regional Options"
index fae80e4..0ac1714 100644 (file)
@@ -177,6 +177,19 @@ BEGIN
     COMBOBOX IDC_LONGDATEFMT_COMBO, 77, 213, 153, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
 END
 
+
+IDD_SORTPAGE DIALOGEX 0, 0, 246, 234
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Sorting"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Sorting", -1, 7, 7, 230, 74
+    LTEXT "Sorting methods define the sorting order of characters, words, files and folders.", -1, 14, 17, 220, 25
+    LTEXT "Select a sorting method for your language:", -1, 14, 37, 220, 22
+    COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
+END
+
+
 STRINGTABLE
 BEGIN
     IDS_CUSTOMIZE_TITLE "Opzioni internazionali e della lingua"
index 3fb1720..33facf2 100644 (file)
@@ -176,6 +176,19 @@ BEGIN
     COMBOBOX IDC_LONGDATEFMT_COMBO, 77, 213, 153, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
 END
 
+
+IDD_SORTPAGE DIALOGEX 0, 0, 246, 234
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Sorting"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Sorting", -1, 7, 7, 230, 74
+    LTEXT "Sorting methods define the sorting order of characters, words, files and folders.", -1, 14, 17, 220, 25
+    LTEXT "Select a sorting method for your language:", -1, 14, 37, 220, 22
+    COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
+END
+
+
 STRINGTABLE
 BEGIN
     IDS_CUSTOMIZE_TITLE "Íàñòðîéêà ðåãèîíàëüíûõ ïàðàìåòðîâ"
index 1af2b89..835aa3b 100644 (file)
@@ -182,6 +182,19 @@ BEGIN
     COMBOBOX IDC_LONGDATEFMT_COMBO, 77, 213, 153, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
 END
 
+
+IDD_SORTPAGE DIALOGEX 0, 0, 246, 234
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Sorting"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Sorting", -1, 7, 7, 230, 74
+    LTEXT "Sorting methods define the sorting order of characters, words, files and folders.", -1, 14, 17, 220, 25
+    LTEXT "Select a sorting method for your language:", -1, 14, 37, 220, 22
+    COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
+END
+
+
 STRINGTABLE
 BEGIN
     IDS_CUSTOMIZE_TITLE "Íàñòðîéêà ðåã³îíàëüíèõ ïàðàìåòð³â"
index f94aedb..8cfa9a2 100644 (file)
@@ -173,20 +173,29 @@ ReplaceSubStr(LPCTSTR szSourceStr,
     return szDestStr;
 }
 
+
+static VOID
+InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, LCID lcid)
+{
+  ZeroMemory(psp, sizeof(PROPSHEETPAGE));
+  psp->dwSize = sizeof(PROPSHEETPAGE);
+  psp->dwFlags = PSP_DEFAULT;
+  psp->hInstance = hApplet;
+  psp->pszTemplate = MAKEINTRESOURCE(idDlg);
+  psp->pfnDlgProc = DlgProc;
+  psp->lParam = (LPARAM)lcid;
+}
+
+
 /* Create applets */
 LONG
 APIENTRY
-SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam)
+SetupApplet(LCID lcid)
 {
-    PROPSHEETPAGE PsPage[NUM_SHEETS];
+    PROPSHEETPAGE PsPage[NUM_SHEETS + 1];
     PROPSHEETHEADER psh;
     TCHAR Caption[MAX_STR_SIZE];
 
-    UNREFERENCED_PARAMETER(lParam);
-    UNREFERENCED_PARAMETER(wParam);
-    UNREFERENCED_PARAMETER(uMsg);
-    UNREFERENCED_PARAMETER(hwnd);
-
     LoadString(hApplet, IDS_CUSTOMIZE_TITLE, Caption, sizeof(Caption) / sizeof(TCHAR));
 
     ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
@@ -196,14 +205,20 @@ SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam)
     psh.hInstance = hApplet;
     psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON));
     psh.pszCaption = Caption;
-    psh.nPages = sizeof(PsPage) / sizeof(PROPSHEETPAGE);
+    psh.nPages = (sizeof(PsPage) / sizeof(PROPSHEETPAGE)) - 1;
     psh.nStartPage = 0;
     psh.ppsp = PsPage;
 
-    InitPropSheetPage(&PsPage[0], IDD_NUMBERSPAGE, NumbersPageProc);
-    InitPropSheetPage(&PsPage[1], IDD_CURRENCYPAGE, CurrencyPageProc);
-    InitPropSheetPage(&PsPage[2], IDD_TIMEPAGE, TimePageProc);
-    InitPropSheetPage(&PsPage[3], IDD_DATEPAGE, DatePageProc);
+    InitPropSheetPage(&PsPage[0], IDD_NUMBERSPAGE, NumbersPageProc, lcid);
+    InitPropSheetPage(&PsPage[1], IDD_CURRENCYPAGE, CurrencyPageProc, lcid);
+    InitPropSheetPage(&PsPage[2], IDD_TIMEPAGE, TimePageProc, lcid);
+    InitPropSheetPage(&PsPage[3], IDD_DATEPAGE, DatePageProc, lcid);
+
+    if (IsSortPageNeeded(lcid))
+    {
+        psh.nPages++;
+        InitPropSheetPage(&PsPage[4], IDD_SORTPAGE, SortPageProc, lcid);
+    }
 
     return (LONG)(PropertySheet(&psh) != -1);
 }
index ce6c1db..0e63c6e 100644 (file)
@@ -71,6 +71,9 @@
 #define IDC_APPLY_CUR_USER_DEF_PROFILE 366
 #define IDC_CONV_TABLES 367
 
+#define IDD_SORTPAGE           400
+#define IDC_SORTLIST_COMBO     401
+
 #define IDS_CPLNAME                1000
 #define IDS_CPLDESCRIPTION     1001
 #define IDS_CUSTOMIZE_TITLE 1002
diff --git a/reactos/dll/cpl/intl/sort.c b/reactos/dll/cpl/intl/sort.c
new file mode 100644 (file)
index 0000000..c5ab621
--- /dev/null
@@ -0,0 +1,217 @@
+/* $Id$
+ *
+ * PROJECT:         ReactOS International Control Panel
+ * FILE:            dll/cpl/intl/sort.c
+ * PURPOSE:         Sorting property page
+ * PROGRAMMER:      Eric Kohl
+ */
+
+#include <windows.h>
+#include <commctrl.h>
+#include <cpl.h>
+#include <tchar.h>
+
+#include "intl.h"
+#include "resource.h"
+
+static BOOL bSortPage = FALSE;
+static LCID userLcid;
+
+static HWND hWndSortList = NULL;
+
+
+static BOOL CALLBACK
+SortTestEnumProc(LPTSTR lpLocale)
+{
+    LCID lcid;
+
+    lcid = _tcstoul(lpLocale, NULL, 16);
+
+    if ((LANGIDFROMLCID(lcid) == LANGIDFROMLCID(userLcid)) &&
+        (SORTIDFROMLCID(lcid) != SORTIDFROMLCID(userLcid)))
+        bSortPage = TRUE;
+
+    return TRUE;
+}
+
+
+BOOL
+IsSortPageNeeded(LCID lcid)
+{
+    /* Handle special case for Spanish (Spain) */
+    if (lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH), SORT_DEFAULT) ||
+        lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT))
+        return TRUE;
+
+    userLcid = lcid;
+    bSortPage = FALSE;
+
+    EnumSystemLocales(SortTestEnumProc, LCID_ALTERNATE_SORTS);
+
+    return bSortPage;
+}
+
+
+static BOOL CALLBACK
+SortEnumProc(LPTSTR lpLocale)
+{
+    LCID lcid;
+    TCHAR lang[255];
+    INT index;
+
+    lcid = _tcstoul(lpLocale, NULL, 16);
+
+    if ((LANGIDFROMLCID(lcid) == LANGIDFROMLCID(userLcid)) &&
+        (SORTIDFROMLCID(lcid) != SORTIDFROMLCID(userLcid)))
+    {
+        GetLocaleInfo(lcid, LOCALE_SSORTNAME, lang, sizeof(lang));
+
+        index = SendMessage(hWndSortList,
+                            CB_ADDSTRING,
+                            0,
+                            (LPARAM)lang);
+
+        SendMessage(hWndSortList,
+                    CB_SETITEMDATA,
+                    index,
+                    (LPARAM)lcid);
+    }
+
+    return TRUE;
+}
+
+static VOID
+CreateSortList(HWND hwnd, LCID lcid)
+{
+    TCHAR lang[255];
+    INT index;
+
+    hWndSortList = hwnd;
+
+    /* Handle special case for Spainish (Spain) */
+    if (lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH), SORT_DEFAULT) ||
+        lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT))
+    {
+        /* Add traditional sorting */
+        GetLocaleInfo(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH),
+                      LOCALE_SSORTNAME, lang, sizeof(lang));
+
+        index = SendMessage(hwnd,
+                            CB_ADDSTRING,
+                            0,
+                           (LPARAM)lang);
+
+        SendMessage(hwnd,
+                    CB_SETITEMDATA,
+                    index,
+                    (LPARAM)MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH));
+
+        /* Add modern sorting */
+        GetLocaleInfo(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN),
+                      LOCALE_SSORTNAME, lang, sizeof(lang));
+
+        index = SendMessage(hwnd,
+                            CB_ADDSTRING,
+                            0,
+                           (LPARAM)lang);
+
+        SendMessage(hwnd,
+                    CB_SETITEMDATA,
+                    index,
+                    (LPARAM)MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN));
+    }
+    else
+    {
+        userLcid = lcid;
+
+        GetLocaleInfo(lcid & 0xFFFF, LOCALE_SSORTNAME, lang, sizeof(lang));
+
+        index = SendMessage(hWndSortList,
+                            CB_ADDSTRING,
+                            0,
+                            (LPARAM)lang);
+
+        SendMessage(hWndSortList,
+                    CB_SETITEMDATA,
+                    index,
+                    (LPARAM)lcid & 0xFFFF);
+
+        EnumSystemLocales(SortEnumProc, LCID_ALTERNATE_SORTS);
+    }
+
+    /* Select current locale */
+    /* or should it be System and not user? */
+    GetLocaleInfo(lcid, LOCALE_SSORTNAME, lang, sizeof(lang));
+
+    SendMessage(hwnd,
+                CB_SELECTSTRING,
+                -1,
+                (LPARAM)lang);
+}
+
+/* Property page dialog callback */
+INT_PTR CALLBACK
+SortPageProc(HWND hwndDlg,
+             UINT uMsg,
+             WPARAM wParam,
+             LPARAM lParam)
+{
+    switch (uMsg)
+    {
+        case WM_INITDIALOG:
+            {
+              LCID lcid = (LCID)((LPPROPSHEETPAGE)lParam)->lParam;
+
+              CreateSortList(GetDlgItem(hwndDlg, IDC_SORTLIST_COMBO), lcid);
+            }
+            break;
+
+        case WM_COMMAND:
+            switch (LOWORD(wParam))
+            {
+                case IDC_SORTLIST_COMBO:
+                    if (HIWORD(wParam) == CBN_SELCHANGE)
+                    {
+                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                    }
+                    break;
+            }
+            break;
+
+        case WM_NOTIFY:
+            {
+                LPNMHDR lpnm = (LPNMHDR)lParam;
+
+                if (lpnm->code == (UINT)PSN_APPLY)
+                {
+
+                    LCID NewLcid;
+                    INT iCurSel;
+
+                    iCurSel = SendDlgItemMessage(hwndDlg,
+                                                 IDC_SORTLIST_COMBO,
+                                                 CB_GETCURSEL,
+                                                 0,
+                                                 0);
+                    if (iCurSel == CB_ERR)
+                        break;
+
+                    NewLcid = SendDlgItemMessage(hwndDlg,
+                                                 IDC_SORTLIST_COMBO,
+                                                 CB_GETITEMDATA,
+                                                 iCurSel,
+                                                 0);
+                    if (NewLcid == (LCID)CB_ERR)
+                        break;
+#if 0
+                    /* FIXME: Set locale ID */
+#endif
+                }
+            }
+            break;
+    }
+
+  return FALSE;
+}
+
+/* EOF */