Implemented a method where LANG_* strings can be referenced

by constant id's - reducing code overhead associated with
looking up the global strings variables.  Kind of.  Just compare
the assembly output...


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@685 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
eccles 2002-08-11 18:56:30 +00:00
parent adb237d9a1
commit ac00a53e1a
7 changed files with 347 additions and 280 deletions

View file

@ -14,7 +14,7 @@
* you wrote the original software. If you use this software in a product, an
* acknowledgment in the product documentation would be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
@ -39,14 +39,10 @@
#define LB_ICONHEIGHT 20
// Added by Amir Szekely 3rd August 2002
installer_strings *install_strings_tables;
installer_strings *cur_install_strings_table;
common_strings *common_strings_tables;
common_strings *cur_common_strings_table;
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
uninstall_strings *uninstall_strings_tables;
uninstall_strings *cur_uninstall_strings_table;
#endif
char *install_strings_tables; // installer_strings/uninstall_strings depending on installer type
char *cur_install_strings_table;
int g_quit_flag; // set when Quit has been called (meaning bail out ASAP)
@ -108,12 +104,12 @@ HWND m_curwnd;
static int m_whichcfg;
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
BOOL my_SetDlgItemText(HWND dlg, WORD id, int strtab) {
return SetDlgItemText(dlg,id,STR(strtab));
BOOL SetDlgItemTextFromLang(HWND dlg, WORD id, langid_t lid) {
return SetDlgItemText(dlg,id,STR(GetLangString(lid)));
}
BOOL SetUIText(HWND defhw, WORD def, WORD custom, int strtab) {
return my_SetDlgItemText(custom?g_hwnd:defhw,custom?custom:def,strtab);
BOOL SetUITextFromLang(HWND defhw, WORD def, WORD custom, langid_t lid) {
return SetDlgItemTextFromLang(custom?g_hwnd:defhw,custom?custom:def,lid);
}
// no tab
@ -147,7 +143,7 @@ static void SetChildrenStates(HWND hWnd, TV_ITEM *pItem, int iState) {
pItem->mask|=TVIF_PARAM;
TreeView_GetItem(hWnd, pItem);
if (pItem->state >> 12 == 0)
if (pItem->state >> 12 == 0)
return;
if (iState < 3 && (g_inst_section[pItem->lParam].default_state & DFS_RO)) l=3;
@ -185,8 +181,8 @@ static void SetParentState(HWND hWnd, TV_ITEM *pItem) {
pItem->hItem = hItem;
pItem->mask|=TVIF_PARAM;
TreeView_GetItem(hWnd, pItem);
iState = pItem->state >> 12;
if (iState && !(g_inst_section[pItem->lParam].default_state & DFS_RO))
iState = pItem->state >> 12;
if (iState && !(g_inst_section[pItem->lParam].default_state & DFS_RO))
{
if (iState==5) iState=2;
else if (iState==4) iState=1;
@ -215,7 +211,7 @@ static void CheckTreeItem(HWND hWnd, TV_ITEM *pItem, int checked) {
pItem->mask = TVIF_STATE|TVIF_PARAM;
TreeView_GetItem(hWnd, pItem);
if (pItem->state >> 12 == 0)
if (pItem->state >> 12 == 0)
return;
if (g_inst_section[pItem->lParam].default_state & DFS_RO) l=3;
@ -301,45 +297,41 @@ int ui_doinstall(void)
// Added by Amir Szekely 3rd August 2002
// Multilingual support
char pa=0;
int num=g_inst_header->str_tables_num;
LANGID user_lang=GetUserDefaultLangID();
int num=g_inst_header->common.str_tables_num;
LANGID user_lang=GetUserDefaultLangID(), lang_mask=~(LANGID)0;
int size=num*sizeof(common_strings);
cur_common_strings_table=common_strings_tables=(common_strings*)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_header->common.str_tables,(char*)common_strings_tables,size);
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
if (g_is_uninstaller) {
if (g_is_uninstaller)
size=num*sizeof(uninstall_strings);
cur_uninstall_strings_table=uninstall_strings_tables=(uninstall_strings*)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_uninstheader->str_tables,(char*)uninstall_strings_tables,size);
}
else
#endif
{
size=num*sizeof(installer_strings);
cur_install_strings_table=install_strings_tables=(installer_strings*)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_header->str_tables,(char*)install_strings_tables,size);
}
cur_install_strings_table=install_strings_tables=(char *)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_header->common.inst_str_tables,install_strings_tables,size);
lang_again:
for (size=0; size < num; size++) {
if (user_lang == common_strings_tables[size].lang_id) {
cur_install_strings_table+=size;
if (!((user_lang ^ common_strings_tables[size].lang_id) & lang_mask)) {
cur_common_strings_table+=size;
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
cur_uninstall_strings_table+=size;
if (g_is_uninstaller)
(uninstall_strings *)cur_install_strings_table+=size;
else
#endif
(installer_strings *)cur_install_strings_table+=size;
pa++;
break;
}
common_strings_tables[size].lang_id&=0x3ff; // primary lang
}
if (!pa) {
user_lang&=0x3ff; // primary lang
lang_mask=0x3ff; // primary lang
pa++;
goto lang_again;
}
}
process_string_fromtab(g_caption,COMMON_STR(caption));
process_string_from_lang(g_caption,LANGID_CAPTION);
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
#ifdef NSIS_CONFIG_SILENT_SUPPORT
@ -435,33 +427,33 @@ static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
if (uMsg == WM_INITDIALOG)
{
g_hwnd=hwndDlg;
my_SetDlgItemText(hwndDlg,IDC_VERSTR,LANG_BRANDING);
SetDlgItemTextFromLang(hwndDlg,IDC_VERSTR,LANGID_BRANDING);
hIcon=LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON2));
SetClassLong(hwndDlg,GCL_HICON,(long)hIcon);
my_SetDlgItemText(hwndDlg,IDCANCEL,LANG_BTN_CANCEL);
SetDlgItemTextFromLang(hwndDlg,IDCANCEL,LANGID_BTN_CANCEL);
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
if (!g_is_uninstaller)
#endif
my_SetDlgItemText(hwndDlg,IDC_BACK,LANG_BTN_BACK);
SetDlgItemTextFromLang(hwndDlg,IDC_BACK,LANGID_BTN_BACK);
ShowWindow(hwndDlg,SW_SHOW);
}
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
if (g_is_uninstaller)
{
islp=UNINSTALL_STR(uninstalltext)>=0;
islp=LANG_UNINST_TEXT>=0;
iscp++;
}
else
#endif//NSIS_CONFIG_UNINSTALL_SUPPORT
{
#ifdef NSIS_CONFIG_LICENSEPAGE
if (INSTALL_STR(licensedata)>=0) islp++;
if (LANG_LICENSE_DATA>=0) islp++;
#endif//NSIS_CONFIG_LICENSEPAGE
#ifdef NSIS_CONFIG_COMPONENTPAGE
if (INSTALL_STR(componenttext)>=0) iscp++;
if (LANG_COMP_TEXT>=0) iscp++;
#endif//NSIS_CONFIG_COMPONENTPAGE
if (INSTALL_STR(text)>=0) ispotentiallydp++;
if (LANG_DIR_TEXT>=0) ispotentiallydp++;
if (ispotentiallydp &&
!((g_inst_cmnheader->misc_flags&2) &&
is_valid_instpath(state_install_directory)
@ -509,19 +501,19 @@ static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
else if (!m_curwnd)
{
HWND hwndtmp;
my_SetDlgItemText(hwndDlg,IDOK,
(m_page == g_max_page) ? LANG_BTN_CLOSE :
SetDlgItemTextFromLang(hwndDlg,IDOK,
(m_page == g_max_page) ? LANGID_BTN_CLOSE :
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
g_is_uninstaller ? LANG_BTN_UNINST :
g_is_uninstaller ? LANGID_BTN_UNINST :
#endif
#ifdef NSIS_CONFIG_LICENSEPAGE
(m_page == 0) ? LANG_BTN_LICENSE :
(m_page == 0) ? LANGID_BTN_LICENSE :
#endif
(m_page == 2 || (m_page == 1 && !isdp)) ? LANG_BTN_INSTALL :
LANG_BTN_NEXT
(m_page == 2 || (m_page == 1 && !isdp)) ? LANGID_BTN_INSTALL :
LANGID_BTN_NEXT
);
lstrcpy(g_tmp,g_caption);
process_string_fromtab(g_tmp+lstrlen(g_tmp),LANG_SUBCAPTION(m_page));
process_string_from_lang(g_tmp+lstrlen(g_tmp),LANGID_SUBCAPTION(m_page));
SetWindowText(hwndDlg,g_tmp);
@ -608,7 +600,7 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
SendMessage(hwLicense,EM_SETBKGNDCOLOR,0,g_inst_header->license_bg);
SendMessage(hwLicense,EM_SETEVENTMASK,0,ENM_LINK);
SetWindowText(hwLicense,STR(LANG_LICENSE_DATA));
SetUIText(hwndDlg,IDC_INTROTEXT,g_inst_header->common.intro_text_id,LANG_LICENSE_TEXT);
SetUITextFromLang(hwndDlg,IDC_INTROTEXT,g_inst_header->common.intro_text_id,LANGID_LICENSE_TEXT);
}
else if (uMsg == WM_NOTIFY) {
ENLINK *enlink=(ENLINK *)lParam;
@ -644,8 +636,8 @@ static BOOL CALLBACK UninstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
{
if (uMsg == WM_INITDIALOG)
{
SetUIText(hwndDlg,IDC_INTROTEXT,g_inst_header->common.intro_text_id,LANG_UNINST_TEXT);
SetUIText(hwndDlg,IDC_UNINSTFROM,g_inst_uninstheader->uninst_subtext_id,LANG_UNINST_SUBTEXT);
SetUITextFromLang(hwndDlg,IDC_INTROTEXT,g_inst_header->common.intro_text_id,LANGID_UNINST_TEXT);
SetUITextFromLang(hwndDlg,IDC_UNINSTFROM,g_inst_uninstheader->uninst_subtext_id,LANGID_UNINST_SUBTEXT);
SetDlgItemText(hwndDlg,IDC_EDIT1,state_install_directory);
}
return 0;
@ -682,9 +674,9 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
}
#endif
SetDlgItemText(hwndDlg,IDC_DIR,state_install_directory);
SetUIText(hwndDlg,IDC_INTROTEXT,g_inst_header->common.intro_text_id,LANG_DIR_TEXT);
my_SetDlgItemText(hwndDlg,IDC_BROWSE,LANG_BTN_BROWSE);
SetUIText(hwndDlg,IDC_SELDIRTEXT,g_inst_header->dir_subtext_id,LANG_DIR_SUBTEXT);
SetUITextFromLang(hwndDlg,IDC_INTROTEXT,g_inst_header->common.intro_text_id,LANGID_DIR_TEXT);
SetDlgItemTextFromLang(hwndDlg,IDC_BROWSE,LANGID_BTN_BROWSE);
SetUITextFromLang(hwndDlg,IDC_SELDIRTEXT,g_inst_header->dir_subtext_id,LANGID_DIR_SUBTEXT);
SendMessage(hwndDlg,WM_IN_UPDATEMSG,0,0);
}
if (uMsg == WM_COMMAND)
@ -780,7 +772,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
// Added by Amir Szekely 24th July 2002
// Allows 'SpaceTexts none'
if (INSTALL_STR(spacerequired) >= 0) {
if (LANG_SPACE_REQ >= 0) {
lstrcpy(s,STR(LANG_SPACE_REQ));
inttosizestr(total,s);
SetUITextNT(hwndDlg,IDC_SPACEREQUIRED,g_inst_header->space_req_id,s);
@ -835,9 +827,9 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
hTreeItems=(HTREEITEM*)GlobalAlloc(GPTR,sizeof(HTREEITEM)*g_inst_header->num_sections);
hBMcheck1=LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
SetUIText(hwndDlg,IDC_INTROTEXT,g_inst_header->common.intro_text_id,LANG_COMP_TEXT);
SetUIText(hwndDlg,IDC_TEXT1,g_inst_header->com_subtext1_id,LANG_COMP_SUBTEXT(0));
SetUIText(hwndDlg,IDC_TEXT2,g_inst_header->com_subtext2_id,LANG_COMP_SUBTEXT(1));
SetUITextFromLang(hwndDlg,IDC_INTROTEXT,g_inst_header->common.intro_text_id,LANGID_COMP_TEXT);
SetUITextFromLang(hwndDlg,IDC_TEXT1,g_inst_header->com_subtext1_id,LANGID_COMP_SUBTEXT(0));
SetUITextFromLang(hwndDlg,IDC_TEXT2,g_inst_header->com_subtext2_id,LANGID_COMP_SUBTEXT(1));
oldTreeWndProc=GetWindowLong(hwndTree1,GWL_WNDPROC);
SetWindowLong(hwndTree1,GWL_WNDPROC,(DWORD)newTreeWndProc);
@ -845,7 +837,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
if (hImageList) ImageList_Destroy(hImageList);
hImageList = ImageList_Create(16,16, ILC_COLOR32, 4, 4);
ImageList_SetBkColor(hImageList, GetSysColor(COLOR_WINDOW));
ImageList_Add(hImageList,hBMcheck1,NULL);
TreeView_SetImageList(hwndTree1, hImageList, TVSIL_STATE);
@ -858,7 +850,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
}
else
{
for (m_num_insttypes = 0; m_num_insttypes < NSIS_MAX_INST_TYPES &&
for (m_num_insttypes = 0; m_num_insttypes < NSIS_MAX_INST_TYPES &&
g_inst_header->install_types_ptr[m_num_insttypes]>=0; m_num_insttypes ++)
{
SendMessage(hwndCombo1,CB_ADDSTRING,0,(LPARAM)GetStringFromStringTab(g_inst_header->install_types_ptr[m_num_insttypes]));
@ -973,20 +965,20 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
}
if (uMsg == WM_NOTIFY || uMsg == WM_TREEVIEW_KEYHACK)
{
LPNMHDR lpnmh = (LPNMHDR) lParam;
LPNMHDR lpnmh = (LPNMHDR) lParam;
if (uMsg == WM_TREEVIEW_KEYHACK || lpnmh->idFrom == IDC_TREE1)
{
if (uMsg == WM_TREEVIEW_KEYHACK || lpnmh->code == NM_CLICK)
if (uMsg == WM_TREEVIEW_KEYHACK || lpnmh->code == NM_CLICK)
{
TVHITTESTINFO ht = {0};
if (uMsg != WM_TREEVIEW_KEYHACK)
{
DWORD dwpos = GetMessagePos();
ht.pt.x = GET_X_LPARAM(dwpos);
ht.pt.y = GET_Y_LPARAM(dwpos);
MapWindowPoints(HWND_DESKTOP, hwndTree1, &ht.pt, 1);
TreeView_HitTest(hwndTree1, &ht);
}
else
@ -994,13 +986,13 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
ht.hItem=TreeView_GetSelection(hwndTree1);
if (ht.hItem) ht.flags=TVHT_ONITEMSTATEICON;
}
if ((TVHT_ONITEMSTATEICON|TVHT_ONITEMLABEL|TVHT_ONITEMRIGHT|TVHT_ONITEM) & ht.flags)
if ((TVHT_ONITEMSTATEICON|TVHT_ONITEMLABEL|TVHT_ONITEMRIGHT|TVHT_ONITEM) & ht.flags)
{
TVITEM hItem;
int image,wh;
hItem.hItem = ht.hItem;
hItem.mask = TVIF_STATE|TVIF_PARAM;
TreeView_GetItem(hwndTree1, &hItem);
@ -1124,7 +1116,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
ShowWindow(GetUIItem(hwndDlg,IDC_TEXT2,g_inst_header->com_subtext2_id),c);
}
if (INSTALL_STR(spacerequired) >= 0) {
if (LANG_SPACE_REQ >= 0) {
int x,total;
char s[128];
for (total=x=0; x < g_inst_header->num_sections; x ++)
@ -1145,9 +1137,9 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
int ui_st_updateflag=0x3;
void update_status_text_from_tab(int texttab, const char *text2)
void update_status_text_from_lang(langid_t id, const char *text2)
{
update_status_text(STR(texttab), text2);
update_status_text(STR(GetLangString(id)), text2);
}
void update_status_text(const char *text1, const char *text2)
@ -1290,8 +1282,8 @@ static BOOL CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
{
ShowWindow(g_hwnd,SW_SHOWNA);
lstrcpy(g_tmp,g_caption);
process_string_fromtab(g_tmp+lstrlen(g_caption),COMMON_STR(subcaptions[g_max_page+1]));
update_status_text_from_tab(LANG_COMPLETED,"");
process_string_from_lang(g_tmp+lstrlen(g_caption),LANGID_SUBCAPTION(g_max_page+1));
update_status_text_from_lang(LANGID_COMPLETED,"");
SetWindowText(g_hwnd,g_tmp);
SetFocus(h);
}