diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp index d093c7cf..be4d33d9 100644 --- a/Contrib/Makensisw/makensisw.cpp +++ b/Contrib/Makensisw/makensisw.cpp @@ -46,7 +46,28 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmd if (*g_sdata.script=='"') { g_sdata.script++; while (*g_sdata.script && *g_sdata.script++!='"' ); } else while (*g_sdata.script!=' ' && *g_sdata.script) g_sdata.script++; while (*g_sdata.script==' ') g_sdata.script++; - PushMRUFile(g_sdata.script); + if(lstrlen(g_sdata.script)) { + bool is_quoted = false; + char *p = g_sdata.script + (lstrlen(g_sdata.script) - 1); + + if(*p == '"') is_quoted = true; + p--; + while(p > g_sdata.script) { + if(*p == ' ') { + if(!is_quoted) { + p++; + break; + } + } + else if(*p == '"') { + p++; + break; + } + p--; + } + PushMRUFile(p); + } + if (!InitBranding()) { MessageBox(0,NSISERROR,"Error",MB_ICONEXCLAMATION|MB_OK); return 1; @@ -255,9 +276,13 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HMENU hMenu = (HMENU)lParam; UINT id = (UINT)LOWORD(wParam); UINT flags = (UINT)HIWORD(wParam); - if(hMenu == g_sdata.menu && id == 0 && (flags & MF_POPUP) == MF_POPUP) { - hMenu = GetSubMenu(hMenu, id); - BuildMRUMenu(hMenu); + if(hMenu == g_sdata.menu && (flags & MF_POPUP) == MF_POPUP) { + if(id == 0) { // File menu + BuildMRUMenu(GetSubMenu(hMenu, id)); + } + else if (id == 2) { // Tools menu + SetClearMRUListMenuitemState(GetSubMenu(hMenu, id)); + } } return TRUE; } @@ -346,6 +371,9 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { case IDM_MRU_FILE+4: LoadMRUFile(LOWORD(wParam)-IDM_MRU_FILE); return TRUE; + case IDM_CLEAR_MRU_LIST: + ClearMRUList(); + return TRUE; #ifdef COMPRESSOR_OPTION case IDM_COMPRESSOR: { diff --git a/Contrib/Makensisw/resource.h b/Contrib/Makensisw/resource.h index 54400cf2..82d4f9df 100644 --- a/Contrib/Makensisw/resource.h +++ b/Contrib/Makensisw/resource.h @@ -67,13 +67,14 @@ #define IDM_ZLIB 40021 #define IDM_GZIP 40022 #define IDM_MRU_FILE 40023 +#define IDM_CLEAR_MRU_LIST 40029 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 124 -#define _APS_NEXT_COMMAND_VALUE 40029 +#define _APS_NEXT_COMMAND_VALUE 40030 #define _APS_NEXT_CONTROL_VALUE 1023 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/Contrib/Makensisw/resource.rc b/Contrib/Makensisw/resource.rc index 863525fa..a7dde87c 100644 --- a/Contrib/Makensisw/resource.rc +++ b/Contrib/Makensisw/resource.rc @@ -90,6 +90,7 @@ BEGIN MENUITEM "Edit Script\tCtrl+E", IDM_EDITSCRIPT MENUITEM "Browse Script\tCtrl+B", IDM_BROWSESCR MENUITEM "Clear &Log Window\tCtrl+W", IDM_CLEARLOG + MENUITEM "Clear Recent &Files List", IDM_CLEAR_MRU_LIST END POPUP "&Help" BEGIN diff --git a/Contrib/Makensisw/utils.cpp b/Contrib/Makensisw/utils.cpp index 7fc2f502..ff681f7c 100644 --- a/Contrib/Makensisw/utils.cpp +++ b/Contrib/Makensisw/utils.cpp @@ -28,7 +28,7 @@ NTOOLTIP g_tip; LRESULT CALLBACK TipHookProc(int nCode, WPARAM wParam, LPARAM lParam); -char g_mru_files[MRU_SIZE][MAX_PATH] = { NULL, NULL, NULL, NULL, NULL }; +char g_mru_list[MRU_LIST_SIZE][MAX_PATH] = { NULL, NULL, NULL, NULL, NULL }; extern NSCRIPTDATA g_sdata; @@ -414,18 +414,18 @@ BOOL PopMRUFile(char* fname) { int i; - for(i=0; i= 0; i--) { - lstrcpy(g_mru_files[i+1], g_mru_files[i]); + rv = GetFullPathName(buf,sizeof(full_file_name),full_file_name,&file_part); + if (rv == 0) { + return; } - lstrcpy(g_mru_files[0],buf); + + PopMRUFile(full_file_name); + for(i = MRU_LIST_SIZE - 2; i >= 0; i--) { + lstrcpy(g_mru_list[i+1], g_mru_list[i]); + } + lstrcpy(g_mru_list[0],full_file_name); } void BuildMRUMenu(HMENU hMenu) { int i; MENUITEMINFO mii; + char buf[MRU_DISPLAY_LENGTH+1]; + char buf2[MRU_DISPLAY_LENGTH - 6]; - for(i = 0; i < MRU_SIZE; i++) { + for(i = 0; i < MRU_LIST_SIZE; i++) { DeleteMenu(hMenu, IDM_MRU_FILE+i, MF_BYCOMMAND); } - for(i = 0; i < MRU_SIZE; i++) { - if(g_mru_files[i][0]) { + for(i = 0; i < MRU_LIST_SIZE; i++) { + if(g_mru_list[i][0]) { + my_memset(buf,0,sizeof(buf)); my_memset(&mii, 0, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.wID = IDM_MRU_FILE+i; mii.fType = MFT_STRING; - mii.dwTypeData = g_mru_files[i]; - mii.cch = sizeof(g_mru_files[i]); + if(lstrlen(g_mru_list[i]) > MRU_DISPLAY_LENGTH) { + char *p = my_strrchr(g_mru_list[i],'\\'); + if(p) { + p++; + if(lstrlen(p) > MRU_DISPLAY_LENGTH - 7) { + my_memset(buf2,0,sizeof(buf2)); + lstrcpyn(buf2,p,MRU_DISPLAY_LENGTH - 9); + lstrcat(buf2,"..."); + + lstrcpyn(buf,g_mru_list[i],4); + lstrcat(buf,"...\\"); + lstrcat(buf,buf2); + } + else { + lstrcpyn(buf,g_mru_list[i],(MRU_DISPLAY_LENGTH - lstrlen(p) - 3)); + lstrcat(buf,"...\\"); + lstrcat(buf,p); + } + } + else { + lstrcpyn(buf,g_mru_list[i],(MRU_DISPLAY_LENGTH-2)); + lstrcat(buf,"..."); + } + } + else { + lstrcpy(buf, g_mru_list[i]); + } + + mii.dwTypeData = buf; + mii.cch = sizeof(buf); mii.fState = MFS_ENABLED; - InsertMenuItem(hMenu, IDM_MRU_FILE+i, TRUE, &mii); + InsertMenuItem(hMenu, IDM_MRU_FILE+i, FALSE, &mii); } else { break; @@ -485,10 +525,20 @@ void BuildMRUMenu(HMENU hMenu) void LoadMRUFile(int position) { - if (!g_sdata.thread && position >=0 && position < MRU_SIZE && g_mru_files[position][0]) { - g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(g_mru_files[position])+3); - wsprintf(g_sdata.script,"\"%s\"",g_mru_files[position]); - PushMRUFile(g_sdata.script); + WIN32_FIND_DATA wfd; + HANDLE h; + + if (!g_sdata.thread && position >=0 && position < MRU_LIST_SIZE && g_mru_list[position][0]) { + g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(g_mru_list[position])+3); + wsprintf(g_sdata.script,"\"%s\"",g_mru_list[position]); + h = FindFirstFile(g_mru_list[position],&wfd); + if(h != INVALID_HANDLE_VALUE) { + PushMRUFile(g_mru_list[position]); + FindClose(h); + } + else { + PopMRUFile(g_mru_list[position]); + } ResetObjects(); CompileNSISScript(); } @@ -504,11 +554,11 @@ void RestoreMRUList() if (RegCreateKey(hKey,REGMRUSUBKEY,&hSubKey) == ERROR_SUCCESS) { char buf[8]; DWORD l; - for(int i=0; i