- Better RTL support:

* use RTL reading wherever possible (shows the dots, commas, etc. in the correct order)
  * Message boxes are now RTL too
  * Fixed RTL for links in InstallOptions
- Fixed tab order in StartMenu
- Made StartMenu use SHGetSpecialFolderLocation (soon to be in NSIS core too)


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3259 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-12-06 20:45:35 +00:00
parent 740ae21f2d
commit 4eb2881b5b
11 changed files with 186 additions and 158 deletions

View file

@ -566,8 +566,8 @@ int WINAPI ReadSettings(void) {
LRESULT WINAPI WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify) { LRESULT WINAPI WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify) {
switch (codeNotify) { switch (codeNotify) {
case BN_CLICKED: case BN_CLICKED:
{ {
char szBrowsePath[MAX_PATH]; char szBrowsePath[MAX_PATH];
int nIdx = FindControlIdx(id); int nIdx = FindControlIdx(id);
@ -659,8 +659,8 @@ LRESULT WINAPI WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify)
} }
} }
break; break;
} }
return 0; return 0;
} }
@ -691,61 +691,66 @@ BOOL CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara
return bRes; return bRes;
} }
BOOL CALLBACK cfgDlgProc(HWND hwndDlg, BOOL CALLBACK cfgDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{ {
switch (uMsg) switch (uMsg)
{ {
HANDLE_MSG(hwndDlg, WM_COMMAND, WMCommandProc); HANDLE_MSG(hwndDlg, WM_COMMAND, WMCommandProc);
case WM_DRAWITEM: case WM_DRAWITEM:
{ {
DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam; DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam;
int nIdx = FindControlIdx(lpdis->CtlID); int nIdx = FindControlIdx(lpdis->CtlID);
#ifdef IO_LINK_UNDERLINED #ifdef IO_LINK_UNDERLINED
HFONT OldFont; HFONT OldFont;
LOGFONT lf; LOGFONT lf;
#endif #endif
if (nIdx < 0) if (nIdx < 0)
break;
FieldType *pField = pFields + nIdx;
#ifdef IO_LINK_UNDERLINED
GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf);
lf.lfUnderline = TRUE;
OldFont = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf));
#endif
// Set up tranparent background
HBRUSH brush = (HBRUSH)GetWindowLong(lpdis->hwndItem, GWL_USERDATA);
if ( brush )
FillRect(lpdis->hDC, &lpdis->rcItem, brush);
if ( ( lpdis->itemState & ODS_FOCUS && lpdis->itemAction & ODA_DRAWENTIRE) || (lpdis->itemAction & ODA_FOCUS) ||
(lpdis->itemAction & ODA_SELECT))
DrawFocusRect(lpdis->hDC, &pField->rect);
SetTextColor(lpdis->hDC, (COLORREF)pField->hImage);
pField->rect = lpdis->rcItem;
// Calculate needed size of the control
DrawText(lpdis->hDC, pField->pszText, -1, &pField->rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT);
pField->rect.right += 4;
pField->rect.bottom = lpdis->rcItem.bottom;
// Resize but don't move
SetWindowPos(lpdis->hwndItem, NULL, 0, 0, pField->rect.right - pField->rect.left,
pField->rect.bottom - pField->rect.top, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
// Draw the text
lpdis->rcItem = pField->rect;
// Add little margin to avoid focus rect over text
lpdis->rcItem.right += 2; lpdis->rcItem.left += 2;
DrawText(lpdis->hDC, pField->pszText, -1, &lpdis->rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE );
#ifdef IO_LINK_UNDERLINED
DeleteObject(SelectObject(lpdis->hDC, OldFont));
#endif
break; break;
FieldType *pField = pFields + nIdx;
#ifdef IO_LINK_UNDERLINED
GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf);
lf.lfUnderline = TRUE;
OldFont = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf));
#endif
// We need lpdis->rcItem later
RECT rc = lpdis->rcItem;
// Get TxtColor unless the user has set another using SetCtlColors
if (!GetWindowLong(lpdis->hwndItem, GWL_USERDATA))
SetTextColor(lpdis->hDC, (COLORREF) pField->hImage);
// Calculate needed size of the control
DrawText(lpdis->hDC, pField->pszText, -1, &rc, DT_VCENTER | DT_SINGLELINE | DT_CALCRECT);
// Move rect to right if in RTL mode
if (bRTL)
{
rc.left += lpdis->rcItem.right - rc.right;
rc.right += lpdis->rcItem.right - rc.right;
}
// Make some more room so the focus rect won't cut letters off
rc.left = max(rc.left - 2, lpdis->rcItem.left);
rc.right = min(rc.right + 2, lpdis->rcItem.right);
/*rc.top = max(rc.top - 2, lpdis->rcItem.top);
rc.bottom = min(rc.bottom + 2, lpdis->rcItem.bottom);*/
// Draw the text
DrawText(lpdis->hDC, pField->pszText, -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE | (bRTL ? DT_RTLREADING : 0));
// Draw the focus rect if needed
if (((lpdis->itemState & ODS_FOCUS) && (lpdis->itemAction & ODA_DRAWENTIRE)) || (lpdis->itemAction & ODA_FOCUS) || (lpdis->itemAction & ODA_SELECT))
{
DrawFocusRect(lpdis->hDC, &rc);
}
#ifdef IO_LINK_UNDERLINED
DeleteObject(SelectObject(lpdis->hDC, OldFont));
#endif
break;
} }
case WM_CTLCOLORSTATIC: case WM_CTLCOLORSTATIC:
case WM_CTLCOLOREDIT: case WM_CTLCOLOREDIT:
@ -753,7 +758,7 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg,
case WM_CTLCOLORBTN: case WM_CTLCOLORBTN:
case WM_CTLCOLORLISTBOX: case WM_CTLCOLORLISTBOX:
{ {
ctlcolors *c = (ctlcolors *)GetWindowLong((HWND)lParam, GWL_USERDATA); ctlcolors *c = (ctlcolors *) GetWindowLong((HWND) lParam, GWL_USERDATA);
if (c) { if (c) {
SetBkMode((HDC)wParam, c->bkmode); SetBkMode((HDC)wParam, c->bkmode);
@ -766,7 +771,7 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg,
} }
} }
} }
return 0; return 0;
} }
#ifdef IO_ENABLE_LINK #ifdef IO_ENABLE_LINK
@ -908,47 +913,47 @@ int WINAPI createCfgDlg()
DEFAULT_STYLES /*| WS_TABSTOP*/, DEFAULT_STYLES /*| WS_TABSTOP*/,
DEFAULT_STYLES | SS_RIGHT /*| WS_TABSTOP*/, DEFAULT_STYLES | SS_RIGHT /*| WS_TABSTOP*/,
WS_EX_TRANSPARENT, WS_EX_TRANSPARENT,
WS_EX_TRANSPARENT }, WS_EX_TRANSPARENT | WS_EX_RTLREADING },
{ "STATIC", // FIELD_ICON { "STATIC", // FIELD_ICON
DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_ICON, DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_ICON,
DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_ICON, DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_ICON,
0, 0,
0 }, WS_EX_RTLREADING },
{ "STATIC", // FIELD_BITMAP { "STATIC", // FIELD_BITMAP
DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_BITMAP | SS_CENTERIMAGE, DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_BITMAP | SS_CENTERIMAGE,
DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_BITMAP | SS_CENTERIMAGE, DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_BITMAP | SS_CENTERIMAGE,
0, 0,
0 }, WS_EX_RTLREADING },
{ "BUTTON", // FIELD_BROWSEBUTTON { "BUTTON", // FIELD_BROWSEBUTTON
DEFAULT_STYLES | WS_TABSTOP, DEFAULT_STYLES | WS_TABSTOP,
DEFAULT_STYLES | WS_TABSTOP, DEFAULT_STYLES | WS_TABSTOP,
0, 0,
0 }, WS_EX_RTLREADING },
{ "BUTTON", // FIELD_CHECKBOX { "BUTTON", // FIELD_CHECKBOX
DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE, DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE,
DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT, DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT,
0, 0,
0 }, WS_EX_RTLREADING },
{ "BUTTON", // FIELD_RADIOBUTTON { "BUTTON", // FIELD_RADIOBUTTON
DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE, DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE,
DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT, DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT,
0, 0,
0 }, WS_EX_RTLREADING },
{ "EDIT", // FIELD_TEXT { "EDIT", // FIELD_TEXT
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL,
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE }, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_RTLREADING },
{ "EDIT", // FIELD_FILEREQUEST { "EDIT", // FIELD_FILEREQUEST
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL,
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE }, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_RTLREADING },
{ "EDIT", // FIELD_DIRREQUEST { "EDIT", // FIELD_DIRREQUEST
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL,
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE }, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_RTLREADING },
{ "COMBOBOX", // FIELD_COMBOBOX { "COMBOBOX", // FIELD_COMBOBOX
DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS, DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS,
DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS, DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS,
@ -963,17 +968,17 @@ int WINAPI createCfgDlg()
DEFAULT_STYLES | BS_GROUPBOX, DEFAULT_STYLES | BS_GROUPBOX,
DEFAULT_STYLES | BS_GROUPBOX | BS_RIGHT, DEFAULT_STYLES | BS_GROUPBOX | BS_RIGHT,
WS_EX_TRANSPARENT, WS_EX_TRANSPARENT,
WS_EX_TRANSPARENT }, WS_EX_TRANSPARENT | WS_EX_RTLREADING },
{ "BUTTON", // FIELD_LINK { "BUTTON", // FIELD_LINK
DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW, DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW,
DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW | BS_RIGHT, DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW | BS_RIGHT,
0, 0,
0 }, WS_EX_RTLREADING },
{ "BUTTON", // FIELD_BUTTON { "BUTTON", // FIELD_BUTTON
DEFAULT_STYLES | WS_TABSTOP, DEFAULT_STYLES | WS_TABSTOP,
DEFAULT_STYLES | WS_TABSTOP | BS_RIGHT, DEFAULT_STYLES | WS_TABSTOP,
0, 0,
0 } WS_EX_RTLREADING }
}; };
FieldType *pField = pFields + nIdx; FieldType *pField = pFields + nIdx;
@ -1233,12 +1238,12 @@ void WINAPI showCfgDlg()
g_done = g_NotifyField = 0; g_done = g_NotifyField = 0;
while (!g_done) { while (!g_done) {
MSG msg; MSG msg;
int nResult = GetMessage(&msg, NULL, 0, 0); int nResult = GetMessage(&msg, NULL, 0, 0);
if (!IsDialogMessage(hConfigWindow,&msg) && !IsDialogMessage(hMainWindow,&msg) && !TranslateMessage(&msg)) if (!IsDialogMessage(hConfigWindow,&msg) && !IsDialogMessage(hMainWindow,&msg) && !TranslateMessage(&msg))
DispatchMessage(&msg); DispatchMessage(&msg);
} }
// we don't save settings on cancel since that means your installer will likely // we don't save settings on cancel since that means your installer will likely
// quit soon, which means the ini might get flushed late and cause crap. :) anwyay. // quit soon, which means the ini might get flushed late and cause crap. :) anwyay.
@ -1325,7 +1330,7 @@ extern "C" BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lp
m_hInstance=(HINSTANCE) hInst; m_hInstance=(HINSTANCE) hInst;
if (ul_reason_for_call == DLL_THREAD_DETACH || ul_reason_for_call == DLL_PROCESS_DETACH) if (ul_reason_for_call == DLL_THREAD_DETACH || ul_reason_for_call == DLL_PROCESS_DETACH)
DestroyWindow(hConfigWindow); DestroyWindow(hConfigWindow);
return TRUE; return TRUE;
} }

