home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2006 April / DPPRO0406DVD.ISO / Essentials / Programming / Notepad2 / Source / NP2SRC.ZIP / Dialogs.c < prev    next >
Encoding:
C/C++ Source or Header  |  2004-06-25  |  49.4 KB  |  1,800 lines

  1. /******************************************************************************
  2. *
  3. *
  4. * Notepad2
  5. *
  6. * Dialogs.c
  7. *   Notepad2 dialog boxes implementation
  8. *
  9. * See Readme.txt for more information about this source code.
  10. * Please send me your comments to this work.
  11. *
  12. * Distributed under the terms of the GNU General Public License,
  13. * see License.txt for details.
  14. *
  15. *                                              (c) Florian Balmer 1996-2004
  16. *                                                       textview@bluewin.ch
  17. *                                               http://www.flos-freeware.ch
  18. *
  19. *
  20. ******************************************************************************/
  21. #include <windows.h>
  22. #include <commctrl.h>
  23. #include <shlobj.h>
  24. #include <shellapi.h>
  25. #include <shlwapi.h>
  26. #include <commdlg.h>
  27. #include <string.h>
  28. #include "notepad2.h"
  29. #include "scintilla.h"
  30. #include "edit.h"
  31. #include "helpers.h"
  32. #include "appreg.h"
  33. #include "dlapi.h"
  34. #include "dialogs.h"
  35. #include "resource.h"
  36.  
  37.  
  38. extern HWND  hwndMain;
  39. extern HWND  hwndEdit;
  40. extern HINSTANCE g_hInstance;
  41. extern LPMALLOC  g_lpMalloc;
  42.  
  43.  
  44. //=============================================================================
  45. //
  46. //  MsgBox()
  47. //
  48. int MsgBox(int iType,UINT uIdMsg,...)
  49. {
  50.  
  51.   char szText [256*2];
  52.   char szBuf  [256*2];
  53.   char szTitle[64];
  54.   int iIcon = 0;
  55.   HWND hwnd;
  56.  
  57.   if (!GetString(uIdMsg,szBuf,COUNTOF(szBuf)))
  58.     return(0);
  59.  
  60.   wvsprintf(szText,szBuf,(LPVOID)(&uIdMsg + 1));
  61.  
  62.   GetString(IDS_APPTITLE,szTitle,COUNTOF(szTitle));
  63.  
  64.   switch (iType) {
  65.     case MBINFO: iIcon = MB_ICONINFORMATION; break;
  66.     case MBWARN: iIcon = MB_ICONEXCLAMATION; break;
  67.     case MBYESNO: iIcon = MB_ICONQUESTION | MB_YESNO; break;
  68.     case MBYESNOCANCEL: iIcon = MB_ICONQUESTION | MB_YESNOCANCEL; break;
  69.     case MBYESNOWARN: iIcon = MB_ICONWARNING | MB_YESNO; break; }
  70.  
  71.   if (!(hwnd = GetFocus()))
  72.     hwnd = hwndMain;
  73.  
  74.   return MessageBoxEx(hwnd,szText,szTitle,MB_SETFOREGROUND | iIcon,
  75.                       MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT));
  76.  
  77. }
  78.  
  79.  
  80. //=============================================================================
  81. //
  82. //  DisplayCmdLineHelp()
  83. //
  84. void DisplayCmdLineHelp()
  85. {
  86.   MSGBOXPARAMS mbp;
  87.  
  88.   char szTitle[32];
  89.   char szText[512];
  90.  
  91.   GetString(IDS_APPTITLE,szTitle,COUNTOF(szTitle));
  92.   GetString(IDS_CMDLINEHELP,szText,COUNTOF(szText));
  93.  
  94.   mbp.cbSize = sizeof(MSGBOXPARAMS);
  95.   mbp.hwndOwner = NULL;
  96.   mbp.hInstance = g_hInstance;
  97.   mbp.lpszText = szText;
  98.   mbp.lpszCaption = szTitle;
  99.   mbp.dwStyle = MB_OK | MB_USERICON | MB_SETFOREGROUND;
  100.   mbp.lpszIcon = MAKEINTRESOURCE(IDR_MAINWND);
  101.   mbp.dwContextHelpId = 0;
  102.   mbp.lpfnMsgBoxCallback = NULL;
  103.   mbp.dwLanguageId = MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);
  104.  
  105.   MessageBoxIndirect(&mbp);
  106. }
  107.  
  108.  
  109. //=============================================================================
  110. //
  111. //  BFFCallBack()
  112. //
  113. int CALLBACK BFFCallBack(HWND hwnd,UINT umsg,LPARAM lParam,LPARAM lpData)
  114. {
  115.   if (umsg == BFFM_INITIALIZED)
  116.     SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);
  117.  
  118.   return(0);
  119.  
  120.   lParam;
  121. }
  122.  
  123.  
  124. //=============================================================================
  125. //
  126. //  GetDirectory()
  127. //
  128. BOOL GetDirectory(HWND hwndParent,int iTitle,LPSTR pszFolder,LPCSTR pszBase,BOOL bNewDialogStyle)
  129. {
  130.  
  131.   BROWSEINFO bi;
  132.   LPITEMIDLIST pidl;
  133.   //LPMALLOC lpMalloc;
  134.   char szTitle[256];
  135.   char szBase[MAX_PATH];
  136.   BOOL fOk = FALSE;
  137.  
  138.   lstrcpy(szTitle,"");
  139.   GetString(iTitle,szTitle,COUNTOF(szTitle));
  140.  
  141.   if (!pszBase || !*pszBase)
  142.     GetCurrentDirectory(MAX_PATH,szBase);
  143.   else
  144.     lstrcpy(szBase,pszBase);
  145.  
  146.   bi.hwndOwner = hwndParent;
  147.   bi.pidlRoot = NULL;
  148.   bi.pszDisplayName = pszFolder;
  149.   bi.lpszTitle = szTitle;
  150.   bi.ulFlags = BIF_RETURNONLYFSDIRS;
  151.   if (bNewDialogStyle)
  152.     bi.ulFlags |= BIF_NEWDIALOGSTYLE;
  153.   bi.lpfn = &BFFCallBack;
  154.   bi.lParam = (LPARAM)szBase;
  155.   bi.iImage = 0;
  156.  
  157.   //if (SHGetMalloc(&lpMalloc) != NOERROR)
  158.   //   return FALSE;
  159.  
  160.   pidl = SHBrowseForFolder(&bi);
  161.   if (pidl)
  162.   {
  163.     SHGetPathFromIDList(pidl,pszFolder);
  164.  
  165.     g_lpMalloc->lpVtbl->Free(g_lpMalloc,pidl);
  166.  
  167.     fOk = TRUE;
  168.   }
  169.   //lpMalloc->lpVtbl->Release(lpMalloc);
  170.  
  171.   return fOk;
  172.  
  173. }
  174.  
  175.  
  176. //=============================================================================
  177. //
  178. //  AboutDlgProc()
  179. //
  180. static const DWORD dwVerMajor    = 1;
  181. static const DWORD dwVerMinor    = 0;
  182. static const DWORD dwBuildNumber = 12;
  183.  
  184. BOOL CALLBACK AboutDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  185. {
  186.  
  187.   static BOOL hover_email;
  188.   static BOOL hover_webpage;
  189.  
  190.   static HFONT hFontNormal;
  191.   static HFONT hFontHover;
  192.  
  193.   static HCURSOR hCursorNormal;
  194.   static HCURSOR hCursorHover;
  195.  
  196.   switch(umsg)
  197.   {
  198.     case WM_INITDIALOG:
  199.       {
  200.         char  szVersion[64];
  201.         LOGFONT lf;
  202.  
  203.         wsprintf(szVersion,"Notepad2 %u.%u.%0.2u",dwVerMajor,dwVerMinor,dwBuildNumber);
  204.         SetDlgItemText(hwnd,IDC_VERSION,szVersion);
  205.  
  206.         hover_email = FALSE;
  207.         hover_webpage = FALSE;
  208.  
  209.         //  Font setup
  210.         if (NULL == (hFontHover = (HFONT)SendDlgItemMessage(hwnd,IDC_EMAIL,WM_GETFONT,0,0)))
  211.           hFontHover = GetStockObject(DEFAULT_GUI_FONT);
  212.         GetObject(hFontHover,sizeof(LOGFONT),&lf);
  213.         lf.lfUnderline = TRUE;
  214.         hFontNormal = CreateFontIndirect(&lf);
  215.  
  216.         //  Cursor setup
  217.         hCursorNormal = LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW));
  218.         if (!(hCursorHover = LoadCursor(NULL,MAKEINTRESOURCE(IDC_HAND))))
  219.           hCursorHover  = LoadCursor(g_hInstance,MAKEINTRESOURCE(IDC_HOVER));
  220.  
  221.         CenterDlgInParent(hwnd);
  222.       }
  223.       return TRUE;
  224.  
  225.     case WM_NCACTIVATE:
  226.       if (!(BOOL)wParam) { //  we're not active, clear hover states
  227.         hover_email = FALSE;
  228.         hover_webpage = FALSE;
  229.         InvalidateRect(GetDlgItem(hwnd,IDC_EMAIL),NULL,FALSE);
  230.         InvalidateRect(GetDlgItem(hwnd,IDC_WEBPAGE),NULL,FALSE); }
  231.       return FALSE;
  232.  
  233.     case WM_CTLCOLORSTATIC:
  234.       {
  235.         DWORD dwId = GetWindowLong((HWND)lParam,GWL_ID);
  236.         HDC hdc = (HDC)wParam;
  237.  
  238.         if (dwId != IDC_EMAIL && dwId != IDC_WEBPAGE)
  239.           break;
  240.  
  241.         SetBkMode(hdc,TRANSPARENT);
  242.  
  243.         if (GetSysColorBrush(26/*COLOR_HOTLIGHT*/))
  244.           SetTextColor(hdc,GetSysColor(26/*COLOR_HOTLIGHT*/));
  245.         else
  246.           SetTextColor(hdc,RGB(0,0,255));
  247.  
  248.         if (dwId == IDC_EMAIL)
  249.           SelectObject(hdc,hover_email?hFontHover:hFontNormal);
  250.         else
  251.           SelectObject(hdc,hover_webpage?hFontHover:hFontNormal);
  252.  
  253.         return(LONG)GetSysColorBrush(COLOR_BTNFACE);
  254.       }
  255.       break;
  256.  
  257.     case WM_MOUSEMOVE:
  258.       {
  259.         POINT pt = { LOWORD(lParam), HIWORD(lParam) };
  260.         HWND hwndHover = ChildWindowFromPoint(hwnd,pt);
  261.         DWORD dwId = GetWindowLong(hwndHover,GWL_ID);
  262.  
  263.         if (GetActiveWindow() == hwnd) {
  264.  
  265.         if (hover_email != (dwId == IDC_EMAIL)) {
  266.           hover_email = !hover_email;
  267.           InvalidateRect(GetDlgItem(hwnd,IDC_EMAIL),NULL,FALSE); }
  268.  
  269.         if (hover_webpage != (dwId == IDC_WEBPAGE)) {
  270.           hover_webpage = !hover_webpage;
  271.           InvalidateRect(GetDlgItem(hwnd,IDC_WEBPAGE),NULL,FALSE); }
  272.  
  273.         SetCursor((dwId == IDC_EMAIL || dwId == IDC_WEBPAGE)?hCursorHover:hCursorNormal); }
  274.       }
  275.       break;
  276.  
  277.     case WM_LBUTTONDOWN:
  278.       {
  279.         POINT pt = { LOWORD(lParam), HIWORD(lParam) };
  280.         HWND hwndHover = ChildWindowFromPoint(hwnd,pt);
  281.         DWORD dwId = GetWindowLong(hwndHover,GWL_ID);
  282.  
  283.         if (dwId == IDC_EMAIL)
  284.           ShellExecute(hwnd,"open","mailto:textview@bluewin.ch",NULL,NULL,SW_SHOWNORMAL);
  285.  
  286.         else if (dwId == IDC_WEBPAGE)
  287.           ShellExecute(hwnd,"open","http://www.flos-freeware.ch",NULL,NULL,SW_SHOWNORMAL);
  288.       }
  289.       break;
  290.  
  291.     case WM_COMMAND:
  292.  
  293.       switch(LOWORD(wParam))
  294.       {
  295.         case IDOK:
  296.         case IDCANCEL:
  297.           EndDialog(hwnd,IDOK);
  298.           break;
  299.       }
  300.       return TRUE;
  301.   }
  302.   return FALSE;
  303. }
  304.  
  305.  
  306. //=============================================================================
  307. //
  308. //  RunDlgProc()
  309. //
  310. BOOL CALLBACK RunDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  311. {
  312.  
  313.   switch(umsg)
  314.   {
  315.  
  316.     case WM_INITDIALOG:
  317.       {
  318.         MakeBitmapButton(hwnd,IDC_SEARCHEXE,g_hInstance,IDB_OPEN);
  319.  
  320.         SendDlgItemMessage(hwnd,IDC_COMMANDLINE,EM_LIMITTEXT,MAX_PATH - 1,0);
  321.         SetDlgItemText(hwnd,IDC_COMMANDLINE,(LPCSTR)lParam);
  322.         SHAutoComplete(GetDlgItem(hwnd,IDC_COMMANDLINE),SHACF_FILESYSTEM);
  323.  
  324.         CenterDlgInParent(hwnd);
  325.       }
  326.       return TRUE;
  327.  
  328.  
  329.     case WM_COMMAND:
  330.  
  331.       switch(LOWORD(wParam))
  332.       {
  333.  
  334.         case IDC_SEARCHEXE:
  335.           {
  336.             char szArgs[MAX_PATH];
  337.             char szArg2[MAX_PATH];
  338.             char szFile[MAX_PATH * 2];
  339.             char szFilter[256];
  340.             OPENFILENAME ofn;
  341.             ZeroMemory(&ofn,sizeof(OPENFILENAME));
  342.  
  343.             GetDlgItemText(hwnd,IDC_COMMANDLINE,szArgs,COUNTOF(szArgs));
  344.             ExpandEnvironmentStringsEx(szArgs,COUNTOF(szArgs));
  345.             ExtractFirstArgument(szArgs,szFile,szArg2);
  346.  
  347.             GetString(IDS_FILTER_EXE,szFilter,COUNTOF(szFilter));
  348.             PrepareFilterStr(szFilter);
  349.  
  350.             ofn.lStructSize = sizeof(OPENFILENAME);
  351.             ofn.hwndOwner = hwnd;
  352.             ofn.lpstrFilter = szFilter;
  353.             ofn.lpstrFile = szFile;
  354.             ofn.nMaxFile = COUNTOF(szFile);
  355.             ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR | /*OFN_DONTADDTORECENT*/0x02000000
  356.                       | OFN_PATHMUSTEXIST | OFN_SHAREAWARE | OFN_NODEREFERENCELINKS;
  357.  
  358.             if (GetOpenFileName(&ofn)) {
  359.               PathQuoteSpaces(szFile);
  360.               if (lstrlen(szArg2))
  361.               {
  362.                 lstrcat(szFile," ");
  363.                 lstrcat(szFile,szArg2);
  364.               }
  365.               SetDlgItemText(hwnd,IDC_COMMANDLINE,szFile); }
  366.  
  367.             PostMessage(hwnd,WM_NEXTDLGCTL,1,0);
  368.           }
  369.           break;
  370.  
  371.  
  372.         case IDC_COMMANDLINE:
  373.           {
  374.             BOOL bEnableOK = FALSE;
  375.             char args[MAX_PATH];
  376.  
  377.             if (GetDlgItemText(hwnd,IDC_COMMANDLINE,args,MAX_PATH))
  378.               if (ExtractFirstArgument(args,args,NULL))
  379.                 if (lstrlen(args))
  380.                   bEnableOK = TRUE;
  381.  
  382.             EnableWindow(GetDlgItem(hwnd,IDOK),bEnableOK);
  383.           }
  384.           break;
  385.  
  386.  
  387.         case IDOK:
  388.           {
  389.             char arg1[MAX_PATH];
  390.             char arg2[MAX_PATH];
  391.             SHELLEXECUTEINFO sei;
  392.  
  393.             if (GetDlgItemText(hwnd,IDC_COMMANDLINE,arg1,MAX_PATH))
  394.             {
  395.               ExpandEnvironmentStringsEx(arg1,COUNTOF(arg1));
  396.               ExtractFirstArgument(arg1,arg1,arg2);
  397.  
  398.               ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
  399.  
  400.               sei.cbSize = sizeof(SHELLEXECUTEINFO);
  401.               sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  402.               sei.hwnd = hwnd;
  403.               sei.lpVerb = NULL;
  404.               sei.lpFile = arg1;
  405.               sei.lpParameters = arg2;
  406.               sei.lpDirectory = NULL;
  407.               sei.nShow = SW_SHOWNORMAL;
  408.  
  409.               if (ShellExecuteEx(&sei))
  410.                 EndDialog(hwnd,IDOK);
  411.  
  412.               else
  413.                 PostMessage(hwnd,WM_NEXTDLGCTL,
  414.                   (WPARAM)(GetDlgItem(hwnd,IDC_COMMANDLINE)),1);
  415.             }
  416.           }
  417.           break;
  418.  
  419.  
  420.         case IDCANCEL:
  421.           EndDialog(hwnd,IDCANCEL);
  422.           break;
  423.  
  424.       }
  425.  
  426.       return TRUE;
  427.  
  428.   }
  429.  
  430.   return FALSE;
  431.  
  432. }
  433.  
  434.  
  435. //=============================================================================
  436. //
  437. //  RunDlg()
  438. //
  439. void RunDlg(HWND hwnd,LPCSTR lpstrDefault)
  440. {
  441.  
  442.   DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_RUN),
  443.     hwnd,RunDlgProc,(LPARAM)lpstrDefault);
  444.  
  445. }
  446.  
  447.  
  448. //=============================================================================
  449. //
  450. //  OpenWithDlgProc()
  451. //
  452. extern char tchOpenWithDir[MAX_PATH];
  453. extern int  flagNoFadeHidden;
  454.  
  455. extern int cxOpenWithDlg;
  456. extern int cyOpenWithDlg;
  457.  
  458. BOOL CALLBACK OpenWithDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  459. {
  460.  
  461.   static int cxClient;
  462.   static int cyClient;
  463.   static int mmiPtMaxY;
  464.   static int mmiPtMinX;
  465.  
  466.   switch(umsg)
  467.   {
  468.  
  469.     case WM_INITDIALOG:
  470.       {
  471.         RECT rc;
  472.         char tch[MAX_PATH];
  473.         int cGrip;
  474.  
  475.         GetClientRect(hwnd,&rc);
  476.         cxClient = rc.right - rc.left;
  477.         cyClient = rc.bottom - rc.top;
  478.  
  479.         GetWindowRect(hwnd,&rc);
  480.         mmiPtMaxY = rc.bottom-rc.top;
  481.         mmiPtMinX = rc.right-rc.left;
  482.  
  483.         if (cxOpenWithDlg < (rc.right-rc.left))
  484.           cxOpenWithDlg = rc.right-rc.left;
  485.         if (cyOpenWithDlg < (rc.bottom-rc.top))
  486.           cyOpenWithDlg = rc.bottom-rc.top;
  487.         SetWindowPos(hwnd,NULL,rc.left,rc.top,cxOpenWithDlg,cyOpenWithDlg,SWP_NOZORDER);
  488.  
  489.         SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE)|WS_THICKFRAME);
  490.         SetWindowPos(hwnd,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
  491.  
  492.         GetMenuString(GetSystemMenu(GetParent(hwnd),FALSE),SC_SIZE,tch,COUNTOF(tch),MF_BYCOMMAND);
  493.         InsertMenu(GetSystemMenu(hwnd,FALSE),SC_CLOSE,MF_BYCOMMAND|MF_STRING|MF_ENABLED,SC_SIZE,tch);
  494.         InsertMenu(GetSystemMenu(hwnd,FALSE),SC_CLOSE,MF_BYCOMMAND|MF_SEPARATOR,0,NULL);
  495.  
  496.         SetWindowLong(GetDlgItem(hwnd,IDC_RESIZEGRIP3),GWL_STYLE,
  497.           GetWindowLong(GetDlgItem(hwnd,IDC_RESIZEGRIP3),GWL_STYLE)|SBS_SIZEGRIP|WS_CLIPSIBLINGS);
  498.  
  499.         cGrip = GetSystemMetrics(SM_CXHTHUMB);
  500.         SetWindowPos(GetDlgItem(hwnd,IDC_RESIZEGRIP3),NULL,cxClient-cGrip,
  501.                      cyClient-cGrip,cGrip,cGrip,SWP_NOZORDER);
  502.  
  503.         SetWindowLong(hwnd,DWL_USER,lParam);
  504.  
  505.         ListView_SetExtendedListViewStyle(GetDlgItem(hwnd,IDC_OPENWITHDIR),LVS_EX_LABELTIP);
  506.         DirList_Init(GetDlgItem(hwnd,IDC_OPENWITHDIR),NULL);
  507.         DirList_Fill(GetDlgItem(hwnd,IDC_OPENWITHDIR),tchOpenWithDir,DL_ALLOBJECTS,NULL,FALSE,flagNoFadeHidden);
  508.         DirList_Sort(GetDlgItem(hwnd,IDC_OPENWITHDIR),DS_NAME,FALSE);
  509.         DirList_StartIconThread(GetDlgItem(hwnd,IDC_OPENWITHDIR));
  510.         ListView_SetItemState(GetDlgItem(hwnd,IDC_OPENWITHDIR),0,
  511.                               LVIS_FOCUSED,LVIS_FOCUSED);
  512.         ListView_SetColumnWidth(GetDlgItem(hwnd,IDC_OPENWITHDIR),0,LVSCW_AUTOSIZE);
  513.         ListView_Arrange(GetDlgItem(hwnd,IDC_OPENWITHDIR),LVA_DEFAULT);
  514.  
  515.         MakeBitmapButton(hwnd,IDC_GETOPENWITHDIR,g_hInstance,IDB_OPEN);
  516.  
  517.         CenterDlgInParent(hwnd);
  518.       }
  519.       return TRUE;
  520.  
  521.  
  522.     case WM_DESTROY:
  523.       {
  524.         RECT rc;
  525.  
  526.         DirList_Destroy(GetDlgItem(hwnd,IDC_OPENWITHDIR));
  527.  
  528.         GetWindowRect(hwnd,&rc);
  529.         cxOpenWithDlg = rc.right-rc.left;
  530.         cyOpenWithDlg = rc.bottom-rc.top;
  531.       }
  532.       return FALSE;
  533.  
  534.  
  535.     case WM_SIZE:
  536.       {
  537.         RECT rc;
  538.  
  539.         int dxClient = LOWORD(lParam) - cxClient;
  540.         int dyClient = HIWORD(lParam) - cyClient;
  541.         cxClient = LOWORD(lParam);
  542.         cyClient = HIWORD(lParam);
  543.  
  544.         GetWindowRect(GetDlgItem(hwnd,IDC_RESIZEGRIP3),&rc);
  545.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  546.         SetWindowPos(GetDlgItem(hwnd,IDC_RESIZEGRIP3),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  547.         InvalidateRect(GetDlgItem(hwnd,IDC_RESIZEGRIP3),NULL,TRUE);
  548.  
  549.         GetWindowRect(GetDlgItem(hwnd,IDOK),&rc);
  550.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  551.         SetWindowPos(GetDlgItem(hwnd,IDOK),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  552.         InvalidateRect(GetDlgItem(hwnd,IDOK),NULL,TRUE);
  553.  
  554.         GetWindowRect(GetDlgItem(hwnd,IDCANCEL),&rc);
  555.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  556.         SetWindowPos(GetDlgItem(hwnd,IDCANCEL),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  557.         InvalidateRect(GetDlgItem(hwnd,IDCANCEL),NULL,TRUE);
  558.  
  559.         GetWindowRect(GetDlgItem(hwnd,IDC_OPENWITHDIR),&rc);
  560.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  561.         SetWindowPos(GetDlgItem(hwnd,IDC_OPENWITHDIR),NULL,0,0,rc.right-rc.left+dxClient,rc.bottom-rc.top+dyClient,SWP_NOZORDER|SWP_NOMOVE);
  562.         InvalidateRect(GetDlgItem(hwnd,IDC_OPENWITHDIR),NULL,TRUE);
  563.  
  564.         GetWindowRect(GetDlgItem(hwnd,IDC_GETOPENWITHDIR),&rc);
  565.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  566.         SetWindowPos(GetDlgItem(hwnd,IDC_GETOPENWITHDIR),NULL,rc.left,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  567.         InvalidateRect(GetDlgItem(hwnd,IDC_OPENWITHDIR),NULL,TRUE);
  568.  
  569.         GetWindowRect(GetDlgItem(hwnd,IDC_OPENWITHDESCR),&rc);
  570.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  571.         SetWindowPos(GetDlgItem(hwnd,IDC_OPENWITHDESCR),NULL,rc.left,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  572.         InvalidateRect(GetDlgItem(hwnd,IDC_OPENWITHDESCR),NULL,TRUE);
  573.       }
  574.       return TRUE;
  575.  
  576.  
  577.     case WM_GETMINMAXINFO:
  578.       {
  579.         LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
  580.         lpmmi->ptMinTrackSize.x = mmiPtMinX;
  581.         lpmmi->ptMinTrackSize.y = mmiPtMaxY;
  582.         //lpmmi->ptMaxTrackSize.y = mmiPtMaxY;
  583.       }
  584.       return TRUE;
  585.  
  586.  
  587.     case WM_NOTIFY:
  588.       {
  589.         LPNMHDR pnmh = (LPNMHDR)lParam;
  590.  
  591.         if (pnmh->idFrom == IDC_OPENWITHDIR)
  592.         {
  593.           switch(pnmh->code)
  594.           {
  595.             case LVN_GETDISPINFO:
  596.               DirList_GetDispInfo(GetDlgItem(hwnd,IDC_OPENWITHDIR),lParam,flagNoFadeHidden);
  597.               break;
  598.  
  599.             case LVN_DELETEITEM:
  600.               DirList_DeleteItem(GetDlgItem(hwnd,IDC_OPENWITHDIR),lParam);
  601.               break;
  602.  
  603.             case LVN_ITEMCHANGED: {
  604.               NM_LISTVIEW *pnmlv = (NM_LISTVIEW*)lParam;
  605.               EnableWindow(GetDlgItem(hwnd,IDOK),(pnmlv->uNewState & LVIS_SELECTED)); }
  606.               break;
  607.  
  608.             case NM_DBLCLK:
  609.               if (ListView_GetSelectedCount(GetDlgItem(hwnd,IDC_OPENWITHDIR)))
  610.                 SendMessage(hwnd,WM_COMMAND,MAKELONG(IDOK,1),0);
  611.               break;
  612.           }
  613.         }
  614.       }
  615.       return TRUE;
  616.  
  617.  
  618.     case WM_COMMAND:
  619.  
  620.       switch(LOWORD(wParam))
  621.       {
  622.  
  623.         case IDC_GETOPENWITHDIR:
  624.           {
  625.             if (GetDirectory(hwnd,IDS_OPENWITH,tchOpenWithDir,tchOpenWithDir,TRUE))
  626.             {
  627.               DirList_Fill(GetDlgItem(hwnd,IDC_OPENWITHDIR),tchOpenWithDir,DL_ALLOBJECTS,NULL,FALSE,flagNoFadeHidden);
  628.               DirList_Sort(GetDlgItem(hwnd,IDC_OPENWITHDIR),DS_NAME,FALSE);
  629.               DirList_StartIconThread(GetDlgItem(hwnd,IDC_OPENWITHDIR));
  630.               ListView_EnsureVisible(GetDlgItem(hwnd,IDC_OPENWITHDIR),0,FALSE);
  631.               ListView_SetItemState(GetDlgItem(hwnd,IDC_OPENWITHDIR),0,
  632.                                     LVIS_FOCUSED,LVIS_FOCUSED);
  633.               ListView_SetColumnWidth(GetDlgItem(hwnd,IDC_OPENWITHDIR),0,LVSCW_AUTOSIZE);
  634.               ListView_Arrange(GetDlgItem(hwnd,IDC_OPENWITHDIR),LVA_DEFAULT);
  635.  
  636.             }
  637.             PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,IDC_OPENWITHDIR)),1);
  638.           }
  639.           break;
  640.  
  641.  
  642.         case IDOK: {
  643.           LPDLITEM lpdli = (LPDLITEM)GetWindowLong(hwnd,DWL_USER);
  644.           lpdli->mask = DLI_FILENAME | DLI_TYPE;
  645.           lpdli->ntype = DLE_NONE;
  646.           DirList_GetItem(GetDlgItem(hwnd,IDC_OPENWITHDIR),(-1),lpdli);
  647.  
  648.           if (lpdli->ntype != DLE_NONE)
  649.             EndDialog(hwnd,IDOK);
  650.           else
  651.             MessageBeep(0); }
  652.           break;
  653.  
  654.  
  655.         case IDCANCEL:
  656.           EndDialog(hwnd,IDCANCEL);
  657.           break;
  658.  
  659.       }
  660.  
  661.       return TRUE;
  662.  
  663.   }
  664.  
  665.   return FALSE;
  666.  
  667. }
  668.  
  669.  
  670. //=============================================================================
  671. //
  672. //  OpenWithDlg()
  673. //
  674. BOOL OpenWithDlg(HWND hwnd,LPCSTR lpstrFile)
  675. {
  676.  
  677.   DLITEM dliOpenWith;
  678.   dliOpenWith.mask = DLI_FILENAME;
  679.  
  680.   if (IDOK == DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_OPENWITH),
  681.                              hwnd,OpenWithDlgProc,(LPARAM)&dliOpenWith))
  682.   {
  683.     SHELLEXECUTEINFO sei;
  684.     char szParam[MAX_PATH];
  685.  
  686.     ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
  687.     sei.cbSize = sizeof(SHELLEXECUTEINFO);
  688.     sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  689.     sei.hwnd = hwnd;
  690.     sei.lpVerb = NULL;
  691.     sei.lpFile = dliOpenWith.szFileName;
  692.     sei.lpParameters = szParam;
  693.     sei.lpDirectory = NULL;
  694.     sei.nShow = SW_SHOWNORMAL;
  695.  
  696.     // resolve links and get short path name
  697.     if (!(PathIsLnkFile(lpstrFile) && PathGetLnkPath(lpstrFile,szParam,COUNTOF(szParam))))
  698.       lstrcpy(szParam,lpstrFile);
  699.     GetShortPathName(szParam,szParam,sizeof(char)*COUNTOF(szParam));
  700.     //PathQuoteSpaces(szParam);
  701.  
  702.     ShellExecuteEx(&sei);
  703.  
  704.     return(TRUE);
  705.   }
  706.  
  707.   return(FALSE);
  708.  
  709. }
  710.  
  711.  
  712. //=============================================================================
  713. //
  714. //  FavoritesDlgProc()
  715. //
  716. extern char tchFavoritesDir[MAX_PATH];
  717. //extern int  flagNoFadeHidden;
  718.  
  719. extern int cxFavoritesDlg;
  720. extern int cyFavoritesDlg;
  721.  
  722. BOOL CALLBACK FavoritesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  723. {
  724.  
  725.   static int cxClient;
  726.   static int cyClient;
  727.   static int mmiPtMaxY;
  728.   static int mmiPtMinX;
  729.  
  730.   switch(umsg)
  731.   {
  732.  
  733.     case WM_INITDIALOG:
  734.       {
  735.         RECT rc;
  736.         char tch[MAX_PATH];
  737.         int cGrip;
  738.  
  739.         GetClientRect(hwnd,&rc);
  740.         cxClient = rc.right - rc.left;
  741.         cyClient = rc.bottom - rc.top;
  742.  
  743.         GetWindowRect(hwnd,&rc);
  744.         mmiPtMaxY = rc.bottom-rc.top;
  745.         mmiPtMinX = rc.right-rc.left;
  746.  
  747.         if (cxFavoritesDlg < (rc.right-rc.left))
  748.           cxFavoritesDlg = rc.right-rc.left;
  749.         if (cyFavoritesDlg < (rc.bottom-rc.top))
  750.           cyFavoritesDlg = rc.bottom-rc.top;
  751.         SetWindowPos(hwnd,NULL,rc.left,rc.top,cxFavoritesDlg,cyFavoritesDlg,SWP_NOZORDER);
  752.  
  753.         SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE)|WS_THICKFRAME);
  754.         SetWindowPos(hwnd,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
  755.  
  756.         GetMenuString(GetSystemMenu(GetParent(hwnd),FALSE),SC_SIZE,tch,COUNTOF(tch),MF_BYCOMMAND);
  757.         InsertMenu(GetSystemMenu(hwnd,FALSE),SC_CLOSE,MF_BYCOMMAND|MF_STRING|MF_ENABLED,SC_SIZE,tch);
  758.         InsertMenu(GetSystemMenu(hwnd,FALSE),SC_CLOSE,MF_BYCOMMAND|MF_SEPARATOR,0,NULL);
  759.  
  760.         SetWindowLong(GetDlgItem(hwnd,IDC_RESIZEGRIP3),GWL_STYLE,
  761.           GetWindowLong(GetDlgItem(hwnd,IDC_RESIZEGRIP3),GWL_STYLE)|SBS_SIZEGRIP|WS_CLIPSIBLINGS);
  762.  
  763.         cGrip = GetSystemMetrics(SM_CXHTHUMB);
  764.         SetWindowPos(GetDlgItem(hwnd,IDC_RESIZEGRIP3),NULL,cxClient-cGrip,
  765.                      cyClient-cGrip,cGrip,cGrip,SWP_NOZORDER);
  766.  
  767.         SetWindowLong(hwnd,DWL_USER,lParam);
  768.  
  769.         ListView_SetExtendedListViewStyle(GetDlgItem(hwnd,IDC_OPENWITHDIR),LVS_EX_LABELTIP);
  770.         DirList_Init(GetDlgItem(hwnd,IDC_FAVORITESDIR),NULL);
  771.         DirList_Fill(GetDlgItem(hwnd,IDC_FAVORITESDIR),tchFavoritesDir,DL_ALLOBJECTS,NULL,FALSE,flagNoFadeHidden);
  772.         DirList_Sort(GetDlgItem(hwnd,IDC_FAVORITESDIR),DS_NAME,FALSE);
  773.         DirList_StartIconThread(GetDlgItem(hwnd,IDC_FAVORITESDIR));
  774.         ListView_SetItemState(GetDlgItem(hwnd,IDC_FAVORITESDIR),0,
  775.                               LVIS_FOCUSED,LVIS_FOCUSED);
  776.         ListView_SetColumnWidth(GetDlgItem(hwnd,IDC_FAVORITESDIR),0,LVSCW_AUTOSIZE);
  777.         ListView_Arrange(GetDlgItem(hwnd,IDC_FAVORITESDIR),LVA_DEFAULT);
  778.  
  779.         MakeBitmapButton(hwnd,IDC_GETFAVORITESDIR,g_hInstance,IDB_OPEN);
  780.  
  781.         CenterDlgInParent(hwnd);
  782.       }
  783.       return TRUE;
  784.  
  785.  
  786.     case WM_DESTROY:
  787.       {
  788.         RECT rc;
  789.  
  790.         DirList_Destroy(GetDlgItem(hwnd,IDC_FAVORITESDIR));
  791.  
  792.         GetWindowRect(hwnd,&rc);
  793.         cxFavoritesDlg = rc.right-rc.left;
  794.         cyFavoritesDlg = rc.bottom-rc.top;
  795.       }
  796.       return FALSE;
  797.  
  798.  
  799.     case WM_SIZE:
  800.       {
  801.         RECT rc;
  802.  
  803.         int dxClient = LOWORD(lParam) - cxClient;
  804.         int dyClient = HIWORD(lParam) - cyClient;
  805.         cxClient = LOWORD(lParam);
  806.         cyClient = HIWORD(lParam);
  807.  
  808.         GetWindowRect(GetDlgItem(hwnd,IDC_RESIZEGRIP3),&rc);
  809.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  810.         SetWindowPos(GetDlgItem(hwnd,IDC_RESIZEGRIP3),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  811.         InvalidateRect(GetDlgItem(hwnd,IDC_RESIZEGRIP3),NULL,TRUE);
  812.  
  813.         GetWindowRect(GetDlgItem(hwnd,IDOK),&rc);
  814.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  815.         SetWindowPos(GetDlgItem(hwnd,IDOK),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  816.         InvalidateRect(GetDlgItem(hwnd,IDOK),NULL,TRUE);
  817.  
  818.         GetWindowRect(GetDlgItem(hwnd,IDCANCEL),&rc);
  819.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  820.         SetWindowPos(GetDlgItem(hwnd,IDCANCEL),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  821.         InvalidateRect(GetDlgItem(hwnd,IDCANCEL),NULL,TRUE);
  822.  
  823.         GetWindowRect(GetDlgItem(hwnd,IDC_FAVORITESDIR),&rc);
  824.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  825.         SetWindowPos(GetDlgItem(hwnd,IDC_FAVORITESDIR),NULL,0,0,rc.right-rc.left+dxClient,rc.bottom-rc.top+dyClient,SWP_NOZORDER|SWP_NOMOVE);
  826.         InvalidateRect(GetDlgItem(hwnd,IDC_FAVORITESDIR),NULL,TRUE);
  827.  
  828.         GetWindowRect(GetDlgItem(hwnd,IDC_GETFAVORITESDIR),&rc);
  829.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  830.         SetWindowPos(GetDlgItem(hwnd,IDC_GETFAVORITESDIR),NULL,rc.left,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  831.         InvalidateRect(GetDlgItem(hwnd,IDC_GETFAVORITESDIR),NULL,TRUE);
  832.  
  833.         GetWindowRect(GetDlgItem(hwnd,IDC_FAVORITESDESCR),&rc);
  834.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  835.         SetWindowPos(GetDlgItem(hwnd,IDC_FAVORITESDESCR),NULL,rc.left,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  836.         InvalidateRect(GetDlgItem(hwnd,IDC_FAVORITESDESCR),NULL,TRUE);
  837.       }
  838.       return TRUE;
  839.  
  840.  
  841.     case WM_GETMINMAXINFO:
  842.       {
  843.         LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
  844.         lpmmi->ptMinTrackSize.x = mmiPtMinX;
  845.         lpmmi->ptMinTrackSize.y = mmiPtMaxY;
  846.         //lpmmi->ptMaxTrackSize.y = mmiPtMaxY;
  847.       }
  848.       return TRUE;
  849.  
  850.  
  851.     case WM_NOTIFY:
  852.       {
  853.         LPNMHDR pnmh = (LPNMHDR)lParam;
  854.  
  855.         if (pnmh->idFrom == IDC_FAVORITESDIR)
  856.         {
  857.           switch(pnmh->code)
  858.           {
  859.             case LVN_GETDISPINFO:
  860.               DirList_GetDispInfo(GetDlgItem(hwnd,IDC_OPENWITHDIR),lParam,flagNoFadeHidden);
  861.               break;
  862.  
  863.             case LVN_DELETEITEM:
  864.               DirList_DeleteItem(GetDlgItem(hwnd,IDC_FAVORITESDIR),lParam);
  865.               break;
  866.  
  867.             case LVN_ITEMCHANGED: {
  868.               NM_LISTVIEW *pnmlv = (NM_LISTVIEW*)lParam;
  869.               EnableWindow(GetDlgItem(hwnd,IDOK),(pnmlv->uNewState & LVIS_SELECTED)); }
  870.               break;
  871.  
  872.             case NM_DBLCLK:
  873.               if (ListView_GetSelectedCount(GetDlgItem(hwnd,IDC_FAVORITESDIR)))
  874.                 SendMessage(hwnd,WM_COMMAND,MAKELONG(IDOK,1),0);
  875.               break;
  876.           }
  877.         }
  878.       }
  879.       return TRUE;
  880.  
  881.  
  882.     case WM_COMMAND:
  883.  
  884.       switch(LOWORD(wParam))
  885.       {
  886.  
  887.         case IDC_GETFAVORITESDIR:
  888.           {
  889.             if (GetDirectory(hwnd,IDS_FAVORITES,tchFavoritesDir,tchFavoritesDir,TRUE))
  890.             {
  891.               DirList_Fill(GetDlgItem(hwnd,IDC_FAVORITESDIR),tchFavoritesDir,DL_ALLOBJECTS,NULL,FALSE,flagNoFadeHidden);
  892.               DirList_Sort(GetDlgItem(hwnd,IDC_FAVORITESDIR),DS_NAME,FALSE);
  893.               DirList_StartIconThread(GetDlgItem(hwnd,IDC_FAVORITESDIR));
  894.               ListView_EnsureVisible(GetDlgItem(hwnd,IDC_FAVORITESDIR),0,FALSE);
  895.               ListView_SetItemState(GetDlgItem(hwnd,IDC_FAVORITESDIR),0,
  896.                                     LVIS_FOCUSED,LVIS_FOCUSED);
  897.               ListView_SetColumnWidth(GetDlgItem(hwnd,IDC_FAVORITESDIR),0,LVSCW_AUTOSIZE);
  898.               ListView_Arrange(GetDlgItem(hwnd,IDC_FAVORITESDIR),LVA_DEFAULT);
  899.  
  900.             }
  901.             PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,IDC_FAVORITESDIR)),1);
  902.           }
  903.           break;
  904.  
  905.  
  906.         case IDOK: {
  907.           LPDLITEM lpdli = (LPDLITEM)GetWindowLong(hwnd,DWL_USER);
  908.           lpdli->mask = DLI_FILENAME | DLI_TYPE;
  909.           lpdli->ntype = DLE_NONE;
  910.           DirList_GetItem(GetDlgItem(hwnd,IDC_FAVORITESDIR),(-1),lpdli);
  911.  
  912.           if (lpdli->ntype != DLE_NONE)
  913.             EndDialog(hwnd,IDOK);
  914.           else
  915.             MessageBeep(0); }
  916.           break;
  917.  
  918.  
  919.         case IDCANCEL:
  920.           EndDialog(hwnd,IDCANCEL);
  921.           break;
  922.  
  923.       }
  924.  
  925.       return TRUE;
  926.  
  927.   }
  928.  
  929.   return FALSE;
  930.  
  931. }
  932.  
  933.  
  934. //=============================================================================
  935. //
  936. //  FavoritesDlg()
  937. //
  938. BOOL FavoritesDlg(HWND hwnd,LPSTR lpstrFile)
  939. {
  940.  
  941.   DLITEM dliFavorite;
  942.   dliFavorite.mask = DLI_FILENAME;
  943.  
  944.   if (IDOK == DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_FAVORITES),
  945.                              hwnd,FavoritesDlgProc,(LPARAM)&dliFavorite))
  946.   {
  947.     lstrcpyn(lpstrFile,dliFavorite.szFileName,MAX_PATH);
  948.     return(TRUE);
  949.   }
  950.  
  951.   return(FALSE);
  952.  
  953. }
  954.  
  955.  
  956. //=============================================================================
  957. //
  958. //  AddToFavDlgProc()
  959. //
  960. //  Controls: 100 Edit
  961. //
  962. BOOL CALLBACK AddToFavDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  963. {
  964.  
  965.   switch(umsg)
  966.   {
  967.  
  968.     char *pszName;
  969.  
  970.     case WM_INITDIALOG:
  971.       pszName = (LPSTR)lParam;
  972.       SetWindowLong(hwnd,DWL_USER,(LONG)pszName);
  973.  
  974.       SendDlgItemMessage(hwnd,100,EM_LIMITTEXT,MAX_PATH-1,0);
  975.       SetDlgItemText(hwnd,100,pszName);
  976.  
  977.       CenterDlgInParent(hwnd);
  978.       return TRUE;
  979.  
  980.  
  981.     case WM_COMMAND:
  982.  
  983.       switch(LOWORD(wParam))
  984.       {
  985.  
  986.         case 100:
  987.             EnableWindow(GetDlgItem(hwnd,IDOK),
  988.               GetWindowTextLength(GetDlgItem(hwnd,100)));
  989.           break;
  990.  
  991.  
  992.         case IDOK:
  993.           pszName = (LPSTR)GetWindowLong(hwnd,DWL_USER);
  994.           GetDlgItemText(hwnd,100,pszName,
  995.             MAX_PATH-1);
  996.           EndDialog(hwnd,IDOK);
  997.           break;
  998.  
  999.  
  1000.         case IDCANCEL:
  1001.           EndDialog(hwnd,IDCANCEL);
  1002.           break;
  1003.  
  1004.       }
  1005.  
  1006.       return TRUE;
  1007.  
  1008.   }
  1009.  
  1010.   return FALSE;
  1011.  
  1012. }
  1013.  
  1014.  
  1015. //=============================================================================
  1016. //
  1017. //  AddToFavDlg()
  1018. //
  1019. BOOL AddToFavDlg(HWND hwnd,LPCSTR lpszName,LPCSTR lpszTarget)
  1020. {
  1021.  
  1022.   int iResult;
  1023.  
  1024.   char pszName[MAX_PATH];
  1025.   lstrcpy(pszName,lpszName);
  1026.  
  1027.   iResult = DialogBoxParam(
  1028.               g_hInstance,
  1029.               MAKEINTRESOURCE(IDD_ADDTOFAV),
  1030.               hwnd,
  1031.               AddToFavDlgProc,(LPARAM)pszName);
  1032.  
  1033.   if (iResult == IDOK)
  1034.   {
  1035.     if (!PathCreateFavLnk(pszName,lpszTarget,tchFavoritesDir)) {
  1036.       MsgBox(MBWARN,IDS_FAV_FAILURE);
  1037.       return FALSE; }
  1038.  
  1039.     else {
  1040.       MsgBox(MBINFO,IDS_FAV_SUCCESS);
  1041.       return TRUE; }
  1042.   }
  1043.  
  1044.   else
  1045.     return FALSE;
  1046.  
  1047. }
  1048.  
  1049.  
  1050. //=============================================================================
  1051. //
  1052. //  FileMRUDlgProc()
  1053. //
  1054. //
  1055. extern HANDLE hFileMRU;
  1056. extern BOOL   bSaveRecentFiles;
  1057. extern int cxFileMRUDlg;
  1058. extern int cyFileMRUDlg;
  1059. extern int flagNoFadeHidden;
  1060.  
  1061. BOOL CALLBACK FileMRUDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  1062. {
  1063.  
  1064.   static int cxClient;
  1065.   static int cyClient;
  1066.   static int mmiPtMaxY;
  1067.   static int mmiPtMinX;
  1068.  
  1069.   switch(umsg)
  1070.   {
  1071.  
  1072.     case WM_INITDIALOG:
  1073.       {
  1074.         RECT rc;
  1075.         char tch[MAX_PATH];
  1076.         int cGrip;
  1077.         SHFILEINFO shfi;
  1078.  
  1079.         SetWindowLong(hwnd,DWL_USER,lParam);
  1080.  
  1081.         GetClientRect(hwnd,&rc);
  1082.         cxClient = rc.right - rc.left;
  1083.         cyClient = rc.bottom - rc.top;
  1084.  
  1085.         GetWindowRect(hwnd,&rc);
  1086.         mmiPtMaxY = rc.bottom-rc.top;
  1087.         mmiPtMinX = rc.right-rc.left;
  1088.  
  1089.         if (cxFileMRUDlg < (rc.right-rc.left))
  1090.           cxFileMRUDlg = rc.right-rc.left;
  1091.         if (cyFileMRUDlg < (rc.bottom-rc.top))
  1092.           cyFileMRUDlg = rc.bottom-rc.top;
  1093.         SetWindowPos(hwnd,NULL,0,0,cxFileMRUDlg,cyFileMRUDlg,SWP_NOZORDER|SWP_NOMOVE);
  1094.  
  1095.         SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE)|WS_THICKFRAME);
  1096.         SetWindowPos(hwnd,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
  1097.  
  1098.         GetMenuString(GetSystemMenu(GetParent(hwnd),FALSE),SC_SIZE,tch,COUNTOF(tch),MF_BYCOMMAND);
  1099.         InsertMenu(GetSystemMenu(hwnd,FALSE),SC_CLOSE,MF_BYCOMMAND|MF_STRING|MF_ENABLED,SC_SIZE,tch);
  1100.         InsertMenu(GetSystemMenu(hwnd,FALSE),SC_CLOSE,MF_BYCOMMAND|MF_SEPARATOR,0,NULL);
  1101.  
  1102.         SetWindowLong(GetDlgItem(hwnd,IDC_RESIZEGRIP),GWL_STYLE,
  1103.           GetWindowLong(GetDlgItem(hwnd,IDC_RESIZEGRIP),GWL_STYLE)|SBS_SIZEGRIP|WS_CLIPSIBLINGS);
  1104.  
  1105.         cGrip = GetSystemMetrics(SM_CXHTHUMB);
  1106.         SetWindowPos(GetDlgItem(hwnd,IDC_RESIZEGRIP),NULL,cxClient-cGrip,
  1107.                      cyClient-cGrip,cGrip,cGrip,SWP_NOZORDER);
  1108.  
  1109.         ListView_SetImageList(GetDlgItem(hwnd,IDC_FILEMRU),
  1110.           (HIMAGELIST)SHGetFileInfo("C:\\",0,&shfi,sizeof(SHFILEINFO),SHGFI_SMALLICON | SHGFI_SYSICONINDEX),
  1111.           LVSIL_SMALL);
  1112.  
  1113.         ListView_SetImageList(GetDlgItem(hwnd,IDC_FILEMRU),
  1114.           (HIMAGELIST)SHGetFileInfo("C:\\",0,&shfi,sizeof(SHFILEINFO),SHGFI_LARGEICON | SHGFI_SYSICONINDEX),
  1115.           LVSIL_NORMAL);
  1116.  
  1117.         ListView_SetExtendedListViewStyle(GetDlgItem(hwnd,IDC_FILEMRU),LVS_EX_LABELTIP);
  1118.  
  1119.         // Update view
  1120.         SendMessage(hwnd,WM_COMMAND,MAKELONG(0x00A0,1),0);
  1121.  
  1122.         if (bSaveRecentFiles)
  1123.           CheckDlgButton(hwnd,IDC_SAVEMRU,BST_CHECKED);
  1124.  
  1125.         CenterDlgInParent(hwnd);
  1126.       }
  1127.       return TRUE;
  1128.  
  1129.  
  1130.     case WM_DESTROY:
  1131.       {
  1132.         RECT rc;
  1133.         GetWindowRect(hwnd,&rc);
  1134.         cxFileMRUDlg = rc.right-rc.left;
  1135.         cyFileMRUDlg = rc.bottom-rc.top;
  1136.  
  1137.         bSaveRecentFiles = (IsDlgButtonChecked(hwnd,IDC_SAVEMRU)) ? 1 : 0;
  1138.       }
  1139.       return FALSE;
  1140.  
  1141.  
  1142.     case WM_SIZE:
  1143.       {
  1144.         RECT rc;
  1145.  
  1146.         int dxClient = LOWORD(lParam) - cxClient;
  1147.         int dyClient = HIWORD(lParam) - cyClient;
  1148.         cxClient = LOWORD(lParam);
  1149.         cyClient = HIWORD(lParam);
  1150.  
  1151.         GetWindowRect(GetDlgItem(hwnd,IDC_RESIZEGRIP),&rc);
  1152.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  1153.         SetWindowPos(GetDlgItem(hwnd,IDC_RESIZEGRIP),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  1154.         InvalidateRect(GetDlgItem(hwnd,IDC_RESIZEGRIP),NULL,TRUE);
  1155.  
  1156.         GetWindowRect(GetDlgItem(hwnd,IDOK),&rc);
  1157.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  1158.         SetWindowPos(GetDlgItem(hwnd,IDOK),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  1159.         InvalidateRect(GetDlgItem(hwnd,IDOK),NULL,TRUE);
  1160.  
  1161.         GetWindowRect(GetDlgItem(hwnd,IDCANCEL),&rc);
  1162.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  1163.         SetWindowPos(GetDlgItem(hwnd,IDCANCEL),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  1164.         InvalidateRect(GetDlgItem(hwnd,IDCANCEL),NULL,TRUE);
  1165.  
  1166.         GetWindowRect(GetDlgItem(hwnd,IDC_FILEMRU),&rc);
  1167.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  1168.         SetWindowPos(GetDlgItem(hwnd,IDC_FILEMRU),NULL,0,0,rc.right-rc.left+dxClient,rc.bottom-rc.top+dyClient,SWP_NOZORDER|SWP_NOMOVE);
  1169.         InvalidateRect(GetDlgItem(hwnd,IDC_FILEMRU),NULL,TRUE);
  1170.  
  1171.         GetWindowRect(GetDlgItem(hwnd,IDC_SAVEMRU),&rc);
  1172.         MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
  1173.         SetWindowPos(GetDlgItem(hwnd,IDC_SAVEMRU),NULL,rc.left,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
  1174.         InvalidateRect(GetDlgItem(hwnd,IDC_SAVEMRU),NULL,TRUE);
  1175.       }
  1176.       return TRUE;
  1177.  
  1178.  
  1179.     case WM_GETMINMAXINFO:
  1180.       {
  1181.         LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
  1182.         lpmmi->ptMinTrackSize.x = mmiPtMinX;
  1183.         lpmmi->ptMinTrackSize.y = mmiPtMaxY;
  1184.         //lpmmi->ptMaxTrackSize.y = mmiPtMaxY;
  1185.       }
  1186.       return TRUE;
  1187.  
  1188.  
  1189.     case WM_NOTIFY: {
  1190.       if (((LPNMHDR)(lParam))->idFrom == IDC_FILEMRU) {
  1191.  
  1192.       switch (((LPNMHDR)(lParam))->code) {
  1193.  
  1194.         case NM_DBLCLK:
  1195.           SendMessage(hwnd,WM_COMMAND,MAKELONG(IDOK,1),0);
  1196.           break;
  1197.  
  1198.  
  1199.         case LVN_GETDISPINFO: {
  1200.  
  1201.           LV_DISPINFO *lpdi = (LPVOID)lParam;
  1202.  
  1203.           if (lpdi->item.mask & LVIF_IMAGE) {
  1204.  
  1205.             char tch[MAX_PATH];
  1206.             LV_ITEM lvi;
  1207.             SHFILEINFO shfi;
  1208.             DWORD dwFlags = SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_ATTRIBUTES | SHGFI_ATTR_SPECIFIED;
  1209.             DWORD dwAttr  = 0;
  1210.  
  1211.             ZeroMemory(&lvi,sizeof(LV_ITEM));
  1212.  
  1213.             lvi.mask = LVIF_TEXT;
  1214.             lvi.pszText = tch;
  1215.             lvi.cchTextMax = COUNTOF(tch);
  1216.             lvi.iItem = lpdi->item.iItem;
  1217.  
  1218.             ListView_GetItem(GetDlgItem(hwnd,IDC_FILEMRU),&lvi);
  1219.  
  1220.             if (!PathFileExists(tch)) {
  1221.               dwFlags |= SHGFI_USEFILEATTRIBUTES;
  1222.               dwAttr = FILE_ATTRIBUTE_NORMAL;
  1223.               shfi.dwAttributes = 0;
  1224.               SHGetFileInfo(PathFindFileName(tch),dwAttr,&shfi,sizeof(SHFILEINFO),dwFlags); }
  1225.  
  1226.             else {
  1227.               shfi.dwAttributes = SFGAO_LINK | SFGAO_SHARE;
  1228.               SHGetFileInfo(tch,dwAttr,&shfi,sizeof(SHFILEINFO),dwFlags); }
  1229.  
  1230.             lpdi->item.iImage = shfi.iIcon;
  1231.             lpdi->item.mask |= LVIF_DI_SETITEM;
  1232.  
  1233.             lpdi->item.stateMask = 0;
  1234.             lpdi->item.state = 0;
  1235.  
  1236.             if (shfi.dwAttributes & SFGAO_LINK) {
  1237.               lpdi->item.mask |= LVIF_STATE;
  1238.               lpdi->item.stateMask |= LVIS_OVERLAYMASK;
  1239.               lpdi->item.state |= INDEXTOOVERLAYMASK(2); }
  1240.  
  1241.             if (shfi.dwAttributes & SFGAO_SHARE) {
  1242.               lpdi->item.mask |= LVIF_STATE;
  1243.               lpdi->item.stateMask |= LVIS_OVERLAYMASK;
  1244.               lpdi->item.state |= INDEXTOOVERLAYMASK(1); }
  1245.  
  1246.           dwAttr = GetFileAttributes(tch);
  1247.  
  1248.           if (!flagNoFadeHidden &&
  1249.               dwAttr != INVALID_FILE_ATTRIBUTES &&
  1250.               dwAttr & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) {
  1251.             lpdi->item.mask |= LVIF_STATE;
  1252.             lpdi->item.stateMask |= LVIS_CUT;
  1253.             lpdi->item.state |= LVIS_CUT; } } }
  1254.  
  1255.           break;
  1256.  
  1257.  
  1258.         case LVN_ITEMCHANGED:
  1259.         case LVN_DELETEITEM:
  1260.           EnableWindow(GetDlgItem(hwnd,IDOK),ListView_GetSelectedCount(GetDlgItem(hwnd,IDC_FILEMRU)));
  1261.           break; } } }
  1262.  
  1263.       return TRUE;
  1264.  
  1265.  
  1266.     case WM_COMMAND:
  1267.  
  1268.       switch(LOWORD(wParam))
  1269.       {
  1270.  
  1271.         case 0x00A0:
  1272.           {
  1273.             int i;
  1274.             char tch[MAX_PATH];
  1275.             LV_ITEM lvi;
  1276.  
  1277.             ListView_DeleteAllItems(GetDlgItem(hwnd,IDC_FILEMRU));
  1278.  
  1279.             ZeroMemory(&lvi,sizeof(LV_ITEM));
  1280.             lvi.mask = LVIF_TEXT | LVIF_IMAGE;
  1281.             lvi.iImage = I_IMAGECALLBACK;
  1282.  
  1283.             for (i = 0; i < EnumMRUList(hFileMRU,0,NULL,0); i++) {
  1284.               EnumMRUList(hFileMRU,i,tch,COUNTOF(tch));
  1285.             //  SendDlgItemMessage(hwnd,IDC_FILEMRU,LB_ADDSTRING,0,(LPARAM)tch); }
  1286.             //SendDlgItemMessage(hwnd,IDC_FILEMRU,LB_SETCARETINDEX,0,FALSE);
  1287.             lvi.iItem = i;
  1288.             lvi.pszText = tch;
  1289.             ListView_InsertItem(GetDlgItem(hwnd,IDC_FILEMRU),&lvi); }
  1290.  
  1291.             ListView_SetItemState(GetDlgItem(hwnd,IDC_FILEMRU),0,
  1292.                                   LVIS_FOCUSED,LVIS_FOCUSED);
  1293.             ListView_SetColumnWidth(GetDlgItem(hwnd,IDC_FILEMRU),0,LVSCW_AUTOSIZE);
  1294.             ListView_Arrange(GetDlgItem(hwnd,IDC_FILEMRU),LVA_DEFAULT);
  1295.           }
  1296.           break;
  1297.  
  1298.         case IDC_FILEMRU:
  1299.           break;
  1300.  
  1301.  
  1302.         case IDOK:
  1303.           {
  1304.             char tch[MAX_PATH];
  1305.             //int  iItem;
  1306.  
  1307.             //if ((iItem = SendDlgItemMessage(hwnd,IDC_FILEMRU,LB_GETCURSEL,0,0)) != LB_ERR)
  1308.             if (ListView_GetSelectedCount(GetDlgItem(hwnd,IDC_FILEMRU)))
  1309.             {
  1310.               //SendDlgItemMessage(hwnd,IDC_FILEMRU,LB_GETTEXT,(WPARAM)iItem,(LPARAM)tch);
  1311.               LV_ITEM lvi;
  1312.               ZeroMemory(&lvi,sizeof(LV_ITEM));
  1313.  
  1314.               lvi.mask = LVIF_TEXT;
  1315.               lvi.pszText = tch;
  1316.               lvi.cchTextMax = COUNTOF(tch);
  1317.               lvi.iItem = ListView_GetNextItem(GetDlgItem(hwnd,IDC_FILEMRU),-1,LVNI_ALL | LVNI_SELECTED);
  1318.  
  1319.               ListView_GetItem(GetDlgItem(hwnd,IDC_FILEMRU),&lvi);
  1320.  
  1321.               PathUnquoteSpaces(tch);
  1322.  
  1323.               if (!PathFileExists(tch)) {
  1324.  
  1325.                 // Ask...
  1326.                 if (IDYES == MsgBox(MBYESNO,IDS_ERR_MRUDLG)) {
  1327.  
  1328.                     /*
  1329.                       Delete the selected item and reinitialize the MRU list
  1330.                       http://www.geocities.com/SiliconValley/4942/mrulist.html
  1331.                     */
  1332.  
  1333.                     CREATEMRULIST cl = { sizeof(CREATEMRULIST), 16, 2,
  1334.                                          HKEY_CURRENT_USER,
  1335.                                          "Software\\Notepad2\\Recent Files", NULL };
  1336.  
  1337.                     DelMRUString(hFileMRU,lvi.iItem);
  1338.                     FreeMRUList(hFileMRU);
  1339.                     hFileMRU = CreateMRUList(&cl);
  1340.  
  1341.                     //SendDlgItemMessage(hwnd,IDC_FILEMRU,LB_DELETESTRING,(WPARAM)iItem,0);
  1342.                     //ListView_DeleteItem(GetDlgItem(hwnd,IDC_FILEMRU),lvi.iItem);
  1343.                     // must use IDM_VIEW_REFRESH, index might change...
  1344.                     SendMessage(hwnd,WM_COMMAND,MAKELONG(0x00A0,1),0);
  1345.  
  1346.                     //EnableWindow(GetDlgItem(hwnd,IDOK),
  1347.                     //  (LB_ERR != SendDlgItemMessage(hwnd,IDC_GOTO,LB_GETCURSEL,0,0)));
  1348.                 }
  1349.               }
  1350.  
  1351.               else {
  1352.                 lstrcpy((LPSTR)GetWindowLong(hwnd,DWL_USER),tch);
  1353.                 EndDialog(hwnd,IDOK); }
  1354.             }
  1355.           }
  1356.           break;
  1357.  
  1358.  
  1359.         case IDCANCEL:
  1360.           EndDialog(hwnd,IDCANCEL);
  1361.           break;
  1362.  
  1363.       }
  1364.  
  1365.       return TRUE;
  1366.  
  1367.   }
  1368.  
  1369.   return FALSE;
  1370.  
  1371. }
  1372.  
  1373.  
  1374. //=============================================================================
  1375. //
  1376. //  FileMRUDlg()
  1377. //
  1378. //
  1379. BOOL FileMRUDlg(HWND hwnd,LPSTR lpstrFile)
  1380. {
  1381.  
  1382.   if (IDOK == DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_FILEMRU),
  1383.                 hwnd,FileMRUDlgProc,(LPARAM)lpstrFile))
  1384.     return TRUE;
  1385.   else
  1386.     return FALSE;
  1387.  
  1388. }
  1389.  
  1390.  
  1391. //=============================================================================
  1392. //
  1393. //  WordWrapSettingsDlgProc()
  1394. //
  1395. //  Controls: 100 Edit
  1396. //            101 Combo
  1397. //
  1398. extern BOOL bShowWordWrapSymbols;
  1399. extern int  iWordWrapSymbols;
  1400.  
  1401. BOOL CALLBACK WordWrapSettingsDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  1402. {
  1403.  
  1404.   static int *piNumber;
  1405.  
  1406.   switch(umsg)
  1407.   {
  1408.  
  1409.     case WM_INITDIALOG:
  1410.       {
  1411.  
  1412.         char tch[512];
  1413.         char *p1, *p2;
  1414.  
  1415.         piNumber = (int*)lParam;
  1416.  
  1417.         SetDlgItemInt(hwnd,100,*piNumber,FALSE);
  1418.         SendDlgItemMessage(hwnd,100,EM_LIMITTEXT,15,0);
  1419.  
  1420.         // Load options
  1421.         GetString(IDS_WORDWRAPVISUALS,tch,COUNTOF(tch));
  1422.         lstrcat(tch,"|");
  1423.         p1 = tch;
  1424.         while (p2 = strchr(p1,'|')) {
  1425.           *p2++ = '\0';
  1426.           if (*p1)
  1427.             SendDlgItemMessage(hwnd,101,CB_ADDSTRING,0,(LPARAM)p1);
  1428.           p1 = p2; }
  1429.  
  1430.         SendDlgItemMessage(hwnd,101,CB_SETCURSEL,(WPARAM)(bShowWordWrapSymbols) ? iWordWrapSymbols+1 : 0,0);
  1431.         SendDlgItemMessage(hwnd,101,CB_SETEXTENDEDUI,TRUE,0);
  1432.  
  1433.         CenterDlgInParent(hwnd);
  1434.  
  1435.       }
  1436.       return TRUE;
  1437.  
  1438.  
  1439.     case WM_COMMAND:
  1440.  
  1441.       switch(LOWORD(wParam))
  1442.       {
  1443.  
  1444.         case IDOK: {
  1445.  
  1446.           BOOL fTranslated;
  1447.           int  iSel;
  1448.  
  1449.           int iNewNumber = GetDlgItemInt(hwnd,100,&fTranslated,FALSE);
  1450.  
  1451.           if (fTranslated)
  1452.           {
  1453.             *piNumber = iNewNumber;
  1454.  
  1455.             iSel = SendDlgItemMessage(hwnd,101,CB_GETCURSEL,0,0);
  1456.             if (iSel > 0) {
  1457.               bShowWordWrapSymbols = TRUE;
  1458.               iWordWrapSymbols = iSel-1; }
  1459.             else {
  1460.               bShowWordWrapSymbols = FALSE; }
  1461.  
  1462.             EndDialog(hwnd,IDOK);
  1463.           }
  1464.  
  1465.           else
  1466.             PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,100)),1);
  1467.  
  1468.           }
  1469.           break;
  1470.  
  1471.  
  1472.         case IDCANCEL:
  1473.           EndDialog(hwnd,IDCANCEL);
  1474.           break;
  1475.  
  1476.       }
  1477.  
  1478.       return TRUE;
  1479.  
  1480.   }
  1481.  
  1482.   return FALSE;
  1483.  
  1484. }
  1485.  
  1486.  
  1487. //=============================================================================
  1488. //
  1489. //  WordWrapSettingsDlg()
  1490. //
  1491. BOOL WordWrapSettingsDlg(HWND hwnd,UINT uidDlg,int *iNumber)
  1492. {
  1493.  
  1494.   int iResult;
  1495.  
  1496.   iResult = DialogBoxParam(
  1497.               g_hInstance,
  1498.               MAKEINTRESOURCE(uidDlg),
  1499.               hwnd,
  1500.               WordWrapSettingsDlgProc,(LPARAM)iNumber);
  1501.  
  1502.   return (iResult == IDOK) ? TRUE : FALSE;
  1503.  
  1504. }
  1505.  
  1506.  
  1507. //=============================================================================
  1508. //
  1509. //  LongLineSettingsDlgProc()
  1510. //
  1511. //  Controls: 100 Edit
  1512. //            101 Radio1
  1513. //            102 Radio2
  1514. //
  1515. extern int iLongLineMode;
  1516.  
  1517. BOOL CALLBACK LongLineSettingsDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  1518. {
  1519.  
  1520.   static int *piNumber;
  1521.  
  1522.   switch(umsg)
  1523.   {
  1524.  
  1525.     case WM_INITDIALOG:
  1526.       {
  1527.  
  1528.         piNumber = (int*)lParam;
  1529.  
  1530.         SetDlgItemInt(hwnd,100,*piNumber,FALSE);
  1531.         SendDlgItemMessage(hwnd,100,EM_LIMITTEXT,15,0);
  1532.  
  1533.         if (iLongLineMode == EDGE_LINE)
  1534.           CheckRadioButton(hwnd,101,102,101);
  1535.         else
  1536.           CheckRadioButton(hwnd,101,102,102);
  1537.  
  1538.         CenterDlgInParent(hwnd);
  1539.  
  1540.       }
  1541.       return TRUE;
  1542.  
  1543.  
  1544.     case WM_COMMAND:
  1545.  
  1546.       switch(LOWORD(wParam))
  1547.       {
  1548.  
  1549.         case IDOK: {
  1550.  
  1551.           BOOL fTranslated;
  1552.  
  1553.           int iNewNumber = GetDlgItemInt(hwnd,100,&fTranslated,FALSE);
  1554.  
  1555.           if (fTranslated)
  1556.           {
  1557.             *piNumber = iNewNumber;
  1558.  
  1559.             iLongLineMode = (IsDlgButtonChecked(hwnd,101)) ? EDGE_LINE : EDGE_BACKGROUND;
  1560.  
  1561.             EndDialog(hwnd,IDOK);
  1562.           }
  1563.  
  1564.           else
  1565.             PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,100)),1);
  1566.  
  1567.           }
  1568.           break;
  1569.  
  1570.  
  1571.         case IDCANCEL:
  1572.           EndDialog(hwnd,IDCANCEL);
  1573.           break;
  1574.  
  1575.       }
  1576.  
  1577.       return TRUE;
  1578.  
  1579.   }
  1580.  
  1581.   return FALSE;
  1582.  
  1583. }
  1584.  
  1585.  
  1586. //=============================================================================
  1587. //
  1588. //  LongLineSettingsDlg()
  1589. //
  1590. BOOL LongLineSettingsDlg(HWND hwnd,UINT uidDlg,int *iNumber)
  1591. {
  1592.  
  1593.   int iResult;
  1594.  
  1595.   iResult = DialogBoxParam(
  1596.               g_hInstance,
  1597.               MAKEINTRESOURCE(uidDlg),
  1598.               hwnd,
  1599.               LongLineSettingsDlgProc,(LPARAM)iNumber);
  1600.  
  1601.   return (iResult == IDOK) ? TRUE : FALSE;
  1602.  
  1603. }
  1604.  
  1605.  
  1606. //=============================================================================
  1607. //
  1608. //  TabSettingsDlgProc()
  1609. //
  1610. //  Controls: 100 Edit
  1611. //            101 Check
  1612. //
  1613. extern BOOL bTabsAsSpaces;
  1614.  
  1615. BOOL CALLBACK TabSettingsDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  1616. {
  1617.  
  1618.   static int *piNumber;
  1619.  
  1620.   switch(umsg)
  1621.   {
  1622.  
  1623.     case WM_INITDIALOG:
  1624.       {
  1625.  
  1626.         piNumber = (int*)lParam;
  1627.  
  1628.         SetDlgItemInt(hwnd,100,*piNumber,FALSE);
  1629.         SendDlgItemMessage(hwnd,100,EM_LIMITTEXT,15,0);
  1630.  
  1631.         if (bTabsAsSpaces)
  1632.           CheckDlgButton(hwnd,101,BST_CHECKED);
  1633.  
  1634.         CenterDlgInParent(hwnd);
  1635.  
  1636.       }
  1637.       return TRUE;
  1638.  
  1639.  
  1640.     case WM_COMMAND:
  1641.  
  1642.       switch(LOWORD(wParam))
  1643.       {
  1644.  
  1645.         case IDOK: {
  1646.  
  1647.           BOOL fTranslated;
  1648.  
  1649.           int iNewNumber = GetDlgItemInt(hwnd,100,&fTranslated,FALSE);
  1650.  
  1651.           if (fTranslated)
  1652.           {
  1653.             *piNumber = iNewNumber;
  1654.  
  1655.             bTabsAsSpaces = (IsDlgButtonChecked(hwnd,101)) ? TRUE : FALSE;
  1656.  
  1657.             EndDialog(hwnd,IDOK);
  1658.           }
  1659.  
  1660.           else
  1661.             PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,100)),1);
  1662.  
  1663.           }
  1664.           break;
  1665.  
  1666.  
  1667.         case IDCANCEL:
  1668.           EndDialog(hwnd,IDCANCEL);
  1669.           break;
  1670.  
  1671.       }
  1672.  
  1673.       return TRUE;
  1674.  
  1675.   }
  1676.  
  1677.   return FALSE;
  1678.  
  1679. }
  1680.  
  1681.  
  1682. //=============================================================================
  1683. //
  1684. //  TabSettingsDlg()
  1685. //
  1686. BOOL TabSettingsDlg(HWND hwnd,UINT uidDlg,int *iNumber)
  1687. {
  1688.  
  1689.   int iResult;
  1690.  
  1691.   iResult = DialogBoxParam(
  1692.               g_hInstance,
  1693.               MAKEINTRESOURCE(uidDlg),
  1694.               hwnd,
  1695.               TabSettingsDlgProc,(LPARAM)iNumber);
  1696.  
  1697.   return (iResult == IDOK) ? TRUE : FALSE;
  1698.  
  1699. }
  1700.  
  1701.  
  1702. //=============================================================================
  1703. //
  1704. //  SelectOptionDlgProc()
  1705. //
  1706. //  Controls: 100 Combo
  1707. //            IDC_AUTOSELACP
  1708. //
  1709. extern BOOL bAutoSelACP;
  1710.  
  1711. BOOL CALLBACK SelectOptionDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  1712. {
  1713.  
  1714.   static int *piOption;
  1715.  
  1716.   switch(umsg)
  1717.   {
  1718.  
  1719.     case WM_INITDIALOG:
  1720.       {
  1721.  
  1722.         char tch[512];
  1723.         char *p1, *p2;
  1724.  
  1725.         piOption = (int*)lParam;
  1726.  
  1727.         // Load options
  1728.         GetDlgItemText(hwnd,101,tch,COUNTOF(tch));
  1729.         lstrcat(tch,"|");
  1730.         p1 = tch;
  1731.         while (p2 = strchr(p1,'|')) {
  1732.           *p2++ = '\0';
  1733.           if (*p1)
  1734.             SendDlgItemMessage(hwnd,100,CB_ADDSTRING,0,(LPARAM)p1);
  1735.           p1 = p2; }
  1736.  
  1737.         SendDlgItemMessage(hwnd,100,CB_SETCURSEL,(WPARAM)*piOption,0);
  1738.         SendDlgItemMessage(hwnd,100,CB_SETEXTENDEDUI,TRUE,0);
  1739.  
  1740.         if (GetDlgItem(hwnd,IDC_AUTOSELACP))
  1741.           CheckDlgButton(hwnd,IDC_AUTOSELACP,bAutoSelACP ? BST_CHECKED : BST_UNCHECKED);
  1742.  
  1743.         CenterDlgInParent(hwnd);
  1744.  
  1745.       }
  1746.       return TRUE;
  1747.  
  1748.  
  1749.     case WM_COMMAND:
  1750.  
  1751.       switch(LOWORD(wParam))
  1752.       {
  1753.  
  1754.         case IDOK: {
  1755.           *piOption = SendDlgItemMessage(hwnd,100,CB_GETCURSEL,0,0);
  1756.  
  1757.           if (GetDlgItem(hwnd,IDC_AUTOSELACP))
  1758.             bAutoSelACP = IsDlgButtonChecked(hwnd,IDC_AUTOSELACP) ? 1 : 0;
  1759.  
  1760.           EndDialog(hwnd,IDOK); }
  1761.           break;
  1762.  
  1763.  
  1764.         case IDCANCEL:
  1765.           EndDialog(hwnd,IDCANCEL);
  1766.           break;
  1767.  
  1768.       }
  1769.  
  1770.       return TRUE;
  1771.  
  1772.   }
  1773.  
  1774.   return FALSE;
  1775.  
  1776. }
  1777.  
  1778.  
  1779. //=============================================================================
  1780. //
  1781. //  SelectOptionDlg()
  1782. //
  1783. BOOL SelectOptionDlg(HWND hwnd,UINT uidDlg,int *iOption)
  1784. {
  1785.  
  1786.   int iResult;
  1787.  
  1788.   iResult = DialogBoxParam(
  1789.               g_hInstance,
  1790.               MAKEINTRESOURCE(uidDlg),
  1791.               hwnd,
  1792.               SelectOptionDlgProc,(LPARAM)iOption);
  1793.  
  1794.   return (iResult == IDOK) ? TRUE : FALSE;
  1795.  
  1796. }
  1797.  
  1798.  
  1799. //  End of Dialogs.c
  1800.