Alexey_B

PluginTextEx.js

Jul 10th, 2023 (edited)
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // *** Operations on the text from plugins: Coder, ContextMenu, Hotkeys, SpecialChar and ToolBar ***
  2. //
  3. // --- Original script PluginText.js ---
  4. //
  5. // http://akelpad.sourceforge.net/forum/viewtopic.php?p=17303#17303
  6. // Version: 2016-06-05
  7. // Author: KDJ
  8. //
  9. // Usage:
  10. //   Call("Scripts::Main", 1, "PluginText.js")
  11. //
  12. // Keyboard and mouse:
  13. //   Ctrl+A - select all items on list
  14. //   double click on list item - edit plugin text, if text is opened in current tab - close it
  15. //
  16. // Remarks:
  17. //   The script should be saved in any Unicode format.
  18. //   The text is read from plugin settings (.ini file or registry).
  19. //   For the syntax highlighting uses akelmenu.coder by Infocatcher: http://infocatcher.ucoz.net/akelpad/coder/_akelmenu.coder
  20. //
  21. // --- Extended version PluginTextEx.js ---
  22. //
  23. // http://akelpad.sourceforge.net/forum/viewtopic.php?p=36286#36286
  24. // Version: 2023-07-12
  25. // Changes author: Alexey B.
  26. //
  27. // Changes:
  28. // * When loading from .akelmenu files:
  29. //   * Auto detect encoding instead of fixed UTF-16 LE.
  30. //   * Auto convert line endings to Mac style (CR).
  31. // * When saving .akelmenu files:
  32. //   * utf8 argument to save files in UTF-8 (BOM) instead of UTF-16 (LE, BOM).
  33. //   * crlf argument to save files in CRLF instead of CR line endings.
  34. //
  35. // Example:
  36. //    Call("Scripts::Main", 1, "PluginTextEx.js", "-utf8 -crlf")
  37.  
  38. var oSys     = AkelPad.SystemFunction();
  39. var hMainWnd = AkelPad.GetMainWnd();
  40. var hInstDLL = AkelPad.GetInstanceDll();
  41. var sClass   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
  42.  
  43. GetLangStrings();
  44.  
  45. if (IsScriptRunning() || IsSDI())
  46.   WScript.Quit();
  47.  
  48. var bCRLF = Boolean(AkelPad.GetArgValue("crlf", false));
  49. var bUTF8 = Boolean(AkelPad.GetArgValue("utf8", false));
  50.  
  51. var DT_UNICODE = 1;
  52. var DT_QWORD   = 2;
  53. var DT_DWORD   = 3;
  54. var DT_WORD    = 4;
  55. var DT_BYTE    = 5;
  56.  
  57. var oFSO      = new ActiveXObject("Scripting.FileSystemObject");
  58. var bSetInReg = (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 5 /*MI_SAVESETTINGS*/, 0) == 1 /*SS_REGISTRY*/);
  59. var nBufSize  = 1024;
  60. var lpBuffer  = AkelPad.MemAlloc(nBufSize);
  61. var lpLVITEM  = AkelPad.MemAlloc(_X64 ? 72 : 60); //sizeof(LVITEM)
  62.  
  63. AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, DT_DWORD);
  64. AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 24 : 20), lpBuffer, DT_QWORD);
  65. AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 32 : 24), nBufSize, DT_DWORD);
  66.  
  67. var nWndMinW  = 500;
  68. var nWndMinH  = 262;
  69. var nWndPosX  = 240;
  70. var nWndPosY  = 160;
  71. var nWndPosW  = 0;
  72. var nWndPosH  = 0;
  73. var oPlugText = {};
  74. var aFrame    = [];
  75. var sTextDirS;
  76. var hDlg;
  77.  
  78. ReadIni();
  79.  
  80. var CLASS = 0;
  81. var HWND  = 1;
  82. var STYLE = 2;
  83. var TXT   = 3;
  84.  
  85. var aDlg   = [];
  86. var IDSET  = 2000;
  87. var IDDIR  = 2001;
  88. var IDPLUG = 2002;
  89. var IDB1   = 2003;
  90. var IDB2   = 2004;
  91. var IDB3   = 2005;
  92. var IDB4   = 2006;
  93. var IDB5   = 2007;
  94. var IDB6   = 2008;
  95. var IDB7   = 2009;
  96. var IDB8   = 2010;
  97. var IDB9   = 2011;
  98.  
  99. //0x50000000 - WS_VISIBLE|WS_CHILD
  100. //0x50000080 - WS_VISIBLE|WS_CHILD|SS_NOPREFIX
  101. //0x50818009 - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS|LVS_REPORT
  102. //Windows     CLASS,        HWND,      STYLE, TXT
  103. aDlg[IDSET ]=["STATIC",        0, 0x50000080, bSetInReg ? sTxtSetInReg : sTxtSetInIni];
  104. aDlg[IDDIR ]=["STATIC",        0, 0x50000080, sTxtDir + ExpandDirName(sTextDirS)];
  105. aDlg[IDPLUG]=["SysListView32", 0, 0x50818009, ""];
  106. aDlg[IDB1  ]=["BUTTON",        0, 0x50000000, sTxtEditText + " (F1)"];
  107. aDlg[IDB2  ]=["BUTTON",        0, 0x50000000, sTxtLoadText + " (F2)"];
  108. aDlg[IDB3  ]=["BUTTON",        0, 0x50000000, sTxtSaveTextFile + " (F3)"];
  109. aDlg[IDB4  ]=["BUTTON",        0, 0x50000000, sTxtEditTextFile + " (F4)"];
  110. aDlg[IDB5  ]=["BUTTON",        0, 0x50000000, sTxtLoadTextFile + " (F5)"];
  111. aDlg[IDB6  ]=["BUTTON",        0, 0x50000000, sTxtRenameFile + " (F7)"];
  112. aDlg[IDB7  ]=["BUTTON",        0, 0x50000000, sTxtDeleteFile + " (F8)"];
  113. aDlg[IDB8  ]=["BUTTON",        0, 0x50000000, sTxtChangeDir + " (F9)"];
  114. aDlg[IDB9  ]=["BUTTON",        0, 0x50000000, (bSetInReg ? sTxtOpenRegEdit : sTxtEditIniFile) + " (Shift+F4)"];
  115.  
  116. if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 1048 /*AKDN_FRAME_DESTROY*/, 1078 /*AKDN_OPENDOCUMENT_FINISH*/))
  117. {
  118.   AkelPad.ScriptNoMutex();
  119.   AkelPad.WindowRegisterClass(sClass);
  120.  
  121.   hDlg = oSys.Call("User32::CreateWindowExW",
  122.     0,              //dwExStyle
  123.     sClass,         //lpClassName
  124.     sTxtScriptName, //lpWindowName
  125.     0x90CE0000,     //WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU|WS_SIZEBOX
  126.     nWndPosX,       //x
  127.     nWndPosY,       //y
  128.     nWndPosW,       //nWidth
  129.     nWndPosH,       //nHeight
  130.     hMainWnd,       //hWndParent
  131.     0,              //ID
  132.     hInstDLL,       //hInstance
  133.     DialogCallback);//Script function callback. To use it class must be registered by WindowRegisterClass.
  134.  
  135.   AkelPad.WindowGetMessage();
  136.   AkelPad.WindowUnregisterClass(sClass);
  137.   AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
  138. }
  139.  
  140. AkelPad.MemFree(lpBuffer);
  141. AkelPad.MemFree(lpLVITEM);
  142.  
  143. function MainCallback(hWnd, uMsg, wParam, lParam)
  144. {
  145.   if ((uMsg == 1048 /*AKDN_FRAME_DESTROY*/) || (uMsg == 1078 /*AKDN_OPENDOCUMENT_FINISH*/) && (lParam == 0 /*EOD_SUCCESS*/))
  146.   {
  147.     var lpFrame = (uMsg == 1048 /*AKDN_FRAME_DESTROY*/) ? lParam : SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);
  148.  
  149.     for (var i = 0; i < aFrame.length; ++i)
  150.     {
  151.       if (aFrame[i] == lpFrame)
  152.       {
  153.         aFrame[i] = 0;
  154.         break;
  155.       }
  156.     }
  157.   }
  158.  
  159.   return 0;
  160. }
  161.  
  162. function DialogCallback(hWnd, uMsg, wParam, lParam)
  163. {
  164.   var hGuiFont, nID, i;
  165.  
  166.   if (uMsg == 1) //WM_CREATE
  167.   {
  168.     hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
  169.  
  170.     for (i = IDSET; i < aDlg.length; ++i)
  171.     {
  172.       aDlg[i][HWND] = oSys.Call("User32::CreateWindowExW",
  173.         0,             //dwExStyle
  174.         aDlg[i][CLASS],//lpClassName
  175.         aDlg[i][TXT],  //lpWindowName
  176.         aDlg[i][STYLE],//dwStyle
  177.         0,             //x
  178.         0,             //y
  179.         0,             //nWidth
  180.         0,             //nHeight
  181.         hWnd,          //hWndParent
  182.         i,             //ID
  183.         hInstDLL,      //hInstance
  184.         0);            //lpParam
  185.  
  186.       SendMessage(aDlg[i][HWND], 48 /*WM_SETFONT*/, hGuiFont, true);
  187.     }
  188.  
  189.     FillPlugList();
  190.  
  191.     if (! GetItemCountLV())
  192.     {
  193.       AkelPad.MessageBox(hWnd, sTxtNoTexts, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
  194.       oSys.Call("User32::DestroyWindow", hWnd);
  195.     }
  196.   }
  197.  
  198.   else if (uMsg == 7) //WM_SETFOCUS
  199.     oSys.Call("User32::SetFocus", aDlg[IDPLUG][HWND]);
  200.  
  201.   else if (uMsg == 36) //WM_GETMINMAXINFO
  202.   {
  203.     AkelPad.MemCopy(_PtrAdd(lParam, 24), nWndMinW, DT_DWORD); //ptMinTrackSize_x
  204.     AkelPad.MemCopy(_PtrAdd(lParam, 28), nWndMinH, DT_DWORD); //ptMinTrackSize_y
  205.   }
  206.  
  207.   else if (uMsg == 5) //WM_SIZE
  208.     ResizeDlg(LoWord(lParam), HiWord(lParam));
  209.  
  210.   else if (uMsg == 15) //WM_PAINT
  211.     PaintSizeGrip();
  212.  
  213.   else if (uMsg == 256) //WM_KEYDOWN
  214.   {
  215.     if ((wParam == 0x70 /*VK_F1*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
  216.       EditText(0);
  217.     else if ((wParam == 0x71 /*VK_F2*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
  218.       LoadTextToPlugin();
  219.     else if ((wParam == 0x72 /*VK_F3*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
  220.       EditText(1);
  221.     else if ((wParam == 0x73 /*VK_F4*/) && (! Ctrl()) && (! Alt()))
  222.     {
  223.       if (Shift())
  224.         bSetInReg ? OpenInRegEdit() : EditIniFile();
  225.       else      
  226.         EditTextFile();
  227.     }
  228.     else if ((wParam == 0x74 /*VK_F5*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
  229.       LoadTextToPlugin(1);
  230.     else if ((wParam == 0x76 /*VK_F7*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
  231.       RenameTextFile();
  232.     else if (((wParam == 0x77 /*VK_F8*/) || (wParam == 0x2E /*VK_DELETE*/)) && (! Ctrl()) && (! Alt()))
  233.       DeleteTextFile();
  234.     else if ((wParam == 0x78 /*VK_F9*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
  235.       ChangeTextsDir();
  236.     else if ((wParam == 0x41 /*A key*/) && Ctrl() && (! Shift()) && (! Alt()))
  237.     {
  238.       for (i = 0; i < GetItemCountLV(); ++i)
  239.         SetSelLV(i);
  240.     }
  241.   }
  242.  
  243.   else if ((uMsg == 0x004E /*WM_NOTIFY*/) && (wParam == IDPLUG))
  244.   {
  245.     switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), DT_DWORD))
  246.     {
  247.       case -3 : //NM_DBLCLK
  248.         if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) > -1)
  249.         {
  250.           EditText(0, 1);
  251.           break;
  252.         }
  253.       case -2 : //NM_CLICK
  254.       case -5 : //NM_RCLICK
  255.       case -6 : //NM_RDBLCLK
  256.         if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) == -1)
  257.           SetSelLV(SendMessage(aDlg[IDPLUG][HWND], 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0001 /*LVNI_FOCUSED*/));
  258.     }
  259.   }
  260.  
  261.   else if (uMsg == 273) //WM_COMMAND
  262.   {
  263.     nID = LoWord(wParam);
  264.  
  265.     if ((nID >= IDB1) && (nID <= IDB9))
  266.     {
  267.       SendMessage(lParam, 0x00F4 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 0);
  268.  
  269.       if (nID == IDB1)
  270.         EditText(0);
  271.       else if (nID == IDB2)
  272.         LoadTextToPlugin();
  273.       else if (nID == IDB3)
  274.         EditText(1);
  275.       else if (nID == IDB4)
  276.         EditTextFile();
  277.       else if (nID == IDB5)
  278.         LoadTextToPlugin(1);
  279.       else if (nID == IDB6)
  280.         RenameTextFile();
  281.       else if (nID == IDB7)
  282.         DeleteTextFile();
  283.       else if (nID == IDB8)
  284.         ChangeTextsDir();
  285.       else if (nID == IDB9)
  286.         bSetInReg ? OpenInRegEdit() : EditIniFile();
  287.  
  288.       oSys.Call("User32::SetFocus", aDlg[IDPLUG][HWND]);
  289.     }
  290.  
  291.     else if (nID == 2 /*IDCANCEL*/)
  292.       SendMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  293.   }
  294.  
  295.   else if (uMsg == 16) //WM_CLOSE
  296.   {
  297.     WriteIni();
  298.     oSys.Call("User32::PostQuitMessage", 0);
  299.     oSys.Call("User32::DestroyWindow", hWnd);
  300.   }
  301.  
  302.   return 0;
  303. }
  304.  
  305. function LoWord(nDwNum)
  306. {
  307.   return nDwNum & 0xFFFF;
  308. }
  309.  
  310. function HiWord(nDwNum)
  311. {
  312.   return (nDwNum >> 16) & 0xFFFF;
  313. }
  314.  
  315. function Ctrl()
  316. {
  317.   return oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
  318. }
  319.  
  320. function Shift()
  321. {
  322.   return oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000;
  323. }
  324.  
  325. function Alt()
  326. {
  327.   return oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU*/) & 0x8000;
  328. }
  329.  
  330. function SendMessage(hWnd, uMsg, wParam, lParam)
  331. {
  332.   return AkelPad.SendMessage(hWnd, uMsg, wParam, lParam);
  333. }
  334.  
  335. function ResizeDlg(nW, nH)
  336. {
  337.   var nFlags = 0x14; //SWP_NOACTIVATE|SWP_NOZORDER
  338.   var nBW    = Math.round((nW - 4 * 8) / 3);
  339.   var i;
  340.  
  341.   for (i = 0; i < 2; ++i)
  342.   {
  343.     oSys.Call("User32::SetWindowPos",
  344.       aDlg[IDSET + i][HWND], 0,
  345.       8,
  346.       10 + 15 * i,
  347.       nW - 2 * 8,
  348.       13,
  349.       nFlags);
  350.   }
  351.   oSys.Call("User32::SetWindowPos",
  352.     aDlg[IDPLUG][HWND], 0,
  353.     8,
  354.     45,
  355.     nW - 2 * 8,
  356.     nH - 3 * 23 - 2 * 2 - 2 * 8 - 45,
  357.     nFlags);
  358.   for (i = 0; i < 3; ++i)
  359.   {
  360.     oSys.Call("User32::SetWindowPos",
  361.       aDlg[IDB1 + i][HWND], 0,
  362.       8,
  363.       nH - 3 * 23 - 2 * 2 - 8 + 25 * i,
  364.       nBW,
  365.       23,
  366.       nFlags);
  367.     oSys.Call("User32::SetWindowPos",
  368.       aDlg[IDB4 + i][HWND], 0,
  369.       nBW + 2 * 8,
  370.       nH - 3 * 23 - 2 * 2 - 8 + 25 * i,
  371.       nBW,
  372.       23,
  373.       nFlags);
  374.     oSys.Call("User32::SetWindowPos",
  375.       aDlg[IDB7 + i][HWND], 0,
  376.       nW - nBW - 8,
  377.       nH - 3 * 23 - 2 * 2 - 8 + 25 * i,
  378.       nBW,
  379.       23,
  380.       nFlags);
  381.   }
  382.  
  383.   for (i = 0; i < 3; ++i)
  384.     SendMessage(aDlg[IDPLUG][HWND], 0x101E /*LVM_SETCOLUMNWIDTH*/, i, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
  385.  
  386.   SendMessage(aDlg[IDPLUG][HWND], 0x1013 /*LVM_ENSUREVISIBLE*/, GetNextSelLV(-1), false);
  387.   oSys.Call("user32::InvalidateRect", hDlg, 0, true);
  388. }
  389.  
  390. function PaintSizeGrip()
  391. {
  392.   var lpPaint = AkelPad.MemAlloc(_X64 ? 72 : 64); //sizeof(PAINTSTRUCT)
  393.   var lpRect  = AkelPad.MemAlloc(16); //sizeof(RECT)
  394.   var hDC;
  395.  
  396.   if (hDC = oSys.Call("User32::BeginPaint", hDlg, lpPaint))
  397.   {
  398.     oSys.Call("User32::GetClientRect", hDlg, lpRect);
  399.  
  400.     AkelPad.MemCopy(_PtrAdd(lpRect, 0), AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD) - oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/), DT_DWORD);
  401.     AkelPad.MemCopy(_PtrAdd(lpRect, 4), AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), DT_DWORD);
  402.  
  403.     oSys.Call("User32::DrawFrameControl", hDC, lpRect, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/);
  404.     oSys.Call("User32::EndPaint", hDlg, lpPaint);
  405.   }
  406.  
  407.   AkelPad.MemFree(lpPaint);
  408.   AkelPad.MemFree(lpRect);
  409. }
  410.  
  411. function GetItemCountLV()
  412. {
  413.   return SendMessage(aDlg[IDPLUG][HWND], 0x1004 /*LVM_GETITEMCOUNT*/, 0, 0);
  414. }
  415.  
  416. function GetItemTextLV(nItem, nSubItem)
  417. {
  418.   AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), nSubItem, DT_DWORD);
  419.   SendMessage(aDlg[IDPLUG][HWND], 0x1073 /*LVM_GETITEMTEXTW*/, nItem, lpLVITEM);
  420.   return AkelPad.MemRead(lpBuffer, DT_UNICODE);
  421. }
  422.  
  423. function SetItemTextLV(nItem, nSubItem, sText)
  424. {
  425.   AkelPad.MemCopy(_PtrAdd(lpLVITEM, 4), nItem,    DT_DWORD);
  426.   AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), nSubItem, DT_DWORD);
  427.   AkelPad.MemCopy(lpBuffer, sText, DT_UNICODE);
  428.   SendMessage(aDlg[IDPLUG][HWND], 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);
  429. }
  430.  
  431. function GetNextSelLV(nItem)
  432. {
  433.   return SendMessage(aDlg[IDPLUG][HWND], 0x100C /*LVM_GETNEXTITEM*/, nItem, 0x0002 /*LVNI_SELECTED*/);
  434. }
  435.  
  436. function GetSelArrayLV()
  437. {
  438.   var aSel  = [];
  439.   var nItem = -1;
  440.  
  441.   while (true)
  442.   {
  443.     nItem = GetNextSelLV(nItem);
  444.  
  445.     if (nItem < 0)
  446.       break;
  447.  
  448.     aSel.push(nItem);
  449.   }
  450.  
  451.   return aSel;
  452. }
  453.  
  454. function SetSelLV(nItem)
  455. {
  456.   AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD);
  457.   AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD);
  458.   SendMessage(aDlg[IDPLUG][HWND], 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
  459.   SendMessage(aDlg[IDPLUG][HWND], 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, false);
  460. }
  461.  
  462. function InsertItemLV(nItem, aItems)
  463. {
  464.   var i;
  465.  
  466.   AkelPad.MemCopy(_PtrAdd(lpLVITEM, 4), nItem, DT_DWORD);
  467.   AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8),     0, DT_DWORD);
  468.   AkelPad.MemCopy(lpBuffer, aItems[0], DT_UNICODE);
  469.   SendMessage(aDlg[IDPLUG][HWND], 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);
  470.  
  471.   for (i = 1; i < aItems.length; ++i)
  472.   {
  473.     AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), i, DT_DWORD);
  474.     AkelPad.MemCopy(lpBuffer, aItems[i], DT_UNICODE);
  475.     SendMessage(aDlg[IDPLUG][HWND], 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);
  476.   }
  477. }
  478.  
  479. function FillPlugList()
  480. {
  481.   var aPlugList  = [];
  482.   var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44); //sizeof(LVCOLUMN)
  483.   var nMask      = 5; //LVCF_FMT|LVCF_TEXT
  484.   var aFmt       = [0 /*LVCFMT_LEFT*/, 0, 0]; //Alignment of the column header
  485.   var aText      = [AkelPad.MemStrPtr(sTxtPlugin), AkelPad.MemStrPtr(sTxtKeyTextName), AkelPad.MemStrPtr(sTxtTextFile)];
  486.   var i;
  487.  
  488.   if (bSetInReg)
  489.     GetPluginsFromReg(aPlugList);
  490.   else
  491.     GetPluginsFromIni(aPlugList);
  492.  
  493.   SendMessage(aDlg[IDPLUG][HWND], 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0, 0x0021 /*LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES*/);
  494.   AkelPad.MemCopy(lpLVCOLUMN, nMask, DT_DWORD);
  495.  
  496.   for (i = 0; i < aFmt.length; ++i)
  497.   {
  498.     AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, 4), aFmt[i], DT_DWORD);
  499.     AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, _X64 ? 16 : 12), aText[i], DT_QWORD);
  500.     SendMessage(aDlg[IDPLUG][HWND], 0x1061 /*LVM_INSERTCOLUMNW*/, i, lpLVCOLUMN);
  501.   }
  502.   AkelPad.MemFree(lpLVCOLUMN);
  503.  
  504.   for (i = 0; i < aPlugList.length; ++i)
  505.   {
  506.     if (oPlugText[aPlugList[i][0]] &&
  507.         oPlugText[aPlugList[i][0]][aPlugList[i][1]] &&
  508.         oPlugText[aPlugList[i][0]][aPlugList[i][1]].File)
  509.       aPlugList[i].push(oPlugText[aPlugList[i][0]][aPlugList[i][1]].File);
  510.     else
  511.       aPlugList[i].push(aPlugList[i][0] + "." + aPlugList[i][1].replace(/[<>:"\/\\|?*]/g, "_") + ".akelmenu");
  512.  
  513.     InsertItemLV(i, aPlugList[i]);
  514.     aFrame[i] = 0;
  515.  
  516.     if (oPlugText[aPlugList[i][0]] &&
  517.         oPlugText[aPlugList[i][0]][aPlugList[i][1]] &&
  518.         oPlugText[aPlugList[i][0]][aPlugList[i][1]].Sel)
  519.       SetSelLV(i);
  520.   }
  521.  
  522.   if (GetNextSelLV(-1) < 0)
  523.     SetSelLV(0);
  524. }
  525.  
  526. function GetPluginsFromIni(aPlugList)
  527. {
  528.   var oRE1      = /^\/.+(?==)/gm;
  529.   var oRE2      = /^.+Text(?==)/gm;
  530.   var aPlugName = [["Coder", oRE1], ["ContextMenu", oRE2], ["Hotkeys", oRE2], ["SpecialChar", oRE2]];
  531.   var sPlugDir  = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\";
  532.   var hFindFile = oSys.Call("Kernel32::FindFirstFileW", sPlugDir + "ToolBar*.ini", lpBuffer);
  533.   var sToolBarName;
  534.   var aText;
  535.   var i, n;
  536.  
  537.   if (hFindFile != -1) //INVALID_HANDLE_VALUE
  538.   {
  539.     do
  540.     {
  541.       if (! (AkelPad.MemRead(lpBuffer, DT_DWORD) & 16 /*FILE_ATTRIBUTE_DIRECTORY*/))
  542.       {
  543.         sToolBarName = AkelPad.MemRead(_PtrAdd(lpBuffer, 44 /*offsetof(WIN32_FIND_DATAW, cFileName)*/), DT_UNICODE);
  544.         sToolBarName = sToolBarName.substring(sToolBarName.lastIndexOf("\\") + 1, sToolBarName.lastIndexOf("."));
  545.         aPlugName.push([sToolBarName, oRE2]);
  546.       }
  547.     }
  548.     while (oSys.Call("Kernel32::FindNextFileW", hFindFile, lpBuffer));
  549.  
  550.     oSys.Call("Kernel32::FindClose", hFindFile);
  551.   }
  552.  
  553.   for (i = 0; i < aPlugName.length; ++i)
  554.   {
  555.     if ((oFSO.FileExists(sPlugDir + aPlugName[i][0] + ".ini")) &&
  556.         (aText = AkelPad.ReadFile(sPlugDir + aPlugName[i][0] + ".ini", 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/).match(aPlugName[i][1])))
  557.     {
  558.       for (n = 0; n < aText.length; ++n)
  559.         aPlugList.push([aPlugName[i][0], aText[n]]);
  560.     }
  561.   }
  562. }
  563.  
  564. function GetPluginsFromReg(aPlugList)
  565. {
  566.   var oRE1       = /^\/.+/;
  567.   var oRE2       = /.+Text$/;
  568.   var aPlugName  = [["Coder", oRE1], ["ContextMenu", oRE2], ["Hotkeys", oRE2], ["SpecialChar", oRE2]];
  569.   var sPlugKey   = "Software\\Akelsoft\\AkelPad\\Plugs";
  570.   var lpCount    = AkelPad.MemAlloc(4);
  571.   var lpNameLen  = AkelPad.MemAlloc(4);
  572.   var lpType     = AkelPad.MemAlloc(4);
  573.   var lpName;
  574.   var nNameLen;
  575.   var sToolBarName;
  576.   var sValueName;
  577.   var hKey;
  578.   var i;
  579.  
  580.   if (hKey = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, sPlugKey, 0x0009 /*KEY_ENUMERATE_SUB_KEYS|KEY_QUERY_VALUE*/))
  581.   {
  582.     if (! oSys.Call("Advapi32::RegQueryInfoKeyW",
  583.             hKey,     //hKey
  584.             0,        //lpClass
  585.             0,        //lpcClass
  586.             0,        //lpReserved
  587.             lpCount,  //lpcSubKeys
  588.             lpNameLen,//lpcMaxSubKeyLen
  589.             0,        //lpcMaxClassLen
  590.             0,        //lpcValues
  591.             0,        //lpcMaxValueNameLen
  592.             0,        //lpcMaxValueLen
  593.             0,        //lpcbSecurityDescri
  594.             0))       //lpftLastWriteTime
  595.     {
  596.       nNameLen = AkelPad.MemRead(lpNameLen, DT_DWORD) + 1;
  597.       lpName   = AkelPad.MemAlloc(nNameLen * 2);
  598.  
  599.       for (i = 0; i < AkelPad.MemRead(lpCount, DT_DWORD); ++i)
  600.       {
  601.         AkelPad.MemCopy(lpNameLen, nNameLen, DT_DWORD);
  602.         if (! oSys.Call("Advapi32::RegEnumKeyExW",
  603.                 hKey,     //hKey
  604.                 i,        //dwIndex
  605.                 lpName,   //lpName
  606.                 lpNameLen,//lpcName
  607.                 0,        //lpReserved
  608.                 0,        //lpClass
  609.                 0,        //lpcClass
  610.                 0))       //lpftLastWriteTime
  611.         {
  612.           sToolBarName = AkelPad.MemRead(lpName, DT_UNICODE);
  613.           if (sToolBarName.indexOf("ToolBar") == 0)
  614.             aPlugName.push([sToolBarName, oRE2]);
  615.         }
  616.       }
  617.       AkelPad.MemFree(lpName);
  618.     }
  619.     oSys.Call("Advapi32::RegCloseKey", hKey);
  620.   }
  621.  
  622.   for (i = 0; i < aPlugName.length; ++i)
  623.   {
  624.     if (hKey = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, sPlugKey + "\\" + aPlugName[i][0], 0x0001 /*KEY_QUERY_VALUE*/))
  625.     {
  626.       if (! oSys.Call("Advapi32::RegQueryInfoKeyW",
  627.               hKey,     //hKey
  628.               0,        //lpClass
  629.               0,        //lpcClass
  630.               0,        //lpReserved
  631.               0,        //lpcSubKeys
  632.               0,        //lpcMaxSubKeyLen
  633.               0,        //lpcMaxClassLen
  634.               lpCount,  //lpcValues
  635.               lpNameLen,//lpcMaxValueNameLen
  636.               0,        //lpcMaxValueLen
  637.               0,        //lpcbSecurityDescri
  638.               0))       //lpftLastWriteTime
  639.       {
  640.         nNameLen = AkelPad.MemRead(lpNameLen, DT_DWORD) + 1;
  641.         lpName   = AkelPad.MemAlloc(nNameLen * 2);
  642.  
  643.         for (n = 0; n < AkelPad.MemRead(lpCount, DT_DWORD); ++n)
  644.         {
  645.           AkelPad.MemCopy(lpNameLen, nNameLen, DT_DWORD);
  646.           if (! oSys.Call("Advapi32::RegEnumValueW",
  647.                   hKey,     //hKey
  648.                   n,        //dwIndex
  649.                   lpName,   //lpValueName
  650.                   lpNameLen,//lpcchValueName
  651.                   0,        //lpReserved
  652.                   lpType,   //lpType
  653.                   0,        //lpData
  654.                   0))       //lpcbData
  655.           {
  656.             sValueName = AkelPad.MemRead(lpName, DT_UNICODE);
  657.             if (aPlugName[i][1].test(sValueName) && (AkelPad.MemRead(lpType, DT_DWORD) == 3 /*REG_BINARY*/))
  658.               aPlugList.push([aPlugName[i][0], sValueName]);
  659.           }
  660.         }
  661.         AkelPad.MemFree(lpName);
  662.       }
  663.       oSys.Call("Advapi32::RegCloseKey", hKey);
  664.     }
  665.   }
  666.  
  667.   AkelPad.MemFree(lpCount);
  668.   AkelPad.MemFree(lpNameLen);
  669.   AkelPad.MemFree(lpType);
  670. }
  671.  
  672. function GetRegKeyHandle(hParentKey, sSubKey, nAccess)
  673. {
  674.   var lpKey  = AkelPad.MemAlloc(_X64 ? 8 : 4);
  675.   var hKey   = 0;
  676.   var nError = oSys.Call("Advapi32::RegOpenKeyExW",
  677.                  hParentKey,//hKey
  678.                  sSubKey,   //lpSubKey
  679.                  0,         //ulOptions
  680.                  nAccess,   //samDesired
  681.                  lpKey);    //phkResult
  682.  
  683.   if (! nError)
  684.     hKey = AkelPad.MemRead(lpKey, DT_QWORD);
  685.  
  686.   AkelPad.MemFree(lpKey);
  687.  
  688.   return hKey;
  689. }
  690.  
  691. function EditText(bSave, bMouseClick)
  692. {
  693.   var sTextDir  = ExpandDirName(sTextDirS);
  694.   var sPlugDir  = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\";
  695.   var aSel      = GetSelArrayLV();
  696.   var aSaved    = [];
  697.   var aNotSaved = [];
  698.   var sMessage  = "";
  699.   var hKey;
  700.   var lpType;
  701.   var lpData;
  702.   var lpDataLen;
  703.   var sIniFile;
  704.   var oRE;
  705.   var bWasSaved;
  706.   var i, n;
  707.  
  708.   if (bSave && (AkelPad.MessageBox(hDlg, sTxtWantSave, sTxtScriptName, 0x21 /*MB_DEFBUTTON1|MB_ICONQUESTION|MB_OKCANCEL*/) != 1 /*IDOK*/))
  709.     return;
  710.  
  711.   if (bSetInReg)
  712.   {
  713.     lpType    = AkelPad.MemAlloc(4);
  714.     lpDataLen = AkelPad.MemAlloc(4);
  715.  
  716.     for (i = 0; i < aSel.length; ++i)
  717.     {
  718.       bWasSaved = false;
  719.  
  720.       if (hKey = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, "Software\\Akelsoft\\AkelPad\\Plugs\\" + GetItemTextLV(aSel[i], 0), 0x0001 /*KEY_QUERY_VALUE*/))
  721.       {
  722.         oSys.Call("Advapi32::RegQueryInfoKeyW",
  723.           hKey,     //hKey
  724.           0,        //lpClass
  725.           0,        //lpcClass
  726.           0,        //lpReserved
  727.           0,        //lpcSubKeys
  728.           0,        //lpcMaxSubKeyLen
  729.           0,        //lpcMaxClassLen
  730.           0,        //lpcValues
  731.           0,        //lpcMaxValueNameLen
  732.           lpDataLen,//lpcMaxValueLen
  733.           0,        //lpcbSecurityDescri
  734.           0);       //lpftLastWriteTime
  735.  
  736.         lpData = AkelPad.MemAlloc(AkelPad.MemRead(lpDataLen, DT_DWORD));
  737.  
  738.         if ((! oSys.Call("Advapi32::RegQueryValueExW",
  739.                  hKey,                     //hKey
  740.                  GetItemTextLV(aSel[i], 1),//lpValueName
  741.                  0,                        //lpReserved
  742.                  lpType,                   //lpType
  743.                  lpData,                   //lpData
  744.                  lpDataLen))               //lpcbData
  745.             && (AkelPad.MemRead(lpType, DT_DWORD) == 3 /*REG_BINARY*/))
  746.         {
  747.           if (bSave)
  748.           {
  749.             var sText = AkelPad.MemRead(lpData, DT_UNICODE);
  750.             if (bCRLF)
  751.               sText = sText.replace(/\r/g, "\r\n");
  752.             if (AkelPad.WriteFile(sTextDir + GetItemTextLV(aSel[i], 2), sText, -1, bUTF8 ? 65001 /*UTF-8*/ : 1200 /*UTF-16LE*/, 1 /*bBOM*/) == 0 /*ESD_SUCCESS*/)
  753.             {
  754.               aSaved.push(aSel[i]);
  755.               bWasSaved = true;
  756.             }
  757.           }
  758.           else
  759.             OpenText(lpData, aSel[i], bMouseClick);
  760.         }
  761.  
  762.         oSys.Call("Advapi32::RegCloseKey", hKey);
  763.         AkelPad.MemFree(lpData);
  764.       }
  765.  
  766.       if (bSave && (! bWasSaved))
  767.         aNotSaved.push(aSel[i]);
  768.     }
  769.  
  770.     AkelPad.MemFree(lpType);
  771.     AkelPad.MemFree(lpDataLen);
  772.   }
  773.  
  774.   else
  775.   {
  776.     for (i = 0; i < aSel.length; ++i)
  777.     {
  778.       bWasSaved = false;
  779.       sIniFile  = sPlugDir + GetItemTextLV(aSel[i], 0) + ".ini";
  780.  
  781.       if (oFSO.FileExists(sIniFile))
  782.       {
  783.         oRE = new RegExp(escapeRegExp(GetItemTextLV(aSel[i], 1)) + "=([\\dA-F]*)");
  784.  
  785.         if (oRE.test(AkelPad.ReadFile(sIniFile, 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/)))
  786.         {
  787.           lpData = AkelPad.MemAlloc(RegExp.$1.length / 2);
  788.  
  789.           for (n = 0; n < RegExp.$1.length; n += 2)
  790.             AkelPad.MemCopy(_PtrAdd(lpData, n / 2), parseInt(RegExp.$1.substr(n, 2), 16), DT_BYTE);
  791.  
  792.           if (bSave)
  793.           {
  794.             var sText = AkelPad.MemRead(lpData, DT_UNICODE);
  795.             if (bCRLF)
  796.               sText = sText.replace(/\r/g, "\r\n");
  797.             if (AkelPad.WriteFile(sTextDir + GetItemTextLV(aSel[i], 2), sText, -1, bUTF8 ? 65001 /*UTF-8*/ : 1200 /*UTF-16LE*/, 1 /*bBOM*/) == 0 /*ESD_SUCCESS*/)
  798.             {
  799.               aSaved.push(aSel[i]);
  800.               bWasSaved = true;
  801.             }
  802.           }
  803.           else
  804.             OpenText(lpData, aSel[i], bMouseClick);
  805.  
  806.           AkelPad.MemFree(lpData);
  807.         }
  808.       }
  809.  
  810.       if (bSave && (! bWasSaved))
  811.         aNotSaved.push(aSel[i]);
  812.     }
  813.   }
  814.  
  815.   if (bSave)
  816.   {
  817.     if (aSaved.length)
  818.     {
  819.       sMessage += sTxtSaved + "\n";
  820.       for (i = 0; i < aSaved.length; ++i)
  821.         sMessage += sTextDir + GetItemTextLV(aSaved[i], 2) + "\n";
  822.     }
  823.  
  824.     if (aNotSaved.length)
  825.     {
  826.       sMessage += "\n" + sTxtNotSaved + "\n";
  827.       for (i = 0; i < aNotSaved.length; ++i)
  828.         sMessage += sTextDir + GetItemTextLV(aNotSaved[i], 2) + "\n";
  829.     }
  830.  
  831.     AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x40 /*MB_ICONINFORMATION*/);
  832.   }
  833. }
  834.  
  835. function OpenText(lpData, nSel, bMouseClick)
  836. {
  837.   var hFocus;
  838.  
  839.   if (aFrame[nSel])
  840.   {
  841.     if (bMouseClick && (aFrame[nSel] == SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0)))
  842.     {
  843.       hFocus = oSys.Call("User32::GetFocus");
  844.  
  845.       oSys.Call("User32::EnableWindow", hDlg, 0);
  846.       AkelPad.ScriptNoMutex(0x20 /*ULT_UNLOCKSENDMESSAGE*/);
  847.  
  848.       AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
  849.  
  850.       AkelPad.ScriptNoMutex(0x10 /*ULT_LOCKSENDMESSAGE*/);
  851.       oSys.Call("User32::EnableWindow", hDlg, 1);
  852.       oSys.Call("User32::SetFocus", hFocus);
  853.     }
  854.     else
  855.       SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, aFrame[nSel]);
  856.   }
  857.   else
  858.   {
  859.     var sTabText = GetItemTextLV(nSel, 0) + ": " + GetItemTextLV(nSel, 1);
  860.     var lpText   = AkelPad.MemAlloc((sTabText.length + 1) * 2);
  861.     var lpTCITEM = AkelPad.MemAlloc(_X64 ? 40 : 28 /*sizeof(TCITEM)*/);
  862.     var hWndTab  = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 13 /*MI_WNDTAB*/, 0);
  863.     var nTab;
  864.  
  865.     SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 1 /*lParam=TRUE*/);
  866.     AkelPad.Command(bUTF8 ? 4127 /*IDM_FILE_REOPENAS_UTF8*/ : 4125 /*IDM_FILE_REOPENAS_UTF16LE*/);
  867.     AkelPad.Command(bCRLF ? 4184 /*IDM_EDIT_NEWLINE_WIN*/ : 4186 /*IDM_EDIT_NEWLINE_MAC*/);
  868.     oSys.Call("User32::SetWindowTextW", AkelPad.GetEditWnd(), lpData);
  869.  
  870.     if (AkelPad.IsPluginRunning("Coder::HighLight"))
  871.       AkelPad.Call("Coder::Settings", 1, "akelmenu");
  872.  
  873.     aFrame[nSel] = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);
  874.     nTab         = SendMessage(hWndTab, 4875 /*TCM_GETCURSEL*/, 0, 0);
  875.  
  876.     AkelPad.MemCopy(lpText, sTabText, 1 /*DT_UNICODE*/);
  877.     AkelPad.MemCopy(lpTCITEM, 1 /*TCIF_TEXT*/, 3 /*DT_DWORD*/); //mask
  878.     AkelPad.MemCopy(_PtrAdd(lpTCITEM, _X64 ? 16 : 12), lpText, 2 /*DT_QWORD*/); //pszText
  879.  
  880.     SendMessage(hWndTab, 4925 /*TCM_SETITEMW*/, nTab, lpTCITEM);
  881.  
  882.     AkelPad.MemFree(lpTCITEM);
  883.     AkelPad.MemFree(lpText);
  884.   }
  885. }
  886.  
  887. function LoadTextToPlugin(bFromFile)
  888. {
  889.   var nCurFrame  = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);
  890.   var sTextDir   = ExpandDirName(sTextDirS);
  891.   var sPlugDir   = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\";
  892.   var aSel       = GetSelArrayLV();
  893.   var aLoaded    = [];
  894.   var aNotLoaded = [];
  895.   var sMessage   = "";
  896.   var sPrevPlug  = "";
  897.   var hKey;
  898.   var lpType;
  899.   var sIniFile;
  900.   var sBakFile;
  901.   var sText;
  902.   var sIniText;
  903.   var nSize;
  904.   var lpData;
  905.   var oRE;
  906.   var bWasLoaded;
  907.   var i, n;
  908.  
  909.   if (AkelPad.MessageBox(hDlg, sTxtWantLoad, sTxtScriptName, 0x21 /*MB_DEFBUTTON1|MB_ICONQUESTION|MB_OKCANCEL*/) != 1 /*IDOK*/)
  910.     return;
  911.  
  912.   if (bSetInReg)
  913.   {
  914.     lpType = AkelPad.MemAlloc(4);
  915.  
  916.     for (i = 0; i < aSel.length; ++i)
  917.     {
  918.       bWasLoaded = false;
  919.       hKey       = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, "Software\\Akelsoft\\AkelPad\\Plugs\\" + GetItemTextLV(aSel[i], 0), 0x0003 /*KEY_SET_VALUE|KEY_QUERY_VALUE*/);
  920.       sText      = bFromFile ? AkelPad.ReadFile(sTextDir + GetItemTextLV(aSel[i], 2), 0x1D /*ADT_BINARYERROR|ADT_DETECTCODEPAGE|ADT_DETECTBOM|ADT_NOMESSAGES*/) : GetTextAE(aSel[i]);
  921.  
  922.       if (hKey
  923.           && (! oSys.Call("Advapi32::RegQueryValueExW",
  924.                   hKey,                     //hKey
  925.                   GetItemTextLV(aSel[i], 1),//lpValueName
  926.                   0,                        //lpReserved
  927.                   lpType,                   //lpType
  928.                   0,                        //lpData
  929.                   0))                       //lpcbData
  930.           && (AkelPad.MemRead(lpType, DT_DWORD) == 3 /*REG_BINARY*/)
  931.           && sText)
  932.       {
  933.         //create registry key backup file
  934.         if (GetItemTextLV(aSel[i], 0) != sPrevPlug)
  935.         {
  936.           sBakFile = sTextDir + GetItemTextLV(aSel[i], 0) + ".reg.bak";
  937.           DeleteFile(sBakFile);
  938.           AkelPad.Exec("reg.exe export HKEY_CURRENT_USER\\Software\\Akelsoft\\AkelPad\\Plugs\\" + GetItemTextLV(aSel[i], 0) + " " + sBakFile, "", 1);
  939.           sPrevPlug = GetItemTextLV(aSel[i], 0);
  940.         }
  941.  
  942.         sText  = sText.replace(/\r?\n/g, "\r"); //convert line endings to \r
  943.         nSize  = (sText.length + 1) * 2;
  944.         lpData = AkelPad.MemAlloc(nSize);
  945.         AkelPad.MemCopy(lpData, sText, DT_UNICODE);
  946.  
  947.         if ((! oSys.Call("Advapi32::RegSetValueExW",
  948.                  hKey,                     //hKey
  949.                  GetItemTextLV(aSel[i], 1),//lpValueName
  950.                  0,                        //Reserved
  951.                  3,                        //dwType = REG_BINARY
  952.                  lpData,                   //lpData
  953.                  nSize)))                  //cbData
  954.         {
  955.           aLoaded.push(aSel[i]);
  956.           bWasLoaded = true;
  957.         }
  958.  
  959.         AkelPad.MemFree(lpData);
  960.       }
  961.  
  962.       oSys.Call("Advapi32::RegCloseKey", hKey);
  963.       if (! bWasLoaded)
  964.         aNotLoaded.push(aSel[i]);
  965.     }
  966.  
  967.     AkelPad.MemFree(lpType);
  968.   }
  969.  
  970.   else
  971.   {
  972.     for (i = 0; i < aSel.length; ++i)
  973.     {
  974.       bWasLoaded = false;
  975.       sIniFile   = sPlugDir + GetItemTextLV(aSel[i], 0) + ".ini";
  976.       sText      = bFromFile ? AkelPad.ReadFile(sTextDir + GetItemTextLV(aSel[i], 2), 0x1D /*ADT_BINARYERROR|ADT_DETECTCODEPAGE|ADT_DETECTBOM|ADT_NOMESSAGES*/) : GetTextAE(aSel[i]);
  977.  
  978.       if (oFSO.FileExists(sIniFile) && sText)
  979.       {
  980.         oRE      = new RegExp(escapeRegExp(GetItemTextLV(aSel[i], 1)) + "=[\\dA-F]*");
  981.         sIniText = AkelPad.ReadFile(sIniFile, 0x10 /*ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/);
  982.         sText    = sText.replace(/\r?\n/g, "\r"); //convert line endings to \r
  983.         nSize    = (sText.length + 1) * 2;
  984.         lpData   = AkelPad.MemAlloc(nSize);
  985.         AkelPad.MemCopy(lpData, sText, DT_UNICODE);
  986.  
  987.         sText = "";
  988.         for (n = 0; n < nSize; ++n)
  989.           sText += PadL0(AkelPad.MemRead(_PtrAdd(lpData, n), DT_BYTE).toString(16).toUpperCase());
  990.         AkelPad.MemFree(lpData);
  991.  
  992.         if (sText && oRE.test(sIniText))
  993.         {
  994.           //create backup .ini file
  995.           if (GetItemTextLV(aSel[i], 0) != sPrevPlug)
  996.           {
  997.             sBakFile = sTextDir + GetItemTextLV(aSel[i], 0) + ".ini.bak";
  998.             CopyFile(sIniFile, sBakFile);
  999.             sPrevPlug = GetItemTextLV(aSel[i], 0);
  1000.           }
  1001.  
  1002.           if (AkelPad.WriteFile(sIniFile, sIniText.replace(oRE, GetItemTextLV(aSel[i], 1) + "=" + sText), -1, 1200 /*UTF-16LE*/, 1 /*bBOM*/) == 0 /*ESD_SUCCESS*/)
  1003.           {
  1004.             aLoaded.push(aSel[i]);
  1005.             bWasLoaded = true;
  1006.           }
  1007.         }
  1008.       }
  1009.  
  1010.       if (! bWasLoaded)
  1011.         aNotLoaded.push(aSel[i]);
  1012.     }
  1013.   }
  1014.  
  1015.   if (aLoaded.length)
  1016.   {
  1017.     sMessage += sTxtLoaded + "\n";
  1018.  
  1019.     for (i = 0; i < aLoaded.length; ++i)
  1020.     {
  1021.       sMessage += GetItemTextLV(aLoaded[i], 0) + ": " + GetItemTextLV(aLoaded[i], 1) + "\n";
  1022.       RestartPlugin(GetItemTextLV(aLoaded[i], 0));
  1023.     }
  1024.  
  1025.     if ((! bFromFile) && AkelPad.IsPluginRunning("Coder::HighLight"))
  1026.     {
  1027.       for (i = 0; i < aFrame.length; ++i)
  1028.       {
  1029.         if (aFrame[i])
  1030.         {
  1031.           SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, aFrame[i]);
  1032.           AkelPad.Call("Coder::Settings", 1, "akelmenu");
  1033.         }
  1034.       }
  1035.     }
  1036.   }
  1037.  
  1038.   if (aNotLoaded.length)
  1039.   {
  1040.     sMessage += "\n" + sTxtNotLoaded + "\n";
  1041.  
  1042.     for (i = 0; i < aNotLoaded.length; ++i)
  1043.       sMessage += GetItemTextLV(aNotLoaded[i], 0) + ": " + GetItemTextLV(aNotLoaded[i], 1) + "\n";
  1044.   }
  1045.  
  1046.   if (! bFromFile)
  1047.     SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, nCurFrame);
  1048.  
  1049.   AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x40 /*MB_ICONINFORMATION*/);
  1050. }
  1051.  
  1052. function GetTextAE(nSel)
  1053. {
  1054.   if (aFrame[nSel])
  1055.   {
  1056.     SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, aFrame[nSel]);
  1057.     return AkelPad.GetTextRange(0, -1, 0 /*New line as is*/);
  1058.   }
  1059. }
  1060.  
  1061. function PadL0(sStr)
  1062. {
  1063.   if (sStr.length == 1)
  1064.     sStr = "0" + sStr;
  1065.  
  1066.   return sStr;
  1067. }
  1068.  
  1069. function RestartPlugin(sPlugName)
  1070. {
  1071.   var bCoderHL;
  1072.   var bCoderCF;
  1073.   var bCoderAC;
  1074.  
  1075.   if (sPlugName == "Coder")
  1076.   {
  1077.     if (AkelPad.IsPluginRunning(sPlugName + "::HighLight"))
  1078.     {
  1079.       bCoderHL = 1;
  1080.       AkelPad.Call(sPlugName + "::HighLight");
  1081.     }
  1082.     if (AkelPad.IsPluginRunning(sPlugName + "::CodeFold"))
  1083.     {
  1084.       bCoderCF = 1;
  1085.       AkelPad.Call(sPlugName + "::CodeFold");
  1086.     }
  1087.     if (AkelPad.IsPluginRunning(sPlugName + "::AutoComplete"))
  1088.     {
  1089.       bCoderAC = 1;
  1090.       AkelPad.Call(sPlugName + "::AutoComplete");
  1091.     }
  1092.  
  1093.     if (bCoderHL)
  1094.       AkelPad.Call(sPlugName + "::HighLight");
  1095.     if (bCoderCF)
  1096.       AkelPad.Call(sPlugName + "::CodeFold");
  1097.     if (bCoderAC)
  1098.       AkelPad.Call(sPlugName + "::AutoComplete");
  1099.   }
  1100.   else if ((sPlugName == "ContextMenu") || (sPlugName == "Hotkeys"))
  1101.   {
  1102.     if (AkelPad.IsPluginRunning(sPlugName + "::Main"))
  1103.     {
  1104.       AkelPad.Call(sPlugName + "::Main", 10);
  1105.       AkelPad.Call(sPlugName + "::Main", 10);
  1106.     }
  1107.   }
  1108.   //SpecialChar, ToolBar*
  1109.   else
  1110.   {
  1111.     if (AkelPad.IsPluginRunning(sPlugName + "::Main"))
  1112.     {
  1113.       AkelPad.Call(sPlugName + "::Main");
  1114.       AkelPad.Call(sPlugName + "::Main");
  1115.     }
  1116.   }
  1117. }
  1118.  
  1119. function EditTextFile()
  1120. {
  1121.   var sTextDir = ExpandDirName(sTextDirS);
  1122.   var aSel     = GetSelArrayLV();
  1123.   var aNoFile  = [];
  1124.   var sTextFile;
  1125.   var i;
  1126.  
  1127.   for (i = 0; i < aSel.length; ++i)
  1128.   {
  1129.     sTextFile = sTextDir + GetItemTextLV(aSel[i], 2);
  1130.  
  1131.     if (oFSO.FileExists(sTextFile))
  1132.       AkelPad.OpenFile(sTextFile);
  1133.     else
  1134.       aNoFile.push(aSel[i]);
  1135.   }
  1136.  
  1137.   if (aNoFile.length)
  1138.   {
  1139.     sMessage = sTxtNoFiles + "\n";
  1140.     for (i = 0; i < aNoFile.length; ++i)
  1141.       sMessage += sTextDir + GetItemTextLV(aNoFile[i], 2) + "\n";
  1142.  
  1143.     AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
  1144.   }
  1145. }
  1146.  
  1147. function RenameTextFile()
  1148. {
  1149.   var aSel = GetSelArrayLV();
  1150.   var sOldName;
  1151.   var sNewName;
  1152.  
  1153.   for (i = 0; i < aSel.length; ++i)
  1154.   {
  1155.     sOldName = GetItemTextLV(aSel[i], 2);
  1156.     sNewName = GetFileName(sTxtRenameFile, sOldName + "\n\n" + sTxtNewName, sOldName);
  1157.  
  1158.     if (sNewName)
  1159.     {
  1160.       if (sNewName != sOldName)
  1161.       {
  1162.         SetItemTextLV(aSel[i], 2, sNewName);
  1163.         RenameFile(ExpandDirName(sTextDirS) + sOldName, ExpandDirName(sTextDirS) + sNewName);
  1164.       }
  1165.     }
  1166.     else
  1167.       break;
  1168.   }
  1169. }
  1170.  
  1171. function GetFileName(sCaption, sLabel, sName)
  1172. {
  1173.   while (true)
  1174.   {
  1175.     sName = AkelPad.InputBox(hDlg, sCaption, sLabel, sName);
  1176.  
  1177.     if (sName)
  1178.     {
  1179.       sName = sName.replace(/[ .]+$/, "");
  1180.  
  1181.       if (/^(CON|PRN|AUX|NUL|COM1|COM2|COM3|COM4|COM5|COM6|COM7|COM8|COM9|LPT1|LPT2|LPT3|LPT4|LPT5|LPT6|LPT7|LPT8|LPT9)$/i.test(sName))
  1182.         AkelPad.MessageBox(hDlg, sName + "\n\n" + sTxtBadName, sCaption, 0x30 /*MB_ICONWARNING*/);
  1183.       else if (/[<>:"\/\\|?*]/.test(sName))
  1184.         AkelPad.MessageBox(hDlg, sName + "\n\n" + sTxtBadChar, sCaption, 0x30 /*MB_ICONWARNING*/);
  1185.       else
  1186.         break;
  1187.     }
  1188.     else
  1189.       break;
  1190.   }
  1191.  
  1192.   return sName;
  1193. }
  1194.  
  1195. function DeleteTextFile()
  1196. {
  1197.   var sTextDir    = ExpandDirName(sTextDirS);
  1198.   var aSel        = GetSelArrayLV();
  1199.   var aDeleted    = [];
  1200.   var aNotDeleted = [];
  1201.   var sMessage    = "";
  1202.  
  1203.   if (AkelPad.MessageBox(hDlg, sTxtWantDelete, sTxtScriptName, 0x21 /*MB_DEFBUTTON1|MB_ICONQUESTION|MB_OKCANCEL*/) == 1 /*IDOK*/)
  1204.   {
  1205.     for (i = 0; i < aSel.length; ++i)
  1206.     {
  1207.       if (DeleteFile(sTextDir + GetItemTextLV(aSel[i], 2)))
  1208.         aDeleted.push(aSel[i]);
  1209.       else
  1210.         aNotDeleted.push(aSel[i]);
  1211.     }
  1212.  
  1213.     if (aDeleted.length)
  1214.     {
  1215.       sMessage += sTxtDeleted + "\n";
  1216.       for (i = 0; i < aDeleted.length; ++i)
  1217.         sMessage += sTextDir + GetItemTextLV(aDeleted[i], 2) + "\n";
  1218.     }
  1219.  
  1220.     if (aNotDeleted.length)
  1221.     {
  1222.       sMessage += "\n" + sTxtNotDeleted + "\n";
  1223.       for (i = 0; i < aNotDeleted.length; ++i)
  1224.         sMessage += sTextDir + GetItemTextLV(aNotDeleted[i], 2) + "\n";
  1225.     }
  1226.  
  1227.     AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x40 /*MB_ICONINFORMATION*/);
  1228.   }
  1229. }
  1230.  
  1231. //function written by Infocatcher
  1232. function escapeRegExp(str)
  1233. {
  1234.   return str.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&");
  1235. }
  1236.  
  1237. function ChangeTextsDir()
  1238. {
  1239.   var sLabel  = "%a - " + sTxtAkelDir + "\n%p - " + sTxtPlugDir + "\n%variable% - " + sTxtEnvVar;
  1240.   var sDirS   = sTextDirS;
  1241.   var bChange = 0;
  1242.   var sDirE;
  1243.  
  1244.   while (true)
  1245.   {
  1246.     sDirS = AkelPad.InputBox(hDlg, sTxtChangeDir, sLabel, sDirS);
  1247.  
  1248.     if (sDirS)
  1249.     {
  1250.       if (sDirS.slice(-1) != "\\")
  1251.         sDirS += "\\";
  1252.  
  1253.       sDirE = ExpandDirName(sDirS);
  1254.  
  1255.       if (oFSO.FolderExists(sDirE))
  1256.       {
  1257.         bChange = 1;
  1258.         break;
  1259.       }
  1260.       else if (AkelPad.MessageBox(hDlg, sDirE + "\n\n" + sTxtDirNoExists, sTxtScriptName, 0x21 /*MB_DEFBUTTON1|MB_ICONQUESTION|MB_OKCANCEL*/) == 1 /*IDOK*/)
  1261.       {
  1262.         if (oSys.Call("Kernel32::CreateDirectoryW", sDirE, 0))
  1263.         {
  1264.           bChange = 1;
  1265.           break;
  1266.         }
  1267.         else
  1268.           AkelPad.MessageBox(hDlg, sDirE + "\n\n" + sTxtDirCreFail, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
  1269.       }
  1270.     }
  1271.     else
  1272.       break;
  1273.   }
  1274.  
  1275.   if (bChange)
  1276.   {
  1277.     sTextDirS = sDirS;
  1278.     oSys.Call("User32::SetWindowTextW", aDlg[IDDIR][HWND], sTxtDir + sDirE);
  1279.   }
  1280. }
  1281.  
  1282. function ExpandDirName(sDir)
  1283. {
  1284.   sDir = sDir.replace(/%a\\/g, AkelPad.GetAkelDir() + "\\");
  1285.   sDir = sDir.replace(/%p\\/g, AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\");
  1286.   sDir = sDir.replace(/%.+?%/g, ExpandEnvironmentString);
  1287.  
  1288.   if (oSys.Call("Kernel32::GetFullPathNameW", sDir, nBufSize / 2, lpBuffer, 0))
  1289.     sDir = AkelPad.MemRead(lpBuffer, DT_UNICODE);
  1290.  
  1291.   return sDir;
  1292. }
  1293.  
  1294. function ExpandEnvironmentString(sStr)
  1295. {
  1296.   if (oSys.Call("Kernel32::ExpandEnvironmentStringsW", sStr, lpBuffer, nBufSize / 2))
  1297.     sStr = AkelPad.MemRead(lpBuffer, DT_UNICODE);
  1298.  
  1299.   return sStr;
  1300. }
  1301.  
  1302. function EditIniFile()
  1303. {
  1304.   var sPlugDir = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\";
  1305.   var aSel     = GetSelArrayLV();
  1306.   var aNoFile  = [];
  1307.   var sIniFile;
  1308.   var nSelStart;
  1309.   var sMessage;
  1310.   var i;
  1311.  
  1312.   for (i = 0; i < aSel.length; ++i)
  1313.   {
  1314.     sIniFile = sPlugDir + GetItemTextLV(aSel[i], 0) + ".ini";
  1315.  
  1316.     if (oFSO.FileExists(sIniFile))
  1317.     {
  1318.       if (AkelPad.OpenFile(sIniFile) == 0 /*EOD_SUCCESS*/)
  1319.       {
  1320.         nSelStart = AkelPad.TextFind(AkelPad.GetEditWnd(), GetItemTextLV(aSel[i], 1), 0x00200001 /*FR_DOWN|FR_BEGINNING*/);
  1321.         if (nSelStart > -1)
  1322.           AkelPad.SetSel(nSelStart, nSelStart + GetItemTextLV(aSel[i], 1).length);
  1323.       }
  1324.     }
  1325.     else
  1326.       aNoFile.push(aSel[i]);
  1327.   }
  1328.  
  1329.   if (aNoFile.length)
  1330.   {
  1331.     sMessage = sTxtNoFiles + "\n";
  1332.     for (i = 0; i < aNoFile.length; ++i)
  1333.       sMessage += sPlugDir + GetItemTextLV(aSel[i], 0) + ".ini" + "\n";
  1334.  
  1335.     AkelPad.MessageBox(hDlg, sMessage, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
  1336.   }
  1337. }
  1338.  
  1339. function OpenInRegEdit()
  1340. {
  1341.   var aSel     = GetSelArrayLV();
  1342.   var hKey     = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, "Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit", 0x0002 /*KEY_SET_VALUE*/);
  1343.   var sValue   = "HKEY_CURRENT_USER\\Software\\Akelsoft\\AkelPad\\Plugs\\" + GetItemTextLV(aSel[0], 0);
  1344.   var nSize    = (sValue.length + 1) * 2;
  1345.   var lpData   = AkelPad.MemAlloc(nSize);
  1346.   var sProcess = "regedit.exe";
  1347.  
  1348.   TerminateProcess(sProcess);
  1349.  
  1350.   AkelPad.MemCopy(lpData, sValue, DT_UNICODE);
  1351.  
  1352.   oSys.Call("Advapi32::RegSetValueExW",
  1353.     hKey,     //hKey
  1354.     "LastKey",//lpValueName
  1355.     0,        //Reserved
  1356.     1,        //dwType = REG_SZ
  1357.     lpData,   //lpData
  1358.     nSize);   //cbData
  1359.  
  1360.   oSys.Call("Advapi32::RegCloseKey", hKey);
  1361.   AkelPad.MemFree(lpData);
  1362.  
  1363.   AkelPad.Exec("rundll32.exe shell32, ShellExec_RunDLL " + sProcess);
  1364. }
  1365.  
  1366. function TerminateProcess(sProcess)
  1367. {
  1368.   var lpPIDs  = AkelPad.MemAlloc(4000);
  1369.   var lpBytes = AkelPad.MemAlloc(4);
  1370.   var lpName  = AkelPad.MemAlloc(260 * 2);
  1371.   var hProcess;
  1372.   var i;
  1373.  
  1374.   sProcess = sProcess.toUpperCase();
  1375.  
  1376.   oSys.Call("Psapi::EnumProcesses", lpPIDs, 4000, lpBytes);
  1377.  
  1378.   for (i = 0; i < AkelPad.MemRead(lpBytes, DT_DWORD) / 4; ++i)
  1379.   {
  1380.     if (hProcess = oSys.Call("Kernel32::OpenProcess",
  1381.                      0x0411 /*PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_TERMINATE*/,
  1382.                      0,
  1383.                      AkelPad.MemRead(_PtrAdd(lpPIDs, i * 4), DT_DWORD)))
  1384.     {
  1385.       oSys.Call("Psapi::GetModuleBaseNameW", hProcess, 0, lpName, 260);
  1386.  
  1387.       if (AkelPad.MemRead(lpName, DT_UNICODE).toUpperCase() == sProcess)
  1388.         oSys.Call("Kernel32::TerminateProcess", hProcess, 0);
  1389.  
  1390.       oSys.Call("Kernel32::CloseHandle", hProcess);
  1391.     }
  1392.   }
  1393.  
  1394.   AkelPad.MemFree(lpPIDs);
  1395.   AkelPad.MemFree(lpBytes);
  1396.   AkelPad.MemFree(lpName);
  1397. }
  1398.  
  1399. function CopyFile(sFromFile, sToFile)
  1400. {
  1401.   try
  1402.   {
  1403.     oFSO.CopyFile(sFromFile, sToFile, 1 /*overwrite*/);
  1404.     return 1;
  1405.   }
  1406.   catch (oError)
  1407.   {}
  1408. }
  1409.  
  1410. function DeleteFile(sFile)
  1411. {
  1412.   try
  1413.   {
  1414.     oFSO.DeleteFile(sFile, 1 /*force*/);
  1415.     return 1;
  1416.   }
  1417.   catch (oError)
  1418.   {}
  1419. }
  1420.  
  1421. function RenameFile(sOldName, sNewName)
  1422. {
  1423.   DeleteFile(sNewName);
  1424.  
  1425.   try
  1426.   {
  1427.     oFSO.MoveFile(sOldName, sNewName);
  1428.     return 1;
  1429.   }
  1430.   catch (oError)
  1431.   {}
  1432. }
  1433.  
  1434. function IsScriptRunning()
  1435. {
  1436.   var hDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0);
  1437.  
  1438.   if (hDlg)
  1439.   {
  1440.     if (! oSys.Call("User32::IsWindowVisible", hDlg))
  1441.       oSys.Call("User32::ShowWindow", hDlg, 8 /*SW_SHOWNA*/);
  1442.     if (oSys.Call("User32::IsIconic", hDlg))
  1443.       oSys.Call("User32::ShowWindow", hDlg, 9 /*SW_RESTORE*/);
  1444.  
  1445.     oSys.Call("User32::SetForegroundWindow", hDlg);
  1446.     return true;
  1447.   }
  1448. }
  1449.  
  1450. function IsSDI()
  1451. {
  1452.   if (! AkelPad.IsMDI())
  1453.   {
  1454.     AkelPad.MessageBox(hMainWnd, sTxtOnlyMDI, sTxtScriptName, 0x30 /*MB_ICONWARNING*/);
  1455.     return true;
  1456.   }
  1457. }
  1458.  
  1459. function ReadIni()
  1460. {
  1461.   try
  1462.   {
  1463.     eval(AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/));
  1464.   }
  1465.   catch (oError)
  1466.   {}
  1467.  
  1468.   if (nWndPosW < nWndMinW) nWndPosW = nWndMinW;
  1469.   if (nWndPosH < nWndMinH) nWndPosH = nWndMinH;
  1470.  
  1471.   if ((! sTextDirS) || (! oFSO.FolderExists(ExpandDirName(sTextDirS))))
  1472.     sTextDirS = "%p\\";
  1473.   else if (sTextDirS.slice(-1) != "\\")
  1474.     sTextDirS += "\\";
  1475. }
  1476.  
  1477. function WriteIni()
  1478. {
  1479.   var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
  1480.   var sPlug;
  1481.   var sText;
  1482.   var sIniText;
  1483.   var i, n;
  1484.  
  1485.   oSys.Call("User32::GetWindowRect", hDlg, lpRect);
  1486.   nWndPosX = AkelPad.MemRead(_PtrAdd(lpRect,  0), DT_DWORD);
  1487.   nWndPosY = AkelPad.MemRead(_PtrAdd(lpRect,  4), DT_DWORD);
  1488.   nWndPosW = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD) - nWndPosX;
  1489.   nWndPosH = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - nWndPosY;
  1490.   AkelPad.MemFree(lpRect);
  1491.  
  1492.   oPlugText = {};
  1493.   for (i = 0; i < GetItemCountLV(); ++i)
  1494.   {
  1495.     sPlug = GetItemTextLV(i, 0);
  1496.     sText = GetItemTextLV(i, 1);
  1497.  
  1498.     if (! oPlugText[sPlug])
  1499.       oPlugText[sPlug] = {};
  1500.  
  1501.     if (! oPlugText[sPlug][sText])
  1502.       oPlugText[sPlug][sText] = {Sel: SendMessage(aDlg[IDPLUG][HWND], 0x102C /*LVM_GETITEMSTATE*/, i, 0x0002 /*LVIS_SELECTED*/), File: GetItemTextLV(i, 2)};
  1503.   }
  1504.  
  1505.   sIniText =
  1506.     'nWndPosX='   + nWndPosX + ';\r\n' +
  1507.     'nWndPosY='   + nWndPosY + ';\r\n' +
  1508.     'nWndPosW='   + nWndPosW + ';\r\n' +
  1509.     'nWndPosH='   + nWndPosH + ';\r\n' +
  1510.     'sTextDirS="' + sTextDirS.replace(/[\\"]/g, "\\$&") + '";\r\noPlugText={';
  1511.  
  1512.   for (i in oPlugText)
  1513.   {
  1514.     sIniText += '"' + i + '":{';
  1515.     for (n in oPlugText[i])
  1516.     {
  1517.       sIniText += '"' + n + '":{Sel:' + oPlugText[i][n].Sel + ',File:"' + oPlugText[i][n].File + '"},';
  1518.     }
  1519.     if (sIniText.slice(-1) == ",")
  1520.       sIniText = sIniText.slice(0, -1);
  1521.     sIniText += '},';
  1522.   }
  1523.   if (sIniText.slice(-1) == ",")
  1524.     sIniText = sIniText.slice(0, -1);
  1525.   sIniText += '};';
  1526.  
  1527.   AkelPad.WriteFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), sIniText, sIniText.length, 1200 /*UTF-16LE*/, 1 /*bBOM*/);
  1528. }
  1529.  
  1530. function GetLangStrings()
  1531. {
  1532.   if (AkelPad.GetLangId() == 1049 /*Russian*/)
  1533.   {
  1534.     //translated by F. Phoenix
  1535.     sTxtScriptName   = "Текстовая конфигурация плагинов";
  1536.     sTxtOnlyMDI      = "Данный скрипт работает только в режиме MDI/PMDI.";
  1537.     sTxtNoTexts      = "В настройках плагинов не обнаружено подходящих текстовых ключей.";
  1538.     sTxtSetInReg     = "Параметры сохранены в реестре";
  1539.     sTxtSetInIni     = "Параметры сохранены в файле AkelPad.ini";
  1540.     sTxtDir          = "Папка текстовых файлов: ";
  1541.     sTxtPlugin       = "Плагин";
  1542.     sTxtKeyTextName  = "Ключ";
  1543.     sTxtTextFile     = "Файл, связанный с ключом";
  1544.     sTxtEditText     = "Править текст ключа";
  1545.     sTxtLoadText     = "Загрузить ключ из текста";
  1546.     sTxtSaveTextFile = "Сохранить текст ключа в файл";
  1547.     sTxtEditTextFile = "Править текстовый файл";
  1548.     sTxtLoadTextFile = "Загрузить ключ из файла";
  1549.     sTxtRenameFile   = "Переименовать файл";
  1550.     sTxtDeleteFile   = "Удалить текстовый файл";
  1551.     sTxtChangeDir    = "Сменить рабочую папку";
  1552.     sTxtEditIniFile  = "Править .ini файл";
  1553.     sTxtOpenRegEdit  = "Открыть в RegEdit";
  1554.     sTxtLoaded       = "Загружено:";
  1555.     sTxtNotLoaded    = "Не загружено:";
  1556.     sTxtSaved        = "Сохранено:";
  1557.     sTxtNotSaved     = "Не сохранено:";
  1558.     sTxtNoFiles      = "Файла(ов) не существует:";
  1559.     sTxtWantSave     = "Вы хотите извлечь выделенные ключи конфигурации плагинов и сохранить их в текстовых файлах?";
  1560.     sTxtWantLoad     = "Вы хотите загрузить выделенные текстовые файлы в ключи конфигурации плагинов?";
  1561.     sTxtNewName      = "Новое имя файла:";
  1562.     sTxtBadName      = "Недопустимое имя.";
  1563.     sTxtBadChar      = "Недопустимый символ в имени файла.";
  1564.     sTxtWantDelete   = "Вы действительно хотите удалить выделенные текстовые файлы?";
  1565.     sTxtDeleted      = "Удалено:";
  1566.     sTxtNotDeleted   = "Не удалено:";
  1567.     sTxtEnvVar       = "переменная среды";
  1568.     sTxtAkelDir      = "папка AkelPad";
  1569.     sTxtPlugDir      = "папка плагинов";
  1570.     sTxtDirNoExists  = "Указанная папка не существует. Вы хотите ее создать?";
  1571.     sTxtDirCreFail   = "Не удалось создать папку.";
  1572.   }
  1573.   else
  1574.   {
  1575.     sTxtScriptName   = "Plugin Text";
  1576.     sTxtOnlyMDI      = "This script does work in MDI/PMDI mode only.";
  1577.     sTxtNoTexts      = "There are no any texts in plugins settings.";
  1578.     sTxtSetInReg     = "Settings stored in registry";
  1579.     sTxtSetInIni     = "Settings stored in file AkelPad.ini";
  1580.     sTxtDir          = "Directory for text files: ";
  1581.     sTxtPlugin       = "Plugin";
  1582.     sTxtKeyTextName  = "Key - text name";
  1583.     sTxtTextFile     = "Text file associated with the key";
  1584.     sTxtEditText     = "Edit plugin text";
  1585.     sTxtLoadText     = "Load text to plugin key";
  1586.     sTxtSaveTextFile = "Save plugin text in text file";
  1587.     sTxtEditTextFile = "Edit text file";
  1588.     sTxtLoadTextFile = "Load text file to plugin key";
  1589.     sTxtRenameFile   = "Rename text file";
  1590.     sTxtDeleteFile   = "Delete text file";
  1591.     sTxtChangeDir    = "Change dir for text files";
  1592.     sTxtEditIniFile  = "Edit .ini file";
  1593.     sTxtOpenRegEdit  = "Open in RegEdit";
  1594.     sTxtLoaded       = "Loaded:";
  1595.     sTxtNotLoaded    = "Not loaded:";
  1596.     sTxtSaved        = "Saved:";
  1597.     sTxtNotSaved     = "Not saved:";
  1598.     sTxtNoFiles      = "No file(s):";
  1599.     sTxtWantSave     = "Do you want to extract selected plugin keys and save in text files?";
  1600.     sTxtWantLoad     = "Do you want to load selected text files to plugin keys?";
  1601.     sTxtNewName      = "new name:";
  1602.     sTxtBadName      = "Illegal name.";
  1603.     sTxtBadChar      = "Illegal character in the name.";
  1604.     sTxtWantDelete   = "Do you want to delete selected text files?";
  1605.     sTxtDeleted      = "Deleted:";
  1606.     sTxtNotDeleted   = "Not deleted:";
  1607.     sTxtEnvVar       = "environment variable";
  1608.     sTxtAkelDir      = "AkelPad directory";
  1609.     sTxtPlugDir      = "plugins directory";
  1610.     sTxtDirNoExists  = "This directory does not exist. Do you want to create it?";
  1611.     sTxtDirCreFail   = "Failed to create this directory.";
  1612.   }
  1613. }
  1614.  
Add Comment
Please, Sign In to add comment