View file

@ -37,9 +37,9 @@ Nullsoft Install System %s
# ^UnCompletedSubCaption # ^UnCompletedSubCaption
: ההסרה הושלמה : ההסרה הושלמה
# ^BackBtn # ^BackBtn
ה&קודם > < ה&קודם
# ^NextBtn # ^NextBtn
< ה&בא ה&בא >
# ^AgreeBtn # ^AgreeBtn
אני &מסכים אני &מסכים
# ^AcceptBtn # ^AcceptBtn
@ -55,7 +55,7 @@ Nullsoft Install System %s
# ^CloseBtn # ^CloseBtn
סגור& סגור&
# ^BrowseBtn # ^BrowseBtn
...&עיין &עיין...
# ^ShowDetailsBtn # ^ShowDetailsBtn
ה&צג פרטים ה&צג פרטים
# ^ClickNext # ^ClickNext
@ -85,31 +85,31 @@ Nullsoft Install System %s
# ^ComponentsText # ^ComponentsText
סמן את הרכיבים שברצונך להתקין ובטל את הסימון של רכיבים שאין ברצונך להתקין. $_CLICK סמן את הרכיבים שברצונך להתקין ובטל את הסימון של רכיבים שאין ברצונך להתקין. $_CLICK
# ^ComponentsSubText1 # ^ComponentsSubText1
:בחר סוג התקנה בחר סוג התקנה:
# ^ComponentsSubText2_NoInstTypes # ^ComponentsSubText2_NoInstTypes
:בחר רכיבים להתקנה בחר רכיבים להתקנה:
# ^ComponentsSubText2 # ^ComponentsSubText2
:או, בחר רכיבי רשות להתקנה או, בחר רכיבי רשות להתקנה:
# ^UnComponentsText # ^UnComponentsText
סמן את הרכיבים שברצונך להסיר ובטל את הסימון של רכיבים שאין ברצונך להסיר. $_CLICK סמן את הרכיבים שברצונך להסיר ובטל את הסימון של רכיבים שאין ברצונך להסיר. $_CLICK
# ^UnComponentsSubText1 # ^UnComponentsSubText1
:בחר סוג הסרה בחר סוג הסרה:
# ^UnComponentsSubText2_NoInstTypes # ^UnComponentsSubText2_NoInstTypes
:בחר רכיבים להסרה בחר רכיבים להסרה:
# ^UnComponentsSubText2 # ^UnComponentsSubText2
:או, בחר רכיבי רשות להסרה או, בחר רכיבי רשות להסרה:
# ^DirText # ^DirText
תוכנית זו תתקין את $(^Name) לתיקייה שלהלן. כדי להתקין לתיקייה אחרת, לחץ על 'עיין' ובחר תיקייה אחרת. $_CLICK תוכנית זו תתקין את $(^Name) לתיקייה שלהלן. כדי להתקין לתיקייה אחרת, לחץ על 'עיין' ובחר תיקייה אחרת. $_CLICK
# ^DirSubText # ^DirSubText
תיקיית יעד תיקיית יעד
# ^DirBrowseText # ^DirBrowseText
:בחר תיקייה להתקנת $(^Name) בחר תיקייה להתקנת $(^Name):
# ^UnDirText # ^UnDirText
תוכנית זו תסיר את $(^Name) מהתיקייה שלהלן. כדי להסיר מתיקייה אחרת, לחץ על 'עיין' ובחר תיקייה אחרת. $_CLICK תוכנית זו תסיר את $(^Name) מהתיקייה שלהלן. כדי להסיר מתיקייה אחרת, לחץ על 'עיין' ובחר תיקייה אחרת. $_CLICK
# ^UnDirSubText # ^UnDirSubText
"" ""
# ^UnDirBrowseText # ^UnDirBrowseText
:בחר תיקייה ממנה תוסר $(^Name) בחר תיקייה ממנה תוסר $(^Name):
# ^SpaceAvailable # ^SpaceAvailable
"מקום פנוי: " "מקום פנוי: "
# ^SpaceRequired # ^SpaceRequired
@ -117,7 +117,7 @@ Nullsoft Install System %s
# ^UninstallingText # ^UninstallingText
הסרת $(^Name) תתבצע מהתיקייה שלהלן. $_CLICK הסרת $(^Name) תתבצע מהתיקייה שלהלן. $_CLICK
# ^UninstallingSubText # ^UninstallingSubText
:מסיר מ מסיר מ:
# ^FileError # ^FileError
ארעה שגיאה בעת פתיחת קובץ לכתיבה:\r\n\t"$0"\r\nלחץ על ביטול כדי לבטל את ההתקנה,\r\nנסה שנית כדי לנסות לפתוח את הקובץ שוב, או\r\nהתעלם כדי לדלג על הקובץ ארעה שגיאה בעת פתיחת קובץ לכתיבה:\r\n\t"$0"\r\nלחץ על ביטול כדי לבטל את ההתקנה,\r\nנסה שנית כדי לנסות לפתוח את הקובץ שוב, או\r\nהתעלם כדי לדלג על הקובץ
# ^FileError_NoIgnore # ^FileError_NoIgnore
@ -183,8 +183,8 @@ Nullsoft Install System %s
# ^Byte # ^Byte
# ^Kilo # ^Kilo
ק " ק"
# ^Mega # ^Mega
מ " מ"
# ^Giga # ^Giga
ג " ג"

