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

  1. /******************************************************************************
  2. *
  3. *
  4. * Notepad2
  5. *
  6. * Notepad2.c
  7. *   Main application window functionality
  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 <shlwapi.h>
  25. #include <richedit.h>
  26. #include <shellapi.h>
  27. #include <commdlg.h>
  28. #include <stdio.h>
  29. #include <string.h>
  30. #include "scintilla.h"
  31. #include "scilexer.h"
  32. #include "edit.h"
  33. #include "styles.h"
  34. #include "helpers.h"
  35. #include "dialogs.h"
  36. #include "appreg.h"
  37. #include "notepad2.h"
  38. #include "resource.h"
  39.  
  40.  
  41.  
  42. /******************************************************************************
  43. *
  44. * Local and global Variables for Notepad2.c
  45. *
  46. */
  47. HWND      hwndStatus;
  48. HWND      hwndToolbar;
  49. HWND      hwndReBar;
  50. HWND      hwndEdit;
  51. HWND      hwndEditFrame;
  52. HWND      hwndMain;
  53. HWND      hwndFindReplace = NULL;
  54. HWND      hwndNextCBChain = NULL;
  55.  
  56. #define NUMTOOLBITMAPS  26
  57. #define NUMINITIALTOOLS 24
  58.  
  59. TBBUTTON  tbbMainWnd[] = { {0,IDT_FILE_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  60.                            {1,IDT_FILE_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  61.                            {2,IDT_FILE_METAPATH,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  62.                            {3,IDT_FILE_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  63.                            {0,0,0,TBSTYLE_SEP,0,0},
  64.                            {4,IDT_EDIT_UNDO,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  65.                            {5,IDT_EDIT_REDO,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  66.                            {0,0,0,TBSTYLE_SEP,0,0},
  67.                            {6,IDT_EDIT_CUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  68.                            {7,IDT_EDIT_COPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  69.                            {8,IDT_EDIT_PASTE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  70.                            {0,0,0,TBSTYLE_SEP,0,0},
  71.                            {9,IDT_EDIT_FIND,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  72.                            {10,IDT_EDIT_REPLACE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  73.                            {0,0,0,TBSTYLE_SEP,0,0},
  74.                            {11,IDT_VIEW_WORDWRAP,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  75.                            {0,0,0,TBSTYLE_SEP,0,0},
  76.                            {12,IDT_VIEW_ZOOMIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  77.                            {13,IDT_VIEW_ZOOMOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  78.                            {0,0,0,TBSTYLE_SEP,0,0},
  79.                            {14,IDT_VIEW_SCHEME,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  80.                            {15,IDT_VIEW_SCHEMECONFIG,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  81.                            {0,0,0,TBSTYLE_SEP,0,0},
  82.                            {16,IDT_FILE_EXIT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  83.                            {17,IDT_FILE_SAVEAS,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  84.                            {18,IDT_FILE_SAVECOPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  85.                            {19,IDT_EDIT_COPYALL,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  86.                            {20,IDT_EDIT_CLEAR,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  87.                            {21,IDT_EDIT_FINDNEXT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  88.                            {22,IDT_EDIT_FINDPREV,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  89.                            {23,IDT_FILE_PRINT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  90.                            {24,IDT_FILE_OPENFAV,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
  91.                            {25,IDT_FILE_ADDTOFAV,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0} };
  92.  
  93. BOOL      bSaveSettings;
  94. BOOL      bSaveRecentFiles;
  95. BOOL      bSaveFindReplace;
  96. char      tchOpenWithDir[MAX_PATH];
  97. char      tchFavoritesDir[MAX_PATH];
  98. char      tchDefaultExtension[64];
  99. char      tchToolbarBitmap[MAX_PATH];
  100. char      tchToolbarBitmapHot[MAX_PATH];
  101. char      tchToolbarBitmapDisabled[MAX_PATH];
  102. BOOL      bShortPathNames;
  103. BOOL      fWordWrap;
  104. int       iWordWrapIndent;
  105. int       iWordWrapSymbols;
  106. BOOL      bShowWordWrapSymbols;
  107. BOOL      bMatchBraces;
  108. BOOL      bAutoIndent;
  109. BOOL      bAutoCloseTags;
  110. BOOL      bShowIndentGuides;
  111. BOOL      bTabsAsSpaces;
  112. int       iTabWidth;
  113. BOOL      bMarkLongLines;
  114. int       iLongLinesLimit;
  115. int       iLongLineMode;
  116. BOOL      bShowSelectionMargin;
  117. BOOL      bShowLineNumbers;
  118. BOOL      bViewWhiteSpace;
  119. BOOL      bViewEOLs;
  120. int       iDefaultEncoding;
  121. int       iDefaultEOLMode;
  122. int       iPrintHeader;
  123. int       iPrintFooter;
  124. int       iPrintZoom;
  125. RECT      pagesetupMargin;
  126. BOOL      bSaveBeforeRunningTools;
  127. //BOOL      bEnableFileWatching;
  128. int       iEscFunction;
  129. BOOL      bAlwaysOnTop;
  130. BOOL      bMinimizeToTray;
  131. BOOL      bTransparentMode;
  132. BOOL      bTransparentModeAvailable;
  133. BOOL      bShowToolbar;
  134. BOOL      bShowStatusbar;
  135.  
  136. typedef struct _wi
  137. {
  138.   int x;
  139.   int y;
  140.   int cx;
  141.   int cy;
  142.   int max;
  143. } WININFO;
  144.  
  145. WININFO wi;
  146. int     cyReBar;
  147. int     cyReBarFrame;
  148. int     cxEditFrame;
  149. int     cyEditFrame;
  150.  
  151. int     cxFileMRUDlg;
  152. int     cyFileMRUDlg;
  153. int     cxOpenWithDlg;
  154. int     cyOpenWithDlg;
  155. int     cxFavoritesDlg;
  156. int     cyFavoritesDlg;
  157.  
  158. LPSTR     lpFileArg = NULL;
  159. HANDLE    hFileMRU;
  160.  
  161. char      szCurFile[MAX_PATH+40];
  162. BOOL      bModified;
  163. BOOL      bReadOnly = FALSE;
  164. int       iCodePage;
  165. int       iInitialCP;
  166. int       iEOLMode;
  167.  
  168. int       iDefaultCodePage;
  169. int       iDefaultCharSet;
  170. BOOL      bAutoSelACP;
  171.  
  172. int       iInitialLine;
  173. int       iInitialColumn;
  174.  
  175. BOOL      bLastCopyFromMe = FALSE;
  176. UINT      uidsAppTitle = IDS_APPTITLE;
  177.  
  178. //HANDLE    hChangeHandle = NULL;
  179. //BOOL      bRunningWatch = FALSE;
  180. //BOOL      bPendingChangeNotify = FALSE;
  181. //WIN32_FIND_DATA fdCurFile;
  182.  
  183. EDITFINDREPLACE efrData = { "", "", "", "", 0, 0, 0, 0, NULL };
  184. UINT cpLastFind = 0;
  185.  
  186. int iEncodings[5] = { NCP_DEFAULT,
  187.                       NCP_UNICODE|NCP_UNICODE_BOM,
  188.                       NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_UNICODE_BOM,
  189.                       NCP_UTF8,
  190.                       NCP_UTF8|NCP_UTF8_SIGN };
  191.  
  192. int iLineEndings[3] = { SC_EOL_CRLF,SC_EOL_LF, SC_EOL_CR };
  193.  
  194. struct {
  195.   int flags;
  196.   int location;
  197. } WrapSymbols[4] = { { 1, 1 },
  198.                      { 2, 2 },
  199.                      { 3, 3 },
  200.                      { 3, 0 } };
  201.  
  202. LPMALLOC  g_lpMalloc;
  203. HINSTANCE g_hInstance;
  204.  
  205.  
  206. extern int Scintilla_RegisterClasses(HINSTANCE);
  207. extern int Scintilla_ReleaseResources();
  208.  
  209.  
  210.  
  211. //=============================================================================
  212. //
  213. // Flags
  214. //
  215. int flagNoReuseWindow     = 0;
  216. int flagStartAsTrayIcon   = 0;
  217. int flagUnregProgram      = 0;
  218. int flagNoFadeHidden      = 0;
  219. int flagPosParam          = 0;
  220. int flagNewFromClipboard  = 0;
  221. int flagPasteBoard        = 0;
  222. int flagJumpTo            = 0;
  223. int flagDisplayHelp       = 0;
  224.  
  225.  
  226.  
  227. //=============================================================================
  228. //
  229. //  WinMain()
  230. //
  231. //
  232. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,
  233.                    LPSTR lpCmdLine,int nCmdShow)
  234. {
  235.  
  236.   MSG msg;
  237.   HWND hwnd;
  238.   HACCEL hAccel;
  239.   INITCOMMONCONTROLSEX icex;
  240.   //HMODULE hSciLexer;
  241.  
  242.   // Set global variable g_hInstance
  243.   g_hInstance = hInstance;
  244.  
  245.   // Get Flags and FileArg
  246.   ParseCommandLine(lpCmdLine);
  247.  
  248.   // Command Line Help Dialog
  249.   if (flagDisplayHelp)
  250.   {
  251.     DisplayCmdLineHelp();
  252.     return(0);
  253.   }
  254.  
  255.   // Unregister Dialog
  256.   if (flagUnregProgram)
  257.   {
  258.     UnregisterApp(hInstance);
  259.     return(0);
  260.   }
  261.  
  262.   // Try to activate another window
  263.   if (ActivatePrevInst())
  264.     return(0);
  265.  
  266.   // Init OLE and Common Controls
  267.   OleInitialize(NULL);
  268.   SHGetMalloc(&g_lpMalloc);
  269.  
  270.   icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
  271.   icex.dwICC  = ICC_WIN95_CLASSES|ICC_COOL_CLASSES|ICC_BAR_CLASSES|ICC_USEREX_CLASSES;
  272.   InitCommonControlsEx(&icex);
  273.  
  274.   // Load SciLexer.dll
  275.   //SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);
  276.   //hSciLexer = LoadLibrary("SciLexer");
  277.   //if (!hSciLexer) {
  278.   //  MsgBox(MBWARN,IDS_ERR_NOSCILEXER);
  279.   //  return(0); }
  280.  
  281.   // Error mode set to SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX
  282.   // from here throughout the whole program
  283.   SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);
  284.  
  285.   Scintilla_RegisterClasses(hInstance);
  286.  
  287.   // Load Settings
  288.   LoadSettings();
  289.  
  290.   if (!InitApplication(hInstance))
  291.     return FALSE;
  292.  
  293.   if (!(hwnd = InitInstance(hInstance,lpCmdLine,nCmdShow)))
  294.     return FALSE;
  295.  
  296.   hAccel = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_MAINWND));
  297.  
  298.   while (GetMessage(&msg,NULL,0,0))
  299.   {
  300.     if (!TranslateAccelerator(hwnd,hAccel,&msg))
  301.     {
  302.       TranslateMessage(&msg);
  303.       DispatchMessage(&msg);
  304.     }
  305.   }
  306.  
  307.   // Save Settings is done elsewhere
  308.  
  309.   Scintilla_ReleaseResources();
  310.   //FreeLibrary(hSciLexer);
  311.   g_lpMalloc->lpVtbl->Release(g_lpMalloc);
  312.   OleUninitialize();
  313.  
  314.   return(msg.wParam);
  315.  
  316.   hPrevInst;
  317.  
  318. }
  319.  
  320.  
  321. //=============================================================================
  322. //
  323. //  InitApplication()
  324. //
  325. //
  326. BOOL InitApplication(HINSTANCE hInstance)
  327. {
  328.  
  329.   WNDCLASS   wc;
  330.  
  331.   wc.style         = CS_BYTEALIGNWINDOW | CS_DBLCLKS;
  332.   wc.lpfnWndProc   = (WNDPROC)MainWndProc;
  333.   wc.cbClsExtra    = 0;
  334.   wc.cbWndExtra    = 0;
  335.   wc.hInstance     = hInstance;
  336.   wc.hIcon         = LoadIcon(hInstance,MAKEINTRESOURCE(IDR_MAINWND));
  337.   wc.hCursor       = LoadCursor(NULL,IDC_ARROW);
  338.   wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
  339.   wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MAINWND);
  340.   wc.lpszClassName = (!flagPasteBoard) ? WC_NOTEPAD2 : WC_NOTEPAD2PASTEBOARD;
  341.  
  342.   return RegisterClass(&wc);
  343.  
  344. }
  345.  
  346.  
  347. //=============================================================================
  348. //
  349. //  InitInstance()
  350. //
  351. //
  352. HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow)
  353. {
  354.  
  355.   RECT rcWorkArea;
  356.  
  357.   // Transform window rect from workarea to screen
  358.   SystemParametersInfo(SPI_GETWORKAREA,0,&rcWorkArea,0);
  359.   if (wi.x != CW_USEDEFAULT) wi.x += rcWorkArea.left;
  360.   if (wi.y != CW_USEDEFAULT) wi.y += rcWorkArea.top;
  361.  
  362.   hwndMain = CreateWindowEx(
  363.                0,
  364.                (!flagPasteBoard) ? WC_NOTEPAD2 : WC_NOTEPAD2PASTEBOARD,
  365.                "Notepad2",
  366.                WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  367.                wi.x,
  368.                wi.y,
  369.                wi.cx,
  370.                wi.cy,
  371.                NULL,
  372.                NULL,
  373.                hInstance,
  374.                NULL);
  375.  
  376.   if (wi.max)
  377.     nCmdShow = SW_SHOWMAXIMIZED;
  378.  
  379.   if (bAlwaysOnTop)
  380.     SetWindowPos(hwndMain,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  381.  
  382.   if (bTransparentMode)
  383.     SetWindowTransparentMode(hwndMain,TRUE);
  384.  
  385.   // Current file information -- moved in front of ShowWindow()
  386.   FileLoad(TRUE,TRUE,FALSE,FALSE,"");
  387.  
  388.   if (!flagStartAsTrayIcon) {
  389.     ShowWindow(hwndMain,nCmdShow);
  390.     UpdateWindow(hwndMain); }
  391.   else {
  392.     ShowWindow(hwndMain,SW_HIDE);    // trick ShowWindow()
  393.     ShowNotifyIcon(hwndMain,TRUE); }
  394.  
  395.   // Pathname parameter
  396.   if (lpFileArg /*&& !flagNewFromClipboard*/)
  397.   {
  398.     // Open from Directory
  399.     if (PathIsDirectory(lpFileArg))
  400.     {
  401.       char tchFile[MAX_PATH];
  402.       if (OpenFileDlg(hwndMain,tchFile,COUNTOF(tchFile),lpFileArg))
  403.         FileLoad(FALSE,FALSE,FALSE,FALSE,tchFile);
  404.     } else {
  405.       if (FileLoad(FALSE,FALSE,FALSE,FALSE,lpFileArg)) {
  406.         if (flagJumpTo) // Jump to position
  407.           EditJumpTo(hwndEdit,iInitialLine,iInitialColumn); } }
  408.     GlobalFree(lpFileArg);
  409.   }
  410.  
  411.   // Check for /c [if no file is specified] -- even if a file is specified
  412.   /*else */if (flagNewFromClipboard) {
  413.     if (SendMessage(hwndEdit,SCI_CANPASTE,0,0)) {
  414.       BOOL bAutoIndent2 = bAutoIndent;
  415.       bAutoIndent = 0;
  416.       EditJumpTo(hwndEdit,-1,0);
  417.       if (SendMessage(hwndEdit,SCI_GETLENGTH,0,0) > 0)
  418.         SendMessage(hwndEdit,SCI_NEWLINE,0,0);
  419.       SendMessage(hwndEdit,SCI_PASTE,0,0);
  420.       SendMessage(hwndEdit,SCI_NEWLINE,0,0);
  421.       bAutoIndent = bAutoIndent2; } }
  422.  
  423.   // Check for Paste Board option -- after loading files
  424.   if (flagPasteBoard) {
  425.     bLastCopyFromMe = TRUE;
  426.     hwndNextCBChain = SetClipboardViewer(hwndMain);
  427.     uidsAppTitle = IDS_APPTITLE_PASTEBOARD;
  428.     SetWindowTitle(hwndMain,uidsAppTitle,IDS_UNTITLED,szCurFile,
  429.       bShortPathNames,bModified || iCodePage != iInitialCP,
  430.       IDS_READONLY,bReadOnly);
  431.     bLastCopyFromMe = FALSE;
  432.   }
  433.  
  434.   // If start as tray icon, set current filename as tooltip
  435.   if (flagStartAsTrayIcon)
  436.     SetNotifyIconTitle(hwndMain);
  437.  
  438.   // Toolbar
  439.   UpdateToolbar();
  440.  
  441.   // Statusbar
  442.   UpdateStatusbar();
  443.  
  444.   return(hwndMain);
  445.  
  446. }
  447.  
  448.  
  449. //=============================================================================
  450. //
  451. //  MainWndProc()
  452. //
  453. //  Messages are distributed to the MsgXXX-handlers
  454. //
  455. //
  456. LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
  457. {
  458.   static BOOL bHideIcon = FALSE;
  459.  
  460.   switch(umsg)
  461.   {
  462.  
  463.     // Quickly handle painting and sizing messages, found in ScintillaWin.cxx
  464.     // Cool idea, don't know if this has any effect... ;-)
  465.     case WM_MOVE:
  466.     case WM_MOUSEACTIVATE:
  467.     case WM_NCHITTEST:
  468.     case WM_NCCALCSIZE:
  469.     case WM_NCPAINT:
  470.     case WM_PAINT:
  471.     case WM_ERASEBKGND:
  472.     case WM_NCMOUSEMOVE:
  473.     case WM_NCLBUTTONDOWN:
  474.     case WM_WINDOWPOSCHANGING:
  475.     case WM_WINDOWPOSCHANGED:
  476.       return DefWindowProc(hwnd,umsg,wParam,lParam);
  477.  
  478.     case WM_CREATE:
  479.       return MsgCreate(hwnd,wParam,lParam);
  480.  
  481.  
  482.     case WM_DESTROY:
  483.       {
  484.         WINDOWPLACEMENT wndpl;
  485.  
  486.         // Terminate file watching
  487.         //InstallFileWatching(NULL);
  488.  
  489.         // GetWindowPlacement
  490.         wndpl.length = sizeof(WINDOWPLACEMENT);
  491.         GetWindowPlacement(hwnd,&wndpl);
  492.  
  493.         wi.x = wndpl.rcNormalPosition.left;
  494.         wi.y = wndpl.rcNormalPosition.top;
  495.         wi.cx = wndpl.rcNormalPosition.right - wndpl.rcNormalPosition.left;
  496.         wi.cy = wndpl.rcNormalPosition.bottom - wndpl.rcNormalPosition.top;
  497.         wi.max = (IsZoomed(hwnd) || (wndpl.flags & WPF_RESTORETOMAXIMIZED));
  498.  
  499.         DragAcceptFiles(hwnd,FALSE);
  500.  
  501.         // Restore clipboard chain...
  502.         if (flagPasteBoard)
  503.           ChangeClipboardChain(hwnd,hwndNextCBChain);
  504.  
  505.         // Cleanup unwanted MRU's
  506.         FreeMRUList(hFileMRU);
  507.         if (!bSaveRecentFiles)
  508.         {
  509.           BOOL bError;
  510.           RegDeleteKeyEx(HKEY_CURRENT_USER,"Software\\Notepad2\\Recent Files",&bError);
  511.         }
  512.  
  513.         if (!bSaveFindReplace)
  514.         {
  515.           BOOL bError;
  516.           RegDeleteKeyEx(HKEY_CURRENT_USER,"Software\\Notepad2\\Recent Find",&bError);
  517.           RegDeleteKeyEx(HKEY_CURRENT_USER,"Software\\Notepad2\\Recent Replace",&bError);
  518.         }
  519.  
  520.         // call SaveSettings() when hwndToolbar is still valid
  521.         SaveSettings(FALSE);
  522.  
  523.         // Remove tray icon if necessary
  524.         ShowNotifyIcon(hwnd,FALSE);
  525.  
  526.         PostQuitMessage(0);
  527.       }
  528.       break;
  529.  
  530.  
  531.     case WM_CLOSE:
  532.       if (FileSave(FALSE,TRUE,FALSE,FALSE))
  533.         DestroyWindow(hwnd);
  534.       break;
  535.  
  536.  
  537.     case WM_QUERYENDSESSION:
  538.       if (FileSave(FALSE,TRUE,FALSE,FALSE))
  539.         return TRUE;
  540.       else
  541.         return FALSE;
  542.  
  543.  
  544.     // Reinitialize theme-dependent values and resize windows
  545.     case 0x031A /*WM_THEMECHANGED*/:
  546.       MsgThemeChanged(hwnd,wParam,lParam);
  547.       break;
  548.  
  549.  
  550.     // update Scintilla colors
  551.     case WM_SYSCOLORCHANGE:
  552.       {
  553.         extern PEDITLEXER pLexCurrent;
  554.         Style_SetLexer(hwndEdit,pLexCurrent);
  555.         return DefWindowProc(hwnd,umsg,wParam,lParam);
  556.       }
  557.  
  558.  
  559.     //case WM_TIMER:
  560.     //  break;
  561.  
  562.  
  563.     case WM_SIZE:
  564.       MsgSize(hwnd,wParam,lParam);
  565.       break;
  566.  
  567.  
  568.     case WM_SETFOCUS:
  569.       SetFocus(hwndEdit);
  570.  
  571.       //if (bPendingChangeNotify)
  572.       //  PostMessage(hwnd,WM_CHANGENOTIFY,0,0);
  573.       break;
  574.  
  575.  
  576.     case WM_DROPFILES:
  577.       {
  578.         char szBuf[MAX_PATH+40];
  579.         HDROP hDrop = (HDROP)wParam;
  580.  
  581.         // Reset Change Notify
  582.         //bPendingChangeNotify = FALSE;
  583.  
  584.         if (IsIconic(hwnd))
  585.           ShowWindow(hwnd,SW_RESTORE);
  586.  
  587.         //SetForegroundWindow(hwnd);
  588.  
  589.         DragQueryFile(hDrop,0,szBuf,COUNTOF(szBuf));
  590.         FileLoad(FALSE,FALSE,FALSE,FALSE,szBuf);
  591.  
  592.         if (DragQueryFile(hDrop,(UINT)(-1),NULL,0) > 1)
  593.           MsgBox(MBINFO,IDS_ERR_DROP);
  594.  
  595.         DragFinish(hDrop);
  596.       }
  597.       break;
  598.  
  599.  
  600.     case WM_COPYDATA:
  601.       {
  602.         PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam;
  603.  
  604.         // Reset Change Notify
  605.         //bPendingChangeNotify = FALSE;
  606.  
  607.         if (pcds->dwData == DATA_NOTEPAD2_FILEARG)
  608.         {
  609.           LPSTR lpsz = LocalAlloc(LPTR,pcds->cbData);
  610.           CopyMemory(lpsz,pcds->lpData,pcds->cbData);
  611.           FileLoad(FALSE,FALSE,FALSE,FALSE,lpsz);
  612.           LocalFree(lpsz);
  613.         }
  614.       }
  615.       return TRUE;
  616.  
  617.  
  618.     case WM_CONTEXTMENU:
  619.     {
  620.       HMENU hmenu;
  621.       int imenu = 0;
  622.       POINT pt;
  623.       int nID = GetDlgCtrlID((HWND)wParam);
  624.  
  625.       if ((nID != IDC_EDIT) && (nID != IDC_STATUSBAR) &&
  626.           (nID != IDC_REBAR) && (nID != IDC_TOOLBAR))
  627.         return DefWindowProc(hwnd,umsg,wParam,lParam);
  628.  
  629.       hmenu = LoadMenu(g_hInstance,MAKEINTRESOURCE(IDR_POPUPMENU));
  630.       //SetMenuDefaultItem(GetSubMenu(hmenu,1),0,FALSE);
  631.  
  632.       pt.x = (int)(short)LOWORD(lParam);
  633.       pt.y = (int)(short)HIWORD(lParam);
  634.  
  635.       switch(nID)
  636.       {
  637.         case IDC_EDIT:
  638.           {
  639.             int iSelStart = SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
  640.             int iSelEnd   = SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0);
  641.  
  642.             if (iSelStart == iSelEnd && pt.x != -1 && pt.y != -1)
  643.             {
  644.               int iNewPos;
  645.               POINT ptc = { pt.x, pt.y };
  646.               ScreenToClient(hwndEdit,&ptc);
  647.               iNewPos = SendMessage(hwndEdit,SCI_POSITIONFROMPOINT,(WPARAM)ptc.x,(LPARAM)ptc.y);
  648.               SendMessage(hwndEdit,SCI_GOTOPOS,(WPARAM)iNewPos,0);
  649.             }
  650.  
  651.             if (pt.x == -1 && pt.y == -1)
  652.             {
  653.               int iCurrentPos = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  654.               pt.x = SendMessage(hwndEdit,SCI_POINTXFROMPOSITION,0,(LPARAM)iCurrentPos);
  655.               pt.y = SendMessage(hwndEdit,SCI_POINTYFROMPOSITION,0,(LPARAM)iCurrentPos);
  656.               ClientToScreen(hwndEdit,&pt);
  657.             }
  658.             imenu = 0;
  659.           }
  660.           break;
  661.  
  662.         case IDC_TOOLBAR:
  663.         case IDC_STATUSBAR:
  664.         case IDC_REBAR:
  665.           if (pt.x == -1 && pt.y == -1)
  666.             GetCursorPos(&pt);
  667.           imenu = 1;
  668.           break;
  669.       }
  670.  
  671.       TrackPopupMenuEx(GetSubMenu(hmenu,imenu),
  672.         TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y,hwnd,NULL);
  673.  
  674.       DestroyMenu(hmenu);
  675.     }
  676.     break;
  677.  
  678.  
  679.     case WM_INITMENU:
  680.       MsgInitMenu(hwnd,wParam,lParam);
  681.       break;
  682.  
  683.  
  684.     case WM_NOTIFY:
  685.       return MsgNotify(hwnd,wParam,lParam);
  686.  
  687.  
  688.     case WM_COMMAND:
  689.       return MsgCommand(hwnd,wParam,lParam);
  690.  
  691.  
  692.     case WM_SYSCOMMAND:
  693.       switch (wParam)
  694.       {
  695.         case SC_MINIMIZE:
  696.           ShowOwnedPopups(hwnd,FALSE);
  697.           if (bMinimizeToTray) {
  698.             MinimizeWndToTray(hwnd);
  699.             ShowNotifyIcon(hwnd,TRUE);
  700.             SetNotifyIconTitle(hwnd);
  701.             return(0); }
  702.           else
  703.             return DefWindowProc(hwnd,umsg,wParam,lParam);
  704.  
  705.         case SC_RESTORE: {
  706.           LRESULT lrv = DefWindowProc(hwnd,umsg,wParam,lParam);
  707.           ShowOwnedPopups(hwnd,TRUE);
  708.           return(lrv); }
  709.       }
  710.       return DefWindowProc(hwnd,umsg,wParam,lParam);
  711.  
  712.  
  713.     //case WM_CHANGENOTIFY:
  714.     //  {
  715.     //    if (bPendingChangeNotify && (GetForegroundWindow() == hwnd || GetActiveWindow() == hwnd))
  716.     //    {
  717.     //      bPendingChangeNotify = FALSE;
  718.     //      if (MsgBox(MBYESNO,IDS_ASK_ENCODING) == IDYES)
  719.     //      {
  720.     //        FileLoad(TRUE,FALSE,TRUE,FALSE,szCurFile);
  721.     //      }
  722.     //      InstallFileWatching(szCurFile);
  723.     //    }
  724.     //  }
  725.     //  break;
  726.  
  727.  
  728.     //// This message is posted before Notepad2 reactivates itself
  729.     //case WM_CHANGENOTIFYCLEAR:
  730.     //  bPendingChangeNotify = FALSE;
  731.     //  break;
  732.  
  733.  
  734.     case WM_DRAWCLIPBOARD:
  735.       if (!bLastCopyFromMe) {
  736.         if (SendMessage(hwndEdit,SCI_CANPASTE,0,0)) {
  737.           BOOL bAutoIndent2 = bAutoIndent;
  738.           bAutoIndent = 0;
  739.           EditJumpTo(hwndEdit,-1,0);
  740.           if (SendMessage(hwndEdit,SCI_GETLENGTH,0,0) > 0)
  741.             SendMessage(hwndEdit,SCI_NEWLINE,0,0);
  742.           SendMessage(hwndEdit,SCI_PASTE,0,0);
  743.           SendMessage(hwndEdit,SCI_NEWLINE,0,0);
  744.           bAutoIndent = bAutoIndent2; }
  745.         }
  746.       else
  747.         bLastCopyFromMe = FALSE;
  748.       if (hwndNextCBChain)
  749.         SendMessage(hwndNextCBChain,WM_DRAWCLIPBOARD,wParam,lParam);
  750.       break;
  751.  
  752.  
  753.     case WM_CHANGECBCHAIN:
  754.       if ((HWND)wParam == hwndNextCBChain)
  755.         hwndNextCBChain = (HWND)lParam;
  756.       if (hwndNextCBChain)
  757.         SendMessage(hwndNextCBChain,WM_CHANGECBCHAIN,lParam,wParam);
  758.       break;
  759.  
  760.  
  761.     case WM_TRAYMESSAGE:
  762.       switch(lParam)
  763.       {
  764.         case WM_RBUTTONUP: {
  765.  
  766.           HMENU hMenu = LoadMenu(g_hInstance,MAKEINTRESOURCE(IDR_POPUPMENU));
  767.           HMENU hMenuPopup = GetSubMenu(hMenu,2);
  768.  
  769.           POINT pt;
  770.           int iCmd;
  771.  
  772.           SetForegroundWindow(hwnd);
  773.  
  774.           GetCursorPos(&pt);
  775.           SetMenuDefaultItem(hMenuPopup,IDM_TRAY_RESTORE,FALSE);
  776.           iCmd = TrackPopupMenu(hMenuPopup,
  777.                    TPM_NONOTIFY|TPM_RETURNCMD|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
  778.                    pt.x,pt.y,0,hwnd,NULL);
  779.  
  780.           PostMessage(hwnd,WM_NULL,0,0);
  781.  
  782.           DestroyMenu(hMenu);
  783.  
  784.           if (iCmd == IDM_TRAY_RESTORE) {
  785.             RestoreWndFromTray(hwnd);
  786.             ShowOwnedPopups(hwnd,TRUE);
  787.             ShowNotifyIcon(hwnd,FALSE);
  788.             bHideIcon = FALSE; }
  789.  
  790.           else if (iCmd == IDM_TRAY_EXIT) {
  791.               //ShowNotifyIcon(hwnd,FALSE);
  792.               SendMessage(hwnd,WM_CLOSE,0,0); } }
  793.  
  794.           return TRUE;
  795.  
  796.         case WM_LBUTTONDBLCLK:
  797.           RestoreWndFromTray(hwnd);
  798.           ShowOwnedPopups(hwnd,TRUE);
  799.           bHideIcon = TRUE;
  800.           return TRUE;
  801.  
  802.         case WM_LBUTTONUP:
  803.           if(bHideIcon) {
  804.             ShowNotifyIcon(hwnd,FALSE);
  805.             bHideIcon = FALSE; }
  806.             return TRUE;
  807.       }
  808.       break;
  809.  
  810.  
  811.     default:
  812.       return DefWindowProc(hwnd,umsg,wParam,lParam);
  813.  
  814.   }
  815.  
  816.   return(0);
  817.  
  818. }
  819.  
  820.  
  821. //=============================================================================
  822. //
  823. //  MsgCreate() - Handles WM_CREATE
  824. //
  825. //
  826. LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam)
  827. {
  828.  
  829.   RECT rc;
  830.   RECT rc2;
  831.  
  832.   TBSAVEPARAMS tbsp = { HKEY_CURRENT_USER, "Software\\Notepad2\\Toolbar", "Settings" };
  833.   CREATEMRULIST cl = { sizeof(CREATEMRULIST), 16, 2, HKEY_CURRENT_USER,
  834.                        "Software\\Notepad2\\Recent Files", NULL };
  835.  
  836.   HINSTANCE hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
  837.  
  838.   // Setup edit control
  839.   hwndEdit = EditCreate(hwnd);
  840.  
  841.   // Word wrap
  842.   SendMessage(hwndEdit,SCI_SETWRAPMODE,(fWordWrap)?SC_WRAP_WORD:SC_WRAP_NONE,0);
  843.   SendMessage(hwndEdit,SCI_SETWRAPSTARTINDENT,iWordWrapIndent,0);
  844.   if (bShowWordWrapSymbols) {
  845.     SendMessage(hwndEdit,SCI_SETWRAPVISUALFLAGSLOCATION,WrapSymbols[iWordWrapSymbols].location,0);
  846.     SendMessage(hwndEdit,SCI_SETWRAPVISUALFLAGS,WrapSymbols[iWordWrapSymbols].flags,0); }
  847.   else {
  848.     SendMessage(hwndEdit,SCI_SETWRAPVISUALFLAGS,0,0); }
  849.  
  850.   // Indent Guides
  851.   SendMessage(hwndEdit,SCI_SETINDENTATIONGUIDES,bShowIndentGuides,0);
  852.  
  853.   // Tabs
  854.   SendMessage(hwndEdit,SCI_SETUSETABS,!bTabsAsSpaces,0);
  855.   SendMessage(hwndEdit,SCI_SETTABWIDTH,iTabWidth,0);
  856.   SendMessage(hwndEdit,SCI_SETINDENT,0,0);
  857.  
  858.   // Long Lines
  859.   if (bMarkLongLines)
  860.     SendMessage(hwndEdit,SCI_SETEDGEMODE,(iLongLineMode == EDGE_LINE)?EDGE_LINE:EDGE_BACKGROUND,0);
  861.   else
  862.     SendMessage(hwndEdit,SCI_SETEDGEMODE,EDGE_NONE,0);
  863.   SendMessage(hwndEdit,SCI_SETEDGECOLUMN,iLongLinesLimit,0);
  864.  
  865.   // Margins
  866.   SendMessage(hwndEdit,SCI_SETMARGINWIDTHN,2,0);
  867.   SendMessage(hwndEdit,SCI_SETMARGINWIDTHN,1,(bShowSelectionMargin)?16:0);
  868.   UpdateLineNumberWidth();
  869.   //SendMessage(hwndEdit,SCI_SETMARGINWIDTHN,0,
  870.   //  (bShowLineNumbers)?SendMessage(hwndEdit,SCI_TEXTWIDTH,STYLE_LINENUMBER,(LPARAM)"_999999_"):0);
  871.  
  872.   // Nonprinting characters
  873.   SendMessage(hwndEdit,SCI_SETVIEWWS,(bViewWhiteSpace)?SCWS_VISIBLEALWAYS:SCWS_INVISIBLE,0);
  874.   SendMessage(hwndEdit,SCI_SETVIEWEOL,bViewEOLs,0);
  875.  
  876.   hwndEditFrame = CreateWindowEx(
  877.                     WS_EX_CLIENTEDGE,
  878.                     WC_LISTVIEW,
  879.                     NULL,
  880.                     WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,
  881.                     0,0,100,100,
  882.                     hwnd,
  883.                     (HMENU)IDC_EDITFRAME,
  884.                     hInstance,
  885.                     NULL);
  886.  
  887.   if (PrivateIsAppThemed()) {
  888.  
  889.     SetWindowLong(hwndEdit,GWL_EXSTYLE,GetWindowLong(hwndEdit,GWL_EXSTYLE) & ~WS_EX_CLIENTEDGE);
  890.     SetWindowPos(hwndEdit,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
  891.  
  892.     GetClientRect(hwndEditFrame,&rc);
  893.     GetWindowRect(hwndEditFrame,&rc2);
  894.  
  895.     cxEditFrame = ((rc2.right-rc2.left) - (rc.right-rc.left)) / 2;
  896.     cyEditFrame = ((rc2.bottom-rc2.top) - (rc.bottom-rc.top)) / 2; }
  897.  
  898.   else {
  899.  
  900.     cxEditFrame = 0;
  901.     cyEditFrame = 0; }
  902.  
  903.   // Create Toolbar and Statusbar
  904.   CreateBars(hwnd,hInstance,&tbsp);
  905.  
  906.   // Window Initialization
  907.  
  908.   // Menu
  909.   //SetMenuDefaultItem(GetSubMenu(GetMenu(hwnd),0),0);
  910.  
  911.   // Drag & Drop
  912.   DragAcceptFiles(hwnd,TRUE);
  913.  
  914.   // File MRU
  915.   hFileMRU = CreateMRUList(&cl);
  916.  
  917.   return(0);
  918.  
  919. }
  920.  
  921.  
  922. //=============================================================================
  923. //
  924. //  CreateBars() - Create Toolbar and Statusbar
  925. //
  926. //
  927. void CreateBars(HWND hwnd,HINSTANCE hInstance,LPTBSAVEPARAMS lptbsp)
  928. {
  929.   RECT rc;
  930.  
  931.   REBARINFO rbi;
  932.   REBARBANDINFO rbBand;
  933.  
  934.   BITMAP bmp;
  935.   HBITMAP hbmp;
  936.   HIMAGELIST himl;
  937.   char szTmp[MAX_PATH];
  938.   COLORMAP tbColorMap = { RGB(192,192,192), RGB(212,208,200) };
  939.  
  940.   DWORD dwToolbarStyle = WS_TOOLBAR;
  941.   DWORD dwStatusbarStyle = WS_CHILD | WS_CLIPSIBLINGS;
  942.   DWORD dwReBarStyle = WS_REBAR;
  943.  
  944.   BOOL bIsAppThemed = PrivateIsAppThemed();
  945.  
  946.   HKEY hKey;
  947.   int i;
  948.   char tchDesc[256];
  949.   char tchIndex[256];
  950.  
  951.   if (bShowToolbar)
  952.     dwReBarStyle |= WS_VISIBLE;
  953.  
  954.   hwndToolbar = CreateWindowEx(0,TOOLBARCLASSNAME,NULL,dwToolbarStyle,
  955.                                0,0,0,0,hwnd,(HMENU)IDC_TOOLBAR,hInstance,NULL);
  956.  
  957.   SendMessage(hwndToolbar,TB_BUTTONSTRUCTSIZE,(WPARAM)sizeof(TBBUTTON),0);
  958.  
  959.   // Add normal Toolbar Bitmap
  960.   hbmp = NULL;
  961.   if (lstrlen(tchToolbarBitmap))
  962.   {
  963.     if (!SearchPath(NULL,tchToolbarBitmap,NULL,COUNTOF(szTmp),szTmp,NULL))
  964.       lstrcpy(szTmp,tchToolbarBitmap);
  965.     hbmp = LoadImage(NULL,szTmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
  966.   }
  967.   if (!hbmp)
  968.     //hbmp = CreateMappedBitmap(hInstance,(IDR_MAINWND),0,&tbColorMap,1);
  969.     hbmp = LoadBitmap(hInstance,MAKEINTRESOURCE(IDR_MAINWND));
  970.   GetObject(hbmp,sizeof(BITMAP),&bmp);
  971.   himl = ImageList_Create(bmp.bmWidth/NUMTOOLBITMAPS,bmp.bmHeight,ILC_COLORDDB|ILC_MASK,0,0);
  972.   ImageList_AddMasked(himl,hbmp,RGB(255,0,255));
  973.   DeleteObject(hbmp);
  974.   SendMessage(hwndToolbar,TB_SETIMAGELIST,0,(LPARAM)himl);
  975.  
  976.   // Optionally add hot Toolbar Bitmap
  977.   hbmp = NULL;
  978.   if (lstrlen(tchToolbarBitmapHot))
  979.   {
  980.     if (!SearchPath(NULL,tchToolbarBitmapHot,NULL,COUNTOF(szTmp),szTmp,NULL))
  981.       lstrcpy(szTmp,tchToolbarBitmapHot);
  982.     if (hbmp = LoadImage(NULL,szTmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE))
  983.     {
  984.       GetObject(hbmp,sizeof(BITMAP),&bmp);
  985.       himl = ImageList_Create(bmp.bmWidth/NUMTOOLBITMAPS,bmp.bmHeight,ILC_COLORDDB|ILC_MASK,0,0);
  986.       ImageList_AddMasked(himl,hbmp,RGB(255,0,255));
  987.       DeleteObject(hbmp);
  988.       SendMessage(hwndToolbar,TB_SETHOTIMAGELIST,0,(LPARAM)himl);
  989.     }
  990.   }
  991.  
  992.   // Add disabled Toolbar Bitmap
  993.   hbmp = NULL;
  994.   if (lstrlen(tchToolbarBitmapDisabled))
  995.   {
  996.     if (!SearchPath(NULL,tchToolbarBitmapDisabled,NULL,COUNTOF(szTmp),szTmp,NULL))
  997.       lstrcpy(szTmp,tchToolbarBitmapDisabled);
  998.     hbmp = LoadImage(NULL,szTmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
  999.   }
  1000.   if (!hbmp)
  1001.     //hbmp = CreateMappedBitmap(hInstance,(IDB_DISABLEDTOOLS),0,&tbColorMap,1);
  1002.     hbmp = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_DISABLEDTOOLS));
  1003.   GetObject(hbmp,sizeof(BITMAP),&bmp);
  1004.   himl = ImageList_Create(bmp.bmWidth/NUMTOOLBITMAPS,bmp.bmHeight,ILC_COLORDDB|ILC_MASK,0,0);
  1005.   ImageList_AddMasked(himl,hbmp,RGB(255,0,255));
  1006.   DeleteObject(hbmp);
  1007.   SendMessage(hwndToolbar,TB_SETDISABLEDIMAGELIST,0,(LPARAM)himl);
  1008.  
  1009.   // Load toolbar strings
  1010.   hKey = RegGetAppKey("Toolbar Strings");
  1011.   for (i = 0; i < COUNTOF(tbbMainWnd); i++) {
  1012.  
  1013.     if (tbbMainWnd[i].fsStyle == TBSTYLE_SEP)
  1014.       continue;
  1015.  
  1016.     wsprintf(tchIndex,"%02i",i+1);
  1017.  
  1018.     if (RegGetString(hKey,tchIndex,"",tchDesc,COUNTOF(tchDesc))) {
  1019.       tbbMainWnd[i].iString = SendMessage(hwndToolbar,TB_ADDSTRING,0,(LPARAM)tchDesc);
  1020.       tbbMainWnd[i].fsStyle |= BTNS_AUTOSIZE | BTNS_SHOWTEXT; }
  1021.  
  1022.     else
  1023.       tbbMainWnd[i].fsStyle &= ~(BTNS_AUTOSIZE | BTNS_SHOWTEXT);
  1024.   }
  1025.   RegCloseKey(hKey);
  1026.  
  1027.   SendMessage(hwndToolbar,TB_SETEXTENDEDSTYLE,0,
  1028.     SendMessage(hwndToolbar,TB_GETEXTENDEDSTYLE,0,0) | TBSTYLE_EX_MIXEDBUTTONS);
  1029.  
  1030.   SendMessage(hwndToolbar,TB_ADDBUTTONS,NUMINITIALTOOLS,(LPARAM)tbbMainWnd);
  1031.   SendMessage(hwndToolbar,TB_SAVERESTORE,FALSE,(LPARAM)lptbsp);
  1032.   SendMessage(hwndToolbar,TB_GETITEMRECT,0,(LPARAM)&rc);
  1033.   //SendMessage(hwndToolbar,TB_SETINDENT,2,0);
  1034.  
  1035.   if (bShowStatusbar)
  1036.     dwStatusbarStyle |= WS_VISIBLE;
  1037.  
  1038.   hwndStatus = CreateStatusWindow(dwStatusbarStyle,NULL,hwnd,IDC_STATUSBAR);
  1039.  
  1040.   // Create ReBar and add Toolbar
  1041.   hwndReBar = CreateWindowEx(WS_EX_TOOLWINDOW,REBARCLASSNAME,NULL,dwReBarStyle,
  1042.                              0,0,0,0,hwnd,(HMENU)IDC_REBAR,hInstance,NULL);
  1043.  
  1044.   rbi.cbSize = sizeof(REBARINFO);
  1045.   rbi.fMask  = 0;
  1046.   rbi.himl   = (HIMAGELIST)NULL;
  1047.   SendMessage(hwndReBar,RB_SETBARINFO,0,(LPARAM)&rbi);
  1048.  
  1049.   rbBand.cbSize  = sizeof(REBARBANDINFO);
  1050.   rbBand.fMask   = /*RBBIM_COLORS | RBBIM_TEXT | RBBIM_BACKGROUND | */
  1051.                    RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE /*| RBBIM_SIZE*/;
  1052.   rbBand.fStyle  = /*RBBS_CHILDEDGE |*//* RBBS_BREAK |*/ RBBS_FIXEDSIZE /*| RBBS_GRIPPERALWAYS*/;
  1053.   if (bIsAppThemed)
  1054.     rbBand.fStyle |= RBBS_CHILDEDGE;
  1055.   rbBand.hbmBack = NULL;
  1056.   rbBand.lpText     = "Toolbar";
  1057.   rbBand.hwndChild  = hwndToolbar;
  1058.   rbBand.cxMinChild = (rc.right - rc.left) * COUNTOF(tbbMainWnd);
  1059.   rbBand.cyMinChild = (rc.bottom - rc.top) + 2 * rc.top;
  1060.   rbBand.cx         = 0;
  1061.   SendMessage(hwndReBar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand);
  1062.  
  1063.   SetWindowPos(hwndReBar,NULL,0,0,0,0,SWP_NOZORDER);
  1064.   GetWindowRect(hwndReBar,&rc);
  1065.   cyReBar = rc.bottom - rc.top;
  1066.  
  1067.   cyReBarFrame = bIsAppThemed ? 0 : 2;
  1068. }
  1069.  
  1070.  
  1071. //=============================================================================
  1072. //
  1073. //  MsgThemeChanged() - Handle WM_THEMECHANGED
  1074. //
  1075. //
  1076. void MsgThemeChanged(HWND hwnd,WPARAM wParam,LPARAM lParam)
  1077. {
  1078.   RECT rc,rc2;
  1079.   TBSAVEPARAMS tbsp = { HKEY_CURRENT_USER, "Software\\Notepad2\\Toolbar", "Settings2" };
  1080.   HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
  1081.  
  1082.   // reinitialize edit frame
  1083.  
  1084.   if (PrivateIsAppThemed()) {
  1085.  
  1086.     SetWindowLong(hwndEdit,GWL_EXSTYLE,GetWindowLong(hwndEdit,GWL_EXSTYLE) & ~WS_EX_CLIENTEDGE);
  1087.     SetWindowPos(hwndEdit,NULL,0,0,0,0,SWP_NOZORDER|SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE);
  1088.  
  1089.     SetWindowPos(hwndEditFrame,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
  1090.     GetClientRect(hwndEditFrame,&rc);
  1091.     GetWindowRect(hwndEditFrame,&rc2);
  1092.  
  1093.     cxEditFrame = ((rc2.right-rc2.left) - (rc.right-rc.left)) / 2;
  1094.     cyEditFrame = ((rc2.bottom-rc2.top) - (rc.bottom-rc.top)) / 2; }
  1095.  
  1096.   else {
  1097.  
  1098.     SetWindowLong(hwndEdit,GWL_EXSTYLE,WS_EX_CLIENTEDGE|GetWindowLong(hwndEdit,GWL_EXSTYLE));
  1099.     SetWindowPos(hwndEdit,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
  1100.  
  1101.     cxEditFrame = 0;
  1102.     cyEditFrame = 0; }
  1103.  
  1104.   // recreate toolbar and statusbar
  1105.   SendMessage(hwndToolbar,TB_SAVERESTORE,TRUE,(LPARAM)&tbsp);
  1106.  
  1107.   DestroyWindow(hwndToolbar);
  1108.   DestroyWindow(hwndReBar);
  1109.   DestroyWindow(hwndStatus);
  1110.   CreateBars(hwnd,hInstance,&tbsp);
  1111.  
  1112.   GetClientRect(hwnd,&rc);
  1113.   SendMessage(hwnd,WM_SIZE,SIZE_RESTORED,MAKELONG(rc.right,rc.bottom));
  1114. }
  1115.  
  1116.  
  1117. //=============================================================================
  1118. //
  1119. //  MsgSize() - Handles WM_SIZE
  1120. //
  1121. //
  1122. void MsgSize(HWND hwnd,WPARAM wParam,LPARAM lParam)
  1123. {
  1124.  
  1125.   RECT rc;
  1126.   int x,y,cx,cy;
  1127.   HDWP hdwp;
  1128.  
  1129.   // Statusbar
  1130.   int aWidth[6];
  1131.  
  1132.   if (wParam == SIZE_MINIMIZED)
  1133.     return;
  1134.  
  1135.   x = 0;
  1136.   y = 0;
  1137.  
  1138.   cx = LOWORD(lParam);
  1139.   cy = HIWORD(lParam);
  1140.  
  1141.   if (bShowToolbar)
  1142.   {
  1143. /*  SendMessage(hwndToolbar,WM_SIZE,0,0);
  1144.     GetWindowRect(hwndToolbar,&rc);
  1145.     y = (rc.bottom - rc.top);
  1146.     cy -= (rc.bottom - rc.top);*/
  1147.  
  1148.     //SendMessage(hwndToolbar,TB_GETITEMRECT,0,(LPARAM)&rc);
  1149.     SetWindowPos(hwndReBar,NULL,0,0,LOWORD(lParam),cyReBar,SWP_NOZORDER);
  1150.     // the ReBar automatically sets the correct height
  1151.     // calling SetWindowPos() with the height of one toolbar button
  1152.     // causes the control not to temporarily use the whole client area
  1153.     // and prevents flickering
  1154.  
  1155.     //GetWindowRect(hwndReBar,&rc);
  1156.     y = cyReBar + cyReBarFrame;    // define
  1157.     cy -= cyReBar + cyReBarFrame;  // border
  1158.   }
  1159.  
  1160.   if (bShowStatusbar)
  1161.   {
  1162.     SendMessage(hwndStatus,WM_SIZE,0,0);
  1163.     GetWindowRect(hwndStatus,&rc);
  1164.     cy -= (rc.bottom - rc.top);
  1165.   }
  1166.  
  1167.   hdwp = BeginDeferWindowPos(2);
  1168.  
  1169.   DeferWindowPos(hdwp,hwndEditFrame,NULL,x,y,cx,cy,
  1170.                  SWP_NOZORDER | SWP_NOACTIVATE);
  1171.  
  1172.   DeferWindowPos(hdwp,hwndEdit,NULL,x+cxEditFrame,y+cyEditFrame,
  1173.                  cx-2*cxEditFrame,cy-2*cyEditFrame,SWP_NOZORDER | SWP_NOACTIVATE);
  1174.  
  1175.   EndDeferWindowPos(hdwp);
  1176.  
  1177.   // Statusbar width
  1178.   aWidth[0] = max(120,min(cx/3,StatusCalcPaneWidth(hwndStatus,"Ln 9'999'999 : 9'999'999   Col 9'999'999   Sel 9'999'999")));
  1179.   aWidth[1] = aWidth[0] + StatusCalcPaneWidth(hwndStatus,"9'999'999 Bytes");
  1180.   aWidth[2] = aWidth[1] + StatusCalcPaneWidth(hwndStatus,"Unicode BE BOM");
  1181.   aWidth[3] = aWidth[2] + StatusCalcPaneWidth(hwndStatus,"CR+LF");
  1182.   aWidth[4] = aWidth[3] + StatusCalcPaneWidth(hwndStatus,"OVR");
  1183.   aWidth[5] = -1;
  1184.  
  1185.   SendMessage(hwndStatus,SB_SETPARTS,COUNTOF(aWidth),(LPARAM)aWidth);
  1186.  
  1187.   //UpdateStatusbar();
  1188.  
  1189. }
  1190.  
  1191.  
  1192. //=============================================================================
  1193. //
  1194. //  MsgInitMenu() - Handles WM_INITMENU
  1195. //
  1196. //
  1197. void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam)
  1198. {
  1199.  
  1200.   int i,i2;
  1201.   HMENU hmenu = (HMENU)wParam;
  1202.  
  1203.   i = lstrlen(szCurFile);
  1204.   EnableCmd(hmenu,IDM_FILE_REVERT,i);
  1205.   EnableCmd(hmenu,IDM_FILE_LAUNCH,i);
  1206.   EnableCmd(hmenu,IDM_FILE_PROPERTIES,i);
  1207.   EnableCmd(hmenu,IDM_FILE_CREATELINK,i);
  1208.   EnableCmd(hmenu,IDM_FILE_ADDTOFAV,i);
  1209.  
  1210.   EnableCmd(hmenu,IDM_FILE_READONLY,i);
  1211.   CheckCmd(hmenu,IDM_FILE_READONLY,bReadOnly);
  1212.  
  1213.   //EnableCmd(hmenu,IDM_ENCODING_UNICODEREV,!bReadOnly);
  1214.   //EnableCmd(hmenu,IDM_ENCODING_UNICODE,!bReadOnly);
  1215.   //EnableCmd(hmenu,IDM_ENCODING_UTF8SIGN,!bReadOnly);
  1216.   //EnableCmd(hmenu,IDM_ENCODING_UTF8,!bReadOnly);
  1217.   //EnableCmd(hmenu,IDM_ENCODING_ANSI,!bReadOnly);
  1218.   //EnableCmd(hmenu,IDM_LINEENDINGS_CRLF,!bReadOnly);
  1219.   //EnableCmd(hmenu,IDM_LINEENDINGS_LF,!bReadOnly);
  1220.   //EnableCmd(hmenu,IDM_LINEENDINGS_CR,!bReadOnly);
  1221.  
  1222.   if (iCodePage & NCP_UNICODE_REVERSE)
  1223.     i = IDM_ENCODING_UNICODEREV;
  1224.   else if (iCodePage & NCP_UNICODE)
  1225.     i = IDM_ENCODING_UNICODE;
  1226.   else if (iCodePage & NCP_UTF8_SIGN)
  1227.     i = IDM_ENCODING_UTF8SIGN;
  1228.   else if (iCodePage & NCP_UTF8)
  1229.     i = IDM_ENCODING_UTF8;
  1230.   else
  1231.     i = IDM_ENCODING_ANSI;
  1232.   CheckMenuRadioItem(hmenu,IDM_ENCODING_ANSI,IDM_ENCODING_UTF8SIGN,i,MF_BYCOMMAND);
  1233.  
  1234.   if (iEOLMode == SC_EOL_CRLF)
  1235.     i = IDM_LINEENDINGS_CRLF;
  1236.   else if (iEOLMode == SC_EOL_LF)
  1237.     i = IDM_LINEENDINGS_LF;
  1238.   else
  1239.     i = IDM_LINEENDINGS_CR;
  1240.   CheckMenuRadioItem(hmenu,IDM_LINEENDINGS_CRLF,IDM_LINEENDINGS_CR,i,MF_BYCOMMAND);
  1241.  
  1242.   EnableCmd(hmenu,IDM_FILE_RECENT,(EnumMRUList(hFileMRU,0,NULL,0) > 0));
  1243.  
  1244.   EnableCmd(hmenu,IDM_EDIT_UNDO,SendMessage(hwndEdit,SCI_CANUNDO,0,0) /*&& !bReadOnly*/);
  1245.   EnableCmd(hmenu,IDM_EDIT_REDO,SendMessage(hwndEdit,SCI_CANREDO,0,0) /*&& !bReadOnly*/);
  1246.  
  1247.   i = SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0) - SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
  1248.   EnableCmd(hmenu,IDM_EDIT_CUT,i /*&& !bReadOnly*/);
  1249.   EnableCmd(hmenu,IDM_EDIT_COPY,i /*&& !bReadOnly*/);
  1250.  
  1251.   EnableCmd(hmenu,IDM_EDIT_COPYALL,SendMessage(hwndEdit,SCI_GETLENGTH,0,0) /*&& !bReadOnly*/);
  1252.   EnableCmd(hmenu,IDM_EDIT_PASTE,SendMessage(hwndEdit,SCI_CANPASTE,0,0) /*&& !bReadOnly*/);
  1253.   EnableCmd(hmenu,IDM_EDIT_CLEAR,i /*&& !bReadOnly*/);
  1254.   EnableCmd(hmenu,IDM_EDIT_CLEARALL,SendMessage(hwndEdit,SCI_GETLENGTH,0,0) /*&& !bReadOnly*/);
  1255.  
  1256.   //EnableCmd(hmenu,IDM_EDIT_MOVELINEUP,!bReadOnly);
  1257.   //EnableCmd(hmenu,IDM_EDIT_MOVELINEDOWN,!bReadOnly);
  1258.   //EnableCmd(hmenu,IDM_EDIT_TOGGLELINE,!bReadOnly);
  1259.   //EnableCmd(hmenu,IDM_EDIT_DUPLICATELINE,!bReadOnly);
  1260.   //EnableCmd(hmenu,IDM_EDIT_CUTLINE,!bReadOnly);
  1261.   //EnableCmd(hmenu,IDM_EDIT_COPYLINE,!bReadOnly);
  1262.   //EnableCmd(hmenu,IDM_EDIT_DELETELINE,!bReadOnly);
  1263.   //EnableCmd(hmenu,IDM_EDIT_DELETELINELEFT,!bReadOnly);
  1264.   //EnableCmd(hmenu,IDM_EDIT_DELETELINERIGHT,!bReadOnly);
  1265.   //EnableCmd(hmenu,IDM_EDIT_DELETEWORDLEFT,!bReadOnly);
  1266.   //EnableCmd(hmenu,IDM_EDIT_DELETEWORDRIGHT,!bReadOnly);
  1267.  
  1268.   //EnableCmd(hmenu,IDM_EDIT_INDENT,!bReadOnly);
  1269.   //EnableCmd(hmenu,IDM_EDIT_UNINDENT,!bReadOnly);
  1270.  
  1271.   //EnableCmd(hmenu,IDM_EDIT_STRIP1STCHAR,!bReadOnly);
  1272.   //EnableCmd(hmenu,IDM_EDIT_TRIMLINES,!bReadOnly);
  1273.   //EnableCmd(hmenu,IDM_EDIT_REMOVEBLANKLINES,!bReadOnly);
  1274.  
  1275.   EnableCmd(hmenu,IDM_EDIT_SPLITLINES,i /*&& !bReadOnly*/);
  1276.   EnableCmd(hmenu,IDM_EDIT_JOINLINES,i /*&& !bReadOnly*/);
  1277.  
  1278.   EnableCmd(hmenu,IDM_EDIT_CONVERTUPPERCASE,i /*&& !bReadOnly*/);
  1279.   EnableCmd(hmenu,IDM_EDIT_CONVERTLOWERCASE,i /*&& !bReadOnly*/);
  1280.  
  1281.   EnableCmd(hmenu,IDM_EDIT_CONVERTTABS,i /*&& !bReadOnly*/);
  1282.   EnableCmd(hmenu,IDM_EDIT_CONVERTSPACES,i /*&& !bReadOnly*/);
  1283.  
  1284.   i2 = SendMessage(hwndEdit,SCI_GETCODEPAGE,0,0);
  1285.   EnableCmd(hmenu,IDM_EDIT_CONVERTOEM,i && (i2 == iDefaultCodePage || i2 == 0) /*&& !bReadOnly*/);
  1286.   EnableCmd(hmenu,IDM_EDIT_CONVERTANSI,i && (i2 == iDefaultCodePage || i2 == 0) /*&& !bReadOnly*/);
  1287.  
  1288.   //EnableCmd(hmenu,IDM_EDIT_INSERT_SHORTDATE,!bReadOnly);
  1289.   //EnableCmd(hmenu,IDM_EDIT_INSERT_LONGDATE,!bReadOnly);
  1290.   //EnableCmd(hmenu,IDM_EDIT_INSERT_FILENAME,!bReadOnly);
  1291.   //EnableCmd(hmenu,IDM_EDIT_INSERT_PATHNAME,!bReadOnly);
  1292.  
  1293.   i = SendMessage(hwndEdit,SCI_GETLENGTH,0,0);
  1294.   EnableCmd(hmenu,IDM_EDIT_FIND,i);
  1295.   EnableCmd(hmenu,IDM_EDIT_FINDNEXT,i);
  1296.   EnableCmd(hmenu,IDM_EDIT_FINDPREV,i && lstrlen(efrData.szFind));
  1297.   EnableCmd(hmenu,IDM_EDIT_REPLACE,i /*&& !bReadOnly*/);
  1298.  
  1299.   CheckCmd(hmenu,IDM_VIEW_USE2NDDEFAULT,Style_GetUse2ndDefault(hwndEdit));
  1300.  
  1301.   CheckCmd(hmenu,IDM_VIEW_WORDWRAP,fWordWrap);
  1302.   CheckCmd(hmenu,IDM_VIEW_LONGLINEMARKER,bMarkLongLines);
  1303.   CheckCmd(hmenu,IDM_VIEW_TABSASSPACES,bTabsAsSpaces);
  1304.   CheckCmd(hmenu,IDM_VIEW_SHOWINDENTGUIDES,bShowIndentGuides);
  1305.   CheckCmd(hmenu,IDM_VIEW_AUTOINDENTTEXT,bAutoIndent);
  1306.   CheckCmd(hmenu,IDM_VIEW_LINENUMBERS,bShowLineNumbers);
  1307.   CheckCmd(hmenu,IDM_VIEW_MARGIN,bShowSelectionMargin);
  1308.   CheckCmd(hmenu,IDM_VIEW_SHOWWHITESPACE,bViewWhiteSpace);
  1309.   CheckCmd(hmenu,IDM_VIEW_SHOWEOLS,bViewEOLs);
  1310.   CheckCmd(hmenu,IDM_VIEW_WORDWRAPSYMBOLS,bShowWordWrapSymbols);
  1311.   CheckCmd(hmenu,IDM_VIEW_MATCHBRACES,bMatchBraces);
  1312.   CheckCmd(hmenu,IDM_VIEW_TOOLBAR,bShowToolbar);
  1313.   EnableCmd(hmenu,IDM_VIEW_CUSTOMIZETB,bShowToolbar);
  1314.   CheckCmd(hmenu,IDM_VIEW_STATUSBAR,bShowStatusbar);
  1315.  
  1316.   i = SendMessage(hwndEdit,SCI_GETLEXER,0,0);
  1317.   EnableCmd(hmenu,IDM_VIEW_AUTOCLOSETAGS,(i == SCLEX_HTML || i == SCLEX_XML));
  1318.   CheckCmd(hmenu,IDM_VIEW_AUTOCLOSETAGS,bAutoCloseTags && (i == SCLEX_HTML || i == SCLEX_XML));
  1319.  
  1320.   i = RegGetAppIntEx("Settings","ReuseWindow2",0);
  1321.   CheckCmd(hmenu,IDM_VIEW_REUSEWINDOW,i);
  1322.   CheckCmd(hmenu,IDM_VIEW_ALWAYSONTOP,bAlwaysOnTop);
  1323.   CheckCmd(hmenu,IDM_VIEW_MINTOTRAY,bMinimizeToTray);
  1324.   CheckCmd(hmenu,IDM_VIEW_TRANSPARENT,bTransparentMode && bTransparentModeAvailable);
  1325.   EnableCmd(hmenu,IDM_VIEW_TRANSPARENT,bTransparentModeAvailable);
  1326.  
  1327.   CheckCmd(hmenu,IDM_VIEW_SHOWFULLPATH,!bShortPathNames);
  1328.   CheckCmd(hmenu,IDM_VIEW_NOSAVERECENT,bSaveRecentFiles);
  1329.   CheckCmd(hmenu,IDM_VIEW_NOSAVEFINDREPL,bSaveFindReplace);
  1330.   CheckCmd(hmenu,IDM_VIEW_SAVEVEFORERUNNINGTOOLS,bSaveBeforeRunningTools);
  1331.  
  1332.   if (iEscFunction == 1)
  1333.     i = IDM_VIEW_ESCMINIMIZE;
  1334.   else if (iEscFunction == 2)
  1335.     i = IDM_VIEW_ESCEXIT;
  1336.   else
  1337.     i = IDM_VIEW_NOESNFUNC;
  1338.   CheckMenuRadioItem(hmenu,IDM_VIEW_ESCMINIMIZE,IDM_VIEW_NOESNFUNC,i,MF_BYCOMMAND);
  1339.  
  1340.   CheckCmd(hmenu,IDM_VIEW_SAVESETTINGS,bSaveSettings);
  1341.  
  1342. }
  1343.  
  1344.  
  1345. //=============================================================================
  1346. //
  1347. //  MsgCommand() - Handles WM_COMMAND
  1348. //
  1349. //
  1350. LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
  1351. {
  1352.  
  1353.   switch(LOWORD(wParam))
  1354.   {
  1355.  
  1356.     case IDM_FILE_NEW:
  1357.       FileLoad(FALSE,TRUE,FALSE,FALSE,"");
  1358.       break;
  1359.  
  1360.  
  1361.     case IDM_FILE_OPEN:
  1362.       FileLoad(FALSE,FALSE,FALSE,FALSE,"");
  1363.       break;
  1364.  
  1365.  
  1366.     case IDM_FILE_REVERT:
  1367.       {
  1368.         char tchCurFile2[MAX_PATH];
  1369.  
  1370.         int iCurPos    = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  1371.         int iAnchorPos = SendMessage(hwndEdit,SCI_GETANCHOR,0,0);
  1372.  
  1373.         lstrcpy(tchCurFile2,szCurFile);
  1374.  
  1375.         if (FileLoad(FALSE,FALSE,TRUE,FALSE,tchCurFile2))
  1376.           SendMessage(hwndEdit,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos);
  1377.       }
  1378.       break;
  1379.  
  1380.  
  1381.     case IDM_FILE_SAVE:
  1382.       FileSave(TRUE,FALSE,FALSE,FALSE);
  1383.       break;
  1384.  
  1385.  
  1386.     case IDM_FILE_SAVEAS:
  1387.       FileSave(TRUE,FALSE,TRUE,FALSE);
  1388.       break;
  1389.  
  1390.  
  1391.     case IDM_FILE_SAVECOPY:
  1392.       FileSave(TRUE,FALSE,TRUE,TRUE);
  1393.       break;
  1394.  
  1395.  
  1396.     case IDM_FILE_READONLY:
  1397.       //bReadOnly = (bReadOnly) ? FALSE : TRUE;
  1398.       //SendMessage(hwndEdit,SCI_SETREADONLY,bReadOnly,0);
  1399.       //UpdateToolbar();
  1400.       //UpdateStatusbar();
  1401.       if (lstrlen(szCurFile))
  1402.       {
  1403.         BOOL bSuccess = FALSE;
  1404.         DWORD dwFileAttributes = GetFileAttributes(szCurFile);
  1405.         if (dwFileAttributes != INVALID_FILE_ATTRIBUTES) {
  1406.           if (bReadOnly)
  1407.             dwFileAttributes = (dwFileAttributes & ~FILE_ATTRIBUTE_READONLY);
  1408.           else
  1409.             dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
  1410.           if (!SetFileAttributes(szCurFile,dwFileAttributes))
  1411.             MsgBox(MBWARN,IDS_READONLY_MODIFY,szCurFile); }
  1412.         else
  1413.           MsgBox(MBWARN,IDS_READONLY_MODIFY,szCurFile);
  1414.  
  1415.         dwFileAttributes = GetFileAttributes(szCurFile);
  1416.         if (dwFileAttributes != INVALID_FILE_ATTRIBUTES)
  1417.           bReadOnly = (dwFileAttributes & FILE_ATTRIBUTE_READONLY);
  1418.  
  1419.         SetWindowTitle(hwnd,uidsAppTitle,IDS_UNTITLED,szCurFile,
  1420.           bShortPathNames,bModified || iCodePage != iInitialCP,
  1421.           IDS_READONLY,bReadOnly);
  1422.       }
  1423.       break;
  1424.  
  1425.  
  1426.     case IDM_FILE_METAPATH:
  1427.       {
  1428.         SHELLEXECUTEINFO sei;
  1429.         char tchParam[MAX_PATH+4];
  1430.         char tchMetapath[MAX_PATH+4];
  1431.  
  1432.         lstrcpy(tchParam,szCurFile);
  1433.         PathQuoteSpaces(tchParam);
  1434.  
  1435.         if (!SearchPath(NULL,"metapath.exe",NULL,COUNTOF(tchMetapath),tchMetapath,NULL))
  1436.           lstrcpy(tchMetapath,"metapath.exe");
  1437.  
  1438.         ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
  1439.  
  1440.         sei.cbSize = sizeof(SHELLEXECUTEINFO);
  1441.         sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
  1442.         sei.hwnd = hwnd;
  1443.         sei.lpVerb = NULL;
  1444.         sei.lpFile = tchMetapath;
  1445.         sei.lpParameters = tchParam;
  1446.         sei.lpDirectory = NULL;
  1447.         sei.nShow = SW_SHOWNORMAL;
  1448.  
  1449.         ShellExecuteEx(&sei);
  1450.  
  1451.         if (sei.hInstApp < 32)
  1452.           MsgBox(MBWARN,IDS_ERR_METAPATH);
  1453.  
  1454.         //if (32 > ShellExecute(hwnd,"",tchMetapath,tchParam,NULL,SW_SHOWNORMAL))
  1455.         //  MsgBox(MBWARN,IDS_ERR_METAPATH);
  1456.  
  1457.         // Set the metapath registry options if metapath.exe was found
  1458.         else
  1459.         {
  1460.           HKEY hKey;
  1461.           HKEY hKey2;
  1462.  
  1463.           char tchModule[MAX_PATH];
  1464.           GetModuleFileName(NULL,tchModule,COUNTOF(tchModule));
  1465.  
  1466.           hKey = RegGetKey("Software\\metapath\\Target Application");
  1467.           hKey2 = RegGetSubKey(hKey,PathFindFileName(tchModule));
  1468.  
  1469.           RegSetInt(hKey,"UseTargetApplication",1);  // enable target application
  1470.           RegSetInt(hKey,"TargetApplicationMode",1); // send wm_dropfiles
  1471.           RegSetString(hKey,"TargetApplicationPath",tchModule);
  1472.           RegSetString(hKey,"TargetApplicationWndClass",WC_NOTEPAD2);
  1473.           RegSetString(hKey,"DDEApplication","");
  1474.           RegSetString(hKey,"DDEMessage","");
  1475.           RegSetString(hKey,"DDETopic","");
  1476.  
  1477.           RegSetString(hKey2,"Path",tchModule);
  1478.           RegSetString(hKey2,"WndClass",WC_NOTEPAD2);
  1479.           RegSetString(hKey2,"DDEApplication","");
  1480.           RegSetString(hKey2,"DDEMessage","");
  1481.           RegSetString(hKey2,"DDETopic","");
  1482.  
  1483.           RegCloseKey(hKey2);
  1484.           RegCloseKey(hKey);
  1485.         }
  1486.       }
  1487.       break;
  1488.  
  1489.  
  1490.     case IDM_FILE_NEWWINDOW:
  1491.     case IDM_FILE_NEWWINDOW2:
  1492.       {
  1493.         char szModuleName[MAX_PATH];
  1494.         char szFileName[MAX_PATH];
  1495.         char szParameters[MAX_PATH+64];
  1496.  
  1497.         RECT rcWorkArea;
  1498.         WINDOWPLACEMENT wndpl;
  1499.         int x,y,cx,cy,imax;
  1500.         char tch[64];
  1501.  
  1502.         if (bSaveBeforeRunningTools && !FileSave(FALSE,TRUE,FALSE,FALSE))
  1503.           break;
  1504.  
  1505.         GetModuleFileName(NULL,szModuleName,COUNTOF(szModuleName));
  1506.  
  1507.         lstrcpy(szParameters,"-n ");
  1508.  
  1509.         SystemParametersInfo(SPI_GETWORKAREA,0,&rcWorkArea,0);
  1510.         wndpl.length = sizeof(WINDOWPLACEMENT);
  1511.         GetWindowPlacement(hwnd,&wndpl);
  1512.  
  1513.         // offset new window position +10/+10
  1514.         x = wndpl.rcNormalPosition.left + 10;
  1515.         y = wndpl.rcNormalPosition.top  + 10;
  1516.         cx = wndpl.rcNormalPosition.right - wndpl.rcNormalPosition.left;
  1517.         cy = wndpl.rcNormalPosition.bottom - wndpl.rcNormalPosition.top;
  1518.  
  1519.         // check if window fits work area
  1520.         if (x + cx > rcWorkArea.right - rcWorkArea.left ||
  1521.             y + cy > rcWorkArea.bottom - rcWorkArea.top)
  1522.           x = y = 0;
  1523.  
  1524.         imax = IsZoomed(hwnd);
  1525.  
  1526.         wsprintf(tch,"-p %i,%i,%i,%i,%i",x,y,cx,cy,imax);
  1527.         lstrcat(szParameters,tch);
  1528.  
  1529.         if (LOWORD(wParam) != IDM_FILE_NEWWINDOW2 && lstrlen(szCurFile)) {
  1530.           lstrcpy(szFileName,szCurFile);
  1531.           PathQuoteSpaces(szFileName);
  1532.           lstrcat(szParameters," ");
  1533.           lstrcat(szParameters,szFileName); }
  1534.  
  1535.         ShellExecute(hwnd,NULL,szModuleName,szParameters,NULL,SW_SHOWNORMAL);
  1536.       }
  1537.       break;
  1538.  
  1539.  
  1540.     case IDM_FILE_LAUNCH:
  1541.       {
  1542.         SHELLEXECUTEINFO sei;
  1543.  
  1544.         if (!lstrlen(szCurFile))
  1545.           break;
  1546.  
  1547.         if (bSaveBeforeRunningTools && !FileSave(FALSE,TRUE,FALSE,FALSE))
  1548.           break;
  1549.  
  1550.         ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
  1551.  
  1552.         sei.cbSize = sizeof(SHELLEXECUTEINFO);
  1553.         sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  1554.         sei.hwnd = hwnd;
  1555.         sei.lpVerb = NULL;
  1556.         sei.lpFile = szCurFile;
  1557.         sei.lpParameters = NULL;
  1558.         sei.lpDirectory = NULL;
  1559.         sei.nShow = SW_SHOWNORMAL;
  1560.  
  1561.         ShellExecuteEx(&sei);
  1562.       }
  1563.       break;
  1564.  
  1565.  
  1566.     case IDM_FILE_RUN:
  1567.       {
  1568.         char tchCmdLine[MAX_PATH+4];
  1569.  
  1570.         if (bSaveBeforeRunningTools && !FileSave(FALSE,TRUE,FALSE,FALSE))
  1571.           break;
  1572.  
  1573.         lstrcpy(tchCmdLine,szCurFile);
  1574.         PathQuoteSpaces(tchCmdLine);
  1575.  
  1576.         RunDlg(hwnd,tchCmdLine);
  1577.       }
  1578.       break;
  1579.  
  1580.  
  1581.     case IDM_FILE_OPENWITH:
  1582.       if (bSaveBeforeRunningTools && !FileSave(FALSE,TRUE,FALSE,FALSE))
  1583.         break;
  1584.       OpenWithDlg(hwnd,szCurFile);
  1585.       break;
  1586.  
  1587.  
  1588.     case IDM_FILE_PAGESETUP:
  1589.       EditPrintSetup(hwndEdit);
  1590.       break;
  1591.  
  1592.     case IDM_FILE_PRINT:
  1593.       {
  1594.         SHFILEINFO shfi;
  1595.         char *pszTitle;
  1596.         char tchUntitled[32];
  1597.         char tchPageFmt[32];
  1598.  
  1599.         if (lstrlen(szCurFile)) {
  1600.           SHGetFileInfo2(szCurFile,0,&shfi,sizeof(SHFILEINFO),SHGFI_DISPLAYNAME);
  1601.           pszTitle = shfi.szDisplayName; }
  1602.         else {
  1603.           GetString(IDS_UNTITLED,tchUntitled,COUNTOF(tchUntitled));
  1604.           pszTitle = tchUntitled; }
  1605.  
  1606.         GetString(IDS_PRINT_PAGENUM,tchPageFmt,COUNTOF(tchPageFmt));
  1607.  
  1608.         if (!EditPrint(hwndEdit,pszTitle,tchPageFmt))
  1609.           MsgBox(MBWARN,IDS_PRINT_ERROR);
  1610.       }
  1611.       break;
  1612.  
  1613.  
  1614.     case IDM_FILE_PROPERTIES:
  1615.       {
  1616.         SHELLEXECUTEINFO sei;
  1617.  
  1618.         if (lstrlen(szCurFile) == 0)
  1619.           break;
  1620.  
  1621.         ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
  1622.  
  1623.         sei.cbSize = sizeof(SHELLEXECUTEINFO);
  1624.         sei.fMask = SEE_MASK_INVOKEIDLIST | SEE_MASK_NOCLOSEPROCESS;
  1625.         sei.hwnd = hwnd;
  1626.         sei.lpVerb = "properties";
  1627.         sei.lpFile = szCurFile;
  1628.         sei.nShow = SW_SHOWNORMAL;
  1629.  
  1630.         ShellExecuteEx(&sei);
  1631.       }
  1632.       break;
  1633.  
  1634.     case IDM_FILE_CREATELINK:
  1635.       {
  1636.         if (!lstrlen(szCurFile))
  1637.           break;
  1638.  
  1639.         if (!PathCreateDeskLnk(szCurFile))
  1640.           MsgBox(MBWARN,IDS_ERR_CREATELINK);
  1641.       }
  1642.       break;
  1643.  
  1644.  
  1645.     case IDM_FILE_OPENFAV:
  1646.       if (FileSave(FALSE,TRUE,FALSE,FALSE)) {
  1647.         char tchFile[MAX_PATH];
  1648.         if (FavoritesDlg(hwnd,tchFile))
  1649.           FileLoad(TRUE,FALSE,FALSE,FALSE,tchFile); }
  1650.       break;
  1651.  
  1652.  
  1653.     case IDM_FILE_ADDTOFAV:
  1654.       if (lstrlen(szCurFile)) {
  1655.         SHFILEINFO shfi;
  1656.         SHGetFileInfo2(szCurFile,0,&shfi,sizeof(SHFILEINFO),SHGFI_DISPLAYNAME);
  1657.         AddToFavDlg(hwnd,shfi.szDisplayName,szCurFile); }
  1658.       break;
  1659.  
  1660.  
  1661.     case IDM_FILE_MANAGEFAV:
  1662.       {
  1663.         SHELLEXECUTEINFO sei;
  1664.         ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
  1665.  
  1666.         sei.cbSize = sizeof(SHELLEXECUTEINFO);
  1667.         sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  1668.         sei.hwnd = hwnd;
  1669.         sei.lpVerb = NULL;
  1670.         sei.lpFile = tchFavoritesDir;
  1671.         sei.lpParameters = NULL;
  1672.         sei.lpDirectory = NULL;
  1673.         sei.nShow = SW_SHOWNORMAL;
  1674.  
  1675.         // Run favorites directory
  1676.         ShellExecuteEx(&sei);
  1677.       }
  1678.       break;
  1679.  
  1680.  
  1681.     case IDM_FILE_RECENT:
  1682.       if (EnumMRUList(hFileMRU,0,NULL,0) > 0) {
  1683.         if (FileSave(FALSE,TRUE,FALSE,FALSE)) {
  1684.           char tchFile[MAX_PATH];
  1685.           if (FileMRUDlg(hwnd,tchFile))
  1686.             FileLoad(TRUE,FALSE,FALSE,FALSE,tchFile); } }
  1687.       break;
  1688.  
  1689.  
  1690.     case IDM_FILE_EXIT:
  1691.       SendMessage(hwnd,WM_CLOSE,0,0);
  1692.       break;
  1693.  
  1694.  
  1695.     case IDM_ENCODING_ANSI:
  1696.     case IDM_ENCODING_UNICODE:
  1697.     case IDM_ENCODING_UNICODEREV:
  1698.     case IDM_ENCODING_UTF8:
  1699.     case IDM_ENCODING_UTF8SIGN:
  1700.       {
  1701.         int iNewCodePage = iEncodings[LOWORD(wParam)-IDM_ENCODING_ANSI];
  1702.         if (SendMessage(hwndEdit,SCI_GETLENGTH,0,0) == 0)
  1703.         {
  1704.           iCodePage = iNewCodePage;
  1705.           iInitialCP = iNewCodePage;
  1706.           SendMessage(hwndEdit,SCI_SETCODEPAGE,(iCodePage == NCP_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,0);
  1707.           UpdateToolbar();
  1708.           UpdateStatusbar();
  1709.           SetWindowTitle(hwnd,uidsAppTitle,IDS_UNTITLED,szCurFile,
  1710.             bShortPathNames,bModified || iCodePage != iInitialCP,
  1711.             IDS_READONLY,bReadOnly);
  1712.         }
  1713.         else if (iCodePage != iNewCodePage)
  1714.         {
  1715.           if ((iCodePage != 0 && iNewCodePage != 0) || (IDYES == MsgBox(MBYESNO,IDS_ASK_ENCODING)))
  1716.           {
  1717.             iCodePage = iNewCodePage;
  1718.             SendMessage(hwndEdit,SCI_SETCODEPAGE,(iCodePage == NCP_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,0);
  1719.           }
  1720.           UpdateToolbar();
  1721.           UpdateStatusbar();
  1722.           SetWindowTitle(hwnd,uidsAppTitle,IDS_UNTITLED,szCurFile,
  1723.             bShortPathNames,bModified || iCodePage != iInitialCP,
  1724.             IDS_READONLY,bReadOnly);
  1725.         }
  1726.       }
  1727.       break;
  1728.  
  1729.  
  1730.     case IDM_ENCODING_SETDEFAULT:
  1731.       if (SelectOptionDlg(hwnd,IDD_ENCODING,&iDefaultEncoding)) {
  1732.         if (bAutoSelACP) {
  1733.           if (SendMessage(hwndEdit,SCI_GETCODEPAGE,0,0) != SC_CP_UTF8)
  1734.             Style_SetACPfromCharSet(hwndEdit); }
  1735.         else { char tch[64];
  1736.           // Reload from Registry
  1737.           HKEY hKey = RegGetAppKey("International");
  1738.           iDefaultCodePage = RegGetInt(hKey,"CodePage",GetACP()/* default */);
  1739.           RegCloseKey(hKey);
  1740.           wsprintf(tch,"ACP = %i",iDefaultCodePage);
  1741.           MessageBox(hwnd,tch,"",0);
  1742.           if (SendMessage(hwndEdit,SCI_GETCODEPAGE,0,0) != SC_CP_UTF8)
  1743.             SendMessage(hwndEdit,SCI_SETCODEPAGE,(WPARAM)iDefaultCodePage,0); } }
  1744.       break;
  1745.  
  1746.  
  1747.     case IDM_LINEENDINGS_CRLF:
  1748.     case IDM_LINEENDINGS_LF:
  1749.     case IDM_LINEENDINGS_CR:
  1750.       {
  1751.         int iNewEOLMode = iLineEndings[LOWORD(wParam)-IDM_LINEENDINGS_CRLF];
  1752.  
  1753.         iEOLMode = iNewEOLMode;
  1754.         SendMessage(hwndEdit,SCI_SETEOLMODE,iEOLMode,0);
  1755.         SendMessage(hwndEdit,SCI_CONVERTEOLS,iEOLMode,0);
  1756.         UpdateToolbar();
  1757.         UpdateStatusbar();
  1758.         SetWindowTitle(hwnd,uidsAppTitle,IDS_UNTITLED,szCurFile,
  1759.           bShortPathNames,bModified || iCodePage != iInitialCP,
  1760.           IDS_READONLY,bReadOnly);
  1761.       }
  1762.       break;
  1763.  
  1764.  
  1765.     case IDM_LINEENDINGS_SETDEFAULT:
  1766.       SelectOptionDlg(hwnd,IDD_EOLMODE,&iDefaultEOLMode);
  1767.       break;
  1768.  
  1769.  
  1770.     case IDM_EDIT_UNDO:
  1771.       SendMessage(hwndEdit,SCI_UNDO,0,0);
  1772.       break;
  1773.  
  1774.  
  1775.     case IDM_EDIT_REDO:
  1776.       SendMessage(hwndEdit,SCI_REDO,0,0);
  1777.       break;
  1778.  
  1779.  
  1780.     case IDM_EDIT_CUT:
  1781.       if (flagPasteBoard)
  1782.         bLastCopyFromMe = TRUE;
  1783.       SendMessage(hwndEdit,SCI_CUT,0,0);
  1784.       break;
  1785.  
  1786.  
  1787.     case IDM_EDIT_COPY:
  1788.       if (flagPasteBoard)
  1789.         bLastCopyFromMe = TRUE;
  1790.       SendMessage(hwndEdit,SCI_COPY,0,0);
  1791.       UpdateToolbar();
  1792.       break;
  1793.  
  1794.  
  1795.     case IDM_EDIT_COPYALL:
  1796.       if (flagPasteBoard)
  1797.         bLastCopyFromMe = TRUE;
  1798.       SendMessage(hwndEdit,SCI_COPYRANGE,0,SendMessage(hwndEdit,SCI_GETLENGTH,0,0));
  1799.       UpdateToolbar();
  1800.       break;
  1801.  
  1802.  
  1803.     case IDM_EDIT_PASTE:
  1804.       SendMessage(hwndEdit,SCI_PASTE,0,0);
  1805.       break;
  1806.  
  1807.  
  1808.     case IDM_EDIT_CLEAR:
  1809.       SendMessage(hwndEdit,SCI_CLEAR,0,0);
  1810.       break;
  1811.  
  1812.  
  1813.     case IDM_EDIT_CLEARALL:
  1814.       SendMessage(hwndEdit,SCI_CLEARALL,0,0);
  1815.       break;
  1816.  
  1817.  
  1818.     case IDM_EDIT_SELECTALL:
  1819.       SendMessage(hwndEdit,SCI_SELECTALL,0,0);
  1820.       //SendMessage(hwndEdit,SCI_SETSEL,0,(LPARAM)-1);
  1821.       break;
  1822.  
  1823.  
  1824.     case IDM_EDIT_SELECTWORD:
  1825.       {
  1826.         int iPos = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  1827.  
  1828.         int iWordStart = SendMessage(hwndEdit,SCI_WORDSTARTPOSITION,iPos,TRUE);
  1829.         int iWordEnd   = SendMessage(hwndEdit,SCI_WORDENDPOSITION,iPos,TRUE);
  1830.  
  1831.         if (iWordStart == iWordEnd) // we are in whitespace salad...
  1832.         {
  1833.           iWordStart = SendMessage(hwndEdit,SCI_WORDENDPOSITION,iPos,FALSE);
  1834.           iWordEnd   = SendMessage(hwndEdit,SCI_WORDENDPOSITION,iWordStart,TRUE);
  1835.           if (iWordStart != iWordEnd)
  1836.             SendMessage(hwndEdit,SCI_SETSEL,iWordStart,iWordEnd);
  1837.         }
  1838.         else
  1839.           SendMessage(hwndEdit,SCI_SETSEL,iWordStart,iWordEnd);
  1840.       }
  1841.       break;
  1842.  
  1843.  
  1844.     case IDM_EDIT_MOVELINEUP:
  1845.       {
  1846.         int iCurPos  = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  1847.         int iCurLine = SendMessage(hwndEdit,SCI_LINEFROMPOSITION,(WPARAM)iCurPos,0);
  1848.         int iLinePos = iCurPos - SendMessage(hwndEdit,SCI_POSITIONFROMLINE,(WPARAM)iCurLine,0);
  1849.         if (iCurLine > 0) {
  1850.           SendMessage(hwndEdit,SCI_BEGINUNDOACTION,0,0);
  1851.           SendMessage(hwndEdit,SCI_LINETRANSPOSE,0,0);
  1852.           //SendMessage(hwndEdit,SCI_GOTOLINE,(WPARAM)iCurLine-1,0);
  1853.           SendMessage(hwndEdit,SCI_GOTOPOS,(WPARAM)SendMessage(hwndEdit,SCI_POSITIONFROMLINE,(WPARAM)iCurLine-1,0)+iLinePos,0);
  1854.           SendMessage(hwndEdit,SCI_CHOOSECARETX,0,0);
  1855.           SendMessage(hwndEdit,SCI_ENDUNDOACTION,0,0); }
  1856.       }
  1857.       break;
  1858.  
  1859.  
  1860.     case IDM_EDIT_MOVELINEDOWN:
  1861.       {
  1862.         int iCurPos  = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  1863.         int iCurLine = SendMessage(hwndEdit,SCI_LINEFROMPOSITION,(WPARAM)iCurPos,0);
  1864.         int iLinePos = iCurPos - SendMessage(hwndEdit,SCI_POSITIONFROMLINE,(WPARAM)iCurLine,0);
  1865.         if (iCurLine < SendMessage(hwndEdit,SCI_GETLINECOUNT,0,0) - 1) {
  1866.           SendMessage(hwndEdit,SCI_BEGINUNDOACTION,0,0);
  1867.           SendMessage(hwndEdit,SCI_GOTOLINE,(WPARAM)iCurLine+1,0);
  1868.           SendMessage(hwndEdit,SCI_LINETRANSPOSE,0,0);
  1869.           SendMessage(hwndEdit,SCI_GOTOPOS,(WPARAM)SendMessage(hwndEdit,SCI_POSITIONFROMLINE,(WPARAM)iCurLine+1,0)+iLinePos,0);
  1870.           SendMessage(hwndEdit,SCI_CHOOSECARETX,0,0);
  1871.           SendMessage(hwndEdit,SCI_ENDUNDOACTION,0,0); }
  1872.       }
  1873.       break;
  1874.  
  1875.  
  1876.     case IDM_EDIT_TOGGLELINE:
  1877.       {
  1878.         int iCurPos  = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  1879.         int iCurLine = SendMessage(hwndEdit,SCI_LINEFROMPOSITION,(WPARAM)iCurPos,0);
  1880.         int iCol = SendMessage(hwndEdit,SCI_GETCOLUMN,iCurPos,0) + 1;
  1881.         SendMessage(hwndEdit,SCI_BEGINUNDOACTION,0,0);
  1882.         SendMessage(hwndEdit,SCI_LINETRANSPOSE,0,0);
  1883.         EditJumpTo(hwndEdit,iCurLine+1,iCol);
  1884.         SendMessage(hwndEdit,SCI_ENDUNDOACTION,0,0);
  1885.       }
  1886.       break;
  1887.  
  1888.  
  1889.     case IDM_EDIT_DUPLICATELINE:
  1890.       SendMessage(hwndEdit,SCI_LINEDUPLICATE,0,0);
  1891.       break;
  1892.  
  1893.  
  1894.     case IDM_EDIT_CUTLINE:
  1895.       if (flagPasteBoard)
  1896.         bLastCopyFromMe = TRUE;
  1897.       SendMessage(hwndEdit,SCI_LINECUT,0,0);
  1898.       break;
  1899.  
  1900.  
  1901.     case IDM_EDIT_COPYLINE:
  1902.       if (flagPasteBoard)
  1903.         bLastCopyFromMe = TRUE;
  1904.       SendMessage(hwndEdit,SCI_LINECOPY,0,0);
  1905.       UpdateToolbar();
  1906.       break;
  1907.  
  1908.  
  1909.     case IDM_EDIT_DELETELINE:
  1910.       SendMessage(hwndEdit,SCI_LINEDELETE,0,0);
  1911.       break;
  1912.  
  1913.  
  1914.     case IDM_EDIT_DELETELINELEFT:
  1915.       SendMessage(hwndEdit,SCI_DELLINELEFT,0,0);
  1916.       break;
  1917.  
  1918.  
  1919.     case IDM_EDIT_DELETELINERIGHT:
  1920.       SendMessage(hwndEdit,SCI_DELLINERIGHT,0,0);
  1921.       break;
  1922.  
  1923.  
  1924.     //case IDM_EDIT_DELETEWORDLEFT:
  1925.     //  SendMessage(hwndEdit,SCI_DELWORDLEFT,0,0);
  1926.     //  break;
  1927.  
  1928.  
  1929.     //case IDM_EDIT_DELETEWORDRIGHT:
  1930.     //  SendMessage(hwndEdit,SCI_DELWORDRIGHT,0,0);
  1931.     //  break;
  1932.  
  1933.  
  1934.     case IDM_EDIT_INDENT:
  1935.       SendMessage(hwndEdit,SCI_TAB,0,0);
  1936.       break;
  1937.  
  1938.  
  1939.     case IDM_EDIT_UNINDENT:
  1940.       SendMessage(hwndEdit,SCI_BACKTAB,0,0);
  1941.       break;
  1942.  
  1943.  
  1944.     case IDM_EDIT_STRIP1STCHAR:
  1945.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  1946.       EditStripFirstCharacter(hwndEdit);
  1947.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  1948.       break;
  1949.  
  1950.  
  1951.     case IDM_EDIT_TRIMLINES:
  1952.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  1953.       EditStripTrailingBlanks(hwndEdit);
  1954.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  1955.       break;
  1956.  
  1957.  
  1958.     case IDM_EDIT_REMOVEBLANKLINES:
  1959.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  1960.       EditRemoveBlankLines(hwndEdit);
  1961.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  1962.       break;
  1963.  
  1964.  
  1965.     case IDM_EDIT_SPLITLINES:
  1966.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  1967.       SendMessage(hwndEdit,SCI_TARGETFROMSELECTION,0,0);
  1968.       SendMessage(hwndEdit,SCI_LINESSPLIT,0,0);
  1969.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  1970.       break;
  1971.  
  1972.  
  1973.     case IDM_EDIT_JOINLINES:
  1974.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  1975.       SendMessage(hwndEdit,SCI_TARGETFROMSELECTION,0,0);
  1976.       SendMessage(hwndEdit,SCI_LINESJOIN,0,0);
  1977.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  1978.       break;
  1979.  
  1980.  
  1981.     case IDM_EDIT_FINDMATCHINGBRACE:
  1982.       {
  1983.         int iBrace2 = -1;
  1984.         int iPos = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  1985.         char c = (char)SendMessage(hwndEdit,SCI_GETCHARAT,iPos,0);
  1986.         if (StrChr("()[]{}",c))
  1987.           iBrace2 = SendMessage(hwndEdit,SCI_BRACEMATCH,iPos,0);
  1988.         // Try one before
  1989.         else {
  1990.           iPos = SendMessage(hwndEdit,SCI_POSITIONBEFORE,iPos,0);
  1991.           c = (char)SendMessage(hwndEdit,SCI_GETCHARAT,iPos,0);
  1992.           if (StrChr("()[]{}",c))
  1993.             iBrace2 = SendMessage(hwndEdit,SCI_BRACEMATCH,iPos,0);
  1994.         }
  1995.         if (iBrace2 != -1)
  1996.           SendMessage(hwndEdit,SCI_GOTOPOS,(WPARAM)iBrace2,0);
  1997.       }
  1998.       break;
  1999.  
  2000.  
  2001.     case IDM_EDIT_SELTOMATCHINGBRACE:
  2002.       {
  2003.         int iBrace2 = -1;
  2004.         int iPos = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  2005.         char c = (char)SendMessage(hwndEdit,SCI_GETCHARAT,iPos,0);
  2006.         if (StrChr("()[]{}",c))
  2007.           iBrace2 = SendMessage(hwndEdit,SCI_BRACEMATCH,iPos,0);
  2008.         // Try one before
  2009.         else {
  2010.           iPos = SendMessage(hwndEdit,SCI_POSITIONBEFORE,iPos,0);
  2011.           c = (char)SendMessage(hwndEdit,SCI_GETCHARAT,iPos,0);
  2012.           if (StrChr("()[]{}",c))
  2013.             iBrace2 = SendMessage(hwndEdit,SCI_BRACEMATCH,iPos,0);
  2014.         }
  2015.         if (iBrace2 != -1) {
  2016.           if (iBrace2 > iPos)
  2017.             SendMessage(hwndEdit,SCI_SETSEL,(WPARAM)iPos,(LPARAM)iBrace2+1);
  2018.           else
  2019.             SendMessage(hwndEdit,SCI_SETSEL,(WPARAM)iPos+1,(LPARAM)iBrace2); }
  2020.       }
  2021.       break;
  2022.  
  2023.  
  2024.     case IDM_EDIT_GOTOLINE:
  2025.       EditLinenumDlg(hwndEdit);
  2026.       break;
  2027.  
  2028.  
  2029.     case IDM_EDIT_CONVERTUPPERCASE:
  2030.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  2031.       EditMakeUppercase(hwndEdit);
  2032.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  2033.       break;
  2034.  
  2035.  
  2036.     case IDM_EDIT_CONVERTLOWERCASE:
  2037.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  2038.       EditMakeLowercase(hwndEdit);
  2039.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  2040.       break;
  2041.  
  2042.  
  2043.     case IDM_EDIT_CONVERTTABS:
  2044.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  2045.       EditTabsToSpaces(hwndEdit,iTabWidth);
  2046.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  2047.       break;
  2048.  
  2049.  
  2050.     case IDM_EDIT_CONVERTSPACES:
  2051.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  2052.       EditSpacesToTabs(hwndEdit,iTabWidth);
  2053.       SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  2054.       break;
  2055.  
  2056.  
  2057.     case IDM_EDIT_CONVERTANSI:
  2058.       {
  2059.         int iCurPos    = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  2060.         int iAnchorPos = SendMessage(hwndEdit,SCI_GETANCHOR,0,0);
  2061.         if (iCurPos != iAnchorPos)
  2062.         {
  2063.           if (SC_SEL_RECTANGLE != SendMessage(hwndEdit,SCI_GETSELECTIONMODE,0,0))
  2064.           {
  2065.             int iSelCount = SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0) -
  2066.                               SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
  2067.             char *pszOEM = GlobalAlloc(GPTR,iSelCount+2);
  2068.             char *pszANSI = GlobalAlloc(GPTR,iSelCount+2);
  2069.             SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  2070.             SendMessage(hwndEdit,SCI_GETSELTEXT,0,(LPARAM)pszOEM);
  2071.             OemToCharBuff(pszOEM,pszANSI,GlobalSize(pszANSI));
  2072.             SendMessage(hwndEdit,SCI_BEGINUNDOACTION,0,0);
  2073.             SendMessage(hwndEdit,SCI_CLEAR,0,0);
  2074.             SendMessage(hwndEdit,SCI_ADDTEXT,(WPARAM)iSelCount,(LPARAM)pszANSI);
  2075.             SendMessage(hwndEdit,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos);
  2076.             SendMessage(hwndEdit,SCI_ENDUNDOACTION,0,0);
  2077.             GlobalFree(pszOEM);
  2078.             GlobalFree(pszANSI);
  2079.             SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  2080.           }
  2081.           else
  2082.             MsgBox(MBINFO,IDS_SELRECT);
  2083.         }
  2084.       }
  2085.       break;
  2086.  
  2087.  
  2088.     case IDM_EDIT_CONVERTOEM:
  2089.       {
  2090.         int iCurPos    = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  2091.         int iAnchorPos = SendMessage(hwndEdit,SCI_GETANCHOR,0,0);
  2092.         if (iCurPos != iAnchorPos)
  2093.         {
  2094.           if (SC_SEL_RECTANGLE != SendMessage(hwndEdit,SCI_GETSELECTIONMODE,0,0))
  2095.           {
  2096.             int iSelCount = SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0) -
  2097.                               SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
  2098.             char *pszANSI = GlobalAlloc(GPTR,iSelCount+2);
  2099.             char *pszOEM = GlobalAlloc(GPTR,iSelCount+2);
  2100.             SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORWAIT,0);
  2101.             SendMessage(hwndEdit,SCI_GETSELTEXT,0,(LPARAM)pszANSI);
  2102.             CharToOemBuff(pszANSI,pszOEM,GlobalSize(pszOEM));
  2103.             SendMessage(hwndEdit,SCI_BEGINUNDOACTION,0,0);
  2104.             SendMessage(hwndEdit,SCI_CLEAR,0,0);
  2105.             SendMessage(hwndEdit,SCI_ADDTEXT,(WPARAM)iSelCount,(LPARAM)pszOEM);
  2106.             SendMessage(hwndEdit,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos);
  2107.             SendMessage(hwndEdit,SCI_ENDUNDOACTION,0,0);
  2108.             GlobalFree(pszANSI);
  2109.             GlobalFree(pszOEM);
  2110.             SendMessage(hwndEdit,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  2111.           }
  2112.           else
  2113.             MsgBox(MBINFO,IDS_SELRECT);
  2114.         }
  2115.       }
  2116.       break;
  2117.  
  2118.  
  2119.     case IDM_EDIT_INSERT_SHORTDATE:
  2120.     case IDM_EDIT_INSERT_LONGDATE:
  2121.       {
  2122.         //if (!bReadOnly)
  2123.         //{
  2124.           char tchDate[128];
  2125.           char tchTime[128];
  2126.           char tchDateTime[256];
  2127.           SYSTEMTIME st;
  2128.  
  2129.           GetLocalTime(&st);
  2130.           GetDateFormat(LOCALE_USER_DEFAULT,(
  2131.             LOWORD(wParam) == IDM_EDIT_INSERT_SHORTDATE) ? DATE_SHORTDATE : DATE_LONGDATE,
  2132.             &st,NULL,tchDate,COUNTOF(tchDate));
  2133.           GetTimeFormat(LOCALE_USER_DEFAULT,TIME_NOSECONDS,&st,NULL,tchTime,COUNTOF(tchTime));
  2134.  
  2135.           wsprintf(tchDateTime,"%s %s",tchTime,tchDate);
  2136.  
  2137.           SendMessage(hwndEdit,SCI_REPLACESEL,0,(LPARAM)tchDateTime);
  2138.         //}
  2139.       }
  2140.       break;
  2141.  
  2142.  
  2143.     case IDM_EDIT_INSERT_FILENAME:
  2144.     case IDM_EDIT_INSERT_PATHNAME:
  2145.       {
  2146.         //if (!bReadOnly)
  2147.         //{
  2148.           SHFILEINFO shfi;
  2149.           char *pszInsert;
  2150.           char tchUntitled[32];
  2151.  
  2152.           if (lstrlen(szCurFile)) {
  2153.             if (LOWORD(wParam) == IDM_EDIT_INSERT_FILENAME) {
  2154.               SHGetFileInfo2(szCurFile,0,&shfi,sizeof(SHFILEINFO),SHGFI_DISPLAYNAME);
  2155.               pszInsert = shfi.szDisplayName; }
  2156.             else
  2157.               pszInsert = szCurFile; }
  2158.  
  2159.           else {
  2160.             GetString(IDS_UNTITLED,tchUntitled,COUNTOF(tchUntitled));
  2161.             pszInsert = tchUntitled; }
  2162.  
  2163.           SendMessage(hwndEdit,SCI_REPLACESEL,0,(LPARAM)pszInsert);
  2164.         //}
  2165.       }
  2166.       break;
  2167.  
  2168.  
  2169.     case IDM_EDIT_BOOKMARK_NEXT:
  2170.       EditJumpToBookmark(hwndEdit,TRUE);
  2171.       break;
  2172.  
  2173.  
  2174.     case IDM_EDIT_BOOKMARK_PREV:
  2175.       EditJumpToBookmark(hwndEdit,FALSE);
  2176.       break;
  2177.  
  2178.  
  2179.     case IDM_EDIT_BOOKMARK_TOGGLE:
  2180.       EditToggleBookmark(hwndEdit);
  2181.       break;
  2182.  
  2183.  
  2184.     case IDM_EDIT_BOOKMARK_CLEARALL:
  2185.       EditClearAllBookmarks(hwndEdit);
  2186.       break;
  2187.  
  2188.  
  2189.     case IDM_EDIT_FIND:
  2190.       EditFindReplaceDlg(hwndEdit,&efrData,FALSE);
  2191.       cpLastFind = SendMessage(hwndEdit,SCI_GETCODEPAGE,0,0);
  2192.       break;
  2193.  
  2194.  
  2195.     case IDM_EDIT_FINDNEXT:
  2196.       if (IsWindowsNT()) {
  2197.         UINT cp = SendMessage(hwndEdit,SCI_GETCODEPAGE,0,0);
  2198.         if (cpLastFind != cp) {
  2199.           if (cp != SC_CP_UTF8) {
  2200.             WCHAR wszFind[256];
  2201.             MultiByteToWideChar(CP_UTF8,0,efrData.szFindUTF8,-1,wszFind,COUNTOF(wszFind));
  2202.             WideCharToMultiByte(cp,0,wszFind,-1,efrData.szFind,COUNTOF(efrData.szFind),NULL,NULL); }
  2203.           else
  2204.             lstrcpy(efrData.szFind,efrData.szFindUTF8); }
  2205.           cpLastFind = cp; }
  2206.       EditFindNext(hwndEdit,&efrData);
  2207.       break;
  2208.  
  2209.  
  2210.     case IDM_EDIT_FINDPREV:
  2211.       if (IsWindowsNT()) {
  2212.         UINT cp = SendMessage(hwndEdit,SCI_GETCODEPAGE,0,0);
  2213.         if (cpLastFind != cp) {
  2214.           if (cp != SC_CP_UTF8) {
  2215.             WCHAR wszFind[256];
  2216.             MultiByteToWideChar(CP_UTF8,0,efrData.szFindUTF8,-1,wszFind,COUNTOF(wszFind));
  2217.             WideCharToMultiByte(cp,0,wszFind,-1,efrData.szFind,COUNTOF(efrData.szFind),NULL,NULL); }
  2218.           else
  2219.             lstrcpy(efrData.szFind,efrData.szFindUTF8); }
  2220.           cpLastFind = cp; }
  2221.       EditFindPrev(hwndEdit,&efrData);
  2222.       break;
  2223.  
  2224.  
  2225.     case IDM_EDIT_REPLACE:
  2226.       EditFindReplaceDlg(hwndEdit,&efrData,TRUE);
  2227.       cpLastFind = SendMessage(hwndEdit,SCI_GETCODEPAGE,0,0);
  2228.       break;
  2229.  
  2230.  
  2231.     case IDM_VIEW_SCHEME:
  2232.       Style_SelectLexerDlg(hwndEdit);
  2233.       UpdateStatusbar();
  2234.       UpdateLineNumberWidth();
  2235.       break;
  2236.  
  2237.  
  2238.     case IDM_VIEW_USE2NDDEFAULT:
  2239.       Style_ToggleUse2ndDefault(hwndEdit);
  2240.       UpdateStatusbar();
  2241.       UpdateLineNumberWidth();
  2242.       break;
  2243.  
  2244.  
  2245.     case IDM_VIEW_SCHEMECONFIG:
  2246.       Style_ConfigDlg(hwndEdit);
  2247.       UpdateStatusbar();
  2248.       UpdateLineNumberWidth();
  2249.       break;
  2250.  
  2251.  
  2252.     case IDM_VIEW_WORDWRAP:
  2253.       fWordWrap = (fWordWrap) ? FALSE : TRUE;
  2254.       SendMessage(hwndEdit,SCI_SETWRAPMODE,(fWordWrap)?SC_WRAP_WORD:SC_WRAP_NONE,0);
  2255.       UpdateToolbar();
  2256.       break;
  2257.  
  2258.  
  2259.     case IDM_VIEW_WORDWRAPSETTINGS:
  2260.       if (WordWrapSettingsDlg(hwnd,IDD_WORDWRAP,&iWordWrapIndent))
  2261.       {
  2262.         iWordWrapIndent = max(min(iWordWrapIndent,1024),0);
  2263.         SendMessage(hwndEdit,SCI_SETWRAPSTARTINDENT,iWordWrapIndent,0);
  2264.  
  2265.         if (bShowWordWrapSymbols) {
  2266.           SendMessage(hwndEdit,SCI_SETWRAPVISUALFLAGSLOCATION,WrapSymbols[iWordWrapSymbols].location,0);
  2267.           SendMessage(hwndEdit,SCI_SETWRAPVISUALFLAGS,WrapSymbols[iWordWrapSymbols].flags,0); }
  2268.         else {
  2269.           SendMessage(hwndEdit,SCI_SETWRAPVISUALFLAGS,0,0); }
  2270.       }
  2271.       break;
  2272.  
  2273.  
  2274.     case IDM_VIEW_LONGLINEMARKER:
  2275.       bMarkLongLines = (bMarkLongLines) ? FALSE: TRUE;
  2276.       if (bMarkLongLines) {
  2277.         SendMessage(hwndEdit,SCI_SETEDGEMODE,(iLongLineMode == EDGE_LINE)?EDGE_LINE:EDGE_BACKGROUND,0);
  2278.         Style_SetLongLineColors(hwndEdit); }
  2279.       else
  2280.         SendMessage(hwndEdit,SCI_SETEDGEMODE,EDGE_NONE,0);
  2281.       break;
  2282.  
  2283.  
  2284.     case IDM_VIEW_LONGLINESETTINGS:
  2285.       if (LongLineSettingsDlg(hwnd,IDD_LONGLINES,&iLongLinesLimit))
  2286.       {
  2287.         bMarkLongLines = TRUE;
  2288.         SendMessage(hwndEdit,SCI_SETEDGEMODE,(iLongLineMode == EDGE_LINE)?EDGE_LINE:EDGE_BACKGROUND,0);
  2289.         Style_SetLongLineColors(hwndEdit);
  2290.         iLongLinesLimit = max(min(iLongLinesLimit,1024),0);
  2291.         SendMessage(hwndEdit,SCI_SETEDGECOLUMN,iLongLinesLimit,0);
  2292.       }
  2293.       break;
  2294.  
  2295.  
  2296.     case IDM_VIEW_TABSASSPACES:
  2297.       bTabsAsSpaces = (bTabsAsSpaces) ? FALSE : TRUE;
  2298.       SendMessage(hwndEdit,SCI_SETUSETABS,!bTabsAsSpaces,0);
  2299.       break;
  2300.  
  2301.  
  2302.     case IDM_VIEW_TABSETTINGS:
  2303.       if (TabSettingsDlg(hwnd,IDD_TABSETTINGS,&iTabWidth))
  2304.       {
  2305.         SendMessage(hwndEdit,SCI_SETUSETABS,!bTabsAsSpaces,0);
  2306.         iTabWidth = max(min(iTabWidth,24),1);
  2307.         SendMessage(hwndEdit,SCI_SETTABWIDTH,iTabWidth,0);
  2308.         SendMessage(hwndEdit,SCI_SETINDENT,0,0);
  2309.       }
  2310.       break;
  2311.  
  2312.  
  2313.     case IDM_VIEW_SHOWINDENTGUIDES:
  2314.       bShowIndentGuides = (bShowIndentGuides) ? FALSE : TRUE;
  2315.       SendMessage(hwndEdit,SCI_SETINDENTATIONGUIDES,bShowIndentGuides,0);
  2316.       break;
  2317.  
  2318.  
  2319.     case IDM_VIEW_AUTOINDENTTEXT:
  2320.       bAutoIndent = (bAutoIndent) ? FALSE : TRUE;
  2321.       break;
  2322.  
  2323.  
  2324.     case IDM_VIEW_LINENUMBERS:
  2325.       bShowLineNumbers = (bShowLineNumbers) ? FALSE : TRUE;
  2326.       UpdateLineNumberWidth();
  2327.       //SendMessage(hwndEdit,SCI_SETMARGINWIDTHN,0,
  2328.       //  (bShowLineNumbers)?SendMessage(hwndEdit,SCI_TEXTWIDTH,STYLE_LINENUMBER,(LPARAM)"_999999_"):0);
  2329.       break;
  2330.  
  2331.  
  2332.     case IDM_VIEW_MARGIN:
  2333.       bShowSelectionMargin = (bShowSelectionMargin) ? FALSE : TRUE;
  2334.       SendMessage(hwndEdit,SCI_SETMARGINWIDTHN,1,(bShowSelectionMargin)?16:0);
  2335.       break;
  2336.  
  2337.  
  2338.     case IDM_VIEW_SHOWWHITESPACE:
  2339.       bViewWhiteSpace = (bViewWhiteSpace) ? FALSE : TRUE;
  2340.       SendMessage(hwndEdit,SCI_SETVIEWWS,(bViewWhiteSpace)?SCWS_VISIBLEALWAYS:SCWS_INVISIBLE,0);
  2341.       break;
  2342.  
  2343.  
  2344.     case IDM_VIEW_SHOWEOLS:
  2345.       bViewEOLs = (bViewEOLs) ? FALSE : TRUE;
  2346.       SendMessage(hwndEdit,SCI_SETVIEWEOL,bViewEOLs,0);
  2347.       break;
  2348.  
  2349.  
  2350.     case IDM_VIEW_WORDWRAPSYMBOLS:
  2351.       bShowWordWrapSymbols = (bShowWordWrapSymbols) ? 0 : 1;
  2352.       if (bShowWordWrapSymbols) {
  2353.         SendMessage(hwndEdit,SCI_SETWRAPVISUALFLAGSLOCATION,WrapSymbols[iWordWrapSymbols].location,0);
  2354.         SendMessage(hwndEdit,SCI_SETWRAPVISUALFLAGS,WrapSymbols[iWordWrapSymbols].flags,0); }
  2355.       else {
  2356.         SendMessage(hwndEdit,SCI_SETWRAPVISUALFLAGS,0,0); }
  2357.       break;
  2358.  
  2359.  
  2360.     case IDM_VIEW_MATCHBRACES:
  2361.       bMatchBraces = (bMatchBraces) ? FALSE : TRUE;
  2362.       if (!bMatchBraces)
  2363.         SendMessage(hwndEdit,SCI_BRACEHIGHLIGHT,(WPARAM)-1,(LPARAM)-1);
  2364.       break;
  2365.  
  2366.  
  2367.     case IDM_VIEW_AUTOCLOSETAGS:
  2368.       bAutoCloseTags = (bAutoCloseTags) ? FALSE : TRUE;
  2369.       break;
  2370.  
  2371.  
  2372.     case IDM_VIEW_ZOOMIN:
  2373.       SendMessage(hwndEdit,SCI_ZOOMIN,0,0);
  2374.       //UpdateLineNumberWidth();
  2375.       break;
  2376.  
  2377.  
  2378.     case IDM_VIEW_ZOOMOUT:
  2379.       SendMessage(hwndEdit,SCI_ZOOMOUT,0,0);
  2380.       //UpdateLineNumberWidth();
  2381.       break;
  2382.  
  2383.  
  2384.     case IDM_VIEW_RESETZOOM:
  2385.       SendMessage(hwndEdit,SCI_SETZOOM,0,0);
  2386.       //UpdateLineNumberWidth();
  2387.       break;
  2388.  
  2389.  
  2390.     case IDM_VIEW_TOOLBAR:
  2391.       if (bShowToolbar) {
  2392.         bShowToolbar = 0;
  2393.         ShowWindow(hwndReBar,SW_HIDE); }
  2394.       else {
  2395.         bShowToolbar = 1;
  2396.         UpdateToolbar();
  2397.         ShowWindow(hwndReBar,SW_SHOW); }
  2398.       SendWMSize(hwnd);
  2399.       break;
  2400.  
  2401.  
  2402.     case IDM_VIEW_CUSTOMIZETB:
  2403.       SendMessage(hwndToolbar,TB_CUSTOMIZE,0,0);
  2404.       break;
  2405.  
  2406.  
  2407.     case IDM_VIEW_STATUSBAR:
  2408.       if (bShowStatusbar) {
  2409.         bShowStatusbar = 0;
  2410.         ShowWindow(hwndStatus,SW_HIDE); }
  2411.       else {
  2412.         bShowStatusbar = 1;
  2413.         UpdateStatusbar();
  2414.         ShowWindow(hwndStatus,SW_SHOW); }
  2415.       SendWMSize(hwnd);
  2416.       break;
  2417.  
  2418.  
  2419.     case IDM_VIEW_REUSEWINDOW:
  2420.       if (RegGetAppIntEx("Settings","ReuseWindow2",0))
  2421.         RegSetAppIntEx("Settings","ReuseWindow2",0);
  2422.       else
  2423.         RegSetAppIntEx("Settings","ReuseWindow2",1);
  2424.       break;
  2425.  
  2426.  
  2427.     case IDM_VIEW_ALWAYSONTOP:
  2428.       if (bAlwaysOnTop) {
  2429.         bAlwaysOnTop = 0;
  2430.         SetWindowPos(hwnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); }
  2431.       else {
  2432.         bAlwaysOnTop = 1;
  2433.         SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); }
  2434.       break;
  2435.  
  2436.  
  2437.     case IDM_VIEW_MINTOTRAY:
  2438.       bMinimizeToTray =(bMinimizeToTray) ? FALSE : TRUE;
  2439.       break;
  2440.  
  2441.  
  2442.     case IDM_VIEW_TRANSPARENT:
  2443.       bTransparentMode =(bTransparentMode) ? FALSE : TRUE;
  2444.       SetWindowTransparentMode(hwnd,bTransparentMode);
  2445.       break;
  2446.  
  2447.  
  2448.     case IDM_VIEW_SHOWFULLPATH:
  2449.       bShortPathNames = (bShortPathNames) ? FALSE : TRUE;
  2450.       SetWindowTitle(hwnd,uidsAppTitle,IDS_UNTITLED,szCurFile,
  2451.         bShortPathNames,bModified || iCodePage != iInitialCP,
  2452.         IDS_READONLY,bReadOnly);
  2453.       break;
  2454.  
  2455.  
  2456.     case IDM_VIEW_NOSAVERECENT:
  2457.       bSaveRecentFiles = (bSaveRecentFiles) ? FALSE : TRUE;
  2458.       break;
  2459.  
  2460.  
  2461.     case IDM_VIEW_NOSAVEFINDREPL:
  2462.       bSaveFindReplace = (bSaveFindReplace) ? FALSE : TRUE;
  2463.       break;
  2464.  
  2465.  
  2466.     case IDM_VIEW_SAVEVEFORERUNNINGTOOLS:
  2467.       bSaveBeforeRunningTools = (bSaveBeforeRunningTools) ? FALSE : TRUE;
  2468.       break;
  2469.  
  2470.  
  2471.     case IDM_VIEW_ESCMINIMIZE:
  2472.       iEscFunction = 1;
  2473.       break;
  2474.  
  2475.  
  2476.  
  2477.     case IDM_VIEW_ESCEXIT:
  2478.       iEscFunction = 2;
  2479.       break;
  2480.  
  2481.  
  2482.     case IDM_VIEW_NOESNFUNC:
  2483.       iEscFunction = 0;
  2484.       break;
  2485.  
  2486.  
  2487.     case IDM_VIEW_SAVESETTINGS:
  2488.       bSaveSettings = (bSaveSettings) ? FALSE : TRUE;
  2489.       break;
  2490.  
  2491.  
  2492.     case IDM_VIEW_SAVESETTINGSNOW:
  2493.       SaveSettings(TRUE);
  2494.       MsgBox(MBINFO,IDS_SAVESETTINGS);
  2495.       break;
  2496.  
  2497.  
  2498.     case IDM_HELP_ABOUT:
  2499.       DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_ABOUT),
  2500.         hwnd,AboutDlgProc);
  2501.       break;
  2502.  
  2503.  
  2504.     case CMD_ESCAPE:
  2505.       if (iEscFunction == 1)
  2506.         SendMessage(hwnd,WM_SYSCOMMAND,SC_MINIMIZE,0);
  2507.       else if (iEscFunction == 2)
  2508.         SendMessage(hwnd,WM_CLOSE,0,0);
  2509.       break;
  2510.  
  2511.  
  2512.     // Newline with toggled auto indent setting
  2513.     case CMD_CTRLENTER:
  2514.       bAutoIndent = (bAutoIndent) ? 0 : 1;
  2515.       SendMessage(hwndEdit,SCI_NEWLINE,0,0);
  2516.       bAutoIndent = (bAutoIndent) ? 0 : 1;
  2517.       break;
  2518.  
  2519.  
  2520.     case CMD_SHIFTF8:
  2521.       {
  2522.         char tchCurFile2[MAX_PATH];
  2523.         if (lstrlen(szCurFile)) {
  2524.           lstrcpy(tchCurFile2,szCurFile);
  2525.           FileLoad(FALSE,FALSE,TRUE,TRUE,tchCurFile2); } }
  2526.       break;
  2527.  
  2528.  
  2529.     case CMD_LEXDEFAULT:
  2530.       Style_SetDefaultLexer(hwndEdit);
  2531.       UpdateStatusbar();
  2532.       UpdateLineNumberWidth();
  2533.       break;
  2534.  
  2535.  
  2536.     case CMD_LEXHTML:
  2537.       Style_SetHTMLLexer(hwndEdit);
  2538.       UpdateStatusbar();
  2539.       UpdateLineNumberWidth();
  2540.       break;
  2541.  
  2542.  
  2543.     case CMD_LEXXML:
  2544.       Style_SetXMLLexer(hwndEdit);
  2545.       UpdateStatusbar();
  2546.       UpdateLineNumberWidth();
  2547.       break;
  2548.  
  2549.  
  2550.     case CMD_WEBACTION1:
  2551.     case CMD_WEBACTION2:
  2552.       {
  2553.         HKEY  hKey;
  2554.         BOOL  bCmdEnabled = FALSE;
  2555.         LPSTR lpszTemplateName;
  2556.         char  szCmdTemplate[256];
  2557.         LPSTR lpszSelection;
  2558.         DWORD cchSelection;
  2559.         LPSTR lpsz;
  2560.         LPSTR lpszCommand;
  2561.         LPSTR lpszArgs;
  2562.         SHELLEXECUTEINFO sei;
  2563.  
  2564.         lpszTemplateName = (LOWORD(wParam) == CMD_WEBACTION1) ? "WebTemplate1" : "WebTemplate2";
  2565.  
  2566.         hKey = RegGetAppKey("Settings");
  2567.         bCmdEnabled = RegGetString(hKey,lpszTemplateName,"",szCmdTemplate,COUNTOF(szCmdTemplate));
  2568.         RegCloseKey(hKey);
  2569.  
  2570.         if (bCmdEnabled) {
  2571.  
  2572.           cchSelection = SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0) -
  2573.                           SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
  2574.  
  2575.           if (cchSelection > 0 && cchSelection < 256)
  2576.           {
  2577.             lpszSelection = GlobalAlloc(GPTR,cchSelection+2);
  2578.             SendMessage(hwndEdit,SCI_GETSELTEXT,0,(LPARAM)lpszSelection);
  2579.  
  2580.             // Check lpszSelection and truncate bad chars
  2581.             lpsz = strchr(lpszSelection,13);
  2582.             if (lpsz) *lpsz = '\0';
  2583.  
  2584.             lpsz = strchr(lpszSelection,10);
  2585.             if (lpsz) *lpsz = '\0';
  2586.  
  2587.             lpsz = strchr(lpszSelection,9);
  2588.             if (lpsz) *lpsz = '\0';
  2589.  
  2590.             if (lstrlen(lpszSelection)) {
  2591.  
  2592.               lpszCommand = GlobalAlloc(GPTR,GlobalSize(lpszSelection)+COUNTOF(szCmdTemplate)+MAX_PATH+32);
  2593.               wsprintf(lpszCommand,szCmdTemplate,lpszSelection);
  2594.               ExpandEnvironmentStringsEx(lpszCommand,GlobalSize(lpszCommand));
  2595.  
  2596.               lpszArgs = GlobalAlloc(GPTR,GlobalSize(lpszCommand));
  2597.               ExtractFirstArgument(lpszCommand,lpszCommand,lpszArgs);
  2598.  
  2599.               ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
  2600.  
  2601.               sei.cbSize = sizeof(SHELLEXECUTEINFO);
  2602.               sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  2603.               sei.hwnd = NULL;
  2604.               sei.lpVerb = NULL;
  2605.               sei.lpFile = lpszCommand;
  2606.               sei.lpParameters = lpszArgs;
  2607.               sei.lpDirectory = NULL;
  2608.               sei.nShow = SW_SHOWNORMAL;
  2609.  
  2610.               ShellExecuteEx(&sei);
  2611.  
  2612.               GlobalFree(lpszSelection);
  2613.               GlobalFree(lpszCommand);
  2614.             }
  2615.           }
  2616.         }
  2617.       }
  2618.       break;
  2619.  
  2620.  
  2621.     case IDT_FILE_NEW:
  2622.       if (IsCmdEnabled(hwnd,IDM_FILE_NEW))
  2623.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_FILE_NEW,1),0);
  2624.       else
  2625.         MessageBeep(0);
  2626.       break;
  2627.  
  2628.  
  2629.     case IDT_FILE_OPEN:
  2630.       if (IsCmdEnabled(hwnd,IDM_FILE_OPEN))
  2631.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_FILE_OPEN,1),0);
  2632.       else
  2633.         MessageBeep(0);
  2634.       break;
  2635.  
  2636.  
  2637.     case IDT_FILE_METAPATH:
  2638.       if (IsCmdEnabled(hwnd,IDM_FILE_METAPATH))
  2639.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_FILE_METAPATH,1),0);
  2640.       else
  2641.         MessageBeep(0);
  2642.       break;
  2643.  
  2644.  
  2645.     case IDT_FILE_SAVE:
  2646.       if (IsCmdEnabled(hwnd,IDM_FILE_SAVE))
  2647.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_FILE_SAVE,1),0);
  2648.       else
  2649.         MessageBeep(0);
  2650.       break;
  2651.  
  2652.  
  2653.     case IDT_EDIT_UNDO:
  2654.       if (IsCmdEnabled(hwnd,IDM_EDIT_UNDO))
  2655.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_UNDO,1),0);
  2656.       else
  2657.         MessageBeep(0);
  2658.       break;
  2659.  
  2660.  
  2661.     case IDT_EDIT_REDO:
  2662.       if (IsCmdEnabled(hwnd,IDM_EDIT_REDO))
  2663.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_REDO,1),0);
  2664.       else
  2665.         MessageBeep(0);
  2666.       break;
  2667.  
  2668.  
  2669.     case IDT_EDIT_CUT:
  2670.       if (IsCmdEnabled(hwnd,IDM_EDIT_CUT))
  2671.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_CUT,1),0);
  2672.       else
  2673.         MessageBeep(0);
  2674.       break;
  2675.  
  2676.  
  2677.     case IDT_EDIT_COPY:
  2678.       if (IsCmdEnabled(hwnd,IDM_EDIT_COPY))
  2679.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_COPY,1),0);
  2680.       else
  2681.         MessageBeep(0);
  2682.       break;
  2683.  
  2684.  
  2685.     case IDT_EDIT_PASTE:
  2686.       if (IsCmdEnabled(hwnd,IDM_EDIT_PASTE))
  2687.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_PASTE,1),0);
  2688.       else
  2689.         MessageBeep(0);
  2690.       break;
  2691.  
  2692.  
  2693.     case IDT_EDIT_FIND:
  2694.       if (IsCmdEnabled(hwnd,IDM_EDIT_FIND))
  2695.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_FIND,1),0);
  2696.       else
  2697.         MessageBeep(0);
  2698.       break;
  2699.  
  2700.  
  2701.     case IDT_EDIT_REPLACE:
  2702.       if (IsCmdEnabled(hwnd,IDM_EDIT_REPLACE))
  2703.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_REPLACE,1),0);
  2704.       else
  2705.         MessageBeep(0);
  2706.       break;
  2707.  
  2708.  
  2709.     case IDT_VIEW_WORDWRAP:
  2710.       if (IsCmdEnabled(hwnd,IDM_VIEW_WORDWRAP))
  2711.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_VIEW_WORDWRAP,1),0);
  2712.       else
  2713.         MessageBeep(0);
  2714.       break;
  2715.  
  2716.  
  2717.     case IDT_VIEW_ZOOMIN:
  2718.       if (IsCmdEnabled(hwnd,IDM_VIEW_ZOOMIN))
  2719.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_VIEW_ZOOMIN,1),0);
  2720.       else
  2721.         MessageBeep(0);
  2722.       break;
  2723.  
  2724.  
  2725.     case IDT_VIEW_ZOOMOUT:
  2726.       if (IsCmdEnabled(hwnd,IDM_VIEW_ZOOMOUT))
  2727.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_VIEW_ZOOMOUT,1),0);
  2728.       else
  2729.         MessageBeep(0);
  2730.       break;
  2731.  
  2732.  
  2733.     case IDT_VIEW_SCHEME:
  2734.       if (IsCmdEnabled(hwnd,IDM_VIEW_SCHEME))
  2735.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_VIEW_SCHEME,1),0);
  2736.       else
  2737.         MessageBeep(0);
  2738.       break;
  2739.  
  2740.  
  2741.     case IDT_VIEW_SCHEMECONFIG:
  2742.       if (IsCmdEnabled(hwnd,IDM_VIEW_SCHEMECONFIG))
  2743.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_VIEW_SCHEMECONFIG,1),0);
  2744.       else
  2745.         MessageBeep(0);
  2746.       break;
  2747.  
  2748.  
  2749.     case IDT_FILE_EXIT:
  2750.       SendMessage(hwnd,WM_CLOSE,0,0);
  2751.       break;
  2752.  
  2753.  
  2754.     case IDT_FILE_SAVEAS:
  2755.       if (IsCmdEnabled(hwnd,IDM_FILE_SAVEAS))
  2756.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_FILE_SAVEAS,1),0);
  2757.       else
  2758.         MessageBeep(0);
  2759.       break;
  2760.  
  2761.  
  2762.     case IDT_FILE_SAVECOPY:
  2763.       if (IsCmdEnabled(hwnd,IDM_FILE_SAVECOPY))
  2764.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_FILE_SAVECOPY,1),0);
  2765.       else
  2766.         MessageBeep(0);
  2767.       break;
  2768.  
  2769.  
  2770.     case IDT_EDIT_COPYALL:
  2771.       if (IsCmdEnabled(hwnd,IDM_EDIT_COPYALL))
  2772.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_COPYALL,1),0);
  2773.       else
  2774.         MessageBeep(0);
  2775.       break;
  2776.  
  2777.  
  2778.     case IDT_EDIT_CLEAR:
  2779.       if (IsCmdEnabled(hwnd,IDM_EDIT_CLEAR))
  2780.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_CLEAR,1),0);
  2781.       else
  2782.         MessageBeep(0);
  2783.       break;
  2784.  
  2785.  
  2786.     case IDT_EDIT_FINDNEXT:
  2787.       if (IsCmdEnabled(hwnd,IDM_EDIT_FINDNEXT))
  2788.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_FINDNEXT,1),0);
  2789.       else
  2790.         MessageBeep(0);
  2791.       break;
  2792.  
  2793.  
  2794.  
  2795.     case IDT_EDIT_FINDPREV:
  2796.       if (IsCmdEnabled(hwnd,IDM_EDIT_FINDPREV))
  2797.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_FINDPREV,1),0);
  2798.       else
  2799.         MessageBeep(0);
  2800.       break;
  2801.  
  2802.  
  2803.     case IDT_FILE_PRINT:
  2804.       if (IsCmdEnabled(hwnd,IDM_FILE_PRINT))
  2805.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_FILE_PRINT,1),0);
  2806.       else
  2807.         MessageBeep(0);
  2808.       break;
  2809.  
  2810.  
  2811.     case IDT_FILE_OPENFAV:
  2812.       if (IsCmdEnabled(hwnd,IDM_FILE_OPENFAV))
  2813.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_FILE_OPENFAV,1),0);
  2814.       else
  2815.         MessageBeep(0);
  2816.       break;
  2817.  
  2818.  
  2819.     case IDT_FILE_ADDTOFAV:
  2820.       if (IsCmdEnabled(hwnd,IDM_FILE_ADDTOFAV))
  2821.         SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_FILE_ADDTOFAV,1),0);
  2822.       else
  2823.         MessageBeep(0);
  2824.       break;
  2825.  
  2826.   }
  2827.  
  2828.   return(0);
  2829.  
  2830. }
  2831.  
  2832.  
  2833. //=============================================================================
  2834. //
  2835. //  MsgNotify() - Handles WM_NOTIFY
  2836. //
  2837. //
  2838. LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam)
  2839. {
  2840.  
  2841.   LPNMHDR pnmh = (LPNMHDR)lParam;
  2842.   struct SCNotification* scn = (struct SCNotification*)lParam;
  2843.  
  2844.   switch(pnmh->idFrom)
  2845.   {
  2846.  
  2847.     case IDC_EDIT:
  2848.  
  2849.       switch(pnmh->code)
  2850.       {
  2851.         case SCN_UPDATEUI:
  2852.           UpdateToolbar();
  2853.           UpdateStatusbar();
  2854.  
  2855.           // Brace Match
  2856.           if (bMatchBraces)
  2857.           {
  2858.             int iPos = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  2859.             char c = (char)SendMessage(hwndEdit,SCI_GETCHARAT,iPos,0);
  2860.             if (StrChr("()[]{}",c)) {
  2861.               int iBrace2 = SendMessage(hwndEdit,SCI_BRACEMATCH,iPos,0);
  2862.               if (iBrace2 != -1)
  2863.                 SendMessage(hwndEdit,SCI_BRACEHIGHLIGHT,iPos,iBrace2);
  2864.               else
  2865.                 SendMessage(hwndEdit,SCI_BRACEBADLIGHT,iPos,0);
  2866.             }
  2867.             // Try one before
  2868.             else
  2869.             {
  2870.               iPos = SendMessage(hwndEdit,SCI_POSITIONBEFORE,iPos,0);
  2871.               c = (char)SendMessage(hwndEdit,SCI_GETCHARAT,iPos,0);
  2872.               if (StrChr("()[]{}",c)) {
  2873.                 int iBrace2 = SendMessage(hwndEdit,SCI_BRACEMATCH,iPos,0);
  2874.                 if (iBrace2 != -1)
  2875.                   SendMessage(hwndEdit,SCI_BRACEHIGHLIGHT,iPos,iBrace2);
  2876.                 else
  2877.                   SendMessage(hwndEdit,SCI_BRACEBADLIGHT,iPos,0);
  2878.               }
  2879.               else
  2880.                 SendMessage(hwndEdit,SCI_BRACEHIGHLIGHT,(WPARAM)-1,(LPARAM)-1);
  2881.             }
  2882.           }
  2883.           break;
  2884.  
  2885.         case SCN_CHARADDED:
  2886.           // Auto indent
  2887.           if (bAutoIndent && (scn->ch == '\x0D' || scn->ch == '\x0A'))
  2888.           {
  2889.             // in CRLF mode handle LF only...
  2890.             if ((SC_EOL_CRLF == iEOLMode && scn->ch != '\x0A') || SC_EOL_CRLF != iEOLMode)
  2891.             {
  2892.               char *pLineBuf;
  2893.               char *pPos;
  2894.               //int  iIndentLen;
  2895.  
  2896.               int iCurPos    = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  2897.               //int iAnchorPos = SendMessage(hwndEdit,SCI_GETANCHOR,0,0);
  2898.               int iCurLine = SendMessage(hwndEdit,SCI_LINEFROMPOSITION,(WPARAM)iCurPos,0);
  2899.               int iLineLength = SendMessage(hwndEdit,SCI_LINELENGTH,iCurLine,0);
  2900.               //int iIndentBefore = SendMessage(hwndEdit,SCI_GETLINEINDENTATION,(WPARAM)iCurLine-1,0);
  2901.  
  2902.               if (iCurLine > 0/* && iLineLength <= 2*/)
  2903.               {
  2904.                 int iPrevLineLength = SendMessage(hwndEdit,SCI_LINELENGTH,iCurLine-1,0);
  2905.                 if (pLineBuf = GlobalAlloc(GPTR,iPrevLineLength+1))
  2906.                 {
  2907.                   SendMessage(hwndEdit,SCI_GETLINE,iCurLine-1,(LPARAM)pLineBuf);
  2908.                   *(pLineBuf+iPrevLineLength) = '\0';
  2909.                   for (pPos = pLineBuf; *pPos; pPos++) {
  2910.                     if (*pPos != ' ' && *pPos != '\t')
  2911.                       *pPos = '\0'; }
  2912.                   if (*pLineBuf) {
  2913.                     SendMessage(hwndEdit,SCI_BEGINUNDOACTION,0,0);
  2914.                     SendMessage(hwndEdit,SCI_ADDTEXT,lstrlen(pLineBuf),(LPARAM)pLineBuf);
  2915.                     SendMessage(hwndEdit,SCI_ENDUNDOACTION,0,0); }
  2916.                   GlobalFree(pLineBuf);
  2917.                   //int iIndent = SendMessage(hwndEdit,SCI_GETLINEINDENTATION,(WPARAM)iCurLine,0);
  2918.                   //SendMessage(hwndEdit,SCI_SETLINEINDENTATION,(WPARAM)iCurLine,(LPARAM)iIndentBefore);
  2919.                   //iIndentLen = /*- iIndent +*/ SendMessage(hwndEdit,SCI_GETLINEINDENTATION,(WPARAM)iCurLine,0);
  2920.                   //if (iIndentLen > 0)
  2921.                   //  SendMessage(hwndEdit,SCI_SETSEL,(WPARAM)iAnchorPos+iIndentLen,(LPARAM)iCurPos+iIndentLen);
  2922.                 }
  2923.               }
  2924.             }
  2925.           }
  2926.           // Auto close tags
  2927.           else if (bAutoCloseTags && scn->ch == '>')
  2928.           {
  2929.             int iLexer = SendMessage(hwndEdit,SCI_GETLEXER,0,0);
  2930.             if (iLexer == SCLEX_HTML || iLexer == SCLEX_XML)
  2931.             {
  2932.               char tchBuf[512];
  2933.               char tchIns[516] = "</";
  2934.               int  cchIns = 2;
  2935.               int  iCurPos = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  2936.               int  iHelper = iCurPos - (COUNTOF(tchBuf) - 1);
  2937.               int  iStartPos = max(0,iHelper);
  2938.               int  iSize = iCurPos - iStartPos;
  2939.  
  2940.               if (iSize >= 3) {
  2941.  
  2942.                 struct TextRange tr = { { iStartPos, iCurPos }, tchBuf };
  2943.                 SendMessage(hwndEdit,SCI_GETTEXTRANGE,0,(LPARAM)&tr);
  2944.  
  2945.                 if (tchBuf[iSize - 2] != '/') {
  2946.  
  2947.                   const char* pBegin = &tchBuf[0];
  2948.                   const char* pCur = &tchBuf[iSize - 2];
  2949.  
  2950.                   while (pCur > pBegin && *pCur != '<' && *pCur != '>')
  2951.                     --pCur;
  2952.  
  2953.                   if (*pCur == '<') {
  2954.                     pCur++;
  2955.                     while (StrChr(":_-.", *pCur) || IsCharAlphaNumeric(*pCur)) {
  2956.                       tchIns[cchIns++] = *pCur;
  2957.                       pCur++;
  2958.                     }
  2959.                   }
  2960.  
  2961.                   tchIns[cchIns++] = '>';
  2962.                   tchIns[cchIns] = 0;
  2963.  
  2964.                   if (cchIns > 3)
  2965.                   {
  2966.                     SendMessage(hwndEdit,SCI_BEGINUNDOACTION,0,0);
  2967.                     SendMessage(hwndEdit,SCI_REPLACESEL,0,(LPARAM)tchIns);
  2968.                     SendMessage(hwndEdit,SCI_SETSEL,iCurPos,iCurPos);
  2969.                     SendMessage(hwndEdit,SCI_ENDUNDOACTION,0,0);
  2970.                   }
  2971.                 }
  2972.               }
  2973.             }
  2974.           }
  2975.           break;
  2976.  
  2977.         case SCN_MODIFIED:
  2978.         case SCN_ZOOM:
  2979.           UpdateLineNumberWidth();
  2980.           break;
  2981.  
  2982.         case SCN_SAVEPOINTREACHED:
  2983.           bModified = FALSE;
  2984.           SetWindowTitle(hwnd,uidsAppTitle,IDS_UNTITLED,szCurFile,
  2985.             bShortPathNames,bModified || iCodePage != iInitialCP,
  2986.             IDS_READONLY,bReadOnly);
  2987.           break;
  2988.  
  2989.         case SCN_SAVEPOINTLEFT:
  2990.           bModified = TRUE;
  2991.           SetWindowTitle(hwnd,uidsAppTitle,IDS_UNTITLED,szCurFile,
  2992.             bShortPathNames,bModified || iCodePage != iInitialCP,
  2993.             IDS_READONLY,bReadOnly);
  2994.           break;
  2995.       }
  2996.       break;
  2997.  
  2998.  
  2999.     case IDC_TOOLBAR:
  3000.  
  3001.       switch(pnmh->code)
  3002.       {
  3003.  
  3004.         case TBN_ENDADJUST:
  3005.           UpdateToolbar();
  3006.           break;
  3007.  
  3008.         case TBN_QUERYDELETE:
  3009.         case TBN_QUERYINSERT:
  3010.           return TRUE;
  3011.  
  3012.         case TBN_GETBUTTONINFO:
  3013.           {
  3014.             if (((LPTBNOTIFY)lParam)->iItem < COUNTOF(tbbMainWnd))
  3015.             {
  3016.               char tch[256];
  3017.               GetString(tbbMainWnd[((LPTBNOTIFY)lParam)->iItem].idCommand,tch,COUNTOF(tch));
  3018.               lstrcpyn(((LPTBNOTIFY)lParam)->pszText,/*strchr(tch,'\n')+1*/tch,((LPTBNOTIFY)lParam)->cchText);
  3019.               CopyMemory(&((LPTBNOTIFY)lParam)->tbButton,&tbbMainWnd[((LPTBNOTIFY)lParam)->iItem],sizeof(TBBUTTON));
  3020.               return TRUE;
  3021.             }
  3022.           }
  3023.           return FALSE;
  3024.  
  3025.         case TBN_RESET:
  3026.           {
  3027.             int i; int c = SendMessage(hwndToolbar,TB_BUTTONCOUNT,0,0);
  3028.             for (i = 0; i < c; i++)
  3029.               SendMessage(hwndToolbar,TB_DELETEBUTTON,0,0);
  3030.             SendMessage(hwndToolbar,TB_ADDBUTTONS,NUMINITIALTOOLS,(LPARAM)tbbMainWnd);
  3031.             return(0);
  3032.           }
  3033.  
  3034.       }
  3035.       break;
  3036.  
  3037.  
  3038.     case IDC_STATUSBAR:
  3039.  
  3040.       switch(pnmh->code)
  3041.       {
  3042.  
  3043.         case NM_DBLCLK:
  3044.           {
  3045.             int i;
  3046.             LPNMMOUSE pnmm = (LPNMMOUSE)lParam;
  3047.  
  3048.             switch (pnmm->dwItemSpec)
  3049.             {
  3050.               case STATUS_CODEPAGE:
  3051.                 if (iCodePage & NCP_UNICODE_REVERSE)
  3052.                   i = IDM_ENCODING_UNICODEREV;
  3053.                 else if (iCodePage & NCP_UNICODE)
  3054.                   i = IDM_ENCODING_UNICODE;
  3055.                 else if (iCodePage & NCP_UTF8_SIGN)
  3056.                   i = IDM_ENCODING_UTF8SIGN;
  3057.                 else if (iCodePage & NCP_UTF8)
  3058.                   i = IDM_ENCODING_UTF8;
  3059.                 else
  3060.                   i = IDM_ENCODING_ANSI;
  3061.                 i++;
  3062.                 if (i > IDM_ENCODING_UTF8SIGN)
  3063.                   i = IDM_ENCODING_ANSI;
  3064.                 SendMessage(hwnd,WM_COMMAND,MAKELONG(i,1),0);
  3065.                 return TRUE;
  3066.  
  3067.               case STATUS_EOLMODE:
  3068.                 if (iEOLMode == SC_EOL_CRLF)
  3069.                   i = IDM_LINEENDINGS_CRLF;
  3070.                 else if (iEOLMode == SC_EOL_LF)
  3071.                   i = IDM_LINEENDINGS_LF;
  3072.                 else
  3073.                   i = IDM_LINEENDINGS_CR;
  3074.                 i++;
  3075.                 if (i > IDM_LINEENDINGS_CR)
  3076.                   i = IDM_LINEENDINGS_CRLF;
  3077.                 SendMessage(hwnd,WM_COMMAND,MAKELONG(i,1),0);
  3078.                 return TRUE;
  3079.  
  3080.               case STATUS_LEXER:
  3081.                 SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_VIEW_SCHEME,1),0);
  3082.                 return TRUE;
  3083.  
  3084.               case STATUS_OVRMODE:
  3085.                 SendMessage(hwndEdit,SCI_EDITTOGGLEOVERTYPE,0,0);
  3086.                 return TRUE;
  3087.  
  3088.               default:
  3089.                 return FALSE;
  3090.             }
  3091.           }
  3092.           break;
  3093.  
  3094.       }
  3095.       break;
  3096.  
  3097.  
  3098.     default:
  3099.  
  3100.       switch(pnmh->code)
  3101.       {
  3102.  
  3103.         case TTN_NEEDTEXT:
  3104.           {
  3105.             char tch[256];
  3106.  
  3107.             if (((LPTOOLTIPTEXT)lParam)->uFlags == TTF_IDISHWND)
  3108.             {
  3109. /*            if (fTitleToolTip)
  3110.               {
  3111.                 PathCompactPathEx(((LPTOOLTIPTEXT)lParam)->szText,szCurDir,
  3112.                                   COUNTOF(((LPTOOLTIPTEXT)lParam)->szText),0);
  3113.               }*/
  3114.             }
  3115.  
  3116.             else
  3117.             {
  3118.               GetString(pnmh->idFrom,tch,COUNTOF(tch));
  3119.               lstrcpyn(((LPTOOLTIPTEXT)lParam)->szText,/*strchr(tch,'\n')+1*/tch,80);
  3120.             }
  3121.           }
  3122.           break;
  3123.  
  3124.       }
  3125.       break;
  3126.  
  3127.   }
  3128.  
  3129.  
  3130.   return(0);
  3131.  
  3132. }
  3133.  
  3134.  
  3135. //=============================================================================
  3136. //
  3137. //  LoadSettings()
  3138. //
  3139. //
  3140. void LoadSettings()
  3141. {
  3142.  
  3143.   HKEY hKey;
  3144.  
  3145.   hKey = RegGetAppKey("Settings");
  3146.  
  3147.   bSaveSettings =
  3148.     RegGetInt(hKey,"SaveSettings",1);
  3149.   if (bSaveSettings) bSaveSettings = 1;
  3150.  
  3151.   bSaveRecentFiles =
  3152.     RegGetInt(hKey,"SaveRecentFiles",0);
  3153.   if (bSaveRecentFiles) bSaveRecentFiles = 1;
  3154.  
  3155.   bSaveFindReplace =
  3156.     RegGetInt(hKey,"SaveFindReplace",0);
  3157.   if (bSaveFindReplace) bSaveFindReplace = 1;
  3158.  
  3159.   efrData.bFindClose = RegGetInt(hKey,"CloseFind",1);
  3160.   if (efrData.bFindClose) efrData.bReplaceClose = TRUE;
  3161.  
  3162.   efrData.bReplaceClose = RegGetInt(hKey,"CloseReplace",1);
  3163.   if (efrData.bReplaceClose) efrData.bReplaceClose = TRUE;
  3164.  
  3165.   if (!RegGetString(hKey,"OpenWithDir","",
  3166.         tchOpenWithDir,COUNTOF(tchOpenWithDir)))
  3167.     GetDefaultOpenWithDir(tchOpenWithDir,COUNTOF(tchOpenWithDir));
  3168.  
  3169.   if (!RegGetString(hKey,"Favorites","",
  3170.         tchFavoritesDir,COUNTOF(tchFavoritesDir)))
  3171.     GetDefaultFavoritesDir(tchFavoritesDir,COUNTOF(tchFavoritesDir));
  3172.  
  3173.   RegGetString(hKey,"DefaultExtension","txt",
  3174.     tchDefaultExtension,COUNTOF(tchDefaultExtension));
  3175.  
  3176.   RegGetString(hKey,"ToolbarBitmap","",
  3177.     tchToolbarBitmap,COUNTOF(tchToolbarBitmap));
  3178.   RegGetString(hKey,"ToolbarBitmapHot","",
  3179.     tchToolbarBitmapHot,COUNTOF(tchToolbarBitmap));
  3180.   RegGetString(hKey,"ToolbarBitmapDisabled","",
  3181.     tchToolbarBitmapDisabled,COUNTOF(tchToolbarBitmap));
  3182.  
  3183.   bShortPathNames = RegGetInt(hKey,"ShortPathNames",0);
  3184.   if (bShortPathNames) bShortPathNames = 1;
  3185.  
  3186.   fWordWrap = RegGetInt(hKey,"WordWrap",0);
  3187.   if (fWordWrap) fWordWrap = 1;
  3188.  
  3189.   iWordWrapIndent = RegGetInt(hKey,"WordWrapIndent",0);
  3190.   iWordWrapIndent = max(min(iWordWrapIndent,1024),0);
  3191.  
  3192.   iWordWrapSymbols = RegGetInt(hKey,"WordWrapSymbols",0);
  3193.   iWordWrapSymbols = max(min(iWordWrapSymbols,3),0);
  3194.  
  3195.   bShowWordWrapSymbols = RegGetInt(hKey,"ShowWordWrapSymbols",0);
  3196.   if (bShowWordWrapSymbols) bShowWordWrapSymbols = 1;
  3197.  
  3198.   bMatchBraces = RegGetInt(hKey,"MatchBraces",1);
  3199.   if (bMatchBraces) bMatchBraces = 1;
  3200.  
  3201.   bAutoIndent = RegGetInt(hKey,"AutoIndent",1);
  3202.   if (bAutoIndent) bAutoIndent = 1;
  3203.  
  3204.   bAutoCloseTags = RegGetInt(hKey,"AutoCloseTags",0);
  3205.   if (bAutoCloseTags) bAutoCloseTags = 1;
  3206.  
  3207.   bShowIndentGuides = RegGetInt(hKey,"ShowIndentGuides",0);
  3208.   if (bShowIndentGuides) bShowIndentGuides = 1;
  3209.  
  3210.   bTabsAsSpaces = RegGetInt(hKey,"TabsAsSpaces",0);
  3211.   if (bTabsAsSpaces) bTabsAsSpaces = 1;
  3212.  
  3213.   iTabWidth = RegGetInt(hKey,"TabWidth",4);
  3214.   iTabWidth = max(min(iTabWidth,24),1);
  3215.  
  3216.   bMarkLongLines = RegGetInt(hKey,"MarkLongLines",0);
  3217.   if (bMarkLongLines) bMarkLongLines = 1;
  3218.  
  3219.   iLongLinesLimit = RegGetInt(hKey,"LongLinesLimit",72);
  3220.   iLongLinesLimit = max(min(iLongLinesLimit,1024),0);
  3221.  
  3222.   iLongLineMode = RegGetInt(hKey,"LongLineMode",EDGE_LINE);
  3223.   iLongLineMode = max(min(iLongLineMode,EDGE_BACKGROUND),EDGE_LINE);
  3224.  
  3225.   bShowSelectionMargin = RegGetInt(hKey,"ShowSelectionMargin",1);
  3226.   if (bShowSelectionMargin) bShowSelectionMargin = 1;
  3227.  
  3228.   bShowLineNumbers = RegGetInt(hKey,"ShowLineNumbers",0);
  3229.   if (bShowLineNumbers) bShowLineNumbers = 1;
  3230.  
  3231.   bViewWhiteSpace = RegGetInt(hKey,"ViewWhiteSpace",0);
  3232.   if (bViewWhiteSpace) bViewWhiteSpace = 1;
  3233.  
  3234.   bViewEOLs = RegGetInt(hKey,"ViewEOLs",0);
  3235.   if (bViewEOLs) bViewEOLs = 1;
  3236.  
  3237.   iDefaultEncoding = RegGetInt(hKey,"DefaultEncoding",0);
  3238.   iDefaultEncoding = max(min(iDefaultEncoding,4),0);
  3239.  
  3240.   iDefaultEOLMode = RegGetInt(hKey,"DefaultEOLMode",0);
  3241.   iDefaultEOLMode = max(min(iDefaultEOLMode,2),0);
  3242.  
  3243.   iPrintHeader = RegGetInt(hKey,"PrintHeader",1);
  3244.   iPrintHeader = max(min(iPrintHeader,3),0);
  3245.  
  3246.   iPrintFooter = RegGetInt(hKey,"PrintFooter",0);
  3247.   iPrintFooter = max(min(iPrintFooter,1),0);
  3248.  
  3249.   iPrintZoom = RegGetInt(hKey,"PrintZoom",10)-10;
  3250.   iPrintZoom = max(min(iPrintZoom,20),-10);
  3251.  
  3252.   pagesetupMargin.left = RegGetInt(hKey,"PrintMarginLeft",0);
  3253.   pagesetupMargin.left = max(pagesetupMargin.left,0);
  3254.  
  3255.   pagesetupMargin.top = RegGetInt(hKey,"PrintMarginTop",0);
  3256.   pagesetupMargin.top = max(pagesetupMargin.top,0);
  3257.  
  3258.   pagesetupMargin.right = RegGetInt(hKey,"PrintMarginRight",0);
  3259.   pagesetupMargin.right = max(pagesetupMargin.right,0);
  3260.  
  3261.   pagesetupMargin.bottom = RegGetInt(hKey,"PrintMarginBottom",0);
  3262.   pagesetupMargin.bottom = max(pagesetupMargin.bottom,0);
  3263.  
  3264.   bSaveBeforeRunningTools = RegGetInt(hKey,"SaveBeforeRunningTools",0);
  3265.   if (bSaveBeforeRunningTools) bSaveBeforeRunningTools = 1;
  3266.  
  3267.   //bEnableFileWatching = RegGetInt(hKey,"EnableFileWatching",0);
  3268.   //if (bEnableFileWatching) bEnableFileWatching = 1;
  3269.  
  3270.   iEscFunction = RegGetInt(hKey,"EscFunction",0);
  3271.   iEscFunction = max(min(iEscFunction,2),0);
  3272.  
  3273.   bAlwaysOnTop = RegGetInt(hKey,"AlwaysOnTop",0);
  3274.   if (bAlwaysOnTop) bAlwaysOnTop = 1;
  3275.  
  3276.   bMinimizeToTray = RegGetInt(hKey,"MinimizeToTray",0);
  3277.   if (bMinimizeToTray) bMinimizeToTray = 1;
  3278.  
  3279.   bTransparentMode = RegGetInt(hKey,"TransparentMode",0);
  3280.   if (bTransparentMode) bTransparentMode = 1;
  3281.  
  3282.   // Check if SetLayeredWindowAttributes() is available
  3283.   bTransparentModeAvailable =
  3284.     (GetProcAddress(GetModuleHandle("User32"),"SetLayeredWindowAttributes") != NULL);
  3285.  
  3286.   bShowToolbar = RegGetInt(hKey,"ShowToolbar",1);
  3287.   if (bShowToolbar) bShowToolbar = 1;
  3288.  
  3289.   bShowStatusbar = RegGetInt(hKey,"ShowStatusbar",1);
  3290.   if (bShowStatusbar) bShowStatusbar = 1;
  3291.  
  3292.   cxFileMRUDlg = RegGetInt(hKey,"FileMRUDlgSizeX",0);
  3293.   cxFileMRUDlg = max(cxFileMRUDlg,0);
  3294.  
  3295.   cyFileMRUDlg = RegGetInt(hKey,"FileMRUDlgSizeY",0);
  3296.   cyFileMRUDlg = max(cyFileMRUDlg,0);
  3297.  
  3298.   cxOpenWithDlg = RegGetInt(hKey,"OpenWithDlgSizeX",0);
  3299.   cxOpenWithDlg = max(cxOpenWithDlg,0);
  3300.  
  3301.   cyOpenWithDlg = RegGetInt(hKey,"OpenWithDlgSizeY",0);
  3302.   cyOpenWithDlg = max(cyOpenWithDlg,0);
  3303.  
  3304.   cxFavoritesDlg = RegGetInt(hKey,"FavoritesDlgSizeX",0);
  3305.   cxFavoritesDlg = max(cxFavoritesDlg,0);
  3306.  
  3307.   cyFavoritesDlg = RegGetInt(hKey,"FavoritesDlgSizeY",0);
  3308.   cyFavoritesDlg = max(cyFavoritesDlg,0);
  3309.  
  3310.   RegCloseKey(hKey);
  3311.  
  3312.   hKey = RegGetAppKey("Window");
  3313.  
  3314.   if (!flagPosParam) { // ignore window position if /p was specified
  3315.     wi.x = RegGetInt(hKey,"PosX",CW_USEDEFAULT);
  3316.     wi.y = RegGetInt(hKey,"PosY",CW_USEDEFAULT);
  3317.     wi.cx = RegGetInt(hKey,"SizeX",CW_USEDEFAULT);
  3318.     wi.cy = RegGetInt(hKey,"SizeY",CW_USEDEFAULT);
  3319.     wi.max = RegGetInt(hKey,"Maximized",0);
  3320.     if (wi.max) wi.max = 1; }
  3321.  
  3322.   RegCloseKey(hKey);
  3323.  
  3324.   // Codepage and Character Set
  3325.   hKey = RegGetAppKey("International");
  3326.   iDefaultCodePage = RegGetInt(hKey,"CodePage",GetACP()/* default */);
  3327.   iDefaultCharSet  = RegGetInt(hKey,"CharSet",DEFAULT_CHARSET);
  3328.   bAutoSelACP = RegGetInt(hKey,"AutoSelACP",0) ? 1 : 0;
  3329.   RegCloseKey(hKey);
  3330.  
  3331.   // Check default charset
  3332.   if (bAutoSelACP)
  3333.     iDefaultCodePage = CodePageFromCharSet(iDefaultCharSet);
  3334.  
  3335.   // Scintilla Styles
  3336.   hKey = RegGetAppKey("Styles");
  3337.   Style_Load(hKey);
  3338.   RegCloseKey(hKey);
  3339.  
  3340. }
  3341.  
  3342.  
  3343. //=============================================================================
  3344. //
  3345. //  SaveSettings()
  3346. //
  3347. //
  3348. void SaveSettings(BOOL bSaveSettingsNow)
  3349. {
  3350.  
  3351.   HKEY hKey;
  3352.   TBSAVEPARAMS tbsp = { HKEY_CURRENT_USER, "Software\\Notepad2\\Toolbar", "Settings" };
  3353.  
  3354.   hKey = RegGetAppKey("Settings");
  3355.   RegSetInt(hKey,"SaveSettings",bSaveSettings);
  3356.   RegCloseKey(hKey);
  3357.  
  3358.   if (!bSaveSettings && !bSaveSettingsNow)
  3359.     return;
  3360.  
  3361.   // Save Toolbar configuration
  3362.   // hwndToolbar must be valid here!
  3363.   SendMessage(hwndToolbar,TB_SAVERESTORE,TRUE,(LPARAM)&tbsp);
  3364.  
  3365.   hKey = RegGetAppKey("Settings");
  3366.  
  3367.   RegSetInt(hKey,"SaveRecentFiles",bSaveRecentFiles);
  3368.   RegSetInt(hKey,"SaveFindReplace",bSaveFindReplace);
  3369.   RegSetInt(hKey,"CloseFind",efrData.bFindClose);
  3370.   RegSetInt(hKey,"CloseReplace",efrData.bReplaceClose);
  3371.   RegSetString(hKey,"OpenWithDir",tchOpenWithDir);
  3372.   RegSetString(hKey,"Favorites",tchFavoritesDir);
  3373.   //RegSetString(hKey,"DefaultExtension",tchDefaultExtension);
  3374.   RegSetInt(hKey,"ShortPathNames",bShortPathNames);
  3375.   RegSetInt(hKey,"WordWrap",fWordWrap);
  3376.   RegSetInt(hKey,"WordWrapIndent",iWordWrapIndent);
  3377.   RegSetInt(hKey,"WordWrapSymbols",iWordWrapSymbols);
  3378.   RegSetInt(hKey,"ShowWordWrapSymbols",bShowWordWrapSymbols);
  3379.   RegSetInt(hKey,"MatchBraces",bMatchBraces);
  3380.   RegSetInt(hKey,"AutoIndent",bAutoIndent);
  3381.   RegSetInt(hKey,"AutoCloseTags",bAutoCloseTags);
  3382.   RegSetInt(hKey,"ShowIndentGuides",bShowIndentGuides);
  3383.   RegSetInt(hKey,"TabsAsSpaces",bTabsAsSpaces);
  3384.   RegSetInt(hKey,"TabWidth",iTabWidth);
  3385.   RegSetInt(hKey,"MarkLongLines",bMarkLongLines);
  3386.   RegSetInt(hKey,"LongLinesLimit",iLongLinesLimit);
  3387.   RegSetInt(hKey,"LongLineMode",iLongLineMode);
  3388.   RegSetInt(hKey,"ShowSelectionMargin",bShowSelectionMargin);
  3389.   RegSetInt(hKey,"ShowLineNumbers",bShowLineNumbers);
  3390.   RegSetInt(hKey,"ViewWhiteSpace",bViewWhiteSpace);
  3391.   RegSetInt(hKey,"ViewEOLs",bViewEOLs);
  3392.   RegSetInt(hKey,"DefaultEncoding",iDefaultEncoding);
  3393.   RegSetInt(hKey,"DefaultEOLMode",iDefaultEOLMode);
  3394.   RegSetInt(hKey,"PrintHeader",iPrintHeader);
  3395.   RegSetInt(hKey,"PrintFooter",iPrintFooter);
  3396.   RegSetInt(hKey,"PrintZoom",iPrintZoom+10);
  3397.   RegSetInt(hKey,"PrintMarginLeft",pagesetupMargin.left);
  3398.   RegSetInt(hKey,"PrintMarginTop",pagesetupMargin.top);
  3399.   RegSetInt(hKey,"PrintMarginRight",pagesetupMargin.right);
  3400.   RegSetInt(hKey,"PrintMarginBottom",pagesetupMargin.bottom);
  3401.   RegSetInt(hKey,"SaveBeforeRunningTools",bSaveBeforeRunningTools);
  3402.   //RegSetInt(hKey,"EnableFileWatching",bEnableFileWatching);
  3403.   RegSetInt(hKey,"EscFunction",iEscFunction);
  3404.   RegSetInt(hKey,"AlwaysOnTop",bAlwaysOnTop);
  3405.   RegSetInt(hKey,"MinimizeToTray",bMinimizeToTray);
  3406.   RegSetInt(hKey,"TransparentMode",bTransparentMode);
  3407.   RegSetInt(hKey,"ShowToolbar",bShowToolbar);
  3408.   RegSetInt(hKey,"ShowStatusbar",bShowStatusbar);
  3409.   RegSetInt(hKey,"FileMRUDlgSizeX",cxFileMRUDlg);
  3410.   RegSetInt(hKey,"FileMRUDlgSizeY",cyFileMRUDlg);
  3411.   RegSetInt(hKey,"OpenWithDlgSizeX",cxOpenWithDlg);
  3412.   RegSetInt(hKey,"OpenWithDlgSizeY",cyOpenWithDlg);
  3413.   RegSetInt(hKey,"FavoritesDlgSizeX",cxFavoritesDlg);
  3414.   RegSetInt(hKey,"FavoritesDlgSizeY",cyFavoritesDlg);
  3415.  
  3416.   RegCloseKey(hKey);
  3417.  
  3418.   /*
  3419.     SaveSettingsNow(): query Window Dimensions
  3420.   */
  3421.  
  3422.   if (bSaveSettingsNow)
  3423.   {
  3424.     WINDOWPLACEMENT wndpl;
  3425.  
  3426.     // GetWindowPlacement
  3427.     wndpl.length = sizeof(WINDOWPLACEMENT);
  3428.     GetWindowPlacement(hwndMain,&wndpl);
  3429.  
  3430.     wi.x = wndpl.rcNormalPosition.left;
  3431.     wi.y = wndpl.rcNormalPosition.top;
  3432.     wi.cx = wndpl.rcNormalPosition.right - wndpl.rcNormalPosition.left;
  3433.     wi.cy = wndpl.rcNormalPosition.bottom - wndpl.rcNormalPosition.top;
  3434.     wi.max = (IsZoomed(hwndMain) || (wndpl.flags & WPF_RESTORETOMAXIMIZED));
  3435.   }
  3436.  
  3437.   hKey = RegGetAppKey("Window");
  3438.  
  3439.   RegSetInt(hKey,"PosX",wi.x);
  3440.   RegSetInt(hKey,"PosY",wi.y);
  3441.   RegSetInt(hKey,"SizeX",wi.cx);
  3442.   RegSetInt(hKey,"SizeY",wi.cy);
  3443.   RegSetInt(hKey,"Maximized",wi.max);
  3444.  
  3445.   RegCloseKey(hKey);
  3446.  
  3447.   // Codepage and Character Set
  3448.   hKey = RegGetAppKey("International");
  3449.   //RegSetInt(hKey,"CodePage",iDefaultCodePage);
  3450.   RegSetInt(hKey,"CharSet",iDefaultCharSet);
  3451.   RegSetInt(hKey,"AutoSelACP",bAutoSelACP);
  3452.   RegCloseKey(hKey);
  3453.  
  3454.   // Scintilla Styles
  3455.   hKey = RegGetAppKey("Styles");
  3456.   Style_Save(hKey);
  3457.   RegCloseKey(hKey);
  3458.  
  3459. }
  3460.  
  3461.  
  3462. //=============================================================================
  3463. //
  3464. //  ParseCommandLine()
  3465. //
  3466. //
  3467. void ParseCommandLine(LPSTR lpCmdLine)
  3468. {
  3469.  
  3470.   HKEY  hKey;
  3471.   LPSTR lp1,lp2,lp3;
  3472.   BOOL bContinue = TRUE;
  3473.  
  3474.   hKey = RegGetAppKey("Settings");
  3475.  
  3476.   if (!RegGetInt(hKey,"ReuseWindow2",0))
  3477.     flagNoReuseWindow = 1;
  3478.  
  3479.   if (RegGetInt(hKey,"NoFadeHidden",0))
  3480.     flagNoFadeHidden = 1;
  3481.  
  3482.   RegCloseKey(hKey);
  3483.  
  3484.   if (lstrlen(lpCmdLine) == 0)
  3485.     return;
  3486.  
  3487.   // Good old console can also send args separated by Tabs
  3488.   StrTab2Space(lpCmdLine);
  3489.  
  3490.   lp1 = LocalAlloc(LPTR,lstrlen(lpCmdLine) + 1);
  3491.   lp2 = LocalAlloc(LPTR,lstrlen(lpCmdLine) + 1);
  3492.   lp3 = LocalAlloc(LPTR,lstrlen(lpCmdLine) + 1);
  3493.  
  3494.   lstrcpy(lp3,lpCmdLine);
  3495.  
  3496.   while (bContinue && ExtractFirstArgument(lp3,lp1,lp2))
  3497.   {
  3498.  
  3499.     // options
  3500.     if ((*lp1 == '/') || (*lp1 == '-'))
  3501.     {
  3502.  
  3503.       switch (*CharUpper((lp1+1)))
  3504.       {
  3505.  
  3506.         case 'N':
  3507.           flagNoReuseWindow = 1;
  3508.           break;
  3509.  
  3510.         case 'I':
  3511.           flagStartAsTrayIcon = 1;
  3512.           break;
  3513.  
  3514.         case 'U':
  3515.           flagUnregProgram = 1;
  3516.           break;
  3517.  
  3518.         case 'P':
  3519.           if (ExtractFirstArgument(lp2,lp1,lp2)) {
  3520.             int itok =
  3521.               sscanf(lp1,"%i,%i,%i,%i,%i",&wi.x,&wi.y,&wi.cx,&wi.cy,&wi.max);
  3522.             if (itok == 4 || itok == 5) { // scan successful
  3523.               flagPosParam = 1;
  3524.               if (wi.cx < 1) wi.cx = CW_USEDEFAULT;
  3525.               if (wi.cy < 1) wi.cy = CW_USEDEFAULT;
  3526.               if (wi.max) wi.max = 1;
  3527.               if (itok == 4) wi.max = 0; } }
  3528.           break;
  3529.  
  3530.         case 'C':
  3531.           flagNewFromClipboard = 1;
  3532.           break;
  3533.  
  3534.         case 'B':
  3535.           flagPasteBoard = 1;
  3536.           break;
  3537.  
  3538.         case 'G':
  3539.           if (ExtractFirstArgument(lp2,lp1,lp2)) {
  3540.             int itok =
  3541.               sscanf(lp1,"%i,%i",&iInitialLine,&iInitialColumn);
  3542.             if (itok == 1 || itok == 2) { // scan successful
  3543.               flagJumpTo = 1; } }
  3544.           break;
  3545.  
  3546.         case '?':
  3547.           flagDisplayHelp = 1;
  3548.           break;
  3549.  
  3550.         default:
  3551.           break;
  3552.  
  3553.       }
  3554.  
  3555.     }
  3556.  
  3557.     // pathname
  3558.     else
  3559.     {
  3560.       if (lpFileArg)
  3561.         GlobalFree(lpFileArg);
  3562.  
  3563.       lpFileArg = GlobalAlloc(GPTR,MAX_PATH+2); // changed for ActivatePrevInst() needs
  3564.       lstrcpy(lpFileArg,lp3);
  3565.  
  3566.       TrimString(lpFileArg);
  3567.       PathUnquoteSpaces(lpFileArg);
  3568.  
  3569.       // only one quote, adjust blanks ...
  3570.       if (*lpFileArg == '\"') {
  3571.         *lpFileArg = ' ';
  3572.         TrimString(lpFileArg); }
  3573.  
  3574.       bContinue = FALSE;
  3575.     }
  3576.  
  3577.     // Continue with next argument
  3578.     if (bContinue)
  3579.       lstrcpy(lp3,lp2);
  3580.  
  3581.   }
  3582.  
  3583.   LocalFree(lp1);
  3584.   LocalFree(lp2);
  3585.   LocalFree(lp3);
  3586.  
  3587. }
  3588.  
  3589.  
  3590. //=============================================================================
  3591. //
  3592. //  UpdateToolbar()
  3593. //
  3594. //
  3595. #define EnableTool(id,b) SendMessage(hwndToolbar,TB_ENABLEBUTTON,id, \
  3596.                            MAKELONG(((b) ? 1 : 0), 0))
  3597.  
  3598. #define CheckTool(id,b)  SendMessage(hwndToolbar,TB_CHECKBUTTON,id, \
  3599.                            MAKELONG(b,0))
  3600.  
  3601. void UpdateToolbar()
  3602. {
  3603.  
  3604.   int i;
  3605.  
  3606.   if (!bShowToolbar)
  3607.     return;
  3608.  
  3609.   EnableTool(IDT_FILE_ADDTOFAV,lstrlen(szCurFile));
  3610.  
  3611.   EnableTool(IDT_EDIT_UNDO,SendMessage(hwndEdit,SCI_CANUNDO,0,0) /*&& !bReadOnly*/);
  3612.   EnableTool(IDT_EDIT_REDO,SendMessage(hwndEdit,SCI_CANREDO,0,0) /*&& !bReadOnly*/);
  3613.  
  3614.   i = SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0) - SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
  3615.   EnableTool(IDT_EDIT_CUT,i /*&& !bReadOnly*/);
  3616.   EnableTool(IDT_EDIT_COPY,i /*&& !bReadOnly*/);
  3617.  
  3618.   EnableTool(IDT_EDIT_COPYALL,SendMessage(hwndEdit,SCI_GETLENGTH,0,0) /*&& !bReadOnly*/);
  3619.   EnableTool(IDT_EDIT_PASTE,SendMessage(hwndEdit,SCI_CANPASTE,0,0) /*&& !bReadOnly*/);
  3620.   EnableTool(IDT_EDIT_CLEAR,i /*&& !bReadOnly*/);
  3621.  
  3622.   i = SendMessage(hwndEdit,SCI_GETLENGTH,0,0);
  3623.   EnableTool(IDT_EDIT_FIND,i);
  3624.   EnableTool(IDT_EDIT_FINDNEXT,i);
  3625.   EnableTool(IDT_EDIT_FINDPREV,i && lstrlen(efrData.szFind));
  3626.   EnableTool(IDT_EDIT_REPLACE,i /*&& !bReadOnly*/);
  3627.  
  3628.   CheckTool(IDT_VIEW_WORDWRAP,fWordWrap);
  3629.  
  3630. }
  3631.  
  3632.  
  3633. //=============================================================================
  3634. //
  3635. //  UpdateStatusbar()
  3636. //
  3637. //
  3638. void UpdateStatusbar()
  3639. {
  3640.  
  3641.   int iPos;
  3642.   int iLn;
  3643.   int iLines;
  3644.   int iCol;
  3645.   int iSel;
  3646.   char tchLn[32];
  3647.   char tchLines[32];
  3648.   char tchCol[32];
  3649.   char tchSel[32];
  3650.   char tchDocPos[256];
  3651.  
  3652.   int iBytes;
  3653.   char tchBytes[64];
  3654.   char tchDocSize[256];
  3655.  
  3656.   char tchCodePage[32];
  3657.   char tchEOLMode[32];
  3658.  
  3659.   char tchOvrMode[32];
  3660.  
  3661.   if (!bShowStatusbar)
  3662.     return;
  3663.  
  3664.   iPos = SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
  3665.  
  3666.   iLn = SendMessage(hwndEdit,SCI_LINEFROMPOSITION,iPos,0) + 1;
  3667.   wsprintf(tchLn,"%i",iLn);
  3668.   FormatNumberStr(tchLn);
  3669.  
  3670.   iLines = SendMessage(hwndEdit,SCI_GETLINECOUNT,0,0);
  3671.   wsprintf(tchLines,"%i",iLines);
  3672.   FormatNumberStr(tchLines);
  3673.  
  3674.   iCol = SendMessage(hwndEdit,SCI_GETCOLUMN,iPos,0) + 1;
  3675.   wsprintf(tchCol,"%i",iCol);
  3676.   FormatNumberStr(tchCol);
  3677.  
  3678.   if (SC_SEL_RECTANGLE != SendMessage(hwndEdit,SCI_GETSELECTIONMODE,0,0))
  3679.   {
  3680.     iSel = SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0) - SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
  3681.     wsprintf(tchSel,"%i",iSel);
  3682.     FormatNumberStr(tchSel);
  3683.   }
  3684.   else
  3685.     lstrcpy(tchSel,"--");
  3686.  
  3687.   FormatString(tchDocPos,COUNTOF(tchDocPos),IDS_DOCPOS,tchLn,tchLines,tchCol,tchSel);
  3688.  
  3689.   iBytes = SendMessage(hwndEdit,SCI_GETLENGTH,0,0);
  3690.   FormatBytes(tchBytes,COUNTOF(tchBytes),iBytes);
  3691.  
  3692.   FormatString(tchDocSize,COUNTOF(tchDocSize),IDS_DOCSIZE,tchBytes);
  3693.  
  3694.   if (iCodePage & NCP_UNICODE)
  3695.   {
  3696.     lstrcpy(tchCodePage,"Unicode");
  3697.     if (iCodePage & NCP_UNICODE_REVERSE)
  3698.       lstrcat(tchCodePage," BE");
  3699.     if (iCodePage & NCP_UNICODE_BOM)
  3700.       lstrcat(tchCodePage," BOM");
  3701.   }
  3702.   else if (iCodePage & NCP_UTF8)
  3703.   {
  3704.     lstrcpy(tchCodePage,"UTF-8");
  3705.     if (iCodePage & NCP_UTF8_SIGN)
  3706.       lstrcat(tchCodePage," Signature");
  3707.   }
  3708.   else
  3709.     lstrcpy(tchCodePage,"ANSI");
  3710.  
  3711.   if (iEOLMode == SC_EOL_CR)
  3712.     lstrcpy(tchEOLMode,"CR");
  3713.   else if (iEOLMode == SC_EOL_LF)
  3714.     lstrcpy(tchEOLMode,"LF");
  3715.   else
  3716.     lstrcpy(tchEOLMode,"CR+LF");
  3717.  
  3718.   if (SendMessage(hwndEdit,SCI_GETOVERTYPE,0,0))
  3719.     lstrcpy(tchOvrMode,"OVR");
  3720.   else
  3721.     lstrcpy(tchOvrMode,"INS");
  3722.  
  3723.   StatusSetText(hwndStatus,STATUS_DOCPOS,tchDocPos);
  3724.   StatusSetText(hwndStatus,STATUS_DOCSIZE,tchDocSize);
  3725.   StatusSetText(hwndStatus,STATUS_CODEPAGE,tchCodePage);
  3726.   StatusSetText(hwndStatus,STATUS_EOLMODE,tchEOLMode);
  3727.   StatusSetText(hwndStatus,STATUS_OVRMODE,tchOvrMode);
  3728.   StatusSetText(hwndStatus,STATUS_LEXER,Style_GetCurrentLexerName());
  3729.  
  3730.   //InvalidateRect(hwndStatus,NULL,TRUE);
  3731.  
  3732. }
  3733.  
  3734.  
  3735. //=============================================================================
  3736. //
  3737. //  UpdateLineNumberWidth()
  3738. //
  3739. //
  3740. void UpdateLineNumberWidth()
  3741. {
  3742.   char tchLines[32];
  3743.   int  iLineMarginWidthNow;
  3744.   int  iLineMarginWidthFit;
  3745.  
  3746.   if (bShowLineNumbers) {
  3747.  
  3748.     wsprintf(tchLines,"_%i_",SendMessage(hwndEdit,SCI_GETLINECOUNT,0,0));
  3749.  
  3750.     iLineMarginWidthNow = SendMessage(hwndEdit,SCI_GETMARGINWIDTHN,0,0);
  3751.     iLineMarginWidthFit = SendMessage(hwndEdit,SCI_TEXTWIDTH,STYLE_LINENUMBER,(LPARAM)tchLines);
  3752.  
  3753.     if (iLineMarginWidthNow != iLineMarginWidthFit) {
  3754.       //SendMessage(hwndEdit,SCI_SETMARGINWIDTHN,0,0);
  3755.       SendMessage(hwndEdit,SCI_SETMARGINWIDTHN,0,iLineMarginWidthFit); }
  3756.   }
  3757.  
  3758.   else
  3759.     SendMessage(hwndEdit,SCI_SETMARGINWIDTHN,0,0);
  3760. }
  3761.  
  3762.  
  3763. //=============================================================================
  3764. //
  3765. //  FileIO()
  3766. //
  3767. //
  3768. BOOL FileIO(BOOL fLoad,LPCSTR psz,BOOL bNoEncDetect,int *icp, int *ieol,
  3769.             BOOL *pbUnicodeErr,BOOL *pbFileTooBig,BOOL bSaveCopy)
  3770. {
  3771.   SHFILEINFO shfi;
  3772.   char tch[MAX_PATH+40];
  3773.   BOOL fSuccess;
  3774.   DWORD dwFileAttributes;
  3775.  
  3776.   BeginWaitCursor();
  3777.  
  3778.   SHGetFileInfo2(psz,0,&shfi,sizeof(SHFILEINFO),SHGFI_DISPLAYNAME);
  3779.   FormatString(tch,COUNTOF(tch),(fLoad) ? IDS_LOADFILE : IDS_SAVEFILE,shfi.szDisplayName);
  3780.  
  3781.   StatusSetText(hwndStatus,STATUS_HELP,tch);
  3782.   StatusSetSimple(hwndStatus,TRUE);
  3783.  
  3784.   InvalidateRect(hwndStatus,NULL,TRUE);
  3785.   UpdateWindow(hwndStatus);
  3786.  
  3787.   if (fLoad)
  3788.     fSuccess = EditLoadFile(hwndEdit,psz,bNoEncDetect,icp,ieol,pbUnicodeErr,pbFileTooBig);
  3789.   else
  3790.     fSuccess = EditSaveFile(hwndEdit,psz,*icp,bSaveCopy);
  3791.  
  3792.   dwFileAttributes = GetFileAttributes(psz);
  3793.   bReadOnly = (dwFileAttributes != INVALID_FILE_ATTRIBUTES && dwFileAttributes & FILE_ATTRIBUTE_READONLY);
  3794.  
  3795.   StatusSetSimple(hwndStatus,FALSE);
  3796.  
  3797.   EndWaitCursor();
  3798.  
  3799.   return(fSuccess);
  3800. }
  3801.  
  3802.  
  3803. //=============================================================================
  3804. //
  3805. //  FileLoad()
  3806. //
  3807. //
  3808. BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCSTR lpszFile)
  3809. {
  3810.   char tch[MAX_PATH];
  3811.   char szFileName[MAX_PATH];
  3812.   BOOL fSuccess;
  3813.   BOOL bUnicodeErr = FALSE;
  3814.   BOOL bFileTooBig = FALSE;
  3815.  
  3816.   if (!bDontSave)
  3817.   {
  3818.     if (!FileSave(FALSE,TRUE,FALSE,FALSE))
  3819.       return FALSE;
  3820.   }
  3821.  
  3822.   if (bNew) {
  3823.     lstrcpy(szCurFile,"");
  3824.     EditSetNewText(hwndEdit,"",0);
  3825.     Style_SetLexer(hwndEdit,NULL);
  3826.     UpdateLineNumberWidth();
  3827.     bModified = FALSE;
  3828.     bReadOnly = FALSE;
  3829.     iEOLMode = iLineEndings[iDefaultEOLMode];
  3830.     SendMessage(hwndEdit,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0);
  3831.     iCodePage = iEncodings[iDefaultEncoding];
  3832.     iInitialCP = iEncodings[iDefaultEncoding];
  3833.     SendMessage(hwndEdit,SCI_SETCODEPAGE,(iDefaultEncoding == 0) ? iDefaultCodePage : SC_CP_UTF8,0);
  3834.     EditSetNewText(hwndEdit,"",0);
  3835.     SetWindowTitle(hwndMain,uidsAppTitle,IDS_UNTITLED,szCurFile,
  3836.       bShortPathNames,bModified || iCodePage != iInitialCP,
  3837.       IDS_READONLY,bReadOnly);
  3838.  
  3839.     // Terminate file watching
  3840.     //InstallFileWatching(NULL);
  3841.  
  3842.     return TRUE; }
  3843.  
  3844.   if (!lpszFile || lstrlen(lpszFile) == 0) {
  3845.     if (!OpenFileDlg(hwndMain,tch,COUNTOF(tch),NULL))
  3846.       return FALSE; }
  3847.  
  3848.   else
  3849.     lstrcpy(tch,lpszFile);
  3850.  
  3851.   ExpandEnvironmentStringsEx(tch,COUNTOF(tch));
  3852.  
  3853.   if (!SearchPath(NULL,tch,NULL,COUNTOF(szFileName),szFileName,NULL))
  3854.   {
  3855.     if (PathIsRelative(tch)) {
  3856.       GetCurrentDirectory(COUNTOF(szFileName),szFileName);
  3857.       PathAppend(szFileName,tch); }
  3858.     else
  3859.       lstrcpy(szFileName,tch);
  3860.   }
  3861.  
  3862.   PathCanonicalizeEx(tch);
  3863.   GetLongPathNameEx(szFileName,szFileName,COUNTOF(szFileName));
  3864.  
  3865.   if (PathIsLnkFile(szFileName))
  3866.     PathGetLnkPath(szFileName,szFileName,COUNTOF(szFileName));
  3867.  
  3868.   // Ask to create a new file...
  3869.   if (!bReload && !PathFileExists(szFileName))
  3870.   {
  3871.     if (MsgBox(MBYESNO,IDS_ASK_CREATE,szFileName) == IDYES) {
  3872.       HANDLE hFile = CreateFile(szFileName,
  3873.                       GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
  3874.                       NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  3875.       if (fSuccess = (hFile != INVALID_HANDLE_VALUE)) {
  3876.         CloseHandle(hFile);
  3877.         EditSetNewText(hwndEdit,"",0);
  3878.         Style_SetLexer(hwndEdit,NULL);
  3879.         iEOLMode = iLineEndings[iDefaultEOLMode];
  3880.         SendMessage(hwndEdit,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0);
  3881.         iCodePage = iEncodings[iDefaultEncoding];
  3882.         iInitialCP = iEncodings[iDefaultEncoding];
  3883.         SendMessage(hwndEdit,SCI_SETCODEPAGE,(iDefaultEncoding == 0) ? iDefaultCodePage : SC_CP_UTF8,0);
  3884.         bReadOnly = FALSE;
  3885.         EditSetNewText(hwndEdit,"",0); }
  3886.     }
  3887.     else
  3888.       return FALSE;
  3889.   }
  3890.  
  3891.   else
  3892.     fSuccess = FileIO(TRUE,szFileName,bNoEncDetect,&iCodePage,&iEOLMode,&bUnicodeErr,&bFileTooBig,FALSE);
  3893.  
  3894.   if (fSuccess) {
  3895.     lstrcpy(szCurFile,szFileName);
  3896.     Style_SetLexerFromFile(hwndEdit,szCurFile);
  3897.     UpdateLineNumberWidth();
  3898.     iInitialCP = iCodePage;
  3899.     bModified = FALSE;
  3900.     //bReadOnly = FALSE;
  3901.     SendMessage(hwndEdit,SCI_SETEOLMODE,iEOLMode,0);
  3902.     AddMRUString(hFileMRU,szFileName);
  3903.     SetWindowTitle(hwndMain,uidsAppTitle,IDS_UNTITLED,szFileName,
  3904.       bShortPathNames,bModified || iCodePage != iInitialCP,
  3905.       IDS_READONLY,bReadOnly);
  3906.  
  3907.     // Install watching of the current file
  3908.     //InstallFileWatching(szCurFile);
  3909.  
  3910.     // Show warning: Unicode file loaded as ANSI
  3911.     if (bUnicodeErr)
  3912.       MsgBox(MBWARN,IDS_ERR_UNICODE);
  3913.   }
  3914.  
  3915.   else if (!bFileTooBig)
  3916.     MsgBox(MBWARN,IDS_ERR_LOADFILE,szFileName);
  3917.  
  3918.   return(fSuccess);
  3919. }
  3920.  
  3921.  
  3922. //=============================================================================
  3923. //
  3924. //  FileSave()
  3925. //
  3926. //
  3927. BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy)
  3928. {
  3929.   char tchFile[MAX_PATH];
  3930.   BOOL fSuccess = FALSE;
  3931.  
  3932.   if (!bSaveAlways && !bModified && iCodePage == iInitialCP && !bSaveAs)
  3933.     return TRUE;
  3934.  
  3935.   if (bAsk)
  3936.   {
  3937.     // File or "Untitled" ...
  3938.     char tch[MAX_PATH];
  3939.     if (lstrlen(szCurFile))
  3940.       lstrcpy(tch,szCurFile);
  3941.     else
  3942.       GetString(IDS_UNTITLED,tch,COUNTOF(tch));
  3943.  
  3944.     switch (MsgBox(MBYESNOCANCEL,IDS_ASK_SAVE,tch)) {
  3945.       case IDCANCEL:
  3946.         return FALSE;
  3947.       case IDNO:
  3948.         return TRUE;
  3949.     }
  3950.   }
  3951.  
  3952.   // Read only...
  3953.   if (!bSaveAs && !bSaveCopy && lstrlen(szCurFile))
  3954.   {
  3955.     DWORD dwFileAttributes = GetFileAttributes(szCurFile);
  3956.     if (dwFileAttributes != INVALID_FILE_ATTRIBUTES)
  3957.       bReadOnly = (dwFileAttributes & FILE_ATTRIBUTE_READONLY);
  3958.     if (bReadOnly) {
  3959.       SetWindowTitle(hwndMain,uidsAppTitle,IDS_UNTITLED,szCurFile,
  3960.         bShortPathNames,bModified || iCodePage != iInitialCP,
  3961.         IDS_READONLY,bReadOnly);
  3962.       if (MsgBox(MBYESNOWARN,IDS_READONLY_SAVE,szCurFile) == IDYES)
  3963.         bSaveAs = TRUE;
  3964.       else
  3965.         return FALSE;
  3966.     }
  3967.   }
  3968.  
  3969.   // Save As...
  3970.   if (bSaveAs || bSaveCopy || lstrlen(szCurFile) == 0)
  3971.   {
  3972.     lstrcpy(tchFile,szCurFile);
  3973.     if (SaveFileDlg(hwndMain,tchFile,COUNTOF(tchFile)))
  3974.     {
  3975.       if (fSuccess = FileIO(FALSE,tchFile,FALSE,&iCodePage,&iEOLMode,NULL,NULL,bSaveCopy))
  3976.       {
  3977.         if (!bSaveCopy)
  3978.         {
  3979.           lstrcpy(szCurFile,tchFile);
  3980.           Style_SetLexerFromFile(hwndEdit,szCurFile);
  3981.           UpdateLineNumberWidth();
  3982.         }
  3983.       }
  3984.     }
  3985.     else
  3986.       return FALSE;
  3987.   }
  3988.  
  3989.   else
  3990.     fSuccess = FileIO(FALSE,szCurFile,FALSE,&iCodePage,&iEOLMode,NULL,NULL,FALSE);
  3991.  
  3992.   if (fSuccess)
  3993.   {
  3994.     if (!bSaveCopy)
  3995.     {
  3996.       bModified = FALSE;
  3997.       iInitialCP = iCodePage;
  3998.       AddMRUString(hFileMRU,szCurFile);
  3999.       SetWindowTitle(hwndMain,uidsAppTitle,IDS_UNTITLED,szCurFile,
  4000.         bShortPathNames,bModified || iCodePage != iInitialCP,
  4001.         IDS_READONLY,bReadOnly);
  4002.  
  4003.       // Install watching of the current file
  4004.       //InstallFileWatching(szCurFile);
  4005.     }
  4006.   }
  4007.  
  4008.   else
  4009.   {
  4010.     if (lstrlen(szCurFile) != 0)
  4011.       lstrcpy(tchFile,szCurFile);
  4012.  
  4013.     SetWindowTitle(hwndMain,uidsAppTitle,IDS_UNTITLED,szCurFile,
  4014.       bShortPathNames,bModified || iCodePage != iInitialCP,
  4015.       IDS_READONLY,bReadOnly);
  4016.  
  4017.     MsgBox(MBWARN,IDS_ERR_SAVEFILE,tchFile);
  4018.   }
  4019.  
  4020.   return(fSuccess);
  4021. }
  4022.  
  4023.  
  4024. //=============================================================================
  4025. //
  4026. //  OpenFileDlg()
  4027. //
  4028. //
  4029. BOOL OpenFileDlg(HWND hwnd,LPSTR lpstrFile,int cchFile,LPCSTR lpstrInitialDir)
  4030. {
  4031.   OPENFILENAME ofn;
  4032.   char szFile[MAX_PATH];
  4033.   char szFilter[NUMLEXERS*1024];
  4034.   char tchInitialDir[MAX_PATH];
  4035.  
  4036.   lstrcpy(szFile,"");
  4037.   Style_GetOpenDlgFilterStr(szFilter,COUNTOF(szFilter));
  4038.  
  4039.   if (!lpstrInitialDir && lstrlen(szCurFile)) {
  4040.     lstrcpy(tchInitialDir,szCurFile);
  4041.     PathRemoveFileSpec(tchInitialDir); }
  4042.  
  4043.   ZeroMemory(&ofn,sizeof(OPENFILENAME));
  4044.   ofn.lStructSize = sizeof(OPENFILENAME);
  4045.   ofn.hwndOwner = hwnd;
  4046.   ofn.lpstrFilter = szFilter;
  4047.   ofn.lpstrFile = szFile;
  4048.   ofn.lpstrInitialDir = (lpstrInitialDir) ? lpstrInitialDir : tchInitialDir;
  4049.   ofn.nMaxFile = COUNTOF(szFile);
  4050.   ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | /* OFN_NOCHANGEDIR |*/
  4051.             /*OFN_DONTADDTORECENT*/0x02000000 | OFN_PATHMUSTEXIST |
  4052.               OFN_SHAREAWARE /*| OFN_NODEREFERENCELINKS*/;
  4053.   ofn.lpstrDefExt = (lstrlen(tchDefaultExtension)) ? tchDefaultExtension : NULL;
  4054.  
  4055.   if (GetOpenFileName(&ofn)) {
  4056.     lstrcpyn(lpstrFile,szFile,cchFile);
  4057.     return TRUE; }
  4058.  
  4059.   else
  4060.     return FALSE;
  4061. }
  4062.  
  4063.  
  4064. //=============================================================================
  4065. //
  4066. //  SaveFileDlg()
  4067. //
  4068. //
  4069. BOOL SaveFileDlg(HWND hwnd,LPSTR lpstrFile,int cchFile)
  4070. {
  4071.   OPENFILENAME ofn;
  4072.   char szNewFile[MAX_PATH];
  4073.   char szFilter[NUMLEXERS*1024];
  4074.  
  4075.   lstrcpy(szNewFile,lpstrFile);
  4076.   Style_GetOpenDlgFilterStr(szFilter,COUNTOF(szFilter));
  4077.  
  4078.   ZeroMemory(&ofn,sizeof(OPENFILENAME));
  4079.   ofn.lStructSize = sizeof(OPENFILENAME);
  4080.   ofn.hwndOwner = hwnd;
  4081.   ofn.lpstrFilter = szFilter;
  4082.   ofn.lpstrFile = szNewFile;
  4083.   ofn.nMaxFile = MAX_PATH;
  4084.   ofn.Flags = OFN_HIDEREADONLY /*| OFN_NOCHANGEDIR*/ |
  4085.             /*OFN_NODEREFERENCELINKS |*/ OFN_OVERWRITEPROMPT |
  4086.             /*OFN_DONTADDTORECENT*/0x02000000 | OFN_PATHMUSTEXIST;
  4087.   ofn.lpstrDefExt = (lstrlen(tchDefaultExtension)) ? tchDefaultExtension : NULL;
  4088.  
  4089.   if (GetSaveFileName(&ofn)) {
  4090.     lstrcpyn(lpstrFile,szNewFile,cchFile);
  4091.     return TRUE; }
  4092.  
  4093.   else
  4094.     return FALSE;
  4095. }
  4096.  
  4097.  
  4098.  
  4099. /******************************************************************************
  4100. *
  4101. * ActivatePrevInst()
  4102. *
  4103. * Tries to find and activate an already open Notepad2 Window
  4104. *
  4105. *
  4106. ******************************************************************************/
  4107. BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
  4108. {
  4109.  
  4110.   BOOL bContinue = TRUE;
  4111.   char szClassName[64];
  4112.  
  4113.   if (GetClassName(hwnd,szClassName,COUNTOF(szClassName)))
  4114.  
  4115.     if (lstrcmpi(szClassName,WC_NOTEPAD2) == 0)
  4116.     {
  4117.  
  4118.       *(HWND*)lParam = hwnd;
  4119.  
  4120.       if (IsWindowEnabled(hwnd))
  4121.         bContinue = FALSE;
  4122.  
  4123.     }
  4124.  
  4125.   return(bContinue);
  4126.  
  4127. }
  4128.  
  4129. BOOL ActivatePrevInst()
  4130. {
  4131.  
  4132.   HWND hwnd = NULL;
  4133.   COPYDATASTRUCT cds;
  4134.  
  4135.   if (flagNoReuseWindow || flagStartAsTrayIcon || flagNewFromClipboard || flagPasteBoard)
  4136.     return(FALSE);
  4137.  
  4138.   EnumWindows(EnumWndProc,(LPARAM)&hwnd);
  4139.  
  4140.   // Found a window
  4141.   if (hwnd != NULL)
  4142.   {
  4143.     // Enabled
  4144.     if (IsWindowEnabled(hwnd))
  4145.     {
  4146.       // Make sure the previous window won't pop up a change notification message
  4147.       //SendMessage(hwnd,WM_CHANGENOTIFYCLEAR,0,0);
  4148.  
  4149.       if (IsIconic(hwnd))
  4150.         ShowWindowAsync(hwnd,SW_RESTORE);
  4151.  
  4152.       if (!IsWindowVisible(hwnd)) {
  4153.         SendMessage(hwnd,WM_TRAYMESSAGE,0,WM_LBUTTONDBLCLK);
  4154.         SendMessage(hwnd,WM_TRAYMESSAGE,0,WM_LBUTTONUP); }
  4155.  
  4156.       SetForegroundWindow(hwnd);
  4157.  
  4158.       if (lpFileArg)
  4159.       {
  4160.         // Search working directory from second instance, first!
  4161.         // lpFileArg is at least MAX_PATH+2 bytes
  4162.         char tchTmp[MAX_PATH];
  4163.  
  4164.         ExpandEnvironmentStringsEx(lpFileArg,GlobalSize(lpFileArg));
  4165.  
  4166.         if (SearchPath(NULL,lpFileArg,NULL,COUNTOF(tchTmp),tchTmp,NULL))
  4167.           lstrcpy(lpFileArg,tchTmp);
  4168.  
  4169.         else if (PathIsRelative(lpFileArg)) {
  4170.           GetCurrentDirectory(COUNTOF(tchTmp),tchTmp);
  4171.           PathAppend(tchTmp,lpFileArg);
  4172.           lstrcpy(lpFileArg,tchTmp); }
  4173.  
  4174.         cds.dwData = DATA_NOTEPAD2_FILEARG;
  4175.         cds.cbData = GlobalSize(lpFileArg);
  4176.         cds.lpData = lpFileArg;
  4177.  
  4178.         // Send lpFileArg to previous instance
  4179.         SendMessage(hwnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
  4180.         GlobalFree(lpFileArg);
  4181.       }
  4182.       return(TRUE);
  4183.     }
  4184.  
  4185.     else // IsWindowEnabled()
  4186.     {
  4187.       // Ask...
  4188.       if (IDYES == MsgBox(MBYESNO,IDS_ERR_PREVWINDISABLED))
  4189.         return(FALSE);
  4190.       else
  4191.         return(TRUE);
  4192.  
  4193.     }
  4194.   }
  4195.  
  4196.   else
  4197.     return(FALSE);
  4198.  
  4199. }
  4200.  
  4201.  
  4202. //=============================================================================
  4203. //
  4204. //  ShowNotifyIcon()
  4205. //
  4206. //
  4207. void ShowNotifyIcon(HWND hwnd,BOOL bAdd)
  4208. {
  4209.  
  4210.   static HICON hIcon;
  4211.   NOTIFYICONDATA nid;
  4212.  
  4213.   if (!hIcon)
  4214.     hIcon = LoadImage(g_hInstance,MAKEINTRESOURCE(IDR_MAINWND),
  4215.                       IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
  4216.  
  4217.   ZeroMemory(&nid,sizeof(NOTIFYICONDATA));
  4218.   nid.cbSize = sizeof(NOTIFYICONDATA);
  4219.   nid.hWnd = hwnd;
  4220.   nid.uID = 0;
  4221.   nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  4222.   nid.uCallbackMessage = WM_TRAYMESSAGE;
  4223.   nid.hIcon = hIcon;
  4224.   lstrcpy(nid.szTip,"Notepad2");
  4225.  
  4226.   if(bAdd)
  4227.     Shell_NotifyIcon(NIM_ADD,&nid);
  4228.   else
  4229.     Shell_NotifyIcon(NIM_DELETE,&nid);
  4230.  
  4231. }
  4232.  
  4233.  
  4234. //=============================================================================
  4235. //
  4236. //  SetNotifyIconTitle()
  4237. //
  4238. //
  4239. void SetNotifyIconTitle(HWND hwnd)
  4240. {
  4241.  
  4242.   NOTIFYICONDATA nid;
  4243.   SHFILEINFO shfi;
  4244.   char tchTitle[128];
  4245.  
  4246.   ZeroMemory(&nid,sizeof(NOTIFYICONDATA));
  4247.   nid.cbSize = sizeof(NOTIFYICONDATA);
  4248.   nid.hWnd = hwnd;
  4249.   nid.uID = 0;
  4250.   nid.uFlags = NIF_TIP;
  4251.  
  4252.   if (lstrlen(szCurFile)) {
  4253.     SHGetFileInfo2(szCurFile,0,&shfi,sizeof(SHFILEINFO),SHGFI_DISPLAYNAME);
  4254.     PathCompactPathEx(tchTitle,shfi.szDisplayName,COUNTOF(tchTitle)-4,0); }
  4255.   else
  4256.     GetString(IDS_UNTITLED,tchTitle,COUNTOF(tchTitle)-4);
  4257.  
  4258.   if (bModified || iCodePage != iInitialCP)
  4259.     lstrcpy(nid.szTip,"* ");
  4260.   else
  4261.     lstrcpy(nid.szTip,"");
  4262.   lstrcat(nid.szTip,tchTitle);
  4263.  
  4264.   Shell_NotifyIcon(NIM_MODIFY,&nid);
  4265.  
  4266. }
  4267.  
  4268.  
  4269. //=============================================================================
  4270. //
  4271. //  InstallFileWatching()
  4272. //
  4273. //
  4274. //void InstallFileWatching(LPCSTR lpszFile)
  4275. //{
  4276. //
  4277. //  char tchDirectory[MAX_PATH];
  4278. //  HANDLE hFind;
  4279. //
  4280. //  // Terminate
  4281. //  if (!bEnableFileWatching || !lpszFile || lstrlen(lpszFile) == 0)
  4282. //  {
  4283. //    if (bRunningWatch)
  4284. //    {
  4285. //      FindCloseChangeNotification(hChangeHandle);
  4286. //      KillTimer(NULL,ID_WATCHTIMER);
  4287. //      bRunningWatch = FALSE;
  4288. //      bPendingChangeNotify = FALSE;
  4289. //    }
  4290. //    return;
  4291. //  }
  4292. //
  4293. //  // Install
  4294. //  else
  4295. //  {
  4296. //    // Terminate previous watching
  4297. //    if (bRunningWatch) {
  4298. //      FindCloseChangeNotification(hChangeHandle);
  4299. //      bPendingChangeNotify = FALSE; }
  4300. //
  4301. //    // No previous watching installed, so launch the timer first
  4302. //    else
  4303. //      SetTimer(NULL,ID_WATCHTIMER,2000,WatchTimerProc);
  4304. //
  4305. //      lstrcpy(tchDirectory,lpszFile);
  4306. //      PathRemoveFileSpec(tchDirectory);
  4307. //
  4308. //      // Save data of current file
  4309. //      hFind = FindFirstFile(szCurFile,&fdCurFile);
  4310. //      if (hFind != INVALID_HANDLE_VALUE)
  4311. //        FindClose(hFind);
  4312. //      else
  4313. //        ZeroMemory(&fdCurFile,sizeof(WIN32_FIND_DATA));
  4314. //
  4315. //      hChangeHandle = FindFirstChangeNotification(tchDirectory,FALSE,
  4316. //        FILE_NOTIFY_CHANGE_FILE_NAME  | \
  4317. //        FILE_NOTIFY_CHANGE_DIR_NAME   | \
  4318. //        FILE_NOTIFY_CHANGE_ATTRIBUTES | \
  4319. //        FILE_NOTIFY_CHANGE_SIZE | \
  4320. //        FILE_NOTIFY_CHANGE_LAST_WRITE);
  4321. //
  4322. //      bRunningWatch = TRUE;
  4323. //      bPendingChangeNotify = FALSE;
  4324. //    }
  4325. //
  4326. //  }
  4327.  
  4328.  
  4329. //=============================================================================
  4330. //
  4331. //  WatchTimerProc()
  4332. //
  4333. //
  4334. //void CALLBACK WatchTimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
  4335. //{
  4336. //  // Check Change Notification Handle
  4337. //  if (WAIT_OBJECT_0 == WaitForSingleObject(hChangeHandle,0))
  4338. //  {
  4339. //    // Check if the changes affect the current file
  4340. //    WIN32_FIND_DATA fdUpdated;
  4341. //    HANDLE hFind = FindFirstFile(szCurFile,&fdUpdated);
  4342. //    if (hFind)
  4343. //      FindClose(hFind);
  4344. //    else
  4345. //      // The current file has been removed
  4346. //      ZeroMemory(&fdUpdated,sizeof(WIN32_FIND_DATA));
  4347. //
  4348. //    // Check if the file has been changed
  4349. //    if (CompareFileTime(&fdCurFile.ftLastWriteTime,&fdUpdated.ftLastWriteTime) != 0 ||
  4350. //        fdCurFile.nFileSizeLow != fdUpdated.nFileSizeLow ||
  4351. //        fdCurFile.nFileSizeHigh != fdUpdated.nFileSizeHigh)
  4352. //    {
  4353. //      // Shutdown current watching and give control to main window
  4354. //      FindCloseChangeNotification(hChangeHandle);
  4355. //      KillTimer(NULL,ID_WATCHTIMER);
  4356. //      bRunningWatch = FALSE;
  4357. //      bPendingChangeNotify = TRUE;
  4358. //      PostMessage(hwndMain,WM_CHANGENOTIFY,0,0);
  4359. //    }
  4360. //
  4361. //    else
  4362. //      FindNextChangeNotification(hChangeHandle);
  4363. //
  4364. //  }
  4365. //}
  4366.  
  4367.  
  4368.  
  4369. ///  End of Notepad2.c  \\\
  4370.