123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- #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
|