View file

@ -14,77 +14,77 @@
!define MUI_TEXT_WELCOME_INFO_TEXT "àùó æä éðçä àåúëí áîäìê ääú÷ðä ùì $(^Name).\r\n\r\nîåîìõ ìñâåø ëì úåëðéú àçøú ìôðé äúçìú ääú÷ðä. ôòåìä æå úàôùø ìàùó ìòãëï ÷áöé îòøëú ììà àéúçåì äîçùá.\r\n\r\n$_CLICK" !define MUI_TEXT_WELCOME_INFO_TEXT "àùó æä éðçä àåúëí áîäìê ääú÷ðä ùì $(^Name).\r\n\r\nîåîìõ ìñâåø ëì úåëðéú àçøú ìôðé äúçìú ääú÷ðä. ôòåìä æå úàôùø ìàùó ìòãëï ÷áöé îòøëú ììà àéúçåì äîçùá.\r\n\r\n$_CLICK"
!define MUI_TEXT_LICENSE_TITLE "äñëí øéùåé" !define MUI_TEXT_LICENSE_TITLE "äñëí øéùåé"
!define MUI_TEXT_LICENSE_SUBTITLE ". $(^Name) אנא עיין בתנאי הרשיון לפני התקנת" !define MUI_TEXT_LICENSE_SUBTITLE "אנא עיין בתנאי הרשיון לפני התקנת $(^Name)."
!define MUI_INNERTEXT_LICENSE_TOP ".בכדי לצפות בשאר הרשיון Page Down לחץ על" !define MUI_INNERTEXT_LICENSE_TOP "בכדי לצפות בשאר הרשיון לחץ על Page Down."
!define MUI_INNERTEXT_LICENSE_BOTTOM ".אם לא תסכים לתנאי הרשיון$(^Name) אם אתה מקבל את תנאי הרשיון, לחץ על 'אני מסכים' כדי להמשיך. לא תוכל להתקין את" !define MUI_INNERTEXT_LICENSE_BOTTOM "אם אתה מקבל את תנאי הרשיון, לחץ על 'אני מסכים' כדי להמשיך. אם לא תסכים לתנאי הרשיון לא תוכל להתקין את $(^Name)."
!define MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "$_CLICK .$(^Name) אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם בכדי להתקין את" !define MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם בכדי להתקין את $(^Name). $_CLICK"
!define MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "$_CLICK .$(^Name) אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם בכדי להתקין את" !define MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם בכדי להתקין את $(^Name). $_CLICK"
!define MUI_TEXT_COMPONENTS_TITLE "áçø øëéáéí" !define MUI_TEXT_COMPONENTS_TITLE "áçø øëéáéí"
!define MUI_TEXT_COMPONENTS_SUBTITLE ".ברצונך להתקין $(^Name) בחר אילו רכיבים של" !define MUI_TEXT_COMPONENTS_SUBTITLE "בחר אילו רכיבים של $(^Name) ברצונך להתקין."
!define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "úéàåø" !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "úéàåø"
!define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO ".העבר את העכבר מעל רכיב כלשהו בכדי לצפות בתיאורו" !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "העבר את העכבר מעל רכיב כלשהו בכדי לצפות בתיאורו."
!define MUI_TEXT_DIRECTORY_TITLE "áçø îé÷åí ìäú÷ðä" !define MUI_TEXT_DIRECTORY_TITLE "áçø îé÷åí ìäú÷ðä"
!define MUI_TEXT_DIRECTORY_SUBTITLE ".$(^Name) בחר את התיקייה בה אתה מעוניין להתקין את" !define MUI_TEXT_DIRECTORY_SUBTITLE "בחר את התיקייה בה אתה מעוניין להתקין את $(^Name)."
!define MUI_TEXT_INSTALLING_TITLE "îú÷éï" !define MUI_TEXT_INSTALLING_TITLE "îú÷éï"
!define MUI_TEXT_INSTALLING_SUBTITLE ".מותקן $(^Name) -אנא המתן בזמן ש " !define MUI_TEXT_INSTALLING_SUBTITLE "אנא המתן בזמן ש-$(^Name) מותקן."
!define MUI_TEXT_FINISH_TITLE "ääú÷ðä äåùìîä" !define MUI_TEXT_FINISH_TITLE "ääú÷ðä äåùìîä"
!define MUI_TEXT_FINISH_SUBTITLE ".ההתקנה הושלמה במלואה" !define MUI_TEXT_FINISH_SUBTITLE "ההתקנה הושלמה במלואה."
!define MUI_TEXT_ABORT_TITLE "ääú÷ðä áåèìä" !define MUI_TEXT_ABORT_TITLE "ääú÷ðä áåèìä"
!define MUI_TEXT_ABORT_SUBTITLE ".ההתקנה לא הושלמה המלואה" !define MUI_TEXT_ABORT_SUBTITLE "ההתקנה לא הושלמה המלואה."
!define MUI_BUTTONTEXT_FINISH "&ñééí" !define MUI_BUTTONTEXT_FINISH "&ñééí"
!define MUI_TEXT_FINISH_INFO_TITLE "$(^Name) משלים את אשף ההתקנה של" !define MUI_TEXT_FINISH_INFO_TITLE "משלים את אשף ההתקנה של $(^Name)"
!define MUI_TEXT_FINISH_INFO_TEXT "הותקן בהצלחה $(^Name)\r\n\r\nלחץ על סיום בכדי .לסגור את האשף" !define MUI_TEXT_FINISH_INFO_TEXT "$(^Name) הותקן בהצלחה.\r\n\r\nלחץ על סיום בכדי לסגור את האשף."
!define MUI_TEXT_FINISH_INFO_REBOOT "?האם ברצונך לאתחל כעת .$(^Name) עלייך לאתחל את המחשב בכדי לסיים את התקנת" !define MUI_TEXT_FINISH_INFO_REBOOT "עלייך לאתחל את המחשב בכדי לסיים את התקנת $(^Name). האם ברצונך לאתחל כעת?"
!define MUI_TEXT_FINISH_REBOOTNOW "àúçì ëòú" !define MUI_TEXT_FINISH_REBOOTNOW "àúçì ëòú"
!define MUI_TEXT_FINISH_REBOOTLATER "áøöåðé ìàúçì éãðéú îàåçø éåúø" !define MUI_TEXT_FINISH_REBOOTLATER "áøöåðé ìàúçì éãðéú îàåçø éåúø"
!define MUI_TEXT_FINISH_RUN "$(^Name) &הרץ את" !define MUI_TEXT_FINISH_RUN "&הרץ את $(^Name)"
!define MUI_TEXT_FINISH_SHOWREADME "'&äöâ îñîê '÷øà àåúé" !define MUI_TEXT_FINISH_SHOWREADME "'&äöâ îñîê '÷øà àåúé"
!define MUI_TEXT_STARTMENU_TITLE "áçø úé÷ééä áúôøéè äúçì" !define MUI_TEXT_STARTMENU_TITLE "áçø úé÷ééä áúôøéè äúçì"
!define MUI_TEXT_STARTMENU_SUBTITLE ".בחר בתיקיית תפריט התחל בכדי לשים בה את קיצורי הדרך של התוכנית" !define MUI_TEXT_STARTMENU_SUBTITLE "בחר בתיקיית תפריט התחל בכדי לשים בה את קיצורי הדרך של התוכנית."
!define MUI_INNERTEXT_STARTMENU_TOP ".בחר בתיקייה בתפריט התחל בה ברצונך למקם את קיצורי הדרך עבור התוכנית. באפשרותך גם להקיש את שם התיקייה בכדי ליצור תיקייה חדשה" !define MUI_INNERTEXT_STARTMENU_TOP "בחר בתיקייה בתפריט התחל בה ברצונך למקם את קיצורי הדרך עבור התוכנית. באפשרותך גם להקיש את שם התיקייה בכדי ליצור תיקייה חדשה."
!define MUI_INNERTEXT_STARTMENU_CHECKBOX "àì úéöåø ÷éöåøé ãøê" !define MUI_INNERTEXT_STARTMENU_CHECKBOX "àì úéöåø ÷éöåøé ãøê"
!define MUI_TEXT_ABORTWARNING "?$(^Name) האם אתה בטוח שברצונך לצאת מהתקנת המוצר" !define MUI_TEXT_ABORTWARNING "האם אתה בטוח שברצונך לצאת מהתקנת $(^Name)?"
!define MUI_UNTEXT_WELCOME_INFO_TITLE "áøåëéí äáàéí ìàùó ääñøä ùì $(^Name)" !define MUI_UNTEXT_WELCOME_INFO_TITLE "áøåëéí äáàéí ìàùó ääñøä ùì $(^Name)"
!define MUI_UNTEXT_WELCOME_INFO_TEXT "àùó æä éðçä àåúëí áîäìê ääñøä ùì $(^Name).\r\n\r\nîåîìõ ìñâåø ëì úåëðéú àçøú ìôðé äúçìú ääú÷ðä. ôòåìä æå úàôùø ìàùó ìòãëï ÷áöé îòøëú ììà àéúçåì äîçùá.\r\n\r\n$_CLICK" !define MUI_UNTEXT_WELCOME_INFO_TEXT "àùó æä éðçä àåúëí áîäìê ääñøä ùì $(^Name).\r\n\r\nîåîìõ ìñâåø ëì úåëðéú àçøú ìôðé äúçìú ääú÷ðä. ôòåìä æå úàôùø ìàùó ìòãëï ÷áöé îòøëú ììà àéúçåì äîçùá.\r\n\r\n$_CLICK"
!define MUI_UNTEXT_CONFIRM_TITLE "$(^Name) הסר את" !define MUI_UNTEXT_CONFIRM_TITLE "הסר את $(^Name)"
!define MUI_UNTEXT_CONFIRM_SUBTITLE ".מהמחשב $(^Name) הסר את" !define MUI_UNTEXT_CONFIRM_SUBTITLE "הסר את $(^Name) מהמחשב."
!define MUI_UNTEXT_LICENSE_TITLE "äñëí øéùåé" !define MUI_UNTEXT_LICENSE_TITLE "äñëí øéùåé"
!define MUI_UNTEXT_LICENSE_SUBTITLE ". $(^Name) אנא עיין בתנאי הרשיון לפני הסרת" !define MUI_UNTEXT_LICENSE_SUBTITLE "אנא עיין בתנאי הרשיון לפני הסרת $(^Name)."
!define MUI_UNINNERTEXT_LICENSE_BOTTOM ".אם לא תסכים לתנאי הרשיון$(^Name) אם אתה מקבל את תנאי הרשיון, לחץ על 'אני מסכים' כדי להמשיך. לא תוכל להסיר את" !define MUI_UNINNERTEXT_LICENSE_BOTTOM "אם אתה מקבל את תנאי הרשיון, לחץ על 'אני מסכים' כדי להמשיך. אם לא תסכים לתנאי הרשיון לא תוכל להסיר את $(^Name)."
!define MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "$_CLICK .$(^Name) אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם בכדי להסיר את" !define MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם בכדי להסיר את $(^Name). $_CLICK"
!define MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "$_CLICK .$(^Name) אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם בכדי להסיר את" !define MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם בכדי להסיר את $(^Name). $_CLICK"
!define MUI_UNTEXT_COMPONENTS_TITLE "áçø øëéáéí" !define MUI_UNTEXT_COMPONENTS_TITLE "áçø øëéáéí"
!define MUI_UNTEXT_COMPONENTS_SUBTITLE ".ברצונך להסיר $(^Name) בחר אילו תכונות של" !define MUI_UNTEXT_COMPONENTS_SUBTITLE "בחר אילו תכונות של $(^Name) ברצונך להסיר."
!define MUI_UNTEXT_DIRECTORY_TITLE "áçø îé÷åí ìäñøä" !define MUI_UNTEXT_DIRECTORY_TITLE "áçø îé÷åí ìäñøä"
!define MUI_UNTEXT_DIRECTORY_SUBTITLE ".$(^Name) בחר את התיקייה ממנה אתה מעוניין להסיר את" !define MUI_UNTEXT_DIRECTORY_SUBTITLE "בחר את התיקייה ממנה אתה מעוניין להסיר את $(^Name)."
!define MUI_UNTEXT_UNINSTALLING_TITLE "îñéø" !define MUI_UNTEXT_UNINSTALLING_TITLE "îñéø"
!define MUI_UNTEXT_UNINSTALLING_SUBTITLE ".מוסר מהמחשב $(^Name) אנא המתן בזמן ש-" !define MUI_UNTEXT_UNINSTALLING_SUBTITLE "אנא המתן בזמן ש-$(^Name) מוסר מהמחשב."
!define MUI_UNTEXT_FINISH_TITLE "ääñøä äåùìîä" !define MUI_UNTEXT_FINISH_TITLE "ääñøä äåùìîä"
!define MUI_UNTEXT_FINISH_SUBTITLE ".ההסרה הושלמה במלואה" !define MUI_UNTEXT_FINISH_SUBTITLE "ההסרה הושלמה במלואה."
!define MUI_UNTEXT_ABORT_TITLE "ääñøä áåèìä" !define MUI_UNTEXT_ABORT_TITLE "ääñøä áåèìä"
!define MUI_UNTEXT_ABORT_SUBTITLE ".ההסרה לא הושלמה במלואה" !define MUI_UNTEXT_ABORT_SUBTITLE "ההסרה לא הושלמה במלואה."
!define MUI_UNTEXT_FINISH_INFO_TITLE "$(^Name) משלים את אשף ההסרה של" !define MUI_UNTEXT_FINISH_INFO_TITLE "משלים את אשף ההסרה של $(^Name)"
!define MUI_UNTEXT_FINISH_INFO_TEXT "הותקן בהצלחה $(^Name)\r\n\r\nלחץ על סיום בכדי .לסגור את האשף" !define MUI_UNTEXT_FINISH_INFO_TEXT "$(^Name) הוסר בהצלחה.\r\n\r\nלחץ על סיום בכדי לסגור את האשף."
!define MUI_UNTEXT_FINISH_INFO_REBOOT "?האם ברצונך לאתחל כעת .$(^Name) עלייך לאתחל את המחשב בכדי לסיים את הסרת" !define MUI_UNTEXT_FINISH_INFO_REBOOT "עלייך לאתחל את המחשב בכדי לסיים את הסרת $(^Name). האם ברצונך לאתחל כעת?"
!define MUI_UNTEXT_ABORTWARNING "?$(^Name) האם אתה בטוח שברצונך לצאת מהסרת" !define MUI_UNTEXT_ABORTWARNING "האם אתה בטוח שברצונך לצאת מהסרת $(^Name)?"
!insertmacro MUI_LANGUAGEFILE_END !insertmacro MUI_LANGUAGEFILE_END

