/*
 * PROJECT:         ReactOS International Control Panel
 * FILE:            dll/cpl/intl/sort.c
 * PURPOSE:         Sorting property page
 * PROGRAMMER:      Eric Kohl
 */

#include "intl.h"

static BOOL bSortPage = FALSE;
static LCID userLcid;

static HWND hWndSortList = NULL;


static BOOL CALLBACK
SortTestEnumProc(PWSTR lpLocale)
{
    LCID lcid;

    lcid = wcstoul(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;

    EnumSystemLocalesW(SortTestEnumProc, LCID_ALTERNATE_SORTS);

    return bSortPage;
}


static BOOL CALLBACK
SortEnumProc(LPTSTR lpLocale)
{
    LCID lcid;
    WCHAR lang[255];
    INT index;

    lcid = wcstoul(lpLocale, NULL, 16);

    if ((LANGIDFROMLCID(lcid) == LANGIDFROMLCID(userLcid)) &&
        (SORTIDFROMLCID(lcid) != SORTIDFROMLCID(userLcid)))
    {
        GetLocaleInfoW(lcid, LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(WCHAR));

        index = SendMessageW(hWndSortList,
                             CB_ADDSTRING,
                             0,
                             (LPARAM)lang);

        SendMessageW(hWndSortList,
                     CB_SETITEMDATA,
                     index,
                     (LPARAM)lcid);
    }

    return TRUE;
}

static VOID
CreateSortList(HWND hwnd, LCID lcid)
{
    WCHAR lang[255];
    INT index;

    hWndSortList = hwnd;

    /* 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))
    {
        /* Add traditional sorting */
        GetLocaleInfoW(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH),
                       LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(TCHAR));

        index = SendMessageW(hwnd,
                             CB_ADDSTRING,
                             0,
                             (LPARAM)lang);

        SendMessageW(hwnd,
                     CB_SETITEMDATA,
                     index,
                     (LPARAM)MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH));

        /* Add modern sorting */
        GetLocaleInfoW(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN),
                       LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(TCHAR));

        index = SendMessageW(hwnd,
                             CB_ADDSTRING,
                             0,
                             (LPARAM)lang);

        SendMessageW(hwnd,
                     CB_SETITEMDATA,
                     index,
                     (LPARAM)MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN));
    }
    else
    {
        userLcid = lcid;

        GetLocaleInfoW(lcid & 0xFFFF, LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(WCHAR));

        index = SendMessageW(hWndSortList,
                             CB_ADDSTRING,
                             0,
                             (LPARAM)lang);

        SendMessageW(hWndSortList,
                     CB_SETITEMDATA,
                     index,
                     (LPARAM)lcid & 0xFFFF);

        EnumSystemLocalesW(SortEnumProc, LCID_ALTERNATE_SORTS);
    }

    /* Select current locale */
    /* or should it be System and not user? */
    GetLocaleInfoW(lcid, LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(WCHAR));

    SendMessageW(hwnd,
                 CB_SELECTSTRING,
                 -1,
                 (LPARAM)lang);
}

/* Property page dialog callback */
INT_PTR CALLBACK
SortPageProc(HWND hwndDlg,
             UINT uMsg,
             WPARAM wParam,
             LPARAM lParam)
{
    PGLOBALDATA pGlobalData;

    pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);

    switch (uMsg)
    {
        case WM_INITDIALOG:
            pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam;
            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);

            CreateSortList(GetDlgItem(hwndDlg, IDC_SORTLIST_COMBO), pGlobalData->UserLCID);
            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:
            if (((LPNMHDR)lParam)->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;

                /* Save the new LCID */
                pGlobalData->UserLCID = NewLcid;
                pGlobalData->bUserLocaleChanged = TRUE;
            }
            break;
    }

  return FALSE;
}

/* EOF */