home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 March / CMCD0304.ISO / Software / Freeware / Programare / nullsoft / nsis20.exe / Contrib / Makensisw / makensisw.cpp < prev    next >
C/C++ Source or Header  |  2004-01-25  |  45KB  |  1,261 lines

  1. /*
  2.   Copyright (c) 2002 Robert Rainwater
  3.   Contributors: Justin Frankel, Fritz Elfert, Amir Szekely, Sunil Kamath, Joost Verburg
  4.  
  5.   This software is provided 'as-is', without any express or implied
  6.   warranty.  In no event will the authors be held liable for any damages
  7.   arising from the use of this software.
  8.  
  9.   Permission is granted to anyone to use this software for any purpose,
  10.   including commercial applications, and to alter it and redistribute it
  11.   freely, subject to the following restrictions:
  12.  
  13.   1. The origin of this software must not be misrepresented; you must not
  14.    claim that you wrote the original software. If you use this software
  15.    in a product, an acknowledgment in the product documentation would be
  16.    appreciated but is not required.
  17.   2. Altered source versions must be plainly marked as such, and must not be
  18.    misrepresented as being the original software.
  19.   3. This notice may not be removed or altered from any source distribution.
  20. */
  21. #define MAKENSISW_CPP
  22.  
  23. #include <windows.h>
  24. #include <WindowsX.h>
  25. #include <stdio.h>
  26. #include "makensisw.h"
  27. #include "resource.h"
  28. #include "noclib.h"
  29. #include "toolbar.h"
  30.  
  31. NSCRIPTDATA g_sdata;
  32. NRESIZEDATA g_resize;
  33. NFINDREPLACE g_find;
  34. extern NTOOLBAR g_toolbar;
  35. int g_symbol_set_mode;
  36.  
  37. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmdShow) {
  38.   MSG  msg;
  39.   int status;
  40.   HACCEL haccel;
  41.  
  42.   my_memset(&g_sdata,0,sizeof(NSCRIPTDATA));
  43.   my_memset(&g_resize,0,sizeof(NRESIZEDATA));
  44.   my_memset(&g_find,0,sizeof(NFINDREPLACE));
  45.   g_sdata.hInstance=GetModuleHandle(0);
  46.   g_sdata.script_alloced=false;
  47.   g_sdata.symbols = NULL;
  48.   RestoreSymbols();
  49.  
  50.   if (!InitBranding()) {
  51.     MessageBox(0,NSISERROR,"Error",MB_ICONEXCLAMATION|MB_OK);
  52.     return 1;
  53.   }
  54.   ResetObjects();
  55.   HWND hDialog = CreateDialog(g_sdata.hInstance,MAKEINTRESOURCE(DLG_MAIN),0,DialogProc);
  56.   if (!hDialog) {
  57.     MessageBox(0,DLGERROR,"Error",MB_ICONEXCLAMATION|MB_OK);
  58.     return 1;
  59.   }
  60.   haccel = LoadAccelerators(g_sdata.hInstance, MAKEINTRESOURCE(IDK_ACCEL));
  61.   while ((status=GetMessage(&msg,0,0,0))!=0) {
  62.     if (status==-1) return -1;
  63.     if (!IsDialogMessage(g_find.hwndFind, &msg)) {
  64.       if (!TranslateAccelerator(hDialog,haccel,&msg)) {
  65.         if (!IsDialogMessage(hDialog,&msg)) {
  66.           TranslateMessage(&msg);
  67.           DispatchMessage(&msg);
  68.         }
  69.       }
  70.     }
  71.   }
  72.   if (g_sdata.script_alloced) GlobalFree(g_sdata.script);
  73.   ExitProcess(msg.wParam);
  74.   return msg.wParam;
  75. }
  76.  
  77. void ResetInputScript()
  78. {
  79.   if(g_sdata.input_script) {
  80.     g_sdata.script_alloced = true;
  81.     g_sdata.script = (char *)GlobalAlloc(GPTR, (lstrlen(g_sdata.input_script)+3)*sizeof(char));
  82.     wsprintf(g_sdata.script,"\"%s\"",g_sdata.input_script);
  83.   }
  84. }
  85.  
  86. BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
  87.   static HINSTANCE hRichEditDLL = 0;
  88.   if (!hRichEditDLL) hRichEditDLL= LoadLibrary("RichEd32.dll");
  89.   switch (msg) {
  90.     case WM_INITDIALOG:
  91.     {
  92.       int argc;
  93.       char **argv;
  94.       int i, j;
  95.       int argSpaceSize;
  96.       bool chooseCompressor = false;
  97.  
  98.       g_sdata.hwnd=hwndDlg;
  99.       HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON));
  100.       SetClassLong(hwndDlg,GCL_HICON,(long)hIcon);
  101.       // Altered by Darren Owen (DrO) on 29/9/2003
  102.       // Added in receiving of mouse and key events from the richedit control
  103.       SendMessage(GetDlgItem(hwndDlg,IDC_LOGWIN),EM_SETEVENTMASK,NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS);
  104.       DragAcceptFiles(g_sdata.hwnd,FALSE);
  105.       g_sdata.menu = GetMenu(g_sdata.hwnd);
  106.       g_sdata.fileSubmenu = GetSubMenu(g_sdata.menu, FILE_MENU_INDEX);
  107.       g_sdata.editSubmenu = GetSubMenu(g_sdata.menu, EDIT_MENU_INDEX);
  108.       g_sdata.toolsSubmenu = GetSubMenu(g_sdata.menu, TOOLS_MENU_INDEX);
  109.       RestoreMRUList();
  110.       CreateToolBar();
  111.       InitTooltips(g_sdata.hwnd);
  112.       SetBranding(g_sdata.hwnd);
  113.       HFONT hFont = CreateFont(14,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,"Courier New");
  114.       SendDlgItemMessage(hwndDlg,IDC_LOGWIN,WM_SETFONT,(WPARAM)hFont,0);
  115.       RestoreWindowPos(g_sdata.hwnd);
  116.       RestoreCompressor();
  117.       g_sdata.compressor =  (NCOMPRESSOR)-1;
  118.  
  119.       argSpaceSize = SetArgv((char *)GetCommandLine(), &argc, &argv);
  120.       if(argc > 1) {
  121.         int n;
  122.  
  123.         g_sdata.script_alloced = true;
  124.         g_sdata.script = (char *) GlobalAlloc(GPTR,argSpaceSize+2*(argc-1)*sizeof(char)+1);
  125.         lstrcpy(g_sdata.script,"");
  126.         for(i=1; i<argc; i++) {
  127.           if(!lstrncmpi(argv[i],"/XSetCompressor ",lstrlen("/XSetCompressor "))) {
  128.             char *p = argv[i]+lstrlen("/XSetCompressor ");
  129.             if(!lstrncmpi(p,"/FINAL ",lstrlen("/FINAL "))) {
  130.               p += lstrlen("/FINAL ");
  131.             }
  132.             while(*p == ' ') p++;
  133.             if(p && lstrlen(p)) {
  134.               for(j=(int)COMPRESSOR_SCRIPT+1; j < (int)COMPRESSOR_BEST; j++) {
  135.                 if(!lstrcmpi(p,compressor_names[j])) {
  136.                   SetCompressor((NCOMPRESSOR)j);
  137.                 }
  138.               }
  139.             }
  140.           }
  141.           else if(!lstrcmpi(argv[i],"/ChooseCompressor")) {
  142.             chooseCompressor = true;
  143.           }
  144.           else {
  145.             lstrcat(g_sdata.script,"\"");
  146.             lstrcat(g_sdata.script,argv[i]);
  147.             lstrcat(g_sdata.script,"\" ");
  148.           }
  149.         }
  150.         n = lstrlen(g_sdata.script);
  151.         if(n > 0) {
  152.           g_sdata.script[n-1] = '\0';
  153.         }
  154.         PushMRUFile(argv[argc-1]);
  155.       }
  156.       if (argSpaceSize)
  157.         GlobalFree(argv);
  158.  
  159.       if(g_sdata.compressor == (NCOMPRESSOR)-1) {
  160.         SetCompressor(g_sdata.default_compressor);
  161.       }
  162.       if(chooseCompressor) {
  163.         if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,(DLGPROC)CompressorProc)) {
  164.           EnableItems(g_sdata.hwnd);
  165.           return TRUE;
  166.         }
  167.       }
  168.       CompileNSISScript();
  169.       return TRUE;
  170.     }
  171.     case WM_PAINT:
  172.     {
  173.       PAINTSTRUCT ps;
  174.       GetClientRect(g_sdata.hwnd, &g_resize.griprect);
  175.       HDC hdc = BeginPaint(g_sdata.hwnd, &ps);
  176.       g_resize.griprect.left = g_resize.griprect.right - GetSystemMetrics(SM_CXVSCROLL);
  177.       g_resize.griprect.top = g_resize.griprect.bottom - GetSystemMetrics(SM_CYVSCROLL);
  178.       DrawFrameControl(hdc, &g_resize.griprect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
  179.       EndPaint(g_sdata.hwnd,&ps);
  180.       return TRUE;
  181.     }
  182.     case WM_DESTROY:
  183.     {
  184.       SaveSymbols();
  185.       SaveCompressor();
  186.       SaveMRUList();
  187.       SaveWindowPos(g_sdata.hwnd);
  188.       DestroyTooltips();
  189.       PostQuitMessage(0);
  190.       return TRUE;
  191.     }
  192.     case WM_CLOSE:
  193.     {
  194.       if (!g_sdata.thread) {
  195.         DragAcceptFiles(g_sdata.hwnd,FALSE);
  196.         ImageList_Destroy(g_toolbar.imagelist);
  197.         ImageList_Destroy(g_toolbar.imagelistd);
  198.         ImageList_Destroy(g_toolbar.imagelisth);
  199.         DestroyWindow(hwndDlg);
  200.         FreeLibrary(hRichEditDLL);
  201.       }
  202.       return TRUE;
  203.     }
  204.     case WM_DROPFILES: {
  205.       int num;
  206.       char szTmp[MAX_PATH];
  207.       num = DragQueryFile((HDROP)wParam,-1,NULL,0);
  208.       if (num==1) {
  209.         DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH);
  210.         if (lstrlen(szTmp)>0) {
  211.           g_sdata.script_alloced = true;
  212.           g_sdata.script = (char *)GlobalAlloc(GPTR,sizeof(szTmp)+7);
  213.           wsprintf(g_sdata.script,"\"%s\"",szTmp);
  214.           PushMRUFile(g_sdata.script);
  215.           ResetObjects();
  216.           CompileNSISScript();
  217.         }
  218.       }
  219.       break;
  220.     }
  221.     case WM_GETMINMAXINFO:
  222.     {
  223.       ((MINMAXINFO*)lParam)->ptMinTrackSize.x=MINWIDTH;
  224.       ((MINMAXINFO*)lParam)->ptMinTrackSize.y=MINHEIGHT;
  225.     }
  226.     case WM_ENTERSIZEMOVE:
  227.     {
  228.       GetClientRect(g_sdata.hwnd, &g_resize.resizeRect);
  229.       return TRUE;
  230.     }
  231.     case WM_SIZE:
  232.     {
  233.       if ((wParam == SIZE_MAXHIDE)||(wParam == SIZE_MAXSHOW)) return TRUE;
  234.       RECT rSize;
  235.       if (hwndDlg == g_sdata.hwnd) {
  236.         GetClientRect(g_sdata.hwnd, &rSize);
  237.         if (((rSize.right==0)&&(rSize.bottom==0))||((g_resize.resizeRect.right==0)&&(g_resize.resizeRect.bottom==0)))  return TRUE;
  238.         g_resize.dx = rSize.right - g_resize.resizeRect.right;
  239.         g_resize.dy = rSize.bottom - g_resize.resizeRect.bottom;
  240.         EnumChildWindows(g_sdata.hwnd, DialogResize, (LPARAM)0);
  241.         g_resize.resizeRect = rSize;
  242.       }
  243.       return TRUE;
  244.     }
  245.     case WM_SIZING:
  246.     {
  247.       InvalidateRect(g_sdata.hwnd,&g_resize.griprect,TRUE);
  248.       GetClientRect(g_sdata.hwnd, &g_resize.griprect);
  249.       g_resize.griprect.left = g_resize.griprect.right - GetSystemMetrics(SM_CXVSCROLL);
  250.       g_resize.griprect.top = g_resize.griprect.bottom - GetSystemMetrics(SM_CYVSCROLL);
  251.       return TRUE;
  252.     }
  253.     case WM_MAKENSIS_PROCESSCOMPLETE:
  254.     {
  255.       if (g_sdata.thread) {
  256.         CloseHandle(g_sdata.thread);
  257.         g_sdata.thread=0;
  258.       }
  259.       if(g_sdata.compressor == COMPRESSOR_BEST) {
  260.         if (g_sdata.retcode==0 && FileExists(g_sdata.output_exe)) {
  261.           char temp_file_name[1024];
  262.           wsprintf(temp_file_name,"%s_makensisw_temp",g_sdata.output_exe);
  263.           if(!lstrcmpi(g_sdata.compressor_name,compressor_names[(int)COMPRESSOR_SCRIPT+1])) {
  264.             SetCompressorStats();
  265.             CopyFile(g_sdata.output_exe,temp_file_name,false);
  266.             g_sdata.best_compressor_name = g_sdata.compressor_name;
  267.             g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+2];
  268.             ResetObjects();
  269.             ResetInputScript();
  270.  
  271.             CompileNSISScript();
  272.             return TRUE;
  273.           }
  274.           else {
  275.             int this_compressor;
  276.             int last_compressor;
  277.             int i;
  278.             HANDLE hPrev, hThis;
  279.             DWORD prevSize, thisSize;
  280.  
  281.  
  282.             for(i=(int)COMPRESSOR_SCRIPT+2; i<(int)COMPRESSOR_BEST; i++) {
  283.               if(!lstrcmpi(g_sdata.compressor_name,compressor_names[i])) {
  284.                 this_compressor = i;
  285.                 last_compressor = i-1;
  286.                 break;
  287.               }
  288.             }
  289.  
  290.             if(FileExists(temp_file_name)) {
  291.               hPrev = CreateFile(temp_file_name,GENERIC_READ, FILE_SHARE_READ,
  292.                                  NULL, OPEN_EXISTING, NULL, NULL);
  293.               if(hPrev != INVALID_HANDLE_VALUE) {
  294.                 prevSize = GetFileSize(hPrev, 0);
  295.                 CloseHandle(hPrev);
  296.  
  297.                 if(prevSize != INVALID_FILE_SIZE) {
  298.                   hThis = CreateFile(g_sdata.output_exe,GENERIC_READ, FILE_SHARE_READ,
  299.                                      NULL, OPEN_EXISTING, NULL, NULL);
  300.                   if(hThis != INVALID_HANDLE_VALUE) {
  301.                     thisSize = GetFileSize(hThis, 0);
  302.                     CloseHandle(hThis);
  303.  
  304.                     if(thisSize != INVALID_FILE_SIZE) {
  305.                       if(prevSize > thisSize) {
  306.                         CopyFile(g_sdata.output_exe,temp_file_name,false);
  307.                         SetCompressorStats();
  308.                         g_sdata.best_compressor_name = g_sdata.compressor_name;
  309.                       }
  310.                     }
  311.                   }
  312.                 }
  313.               }
  314.             }
  315.  
  316.             if(this_compressor == ((int)COMPRESSOR_BEST - 1)) {
  317.               char buf[1024];
  318.  
  319.               g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1];
  320.               g_sdata.appended = false;
  321.               ResetInputScript();
  322.  
  323.               if(!lstrcmpi(g_sdata.best_compressor_name,compressor_names[this_compressor])) {
  324.                 wsprintf(buf,COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,thisSize);
  325.                 LogMessage(g_sdata.hwnd,buf);
  326.               }
  327.               else {
  328.                 CopyFile(temp_file_name,g_sdata.output_exe,false);
  329.                 wsprintf(buf,RESTORED_COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,prevSize);
  330.                 LogMessage(g_sdata.hwnd,buf);
  331.                 LogMessage(g_sdata.hwnd, g_sdata.compressor_stats);
  332.               }
  333.               DeleteFile(temp_file_name);
  334.               ResetInputScript();
  335.               lstrcpy(g_sdata.compressor_stats,"");
  336.             }
  337.             else {
  338.               g_sdata.compressor_name = compressor_names[this_compressor+1];
  339.               ResetObjects();
  340.               ResetInputScript();
  341.  
  342.               CompileNSISScript();
  343.               return TRUE;
  344.             }
  345.           }
  346.         }
  347.       }
  348.       EnableItems(g_sdata.hwnd);
  349.       if (!g_sdata.retcode) {
  350.         MessageBeep(MB_ICONASTERISK);
  351.         if (g_sdata.warnings)
  352.           SetTitle(g_sdata.hwnd,"Finished with Warnings");
  353.         else
  354.           SetTitle(g_sdata.hwnd,"Finished Sucessfully");
  355.         // Added by Darren Owen (DrO) on 1/10/2003
  356.         if(g_sdata.recompile_test)
  357.           PostMessage(g_sdata.hwnd, WM_COMMAND, LOWORD(IDC_TEST), 0);
  358.       }
  359.       else {
  360.         MessageBeep(MB_ICONEXCLAMATION);
  361.         SetTitle(g_sdata.hwnd,"Compile Error: See Log for Details");
  362.       }
  363.  
  364.       // Added by Darren Owen (DrO) on 1/10/2003
  365.       // ensures the recompile and run state is reset after use
  366.       g_sdata.recompile_test = 0;
  367.       DragAcceptFiles(g_sdata.hwnd,TRUE);
  368.       return TRUE;
  369.     }
  370.     case WM_NOTIFY:
  371.       switch (((NMHDR*)lParam)->code ) {
  372.         case EN_SELCHANGE:
  373.           SendDlgItemMessage(hwndDlg,IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM) &g_sdata.textrange);
  374.           {
  375.             BOOL enabled = (g_sdata.textrange.cpMax-g_sdata.textrange.cpMin<=0?FALSE:TRUE);
  376.             EnableMenuItem(g_sdata.menu,IDM_COPYSELECTED,(enabled?MF_ENABLED:MF_GRAYED));
  377.             EnableToolBarButton(IDM_COPY,enabled);
  378.           }
  379.         // Altered by Darren Owen (DrO) on 6/10/2003
  380.         // Allows the detection of the right-click menu when running on OSes below Windows 2000
  381.         // and will then simulate the effective WM_CONTEXTMENU message that would be received
  382.         // note: removed the WM_CONTEXTMENU handling to prevent a duplicate menu appearing on
  383.         // Windows 2000 and higher
  384.         case EN_MSGFILTER:
  385.           #define lpnmMsg ((MSGFILTER*)lParam)
  386.           if(WM_RBUTTONUP == lpnmMsg->msg || WM_KEYUP == lpnmMsg->msg && lpnmMsg->wParam == VK_APPS){
  387.           POINT pt;
  388.           HWND edit = GetDlgItem(g_sdata.hwnd,IDC_LOGWIN);
  389.           RECT r;
  390.             GetCursorPos(&pt);
  391.  
  392.             // Added and altered by Darren Owen (DrO) on 29/9/2003
  393.             // Will place the right-click menu in the top left corner of the window
  394.             // if the application key is pressed and the mouse is not in the window
  395.             // from here...
  396.             ScreenToClient(edit, &pt);
  397.             GetClientRect(edit, &r);
  398.             if(!PtInRect(&r, pt))
  399.               pt.x = pt.y = 0;
  400.             MapWindowPoints(edit, HWND_DESKTOP, &pt, 1);
  401.             TrackPopupMenu(g_sdata.editSubmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, 0, g_sdata.hwnd, 0);
  402.           }
  403.         case TBN_DROPDOWN:
  404.         {
  405.           LPNMTOOLBAR pToolBar = (LPNMTOOLBAR) lParam;
  406.           if(pToolBar->hdr.hwndFrom == g_toolbar.hwnd && pToolBar->iItem == IDM_COMPRESSOR) {
  407.             ShowToolbarDropdownMenu();
  408.             return TBDDRET_DEFAULT;
  409.           }
  410.           else {
  411.             return TBDDRET_NODEFAULT;
  412.           }
  413.         }
  414.       }
  415.       return TRUE;
  416.     case WM_COPYDATA:
  417.     {
  418.       PCOPYDATASTRUCT cds = PCOPYDATASTRUCT(lParam);
  419.       switch (cds->dwData) {
  420.         case MAKENSIS_NOTIFY_SCRIPT:
  421.           if (g_sdata.input_script) GlobalFree(g_sdata.input_script);
  422.           g_sdata.input_script = (char *)GlobalAlloc(GPTR, cds->cbData);
  423.           lstrcpy(g_sdata.input_script, (char *)cds->lpData);
  424.           break;
  425.         case MAKENSIS_NOTIFY_WARNING:
  426.           g_sdata.warnings++;
  427.           break;
  428.         case MAKENSIS_NOTIFY_ERROR:
  429.           break;
  430.         case MAKENSIS_NOTIFY_OUTPUT:
  431.           if (g_sdata.output_exe) GlobalFree(g_sdata.output_exe);
  432.           g_sdata.output_exe = (char *)GlobalAlloc(GPTR, cds->cbData);
  433.           lstrcpy(g_sdata.output_exe, (char *)cds->lpData);
  434.           break;
  435.       }
  436.       return TRUE;
  437.     }
  438.     case WM_COMMAND:
  439.     {
  440.       switch (LOWORD(wParam)) {
  441.         case IDM_BROWSESCR: {
  442.           if (g_sdata.input_script) {
  443.             char str[MAX_PATH],*str2;
  444.             lstrcpy(str,g_sdata.input_script);
  445.             str2=my_strrchr(str,'\\');
  446.             if(str2!=NULL) *str2=0;
  447.             ShellExecute(g_sdata.hwnd,"open",str,NULL,NULL,SW_SHOWNORMAL);
  448.           }
  449.           return TRUE;
  450.         }
  451.         case IDM_ABOUT:
  452.         {
  453.           DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_ABOUT),g_sdata.hwnd,(DLGPROC)AboutProc);
  454.           return TRUE;
  455.         }
  456.         case IDM_NSISHOME:
  457.         {
  458.           ShellExecute(g_sdata.hwnd,"open",NSIS_URL,NULL,NULL,SW_SHOWNORMAL);
  459.           return TRUE;
  460.         }
  461.         case IDM_FORUM:
  462.         {
  463.           ShellExecute(g_sdata.hwnd,"open",NSIS_FOR,NULL,NULL,SW_SHOWNORMAL);
  464.           return TRUE;
  465.         }
  466.         case IDM_NSISUPDATE:
  467.         {
  468.           int rv;
  469.           rv = MessageBox(g_sdata.hwnd,NSISUPDATEPROMPT,"Question",MB_YESNO|MB_ICONQUESTION);
  470.           if(rv == IDYES) {
  471.             char pathf[MAX_PATH],*path;
  472.             GetModuleFileName(NULL,pathf,sizeof(pathf));
  473.             path=my_strrchr(pathf,'\\');
  474.             if(path!=NULL) *path=0;
  475.             lstrcat(pathf,NSIS_UPDATE);
  476.             ShellExecute(g_sdata.hwnd,"open",pathf,NULL,NULL,SW_SHOWNORMAL);
  477.             PostMessage(g_sdata.hwnd,WM_COMMAND, IDM_EXIT, 0);
  478.           }
  479.           return TRUE;
  480.         }
  481.         case IDM_SELECTALL:
  482.         {
  483.           SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_SETSEL, 0, -1);
  484.           return TRUE;
  485.         }
  486.         case IDM_DOCS:
  487.         {
  488.           ShowDocs();
  489.           return TRUE;
  490.         }
  491.         case IDM_LOADSCRIPT:
  492.         {
  493.           if (!g_sdata.thread) {
  494.             OPENFILENAME l={sizeof(l),};
  495.             char buf[MAX_PATH];
  496.             l.hwndOwner = hwndDlg;
  497.             l.lpstrFilter = "NSIS Script (*.nsi)\0*.nsi\0All Files (*.*)\0*.*\0";
  498.             l.lpstrFile = buf;
  499.             l.nMaxFile = MAX_STRING-1;
  500.             l.lpstrTitle = "Load Script";
  501.             l.lpstrDefExt = "log";
  502.             l.lpstrFileTitle = NULL;
  503.             l.lpstrInitialDir = NULL;
  504.             l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
  505.             lstrcpy(buf,"");
  506.             if (GetOpenFileName(&l)) {
  507.               g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(buf)+3);
  508.               wsprintf(g_sdata.script,"\"%s\"",buf);
  509.               PushMRUFile(g_sdata.script);
  510.               ResetObjects();
  511.               CompileNSISScript();
  512.             }
  513.           }
  514.           return TRUE;
  515.         }
  516.         case IDM_MRU_FILE:
  517.         case IDM_MRU_FILE+1:
  518.         case IDM_MRU_FILE+2:
  519.         case IDM_MRU_FILE+3:
  520.         case IDM_MRU_FILE+4:
  521.           LoadMRUFile(LOWORD(wParam)-IDM_MRU_FILE);
  522.           return TRUE;
  523.         case IDM_CLEAR_MRU_LIST:
  524.           ClearMRUList();
  525.           return TRUE;
  526.         case IDM_COMPRESSOR:
  527.         {
  528.           SetCompressor((NCOMPRESSOR)(g_sdata.compressor+1));
  529.           return TRUE;
  530.         }
  531.         case IDM_CLEARLOG:
  532.         {
  533.           if (!g_sdata.thread) {
  534.             ClearLog(g_sdata.hwnd);
  535.           }
  536.           return TRUE;
  537.         }
  538.         case IDM_RECOMPILE:
  539.         {
  540.           CompileNSISScript();
  541.           return TRUE;
  542.         }
  543.         // Added by Darren Owen (DrO) on 1/10/2003
  544.         case IDM_RECOMPILE_TEST:
  545.         case IDC_RECOMPILE_TEST:
  546.         {
  547.           g_sdata.recompile_test = 1;
  548.           CompileNSISScript();
  549.           return TRUE;
  550.         }
  551.         case IDM_SETTINGS:
  552.         {
  553.           DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SETTINGS),g_sdata.hwnd,(DLGPROC)SettingsProc);
  554.           return TRUE;
  555.         }
  556.         case IDM_TEST:
  557.         case IDC_TEST:
  558.         {
  559.           if (g_sdata.output_exe) {
  560.             ShellExecute(g_sdata.hwnd,"open",g_sdata.output_exe,NULL,NULL,SW_SHOWNORMAL);
  561.           }
  562.           return TRUE;
  563.         }
  564.         case IDM_EDITSCRIPT:
  565.         {
  566.           if (g_sdata.input_script) {
  567.             if ((int)ShellExecute(g_sdata.hwnd,"open",g_sdata.input_script,NULL,NULL,SW_SHOWNORMAL)<=32) {
  568.               char path[MAX_PATH];
  569.               if (GetWindowsDirectory(path,sizeof(path))) {
  570.                 lstrcat(path,"\\notepad.exe");
  571.                 ShellExecute(g_sdata.hwnd,"open",path,g_sdata.input_script,NULL,SW_SHOWNORMAL);
  572.               }
  573.             }
  574.           }
  575.           return TRUE;
  576.         }
  577.         case IDC_CLOSE:
  578.         case IDM_EXIT:
  579.         {
  580.           if (!g_sdata.thread) {
  581.             DestroyWindow(g_sdata.hwnd);
  582.           }
  583.           return TRUE;
  584.         }
  585.         case IDM_COPY:
  586.         {
  587.           CopyToClipboard(g_sdata.hwnd);
  588.           return TRUE;
  589.         }
  590.         case IDM_COPYSELECTED:
  591.         {
  592.           SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN, WM_COPY, 0, 0);
  593.           return TRUE;
  594.         }
  595.         case IDM_SAVE:
  596.         {
  597.           OPENFILENAME l={sizeof(l),};
  598.           char buf[MAX_STRING];
  599.           l.hwndOwner = hwndDlg;
  600.           l.lpstrFilter = "Log Files (*.log)\0*.log\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
  601.           l.lpstrFile = buf;
  602.           l.nMaxFile = MAX_STRING-1;
  603.           l.lpstrTitle = "Save Output";
  604.           l.lpstrDefExt = "log";
  605.           l.lpstrInitialDir = NULL;
  606.           l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST;
  607.           lstrcpy(buf,"output");
  608.           if (GetSaveFileName(&l)) {
  609.             HANDLE hFile = CreateFile(buf,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
  610.             if (hFile) {
  611.               int len=SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0);
  612.               char *existing_text=(char*)GlobalAlloc(GPTR,len);
  613.               existing_text[0]=0;
  614.               GetDlgItemText(g_sdata.hwnd, IDC_LOGWIN, existing_text, len);
  615.               DWORD dwWritten = 0;
  616.               WriteFile(hFile,existing_text,len,&dwWritten,0);
  617.               CloseHandle(hFile);
  618.               GlobalFree(existing_text);
  619.             }
  620.           }
  621.           return TRUE;
  622.         }
  623.         case IDM_FIND:
  624.         {
  625.           if (!g_find.uFindReplaceMsg) g_find.uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);
  626.           my_memset(&g_find.fr, 0, sizeof(FINDREPLACE));
  627.           g_find.fr.lStructSize = sizeof(FINDREPLACE);
  628.           g_find.fr.hwndOwner = hwndDlg;
  629.           g_find.fr.Flags = FR_NOUPDOWN;
  630.           g_find.fr.lpstrFindWhat = (char *)GlobalAlloc(GPTR, 128);
  631.           if (!g_find.fr.lpstrFindWhat) return TRUE;
  632.           g_find.fr.wFindWhatLen = 128;
  633.           g_find.hwndFind = FindText(&g_find.fr);
  634.           return TRUE;
  635.         }
  636.         default:
  637.           {
  638.             int i;
  639.             DWORD command = LOWORD(wParam);
  640.             for(i=(int)COMPRESSOR_SCRIPT; i<=(int)COMPRESSOR_BEST; i++) {
  641.               if(command == compressor_commands[i]) {
  642.                 SetCompressor((NCOMPRESSOR)i);
  643.                 return TRUE;
  644.               }
  645.             }
  646.           }
  647.       }
  648.     }
  649.   }
  650.   if (g_find.uFindReplaceMsg && msg == g_find.uFindReplaceMsg) {
  651.     LPFINDREPLACE lpfr = (LPFINDREPLACE)lParam;
  652.     if (lpfr->Flags & FR_FINDNEXT) {
  653.       WPARAM flags = FR_DOWN;
  654.       if (lpfr->Flags & FR_MATCHCASE) flags |= FR_MATCHCASE;
  655.       if (lpfr->Flags & FR_WHOLEWORD) flags |= FR_WHOLEWORD;
  656.       FINDTEXTEX ft;
  657.       SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM)&ft.chrg);
  658.       if (ft.chrg.cpMax == ft.chrg.cpMin) ft.chrg.cpMin = 0;
  659.       else ft.chrg.cpMin = ft.chrg.cpMax;
  660.       ft.chrg.cpMax = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, WM_GETTEXTLENGTH, 0, 0);
  661.       ft.lpstrText = lpfr->lpstrFindWhat;
  662.       ft.chrg.cpMin = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_FINDTEXTEX, flags, (LPARAM)&ft);
  663.       if (ft.chrg.cpMin != -1) SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_SETSEL, ft.chrgText.cpMin, ft.chrgText.cpMax);
  664.       else MessageBeep(MB_ICONASTERISK);
  665.     }
  666.     if (lpfr->Flags & FR_DIALOGTERM) g_find.hwndFind = 0;
  667.     return TRUE;
  668.   }
  669.   return 0;
  670. }
  671.  
  672. DWORD WINAPI MakeNSISProc(LPVOID p) {
  673.   STARTUPINFO si={sizeof(si),};
  674.   SECURITY_ATTRIBUTES sa={sizeof(sa),};
  675.   SECURITY_DESCRIPTOR sd={0,};
  676.   PROCESS_INFORMATION pi={0,};
  677.   HANDLE newstdout=0,read_stdout=0;
  678.   OSVERSIONINFO osv={sizeof(osv)};
  679.   GetVersionEx(&osv);
  680.   if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) {
  681.     InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
  682.     SetSecurityDescriptorDacl(&sd,true,NULL,false);
  683.     sa.lpSecurityDescriptor = &sd;
  684.   }
  685.   else sa.lpSecurityDescriptor = NULL;
  686.   sa.bInheritHandle = true;
  687.   if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) {
  688.     ErrorMessage(g_sdata.hwnd,"There was an error creating the pipe.");
  689.     PostMessage(g_sdata.hwnd,WM_MAKENSIS_PROCESSCOMPLETE,0,0);
  690.     return 1;
  691.   }
  692.   GetStartupInfo(&si);
  693.   si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
  694.   si.wShowWindow = SW_HIDE;
  695.   si.hStdOutput = newstdout;
  696.   si.hStdError = newstdout;
  697.   if (!CreateProcess(NULL,g_sdata.script,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi)) {
  698.     char buf[MAX_STRING];
  699.     wsprintf(buf,"Could not execute:\r\n %s.",g_sdata.script);
  700.     ErrorMessage(g_sdata.hwnd,buf);
  701.     CloseHandle(newstdout);
  702.     CloseHandle(read_stdout);
  703.     PostMessage(g_sdata.hwnd,WM_MAKENSIS_PROCESSCOMPLETE,0,0);
  704.     return 1;
  705.   }
  706.   char szBuf[1024];
  707.   DWORD dwRead = 1;
  708.   DWORD dwExit = !STILL_ACTIVE;
  709.   while (dwExit == STILL_ACTIVE || dwRead) {
  710.     PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL);
  711.     if (dwRead) {
  712.       ReadFile(read_stdout, szBuf, sizeof(szBuf)-1, &dwRead, NULL);
  713.       szBuf[dwRead] = 0;
  714.       LogMessage(g_sdata.hwnd, szBuf);
  715.     }
  716.     else Sleep(TIMEOUT);
  717.     GetExitCodeProcess(pi.hProcess, &dwExit);
  718.     // Make sure we have no data before killing getting out of the loop
  719.     if (dwExit != STILL_ACTIVE) {
  720.       PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL);
  721.     }
  722.   }
  723.  
  724.   g_sdata.retcode = dwExit;
  725.   CloseHandle(pi.hThread);
  726.   CloseHandle(pi.hProcess);
  727.   CloseHandle(newstdout);
  728.   CloseHandle(read_stdout);
  729.   PostMessage(g_sdata.hwnd,WM_MAKENSIS_PROCESSCOMPLETE,0,0);
  730.   return 0;
  731. }
  732.  
  733. BOOL CALLBACK DialogResize(HWND hWnd, LPARAM /* unused */)
  734. {
  735.   RECT r;
  736.   GetWindowRect(hWnd, &r);
  737.   ScreenToClient(g_sdata.hwnd, (LPPOINT)&r);
  738.   ScreenToClient(g_sdata.hwnd, ((LPPOINT)&r)+1);
  739.   if(hWnd != g_toolbar.hwnd) {
  740.     switch (GetDlgCtrlID(hWnd)) {
  741.       case IDC_LOGWIN:
  742.         SetWindowPos(hWnd, 0, r.left, r.top,r.right - r.left + g_resize.dx, r.bottom - r.top + g_resize.dy, SWP_NOZORDER|SWP_NOMOVE);
  743.         break;
  744.       case IDC_TEST:
  745.       case IDC_CLOSE:
  746.         SetWindowPos(hWnd, 0, r.left + g_resize.dx, r.top + g_resize.dy, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
  747.         break;
  748.       default:
  749.         SetWindowPos(hWnd, 0, r.left, r.top + g_resize.dy, r.right - r.left + g_resize.dx, r.bottom - r.top, SWP_NOZORDER);
  750.         break;
  751.     }
  752.   }
  753.   else {
  754.       RECT r2;
  755.       GetWindowRect(g_toolbar.hwnd, &r2);
  756.       SetWindowPos(hWnd, 0, 0, 0, r.right - r.left + g_resize.dx, r2.bottom-r2.top, SWP_NOMOVE|SWP_NOZORDER);
  757.   }
  758.   RedrawWindow(hWnd,NULL,NULL,RDW_INVALIDATE);
  759.   return TRUE;
  760. }
  761.  
  762. BOOL CALLBACK AboutProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
  763.   switch(msg) {
  764.     case WM_INITDIALOG:
  765.     {
  766.       HFONT bfont = CreateFont(13,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
  767.               OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
  768.               FIXED_PITCH|FF_DONTCARE, "Tahoma");
  769.       HFONT bfontb = CreateFont(13,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
  770.               OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
  771.               FIXED_PITCH|FF_DONTCARE, "Tahoma");
  772.       HFONT rfont = CreateFont(12,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
  773.               OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
  774.               FIXED_PITCH|FF_DONTCARE, "MS Shell Dlg");
  775.       HFONT rfontb = CreateFont(12,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
  776.               OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
  777.               FIXED_PITCH|FF_DONTCARE, "MS Shell Dlg");
  778.       if (bfont&&bfontb) {
  779.         SendDlgItemMessage(hwndDlg, IDC_ABOUTVERSION, WM_SETFONT, (WPARAM)bfontb, FALSE);
  780.         SendDlgItemMessage(hwndDlg, IDC_ABOUTCOPY, WM_SETFONT, (WPARAM)bfont, FALSE);
  781.         SendDlgItemMessage(hwndDlg, IDC_ABOUTPORTIONS, WM_SETFONT, (WPARAM)bfont, FALSE);
  782.         SendDlgItemMessage(hwndDlg, IDC_NSISVER, WM_SETFONT, (WPARAM)bfont, FALSE);
  783.         SendDlgItemMessage(hwndDlg, IDC_OTHERCONTRIB, WM_SETFONT, (WPARAM)bfont, FALSE);
  784.       }
  785.       else if (rfont&&rfontb) {
  786.         SendDlgItemMessage(hwndDlg, IDC_ABOUTVERSION, WM_SETFONT, (WPARAM)rfontb, FALSE);
  787.         SendDlgItemMessage(hwndDlg, IDC_ABOUTCOPY, WM_SETFONT, (WPARAM)rfont, FALSE);
  788.         SendDlgItemMessage(hwndDlg, IDC_ABOUTPORTIONS, WM_SETFONT, (WPARAM)rfont, FALSE);
  789.         SendDlgItemMessage(hwndDlg, IDC_NSISVER, WM_SETFONT, (WPARAM)rfont, FALSE);
  790.         SendDlgItemMessage(hwndDlg, IDC_OTHERCONTRIB, WM_SETFONT, (WPARAM)rfont, FALSE);
  791.       }
  792.       SetDlgItemText(hwndDlg,IDC_NSISVER,g_sdata.branding);
  793.       SetDlgItemText(hwndDlg,IDC_ABOUTVERSION,NSISW_VERSION);
  794.       SetDlgItemText(hwndDlg,IDC_ABOUTCOPY,COPYRIGHT);
  795.       SetDlgItemText(hwndDlg,IDC_OTHERCONTRIB,CONTRIB);
  796.       break;
  797.     }
  798.     case WM_COMMAND:
  799.     {
  800.       switch (LOWORD(wParam)) {
  801.         case IDOK:
  802.           EndDialog(hwndDlg, TRUE);
  803.           break;
  804.       }
  805.     }
  806.   }
  807.   return FALSE;
  808. }
  809.  
  810. void EnableSymbolSetButtons(HWND hwndDlg)
  811. {
  812.   int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETCOUNT, 0, 0);
  813.   if(n > 0) {
  814.     EnableWindow(GetDlgItem(hwndDlg, IDCLEAR), TRUE);
  815.     EnableWindow(GetDlgItem(hwndDlg, IDSAVE), TRUE);
  816.   }
  817.   else {
  818.     EnableWindow(GetDlgItem(hwndDlg, IDCLEAR), FALSE);
  819.     EnableWindow(GetDlgItem(hwndDlg, IDSAVE), FALSE);
  820.   }
  821. }
  822.  
  823. void EnableSymbolEditButtons(HWND hwndDlg)
  824. {
  825.   int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0);
  826.   if(n == 0) {
  827.     EnableWindow(GetDlgItem(hwndDlg, IDLEFT), FALSE);
  828.     EnableWindow(GetDlgItem(hwndDlg, IDDEL), FALSE);
  829.   }
  830.   else if(n == 1) {
  831.     EnableWindow(GetDlgItem(hwndDlg, IDLEFT), TRUE);
  832.     EnableWindow(GetDlgItem(hwndDlg, IDDEL), TRUE);
  833.   }
  834.   else if(n > 1) {
  835.     EnableWindow(GetDlgItem(hwndDlg, IDLEFT), FALSE);
  836.     EnableWindow(GetDlgItem(hwndDlg, IDDEL), TRUE);
  837.   }
  838. }
  839.  
  840. void SetSymbols(HWND hwndDlg, char **symbols)
  841. {
  842.     int i = 0;
  843.     SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_RESETCONTENT , 0, 0);
  844.     if (symbols) {
  845.       while (symbols[i]) {
  846.         SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_ADDSTRING, 0, (LPARAM)symbols[i]);
  847.         i++;
  848.       }
  849.     }
  850.     EnableSymbolSetButtons(hwndDlg);
  851.     EnableWindow(GetDlgItem(hwndDlg, IDRIGHT), FALSE);
  852.     EnableWindow(GetDlgItem(hwndDlg, IDLEFT), FALSE);
  853.     EnableWindow(GetDlgItem(hwndDlg, IDDEL), FALSE);
  854. }
  855.  
  856. char **GetSymbols(HWND hwndDlg)
  857. {
  858.   int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETCOUNT, 0, 0);
  859.   char **symbols = NULL;
  860.   if(n > 0) {
  861.     HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, (n+1)*sizeof(char *));
  862.     symbols = (char **)GlobalLock(hMem);
  863.     for (int i = 0; i < n; i++) {
  864.       int len = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXTLEN, (WPARAM)i, 0);
  865.       symbols[i] = (char *)GlobalAlloc(GPTR, (len+1)*sizeof(char));
  866.       SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXT, (WPARAM)i, (LPARAM)symbols[i]);
  867.     }
  868.     symbols[n] = NULL;
  869.   }
  870.  
  871.   return symbols;
  872. }
  873.  
  874. BOOL CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
  875.   switch(msg) {
  876.     case WM_INITDIALOG:
  877.     {
  878.       int i = 0;
  879.       LRESULT rv;
  880.  
  881.       for(i = (int)COMPRESSOR_SCRIPT; i <= (int)COMPRESSOR_BEST; i++) {
  882.         rv = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_ADDSTRING, 0, (LPARAM)compressor_display_names[i]);
  883.       }
  884.       rv = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_SETCURSEL, (WPARAM)g_sdata.default_compressor, (LPARAM)0);
  885.  
  886.       SetSymbols(hwndDlg, g_sdata.symbols);
  887.       SetFocus(GetDlgItem(hwndDlg, IDC_SYMBOL));
  888.       break;
  889.     }
  890.     case WM_MAKENSIS_LOADSYMBOLSET:
  891.     {
  892.       char *name = (char *)wParam;
  893.       char **symbols = LoadSymbolSet(name);
  894.       HGLOBAL hMem;
  895.  
  896.       SetSymbols(hwndDlg, symbols);
  897.       if(symbols) {
  898.         hMem = GlobalHandle(symbols);
  899.         GlobalUnlock(hMem);
  900.         GlobalFree(hMem);
  901.       }
  902.       break;
  903.     }
  904.     case WM_MAKENSIS_SAVESYMBOLSET:
  905.     {
  906.       char *name = (char *)wParam;
  907.       char **symbols = GetSymbols(hwndDlg);
  908.       HGLOBAL hMem;
  909.  
  910.       if(symbols) {
  911.         SaveSymbolSet(name, symbols);
  912.         hMem = GlobalHandle(symbols);
  913.         GlobalUnlock(hMem);
  914.         GlobalFree(hMem);
  915.       }
  916.       break;
  917.     }
  918.     case WM_COMMAND:
  919.     {
  920.       switch (LOWORD(wParam)) {
  921.         case IDOK:
  922.         {
  923.           ResetObjects();
  924.           ResetInputScript();
  925.           ResetSymbols();
  926.           g_sdata.symbols = GetSymbols(hwndDlg);
  927.  
  928.           int n = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
  929.           if (n >= (int)COMPRESSOR_SCRIPT && n <= (int)COMPRESSOR_BEST) {
  930.             g_sdata.default_compressor = (NCOMPRESSOR)n;
  931.           }
  932.           else {
  933.             g_sdata.default_compressor = COMPRESSOR_SCRIPT;
  934.           }
  935.           EndDialog(hwndDlg, TRUE);
  936.           SetCompressor(g_sdata.default_compressor);
  937.         }
  938.         break;
  939.         case IDCANCEL:
  940.           EndDialog(hwndDlg, TRUE);
  941.           break;
  942.         case IDRIGHT:
  943.         {
  944.           int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXTLENGTH, 0, 0);
  945.           if(n > 0) {
  946.             char *buf = (char *)GlobalAlloc(GPTR, (n+1)*sizeof(char));
  947.             SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXT, n+1, (LPARAM)buf);
  948.             if(my_strstr(buf," ") || my_strstr(buf,"\t")) {
  949.               MessageBox(hwndDlg,SYMBOLSERROR,"Error",MB_OK|MB_ICONSTOP);
  950.               GlobalFree(buf);
  951.               break;
  952.             }
  953.  
  954.             n = SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXTLENGTH, 0, 0);
  955.             if(n > 0) {
  956.               char *buf2 = (char *)GlobalAlloc(GPTR, (n+1)*sizeof(char));
  957.               SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXT, n+1, (LPARAM)buf2);
  958.               char *buf3 = (char *)GlobalAlloc(GPTR, (lstrlen(buf)+lstrlen(buf2)+2)*sizeof(char));
  959.               wsprintf(buf3,"%s=%s",buf,buf2);
  960.               GlobalFree(buf);
  961.               buf = buf3;
  962.               GlobalFree(buf2);
  963.             }
  964.             int idx = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_ADDSTRING, 0, (LPARAM)buf);
  965.             if (idx >= 0)
  966.             {
  967.               SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_SETSEL, FALSE, -1);
  968.               SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_SETSEL, TRUE, idx);
  969.             }
  970.             EnableSymbolEditButtons(hwndDlg);
  971.             SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_SETTEXT, 0, 0);
  972.             SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_SETTEXT, 0, 0);
  973.             GlobalFree(buf);
  974.             EnableSymbolSetButtons(hwndDlg);
  975.           }
  976.         }
  977.         break;
  978.         case IDLEFT:
  979.         {
  980.           if (SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0) != 1)
  981.             break;
  982.  
  983.           int index;
  984.           int num = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELITEMS, 1, (LPARAM) &index);
  985.           if(num == 1) {
  986.             int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXTLEN, (WPARAM)index, 0);
  987.             if(n > 0) {
  988.               char *buf = (char *)GlobalAlloc(GPTR, (n+1)*sizeof(char));
  989.               SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXT, (WPARAM)index, (LPARAM)buf);
  990.               char *p = my_strstr(buf,"=");
  991.               if(p) {
  992.                 SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_SETTEXT, 0, (LPARAM)(p+1));
  993.                 *p=0;
  994.               }
  995.               SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_SETTEXT, 0, (LPARAM)buf);
  996.               GlobalFree(buf);
  997.               SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_DELETESTRING, (WPARAM)index, 0);
  998.               EnableWindow(GetDlgItem(hwndDlg, IDLEFT), FALSE);
  999.               EnableWindow(GetDlgItem(hwndDlg, IDDEL), FALSE);
  1000.               EnableSymbolSetButtons(hwndDlg);
  1001.             }
  1002.           }
  1003.         }
  1004.         break;
  1005.         case IDCLEAR:
  1006.         {
  1007.           SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_RESETCONTENT , 0, 0);
  1008.           EnableSymbolSetButtons(hwndDlg);
  1009.         }
  1010.         break;
  1011.         case IDLOAD:
  1012.         {
  1013.           g_symbol_set_mode=1;
  1014.           DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SYMBOLSET),hwndDlg,(DLGPROC)SymbolSetProc);
  1015.         }
  1016.         break;
  1017.         case IDSAVE:
  1018.         {
  1019.           g_symbol_set_mode=2;
  1020.           DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SYMBOLSET),hwndDlg,(DLGPROC)SymbolSetProc);
  1021.         }
  1022.         break;
  1023.         case IDDEL:
  1024.         {
  1025.           int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0);
  1026.           int *items = (int *)GlobalAlloc(GPTR, n*sizeof(int));
  1027.           int rv = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELITEMS, (WPARAM)n, (LPARAM)items);
  1028.           int i;
  1029.           for(i=n-1;i>=0;i--) {
  1030.             SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_DELETESTRING, (WPARAM)items[i], 0);
  1031.           }
  1032.           EnableSymbolEditButtons(hwndDlg);
  1033.           EnableSymbolSetButtons(hwndDlg);
  1034.         }
  1035.         break;
  1036.         case IDC_SYMBOL:
  1037.           if(HIWORD(wParam) == EN_CHANGE)
  1038.           {
  1039.             int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXTLENGTH, 0, 0);
  1040.             if(n > 0) {
  1041.               EnableWindow(GetDlgItem(hwndDlg, IDRIGHT), TRUE);
  1042.             }
  1043.             else {
  1044.               EnableWindow(GetDlgItem(hwndDlg, IDRIGHT), FALSE);
  1045.             }
  1046.           }
  1047.           break;
  1048.         case IDC_SYMBOLS:
  1049.           if (HIWORD(wParam) == LBN_SELCHANGE)
  1050.           {
  1051.             EnableSymbolEditButtons(hwndDlg);
  1052.           }
  1053.           else if (HIWORD(wParam) == LBN_DBLCLK)
  1054.           {
  1055.             SendDlgItemMessage(hwndDlg, IDLEFT, BM_CLICK, 0, 0);
  1056.           }
  1057.           break;
  1058.         }
  1059.       break;
  1060.     }
  1061.   }
  1062.   return FALSE;
  1063. }
  1064.  
  1065. BOOL CALLBACK CompressorProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
  1066.   switch(msg) {
  1067.     case WM_INITDIALOG:
  1068.     {
  1069.       int i=0;
  1070.       LRESULT rv;
  1071.  
  1072.       for(i=(int)COMPRESSOR_SCRIPT; i<= (int)COMPRESSOR_BEST; i++) {
  1073.         rv = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_ADDSTRING, 0, (LPARAM)compressor_display_names[i]);
  1074.       }
  1075.       rv = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_SETCURSEL, (WPARAM)g_sdata.compressor, (LPARAM)0);
  1076.  
  1077.       SetFocus(GetDlgItem(hwndDlg, IDC_COMPRESSOR));
  1078.       break;
  1079.     }
  1080.     case WM_COMMAND:
  1081.     {
  1082.       switch (LOWORD(wParam)) {
  1083.         case IDOK:
  1084.         {
  1085.           int n;
  1086.           n = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
  1087.           if(n >= (int)COMPRESSOR_SCRIPT && n <= (int)COMPRESSOR_BEST) {
  1088.             SetCompressor((NCOMPRESSOR)n);
  1089.           }
  1090.           else {
  1091.             SetCompressor(g_sdata.default_compressor);
  1092.           }
  1093.  
  1094.           EndDialog(hwndDlg, 0);
  1095.           break;
  1096.         }
  1097.         case IDCANCEL:
  1098.         {
  1099.           EndDialog(hwndDlg, 1);
  1100.           LogMessage(g_sdata.hwnd,USAGE);
  1101.           break;
  1102.         }
  1103.       }
  1104.       break;
  1105.     }
  1106.   }
  1107.   return FALSE;
  1108. }
  1109.  
  1110. BOOL CALLBACK SymbolSetProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
  1111.   switch(msg) {
  1112.     case WM_INITDIALOG:
  1113.     {
  1114.       HWND hwndEdit;
  1115.       HKEY hKey;
  1116.  
  1117.       EnableWindow(GetDlgItem(hwndDlg, IDDEL), FALSE);
  1118.       if (RegOpenKeyEx(REGSEC,REGKEY,0,KEY_READ,&hKey) == ERROR_SUCCESS) {
  1119.         HKEY hSubKey;
  1120.  
  1121.         if (RegCreateKey(hKey,REGSYMSUBKEY,&hSubKey) == ERROR_SUCCESS) {
  1122.           char subkey[1024];
  1123.           int i=0;
  1124.  
  1125.           while (RegEnumKey(hSubKey,i,subkey,sizeof(subkey)) == ERROR_SUCCESS) {
  1126.             SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_ADDSTRING, 0, (LPARAM)subkey);
  1127.             i++;
  1128.           }
  1129.           RegCloseKey(hSubKey);
  1130.         }
  1131.         RegCloseKey(hKey);
  1132.       }
  1133.  
  1134.       hwndEdit = FindWindowEx(GetDlgItem(hwndDlg, IDC_NAMES), 0, 0, 0); // Handle of list
  1135.       hwndEdit = FindWindowEx(GetDlgItem(hwndDlg, IDC_NAMES), hwndEdit, 0, 0); //Handle of edit box
  1136.       SendMessage(hwndEdit, EM_LIMITTEXT, (WPARAM)SYMBOL_SET_NAME_MAXLEN, 0);
  1137.       if(g_symbol_set_mode == 1) { //Load
  1138.         SetWindowText(hwndDlg, LOAD_SYMBOL_SET_DLG_NAME);
  1139.         SetWindowText(GetDlgItem(hwndDlg, IDOK), LOAD_BUTTON_TEXT);
  1140.         SendMessage(hwndEdit, EM_SETREADONLY, (WPARAM)TRUE, 0);
  1141.       }
  1142.       else {
  1143.         SetWindowText(hwndDlg, SAVE_SYMBOL_SET_DLG_NAME);
  1144.         SetWindowText(GetDlgItem(hwndDlg, IDOK), SAVE_BUTTON_TEXT);
  1145.       }
  1146.       break;
  1147.     }
  1148.     case WM_COMMAND:
  1149.     {
  1150.       switch (LOWORD(wParam)) {
  1151.         case IDOK:
  1152.         {
  1153.           HWND hwndEdit;
  1154.           char name[SYMBOL_SET_NAME_MAXLEN+1];
  1155.  
  1156.           hwndEdit = FindWindowEx(GetDlgItem(hwndDlg, IDC_NAMES), 0, 0, 0); // Handle of list
  1157.           hwndEdit = FindWindowEx(GetDlgItem(hwndDlg, IDC_NAMES), hwndEdit, 0, 0); //Handle of edit box
  1158.           SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)SYMBOL_SET_NAME_MAXLEN+1, (LPARAM)name);
  1159.           if(!lstrlen(name)) {
  1160.             if(g_symbol_set_mode == 1) { //Load
  1161.               MessageBox(hwndDlg,LOAD_SYMBOL_SET_MESSAGE,LOAD_SYMBOL_SET_DLG_NAME,MB_OK|MB_ICONEXCLAMATION);
  1162.             }
  1163.             else {
  1164.               MessageBox(hwndDlg,SAVE_SYMBOL_SET_MESSAGE,SAVE_SYMBOL_SET_DLG_NAME,MB_OK|MB_ICONEXCLAMATION);
  1165.             }
  1166.           }
  1167.           else {
  1168.             HWND hwndParent = GetParent(hwndDlg);
  1169.             if(g_symbol_set_mode == 1) { //Load
  1170.               SendMessage(hwndParent, WM_MAKENSIS_LOADSYMBOLSET, (WPARAM)name, NULL);
  1171.             }
  1172.             else {
  1173.               SendMessage(hwndParent, WM_MAKENSIS_SAVESYMBOLSET, (WPARAM)name, NULL);
  1174.             }
  1175.             EndDialog(hwndDlg, TRUE);
  1176.           }
  1177.           break;
  1178.         }
  1179.         case IDCANCEL:
  1180.         {
  1181.           EndDialog(hwndDlg, TRUE);
  1182.           break;
  1183.         }
  1184.         case IDDEL:
  1185.         {
  1186.           int n = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETCURSEL, 0, 0);
  1187.           if(n != CB_ERR) {
  1188.             long len = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETLBTEXTLEN, (WPARAM)n, 0);
  1189.             char *buf = (char *)GlobalAlloc(GPTR, (len+1)*sizeof(char));
  1190.             if(SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETLBTEXT, (WPARAM)n, (LPARAM)buf) != CB_ERR) {
  1191.               SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_DELETESTRING, n, 0);
  1192.               DeleteSymbolSet(buf);
  1193.             }
  1194.             GlobalFree(buf);
  1195.           }
  1196.           EnableWindow(GetDlgItem(hwndDlg, IDDEL), FALSE);
  1197.           break;
  1198.         }
  1199.         case IDC_NAMES:
  1200.         {
  1201.           if(HIWORD(wParam) == CBN_SELCHANGE)
  1202.           {
  1203.             int n = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETCURSEL, 0, 0);
  1204.             if(n == CB_ERR) {
  1205.               EnableWindow(GetDlgItem(hwndDlg, IDDEL), FALSE);
  1206.             }
  1207.             else {
  1208.               EnableWindow(GetDlgItem(hwndDlg, IDDEL), TRUE);
  1209.             }
  1210.           }
  1211.           else if(HIWORD(wParam) == CBN_DBLCLK)
  1212.           {
  1213.             int n = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETCURSEL, 0, 0);
  1214.             if (n != CB_ERR)
  1215.             {
  1216.               SendDlgItemMessage(hwndDlg, IDOK, BM_CLICK, 0, 0);
  1217.             }
  1218.           }
  1219.           break;
  1220.         }
  1221.       }
  1222.       break;
  1223.     }
  1224.   }
  1225.   return FALSE;
  1226. }
  1227.  
  1228. void SetCompressor(NCOMPRESSOR compressor)
  1229. {
  1230.   int i;
  1231.  
  1232.   if(g_sdata.compressor != compressor) {
  1233.     WORD command;
  1234.     char *compressor_name;
  1235.  
  1236.     if(compressor > COMPRESSOR_SCRIPT && compressor < COMPRESSOR_BEST) {
  1237.       command = compressor_commands[(int)compressor];
  1238.       compressor_name = compressor_names[(int)compressor];
  1239.     }
  1240.     else if(compressor == COMPRESSOR_BEST) {
  1241.       command = compressor_commands[(int)compressor];
  1242.       compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1];
  1243.     }
  1244.     else {
  1245.       compressor = COMPRESSOR_SCRIPT;
  1246.       command = IDM_SCRIPT;
  1247.       compressor_name = "";
  1248.     }
  1249.     g_sdata.compressor = compressor;
  1250.     g_sdata.compressor_name = compressor_name;
  1251.     UpdateToolBarCompressorButton();
  1252.     for(i=(int)COMPRESSOR_SCRIPT; i<= (int)COMPRESSOR_BEST; i++) {
  1253.       CheckMenuItem(g_sdata.menu, compressor_commands[i], MF_BYCOMMAND | MF_UNCHECKED);
  1254.     }
  1255.     CheckMenuItem(g_sdata.menu, command, MF_BYCOMMAND | MF_CHECKED);
  1256.     ResetObjects();
  1257.     ResetInputScript();
  1258.   }
  1259. }
  1260.  
  1261.