View file

@ -1,4 +1,5 @@
#include <windows.h> #include <windows.h>
#include <shlobj.h>
#include "../exdll/exdll.h" #include "../exdll/exdll.h"
#include "resource.h" #include "resource.h"
@ -9,7 +10,7 @@ HWND hwChild;
HWND g_hwStartMenuSelect; HWND g_hwStartMenuSelect;
HWND g_hwDirList; HWND g_hwDirList;
char buf[MAX_PATH]; char buf[1024];
char text[1024]; char text[1024];
char progname[1024]; char progname[1024];
char lastused[1024]; char lastused[1024];
@ -24,7 +25,7 @@ void *lpWndProcOld;
BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK ParentWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK ParentWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void AddFolderFromReg(HKEY rootKey); void AddFolderFromReg(int nFolder);
void __declspec(dllexport) Select(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) void __declspec(dllexport) Select(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)
{ {
@ -125,7 +126,7 @@ static BOOL CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARA
y_offset, \ y_offset, \
cx, \ cx, \
cy, \ cy, \
SWP_NOACTIVATE \ SWP_NOACTIVATE | SWP_NOZORDER \
); \ ); \
\ \
y_offset += cy + 5; y_offset += cy + 5;
@ -182,14 +183,24 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (rtl) if (rtl)
{ {
long s; long s;
s = GetWindowLong(hwText, GWL_STYLE); s = GetWindowLong(hwText, GWL_STYLE);
SetWindowLong(hwText, GWL_STYLE, (s & ~SS_LEFT) | SS_RIGHT); SetWindowLong(hwText, GWL_STYLE, (s & ~SS_LEFT) | SS_RIGHT);
s = GetWindowLong(hwText, GWL_EXSTYLE);
SetWindowLong(hwText, GWL_EXSTYLE, s | WS_EX_RTLREADING);
s = GetWindowLong(hwLocation, GWL_STYLE); s = GetWindowLong(hwLocation, GWL_STYLE);
SetWindowLong(hwLocation, GWL_STYLE, (s & ~ES_LEFT) | ES_RIGHT); SetWindowLong(hwLocation, GWL_STYLE, (s & ~ES_LEFT) | ES_RIGHT);
s = GetWindowLong(hwLocation, GWL_EXSTYLE);
SetWindowLong(hwLocation, GWL_EXSTYLE, s | WS_EX_RTLREADING);
s = GetWindowLong(hwDirList, GWL_EXSTYLE); s = GetWindowLong(hwDirList, GWL_EXSTYLE);
SetWindowLong(hwDirList, GWL_EXSTYLE, s | WS_EX_RIGHT | WS_EX_RTLREADING); SetWindowLong(hwDirList, GWL_EXSTYLE, s | WS_EX_RIGHT | WS_EX_RTLREADING);
s = GetWindowLong(hwCheckBox, GWL_STYLE); s = GetWindowLong(hwCheckBox, GWL_STYLE);
SetWindowLong(hwCheckBox, GWL_STYLE, s | BS_RIGHT | BS_LEFTTEXT); SetWindowLong(hwCheckBox, GWL_STYLE, s | BS_RIGHT | BS_LEFTTEXT);
s = GetWindowLong(hwCheckBox, GWL_EXSTYLE);
SetWindowLong(hwCheckBox, GWL_EXSTYLE, s | WS_EX_RTLREADING);
} }
if (!noicon) if (!noicon)
@ -211,7 +222,7 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
0, 0,
temp_r.right, temp_r.right,
temp_r.bottom, temp_r.bottom,
SWP_NOACTIVATE | (noicon ? SWP_HIDEWINDOW : 0) SWP_NOZORDER | SWP_NOACTIVATE | (noicon ? SWP_HIDEWINDOW : 0)
); );
if (rtl) if (rtl)
@ -278,8 +289,8 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
SetWindowText(hwCheckBox, checkbox); SetWindowText(hwCheckBox, checkbox);
} }
AddFolderFromReg(HKEY_LOCAL_MACHINE); AddFolderFromReg(CSIDL_COMMON_PROGRAMS);
AddFolderFromReg(HKEY_CURRENT_USER); AddFolderFromReg(CSIDL_PROGRAMS);
// Tell NSIS to remove old inner dialog and pass handle of the new inner dialog // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog
SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, (WPARAM)hwndDlg, 0); SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, (WPARAM)hwndDlg, 0);
@ -329,40 +340,30 @@ BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
return TRUE; return TRUE;
} }
void AddFolderFromReg(HKEY rootKey) void AddFolderFromReg(int nFolder)
{ {
DWORD dwResult;
DWORD dwLength = MAX_PATH;
DWORD dwType = REG_SZ;
HKEY hKey;
//DWORD idx; //DWORD idx;
WIN32_FIND_DATA FileData; WIN32_FIND_DATA FileData;
HANDLE hSearch; HANDLE hSearch;
char szName[20] = "Common Programs"; LPMALLOC ppMalloc;
if (SHGetMalloc(&ppMalloc) == NOERROR)
dwResult = RegOpenKeyEx(
rootKey,
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
0,
KEY_READ,
&hKey
);
if (dwResult == ERROR_SUCCESS)
{ {
dwResult = RegQueryValueEx( LPITEMIDLIST ppidl;
hKey,
rootKey == HKEY_LOCAL_MACHINE ? szName : szName + 7, buf[0] = 0;
NULL, if (SHGetSpecialFolderLocation(hwParent, nFolder, &ppidl) == S_OK)
&dwType, {
(BYTE *) buf, SHGetPathFromIDList(ppidl, buf);
&dwLength ppMalloc->lpVtbl->Free(ppMalloc, ppidl);
); }
RegCloseKey(hKey);
ppMalloc->lpVtbl->Release(ppMalloc);
} }
if (!buf[0])
return;
lstrcat(buf, "\\*.*"); lstrcat(buf, "\\*.*");
hSearch = FindFirstFile(buf, &FileData); hSearch = FindFirstFile(buf, &FileData);
if (hSearch != INVALID_HANDLE_VALUE) if (hSearch != INVALID_HANDLE_VALUE)

Binary file not shown.

Binary file not shown.

View file

@ -21,6 +21,7 @@
*/ */
#include "DialogTemplate.h" #include "DialogTemplate.h"
#include <commctrl.h>
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Utilities // Utilities
@ -424,10 +425,9 @@ void CDialogTemplate::CTrimToString(WORD id, char *str, int margins) {
void CDialogTemplate::ConvertToRTL() { void CDialogTemplate::ConvertToRTL() {
for (unsigned int i = 0; i < m_vItems.size(); i++) { for (unsigned int i = 0; i < m_vItems.size(); i++) {
bool addExStyle = false; bool addExStyle = false;
if (m_vItems[i]->dwExtStyle & WS_EX_LEFT)
addExStyle = true;
// Button // Button
else if (int(m_vItems[i]->szClass) == 0x80) { if (int(m_vItems[i]->szClass) == 0x80) {
m_vItems[i]->dwStyle ^= BS_LEFTTEXT; m_vItems[i]->dwStyle ^= BS_LEFTTEXT;
m_vItems[i]->dwStyle ^= BS_RIGHT; m_vItems[i]->dwStyle ^= BS_RIGHT;
m_vItems[i]->dwStyle ^= BS_LEFT; m_vItems[i]->dwStyle ^= BS_LEFT;
@ -435,14 +435,16 @@ void CDialogTemplate::ConvertToRTL() {
if ((m_vItems[i]->dwStyle & (BS_LEFT|BS_RIGHT)) == (BS_LEFT|BS_RIGHT)) { if ((m_vItems[i]->dwStyle & (BS_LEFT|BS_RIGHT)) == (BS_LEFT|BS_RIGHT)) {
m_vItems[i]->dwStyle ^= BS_LEFT; m_vItems[i]->dwStyle ^= BS_LEFT;
m_vItems[i]->dwStyle ^= BS_RIGHT; m_vItems[i]->dwStyle ^= BS_RIGHT;
if (m_vItems[i]->dwStyle & (BS_RADIOBUTTON|BS_CHECKBOX|BS_USERBUTTON)) if (m_vItems[i]->dwStyle & (BS_RADIOBUTTON|BS_CHECKBOX|BS_USERBUTTON)) {
m_vItems[i]->dwStyle |= BS_RIGHT; m_vItems[i]->dwStyle |= BS_RIGHT;
}
} }
} }
// Edit // Edit
else if (int(m_vItems[i]->szClass) == 0x81) { else if (int(m_vItems[i]->szClass) == 0x81) {
if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) {
m_vItems[i]->dwStyle ^= ES_RIGHT; m_vItems[i]->dwStyle ^= ES_RIGHT;
}
} }
// Static // Static
else if (int(m_vItems[i]->szClass) == 0x82) { else if (int(m_vItems[i]->szClass) == 0x82) {
@ -455,14 +457,21 @@ void CDialogTemplate::ConvertToRTL() {
m_vItems[i]->dwStyle |= SS_CENTERIMAGE; m_vItems[i]->dwStyle |= SS_CENTERIMAGE;
} }
} }
else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && strcmpi(m_vItems[i]->szClass, "RichEdit20A")) { else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !strcmpi(m_vItems[i]->szClass, "RichEdit20A")) {
if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) {
m_vItems[i]->dwStyle ^= ES_RIGHT; m_vItems[i]->dwStyle ^= ES_RIGHT;
}
}
else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !strcmpi(m_vItems[i]->szClass, "SysTreeView32")) {
m_vItems[i]->dwStyle |= TVS_RTLREADING;
addExStyle = true;
} }
else addExStyle = true; else addExStyle = true;
if (addExStyle) if (addExStyle)
m_vItems[i]->dwExtStyle |= WS_EX_RIGHT | WS_EX_RTLREADING; m_vItems[i]->dwExtStyle |= WS_EX_RIGHT;
m_vItems[i]->dwExtStyle |= WS_EX_RTLREADING;
m_vItems[i]->sX = m_sWidth - m_vItems[i]->sWidth - m_vItems[i]->sX; m_vItems[i]->sX = m_sWidth - m_vItems[i]->sWidth - m_vItems[i]->sX;
} }

