diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp index e1e6d099..3d9d1cd2 100644 --- a/Contrib/Makensisw/makensisw.cpp +++ b/Contrib/Makensisw/makensisw.cpp @@ -479,12 +479,9 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam case WM_NOTIFY: switch (((NMHDR*)lParam)->code ) { case EN_SELCHANGE: - SendDlgItemMessage(hwndDlg,IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM) &g_sdata.textrange); - { - BOOL enabled = (g_sdata.textrange.cpMax-g_sdata.textrange.cpMin<=0?FALSE:TRUE); - EnableMenuItem(g_sdata.menu,IDM_COPYSELECTED,(enabled?MF_ENABLED:MF_GRAYED)); - EnableToolBarButton(IDM_COPY,enabled); - } + EnableMenuItem(g_sdata.menu, IDM_COPYSELECTED, RicheditHasSelection(GetDlgItem(hwndDlg, IDC_LOGWIN)) ? MF_ENABLED : MF_GRAYED); + break; + // Altered by Darren Owen (DrO) on 6/10/2003 // Allows the detection of the right-click menu when running on OSes below Windows 2000 // and will then simulate the effective WM_CONTEXTMENU message that would be received @@ -492,10 +489,11 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam // Windows 2000 and higher case EN_MSGFILTER: #define lpnmMsg ((MSGFILTER*)lParam) - if(WM_RBUTTONUP == lpnmMsg->msg || (WM_KEYUP == lpnmMsg->msg && lpnmMsg->wParam == VK_APPS)){ - POINT pt; - HWND edit = GetDlgItem(g_sdata.hwnd,IDC_LOGWIN); - RECT r; + if(WM_RBUTTONUP == lpnmMsg->msg || (WM_KEYUP == lpnmMsg->msg && lpnmMsg->wParam == VK_APPS)) + { + POINT pt; + HWND edit = GetDlgItem(g_sdata.hwnd,IDC_LOGWIN); + RECT r; GetCursorPos(&pt); // Added and altered by Darren Owen (DrO) on 29/9/2003 @@ -504,11 +502,11 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam // from here... ScreenToClient(edit, &pt); GetClientRect(edit, &r); - if(!PtInRect(&r, pt)) - pt.x = pt.y = 0; + if (!PtInRect(&r, pt)) pt.x = pt.y = 0; MapWindowPoints(edit, HWND_DESKTOP, &pt, 1); TrackPopupMenu(g_sdata.editSubmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, 0, g_sdata.hwnd, 0); } + break; case TBN_DROPDOWN: { LPNMTOOLBAR pToolBar = (LPNMTOOLBAR) lParam; @@ -526,8 +524,9 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam switch (cds->dwData) { case MakensisAPI::NOTIFY_SCRIPT: MemSafeFree(g_sdata.input_script); - g_sdata.input_script = (TCHAR*) MemAlloc(cds->cbData * sizeof(TCHAR)); - lstrcpy(g_sdata.input_script, (TCHAR *)cds->lpData); + if ((g_sdata.input_script = (TCHAR*) MemAlloc(cds->cbData * sizeof(TCHAR)))) + lstrcpy(g_sdata.input_script, (TCHAR*) cds->lpData); + EnableUICommand(IDM_BROWSESCR, !!g_sdata.input_script); break; case MakensisAPI::NOTIFY_WARNING: g_sdata.warnings++; @@ -542,6 +541,17 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam } return TRUE; } + case WM_INITMENU: + EnableMenuItem(g_sdata.menu, IDM_CANCEL, g_sdata.thread ? MF_ENABLED : MF_GRAYED); + break; + case WM_MAKENSIS_UPDATEUISTATE: + { + UINT i, emptylog = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, WM_GETTEXTLENGTH, 0, 0) == 0; + static const PACKEDCMDID_T nonemptylogids [] = { PACKCMDID(IDM_COPY), PACKCMDID(IDM_COPYALL), PACKCMDID(IDM_CLEARLOG), PACKCMDID(IDM_SELECTALL) }; + for (i = 0; i < COUNTOF(nonemptylogids); ++i) EnableUICommand(UNPACKCMDID(nonemptylogids[i]), !emptylog); + EnableUICommand(IDM_BROWSESCR, !!g_sdata.input_script); + break; + } case WM_COMMAND: { switch (LOWORD(wParam)) { @@ -576,8 +586,6 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam l.nMaxFile = MAX_STRING-1; l.lpstrTitle = _T("Load Script"); l.lpstrDefExt = _T("log"); - l.lpstrFileTitle = NULL; - l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; buf[0] = _T('\0'); if (GetOpenFileName(&l)) { @@ -671,15 +679,14 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam return TRUE; } case IDM_COPY: - { + if (RicheditHasSelection(GetDlgItem(hwndDlg, IDC_LOGWIN))) goto logwndcopysel; + // fall through + case IDM_COPYALL: CopyToClipboard(g_sdata.hwnd); return TRUE; - } - case IDM_COPYSELECTED: - { - SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN, WM_COPY, 0, 0); + case IDM_COPYSELECTED: logwndcopysel: + SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, WM_COPY, 0, 0); return TRUE; - } case IDM_SAVE: { OPENFILENAME l={sizeof(l),}; diff --git a/Contrib/Makensisw/makensisw.h b/Contrib/Makensisw/makensisw.h index af0d5aad..97e9630c 100644 --- a/Contrib/Makensisw/makensisw.h +++ b/Contrib/Makensisw/makensisw.h @@ -80,6 +80,7 @@ #define WM_MAKENSIS_PROCESSCOMPLETE (WM_USER+1001) #define WM_MAKENSIS_LOADSYMBOLSET (WM_USER+1002) #define WM_MAKENSIS_SAVESYMBOLSET (WM_USER+1003) +#define WM_MAKENSIS_UPDATEUISTATE (WM_USER+1004) namespace MakensisAPI { extern const TCHAR* SigintEventNameFmt; @@ -216,7 +217,6 @@ typedef struct NSISScriptData { HANDLE sigint_event; HANDLE sigint_event_legacy; HWND focused_hwnd; - CHARRANGE textrange; NCOMPRESSOR default_compressor; NCOMPRESSOR compressor; LPCTSTR compressor_name; @@ -247,4 +247,10 @@ typedef struct ToolTipStruct { HHOOK hook; } NTOOLTIP; +static void EnableUICommand(UINT Id, INT_PTR Enabled) +{ + EnableToolBarButton(Id, !!Enabled); + EnableMenuItem(g_sdata.menu, Id, Enabled ? MF_ENABLED : MF_GRAYED); +} + #endif diff --git a/Contrib/Makensisw/resource.h b/Contrib/Makensisw/resource.h index b2301557..14538898 100644 --- a/Contrib/Makensisw/resource.h +++ b/Contrib/Makensisw/resource.h @@ -94,7 +94,7 @@ #define IDM_LOADSCRIPT 507 #define IDM_EDITSCRIPT 508 #define IDM_SAVE 509 -#define IDM_COPY 510 +#define IDM_COPYALL 510 #define IDM_COPYSELECTED 511 #define IDM_FIND 512 #define IDM_CLEARLOG 513 @@ -121,13 +121,14 @@ #define IDM_CANCEL 534 #define IDM_SETTINGS 535 #define IDM_WNDSPY 536 +#define IDM_COPY 537 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 138 -#define _APS_NEXT_COMMAND_VALUE 537 +#define _APS_NEXT_COMMAND_VALUE 538 #define _APS_NEXT_CONTROL_VALUE 241 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/Contrib/Makensisw/resource.rc b/Contrib/Makensisw/resource.rc index 6e92dcdf..27ee82b1 100644 --- a/Contrib/Makensisw/resource.rc +++ b/Contrib/Makensisw/resource.rc @@ -77,7 +77,7 @@ BEGIN POPUP "&Edit", IDM_EDIT BEGIN MENUITEM "&Copy\tCtrl+C", IDM_COPYSELECTED - MENUITEM "Copy &All", IDM_COPY + MENUITEM "Copy &All", IDM_COPYALL MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&Find...\tCtrl+F", IDM_FIND MENUITEM "", -1, MFT_SEPARATOR @@ -108,7 +108,7 @@ BEGIN END POPUP "&Tools", IDM_TOOLS BEGIN - MENUITEM "&Settings..\tCtrl+S", IDM_SETTINGS + MENUITEM "&Settings\tCtrl+S", IDM_SETTINGS MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&Window Info", IDM_WNDSPY MENUITEM "", -1, MFT_SEPARATOR @@ -118,9 +118,10 @@ BEGIN BEGIN MENUITEM "NSIS Users &Manual\tF1", IDM_DOCS MENUITEM "", -1, MFT_SEPARATOR + MENUITEM "Check for &Updates", IDM_NSISUPDATE + MENUITEM "", -1, MFT_SEPARATOR MENUITEM "NSIS &Homepage", IDM_NSISHOME MENUITEM "NSIS &Forum", IDM_FORUM - MENUITEM "Check for &Updates", IDM_NSISUPDATE MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&About MakeNSISW", IDM_ABOUT END diff --git a/Contrib/Makensisw/toolbar.cpp b/Contrib/Makensisw/toolbar.cpp index 452795ff..f55e4a74 100644 --- a/Contrib/Makensisw/toolbar.cpp +++ b/Contrib/Makensisw/toolbar.cpp @@ -43,7 +43,7 @@ static const TBBTNDESC g_TBBtnsDesc[BUTTONCOUNT] = { /*TBB_LOADSCRIPT*/ { MKNAMEDTBBTNDESC(LOADSCRIPT, TBSTATE_ENABLED, TBSTYLE_BUTTON ) }, /*TBB_SAVE */ { MKNAMEDTBBTNDESC(SAVE, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON ) }, /*TBB_SEP1 */ { TBSTYLE_SEP }, -/*TBB_COPY */ { MKNAMEDTBBTNDESC(COPY, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON ) }, +/*TBB_COPY */ { MKNAMEDTBBTNDESC(COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON ) }, /*TBB_FIND */ { MKNAMEDTBBTNDESC(FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON ) }, /*TBB_CLEARLOG */ { MKNAMEDTBBTNDESC(CLEARLOG, TBSTATE_ENABLED, TBSTYLE_BUTTON ) }, /*TBB_SEP2 */ { TBSTYLE_SEP }, diff --git a/Contrib/Makensisw/utils.cpp b/Contrib/Makensisw/utils.cpp index 3794e287..a016c00c 100644 --- a/Contrib/Makensisw/utils.cpp +++ b/Contrib/Makensisw/utils.cpp @@ -27,9 +27,19 @@ #include "toolbar.h" #include -typedef BYTE PACKEDCMDID_T; -#define PACKCMDID(id) ( PACKEDCMDID_T((id) - IDM_CMDBASE) ) -#define UNPACKCMDID(id) ( IDM_CMDBASE + (id) ) +#ifndef MONITOR_DEFAULTTONEAREST +#define MONITOR_DEFAULTTONEAREST 2 +WINUSERAPI HMONITOR WINAPI MonitorFromWindow(HWND hwnd, DWORD dwFlags); +#endif +#ifndef GRADIENT_FILL_RECT_H +#define GRADIENT_FILL_RECT_H 0 +#if !defined(_WIN32_WINNT) || _WIN32_WINNT-0 < 0x0410 +typedef USHORT COLOR16; +typedef struct _TRIVERTEX { LONG x, y; COLOR16 Red, Green, Blue, Alpha; } TRIVERTEX, *PTRIVERTEX, *LPTRIVERTEX; +WINGDIAPI BOOL WINAPI GradientFill(HDC,PTRIVERTEX,ULONG,PVOID,ULONG,ULONG); +#endif +#endif + NTOOLTIP g_tip; LRESULT CALLBACK TipHookProc(int nCode, WPARAM wParam, LPARAM lParam); @@ -164,6 +174,7 @@ void CopyToClipboard(HWND hwnd) { void ClearLog(HWND hwnd) { SetDlgItemText(hwnd, IDC_LOGWIN, _T("")); + SendMessage(g_sdata.hwnd, WM_MAKENSIS_UPDATEUISTATE, 0, 0); } void LogMessage(HWND hwnd,const TCHAR *str) { @@ -236,8 +247,7 @@ void EnableDisableItems(HWND hwnd, int on) static const PACKEDCMDID_T cmds [] = { PACKCMDID(IDM_EXIT), PACKCMDID(IDM_LOADSCRIPT), PACKCMDID(IDM_EDITSCRIPT), - PACKCMDID(IDM_COPY), PACKCMDID(IDM_COPYSELECTED), PACKCMDID(IDM_SAVE), - PACKCMDID(IDM_CLEARLOG), PACKCMDID(IDM_BROWSESCR), + PACKCMDID(IDM_SAVE), PACKCMDID(IDM_CLEARLOG), PACKCMDID(IDM_COMPRESSOR), PACKCMDID(IDM_COMPRESSOR_SUBMENU), PACKCMDID(IDM_RECOMPILE), PACKCMDID(IDM_RECOMPILE_TEST) }; @@ -248,6 +258,10 @@ void EnableDisableItems(HWND hwnd, int on) EnableToolBarButton(id, on); } + SendMessage(g_sdata.hwnd, WM_MAKENSIS_UPDATEUISTATE, 0 ,0); + EnableMenuItem(hMenu, IDM_FILE, mf); // Disable the whole File menu because of the MRU list + DrawMenuBar(g_sdata.hwnd); + HWND hFocus = g_sdata.focused_hwnd, hOptimal = hTestBtn; if (on && hCloseBtn == hFocus) hFocus = hOptimal; if (!IsWindowEnabled(hFocus)) hFocus = GetDlgItem(hwnd, IDC_LOGWIN); @@ -284,23 +298,25 @@ void SetCompressorStats() } } +static void SetUIState_NoScript() +{ + static const PACKEDCMDID_T cmds [] = { + PACKCMDID(IDM_RECOMPILE),PACKCMDID(IDM_RECOMPILE_TEST),PACKCMDID(IDM_TEST), + PACKCMDID(IDM_BROWSESCR),PACKCMDID(IDM_EDITSCRIPT) + }; + for (UINT i = 0; i < COUNTOF(cmds); ++i) + EnableUICommand(UNPACKCMDID(cmds[i]), FALSE); + EnableWindow(GetDlgItem(g_sdata.hwnd, IDC_TEST), FALSE); +} + void CompileNSISScript() { DragAcceptFiles(g_sdata.hwnd,FALSE); ClearLog(g_sdata.hwnd); SetTitle(g_sdata.hwnd,NULL); + PostMessage(g_sdata.hwnd, WM_MAKENSIS_UPDATEUISTATE, 0, 0); if (lstrlen(g_sdata.script)==0) { LogMessage(g_sdata.hwnd,USAGE); - - static const PACKEDCMDID_T cmds [] = { - PACKCMDID(IDM_RECOMPILE),PACKCMDID(IDM_RECOMPILE_TEST),PACKCMDID(IDM_TEST), - PACKCMDID(IDM_BROWSESCR),PACKCMDID(IDM_EDITSCRIPT) - }; - for (UINT i = 0; i < COUNTOF(cmds); ++i) { - int id = UNPACKCMDID(cmds[i]); - EnableMenuItem(g_sdata.menu,id,MF_GRAYED); - EnableToolBarButton(id,FALSE); - } - EnableWindow(GetDlgItem(g_sdata.hwnd,IDC_TEST),FALSE); + SetUIState_NoScript(); DragAcceptFiles(g_sdata.hwnd,TRUE); return; } diff --git a/Contrib/Makensisw/utils.h b/Contrib/Makensisw/utils.h index aa46dcff..ee34c707 100644 --- a/Contrib/Makensisw/utils.h +++ b/Contrib/Makensisw/utils.h @@ -47,6 +47,10 @@ bool WriteUTF16LEBOM(HANDLE hFile); void FreeSpawn(PROCESS_INFORMATION *pPI, HANDLE hRd, HANDLE hWr); BOOL InitSpawn(STARTUPINFO &si, HANDLE &hRd, HANDLE &hWr); +typedef BYTE PACKEDCMDID_T; +#define PACKCMDID(id) ( PACKEDCMDID_T((id) - IDM_CMDBASE) ) +#define UNPACKCMDID(id) ( IDM_CMDBASE + (id) ) + int SetArgv(const TCHAR *cmdLine, TCHAR ***argv); void SetTitle(HWND hwnd,const TCHAR *substr); void CopyToClipboard(HWND hwnd); @@ -113,4 +117,11 @@ static inline void GetGripperPos(HWND hwnd, RECT&r) r.top = r.bottom - GetSystemMetrics(SM_CYVSCROLL); } +static bool RicheditHasSelection(HWND hRE) +{ + CHARRANGE tr; + SendMessage(hRE, EM_EXGETSEL, 0, (LPARAM) &tr); + return tr.cpMax - tr.cpMin <= 0 ? FALSE : TRUE; +} + #endif