diff options
Diffstat (limited to 'Src/Winamp/setup/spage_lang.cpp')
-rw-r--r-- | Src/Winamp/setup/spage_lang.cpp | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/Src/Winamp/setup/spage_lang.cpp b/Src/Winamp/setup/spage_lang.cpp new file mode 100644 index 00000000..83282311 --- /dev/null +++ b/Src/Winamp/setup/spage_lang.cpp @@ -0,0 +1,293 @@ +#define APSTUDIO_READONLY_SYMBOLS +#include "main.h" +#include "./spage_lang.h" +#include "./setup_resource.h" +#include "../nu/ns_wc.h" +#include "./langutil.h" + +typedef struct _LANGREC +{ + LPWSTR pszFileName; + INT nType; +} LANGREC; + + +static BOOL CALLBACK AddLangToListBox(ENUMLANG *pel, LPVOID pUser); +static INT ListBox_FindLangFileIndex(HWND hwndLB, LPCWSTR pszLangPath); +static LPCWSTR ListBox_GetSelectedLang(HWND hwndLB, LPWSTR pszLangPath, INT cchLen); + + +setup_page_lang::setup_page_lang() : ref(1), hwnd(NULL) +{ + *szSelectionPath = 0x00; +} +setup_page_lang::~setup_page_lang() +{ +} + +size_t setup_page_lang::AddRef() +{ + return ++ref; +} + +size_t setup_page_lang::Release() +{ + if (1 == ref) + { + delete(this); + return 0; + } + return --ref; +} + +HRESULT setup_page_lang::GetName(bool bShort, const wchar_t **pszName) +{ + static wchar_t szName[64] = {0}; + *pszName = (*szName) ? szName : getStringW(IDS_PAGE_LANGUAGE, szName, sizeof(szName)/sizeof(wchar_t)); + return S_OK; +} + +HRESULT setup_page_lang::Save(HWND hwndText) +{ + if (S_FALSE == IsDirty()) return S_OK; + + if (!*szSelectionPath) *config_langpack = 0x00; + else + { + StringCbCopyW(config_langpack, sizeof(config_langpack), szSelectionPath); + } + config_save_langpack_var(); + return S_OK; +} + +HRESULT setup_page_lang::Revert(void) +{ + HRESULT hr(S_OK); + + if (*config_langpack) + { + StringCbCopyW(config_langpack, sizeof(szSelectionPath), config_langpack); + } + else szSelectionPath[0] = 0x00; + + if (hwnd) + { + HWND hwndLB = GetDlgItem(hwnd, IDC_LB_LANG); + INT index = ListBox_FindLangFileIndex(hwndLB, szSelectionPath); + if (LB_ERR == index && *szSelectionPath) index = ListBox_FindLangFileIndex(hwndLB, NULL); // find default embeded lang + SendMessageW(hwndLB, LB_SETCURSEL, (LB_ERR != index) ? index : 0, 0L); + } + return hr; +} + +HRESULT setup_page_lang::IsDirty(void) +{ + INT cr; + + cr = ComparePath(config_langpack, szSelectionPath, LANGDIR); + if (!cr) return E_UNEXPECTED; + + return (CSTR_EQUAL != cr) ? S_OK : S_FALSE; +} + +HRESULT setup_page_lang::Validate(void) +{ + return S_OK; +} + +HRESULT setup_page_lang::CreateView(HWND hwndParent, HWND *phwnd) +{ + *phwnd = WACreateDialogParam(MAKEINTRESOURCEW(IDD_SETUP_PAGE_LANG), hwndParent, ::DialogProc, (LPARAM)this); + return S_OK; +} + +void setup_page_lang::ListBox_OnSelChange(HWND hwndCtrl) +{ + ListBox_GetSelectedLang(hwndCtrl, szSelectionPath, sizeof(szSelectionPath)/sizeof(wchar_t)); +} + +void setup_page_lang::ListBox_OnItemDelete(DELETEITEMSTRUCT *pdis) +{ + LANGREC *pr = (LANGREC*)pdis->itemData; + if (pr) + { + if (pr->pszFileName) free(pr->pszFileName); + free(pr); + } +} + +INT_PTR setup_page_lang::OnInitDialog(HWND hwndFocus, LPARAM lParam) +{ + INT index; + HWND hwndLB; + hwndLB = GetDlgItem(hwnd, IDC_LB_LANG); + EnumerateLanguages(AddLangToListBox, hwndLB); + index = ListBox_FindLangFileIndex(hwndLB, szSelectionPath); + if (LB_ERR == index && *szSelectionPath) index = ListBox_FindLangFileIndex(hwndLB, NULL); // find default embeded lang + SendMessageW(hwndLB, LB_SETCURSEL, (LB_ERR != index) ? index : 0, 0L); + + PostMessageW(hwnd, WM_COMMAND, MAKEWPARAM(IDC_LB_LANG, LBN_SELCHANGE), (LPARAM)hwndLB); + return 0; +} + +void setup_page_lang::OnSize(UINT nType, INT cx, INT cy) +{ + HWND hwndCtrl; + RECT rw; + + hwndCtrl = GetDlgItem(hwnd, IDC_LBL_HEADER); + if (hwndCtrl) + { + GetWindowRect(hwndCtrl, &rw); + MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rw, 2); + SetWindowPos(hwndCtrl, NULL, 0, 0, cx - rw.left*2, rw.bottom - rw.top, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE); + } + hwndCtrl = GetDlgItem(hwnd, IDC_LB_LANG); + if (hwndCtrl) + { + + GetWindowRect(hwndCtrl, &rw); + MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rw, 2); + SetWindowPos(hwndCtrl, NULL, max(0, (cx - (rw.right - rw.left))/2), rw.top, rw.right - rw.left, cy - rw.top - 16, SWP_NOACTIVATE | SWP_NOZORDER); + } +} + +void setup_page_lang::OnCommand(INT nCtrlID, INT nEvntID, HWND hwndCtrl) +{ + switch(nCtrlID) + { + case IDC_LB_LANG: + switch(nEvntID) + { + case LBN_SELCHANGE: ListBox_OnSelChange(hwndCtrl); break; + } + break; + } +} + +INT_PTR setup_page_lang::OnDeleteItem(INT nCtrlID, DELETEITEMSTRUCT *pdis) +{ + switch(nCtrlID) + { + case IDC_LB_LANG: ListBox_OnItemDelete(pdis); return TRUE; + } + return 0; +} + +INT_PTR setup_page_lang::PageDlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: return OnInitDialog((HWND)wParam, lParam); + case WM_DESTROY: break; + case WM_SIZE: OnSize((UINT)wParam, LOWORD(lParam), HIWORD(lParam)); break; + case WM_COMMAND: OnCommand(LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; + } + return 0; +} + +static INT_PTR WINAPI DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + setup_page_lang *pInst = (setup_page_lang*)GetPropW(hwnd, L"SETUPPAGE"); + + switch(uMsg) + { + case WM_INITDIALOG: + pInst = (setup_page_lang*)lParam; + if (pInst) + { + pInst->hwnd = hwnd; + SetPropW(hwnd, L"SETUPPAGE", pInst); + } + break; + case WM_DESTROY: + if (pInst) + { + pInst->PageDlgProc(uMsg, wParam, lParam); + RemovePropW(hwnd, L"SETUPPAGE"); + pInst = NULL; + } + break; + } + + return (pInst) ? pInst->PageDlgProc(uMsg, wParam, lParam) : 0; +} + +static BOOL CALLBACK AddLangToListBox(ENUMLANG *pel, LPVOID pUser) +{ + INT index; + LANGREC *pr; + HWND hwndLB = (HWND)pUser; + if (!hwndLB) return FALSE; + + pr = (LANGREC*)calloc(1, sizeof(LANGREC)); + if (!pr) return FALSE; + pr->nType = pel->nType; + if (pel->pszFileName) pr->pszFileName = _wcsdup(pel->pszFileName); + + index = (INT)SendMessageW(hwndLB, LB_ADDSTRING, 0, (LPARAM)pel->pszName); + if (LB_ERR != index) SendMessageW(hwndLB, LB_SETITEMDATA, index, (LPARAM)pr); + else + { + if (pr->pszFileName) free(pr->pszFileName); + free(pr); + } + return TRUE; +} + +static INT ListBox_FindLangFileIndex(HWND hwndLB, LPCWSTR pszLangPath) +{ + int index, count; + + if (!hwndLB) return LB_ERR; + + index = LB_ERR; + + count = (INT)SendMessageW(hwndLB, LB_GETCOUNT, 0, 0L); + for (index = 0; index < count; index++) + { + LANGREC *pr = (LANGREC*) SendMessageW(hwndLB, LB_GETITEMDATA, index, 0L); + if (!pr || LB_ERR == (INT)(INT_PTR)pr) continue; + if (!pszLangPath || !*pszLangPath) + { + if (LANG_FILETYPE_EMBED == pr->nType && (!pr->pszFileName || !*pr->pszFileName)) break; + } + else + { + if (CSTR_EQUAL == ComparePath(pszLangPath, pr->pszFileName, LANGDIR)) break; + } + } + return (count == index) ? LB_ERR : index; +} + +static LPCWSTR ListBox_GetSelectedLang(HWND hwndLB, LPWSTR pszLangPath, INT cchLen) +{ + INT index; + LANGREC *pr; + if (!hwndLB || !pszLangPath) return NULL; + index = (INT)SendMessageW(hwndLB, LB_GETCURSEL, 0, 0L); + if (LB_ERR == index) return NULL; + pr = (LANGREC*)SendMessageW(hwndLB, LB_GETITEMDATA, index, 0L); + if (!pr || LB_ERR == (INT)(INT_PTR)pr) return NULL; + + if (!pr->pszFileName || !*pr->pszFileName) pszLangPath[0] = 0x00; + else if (S_OK != StringCchCopyW(pszLangPath, cchLen, pr->pszFileName)) return NULL; + return pszLangPath; +} + +#ifdef CBCLASS +#undef CBCLASS +#endif + +#define CBCLASS setup_page_lang +START_DISPATCH +CB(ADDREF, AddRef) +CB(RELEASE, Release) +CB(API_SETUPPAGE_GET_NAME, GetName) +CB(API_SETUPPAGE_CREATEVIEW, CreateView) +CB(API_SETUPPAGE_SAVE, Save) +CB(API_SETUPPAGE_REVERT, Revert) +CB(API_SETUPPAGE_ISDIRTY, IsDirty) +CB(API_SETUPPAGE_VALIDATE, Validate) +END_DISPATCH +#undef CBCLASS
\ No newline at end of file |