View file

@ -146,7 +146,8 @@ lang_again:
language_table=((char*)g_blocks[NB_LANGTABLES].offset)+lang_num*g_header->langtable_size; language_table=((char*)g_blocks[NB_LANGTABLES].offset)+lang_num*g_header->langtable_size;
if (!((lang ^ *(LANGID*)language_table) & lang_mask)) { if (!((lang ^ *(LANGID*)language_table) & lang_mask)) {
dlg_offset=*(int*)(language_table+sizeof(LANGID)); dlg_offset=*(int*)(language_table+sizeof(LANGID));
cur_langtable=(int*)(language_table+sizeof(LANGID)+sizeof(int)); g_exec_flags.rtl=*(int*)(language_table+sizeof(LANGID)+sizeof(int));
cur_langtable=(int*)(language_table+sizeof(LANGID)+2*sizeof(int));
break; break;
} }
} }

View file

@ -467,6 +467,7 @@ union exec_flags {
int silent; int silent;
#endif #endif
int instdir_error; int instdir_error;
int rtl;
}; };
int flags[1]; int flags[1];
}; };

View file

@ -85,7 +85,10 @@ int NSISCALL my_MessageBox(const char *text, UINT type) {
if (g_exec_flags.silent && type >> 20) if (g_exec_flags.silent && type >> 20)
return type >> 20; return type >> 20;
// no silent or no default, just show // no silent or no default, just show
return MessageBox(g_hwnd, text, g_caption, type & 0x000FFFFF); if (!g_exec_flags.rtl)
return MessageBox(g_hwnd, text, g_caption, type & 0x000FFFFF);
else
return MessageBox(g_hwnd, text, g_caption, (type & 0x000FFFFF) ^ (MB_RIGHT | MB_RTLREADING));
} }
void * NSISCALL my_GlobalAlloc(DWORD dwBytes) { void * NSISCALL my_GlobalAlloc(DWORD dwBytes) {

View file

@ -405,6 +405,10 @@ int CEXEBuild::GenerateLangTables() {
while (i--) { while (i--) {
build_langtables.add(&lt[i].lang_id, sizeof(LANGID)); build_langtables.add(&lt[i].lang_id, sizeof(LANGID));
build_langtables.add(&lt[i].dlg_offset, sizeof(int)); build_langtables.add(&lt[i].dlg_offset, sizeof(int));
{
int rtl = lt[i].nlf.m_bRTL ? 1 : 0;
build_langtables.add(&rtl, sizeof(int));
}
int *lst = (int *)((char *)build_langtables.get() + build_langtables.getlen()); int *lst = (int *)((char *)build_langtables.get() + build_langtables.getlen());
cnt = 0; cnt = 0;
@ -488,6 +492,10 @@ int CEXEBuild::GenerateLangTables() {
while (i--) { while (i--) {
ubuild_langtables.add(&lt[i].lang_id, sizeof(LANGID)); ubuild_langtables.add(&lt[i].lang_id, sizeof(LANGID));
ubuild_langtables.add(&lt[i].dlg_offset, sizeof(int)); ubuild_langtables.add(&lt[i].dlg_offset, sizeof(int));
{
int rtl = lt[i].nlf.m_bRTL ? 1 : 0;
ubuild_langtables.add(&rtl, sizeof(int));
}
int *lst = (int *)((char *)ubuild_langtables.get() + ubuild_langtables.getlen()); int *lst = (int *)((char *)ubuild_langtables.get() + ubuild_langtables.getlen());
cnt = 0; cnt = 0;