From 0302344430726091410a018c89e07167e3c9fcff Mon Sep 17 00:00:00 2001 From: anders_k Date: Fri, 20 Aug 2021 14:56:26 +0000 Subject: [PATCH] Refactored Tooltip text handling git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7299 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/Makensisw/makensisw.cpp | 7 +++--- Contrib/Makensisw/makensisw.h | 2 ++ Contrib/Makensisw/toolbar.cpp | 27 ++++----------------- Contrib/Makensisw/utils.cpp | 43 +++++++++++++++++++++++---------- Contrib/Makensisw/utils.h | 9 ++++++- 5 files changed, 49 insertions(+), 39 deletions(-) diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp index e223c791..63e4be56 100644 --- a/Contrib/Makensisw/makensisw.cpp +++ b/Contrib/Makensisw/makensisw.cpp @@ -599,7 +599,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam { TCHAR buf[MAX_PATH]; lstrcpyn(buf, FSPath::FindLastComponent(((PROMPT_FILEPATH_DATA*)cds->lpData)->Path), COUNTOF(buf)); - OPENFILENAME of = { sizeof(of) }; + OPENFILENAME of = { SizeOfStruct(of) }; of.hwndOwner = hwndDlg; of.lpstrFilter = _T("*.exe\0*.exe\0*\0*.*\0"); of.lpstrFile = buf, of.nMaxFile = COUNTOF(buf); @@ -633,6 +633,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam case TID_CONFIGURECLOSEORABORT: SendMessage(hCtl = GetDlgItem(hwndDlg, IDCANCEL), WM_SETTEXT, 0, (LPARAM) (g_sdata.thread ? _T("&Abort") : _T("&Close"))); EnableWindow(hCtl, true); + UpdateCloseButtonTooltip(); return KillTimer(hwndDlg, wParam); } break; @@ -666,7 +667,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam case IDM_LOADSCRIPT: { if (!g_sdata.thread) { - OPENFILENAME l={sizeof(l),}; + OPENFILENAME l = { SizeOfStruct(l) }; TCHAR buf[MAX_PATH]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("NSIS Script (*.nsi)\0*.nsi\0All Files (*.*)\0*.*\0"); @@ -783,7 +784,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam return TRUE; case IDM_SAVE: { - OPENFILENAME l={sizeof(l),}; + OPENFILENAME l = { SizeOfStruct(l) }; TCHAR buf[MAX_STRING]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("Log Files (*.log)\0*.log\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"); diff --git a/Contrib/Makensisw/makensisw.h b/Contrib/Makensisw/makensisw.h index 4521129b..e013eb39 100644 --- a/Contrib/Makensisw/makensisw.h +++ b/Contrib/Makensisw/makensisw.h @@ -89,6 +89,8 @@ static inline bool IsWin95() { return SupportsW95() && (GetVersion() & (0x8000FF #define SAVE_BUTTON_TEXT _T("Save") #define LOAD_SYMBOL_SET_MESSAGE _T("Please select a name for the Symbol Definitions Set to load.") #define SAVE_SYMBOL_SET_MESSAGE _T("Please enter or select a name for the Symbol Definitions Set to save.") +#define TESTBTN_TIPTEXT _T("Test the generated installer") +#define CLOSEBTN_TIPTEXT _T("Close MakeNSISW") #define WM_MAKENSIS_PROCESSCOMPLETE (WM_USER+1001) #define WM_MAKENSIS_LOADSYMBOLSET (WM_USER+1002) diff --git a/Contrib/Makensisw/toolbar.cpp b/Contrib/Makensisw/toolbar.cpp index 6f54a9fd..ab022a3e 100644 --- a/Contrib/Makensisw/toolbar.cpp +++ b/Contrib/Makensisw/toolbar.cpp @@ -78,7 +78,7 @@ void CreateToolBar() tbbs[i].fsStyle = g_TBBtnsDesc[i].Style; tbbs[i].dwData = 0, tbbs[i].iString = 0; } - SendMessage(g_toolbar.hwnd, TB_ADDBUTTONS, BUTTONCOUNT, (LPARAM) &tbbs); + SendMessage(g_toolbar.hwnd, TB_ADDBUTTONS, BUTTONCOUNT, (LPARAM) &tbbs); // Note: TB_ADDBUTTONSW is IE4+ LoadToolBarImages(); } @@ -148,35 +148,18 @@ void UpdateToolBarCompressorButton() lstrcat(szBuffer,_T("]")); SendMessage(g_toolbar.hwnd, TB_CHANGEBITMAP, (WPARAM) IDM_COMPRESSOR, (LPARAM) MAKELPARAM(iBitmap, 0)); - - TOOLINFO ti = { sizeof(TOOLINFO), 0 }; - ti.hwnd = g_toolbar.hwnd; - ti.uId = (UINT)TBB_COMPRESSOR; - ti.hinst = g_sdata.hInstance; - SendMessage(g_tip.tip, TTM_GETTOOLINFO, 0, (LPARAM) (LPTOOLINFO) &ti); - ti.lpszText = (LPTSTR)szBuffer; - SendMessage(g_tip.tip, TTM_SETTOOLINFO, 0, (LPARAM) (LPTOOLINFO) &ti); + SetTooltipText(g_toolbar.hwnd, (UINT) TBB_COMPRESSOR, szBuffer); } void AddToolBarButtonTooltip(UINT idx, int iString) { TOOLINFO ti; - TCHAR szBuffer[64]; - RECT rect; - - memset(&ti, 0, sizeof(TOOLINFO)); - ti.cbSize = sizeof(TOOLINFO); + ti.cbSize = SizeOfStruct(ti); ti.uFlags = 0; ti.hwnd = g_toolbar.hwnd; - ti.hinst = g_sdata.hInstance; ti.uId = idx; - LoadString(g_sdata.hInstance, iString, szBuffer, COUNTOF(szBuffer)); - ti.lpszText = (LPTSTR) szBuffer; - SendMessage(g_toolbar.hwnd, TB_GETITEMRECT, idx, (LPARAM) &rect); - ti.rect.left =rect.left; - ti.rect.top = rect.top; - ti.rect.right = rect.right; - ti.rect.bottom = rect.bottom; + ti.hinst = g_sdata.hInstance, ti.lpszText = MAKEINTRESOURCE(iString); + SendMessage(g_toolbar.hwnd, TB_GETITEMRECT, idx, (LPARAM) &ti.rect); SendMessage(g_tip.tip, TTM_ADDTOOL, 0, (LPARAM) &ti); } diff --git a/Contrib/Makensisw/utils.cpp b/Contrib/Makensisw/utils.cpp index ba62101d..bcd5109a 100644 --- a/Contrib/Makensisw/utils.cpp +++ b/Contrib/Makensisw/utils.cpp @@ -79,6 +79,13 @@ bool WriteUTF16LEBOM(HANDLE hFile) return WriteFile(hFile, u16lb, sizeof(u16lb)); } +BOOL InitCCExHelper(UINT icc) { + INITCOMMONCONTROLSEX icx = { sizeof(icx), icc }; + BOOL suppw95 = SupportsW95(); + FARPROC icce = suppw95 ? GetSysProcAddr("COMCTL32", "InitCommonControlsEx") : (FARPROC) InitCommonControlsEx; + return (!suppw95 || icce) && ((BOOL(WINAPI*)(const INITCOMMONCONTROLSEX*))icce)(&icx); +} + int SetArgv(const TCHAR *cmdLine, TCHAR ***argv) { const TCHAR *p; TCHAR *arg, *argSpace; @@ -736,21 +743,31 @@ int InitBranding() { return retval; } +LRESULT SetTooltipText(HWND hWnd, UINT_PTR Id, LPCTSTR Text) { + TOOLINFO ti; + ti.cbSize = SizeOfStruct(ti); + ti.uFlags = Id > 0x7fff ? TTF_IDISHWND : 0; + ti.hwnd = hWnd, ti.uId = Id; + ti.hinst = g_sdata.hInstance, ti.lpszText = const_cast(Text); + return SendMessage(g_tip.tip, TTM_UPDATETIPTEXT, 0, (LPARAM) (LPTOOLINFO) &ti); +} + +void UpdateCloseButtonTooltip() { + LPCTSTR txt = g_sdata.thread ? _T("") : CLOSEBTN_TIPTEXT; + SetTooltipText(g_tip.tip_p, (UINT_PTR) GetDlgItem(g_sdata.hwnd, IDCANCEL), txt); +} + void InitTooltips(HWND h) { if (h == NULL) return; - memset(&g_tip,0,sizeof(NTOOLTIP)); + InitCCEx(ICC_BAR_CLASSES); + DWORD s = WS_POPUP | WS_BORDER | TTS_ALWAYSTIP, xs = WS_EX_TOOLWINDOW | WS_EX_TOPMOST; + g_tip.hook = 0; g_tip.tip_p = h; - INITCOMMONCONTROLSEX icx; - icx.dwSize = sizeof(icx); - icx.dwICC = ICC_BAR_CLASSES; - InitCommonControlsEx(&icx); - DWORD dwStyle = WS_POPUP | WS_BORDER | TTS_ALWAYSTIP; - DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST; - g_tip.tip = CreateWindowEx(dwExStyle,TOOLTIPS_CLASS,NULL,dwStyle,0,0,0,0,h,NULL,HINST_APPLICATION,NULL); + g_tip.tip = CreateWindowEx(xs, TOOLTIPS_CLASS, NULL, s, 0, 0, 0, 0, h, NULL, HINST_APPLICATION, NULL); if (!g_tip.tip) return; - g_tip.hook = SetWindowsHookEx(WH_GETMESSAGE,TipHookProc,NULL, GetCurrentThreadId()); - AddTip(GetDlgItem(h,IDCANCEL),_T("Close MakeNSISW")); - AddTip(GetDlgItem(h,IDC_TEST),_T("Test the generated installer")); + g_tip.hook = SetWindowsHookEx(WH_GETMESSAGE, TipHookProc, NULL, GetCurrentThreadId()); + AddTip(GetDlgItem(h, IDCANCEL), CLOSEBTN_TIPTEXT); + AddTip(GetDlgItem(h, IDC_TEST), TESTBTN_TIPTEXT); AddToolBarTooltips(); } @@ -758,9 +775,9 @@ void DestroyTooltips() { UnhookWindowsHookEx(g_tip.hook); } -void AddTip(HWND hWnd,LPCTSTR lpszToolTip) { +void AddTip(HWND hWnd, LPCTSTR lpszToolTip) { TOOLINFO ti; - ti.cbSize = sizeof(TOOLINFO); + ti.cbSize = SizeOfStruct(ti); ti.uFlags = TTF_IDISHWND; ti.hwnd = g_tip.tip_p; ti.uId = (UINT_PTR) hWnd; diff --git a/Contrib/Makensisw/utils.h b/Contrib/Makensisw/utils.h index c2dfadf6..090f6c91 100644 --- a/Contrib/Makensisw/utils.h +++ b/Contrib/Makensisw/utils.h @@ -54,6 +54,11 @@ HMODULE LoadSysLibrary(LPCSTR Mod); FARPROC GetSysProcAddr(LPCSTR Mod, LPCSTR FuncName); bool WriteUTF16LEBOM(HANDLE hFile); +BOOL InitCCExHelper(UINT icc); +static inline BOOL InitCCEx(UINT icc) { return icc > 0xff ? InitCCExHelper(icc) : true; } +static inline UINT SizeOfStruct(const TOOLINFO&x) { return FIELD_OFFSET(TOOLINFO, lParam); } +static inline UINT SizeOfStruct(const OPENFILENAME&x) { return sizeof(void*) < 8 ? 76 : sizeof(x); } + void FreeSpawn(PROCESS_INFORMATION *pPI, HANDLE hRd, HANDLE hWr); BOOL InitSpawn(STARTUPINFO &si, HANDLE &hRd, HANDLE &hWr); @@ -89,7 +94,9 @@ void ResetSymbols(); int InitBranding(); void InitTooltips(HWND h); void DestroyTooltips(); -void AddTip(HWND hWnd,LPCTSTR lpszToolTip); +void AddTip(HWND hWnd, LPCTSTR lpszToolTip); +LRESULT SetTooltipText(HWND hWnd, UINT_PTR Id, LPCTSTR Text); +void UpdateCloseButtonTooltip(); void ShowDocs(); void RestoreCompressor(); void SaveCompressor();