Scripts collection

Discuss and announce AkelPad plugins
  • Author
  • Message
KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Replace text in edit window.
GUI for TextReplace function.

All parts of the script should be saved in one file in Unicode format.
Download archive: KDJ.zip.

Part 1:

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30804#p30804
// Version: 2016-07-26
// Author: KDJ
//
// *** Replace text in edit window  ***
// *** GUI for TextReplace function ***
//
// Usage:
//   Call("Scripts::Main", 1, "TextReplace.js")
//
// Remarks:
//   Script should be saved in Unicode format.
//   Required to include:
//     InputBox_function.js:    http://akelpad.sourceforge.net/forum/viewtopic.php?p=17609#p17609
//     TextReplace_function.js: http://akelpad.sourceforge.net/forum/viewtopic.php?p=30653#p30653
//   For view AkelPad help file, is needed HtmlView.js: http://akelpad.sourceforge.net/forum/viewtopic.php?p=29221#p29221
//   Templates are saved in file: TextReplace_templ.tsv.
//   F1 key - show context menu if available (for edit controls and "Find" button).
//   'Disable "Undo"' option:
//     - causes less memory usage, but is not possible to undo changes from undo buffer,
//     - to restore previous content of the document, reopen it.
//   "Find" button action:
//     left click  - if is set default action - do it, else show menu,
//     right click - show context menu.
//
// Batch files:
//   Should be named TextReplace_batch*.tsv, where * is any text.
//   Should be saved in UTF-16LE format with Windows new line "\r\n".
//   Each line of the batch file should contain tab-separated fields:
//     FindIt<TAB>ReplaceWith<TAB>Flags<TAB>Description
//     - FindIt, ReplaceWith, Flags - see description in TextReplace_function.js,
//     - if line is empty or FindIt is empty, this line will be ommited,
//     - flag "g" can be ommited - will be added automatically.
//   Example 1 (replace all "abc" with "xyz", next delete all "gwx"):
//     abc	xyz
//     gwx
//   Example 2:
//     \b(\d{4})-(\d{2})-(\d{2})\b	\3-\2-\1	r	(replace date in format "yyyy-mm-dd" with date in format "dd-mm-yyyy", used regular expressions)
//     \b0x[\dA-F]{1,8}\b	return parseInt(_s0).toString();	fir	(replace hex values (0x0 - 0xFFFFFFFF) with decimals, used regular expressions, function and ignore case)
//     abc	return _s0 + _n1;	f	(add counter to "abc", used function)

var oSys   = AkelPad.SystemFunction();
var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + AkelPad.GetInstanceDll();
var hDlg;

if (hDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0))
{
  if (! oSys.Call("User32::IsWindowVisible", hDlg))
    oSys.Call("User32::ShowWindow", hDlg, 8 /*SW_SHOWNA*/);
  if (oSys.Call("User32::IsIconic", hDlg))
    oSys.Call("User32::ShowWindow", hDlg, 9 /*SW_RESTORE*/);

  oSys.Call("User32::SetForegroundWindow", hDlg);
  WScript.Quit();
}

if (! (AkelPad.Include("InputBox_function.js") && AkelPad.Include("TextReplace_function.js")))
  WScript.Quit();

var hMainWnd = AkelPad.GetMainWnd();
var hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
var aHotKey  = [[0x5 /*MOD_SHIFT|MOD_ALT*/, 0x2D /*VK_INSERT*/, BookmarkLines, true],
                [0x5 /*MOD_SHIFT|MOD_ALT*/, 0x2E /*VK_DELETE*/, BookmarkLines, false]];

var bSizingEdit = false;
var nDlgMinW    = 405;
var nDlgMinH    = 263;
var nEditMinW   = 350;
var nEditMinH   = 30;
var nScaleX;
var nScaleY;
var nDlgX;
var nDlgY;
var nDlgW;
var nDlgH;
var nWhatH;
var bTranspNA;
var nOpacity;
var bMatch;
var bWord;
var bRegExp;
var bDotNL;
var bFunc;
var bBatch;
var bLockUndo;
var nRange;
var bFont1;
var bFont2;
var bWrap1;
var bWrap2;
var sWhat;
var sWith;
var sBFile;
var nFindDef;
var nHistLen;
var aHist;

ReadIni();
GetLangStrings();

var IDCANCEL    = 2;
var IDWHATS     = 1000;
var IDWHATE     = 1001;
var IDWITHS     = 1002;
var IDWITHE     = 1003;
var IDMATCH     = 1004;
var IDWORD      = 1005;
var IDREGEXP    = 1006;
var IDDOTNL     = 1007;
var IDFUNC      = 1008;
var IDBATCH     = 1009;
var IDLOCKUNDO  = 1010;
var IDRANGE     = 1011;
var IDFBTC      = 1012;
var IDFCTE      = 1013;
var IDSEL       = 1014;
var IDBOOK      = 1015;
var IDDOC       = 1016;
var IDALLDOC    = 1017;
var IDTRACKBAR  = 1018;
var IDTRANSPNAB = 1019;
var IDREPL1B    = 1020;
var IDREPL2B    = 1021;
var IDHISTB     = 1022;
var IDTEMPLB    = 1023;
var IDFINDB     = 1024;
var IDCLOSEB    = 1025;

AkelPad.WindowRegisterClass(sClass);

//0x50000000=WS_VISIBLE|WS_CHILD
//0x50000007=WS_VISIBLE|WS_CHILD|BS_GROUPBOX
//0x50010000=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_PUSHBUTTON
//0x50010003=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50010005=WS_VISIBLE|WS_CHILD|WS_TABSTOP|TBS_TOP|TBS_AUTOTICKS
//0x50010009=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON
//0x50851004=WS_VISIBLE|WS_CHILD|WS_BORDER|WS_SIZEBOX|WS_TABSTOP|ES_WANTRETURN|ES_MULTILINE
//0x90CE0040=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|DS_SETFONT
AkelPad.CreateDialog(0, sClass, sTxtDlgTitle, 0X90CE0040, nDlgX, nDlgY, nDlgW, nDlgH, hMainWnd, CallbackDlg, 0x2 /*CDF_PIXELS*/, 0, 0, "", 0, 0, "|",
  // Class,               Title,                             Style,       X,  Y,   W,   H, ID,          lParam
  0, "STATIC",            "",                                0x50000000, 10, 14,  34,  13, IDWHATS,     0, "|",
  0, "AkelEditW",         "",                                0x50851004, 45, 10,   0,   0, IDWHATE,     0, "|",
  0, "STATIC",            sTxtWith,                          0x50000000,  0,  0,  34,  13, IDWITHS,     0, "|",
  0, "AkelEditW",         "",                                0x50851004,  0,  0,   0,   0, IDWITHE,     0, "|",
  0, "BUTTON",            sTxtMatchCase,                     0x50010003,  0,  0, 140,  16, IDMATCH,     0, "|",
  0, "BUTTON",            sTxtWholeWord,                     0x50010003,  0,  0, 140,  16, IDWORD,      0, "|",
  0, "BUTTON",            sTxtRegExp,                        0x50010003,  0,  0, 140,  16, IDREGEXP,    0, "|",
  0, "BUTTON",            sTxtDotMatchesNL,                  0x50010003,  0,  0, 123,  16, IDDOTNL,     0, "|",
  0, "BUTTON",            sTxtWithFunc,                      0x50010003,  0,  0, 140,  16, IDFUNC,      0, "|",
  0, "BUTTON",            sTxtBatchRepl,                     0x50010003,  0,  0, 140,  16, IDBATCH,     0, "|",
  0, "BUTTON",            sTxtLockUndo,                      0x50010003,  0,  0, 123,  16, IDLOCKUNDO,  0, "|",
  0, "BUTTON",            sTxtRange,                         0x50000307,  0,  0, 135, 142, IDRANGE,     0, "|",
  0, "BUTTON",            "&1 - " + sTxtBegToCaret,          0x50010009,  0,  0, 115,  16, IDFBTC,      0, "|",
  0, "BUTTON",            "&2 - " + sTxtCaretToEnd,          0x50010009,  0,  0, 115,  16, IDFCTE,      0, "|",
  0, "BUTTON",            "&3 - " + sTxtSelection,           0x50010009,  0,  0, 115,  16, IDSEL,       0, "|",
  0, "BUTTON",            "&4 - " + sTxtBookmarks,           0x50010009,  0,  0, 115,  16, IDBOOK,      0, "|",
  0, "BUTTON",            "&5 - " + sTxtEntireDoc,           0x50010009,  0,  0, 115,  16, IDDOC,       0, "|",
  0, "BUTTON",            "&6 - " + sTxtAllDocs,             0x50010009,  0,  0, 115,  16, IDALLDOC,    0, "|",
  0, "msctls_trackbar32", "",                                0x50010005,  0,  0,  70,  20, IDTRACKBAR,  0, "|",
  0, "BUTTON",            sTxtTransparentNA,                 0x50010003,  0,  0, 185,  16, IDTRANSPNAB, 0, "|",
  0, "BUTTON",            sTxtReplace1,                      0x50010000,  0,  0,  90,  23, IDREPL1B,    0, "|",
  0, "BUTTON",            sTxtReplaceAll,                    0x50010000,  0,  0,  90,  23, IDREPL2B,    0, "|",
  0, "BUTTON",            sTxtHistory + "...",               0x50010000,  0,  0,  90,  23, IDHISTB,     0, "|",
  0, "BUTTON",            sTxtTemplates + "...",             0x50010000,  0,  0,  90,  23, IDTEMPLB,    0, "|",
  0, "BUTTON",            sTxtFind + (nFindDef ? "" : " >"), 0x50010000,  0,  0,  90,  23, IDFINDB,     0, "|",
  0, "BUTTON",            sTxtClose,                         0x50010000,  0,  0,  90,  23, IDCLOSEB,    0);

if (hDlg)
{
  AkelPad.ScriptNoMutex();
  AkelPad.WindowGetMessage(0x4 /*WGM_KEYDOWNUP*/);
}

AkelPad.WindowUnregisterClass(sClass);

function CallbackDlg(hWnd, uMsg, wParam, lParam)
{
  var nID, nCode;

  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    hDlg = hWnd;
    InitDlg();
  }

  else if (uMsg == 6 /*WM_ACTIVATE*/)
  {
    if (LoWord(wParam))
      EnableButtonsDlg();

    SetHotKeys(LoWord(wParam));
    SetTransparency(LoWord(wParam) || (lParam != hMainWnd));
  }

  else if (uMsg == 786 /*WM_HOTKEY*/)
    aHotKey[wParam][2](aHotKey[wParam][3]);

  else if (uMsg == 36 /*WM_GETMINMAXINFO*/)
  {
    AkelPad.MemCopy(_PtrAdd(lParam, 24), nDlgMinW, 3 /*DT_DWORD*/); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(lParam, 28), nDlgMinH, 3 /*DT_DWORD*/); //ptMinTrackSize_y
  }

  else if (uMsg == 5 /*WM_SIZE*/)
  {
    if ((wParam == 0 /*SIZE_RESTORED*/) && (! bSizingEdit))
    {
      nDlgW = LoWord(lParam);
      nDlgH = HiWord(lParam);
      ResizeDlg();
    }
  }

  else if (uMsg == 15 /*WM_PAINT*/)
    PaintSizeGrip();

  else if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    nID = GetDlgCtrlID(oSys.Call("User32::GetFocus"));

    if ((wParam >= 0x31 /*1 key*/) && (wParam <= 0x36 /*6 key*/))
    {
      if (Ctrl() && (! Shift()) && (! Alt()))
        CountInRange(wParam - 0x30);
    }
    else if (wParam == 0x70 /*VK_F1*/)
    {
      if (! Alt())
      {
        if (Ctrl() || Shift())
          AkelHelp(GetAkelHelpFile());
        else if ((nID == IDWHATE) || (nID == IDWITHE))
          MenuAE(oSys.Call("User32::GetFocus"), nID);
        else if (nID == IDFINDB)
          MenuFind();
      }
    }
    else if ((wParam == 0x72 /*VK_F3*/) || (wParam == 0x76 /*VK_F7*/))
    {
      if (! Alt())
      {
        if (Ctrl())
        {
          if (Shift())
            Find((wParam == 0x72 /*VK_F3*/) ? 4 : 14);
          else
            Find((wParam == 0x72 /*VK_F3*/) ? 3 : 13);
        }
        else if (Shift())
          Find((wParam == 0x72 /*VK_F3*/) ? 2 : 12);
        else
          Find((wParam == 0x72 /*VK_F3*/) ? 1 : 11);
      }
    }
    else if (((nID == IDWHATE) || (nID == IDWITHE)) && Ctrl() && (! Shift()) && (! Alt()))
    {
      if (wParam == 0x46 /*F key*/)
      {
        if (nID == IDWHATE)
          bFont1 = ! bFont1;
        else
          bFont2 = ! bFont2;

        SetFontAE(nID);
      }
      else if (wParam == 0x55 /*U key*/)
      {
        if (nID == IDWHATE)
          bWrap1 = ! bWrap1;
        else
          bWrap2 = ! bWrap2;

        SetWrapAE(nID);
      }
    }
  }

  else if (uMsg == 123 /*WM_CONTEXTMENU*/)
  {
    nID = GetDlgCtrlID(wParam);

    if ((nID == IDWHATE) || (nID == IDWITHE))
      MenuAE(wParam, nID, LoWord(lParam), HiWord(lParam));
    else if (nID == IDFINDB)
      MenuFind();
  }

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    nID   = LoWord(wParam);
    nCode = HiWord(wParam);

    if ((nID == IDWHATE) || (nID == IDWITHE))
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
      {
        if (bBatch)
        {
          if (nID == IDWHATE)
            sBFile = GetTextAE(nID);
        }
        else
        {
          if (nID == IDWHATE)
            sWhat = GetTextAE(nID);
          else
            sWith = GetTextAE(nID);
        }

        EnableButtonsDlg();
      }
    }
    else if (nID == IDMATCH)
      bMatch = ! bMatch;
    else if (nID == IDWORD)
      bWord = ! bWord;
    else if (nID == IDREGEXP)
    {
      bRegExp = ! bRegExp;
      SetColorsAE();
      EnableButtonsDlg();
    }
    else if (nID == IDDOTNL)
      bDotNL = ! bDotNL;
    else if (nID == IDFUNC)
    {
      bFunc = ! bFunc;
      SetColorsAE();
    }
    else if (nID == IDBATCH)
    {
      bBatch = ! bBatch;
      SetColorsAE();

      if (bBatch)
      {
        ReplaceTextAE(IDWHATE, sBFile);
        ReplaceTextAE(IDWITHE, "");

        if (! sBFile)
        {
          MenuBatch();
          SetColorsAE();
        }
      }
      else
      {
        ReplaceTextAE(IDWHATE, sWhat);
        ReplaceTextAE(IDWITHE, sWith);
      }

      EnableButtonsDlg();
    }
    else if (nID == IDLOCKUNDO)
      bLockUndo = ! bLockUndo;
    else if ((nID >= IDFBTC) && (nID <= IDALLDOC))
    {
      nRange = nID - IDFBTC;
      EnableButtonsDlg();
    }
    else if (nID == IDTRANSPNAB)
    {
      bTranspNA = ! bTranspNA;
      SetTransparency(true);
    }
    else if ((nID == IDREPL1B) || (nID == IDREPL2B))
      Replace(nID);
    else if ((nID == IDHISTB) || (nID == IDTEMPLB))
      HistAndTempl(nID == IDHISTB);
    else if (nID == IDFINDB)
    {
      if (nFindDef)
        Find(nFindDef);
      else
        MenuFind();
    }
    else if ((nID == IDCANCEL) || (nID == IDCLOSEB))
      PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 276 /*WM_HSCROLL*/)
  {
    if (lParam == GetDlgItem(hDlg, IDTRACKBAR))
    {
      nOpacity = 255 - SendMessage(lParam, 1024 /*TBM_GETPOS*/, 0, 0);
      SetTransparency(true);
    }
  }

  else if (uMsg == 16 /*WM_CLOSE*/)
  {
    WriteIni();
    AkelPad.WindowUnsubClass(GetDlgItem(hDlg, IDWHATE));
    AkelPad.WindowUnsubClass(GetDlgItem(hDlg, IDWITHE));
    oSys.Call("User32::PostQuitMessage", 0);
    oSys.Call("User32::DestroyWindow", hDlg);
  }

  return 0;
}

function InitDlg()
{
  var lpRECT = AkelPad.MemAlloc(16);
  var i;

  for (i = IDWHATE; i <= IDWITHE; i += 2)
  {
    SendDlgItemMessage(hDlg, i, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x10000020 /*AECO_DISABLEBEEP|AECO_DETAILEDUNDO*/);
    SendDlgItemMessage(hDlg, i, 3230 /*AEM_SETNEWLINE*/, 0x3 /*AENL_OUTPUT|AENL_INPUT*/, MkLong(6, 6 /*AELB_N*/));
    SendDlgItemMessage(hDlg, i, 1093 /*EM_SETEVENTMASK*/, 0, 0x1 /*ENM_CHANGE*/);
    SetFontAE(i);
    SetWrapAE(i);
    AkelPad.WindowSubClass(GetDlgItem(hDlg, i), CallbackAE, 36 /*WM_GETMINMAXINFO*/, 532 /*WM_SIZING*/, 562 /*WM_EXITSIZEMOVE*/);
  }

  if (bBatch)
  {
    SetTextAE(IDWHATE, sBFile);
    SetTextAE(IDWITHE, "");
  }
  else
  {
    SetTextAE(IDWHATE, sWhat);
    SetTextAE(IDWITHE, sWith);

    if ((nRange != 2) && (AkelPad.GetSelStart() != AkelPad.GetSelEnd()))
      ReplaceTextAE(IDWHATE, AkelPad.GetSelText());
  }

  SendDlgItemMessage(hDlg, IDMATCH,    241 /*BM_SETCHECK*/, bMatch,    0);
  SendDlgItemMessage(hDlg, IDWORD,     241 /*BM_SETCHECK*/, bWord,     0);
  SendDlgItemMessage(hDlg, IDREGEXP,   241 /*BM_SETCHECK*/, bRegExp,   0);
  SendDlgItemMessage(hDlg, IDDOTNL,    241 /*BM_SETCHECK*/, bDotNL,    0);
  SendDlgItemMessage(hDlg, IDFUNC,     241 /*BM_SETCHECK*/, bFunc,     0);
  SendDlgItemMessage(hDlg, IDBATCH,    241 /*BM_SETCHECK*/, bBatch,    0);
  SendDlgItemMessage(hDlg, IDLOCKUNDO, 241 /*BM_SETCHECK*/, bLockUndo, 0);
  oSys.Call("User32::CheckRadioButton", hDlg, IDFBTC, IDALLDOC, IDFBTC + nRange);
  SetColorsAE();
  EnableButtonsDlg();

  SendDlgItemMessage(hDlg, IDTRANSPNAB, 241 /*BM_SETCHECK*/, bTranspNA, 0);
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1030 /*TBM_SETRANGE*/, 0, MkLong(0, 240));
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1047 /*TBM_SETLINESIZEE*/, 0, 10);
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1045 /*TBM_SETPAGESIZE*/, 0, 40);
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1044 /*TBM_SETTICFREQ*/, 20, 0);
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1029 /*TBM_SETPOS*/, 1, 255 - nOpacity);
  SetTransparency(true);

  oSys.Call("User32::GetClientRect", hDlg, lpRECT);
  nScaleX = AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/) / nDlgW;
  nScaleY = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/) / nDlgH;
  nDlgW   = AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/);
  nDlgH   = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/);
  oSys.Call("User32::GetWindowRect", hDlg, lpRECT);
  nDlgMinW  = ScaleX(nDlgMinW) + AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRECT, 0), 3 /*DT_DWORD*/) - nDlgW;
  nDlgMinH  = ScaleY(nDlgMinH) + AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRECT, 4), 3 /*DT_DWORD*/) - nDlgH;
  nEditMinW = ScaleX(nEditMinW);
  nEditMinH = ScaleY(nEditMinH);
  nWhatH = ScaleY(nWhatH);
  ResizeDlg();
  AkelPad.MemFree(lpRECT);
}

function CallbackAE(hWnd, uMsg, wParam, lParam)
{
  var lpRECT;
  var nX1, nY1, nX2, nY2;
  var nNY1, nNY2;
  var bSizingWhat;

  if (uMsg == 36 /*WM_GETMINMAXINFO*/)
  {
    AkelPad.MemCopy(_PtrAdd(lParam, 24), nEditMinW, 3 /*DT_DWORD*/); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(lParam, 28), nEditMinH, 3 /*DT_DWORD*/); //ptMinTrackSize_y
  }
  else if (uMsg == 532 /*WM_SIZING*/)
  {
    lpRECT = AkelPad.MemAlloc(16);
    oSys.Call("User32::GetWindowRect", hWnd, lpRECT);
    nX1 = AkelPad.MemRead(_PtrAdd(lpRECT,  0), 3 /*DT_DWORD*/);
    nY1 = AkelPad.MemRead(_PtrAdd(lpRECT,  4), 3 /*DT_DWORD*/);
    nX2 = AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/);
    nY2 = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/);
    nNY1 = AkelPad.MemRead(_PtrAdd(lParam,  4), 3 /*DT_DWORD*/);
    nNY2 = AkelPad.MemRead(_PtrAdd(lParam, 12), 3 /*DT_DWORD*/);

    if ((wParam == 6 /*WMSZ_BOTTOM*/) && (nNY2 != nY2))
    {
      bSizingEdit = true;
      if (bSizingWhat = (GetDlgCtrlID(hWnd) == IDWHATE))
        nDlgMinH += nNY2 - nY2;
      oSys.Call("User32::GetWindowRect", hDlg, lpRECT);
      nDlgW = AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRECT, 0), 3 /*DT_DWORD*/);
      nDlgH = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRECT, 4), 3 /*DT_DWORD*/) + nNY2 - nY2;
      oSys.Call("User32::SetWindowPos", hDlg, 0, 0, 0, nDlgW, nDlgH, 0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/);
      oSys.Call("User32::GetClientRect", hDlg, lpRECT);
      nDlgW = AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/);
      nDlgH = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/);
      ResizeDlg(bSizingWhat, nX2 - nX1, nNY2 - nNY1);
      bSizingEdit = false;
    }
    else
    {
      AkelPad.MemCopy(_PtrAdd(lParam,  0), nX1, 3 /*DT_DWORD*/);
      AkelPad.MemCopy(_PtrAdd(lParam,  4), nY1, 3 /*DT_DWORD*/);
      AkelPad.MemCopy(_PtrAdd(lParam,  8), nX2, 3 /*DT_DWORD*/);
      AkelPad.MemCopy(_PtrAdd(lParam, 12), nY2, 3 /*DT_DWORD*/);
    }

    AkelPad.MemFree(lpRECT);
  }
  else if (uMsg == 562 /*WM_EXITSIZEMOVE*/)
    //bug in WinXP - set z-order
    oSys.Call("User32::SetWindowPos", hWnd, GetDlgItem(hDlg, GetDlgCtrlID(hWnd) - 1), 0, 0, 0, 0, 0x13 /*SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE*/);

  return 0;
}

function LoWord(nDwNum)
{
  return nDwNum & 0xFFFF;
}

function HiWord(nDwNum)
{
  return (nDwNum >> 16) & 0xFFFF;
}

function MkLong(nLoWord, nHiWord)
{
  return (nLoWord & 0xFFFF) | (nHiWord << 16);
}

function Ctrl()
{
  return oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
}

function Shift()
{
  return oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000;
}

function Alt()
{
  return oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU*/) & 0x8000;
}

function SendMessage(hWnd, uMsg, wParam, lParam)
{
  return AkelPad.SendMessage(hWnd, uMsg, wParam, lParam);
}

function PostMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::PostMessageW", hWnd, uMsg, wParam, lParam);
}

function SendDlgItemMessage(hWnd, nID, uMsg, wParam, lParam)
{
  return oSys.Call("User32::SendDlgItemMessageW", hWnd, nID, uMsg, wParam, lParam);
}

function GetDlgItem(hWnd, nID)
{
  return oSys.Call("User32::GetDlgItem", hWnd, nID);
}

function GetDlgCtrlID(hWnd)
{
  return oSys.Call("User32::GetDlgCtrlID", hWnd);
}

function GetTextAE(nID)
{
  var sText;
  AkelPad.SetEditWnd(GetDlgItem(hDlg, nID));
  sText = AkelPad.GetTextRange(0, -1, 2 /*\n*/);
  AkelPad.SetEditWnd(0);
  return sText;
}

function SetTextAE(nID, sText)
{
  var lpText = AkelPad.MemAlloc((sText.length + 1) * 2);
  AkelPad.MemCopy(lpText, sText, 1 /*DT_UNICODE*/, sText.length);
  SendDlgItemMessage(hDlg, nID, 3026 /*AEM_SETTEXTW*/, sText.length, lpText);
  AkelPad.MemFree(lpText);
}

function ReplaceTextAE(nID, sText)
{
  if (bBatch && (nID == IDWHATE))
    SendDlgItemMessage(hDlg, nID, 3228 /*AEM_SETOPTIONS*/, 4 /*AECOOP_XOR*/, 1 /*AECO_READONLY*/);

  SendDlgItemMessage(hDlg, nID, 177 /*EM_SETSEL*/, 0, -1);
  AkelPad.SetEditWnd(GetDlgItem(hDlg, nID));
  AkelPad.ReplaceSel(sText);
  AkelPad.SetEditWnd(0);
  SendDlgItemMessage(hDlg, nID, 177 /*EM_SETSEL*/, 0, 0);

  if (bBatch && (nID == IDWHATE))
    SendDlgItemMessage(hDlg, nID, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 1 /*AECO_READONLY*/);
}

function SetFontAE(nID)
{
  var bFont = (nID == IDWHATE) ? bFont1 : bFont2;
  var hFont = bFont ? SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, 0, 0) : hGuiFont;
  SendDlgItemMessage(hDlg, nID, 48 /*WM_SETFONT*/, hFont, 0);
  oSys.Call("User32::InvalidateRect", GetDlgItem(hDlg, nID), 0, 1);
}

function SetWrapAE(nID)
{
  var bWrap = (nID == IDWHATE) ? bWrap1 : bWrap2;
  SendDlgItemMessage(hDlg, nID, 3242 /*AEM_SETWORDWRAP*/, bWrap ? 2 /*AEWW_SYMBOL*/ : 0 /*AEWW_NONE*/, 0);
}

function SetColorsAE()
{
  var nColorBk1;
  var nColorBk2;

  if (bBatch)
  {
    SendDlgItemMessage(hDlg, IDWHATS, 12 /*WM_SETTEXT*/, 0, sTxtBatch);
    SendDlgItemMessage(hDlg, IDWHATE, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 1 /*AECO_READONLY*/);
    oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDWITHS), 0);
    oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDWITHE), 0);

    nColorBk1 = 0x98FBCC;
    nColorBk2 = oSys.Call("User32::GetSysColor", 15 /*COLOR_BTNFACE*/);
  }
  else
  {
    SendDlgItemMessage(hDlg, IDWHATS, 12 /*WM_SETTEXT*/, 0, sTxtWhat);
    SendDlgItemMessage(hDlg, IDWHATE, 3228 /*AEM_SETOPTIONS*/, 4 /*AECOOP_XOR*/, 1 /*AECO_READONLY*/);
    oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDWITHS), 1);
    oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDWITHE), 1);

    nColorBk1 = bRegExp ? 0xA0FFFF : oSys.Call("User32::GetSysColor", 5 /*COLOR_WINDOW*/);
    nColorBk2 = bFunc   ? 0xE1E4FF : nColorBk1;
  }

  SendDlgItemMessage(hDlg, IDWHATE, 1091 /*EM_SETBKGNDCOLOR*/, 0, nColorBk1);
  SendDlgItemMessage(hDlg, IDWITHE, 1091 /*EM_SETBKGNDCOLOR*/, 0, nColorBk2);
}

function IsLineBoard()
{
  return AkelPad.IsPluginRunning("LineBoard::Main");
}

function EnableButtonsDlg()
{
  var hEditWnd = AkelPad.GetEditWnd();

  if ((! IsLineBoard()) && (nRange == 3))
  {
    nRange = 4;
    oSys.Call("User32::CheckRadioButton", hDlg, IDFBTC, IDALLDOC, IDFBTC + nRange);
  }

  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDMATCH),    (! bBatch));
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDWORD),     (! bBatch));
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDREGEXP),   (! bBatch));
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDDOTNL),    (! bBatch) && bRegExp);
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDFUNC),     (! bBatch));
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDLOCKUNDO), bBatch);
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDBOOK),     IsLineBoard());
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDREPL1B),   hEditWnd && sWhat.length && (nRange < 5) && (! bBatch));
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDREPL2B),   hEditWnd && (sWhat.length && (! bBatch) || sBFile.length && bBatch));
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDFINDB),    hEditWnd && sWhat.length && (! bBatch));
}

function SetDefPushButton(nID)
{
  for (var i = IDREPL1B; i <= IDCLOSEB; ++i)
    SendDlgItemMessage(hDlg, i, 244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);

  if (nID)
    SendDlgItemMessage(hDlg, nID, 244 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
}

function SetHotKeys(bSet)
{
  var i;

  if (bSet)
  {
    for (i = 0; i < aHotKey.length; ++i)
      oSys.Call("User32::RegisterHotKey", hDlg, i, aHotKey[i][0], aHotKey[i][1]);
  }
  else
  {
    for (i = 0; i < aHotKey.length; ++i)
      oSys.Call("User32::UnregisterHotKey", hDlg, i);
  }
}

function SetTransparency(bDlgActive)
{
  var nExStyle  = oSys.Call("User32::GetWindowLongW", hDlg, -20 /*GWL_EXSTYLE*/);
  var nAlphaCur = -1;
  var nAlphaNew = -1;
  var lpAlpha;

  if (nExStyle & 0x00080000 /*WS_EX_LAYERED*/)
  {
    lpAlpha = AkelPad.MemAlloc(1);
    oSys.Call("User32::GetLayeredWindowAttributes", hDlg, 0, lpAlpha, 0);
    nAlphaCur = AkelPad.MemRead(lpAlpha, 5 /*DT_BYTE*/);
    AkelPad.MemFree(lpAlpha);
  }

  if (bTranspNA && bDlgActive)
  {
    if (nAlphaCur >= 0)
      nAlphaNew = 255;
  }
  else if ((nAlphaCur < 0) && (nOpacity < 255) || (nAlphaCur >= 0) && (nAlphaCur != nOpacity))
    nAlphaNew = nOpacity;

  if (nAlphaNew >= 0)
  {
    oSys.Call("User32::SetWindowLongW", hDlg, -20 /*GWL_EXSTYLE*/, nExStyle | 0x00080000 /*WS_EX_LAYERED*/);
    oSys.Call("User32::SetLayeredWindowAttributes", hDlg, 0, nAlphaNew, 2 /*LWA_ALPHA*/);
    oSys.Call("User32::UpdateWindow", hDlg);
  }
}

function ScaleX(n)
{
  return Math.round(n * nScaleX);
}

function ScaleY(n)
{
  return Math.round(n * nScaleY);
}

function ScaleUX(n)
{
  return Math.round(n / nScaleX);
}

function ScaleUY(n)
{
  return Math.round(n / nScaleY);
}

function ResizeDlg(bSizingWhat, nW, nH)
{
  var lpRECT = AkelPad.MemAlloc(16);
  var nEditW, nWithH;
  var i;

  if (bSizingEdit)
  {
    nEditW = nW;

    if (bSizingWhat)
    {
      oSys.Call("User32::GetWindowRect", GetDlgItem(hDlg, IDWITHE), lpRECT);
      nWhatH = nH;
      nWithH = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRECT, 4), 3 /*DT_DWORD*/);
    }
    else
    {
      oSys.Call("User32::GetWindowRect", GetDlgItem(hDlg, IDWHATE), lpRECT);
      nWithH = nH;
      nWhatH = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRECT, 4), 3 /*DT_DWORD*/);
    }
  }
  else
  {
    nEditW = nDlgW - ScaleX(55);
    nWithH = nDlgH - nWhatH - ScaleY(203);
  }

  AkelPad.MemFree(lpRECT);

  oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, IDWHATE), 0,
    0,
    0,
    nEditW,
    nWhatH,
    0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/);
  oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, IDWITHS), 0,
    ScaleX(10),
    nWhatH + ScaleY(19),
    0,
    0,
    0x15 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/);
  oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, IDWITHE), 0,
    ScaleX(45),
    nWhatH + ScaleY(15),
    nEditW,
    nWithH,
    0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  for (i = IDMATCH; i <= IDLOCKUNDO; ++i)
    oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, i), 0,
      ScaleX(((i == IDDOTNL) || (i == IDLOCKUNDO)) ? 27 : 10),
      nWhatH + nWithH + ScaleY(25) + ScaleY((i - IDMATCH) * 20),
      0,
      0,
      0x15 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/);
  oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, IDRANGE), 0,
    ScaleX(160),
    nWhatH + nWithH + ScaleY(23),
    0,
    0,
    0x15 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/);
  for (i = IDFBTC; i <= IDALLDOC; ++i)
    oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, i), 0,
      ScaleX(170),
      nWhatH + nWithH + ScaleY(40) + ScaleY((i - IDFBTC) * 20),
      0,
      0,
      0x15 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/);
  oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, IDTRACKBAR), 0,
    ScaleX(10),
    nDlgH - ScaleY(30),
    0,
    0,
    0x15 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/);
  oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, IDTRANSPNAB), 0,
    ScaleX(85),
    nDlgH - ScaleY(26),
    0,
    0,
    0x15 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/);
  for (i = IDREPL1B; i <= IDCLOSEB; ++i)
    oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, i), 0,
      nDlgW - ScaleX(100),
      nWhatH + nWithH + ScaleY(45) + ScaleY((i - IDREPL1B) * 25),
      0,
      0,
      0x15 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/);

  oSys.Call("user32::InvalidateRect", hDlg, 0, 1);
}

function PaintSizeGrip()
{
  var lpPAINT = AkelPad.MemAlloc(_X64 ? 72 : 64 /*PAINTSTRUCT*/);
  var lpRECT  = AkelPad.MemAlloc(16);
  var hDC;

  if (hDC = oSys.Call("User32::BeginPaint", hDlg, lpPAINT))
  {
    oSys.Call("User32::GetClientRect", hDlg, lpRECT);
    AkelPad.MemCopy(_PtrAdd(lpRECT, 0), AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/) - oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/), 3 /*DT_DWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpRECT, 4), AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/) - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), 3 /*DT_DWORD*/);

    oSys.Call("User32::DrawFrameControl", hDC, lpRECT, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/);
    oSys.Call("User32::EndPaint", hDlg, lpPAINT);
  }

  AkelPad.MemFree(lpPAINT);
  AkelPad.MemFree(lpRECT);
}

function Replace(nID)
{
  var aBatch;
  var hFocus;
  var lpFrameStart;
  var lpFrameCurr;
  var lpFrameEnd;
  var aDoc;
  var sMsg;
  var sFlags;
  var nCount;
  var nCountAll;
  var nRange1;
  var nRange2;
  var nMsgType;
  var hEditWnd;
  var lpCaret;
  var lpSelect;
  var lpPoint64;
  var nSelStart;
  var nSelEnd;
  var nCaretPos;
  var bChanged;
  var nTextLen;
  var i, n;

  if (bBatch)
  {
    aBatch = GetBatch();

    if (! aBatch.length)
      return;

    if (bLockUndo)
    {
      lpFrameStart = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);
      lpFrameCurr  = lpFrameStart;

      do
      {
        if (SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 15 /*FI_MODIFIED*/, lpFrameCurr) || (! SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 33 /*FI_FILELEN*/, lpFrameCurr)))
        {
          AkelPad.MessageBox(hDlg, sTxtSaveDocs, sTxtDlgTitle, 0x30 /*MB_ICONWARNING*/);
          return;
        }
      }
      while ((nRange == 5) && ((lpFrameCurr = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 2 /*FWF_NEXT*/, lpFrameCurr)) != lpFrameStart));
    }
  }
  else
  {
    sFlags = "";
    if (! bMatch)        sFlags += "i";
    if (bWord)           sFlags += "w";
    if (bRegExp)         sFlags += "r";
    if (! bDotNL)        sFlags += "n";
    if (bFunc)           sFlags += "f";
    if (nID == IDREPL2B) sFlags += "g";
  }

  if ((nRange == 5) && (SendMessage(hMainWnd, 1291 /*AKD_FRAMESTATS*/, 0 /*FWS_COUNTALL*/, 0) > 1) &&
      (AkelPad.MessageBox(hDlg, sTxtAreYouSure, sTxtDlgTitle, 0x21 /*MB_OKCANCEL|MB_ICONQUESTION*/) != 1 /*IDOK*/))
    return;

  hFocus       = oSys.Call("User32::GetFocus");
  lpFrameStart = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);
  lpFrameCurr  = lpFrameStart;
  lpFrameEnd   = lpFrameStart;
  aDoc         = [];
  sMsg         = "";
  nCountAll    = 0;

  if (nRange < 4)
    nRange1 = -(nRange + 1);

  if (nID == IDREPL2B)
  {
    for (i = IDWHATS; i <= IDCLOSEB; ++i)
      oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, i), 0);
  }

  do
  {
    hEditWnd  = AkelPad.GetEditWnd();
    lpCaret   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*AECHARINDEX)*/);
    lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*AESELECTION)*/);
    lpPoint64 = AkelPad.MemAlloc(_X64 ? 16 : 8);
    SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, lpCaret, lpSelect);
    SendMessage(hEditWnd, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);

    if (bBatch)
    {
      nCount    = 0;
      bChanged  = false;
      nSelStart = AkelPad.GetSelStart();
      nSelEnd   = AkelPad.GetSelEnd();
      nCaretPos = SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpCaret);
      nTextLen  = SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 2 /*AEGI_LASTCHAR*/, 0);

      if (bLockUndo)
      {
        SendMessage(hEditWnd, 3079 /*AEM_EMPTYUNDOBUFFER*/, 0, 0);
        SendMessage(hEditWnd, 3083 /*AEM_LOCKCOLLECTUNDO*/, 1, 0);
      }
      else
      {
        SendMessage(hEditWnd, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
        SendMessage(hEditWnd, 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
      }

      SendMessage(hEditWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, 1);
      SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 0, 0);
      SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 0, 0);

      for (i = 0; i < aBatch.length; ++i)
      {
        if (aBatch[i][0])
        {
          if (nRange == 0)
          {
            nCaretPos -= nTextLen - (nTextLen = SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 2 /*AEGI_LASTCHAR*/, 0));
            AkelPad.SetSel(nCaretPos, nCaretPos);
          }
          else if (nRange == 1)
            AkelPad.SetSel(nCaretPos, nCaretPos);
          else if (nRange == 2)
          {
            nSelEnd -= nTextLen - (nTextLen = SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 2 /*AEGI_LASTCHAR*/, 0));
            AkelPad.SetSel(nSelStart, nSelEnd);
          }

          n = TextReplace(aBatch[i][0], aBatch[i][1], aBatch[i][2], nRange1, nRange2);

          if ((n instanceof Error) || (n < 0))
          {
            nCount = n;
            sMsg  += sTxtBatchErr + (i + 1) + ".\n";
            break;
          }

          if (n > 0)
          {
            nCount  += n;
            bChanged = true;
          }
        }
      }

      if (bLockUndo)
        SendMessage(hEditWnd, 3083 /*AEM_LOCKCOLLECTUNDO*/, 0, 0);
      else
      {
        SendMessage(hEditWnd, 3082 /*AEM_ENDUNDOACTION*/, 0, 0);
        SendMessage(hEditWnd, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
      }

      SendMessage(hEditWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, 0);
      SendMessage(hEditWnd, 3376 /*AEM_UPDATESCROLLBAR*/, 3 /*SB_BOTH*/, 0);

      if ((nCount instanceof Error) || (nCount <= 0))
      {
        if (bChanged)
        {
          if (bLockUndo)
          {
            SendMessage(hEditWnd, 3087 /*AEM_SETMODIFY*/, 0, 0);
            AkelPad.Command(4104 /*IDM_FILE_REOPEN*/);
          }
          else
            SendMessage(hEditWnd, 3077 /*AEM_UNDO*/, 0, 0);
        }

        SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, lpCaret);
        SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, lpSelect);
        SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, _PtrAdd(lpSelect, _X64 ? 24 : 12));
        SendMessage(hEditWnd, 3126 /*AEM_SETSEL*/, lpCaret, lpSelect);
        SendMessage(hEditWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);
      }
      else
      {
        SendMessage(hEditWnd, 3087 /*AEM_SETMODIFY*/, 1, 0);
        SendMessage(hEditWnd, 3183 /*AEM_SCROLLTOPOINT*/, 0, 0 /*scroll to caret*/);
      }

      SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 1, 0);
      SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 1, 0);
      oSys.Call("User32::InvalidateRect", hMainWnd, 0, 1);
      oSys.Call("User32::InvalidateRect", hEditWnd, 0, 1);
    }
    else
      nCount = TextReplace(sWhat, sWith, sFlags, nRange1, nRange2);

    if ((nCount instanceof Error) || (nCount <= 0))
    {
      AkelPad.MemFree(lpCaret);
      AkelPad.MemFree(lpSelect);
      AkelPad.MemFree(lpPoint64);

      if (nCount != 0)
      {
        if (nCount instanceof Error)
        {
          sMsg += sTxtRunTimeErr + "\n" + nCount.description;
          if (! bBatch)
            hFocus = GetDlgItem(hDlg, IDWITHE);
        }
        else if (nCount == -13)
        {
          sMsg += sTxtNoFuncErr;
          if (! bBatch)
            hFocus = GetDlgItem(hDlg, IDWITHE);
        }
        else if (nCount == -14)
        {
          sMsg += sTxtNoTextErr;
          if (! bBatch)
            hFocus = GetDlgItem(hDlg, IDWITHE);
        }
        else if (nCount <= -100)
        {
          sMsg += sTxtRegExpErr;
          if (! bBatch)
          {
            hFocus = GetDlgItem(hDlg, IDWHATE);
            SendDlgItemMessage(hDlg, IDWHATE, 177 /*EM_SETSEL*/, -nCount - 100, -1);
          }
        }

        nMsgType = 0x10 /*MB_ICONERROR*/;
        break;
      }
    }
    else
    {
      nCountAll += nCount;
      lpFrameEnd = lpFrameCurr;
      aDoc.push([lpFrameCurr, lpCaret, lpSelect, lpPoint64]);
    }
  }
  while ((nRange == 5) && ((lpFrameCurr = SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0x10 /*FWA_NEXT*/, lpFrameCurr)) != lpFrameStart));

  if (nID == IDREPL2B)
  {
    for (i = IDWHATS; i <= IDCLOSEB; ++i)
      oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, i), 1);

    SetColorsAE();
    EnableButtonsDlg();
  }

  oSys.Call("User32::SetFocus", hFocus);

  if ((typeof nCount == "number") && (nCount >= 0))
  {
    SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameEnd);
    nMsgType = 0x40 /*MB_ICONINFORMATION*/;

    if ((nRange == 5) && (nCountAll > 0))
      sMsg += sTxtChangedDocs + aDoc.length + "\n";
    if ((nID == IDREPL1B) && (nCountAll == 0) || (nID == IDREPL2B))
      sMsg += sTxtCountChanges + nCountAll;

    //add to history
    if ((nCountAll > 0) && (nHistLen > 0))
    {
      if (bBatch)
      {
        for (i = 0; i < aHist.length; ++i)
        {
          if ((aHist[i][0].toLowerCase() == sBFile.toLowerCase()) && (aHist[i][2] == "b"))
          {
            aHist.splice(i, 1);
            break;
          }
        }

        aHist.unshift([sBFile, "", "b"]);
      }
      else
      {
        sFlags = sFlags.replace("g", "");

        for (i = 0; i < aHist.length; ++i)
        {
          if ((aHist[i][0] == sWhat) && (aHist[i][1] == sWith) && (aHist[i][2] == sFlags))
          {
            aHist.splice(i, 1);
            break;
          }
        }

        aHist.unshift([sWhat, sWith, sFlags]);
      }

      if (aHist.length > nHistLen)
        aHist.length = nHistLen;
    }
  }
  else
  {
    for (i = aDoc.length - 1; i >= 0; --i)
    {
      SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, aDoc[i][0]);

      hEditWnd = AkelPad.GetEditWnd();

      if (bBatch && bLockUndo)
      {
        SendMessage(hEditWnd, 3087 /*AEM_SETMODIFY*/, 0, 0);
        AkelPad.Command(4104 /*IDM_FILE_REOPEN*/);
      }
      else
        SendMessage(hEditWnd, 3077 /*AEM_UNDO*/, 0, 0);

      SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, aDoc[i][1]);
      SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, aDoc[i][2]);
      SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, _PtrAdd(aDoc[i][2], _X64 ? 24 : 12));
      SendMessage(hEditWnd, 3126 /*AEM_SETSEL*/, aDoc[i][1], aDoc[i][2]);
      SendMessage(hEditWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, aDoc[i][3]);
    }

    SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameStart);
  }

  for (i = 0; i < aDoc.length; ++i)
  {
    for (n = 1; n < aDoc[i].length; ++n)
      AkelPad.MemFree(aDoc[i][n]);
  }

  if (sMsg.length)
    AkelPad.MessageBox(hDlg, sMsg, sTxtDlgTitle, nMsgType);
}

function GetBatch()
{
  var sBFileFull = AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/) + "\\" + sBFile;
  var aBatch;
  var bEmpty;
  var i;

  if (! oFSO.FileExists(sBFileFull))
  {
    AkelPad.MessageBox(hDlg, sBFileFull + "\n\n" + sTxtFileNotExist, sTxtBatchRepl.replace("&", ""), 0x40 /*MB_ICONINFORMATION*/);
    MenuBatch();
    return [];
  }

  aBatch = AkelPad.ReadFile(sBFileFull, 0x10 /*ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1).split("\r\n");
  bEmpty = true;

  for (i = 0; i < aBatch.length; ++i)
  {
    aBatch[i] = aBatch[i].split("\t", 3);

    if (aBatch[i][0])
    {
      bEmpty = false;

      if (aBatch[i].length < 2)
        aBatch[i][1] = "";
      if (aBatch[i].length < 3)
        aBatch[i][2] = "";

      aBatch[i][2] += "bg";
    }
  }

  if (bEmpty)
  {
    AkelPad.MessageBox(hDlg, sBFileFull + "\n\n" + sTxtFileNoData, sTxtBatchRepl.replace("&", ""), 0x40 /*MB_ICONINFORMATION*/);
    aBatch.length = 0;
  }

  return aBatch;
}


Part 2: TextReplace_part2.js
Part 3: TextReplace_part3.js
Last edited by KDJ on Tue Jul 26, 2016 6:59 pm, edited 17 times in total.

Offline
Posts: 19
Joined: Sun Jan 17, 2016 5:41 pm

fullWindow.js - resizable window

Post by nbsp »

Infocatcher wrote:

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=24434#p24434
// http://infocatcher.ucoz.net/js/akelpad_scripts/fullWindow.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/fullWindow.js

// (c) Infocatcher 2014
// version 0.1.0 - 2014-04-03

// Just like full screen mode, but preserve window size and position
// Required FullScreen plugin!

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();

if(hMainWnd) {
	var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
	if(lpRect) {
		oSys.Call("user32::GetWindowRect", hMainWnd, lpRect);
		var x = AkelPad.MemRead(lpRect,      3 /*DT_DWORD*/);
		var y = AkelPad.MemRead(lpRect +  4, 3 /*DT_DWORD*/);
		var w = AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/) - x;
		var h = AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/) - y;
		AkelPad.MemFree(lpRect);

		AkelPad.Call("FullScreen::Main");
		oSys.Call("user32::SetWindowPos", hMainWnd, 0, x, y, w, h, 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
	}
}
<download | mirror | development version>
Just like full screen mode, but preserve window size and position.
Required FullScreen plugin!

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=24434#p24434
// http://infocatcher.ucoz.net/js/akelpad_scripts/fullWindow.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/fullWindow.js

// (c) Infocatcher 2014
// Version: 0.1.0 - 2014-04-03
// Author: Infocatcher

//// Just like full screen mode, but preserve window size and position (supports resize, minimize, maximize)
// Required FullScreen plugin!

// Arguments:
//   -resizable=1 - sets the WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX styles allowing the window
//                  to be resized, minimized (WinKey+Down arrow) and maximized (WinKey+Up arrow)

// Usage:
//   Call("Scripts::Main", 1, "fullWindowRes.js")                 - switch to full window mode
//   Call("Scripts::Main", 1, "fullWindowRes.js", `-resizable=1`) - switch to full resizable window mode


var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();

if (hMainWnd) {
	var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
	if (lpRect) {
		oSys.Call("user32::GetWindowRect", hMainWnd, lpRect);
		var x = AkelPad.MemRead(_PtrAdd(lpRect,  0), 3 /*DT_DWORD*/);
		var y = AkelPad.MemRead(_PtrAdd(lpRect,  4), 3 /*DT_DWORD*/);
		var w = AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/) - x;
		var h = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/) - y;
		AkelPad.MemFree(lpRect);
		
		AkelPad.Call("FullScreen::Main");		
		if (AkelPad.GetArgValue("resizable", 0) == 1) {
			var style = oSys.Call("user32::GetWindowLong" + _TCHAR, hMainWnd, -16 /*GWL_STYLE*/);
			style |= 0x00040000 | 0x00020000 | 0x00010000; /*WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX*/
			oSys.Call("user32::SetWindowLong" + _TCHAR, hMainWnd, -16 /*GWL_STYLE*/, style);
		}		
		oSys.Call("user32::SetWindowPos", hMainWnd, 0, x, y, w, h, 0x34 /*SWP_FRAMECHANGED|SWP_NOZORDER|SWP_NOACTIVATE*/);
	}
}

Just like full screen mode, but preserve window size and position - supports resize, minimize (WinKey+Down arrow), maximize (WinKey+Up arrow).
Required FullScreen plugin!
Recommended also are the ContextMenu and Hotkeys plugins, and assigning a hotkey for showing the main menu using something like:

Code: Select all

Call("ContextMenu::Show", 2, "-6", "-6")

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Removing lines containing / not containing the selected phrase.

Code: Select all

//  ============================================================================
//  http://akelpad.sourceforge.net/forum/viewtopic.php?p=30854#p30854
//  Version: 2016-03-09
//  Author: Kley
//
//  *** Удаление строк содержащих/не содержащих выделенную фразу в строке ***
//
//  Параметры:
//  -toempty=1    -действие со строкой:
//                   0  удаление (по умолчанию);
//                   1  замена на пустую.
//  -nophrase=1   -поиск строк по содержимому:
//                   0  строки с фразой (по умолчанию);
//                   1  строки без фразы.
//  -ignorecase=1 -метод сравнения строк:
//                   0  с учетом регистра (по умолчанию);
//                   1  без учета регистра.
//  -clipboard=1  -фраза (текст для поиска):
//                   0  выделенный текст (по умолчанию);
//                   1  текст из буфера обмена.
//
//  Применение:
//  Заменить строки с фразой из буфера на пустую
//  Call("Scripts::Main", 1, "DeletePhrasesInText.js", "-toempty=1 -clipboard=1 -ignorecase=1")
//  Удалить строки не содержащие фразу (с учетом регистра)
//  Call("Scripts::Main", 1, "DeletePhrasesInText.js", "-nophrase=1")
//
//  Примечание:
//  Поиск и замена ведется во всем тексте, построчно.
//  ============================================================================
var argClipBoard = AkelPad.GetArgValue("clipboard", 0);
var argEmptyString = AkelPad.GetArgValue("toempty", 0);
var argNoPhrase = AkelPad.GetArgValue("nophrase", 0);
var argIgnoreCase = AkelPad.GetArgValue("ignorecase", 0);

var hWndEdit = AkelPad.GetEditWnd();
var pEditText = AkelPad.GetTextRange(0, -1);
var nCaretLine;
var aText;
var aNewText = [];
var pSearchText;
var pCurLine;
var bFaind = false;

if (hWndEdit)
{
  nCaretLine = GetCaretLine(hWndEdit);

  pSearchText = (argClipBoard != 0) ? AkelPad.GetClipboardText() : AkelPad.GetSelText();

  if (pEditText && pSearchText)
  {
    pSearchText = GetIgnoreCase(pSearchText);
    aText = pEditText.split("\r");

    for (var i = 0; i < aText.length; i++)
    {
      pCurLine = GetIgnoreCase(aText[i]);

      if (argNoPhrase != 0)
        bFaind = pCurLine.indexOf(pSearchText) == -1;
      else
        bFaind = pCurLine.indexOf(pSearchText) != -1;

      AddInNewArrey(aText[i], bFaind);
    }

    pEditText = aNewText.join("\n");

    SetRedraw(hWndEdit, false);

    AkelPad.SetSel(0, -1);
    AkelPad.ReplaceSel(pEditText);

    AkelPad.SendMessage(AkelPad.GetMainWnd(),
                        1206 /*AKD_GOTOW*/,
                        0x1 /*GT_LINE*/,
                        AkelPad.MemStrPtr(nCaretLine + ":0"));

    SetRedraw(hWndEdit, true);
    AkelPad.SendMessage(hWndEdit, 3376 /*AEM_UPDATESCROLLBAR*/, 3, 0);
  }
}

function AddInNewArrey(sTxt, bEmpty)
{
  if (bEmpty)
  {
    if (argEmptyString != 0)
      aNewText.push("");
  }
  else
    aNewText.push(sTxt);
}

function GetIgnoreCase(sTxt)
{
  return (argIgnoreCase != 0) ? sTxt.toLowerCase() : sTxt;
}

function SetRedraw(hWnd, bRedraw)
{
  AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  if (bRedraw) AkelPad.SystemFunction().Call("user32::InvalidateRect", hWnd, 0, true);
}

function GetCaretLine(hWnd)
{
  var nLine = AkelPad.SendMessage(hWnd, 3129 /*AEM_GETLINENUMBER*/, 1 /*AEGL_FIRSTSELLINE*/, 0);
  var nUnwrappedLine = AkelPad.SendMessage(hWnd, 3143 /*AEM_GETUNWRAPLINE*/, nLine, 0);
  return nUnwrappedLine + 1;
}

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Code: Select all

function GetCoderVariableValue(hWndEdit, hDocEdit, pVarName)
{
  var pVarValue = "";
  var lpVarValue;

  if (AkelPad.IsPluginRunning("Coder::HighLight"))
  {
    if (lpVarValue = AkelPad.MemAlloc(32 * 2 /*sizeof(wchar_t)*/))
    {
      AkelPad.CallW("Coder::Settings", 22, hWndEdit, hDocEdit, pVarName, lpVarValue);
      pVarValue = AkelPad.MemRead(lpVarValue, 1 /*DT_UNICODE*/);
      AkelPad.MemFree(lpVarValue);
    }
  }
  return pVarValue;
}

function ConvertToHex(pNum, nID)
{
  switch (nID)
  {
    case IDC_EDTRGB:
        if (/^(\d{1,3})[ \W]+(\d{1,3})[ \W]+(\d{1,3})$/.test(pNum))
        {
          if ( (RegExp.$1 > 255) ||
               (RegExp.$2 > 255) ||
               (RegExp.$3 > 255) )
            return "";

          return Pad( (parseInt(RegExp.$1, 10)).toString(16) ) +
                 Pad( (parseInt(RegExp.$2, 10)).toString(16) ) +
                 Pad( (parseInt(RegExp.$3, 10)).toString(16) );
        }
        else if (/^(0x[0-9A-FHa-fh]+)[ \W]+(0x[0-9A-FHa-fh]+)[ \W]+(0x[0-9A-FHa-fh]+)$/.test(pNum))
        {
          if ( (RegExp.$1 > 255) ||
               (RegExp.$2 > 255) ||
               (RegExp.$3 > 255) )
            return "";

          return Pad(RegExp.$1.substr(2)) +
                 Pad(RegExp.$2.substr(2)) +
                 Pad(RegExp.$3.substr(2));
        }
        break;

    case IDC_EDTDEC:
        if (/^\d+$/.test(pNum))
        {
          pNum = (parseInt(pNum, 10)).toString(16);
          if ( (pNum.length != 0) &&
               (pNum.length  < 6) )
            pNum = Pad(pNum, 6);
          return pNum;
        }
        break;

    case IDC_EDTBIN:
        if (/^[0-1]+$/.test(pNum))
        {
          pNum = (parseInt(pNum, 2)).toString(16);
          if ( (pNum.length != 0) &&
               (pNum.length  < 6) )
            pNum = Pad(pNum, 6);
          return pNum;
        }
        break;

    case IDC_EDTOCT:
        if (/^[0-7]+$/.test(pNum))
        {
          pNum = (parseInt(pNum, 8)).toString(16);
          if ( (pNum.length != 0) &&
               (pNum.length  < 6) )
            pNum = Pad(pNum, 6);
          return pNum;
        }
  }
  return "";
}

// sHex="ffff00", return 255,255,0
function HexToRGB(sHex)
{
  if (/^[\da-f]{6}$/i.test(sHex))
  {
    var nRGB = parseInt(sHex, 16);

    // Red,Green,Blue
    return (0xFF & (nRGB >> 0x10)) + ',' +
           (0xFF & (nRGB >> 0x08)) + ',' +
           (0xFF & nRGB);
  }
  return "";
}

function HexToOct(pNum)
{
  if (/^[\da-f]+$/i.test(pNum))
    return (parseInt(pNum, 16)).toString(8);
  return "";
}

function HexToDec(pNum)
{
  if (/^[\da-f]+$/i.test(pNum))
    return parseInt(pNum, 16).toString();
  return "";
}

function HexToBin(pNum)
{
  if (/^[\da-f]+$/i.test(pNum))
  {
    pNum = (parseInt(pNum, 16)).toString(2);

    if (pNum.length < 32)
      pNum = Pad(pNum, 32);

    return pNum;
  }
  return "";
}

//pHex=ffccff or pHex=#ffccff
function HexToCMYK(pHex)
{
  pHex = (pHex.charAt(0) == "#") ? pHex.substring(1, 7) : pHex;

  if (pHex.length == 6)
  {
    if (/[0-9a-f]{6}/i.test(pHex))
    {
      var r = parseInt(pHex.substring(0, 2), 16);
      var g = parseInt(pHex.substring(2, 4), 16);
      var b = parseInt(pHex.substring(4, 6), 16);

      // Black
      if (r == 0 && g == 0 && b == 0)
        return [0, 0, 0, 1];

      var C = 1 - (r / 255);
      var M = 1 - (g / 255);
      var Y = 1 - (b / 255);

      var minCMY = Math.min(C, Math.min(M, Y));

      C = (C - minCMY) / (1 - minCMY);
      M = (M - minCMY) / (1 - minCMY);
      Y = (Y - minCMY) / (1 - minCMY);
      var  K = minCMY;

      return [C, M, Y, K];
    }
  }
  return 0;
}

//R:0-255, G:0-255, B:0-255
function HexToHSV(pHex)
{
  pHex = HexToRGB(pHex).split(",");

  var r = parseInt(pHex[0], 10);
  var g = parseInt(pHex[1], 10);
  var b = parseInt(pHex[2], 10);

  if (isNaN(r) || isNaN(g) || isNaN(b))
    return;

  if ( r < 0 || r > 255 ||
       g < 0 || g > 255 ||
       b < 0 || b > 255 )
    return;

  r /= 255;
  g /= 255;
  b /= 255;
  var minRGB = Math.min(r, Math.min(g, b));
  var maxRGB = Math.max(r, Math.max(g, b));

  // Black-gray-white
  if (minRGB == maxRGB)
    return [0, 0, minRGB];

  var d = (r == minRGB) ? g-b : ((b == minRGB) ? r-g : b-r);
  var h = (r == minRGB) ? 3   : ((b == minRGB) ? 1   :   5);

  var H = 60 * (h - d / (maxRGB - minRGB));
  var S = (maxRGB - minRGB) / maxRGB;
  var V = maxRGB;

  return [H, S, V];
}

function Pad(pNum, n)
{
  if (!n) n = 2;

  while (pNum.length < n)
    pNum = "0" + pNum;

  return pNum;
}

function ChooseColor()
{
  var lpRGB;
  var sByte;
  var nChoCoSize = _X64?72:36 /*sizeof(CHOOSECOLOR)*/;
  var lpChoCo = AkelPad.MemAlloc(nChoCoSize); //CHOOSECOLOR
  var lpCusCo = AkelPad.MemAlloc(16 * 4 /*sizeof(COLORREF)*/);
  var pHex = GetDlgItemText(IDC_EDTHEX);

  if (!pHex)
    pHex = "000000";
  pHex = HexReverse(pHex);

  oSys.RegisterCallback(ColorCallback);

  //Flags = CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT|CC_ENABLEHOOK
  AkelPad.MemCopy(_PtrAdd(lpChoCo,          0), nChoCoSize,    3 /*DT_DWORD*/); //lStructSize
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64? 8: 4), hWndDialog,    2 /*DT_QWORD*/); //hWndOwner
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64?24:12), pHex,          3 /*DT_DWORD*/); //rgbResult
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64?32:16), lpCusCo,       2 /*DT_QWORD*/); //lpCustColors
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64?40:20), 0x113,         3 /*DT_DWORD*/); //Flags
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64?56:28), ColorCallback, 2 /*DT_QWORD*/); //lpfnHook

  if (oSys.Call("Comdlg32::ChooseColorW", lpChoCo))
  {
    pHex = "";
    lpRGB = _PtrAdd(lpChoCo, _X64?24:12); //offsetof(CHOOSECOLOR, rgbResult)

    if (AkelPad.MemRead(lpRGB, 3 /*DT_DWORD*/) != -1)
    {
      for (var i = 0; i < 3; ++i)
      {
        sByte = AkelPad.MemRead(_PtrAdd(lpRGB, i), 5 /*DT_BYTE*/).toString(16).toUpperCase();
        pHex += Pad(sByte);
      }
    }

    oSys.Call("User32::SetFocus", GetDlgItem(IDC_EDTHEX));
    SetDlgItemText(IDC_EDTHEX, pHex);
    SendDlgItemMessage(IDC_EDTHEX, 177 /*EM_SETSEL*/, 0, -1);
  }

  oSys.UnregisterCallback(ColorCallback);
  AkelPad.MemFree(lpChoCo);
  AkelPad.MemFree(lpCusCo);

  return "";
}

function ColorCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 272 /*WM_INITDIALOG*/)
    SetDialogPos(hWnd);
  return 0;
}

// sHex="10ff20", return (Int) 20ff10
function HexReverse(sHex)
{
  if (/^[\da-f]{6}$/i.test(sHex))

    return parseInt(sHex.substr(4, 2) +
                    sHex.substr(2, 2) +
                    sHex.substr(0, 2), 16);

  return oSys.Call("User32::GetSysColor", 15 /*COLOR_BTNFACE*/);
}

function PixelColorCapture()
{
  var hDC;
  var nColor = 0;
  var ptPoint = [];

  if (hDC = oSys.Call("User32::GetDC", 0))
  {
    GetCursorPos(ptPoint);

    nColor = oSys.Call("Gdi32::GetPixel", hDC, ptPoint.x, ptPoint.y)

    var nRed   = (0xFF & (nColor        ));
    var nGreen = (0xFF & (nColor >> 0x08));
    var nBlue  = (0xFF & (nColor >> 0x10));

    nColor = Pad(nRed.toString(16)) +
             Pad(nGreen.toString(16)) +
             Pad(nBlue.toString(16));

    oSys.Call("User32::ReleaseDC", 0, hDC);
  }
  return nColor;
}

function GetCursorPos(ptPoint)
{
  var lpPoint;

  ptPoint.x = 0;
  ptPoint.y = 0;

  if (lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/))
  {
    if (oSys.Call("user32::GetCursorPos", lpPoint))
    {
      ptPoint.x = AkelPad.MemRead(_PtrAdd(lpPoint, 0) /*offsetof(POINT, x)*/, 3 /*DT_DWORD*/);
      ptPoint.y = AkelPad.MemRead(_PtrAdd(lpPoint, 4) /*offsetof(POINT, y)*/, 3 /*DT_DWORD*/);

    }
    AkelPad.MemFree(lpPoint);
  }
}

function GetSysMenu(hWnd)
{
  hSysMenu = oSys.Call("User32::GetSystemMenu", hWnd, false);
  AppendMenu(hSysMenu, MF_SEPARATOR, 0, 0);
  AppendMenu(hSysMenu, MF_STRING, IDM_SYSGETCOLOR, GetLangString(7));
  AppendMenu(hSysMenu, MF_STRING, IDM_SYSDLGCOLOR, GetLangString(8));
  AppendMenu(hSysMenu, MF_SEPARATOR, 0, 0);
  AppendMenu(hSysMenu, MF_STRING, IDM_SYSCAPTURE, GetLangString(9));
  AppendMenu(hSysMenu, MF_STRING, IDM_SYSONTOP, GetLangString(10));
}

function InitSysMenu(hMenu)
{
  oSys.Call("User32::CheckMenuItem", hMenu, IDM_SYSCAPTURE,
    bCapture ?
      0x0000 /*MF_BYCOMMAND*/ | 0x0008 /*MF_CHECKED*/ :
      0x0000 /*MF_BYCOMMAND*/ | 0x0000 /*MF_UNCHECKED*/);
  oSys.Call("User32::CheckMenuItem", hMenu, IDM_SYSONTOP,
    bWinOnTop ?
      0x0000 /*MF_BYCOMMAND*/ | 0x0008 /*MF_CHECKED*/ :
      0x0000 /*MF_BYCOMMAND*/ | 0x0000 /*MF_UNCHECKED*/);
}

function SysMenuCommand(nIDM)
{
  if (nIDM == IDM_SYSDLGCOLOR)
  {
    PostMessage(hWndDialog, 0x111 /*WM_COMMAND*/, IDC_BTNIMG, 0);
  }
  else if (nIDM == IDM_SYSGETCOLOR)
  {
    oSys.Call("User32::SetFocus", GetDlgItem(IDC_EDTHEX));
    SetDlgItemText(IDC_EDTHEX, PixelColorCapture());
  }
  else if (nIDM == IDM_SYSONTOP)
  {
    bWinOnTop = ! bWinOnTop;
    bCloseDlg = false;
    PostMessage(hWndDialog, 16 /*WM_CLOSE*/, 0, 0);
  }
  else if (nIDM == IDM_SYSCAPTURE)
  {
    if (!bCapture)
      AkelPad.WindowSubClass(2 /*WSC_EDITPROC*/, AkelEditCallback,
        514 /*WM_LBUTTONUP*/, 257 /*WM_KEYUP*/);
    else
      AkelPad.WindowUnsubClass(2 /*WSC_EDITPROC*/);
    bCapture = ! bCapture;
  }
}

function ContextMenuEdit(nID, nX, nY)
{
  var hMenu = oSys.Call("User32::CreatePopupMenu");
  var hMenu1 = oSys.Call("User32::CreatePopupMenu");
  var nTextLen = GetDlgItemTextLen(nID);
  var nSelRange = SendDlgItemMessage(nID, 176 /*EM_GETSEL*/, 0, 0);
  var nSelBeg = LOWORD(nSelRange);
  var nSelEnd = HIWORD(nSelRange);
  var bSelect = (nSelBeg != nSelEnd);
  var bSelAll = (nTextLen && (nTextLen != (nSelEnd - nSelBeg)));
  var bUndo = SendDlgItemMessage(nID, 198 /*EM_CANUNDO*/, 0, 0);
  var bPaste = AkelPad.GetClipboardText().length;
  var aColor;
  var aCMYK = [[],[]];
  var aMenuItems = [];
  var bCaseChanged;
  var nCmd;

  if (nX == 0xFFFF) //menu from keyboard
  {
    var ptCaret = GetCaretPos(GetDlgItem(nID));
    nX = ptCaret.x;
    nY = ptCaret.y;
  }

  AppendMenu(hMenu, bUndo   ? MF_STRING : MF_GRAYED, 1, GetLangString(0)); //Undo
  AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
  AppendMenu(hMenu, bSelect ? MF_STRING : MF_GRAYED, 2, GetLangString(1)); //Cut
  AppendMenu(hMenu, bSelect ? MF_STRING : MF_GRAYED, 3, GetLangString(2)); //Copy
  AppendMenu(hMenu, bPaste  ? MF_STRING : MF_GRAYED, 4, GetLangString(3)); //Paste
  AppendMenu(hMenu, bSelect ? MF_STRING : MF_GRAYED, 5, GetLangString(4)); //Delete
  AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
  AppendMenu(hMenu, bSelAll ? MF_STRING : MF_GRAYED, 6, GetLangString(5)); //Select all

  if (nTextLen)
  {
    aMenuItems[0] = GetDlgItemText(IDC_EDTHEX);                        // 00FFFF

    if (nID == IDC_EDTHEX)
    {
      aMenuItems[1] = aMenuItems[0].toLowerCase();                     // 00ffff
      aMenuItems[2] = aMenuItems[1].replace(/^(0+)([\da-f]+)/i, "$2"); // ffff
      aMenuItems[3] = aMenuItems[2].toUpperCase();                     // FFFF

      bCaseChanged = (aMenuItems[1] != aMenuItems[0]);

      AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
      AppendMenu(hMenu, MF_POPUP, hMenu1, GetLangString(6)); //Copy...

      AppendMenu(hMenu1, MF_STRING, 7, aMenuItems[1]);
      if (bCaseChanged)
        AppendMenu(hMenu1, MF_STRING, 8, aMenuItems[0]);

      if (aMenuItems[1].length == 3 || aMenuItems[1].length == 6)
      {
        AppendMenu(hMenu1, MF_SEPARATOR, 0, 0);
        AppendMenu(hMenu1, MF_STRING, 9, "#" + aMenuItems[1]);
        if (bCaseChanged)
          AppendMenu(hMenu1, MF_STRING, 10, "#" + aMenuItems[0]);
      }

      AppendMenu(hMenu1, MF_SEPARATOR, 0, 0);
      AppendMenu(hMenu1, MF_STRING, 11, "0x" + aMenuItems[1]);
      if (bCaseChanged)
        AppendMenu(hMenu1, MF_STRING, 12, "0x" + aMenuItems[0]);

      if (aMenuItems[1] != aMenuItems[2])
      {
        AppendMenu(hMenu1, MF_SEPARATOR, 0, 0);
        AppendMenu(hMenu1, MF_STRING, 13, "0x" + aMenuItems[2]);
        if (bCaseChanged)
          AppendMenu(hMenu1, MF_STRING, 14, "0x" + aMenuItems[3]);
      }
    }
    else if (nID == IDC_EDTRGB)
    {
      AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
      AppendMenu(hMenu, MF_POPUP, hMenu1, GetLangString(6 /*Copy...*/));

      aMenuItems[6] = GetDlgItemText(IDC_CBOIMG);
      if (aMenuItems[6] && (aMenuItems[6] !== "<Nothing>"))
      {
        AppendMenu(hMenu1, MF_STRING, 21, aMenuItems[6]);
        AppendMenu(hMenu1, MF_SEPARATOR, 0, 0);
      }

      if (aColor = HexToCMYK(aMenuItems[0]))
      {
        for (var i = 0; i < aColor.length; ++i)
        {
          aCMYK[0][i] = (aColor[i] * 100).toFixed();
          aCMYK[1][i] = (aColor[i]).toFixed(4);
        }

        aMenuItems[3] = aCMYK[0].join(", ");
        aMenuItems[4] = aCMYK[0].join("%, ") + "%";
        aMenuItems[5] = aCMYK[1].join(", ");

        AppendMenu(hMenu1, MF_GRAYED, 0, "CMYK");
        AppendMenu(hMenu1, MF_SEPARATOR, 0, 0);
        AppendMenu(hMenu1, MF_STRING, 15, aMenuItems[3]);
        AppendMenu(hMenu1, MF_STRING, 16, aMenuItems[4]);
        AppendMenu(hMenu1, MF_STRING, 17, aMenuItems[5]);
      }

      if (aColor = HexToHSV(aMenuItems[0]))
      {
        aMenuItems[0] = aColor.join(", ");

        aMenuItems[2] = aColor[0].toFixed(4) +", "+
                        aColor[1].toFixed(4) +", "+
                        aColor[2].toFixed(4);

        aMenuItems[1] = aColor[0].toFixed(0) +", "+
                       (aColor[1] * 100).toFixed() +"%, "+
                       (aColor[2] * 100).toFixed() +"%";

        AppendMenu(hMenu1, MF_GRAYED, 0, "HSV");
        AppendMenu(hMenu1, MF_SEPARATOR, 0, 0);
        AppendMenu(hMenu1, MF_STRING, 18, aMenuItems[0]);
        AppendMenu(hMenu1, MF_STRING, 19, aMenuItems[1]);
        AppendMenu(hMenu1, MF_STRING, 20, aMenuItems[2]);
      }
    }
  }
  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu,
    0x180 /*TPM_NONOTIFY|TPM_RETURNCMD*/, nX, nY, 0, GetDlgItem(nID), 0);

  oSys.Call("User32::DestroyMenu", hMenu1);
  oSys.Call("User32::DestroyMenu", hMenu);

  switch (nCmd)
  {
    case 1:  SendDlgItemMessage(nID, 199 /*EM_UNDO*/,   0,  0); break;
    case 2:  SendDlgItemMessage(nID, 768 /*WM_CUT*/,    0,  0); break;
    case 3:  SendDlgItemMessage(nID, 769 /*WM_COPY*/,   0,  0); break;
    case 4:  SendDlgItemMessage(nID, 770 /*WM_PASTE*/,  0,  0); break;
    case 5:  SendDlgItemMessage(nID, 771 /*WM_CLEAR*/,  0,  0); break;
    case 6:  SendDlgItemMessage(nID, 177 /*EM_SETSEL*/, 0, -1); break;
    // HEX
    case 7:  AkelPad.SetClipboardText(       aMenuItems[1]); break;
    case 8:  AkelPad.SetClipboardText(       aMenuItems[0]); break;
    case 9:  AkelPad.SetClipboardText("#"  + aMenuItems[1]); break;
    case 10: AkelPad.SetClipboardText("#"  + aMenuItems[0]); break;
    case 11: AkelPad.SetClipboardText("0x" + aMenuItems[1]); break;
    case 12: AkelPad.SetClipboardText("0x" + aMenuItems[0]); break;
    case 13: AkelPad.SetClipboardText("0x" + aMenuItems[2]); break;
    case 14: AkelPad.SetClipboardText("0x" + aMenuItems[3]); break;
    // RGB
    case 15: AkelPad.SetClipboardText(aMenuItems[3]); break;
    case 16: AkelPad.SetClipboardText(aMenuItems[4]); break;
    case 17: AkelPad.SetClipboardText(aMenuItems[5]); break;
    case 18: AkelPad.SetClipboardText(aMenuItems[0]); break;
    case 19: AkelPad.SetClipboardText(aMenuItems[1]); break;
    case 20: AkelPad.SetClipboardText(aMenuItems[2]); break;
    case 21: AkelPad.SetClipboardText(aMenuItems[6]); break;
  }
}

function AppendMenu(hMenu, uFlags, uIDNewItem, lpNewItem)
{
  oSys.Call("User32::AppendMenuW", hMenu, uFlags, uIDNewItem, lpNewItem);
}

function GetCaretPos(hWnd)
{
  var lpPoint;
  var ptPoint = [];

  ptPoint.x = 0;
  ptPoint.y = 0;

  if (lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/))
  {
    if (oSys.Call("User32::GetCaretPos", lpPoint))
    {
      oSys.Call("User32::ClientToScreen", hWnd, lpPoint);
      ptPoint.x = AkelPad.MemRead(_PtrAdd(lpPoint, 0) /*offsetof(POINT, x)*/, 3 /*DT_DWORD*/);
      ptPoint.y = AkelPad.MemRead(_PtrAdd(lpPoint, 4) /*offsetof(POINT, y)*/, 3 /*DT_DWORD*/) +
        SendMessage(hWnd, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, 0);
    }
    AkelPad.MemFree(lpPoint);
  }
  return ptPoint;
}

function SetWindowFont(hWnd, hFont)
{
  if (!hFont)
  {
    var nLFSize = 28 + 32 * 2; //sizeof(LOGFONTW)
    var lpLF    = AkelPad.MemAlloc(nLFSize);
    var hDC;
    var pFaceName = "MS Shell Dlg";
    var nHeight   = 10;
    var nWeight   = 400 /*FW_NORMAL*/;
    var bItalic   = false;

    hDC     =  oSys.Call("User32::GetDC", hMainWnd);
    nHeight = -oSys.Call("Kernel32::MulDiv", nHeight,
               oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/), 72);
    oSys.Call("User32::ReleaseDC", hMainWnd, hDC);

    AkelPad.MemCopy(_PtrAdd(lpLF,  0), nHeight,   3 /*DT_DWORD*/);   //lfHeight
    AkelPad.MemCopy(_PtrAdd(lpLF, 16), nWeight,   3 /*DT_DWORD*/);   //lfWeight
    AkelPad.MemCopy(_PtrAdd(lpLF, 20), bItalic,   5 /*DT_BYTE*/);    //lfItalic
    AkelPad.MemCopy(_PtrAdd(lpLF, 28), pFaceName, 1 /*DT_UNICODE*/); //lfFaceName

    hFont = oSys.Call("Gdi32::CreateFontIndirectW", lpLF);
    AkelPad.MemFree(lpLF);
  }
  SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
}

function SetDialogPos(hWnd)
{
  var rcWndDesktop  = GetWindowPos();
  var sizeNonClient = {
      "cx": oSys.Call("user32::GetSystemMetrics", 7 /*SM_CXFIXEDFRAME*/) * 2,
      "cy": oSys.Call("user32::GetSystemMetrics", 8 /*SM_CYFIXEDFRAME*/) * 2 +
            oSys.Call("user32::GetSystemMetrics", 4 /*SM_CYCAPTION*/)
  };

  oSys.Call("user32::SetWindowPos", hWnd, 0, oDlgPos.left, oDlgPos.top, 0, 0,
    0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);

  var rcRect = GetWindowPos(hWnd);
  var bPos = false;

  if (rcRect.left < 0)
  {
    rcRect.left = sizeNonClient.cx;
    bPos = true;
  }
  if (rcRect.right > rcWndDesktop.right)
  {
    rcRect.left = rcRect.left - (rcRect.right - rcWndDesktop.right) - sizeNonClient.cx;
    bPos = true;
  }
  if (rcRect.bottom > rcWndDesktop.bottom)
  {
    rcRect.top = rcRect.top - (rcRect.bottom - rcWndDesktop.bottom) - sizeNonClient.cx;
    bPos = true;
  }
  if (bPos)
    oSys.Call("user32::SetWindowPos", hWnd, 0, rcRect.left, rcRect.top, 0, 0,
      0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
}

function GetWindowPos(hWnd)
{
  var rcRect = [];
  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)

  if (!hWnd)
    oSys.Call("User32::SystemParametersInfo" + _TCHAR, 48 /*SPI_GETWORKAREA*/, 0, lpRect, 0);
  else
    oSys.Call("User32::GetWindowRect", hWnd, lpRect);

  rcRect.left   = AkelPad.MemRead(_PtrAdd(lpRect, 0) /*offsetof(RECT, left)*/, 3 /*DT_DWORD*/);
  rcRect.top    = AkelPad.MemRead(_PtrAdd(lpRect, 4) /*offsetof(RECT, top)*/, 3 /*DT_DWORD*/);
  rcRect.right  = AkelPad.MemRead(_PtrAdd(lpRect, 8) /*offsetof(RECT, right)*/, 3 /*DT_DWORD*/);
  rcRect.bottom = AkelPad.MemRead(_PtrAdd(lpRect, 12) /*offsetof(RECT, bottom)*/, 3 /*DT_DWORD*/);

  AkelPad.MemFree(lpRect);

  return rcRect;
}

function SetDlgIcon()
{
  var hLib;
  var hIcon = 0;

  oSys.Call("Kernel32::SetDllDirectory" + _TCHAR, AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/));

  if (hLib = oSys.Call("Kernel32::LoadLibraryEx" + _TCHAR, "ToolBar.dll", 0, 2 /*LOAD_LIBRARY_AS_DATAFILE*/))
  {
    if (hIcon = oSys.Call("User32::LoadImageW", hLib, 130, 1 /*uType=IMAGE_ICON*/, 16, 16, 0))
      SendMessage(hWndDialog, 128 /*WM_SETICON*/, 1 /*ICON_BIG*/, hIcon);

    oSys.Call("Kernel32::FreeLibrary", hLib);
  }
  return hIcon;
}

function ReadIni()
{
  var oSet = AkelPad.ScriptSettings();
  var bCap, bTop;

  if (oSet.Begin("", 0x1 /*POB_READ*/))
  {
    oDlgPos.left   = oSet.Read("DlgLeft",       1 /*PO_DWORD*/,   0);
    oDlgPos.top    = oSet.Read("DlgTop",        1 /*PO_DWORD*/,   0);
    bCap           = oSet.Read("Capture",       1 /*PO_DWORD*/,   0);
    bTop           = oSet.Read("WinOnTop",      1 /*PO_DWORD*/,   0);
    if (nAddUserColors === undefined)
    {
      nAddUserColors = oSet.Read("AddUserColors", 1 /*PO_DWORD*/,   0);
      pUserColors    = oSet.Read("UserColors",    3 /*PO_STRING*/, "");
      aUserColorName = GetUserColorsList();
    }
    oSet.End();
  }

  if (bCap) SysMenuCommand(IDM_SYSCAPTURE);
  if (bTop) SysMenuCommand(IDM_SYSONTOP);
}

function WriteIni()
{
  var oSet = AkelPad.ScriptSettings();

  if (oSet.Begin("", 0x2 /*POB_SAVE*/))
  {
    oSet.Write("DlgLeft",  1 /*PO_DWORD*/, oDlgPos.left);
    oSet.Write("DlgTop",   1 /*PO_DWORD*/, oDlgPos.top);
    oSet.Write("WinOnTop", 1 /*PO_DWORD*/, bWinOnTop);
    oSet.Write("Capture",  1 /*PO_DWORD*/, bCapture);
    oSet.End();
  }
}

function GetLangString(nStringID)
{
  var nLangID=AkelPad.GetLangId(1 /*LANGID_PRIMARY*/);

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "&Отменить\tCtrl+Z";
    if (nStringID == 1)
      return "&Вырезать\tCtrl+X";
    if (nStringID == 2)
      return "&Копировать\tCtrl+C";
    if (nStringID == 3)
      return "Вст&авить\tCtrl+V";
    if (nStringID == 4)
      return "&Удалить\tDel";
    if (nStringID == 5)
      return "Выделить в&се\tCtrl+A";
    if (nStringID == 6)
      return "Копировать...";
    if (nStringID == 7)
      return "Получить цвет под курсором\tF2";
    if (nStringID == 8)
      return "Диалог выбора цвета...\tF3";
    if (nStringID == 9)
      return "Автозахват выделенного текста";
    if (nStringID == 10)
      return "Поверх всех окон";
  }
  else
  {
    if (nStringID == 0)
      return "&Undo\tCtrl+Z";
    if (nStringID == 1)
      return "C&ut\tCtrl+X";
    if (nStringID == 2)
      return "&Copy\tCtrl+C";
    if (nStringID == 3)
      return "&Paste\tCtrl+V";
    if (nStringID == 4)
      return "&Delete\tDel";
    if (nStringID == 5)
      return "Select &all\tCtrl+A";
    if (nStringID == 6)
      return "Copy...";
    if (nStringID == 7)
      return "Get the color under the cursor\tF2";
    if (nStringID == 8)
      return "Color Selection Dialog...\tF3";
    if (nStringID == 9)
      return "Auto capture selected text";
    if (nStringID == 10)
      return "Always on top";
  }
  return "";
}

function GetUserColorsList()
{
  var aColors = [["<Nothing>","0"]];
  if (pUserColors)
  {
    pUserColors = pUserColors.split(";");
    for (var i = 0; i < pUserColors.length; ++i)
      aColors.push(pUserColors[i].split(","));
  }
  return aColors;
}

function GetColorsList()
{
  return [["<Nothing>","0"],["AliceBlue","#F0F8FF"],["AntiqueWhite","#FAEBD7"],["Aqua","#00FFFF"],["Aquamarine","#7FFFD4"],["Azure","#F0FFFF"],["Beige","#F5F5DC"],["Bisque","#FFE4C4"],["Black","#000000"],["BlanchedAlmond","#FFEBCD"],["Blue","#0000FF"],["BlueViolet","#8A2BE2"],["Brown","#A52A2A"],["BurlyWood","#DEB887"],["CadetBlue","#5F9EA0"],["Chartreuse","#7FFF00"],["Chocolate","#D2691E"],["Coral","#FF7F50"],["CornflowerBlue","#6495ED"],["Cornsilk","#FFF8DC"],["Crimson","#DC143C"],["Cyan","#00FFFF"],["DarkBlue","#00008B"],["DarkCyan","#008B8B"],["DarkGoldenrod","#B8860B"],["DarkGray","#A9A9A9"],["DarkGreen","#006400"],["DarkKhaki","#BDB76B"],["DarkMagenta","#8B008B"],["DarkOliveGreen","#556B2F"],["DarkOrange","#FF8C00"],["DarkOrchid","#9932CC"],["DarkRed","#8B0000"],["DarkSalmon","#E9967A"],["DarkSeaGreen","#8FBC8F"],["DarkSlateBlue","#483D8B"],["DarkSlateGray","#2F4F4F"],["DarkTurquoise","#00CED1"],["DarkViolet","#9400D3"],["DeepPink","#FF1493"],["DeepSkyBlue","#00BFFF"],["DimGray","#696969"],["DodgerBlue","#1E90FF"],["FireBrick","#B22222"],["FloralWhite","#FFFAF0"],["ForestGreen","#228B22"],["Fuchsia","#FF00FF"],["Gainsboro","#DCDCDC"],["GhostWhite","#F8F8FF"],["Gold","#FFD700"],["Goldenrod","#DAA520"],["Gray","#808080"],["Green","#008000"],["GreenYellow","#ADFF2F"],["HoneyDew","#F0FFF0"],["HotPink","#FF69B4"],["IndianRed","#CD5C5C"],["Indigo","#4B0082"],["Ivory","#FFFFF0"],["Khaki","#F0E68C"],["Lavender","#E6E6FA"],["LavenderBlush","#FFF0F5"],["LawnGreen","#7CFC00"],["LemonChiffon","#FFFACD"],["LightBlue","#ADD8E6"],["LightCoral","#F08080"],["LightCyan","#E0FFFF"],["LightGoldenrodYellow","#FAFAD2"],["LightGray","#D3D3D3"],["LightGreen","#90EE90"],["LightPink","#FFB6C1"],["LightSalmon","#FFA07A"],["LightSeaGreen","#20B2AA"],["LightSkyBlue","#87CEFA"],["LightSlateGray","#778899"],["LightSteelBlue","#B0C4DE"],["LightYellow","#FFFFE0"],["Lime","#00FF00"],["LimeGreen","#32CD32"],["Linen","#FAF0E6"],["Magenta","#FF00FF"],["Maroon","#800000"],["MediumAquaMarine","#66CDAA"],["MediumBlue","#0000CD"],["MediumOrchid","#BA55D3"],["MediumPurple","#9370DB"],["MediumSeaGreen","#3CB371"],["MediumSlateBlue","#7B68EE"],["MediumSpringGreen","#00FA9A"],["MediumTurquoise","#48D1CC"],["MediumVioletRed","#C71585"],["MidnightBlue","#191970"],["MintCream","#F5FFFA"],["MistyRose","#FFE4E1"],["Moccasin","#FFE4B5"],["NavajoWhite","#FFDEAD"],["Navy","#000080"],["OldLace","#FDF5E6"],["Olive","#808000"],["OliveDrab","#6B8E23"],["Orange","#FFA500"],["OrangeRed","#FF4500"],["Orchid","#DA70D6"],["PaleGoldenrod","#EEE8AA"],["PaleGreen","#98FB98"],["PaleTurquoise","#AFEEEE"],["PaleVioletRed","#DB7093"],["PapayaWhip","#FFEFD5"],["PeachPuff","#FFDAB9"],["Peru","#CD853F"],["Pink","#FFC0CB"],["Plum","#DDA0DD"],["PowderBlue","#B0E0E6"],["Purple","#800080"],["Red","#FF0000"],["RosyBrown","#BC8F8F"],["RoyalBlue","#4169E1"],["SaddleBrown","#8B4513"],["Salmon","#FA8072"],["SandyBrown","#F4A460"],["SeaGreen","#2E8B57"],["SeaShell","#FFF5EE"],["Sienna","#A0522D"],["Silver","#C0C0C0"],["SkyBlue","#87CEEB"],["SlateBlue","#6A5ACD"],["SlateGray","#708090"],["Snow","#FFFAFA"],["SpringGreen","#00FF7F"],["SteelBlue","#4682B4"],["Tan","#D2B48C"],["Teal","#008080"],["Thistle","#D8BFD8"],["Tomato","#FF6347"],["Turquoise","#40E0D0"],["Violet","#EE82EE"],["Wheat","#F5DEB3"],["White","#FFFFFF"],["WhiteSmoke","#F5F5F5"],["Yellow","#FFFF00"],["YellowGreen","#9ACD32"]];
}

ConvertNumColorValue part1.js
Last edited by Kley on Sat Mar 26, 2016 7:01 am, edited 1 time in total.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Replace text in edit window.

Part 1: TextReplace.js
Part 2:

Code: Select all

function HistAndTempl(bHist)
{
  var aSel = [[IDWHATE, AkelPad.MemAlloc(_X64 ? 24 : 12 /*AECHARINDEX*/), AkelPad.MemAlloc(_X64 ? 56 : 32 /*AESELECTION*/), AkelPad.MemAlloc(_X64 ? 16 : 8 /*POINT64*/)],
              [IDWITHE, AkelPad.MemAlloc(_X64 ? 24 : 12 /*AECHARINDEX*/), AkelPad.MemAlloc(_X64 ? 56 : 32 /*AESELECTION*/), AkelPad.MemAlloc(_X64 ? 16 : 8 /*POINT64*/)]];

  var lpRECT     = AkelPad.MemAlloc(16);
  var sWhatHT    = sWhat;
  var sWithHT    = sWith;
  var sBFileHT   = sBFile;
  var bSaveTempl = false;
  var IDLIST     = 2000;
  var IDMENUB    = 2001;
  var IDOKB      = 2002;
  var IDCANCELB  = 2003;
  var sTitleHT;
  var aHotKeyHT;
  var aTempl;
  var sTempl;
  var hWndHT;
  var nX, nY, nW, nBX;
  var i, n;

  oSys.Call("User32::SetFocus", GetDlgItem(hDlg, bHist ? IDHISTB : IDTEMPLB));
  SetDefPushButton(bHist ? IDHISTB : IDTEMPLB);

  oSys.Call("User32::GetWindowRect", GetDlgItem(hDlg, IDMATCH), lpRECT);
  oSys.Call("User32::ScreenToClient", hDlg, _PtrAdd(lpRECT, 8));
  nX = ScaleUX(AkelPad.MemRead(_PtrAdd(lpRECT, 8), 3 /*DT_DWORD*/));
  oSys.Call("User32::GetWindowRect", GetDlgItem(hDlg, IDWITHE), lpRECT);
  oSys.Call("User32::ScreenToClient", hDlg, _PtrAdd(lpRECT, 0));
  oSys.Call("User32::ScreenToClient", hDlg, _PtrAdd(lpRECT, 8));
  nY  = ScaleUY(AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/) + 5);
  nW  = ScaleUX(AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/)) - nX;
  nBX = Math.round((nW - 70 * 3 - 10) / 2);
  AkelPad.MemFree(lpRECT);

  for (i = 0; i < 2; ++i)
  {
    SendDlgItemMessage(hDlg, aSel[i][0], 3125 /*AEM_GETSEL*/, aSel[i][1], aSel[i][2]);
    SendDlgItemMessage(hDlg, aSel[i][0], 3179 /*AEM_GETSCROLLPOS*/, 0, aSel[i][3]);
    SendDlgItemMessage(hDlg, aSel[i][0], 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
  }

  if (bHist)
  {
    sTitleHT  = sTxtHistory.replace("&", "");
    aHotKeyHT = [[0x0,                       0x70 /*VK_F1*/,     MenuHT],
                 [0x1 /*MOD_ALT*/,           0x2E /*VK_DELETE*/, RemoveHist],
                 [0x5 /*MOD_SHIFT|MOD_ALT*/, 0x2E /*VK_DELETE*/, ClearHist]];
  }
  else
  {
    sTitleHT  = sTxtTemplates.replace("&", "");
    aTempl    = AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, "_templ.tsv"), 0x10 /*ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1).split("\r\n");
    aHotKeyHT = [[0x0,             0x70 /*VK_F1*/,     MenuHT],
                 [0x0,             0x2D /*VK_INSERT*/, AddTempl],
                 [0x0,             0x71 /*VK_F2*/,     RenameTempl],
                 [0x1 /*MOD_ALT*/, 0x26 /*VK_UP*/,     UpTempl],
                 [0x1 /*MOD_ALT*/, 0x28 /*VK_DOWN*/,   DownTempl],
                 [0x1 /*MOD_ALT*/, 0x2E /*VK_DELETE*/, RemoveTempl]];
  }

  oSys.Call("User32::EnableWindow", hMainWnd, 0);

  //0x50000000=WS_VISIBLE|WS_CHILD
  //0x50000001=WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON
  //0x50A10181=WS_VISIBLE|WS_CHILD|WS_BORDER|WS_VSCROLL|WS_TABSTOP|LBS_NOINTEGRALHEIGHT|LBS_USETABSTOPS|LBS_NOTIFY
  //0x90C80040=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|DS_SETFONT
  AkelPad.CreateDialog(0, sClass, sTitleHT, 0x90C80040, nX, nY, nW, 208, hDlg, CallbackHT, 0x3 /*CDF_PIXELS|CDF_MODAL*/, 0, 0, "", 0, 0, "|",
    // Class,     Title,              Style,              X,   Y,       W,   H, ID,        lParam
    0, "LISTBOX", "",                 0x50A10181,         5,   5, nW - 10, 170, IDLIST,    0, "|",
    0, "BUTTON",  sTxtMenu + " (F1)", 0x50000000,       nBX, 180,      70,  23, IDMENUB,   0, "|",
    0, "BUTTON",  sTxtOK,             0x50000001, nBX +  75, 180,      70,  23, IDOKB,     0, "|",
    0, "BUTTON",  sTxtCancel,         0x50000000, nBX + 150, 180,      70,  23, IDCANCELB, 0);

  oSys.Call("User32::EnableWindow", hMainWnd, 1);

  for (i = 0; i < 2; ++i)
  {
    SendDlgItemMessage(hDlg, aSel[i][0], 3082 /*AEM_ENDUNDOACTION*/, 0, 0);

    for (n = 1; n < 4; ++n)
      AkelPad.MemFree(aSel[i][n]);
  }

  if (bHist)
    aHist.shift();
  else if (bSaveTempl)
  {
    sTempl = "";

    if (aTempl.length > 1)
    {
      for (i = 1; i < aTempl.length; ++i)
        sTempl += aTempl[i].join("\t") + "\r\n";

      sTempl = sTempl.substr(0, sTempl.length - 2);
    }

    AkelPad.WriteFile(WScript.ScriptFullName.replace(/\.js$/i, "_templ.tsv"), sTempl, sTempl.length, 1200 /*UTF-16LE*/, 1, 0x1 /*WFF_WRITEREADONLY*/);
  }

  function CallbackHT(hWnd, uMsg, wParam, lParam)
  {
    var nID, nCode;

    if (uMsg == 272 /*WM_INITDIALOG*/)
    {
      hWndHT = hWnd;
      InitHT();
    }
    else if (uMsg == 6 /*WM_ACTIVATE*/)
      SetHotKeysHT(LoWord(wParam));
    else if (uMsg == 786 /*WM_HOTKEY*/)
    {
      if (oSys.Call("User32::GetFocus") == GetDlgItem(hWndHT, IDLIST))
        aHotKeyHT[wParam][2]();
    }
    else if (uMsg == 123 /*WM_CONTEXTMENU*/)
    {
      if (wParam == GetDlgItem(hWndHT, IDLIST))
        MenuHT(LoWord(lParam), HiWord(lParam));
      else if (wParam == GetDlgItem(hWndHT, IDMENUB))
        MenuHT();
    }
    else if (uMsg == 273 /*WM_COMMAND*/)
    {
      nID   = LoWord(wParam);
      nCode = HiWord(wParam);

      if (nID == IDLIST)
      {
        if (nCode == 1 /*LBN_SELCHANGE*/)
          SetHTToDlg();
        else if (nCode == 2 /*LBN_DBLCLK*/)
          PostMessage(hWndHT, 16 /*WM_CLOSE*/, 0, 0);
      }
      else if (nID == IDMENUB)
        MenuHT();
      else if (nID == IDOKB)
        PostMessage(hWndHT, 16 /*WM_CLOSE*/, 0, 0);
      else if ((nID == IDCANCEL) || (nID == IDCANCELB))
      {
        SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, 0, 0);
        SetHTToDlg();
        PostMessage(hWndHT, 16 /*WM_CLOSE*/, 0, 0);
      }
    }
    else if (uMsg == 16 /*WM_CLOSE*/)
    {
      if (bBatch)
      {
        sWhat = sWhatHT;
        sWith = sWithHT;
      }
      else
        sBFile = sBFileHT;

      oSys.Call("User32::EndDialog", hWndHT, 0);
    }

    return 0;
  }

  function InitHT()
  {
    var lpTabStops;
    var i;

    if (bHist)
    {
      lpTabStops = AkelPad.MemAlloc(4);
      AkelPad.MemCopy(lpTabStops, 16, 3 /*DT_DWORD*/);
      SendDlgItemMessage(hWndHT, IDLIST, 402 /*LB_SETTABSTOPS*/, 1, lpTabStops);
      AkelPad.MemFree(lpTabStops);

      aHist.unshift([bBatch ? sBFile : sWhat, bBatch ? "" : sWith, (bFunc ? "f" : "") + (bMatch ? "" : "i") + (bDotNL ? "" : "n") + (bRegExp ? "r" : "") + (bWord ? "w" : "") + (bBatch ? "b" : "")]);
      SendDlgItemMessage(hWndHT, IDLIST, 384 /*LB_ADDSTRING*/, 0, "");

      for (i = 1; i < aHist.length; ++i)
        SendDlgItemMessage(hWndHT, IDLIST, 384 /*LB_ADDSTRING*/, 0, i.toString() + "\t" + aHist[i][0].substr(0, 128).replace(/[\0\s]+/g, " "));
    }
    else
    {
      for (i = aTempl.length - 1; i >= 0; --i)
      {
        aTempl[i] = aTempl[i].split("\t", 4);

        if ((aTempl[i].length == 4) && aTempl[i][0].length && aTempl[i][3].replace(/ +$/, "").length)
          SendDlgItemMessage(hWndHT, IDLIST, 385 /*LB_INSERTSTRING*/, 0, aTempl[i][3]);
        else
        {
          bSaveTempl = true;
          aTempl.splice(i, 1);
        }
      }

      aTempl.unshift([EscapeStr(bBatch ? sBFile : sWhat), EscapeStr(bBatch ? "" : sWith), (bFunc ? "f" : "") + (bMatch ? "" : "i") + (bDotNL ? "" : "n") + (bRegExp ? "r" : "") + (bWord ? "w" : "") + (bBatch ? "b" : ""), ""]);
      SendDlgItemMessage(hWndHT, IDLIST, 385 /*LB_INSERTSTRING*/, 0, "");
    }

    SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, 0, 0);
  }

  function SetHTToDlg()
  {
    var nPos = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);
    var i;

    if (bHist)
    {
      bMatch  = (aHist[nPos][2].indexOf("i") == -1);
      bWord   = (aHist[nPos][2].indexOf("w") > -1);
      bRegExp = (aHist[nPos][2].indexOf("r") > -1);
      bDotNL  = (aHist[nPos][2].indexOf("n") == -1);
      bFunc   = (aHist[nPos][2].indexOf("f") > -1);
      bBatch  = (aHist[nPos][2].indexOf("b") > -1);

      SetColorsAE();
      ReplaceTextAE(IDWHATE, aHist[nPos][0]);
      ReplaceTextAE(IDWITHE, aHist[nPos][1]);
    }
    else
    {
      bMatch  = (aTempl[nPos][2].indexOf("i") == -1);
      bWord   = (aTempl[nPos][2].indexOf("w") > -1);
      bRegExp = (aTempl[nPos][2].indexOf("r") > -1);
      bDotNL  = (aTempl[nPos][2].indexOf("n") == -1);
      bFunc   = (aTempl[nPos][2].indexOf("f") > -1);
      bBatch  = (aTempl[nPos][2].indexOf("b") > -1);

      SetColorsAE();
      ReplaceTextAE(IDWHATE, UnEscapeStr(aTempl[nPos][0]));
      ReplaceTextAE(IDWITHE, UnEscapeStr(aTempl[nPos][1]));
    }

    SendDlgItemMessage(hDlg, IDMATCH,  241 /*BM_SETCHECK*/, bMatch,  0);
    SendDlgItemMessage(hDlg, IDWORD,   241 /*BM_SETCHECK*/, bWord,   0);
    SendDlgItemMessage(hDlg, IDREGEXP, 241 /*BM_SETCHECK*/, bRegExp, 0);
    SendDlgItemMessage(hDlg, IDDOTNL,  241 /*BM_SETCHECK*/, bDotNL,  0);
    SendDlgItemMessage(hDlg, IDFUNC,   241 /*BM_SETCHECK*/, bFunc,   0);
    SendDlgItemMessage(hDlg, IDBATCH,  241 /*BM_SETCHECK*/, bBatch,  0);
    EnableButtonsDlg();

    if (nPos == 0)
    {
      for (i = 0; i < 2; ++i)
      {
        SendDlgItemMessage(hDlg, aSel[i][0], 3132 /*AEM_INDEXUPDATE*/, 0, aSel[i][1]);
        SendDlgItemMessage(hDlg, aSel[i][0], 3132 /*AEM_INDEXUPDATE*/, 0, aSel[i][2]);
        SendDlgItemMessage(hDlg, aSel[i][0], 3132 /*AEM_INDEXUPDATE*/, 0, _PtrAdd(aSel[i][2], _X64 ? 24 : 12));
        SendDlgItemMessage(hDlg, aSel[i][0], 3126 /*AEM_SETSEL*/, aSel[i][1], aSel[i][2]);
        SendDlgItemMessage(hDlg, aSel[i][0], 3180 /*AEM_SETSCROLLPOS*/, 0, aSel[i][3]);
      }
    }
  }

  function SetHotKeysHT(bSet)
  {
    var i;

    if (bSet)
    {
      for (i = 0; i < aHotKeyHT.length; ++i)
        oSys.Call("User32::RegisterHotKey", hWndHT, i, aHotKeyHT[i][0], aHotKeyHT[i][1]);
    }
    else
    {
      for (i = 0; i < aHotKeyHT.length; ++i)
        oSys.Call("User32::UnregisterHotKey", hWndHT, i);
    }
  }

  function RemoveHist()
  {
    var nPos = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);
    var i;

    if (nPos > 0)
    {
      aHist.splice(nPos, 1);

      if (aHist.length == 1)
        PostMessage(hWndHT, 273 /*WM_COMMAND*/, IDCANCELB, 0);
      else
      {
        SendDlgItemMessage(hWndHT, IDLIST, 386 /*LB_DELETESTRING*/, nPos, 0);

        if (nPos == aHist.length)
          --nPos;
        else
        {
          for (i = nPos; i < aHist.length; ++i)
          {
            SendDlgItemMessage(hWndHT, IDLIST, 386 /*LB_DELETESTRING*/, i, 0);
            SendDlgItemMessage(hWndHT, IDLIST, 385 /*LB_INSERTSTRING*/, i, i.toString() + "\t" + aHist[i][0].substr(0, 128).replace(/[\0\s]+/g, " "));
          }
        }

        SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, nPos, 0);
        SetHTToDlg();
      }
    }
  }

  function ClearHist()
  {
    aHist.length = 1;
    PostMessage(hWndHT, 273 /*WM_COMMAND*/, IDCANCELB, 0);
  }

  function SetHistLen()
  {
    var sLen = nHistLen.toString(10);
    var nPos = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);
    var i;

    if (sLen = InputBox(hWndHT, sTitleHT, sTxtHistLen + " (0 - 99):", sLen, 0, CheckLen))
    {
      if (sLen = sLen.replace(/\s+/g, ""))
      {
        nHistLen = parseInt(sLen, 10);

        if (aHist.length > nHistLen + 1)
        {
          aHist.length = nHistLen + 1;

          if (aHist.length == 1)
            PostMessage(hWndHT, 273 /*WM_COMMAND*/, IDCANCELB, 0);
          else
          {
            while (SendDlgItemMessage(hWndHT, IDLIST, 395 /*LB_GETCOUNT*/, 0, 0) > aHist.length)
              SendDlgItemMessage(hWndHT, IDLIST, 386 /*LB_DELETESTRING*/, aHist.length, 0);

            if (nPos >= aHist.length)
            {
              SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, aHist.length - 1, 0);
              SetHTToDlg();
            }
          }
        }
      }
    }

    function CheckLen(hWnd, aStr)
    {
      var sLen = aStr[0].replace(/\s+/g, "");

      if (/\D/.test(sLen))
        return 0;
      else
      {
        sLen = parseInt(sLen, 10);

        if ((sLen < 0) || (sLen > 99))
          return 0;
      }

      return -1;
    }
  }

  function AddTempl()
  {
    var nPos = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);
    var sName;
    var bAdded;
    var i;

    if (! aTempl[0][0].length)
      return;

    for (i = 1; i < aTempl.length; ++i)
    {
      if ((aTempl[i][0] == aTempl[0][0]) && (aTempl[i][1] == aTempl[0][1]) && (aTempl[i][2] == aTempl[0][2]))
      {
        SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, i, 0);
        SetHTToDlg();
        AkelPad.MessageBox(hWndHT, sTxtTemplExists, sTxtAdd, 0x40 /*MB_ICONINFORMATION*/);
        return;
      }
    }

    if (nPos > 0)
    {
      SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, 0, 0);
      SetHTToDlg();
    }

    if (sName = InputBox(hWndHT, sTxtAdd, sTxtName, aTempl[nPos][3], 0, CheckTemplName, 0))
    {
      if (sName = sName.replace(/ +$/, ""))
      {
        bSaveTempl = true;
        bAdded     = true;
        aTempl.splice(++nPos, 0, [aTempl[0][0], aTempl[0][1], aTempl[0][2], sName]);
        SendDlgItemMessage(hWndHT, IDLIST, 385 /*LB_INSERTSTRING*/, nPos, sName);
        SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, nPos, 0);
      }
    }

    if (! bAdded)
    {
      SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, nPos, 0);
      SetHTToDlg();
    }
  }

  function CheckTemplName(hWnd, aStr, nPos)
  {
    var sName = aStr[0].replace(/ +$/, "");
    var i;

    if (sName)
    {
      for (i = 1; i < aTempl.length; ++i)
      {
        if ((aTempl[i][3] == sName) && ((nPos == 0) || (nPos != i)))
        {
          SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, i, 0);
          SetHTToDlg();
          AkelPad.MessageBox(hWndHT, sTxtNameExists, nPos ? sTxtRename : sTxtAdd, 0x40 /*MB_ICONINFORMATION*/);
          SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, nPos, 0);
          SetHTToDlg();
          return 0;
        }
      }
    }

    return -1;
  }

  function RenameTempl()
  {
    var nPos = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);
    var sName;

    if (nPos < 1)
      return;

    if (sName = InputBox(hWndHT, sTxtRename, sTxtName, aTempl[nPos][3], 0, CheckTemplName, nPos))
    {
      if (sName = sName.replace(/ +$/, ""))
      {
        bSaveTempl = true;
        aTempl[nPos][3] = sName;
        SendDlgItemMessage(hWndHT, IDLIST, 386 /*LB_DELETESTRING*/, nPos, 0);
        SendDlgItemMessage(hWndHT, IDLIST, 385 /*LB_INSERTSTRING*/, nPos, sName);
        SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, nPos, 0);
      }
    }
  }

  function UpTempl()
  {
    var nPos = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);

    if (nPos > 1)
    {
      bSaveTempl = true;
      aTempl.splice(nPos - 1, 0, [aTempl[nPos][0], aTempl[nPos][1], aTempl[nPos][2], aTempl[nPos][3]]);
      aTempl.splice(nPos + 1, 1);
      SendDlgItemMessage(hWndHT, IDLIST, 385 /*LB_INSERTSTRING*/, nPos - 1, aTempl[nPos - 1][3]);
      SendDlgItemMessage(hWndHT, IDLIST, 386 /*LB_DELETESTRING*/, nPos + 1, 0);
      SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, nPos - 1, 0);
    }
  }

  function DownTempl()
  {
    var nPos = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);

    if ((nPos > 0) && (nPos < aTempl.length - 1))
    {
      bSaveTempl = true;
      aTempl.splice(nPos + 2, 0, [aTempl[nPos][0], aTempl[nPos][1], aTempl[nPos][2], aTempl[nPos][3]]);
      aTempl.splice(nPos, 1);
      SendDlgItemMessage(hWndHT, IDLIST, 385 /*LB_INSERTSTRING*/, nPos + 2, aTempl[nPos + 1][3]);
      SendDlgItemMessage(hWndHT, IDLIST, 386 /*LB_DELETESTRING*/, nPos, 0);
      SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, nPos + 1, 0);
    }
  }

  function RemoveTempl()
  {
    var nPos = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);

    if (nPos > 0)
    {
      bSaveTempl = true;
      aTempl.splice(nPos, 1);
      SendDlgItemMessage(hWndHT, IDLIST, 386 /*LB_DELETESTRING*/, nPos, 0);
      SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, nPos - ((nPos == aTempl.length) ? 1 : 0), 0);
      SetHTToDlg();
    }
  }

  function SortTempl()
  {
    var nPos  = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);
    var sName = aTempl[nPos][3];
    var i;

    bSaveTempl = true;

    aTempl.sort(
      function(a1, a2)
      {
        return oSys.Call("Kernel32::lstrcmpW", a1[3], a2[3]);
      });

    SendDlgItemMessage(hWndHT, IDLIST, 388 /*LB_RESETCONTENT*/, 0, 0);

    for (i = 0; i < aTempl.length; ++i)
    {
      SendDlgItemMessage(hWndHT, IDLIST, 384 /*LB_ADDSTRING*/, 0, aTempl[i][3]);

      if (aTempl[i][3] == sName)
        nPos = i;
    }

    SendDlgItemMessage(hWndHT, IDLIST, 390 /*LB_SETCURSEL*/, nPos, 0);
    SetHTToDlg();
  }

  function MenuHT(nX, nY)
  {
    var MF_STRING    = 0x0000;
    var MF_GRAYED    = 0x0001;
    var MF_SEPARATOR = 0x0800;
    var nPos  = SendDlgItemMessage(hWndHT, IDLIST, 392 /*LB_GETCURSEL*/, 0, 0);
    var hMenu = oSys.Call("User32::CreatePopupMenu");
    var lpRECT;
    var nIH;
    var nCmd;

    oSys.Call("User32::SetFocus", GetDlgItem(hWndHT, IDLIST));
    SendDlgItemMessage(hWndHT, IDMENUB, 244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
    SendDlgItemMessage(hWndHT, IDOKB,   244 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);

    //menu from keyboard or "Menu" button
    if ((typeof nX != "number") || (nX == 0xFFFF))
    {
      lpRECT = AkelPad.MemAlloc(16);
      SendDlgItemMessage(hWndHT, IDLIST, 408 /*LB_GETITEMRECT*/, nPos, lpRECT);
      nIH = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRECT, 4), 3 /*DT_DWORD*/);
      oSys.Call("User32::ClientToScreen", GetDlgItem(hWndHT, IDLIST), lpRECT);
      nX = AkelPad.MemRead(_PtrAdd(lpRECT, 0), 3 /*DT_DWORD*/);
      nY = AkelPad.MemRead(_PtrAdd(lpRECT, 4), 3 /*DT_DWORD*/) + nIH;
      AkelPad.MemFree(lpRECT);
    }

    if (bHist)
    {
      oSys.Call("User32::AppendMenuW", hMenu, (nPos > 0) ? MF_STRING : MF_GRAYED, 1, sTxtRemove + "\tAlt+Del");
      oSys.Call("User32::AppendMenuW", hMenu, (aHist.length > 1) ? MF_STRING : MF_GRAYED, 2, sTxtClear + "\tShift+Alt+Del");
      oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
      oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, 3, sTxtHistLen + ": " + nHistLen);
    }
    else
    {
      oSys.Call("User32::AppendMenuW", hMenu, (aTempl[0][0].length && (aTempl[0][2].indexOf("b") == -1)) ? MF_STRING : MF_GRAYED, 11, sTxtAdd + "\tInsert");
      oSys.Call("User32::AppendMenuW", hMenu, (nPos > 0) ? MF_STRING : MF_GRAYED, 12, sTxtRename + "\tF2");
      oSys.Call("User32::AppendMenuW", hMenu, (nPos > 1) ? MF_STRING : MF_GRAYED, 13, sTxtMoveUp + "\tAlt+Up");
      oSys.Call("User32::AppendMenuW", hMenu, ((nPos > 0) && (nPos < aTempl.length - 1)) ? MF_STRING : MF_GRAYED, 14, sTxtMoveDown + "\tAlt+Down");
      oSys.Call("User32::AppendMenuW", hMenu, (nPos > 0) ? MF_STRING : MF_GRAYED, 15, sTxtRemove + "\tAlt+Del");
      oSys.Call("User32::AppendMenuW", hMenu, (aTempl.length > 2) ? MF_STRING : MF_GRAYED, 16, sTxtSort);
    }

    SetHotKeysHT(0);
    nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0180 /*TPM_NONOTIFY|TPM_RETURNCMD*/, nX, nY, 0, hWndHT, 0);
    oSys.Call("User32::DestroyMenu", hMenu);
    SetHotKeysHT(1);

    if (nCmd == 1)
      RemoveHist();
    else if (nCmd == 2)
      ClearHist();
    else if (nCmd == 3)
      SetHistLen();
    else if (nCmd == 11)
      AddTempl();
    else if (nCmd == 12)
      RenameTempl();
    else if (nCmd == 13)
      UpTempl();
    else if (nCmd == 14)
      DownTempl();
    else if (nCmd == 15)
      RemoveTempl();
    else if (nCmd == 16)
      SortTempl();
  }
}

function Find(nCmd)
{
  var hEditWnd = AkelPad.GetEditWnd();
  var nFRF;
  var sFindIt;
  var lpCaret;
  var lpSelect;
  var lpPoint64;
  var nPos;
  var nSel;
  var aBRange;
  var nBRange;
  var sTitle;
  var i;

  if ((! hEditWnd) || (! sWhat) || bBatch || ((nCmd > 10) && (! IsLineBoard())))
    return;

  nFRF = 0;
  if (bMatch)
    nFRF |= 0x00000004 /*FRF_MATCHCASE*/;
  if (bWord)
    nFRF |= 0x00000002 /*FRF_WHOLEWORD*/;
  if (bRegExp)
    nFRF |= 0x00080000 /*FRF_REGEXP*/;
  if (! bDotNL)
    nFRF |= 0x00040000 /*FRF_REGEXPNONEWLINEDOT*/;

  sFindIt   = sWhat.replace(/\n/g, bRegExp ? "\\n" : "\r");
  lpCaret   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
  lpPoint64 = AkelPad.MemAlloc(_X64 ? 16 :  8 /*sizeof(POINT64)*/);
  SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, lpCaret, lpSelect);
  SendMessage(hEditWnd, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);
  SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 0, 0);
  SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 0, 0);

  if (nCmd < 11)
  {
    if (nCmd == 1)
      nFRF |= 0x00000001 /*FRF_DOWN*/;
    else if ((nCmd == 2) || (nCmd == 3))
    {
      nFRF |= 0x00100000 /*FRF_UP*/;
      if (nCmd == 3)
        AkelPad.SetSel(-1, -1);
    }
    else
      nFRF |= 0x00200001 /*FRF_BEGINNING|FRF_DOWN*/;

    nPos = AkelPad.TextFind(0, sFindIt, nFRF);
  }
  else //in bookmarks
  {
    aBRange = GetBRangeArr(hEditWnd);

    if (aBRange.length)
    {
      nPos = -1;

      if ((nCmd == 11) || (nCmd == 14))
      {
        nFRF |= 0x00000001 /*FRF_DOWN*/;

        if (nCmd == 11)
        {
          nSel    = AkelPad.GetSelEnd();
          nBRange = GetCurrBRange(aBRange, nSel);

          if ((nBRange >= 0) && (nSel < aBRange[nBRange][1]))
          {
            AkelPad.SetSel(nSel, nSel);
            nPos = AkelPad.TextFind(0, sFindIt, nFRF);

            if ((nPos >= 0) && (AkelPad.GetSelEnd() > aBRange[nBRange][1]))
              nPos = -1;
          }
        }

        if (nPos == -1)
        {
          if (nCmd == 11)
            nBRange = GetNextBRange(aBRange, nBRange, true);
          else
            nBRange = 0;

          if (nBRange >= 0)
          {
            for (; nBRange < aBRange.length; ++nBRange)
            {
              AkelPad.SetSel(aBRange[nBRange][0], aBRange[nBRange][0]);
              nPos = AkelPad.TextFind(0, sFindIt, nFRF);

              if ((nPos >= 0) && (AkelPad.GetSelEnd() > aBRange[nBRange][1]))
                nPos = -1;
              else
                break;
            }
          }
        }
      }
      else
      {
        nFRF |= 0x00100000 /*FRF_UP*/;

        if (nCmd == 12)
        {
          nSel    = AkelPad.GetSelStart();
          nBRange = GetCurrBRange(aBRange, nSel);

          if ((nBRange >= 0) && (nSel > aBRange[nBRange][0]))
          {
            AkelPad.SetSel(nSel, nSel);
            nPos = AkelPad.TextFind(0, sFindIt, nFRF);

            if ((nPos >= 0) && (AkelPad.GetSelStart() < aBRange[nBRange][0]))
              nPos = -1;
          }
        }

        if (nPos == -1)
        {
          if (nCmd == 12)
            nBRange = GetNextBRange(aBRange, nBRange, false);
          else
            nBRange = aBRange.length - 1;

          if (nBRange >= 0)
          {
            for (; nBRange >= 0; --nBRange)
            {
              AkelPad.SetSel(aBRange[nBRange][1], aBRange[nBRange][1]);
              nPos = AkelPad.TextFind(0, sFindIt, nFRF);

              if ((nPos >= 0) && (AkelPad.GetSelStart() < aBRange[nBRange][0]))
                nPos = -1;
              else
                break;
            }
          }
        }
      }
    }
    else
    {
      if (bRegExp)
      {
        AkelPad.SetSel(0, 0);
        nPos = AkelPad.TextFind(0, sFindIt, nFRF | 0x80100000 /*FRF_TEST|FRF_UP*/);

        if (nPos > 0)
          nPos = -1;
      }
    }
  }

  if (nPos < 0)
  {
    SendMessage(hEditWnd, 3126 /*AEM_SETSEL*/, lpCaret, lpSelect);
    SendMessage(hEditWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);
  }

  AkelPad.MemFree(lpCaret);
  AkelPad.MemFree(lpSelect);
  AkelPad.MemFree(lpPoint64);

  SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 1, 0);
  SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 1, 0);
  oSys.Call("User32::InvalidateRect", hMainWnd, 0, 1);
  oSys.Call("User32::InvalidateRect", hEditWnd, 0, 1);

  if (nPos < 0)
  {
    if ((nCmd % 10) == 1)
      sTitle = sTxtNext;
    else if ((nCmd % 10) == 2)
      sTitle = sTxtPrev;
    else if ((nCmd % 10) == 3)
      sTitle = sTxtLast;
    else
      sTitle = sTxtFirst;

    sTitle = (((nCmd < 11) ? sTxtFind : sTxtFindInBooks) + ": " + sTitle).replace(/&/g, "");

    if (nPos == -1)
      AkelPad.MessageBox(hDlg, sTxtNotFound, sTitle, 0x40 /*MB_ICONINFORMATION*/);
    else if (nPos <= -100)
    {
      AkelPad.MessageBox(hDlg, sTxtRegExpErr, sTitle, 0x10 /*MB_ICONERROR*/);
      SendDlgItemMessage(hDlg, IDWHATE, 177 /*EM_SETSEL*/, -nPos - 100, -1);
      oSys.Call("User32::SetFocus", GetDlgItem(hDlg, IDWHATE));
      SetDefPushButton(0);
    }
  }
}

function GetCurrBRange(aBRange, nPos)
{
  var nBRange;
  var i;

  if (nPos < aBRange[0][0])
    nBRange = -1;
  else if ((nPos >= aBRange[0][0]) && (nPos <= aBRange[0][1]))
    nBRange = 0;
  else if (nPos > aBRange[aBRange.length - 1][1])
    nBRange = -aBRange.length - 1;
  else
  {
    for (i = 1; i < aBRange.length; ++i)
    {
      if ((nPos >= aBRange[i][0]) && (nPos <= aBRange[i][1]))
      {
        nBRange = i;
        break;
      }
      else if ((nPos > aBRange[i - 1][1]) && (nPos < aBRange[i][0]))
      {
        nBRange = -i - 1;
        break;
      }
    }
  }

  return nBRange;
}

function GetNextBRange(aBRange, nBRange, bNext)
{
  if (nBRange >= 0)
    nBRange += bNext ? 1 : -1;
  else
    nBRange = -nBRange - (bNext ? 1 : 2);

  if (nBRange >= aBRange.length)
    nBRange = -1;

  return nBRange;
}

function GetBRangeArr(hEditWnd)
{
  var aBook   = GetBookmarkStr(hEditWnd).split(",");
  var aBRange = [];
  var i, n;

  if (aBook[0])
  {
    for (i = 0; i < aBook.length; i = n + 1)
    {
      for (n = i; (n + 1 < aBook.length) && (aBook[n + 1] - aBook[n] <= 1); ++n);

      aBRange.push([SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 41 /*AEGI_RICHOFFSETFROMUNWRAPLINE*/, parseInt(aBook[i])), SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 19 /*AEGI_WRAPLINEEND*/, SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 41 /*AEGI_RICHOFFSETFROMUNWRAPLINE*/, parseInt(aBook[n])))]);
    }
  }

  return aBRange;
}

function GetBookmarkStr(hEditWnd)
{
  var lpLen  = AkelPad.MemAlloc(4 /*int*/);
  var sBooks = "";
  var nLen;
  var lpBooks;

  AkelPad.CallW("LineBoard::Main", 12, hEditWnd, 0, 0, lpLen);

  if ((nLen = AkelPad.MemRead(lpLen, 3 /*DT_DWORD*/)) > 1)
  {
    lpBooks = AkelPad.MemAlloc(nLen * 2);
    AkelPad.CallW("LineBoard::Main", 12, hEditWnd, 0, lpBooks, 0);
    sBooks = AkelPad.MemRead(lpBooks, 1 /*DT_UNICODE*/).replace(/(^|,)(\d+)(?:,\2)+/g, "$1$2");
    AkelPad.MemFree(lpBooks);
  }

  AkelPad.MemFree(lpLen);

  return sBooks;
}

function BookmarkLines(bBookmark)
{
  var hEditWnd = AkelPad.GetEditWnd();
  var nFRF;
  var sFindIt;
  var lpCaret;
  var lpSelect;
  var lpPoint64;
  var nPos;
  var sBooks;
  var aBook;
  var nLine1;
  var nLine2;
  var sTitle;
  var i;

  if ((! hEditWnd) || (! sWhat) || bBatch || (! IsLineBoard()))
    return;

  nFRF = 0x00000001 /*FRF_DOWN*/;
  if (bMatch)
    nFRF |= 0x00000004 /*FRF_MATCHCASE*/;
  if (bWord)
    nFRF |= 0x00000002 /*FRF_WHOLEWORD*/;
  if (bRegExp)
    nFRF |= 0x00080000 /*FRF_REGEXP*/;
  if (! bDotNL)
    nFRF |= 0x00040000 /*FRF_REGEXPNONEWLINEDOT*/;

  sFindIt   = sWhat.replace(/\n/g, bRegExp ? "\\n" : "\r");
  lpCaret   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
  lpPoint64 = AkelPad.MemAlloc(_X64 ? 16 :  8 /*sizeof(POINT64)*/);
  SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, lpCaret, lpSelect);
  SendMessage(hEditWnd, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);
  SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 0, 0);
  SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 0, 0);

  sBooks = "";
  AkelPad.SetSel(0, 0);

  while ((nPos = AkelPad.TextFind(0, sFindIt, nFRF)) >= 0)
  {
    nLine1 = SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 21 /*AEGI_UNWRAPLINEFROMRICHOFFSET*/, nPos);
    nLine2 = SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 21 /*AEGI_UNWRAPLINEFROMRICHOFFSET*/, AkelPad.GetSelEnd());

    for (i = nLine1; i <= nLine2; ++i)
      sBooks += i + ",";
  }

  SendMessage(hEditWnd, 3126 /*AEM_SETSEL*/, lpCaret, lpSelect);
  SendMessage(hEditWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);
  SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 1, 0);
  SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 1, 0);
  oSys.Call("User32::InvalidateRect", hMainWnd, 0, 1);
  oSys.Call("User32::InvalidateRect", hEditWnd, 0, 1);

  AkelPad.MemFree(lpCaret);
  AkelPad.MemFree(lpSelect);
  AkelPad.MemFree(lpPoint64);

  if (sBooks)
  {
    if (bBookmark)
    {
      sBooks += GetBookmarkStr(hEditWnd);
      AkelPad.CallW("LineBoard::Main", 13 /*set bookmarks*/, hEditWnd, 0, sBooks);
    }
    else
    {
      aBook  = sBooks.slice(0, -1).split(",");
      sBooks = GetBookmarkStr(hEditWnd);

      if (sBooks)
      {
        for (i = 0; i < aBook.length; ++i)
          sBooks = sBooks.replace(new RegExp("(^|,)" + aBook[i] + "(?:,|$)"), "$1");

        AkelPad.CallW("LineBoard::Main", 14 /*del bookmarks*/, hEditWnd);
        AkelPad.CallW("LineBoard::Main", 13 /*set bookmarks*/, hEditWnd, 0, sBooks);
      }
    }
  }
  else
  {
    sTitle = (bBookmark ? sTxtBookmarkLines : sTxtUnmarkLines).replace("&", "");

    if (nPos <= -100)
    {
      AkelPad.MessageBox(hDlg, sTxtRegExpErr, sTitle, 0x10 /*MB_ICONERROR*/);
      SendDlgItemMessage(hDlg, IDWHATE, 177 /*EM_SETSEL*/, -nPos - 100, -1);
      oSys.Call("User32::SetFocus", GetDlgItem(hDlg, IDWHATE));
      SetDefPushButton(0);
    }
    else
      AkelPad.MessageBox(hDlg, sTxtNotFound, sTitle, 0x40 /*MB_ICONINFORMATION*/);
  }
}

function CountInRange(nCmd)
{
  var hEditWnd = AkelPad.GetEditWnd();
  var nFRF;
  var sFindIt;
  var lpCaret;
  var lpSelect;
  var lpPoint64;
  var aBRange;
  var nCount;
  var sTitle;
  var sText;
  var i, n;

  if ((! hEditWnd) || (! sWhat) || bBatch || ((nCmd == 24) && (! IsLineBoard())))
    return;

  nFRF = 0x80000001 /*FRF_TEST|FRF_DOWN*/;
  if (bMatch)
    nFRF |= 0x00000004 /*FRF_MATCHCASE*/;
  if (bWord)
    nFRF |= 0x00000002 /*FRF_WHOLEWORD*/;
  if (bRegExp)
    nFRF |= 0x00080000 /*FRF_REGEXP*/;
  if (! bDotNL)
    nFRF |= 0x00040000 /*FRF_REGEXPNONEWLINEDOT*/;

  if (nCmd < 5)
    nFRF |= 0x00400000 /*FRF_SELECTION*/;
  else
  {
    nFRF |= 0x00200000 /*FRF_BEGINNING*/;

    if (nCmd == 6)
      nFRF |= 0x01000000 /*FRF_ALLFILES*/;
  }

  sFindIt   = sWhat.replace(/\n/g, bRegExp ? "\\n" : "\r");
  lpCaret   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
  lpPoint64 = AkelPad.MemAlloc(_X64 ? 16 :  8 /*sizeof(POINT64)*/);
  SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, lpCaret, lpSelect);
  SendMessage(hEditWnd, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);
  SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 0, 0);
  SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 0, 0);

  if (nCmd == 4) //in bookmarks
  {
    nCount  = 0;
    aBRange = GetBRangeArr(hEditWnd);

    if (aBRange.length)
    {
      for (i = 0; i < aBRange.length; ++i)
      {
        AkelPad.SetSel(aBRange[i][0], aBRange[i][1]);
        n = AkelPad.TextReplace(0, sFindIt, "", nFRF, 0x1 /*RRF_ALL*/);

        if (n <= -100)
        {
          nCount = n;
          break;
        }

        nCount += n;
      }
    }
    else if (bRegExp)
    {
      AkelPad.SetSel(-1, -1);
      nCount = AkelPad.TextReplace(0, sFindIt, "", nFRF, 0x1 /*RRF_ALL*/);
    }
  }
  else
  {
    if (nCmd == 1)
      AkelPad.SetSel(0, SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 5 /*AEGI_CARETCHAR*/, 0));
    else if (nCmd == 2)
      AkelPad.SetSel(SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 5 /*AEGI_CARETCHAR*/, 0), -1);

    nCount = AkelPad.TextReplace(0, sFindIt, "", nFRF, 0x1 /*RRF_ALL*/);
  }

  SendMessage(hEditWnd, 3126 /*AEM_SETSEL*/, lpCaret, lpSelect);
  SendMessage(hEditWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);
  SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 1, 0);
  SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 1, 0);
  oSys.Call("User32::InvalidateRect", hMainWnd, 0, 1);
  oSys.Call("User32::InvalidateRect", hEditWnd, 0, 1);

  AkelPad.MemFree(lpCaret);
  AkelPad.MemFree(lpSelect);
  AkelPad.MemFree(lpPoint64);

  sTitle = sTxtCountInRange.replace("&", "");

  if (nCount <= -100)
  {
    AkelPad.MessageBox(hDlg, sTxtRegExpErr, sTitle, 0x10 /*MB_ICONERROR*/);
    SendDlgItemMessage(hDlg, IDWHATE, 177 /*EM_SETSEL*/, -nCount - 100, -1);
    oSys.Call("User32::SetFocus", GetDlgItem(hDlg, IDWHATE));
    SetDefPushButton(0);
  }
  else
  {
    if (nCmd == 1)
      sText = sTxtBegToCaret;
    else if (nCmd == 2)
      sText = sTxtCaretToEnd;
    else if (nCmd == 3)
      sText = sTxtSelection;
    else if (nCmd == 4)
      sText = sTxtBookmarks;
    else if (nCmd == 5)
      sText = sTxtEntireDoc;
    else
      sText = sTxtAllDocs;

    AkelPad.MessageBox(hDlg, sText + ": " + nCount + ".", sTitle, 0x40 /*MB_ICONINFORMATION*/);
  }
}

function MenuAE(hWnd, nID, nX, nY)
{
  var MF_STRING    = 0x0000;
  var MF_GRAYED    = 0x0001;
  var MF_CHECKED   = 0x0008;
  var MF_POPUP     = 0x0010;
  var MF_SEPARATOR = 0x0800;
  var bSel         = SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0);
  var sHelpFile    = GetAkelHelpFile();
  var hMenu        = oSys.Call("User32::CreatePopupMenu");
  var hMenu1;
  var aBFile;
  var bFont;
  var bWrap;
  var lpPOINT;
  var nCmd;
  var i;

  oSys.Call("User32::SetFocus", hWnd);
  SetDefPushButton(0);

  if (nID == IDWHATE)
  {
    bFont = bFont1;
    bWrap = bWrap1;
  }
  else
  {
    bFont = bFont2;
    bWrap = bWrap2;
  }

  //menu from keyboard
  if ((typeof nX != "number") || (nX == 0xFFFF))
  {
    lpPOINT = AkelPad.MemAlloc(8);
    oSys.Call("User32::GetCaretPos", lpPOINT);
    oSys.Call("User32::ClientToScreen", hWnd, lpPOINT);
    nX = AkelPad.MemRead(_PtrAdd(lpPOINT, 0), 3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(_PtrAdd(lpPOINT, 4), 3 /*DT_DWORD*/) + SendMessage(hWnd, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, 0);
    AkelPad.MemFree(lpPOINT);
  }

  if (bBatch)
  {
    hMenu1 = oSys.Call("User32::CreatePopupMenu");
    aBFile = [];

    GetBatchFiles(aBFile);

    if (aBFile.length)
    {
      for (i = 0; i < aBFile.length; ++i)
        oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, i + 100, aBFile[i]);
    }
    else
      oSys.Call("User32::AppendMenuW", hMenu1, MF_GRAYED, 0, sTxtNoBatchFiles);

    oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu1, sTxtBatchFile);
    oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
    oSys.Call("User32::AppendMenuW", hMenu, bSel ? MF_STRING : MF_GRAYED, 4, sTxtCopy + "\tCtrl+C");
    oSys.Call("User32::AppendMenuW", hMenu, oSys.Call("User32::GetWindowTextLengthW", hWnd) ? MF_STRING : MF_GRAYED, 7, sTxtSelAll + "\tCtrl+A");
  }
  else
  {
    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3075 /*AEM_CANUNDO*/, 0, 0) ? MF_STRING : MF_GRAYED, 1, sTxtUndo + "\tCtrl+Z");
    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3076 /*AEM_CANREDO*/, 0, 0) ? MF_STRING : MF_GRAYED, 2, sTxtRedo + "\tCtrl+Shift+Z");
    oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
    oSys.Call("User32::AppendMenuW", hMenu, bSel ? MF_STRING : MF_GRAYED, 3, sTxtCut + "\tCtrl+X");
    oSys.Call("User32::AppendMenuW", hMenu, bSel ? MF_STRING : MF_GRAYED, 4, sTxtCopy + "\tCtrl+C");
    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3035 /*AEM_CANPASTE*/, 0, 0) ? MF_STRING : MF_GRAYED, 5, sTxtPaste + "\tCtrl+V");
    oSys.Call("User32::AppendMenuW", hMenu, bSel ? MF_STRING : MF_GRAYED, 6, sTxtDelete + "\tDel");
    oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
    oSys.Call("User32::AppendMenuW", hMenu, oSys.Call("User32::GetWindowTextLengthW", hWnd) ? MF_STRING : MF_GRAYED, 7, sTxtSelAll + "\tCtrl+A");
  }

  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
  oSys.Call("User32::AppendMenuW", hMenu, bFont ? MF_CHECKED : MF_STRING, 8, sTxtAPFont + "\tCtrl+F");
  oSys.Call("User32::AppendMenuW", hMenu, bWrap ? MF_CHECKED : MF_STRING, 9, sTxtWrap + "\tCtrl+U");

  if (sHelpFile)
  {
    oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
    oSys.Call("User32::AppendMenuW", hMenu, oFSO.FileExists(AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/) + "\\HtmlView.js") ? MF_STRING : MF_GRAYED, 10, sHelpFile + "\tCtrl+F1");
  }

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x180 /*TPM_NONOTIFY|TPM_RETURNCMD*/, nX, nY, 0, hWnd, 0);
  oSys.Call("User32::DestroyMenu", hMenu1);
  oSys.Call("User32::DestroyMenu", hMenu);

  if (nCmd == 1)
    SendMessage(hWnd, 3077 /*AEM_UNDO*/, 0, 0);
  else if (nCmd == 2)
    SendMessage(hWnd, 3078 /*AEM_REDO*/, 0, 0);
  else if (nCmd == 3)
    SendMessage(hWnd, 3037 /*AEM_CUT*/, 0, 0);
  else if (nCmd == 4)
    SendMessage(hWnd, 3038 /*AEM_COPY*/, 0, 0);
  else if (nCmd == 5)
    SendMessage(hWnd, 3036 /*AEM_PASTE*/, 0, 0);
  else if (nCmd == 6)
    SendMessage(hWnd, 771 /*WM_CLEAR*/, 0, 0);
  else if (nCmd == 7)
    SendMessage(hWnd, 177 /*EM_SETSEL*/, 0, -1);
  else if (nCmd == 8)
  {
    if (nID == IDWHATE)
      bFont1 = ! bFont1;
    else
      bFont2 = ! bFont2;

    SetFontAE(nID);
  }
  else if (nCmd == 9)
  {
    if (nID == IDWHATE)
      bWrap1 = ! bWrap1;
    else
      bWrap2 = ! bWrap2;

    SetWrapAE(nID);
  }
  else if (nCmd == 10)
    AkelHelp(sHelpFile);
  else if (nCmd >= 100)
    ReplaceTextAE(IDWHATE, aBFile[nCmd - 100]);
}

function MenuBatch()
{
  var MF_STRING = 0x0000;
  var MF_GRAYED = 0x0001;
  var hWnd    = GetDlgItem(hDlg, IDWHATE);
  var lpPOINT = AkelPad.MemAlloc(8);
  var aBFile  = [];
  var hMenu   = oSys.Call("User32::CreatePopupMenu");
  var nX, nY;
  var nCmd;
  var i;

  oSys.Call("User32::SetFocus", hWnd);
  SetDefPushButton(0);

  oSys.Call("User32::GetCaretPos", lpPOINT);
  oSys.Call("User32::ClientToScreen", hWnd, lpPOINT);
  nX = AkelPad.MemRead(_PtrAdd(lpPOINT, 0), 3 /*DT_DWORD*/);
  nY = AkelPad.MemRead(_PtrAdd(lpPOINT, 4), 3 /*DT_DWORD*/) + SendMessage(hWnd, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, 0);
  AkelPad.MemFree(lpPOINT);

  GetBatchFiles(aBFile);

  if (aBFile.length)
  {
    for (i = 0; i < aBFile.length; ++i)
      oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, i + 100, aBFile[i]);
  }
  else
    oSys.Call("User32::AppendMenuW", hMenu, MF_GRAYED, 0, sTxtNoBatchFiles);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x180 /*TPM_NONOTIFY|TPM_RETURNCMD*/, nX, nY, 0, hWnd, 0);
  oSys.Call("User32::DestroyMenu", hMenu);

  if (nCmd >= 100)
    ReplaceTextAE(IDWHATE, aBFile[nCmd - 100]);
}

function GetBatchFiles(aBFile)
{
  var lpFindData = AkelPad.MemAlloc(44 + (260 + 14) * 2); //WIN32_FIND_DATAW
  var hFindFile  = oSys.Call("Kernel32::FindFirstFileW", WScript.ScriptFullName.replace(/\.js$/i, "_batch") + "*.tsv", lpFindData);

  if (hFindFile != -1 /*INVALID_HANDLE_VALUE*/)
  {
    do
    {
      if (! (AkelPad.MemRead(lpFindData, 3 /*DT_DWORD*/) & 16 /*FILE_ATTRIBUTE_DIRECTORY*/))
        aBFile.push(AkelPad.MemRead(_PtrAdd(lpFindData, 44 /*WIN32_FIND_DATAW.cFileName*/), 1 /*DT_UNICODE*/));
    }
    while (oSys.Call("Kernel32::FindNextFileW", hFindFile, lpFindData));

    oSys.Call("Kernel32::FindClose", hFindFile);
  }

  AkelPad.MemFree(lpFindData);

  aBFile.sort(
    function(s1, s2)
    {
      return oSys.Call("Kernel32::lstrcmpiW", s1, s2);
    });
}


Part 3: TextReplace_part3.js
Last edited by KDJ on Tue Jul 26, 2016 7:00 pm, edited 7 times in total.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Показать меню с файлами конкретной сессии.
Show menu with files specific session.

Code: Select all

//  ============================================================================
//  http://akelpad.sourceforge.net/forum/viewtopic.php?p=30939#p30939
//  Version: 2016-09-18
//  Author: Kley
//
//  Description(1033): Show menu with files specific session.
//  Description(1049): Показать меню с файлами конкретной сессии.
//
//  Arguments:
//  -p=1           -Показывать в меню полные пути.
//                    0  -имена файлов (по умолчанию);
//                    1  -пути файлов;
//                    2  -значение из SessionMenu.ini.
//  -s="name"      -Вывод в меню файлов конкретной сессии.
//                  (имя файла сессии, без расширения).
//  -b="NoExist "  -Строка перед именем не существующего файла (по умолчанию "* ").
//  -a="\t*"       -Строка после имени не существующего файла (по умолчанию "").
//  -e=1           -Показать дополнительные пункты меню (по умолчанию 0).
//                    Сумма следующих флагов:
//                      1  "Диалог" (открыть\закрыть диалог Session);
//                      2  "Открыть сессию";
//                      4  "Сохранить сессию";
//                      8  "Закрыть сессию";
//                     16  "Редактировать сессию";
//                     32  "Удалить сессию";
//                     64  "Создать сессию";
//                    128  пункты меню сверху.
//  -es=62         -Показать дополнительные пункты в подменю (по умолчанию 0).
//                    Сумма следующих флагов: смотри параметр -e.
//                 -e и -es игнорируются, если задан параметр -s.
//  -sm=2          -Сортировать пункты меню с файлами из сессии.
//                    0  -сортировать по возрастанию (по умолчанию);
//                    1  -сортировать по убыванию;
//                    2  -порядок сортировки, как в файле сессии.
//
//  -m="%m"        -Вывод меню под кнопкой панели инструментов
//  -i="%i"         (необходимы оба параметра!).
//
//  Usage:
//  Для меню и ToolBar (вывод у курсора)
//   Call("Scripts::Main", 1, "SessionMenu.js")
//  Для ToolBar (вывод у кнопки)
//   Call("Scripts::Main", 1, "SessionMenu.js", `-s="OnExit" -m="%m" -i="%i"`)
//
//  Note:
//  Только для многооконного режима, если не задан параметр -s.
//
//  ============================================================================
//  Include: ShowMenu.js (http://akelpad.sourceforge.net/en/plugins.php#Scripts)
//  ============================================================================
if (!AkelPad.Include("ShowMenu.js"))
  WScript.Quit();

var nShowPath = AkelPad.GetArgValue("p", 0);
var pSessionName = AkelPad.GetArgValue("s", "");
var pBeforeName = AkelPad.GetArgValue("b", "* ");
var pAfterName = AkelPad.GetArgValue("a", "");
var nExtraMenu = AkelPad.GetArgValue("e", 0);
var nExtraSubMenu = AkelPad.GetArgValue("es", 0);
var nSortMenu = AkelPad.GetArgValue("sm", 0);
var hToolbarHandle = AkelPad.GetArgValue("m", 0);
var nToolbarItemID = AkelPad.GetArgValue("i", 0);

var PARAM_DIALOG =   1;
var PARAM_OPEN   =   2;
var PARAM_SAVE   =   4;
var PARAM_CLOSE  =   8;
var PARAM_EDIT   =  16;
var PARAM_DELETE =  32;
var PARAM_NEW    =  64;
var PARAM_TOP    = 128;

//Variables
var oFSO = new ActiveXObject("Scripting.FileSystemObject");
var oSys = AkelPad.SystemFunction();
var pAkelPadDir = AkelPad.GetAkelDir(0 /*ADTYPE_ROOT*/);
var pSessionsDir = GetSessionsDir();
var aSessionsFile = []; //[Path, BaseName]
var aExtraMenu = [];
var aExtraSubMenu = [];
var aFilesMenu;
var aFinalMenu = [];
var nMenuItem = 0;
var ptPoint;
var nPointX = POS_CURSOR;
var nPointY = POS_CURSOR;
var bShowPath = (nShowPath == 2) ? true : false;
var i = 0;

if (AkelPad.IsMDI() == 0 /*WMD_SDI*/)
{
  if (!pSessionName)
    WScript.Quit();
}

if (pSessionsDir)
{
  if (hToolbarHandle && nToolbarItemID)
  {
    ptPoint = GetToolbarBottonPos(parseInt(hToolbarHandle), parseInt(nToolbarItemID));
    nPointX = ptPoint.x;
    nPointY = ptPoint.y;
  }
  pAfterName = pAfterName.replace(/\\t/g, "\t");

  GetLangStrings();

  if (nShowPath == 2)
    ReadIni();

  if (pSessionName)
  {
    aFinalMenu = GetFilesInSession(pSessionsDir + "\\" + pSessionName + ".session");

    if (!aFinalMenu.length)
    {
      if (!oFSO.FileExists(pSessionsDir + "\\" + pSessionName + ".session"))
        aFinalMenu = aFinalMenu.concat([[sEmpty, MF_DISABLED]], GetExtraSubMenu(pSessionName, PARAM_SAVE));
      else
        aFinalMenu = aFinalMenu.concat(
          [[sEmpty, MF_DISABLED]],
          [[sAddCurFile, MF_NORMAL, 9, pSessionsDir + "\\" + pSessionName + ".session"]],
          GetExtraSubMenu(pSessionName, PARAM_SAVE|PARAM_EDIT|PARAM_DELETE));
    }
  }
  else
  {
    aSessionsFile = GetSessionsFile(pSessionsDir)

    if (aSessionsFile.length)
    {
      for (var i = 0; i < aSessionsFile.length; ++i)
      {
        aFilesMenu = GetFilesInSession(aSessionsFile[i][0]);

        if (aFilesMenu.length)
          aExtraSubMenu = GetExtraSubMenu(aSessionsFile[i][1], nExtraSubMenu);
        else
          aExtraSubMenu = [[sEmpty, MF_DISABLED]].concat(
            [[sAddCurFile, MF_NORMAL, 9, aSessionsFile[i][0]]],
            GetExtraSubMenu(aSessionsFile[i][1], PARAM_SAVE|PARAM_EDIT|PARAM_DELETE));

        aFinalMenu = aFinalMenu.concat([[aSessionsFile[i][1], MF_SUBMENU]]);
        aFinalMenu = (nExtraSubMenu & PARAM_TOP) ? aFinalMenu.concat(aExtraSubMenu, aFilesMenu)
                                                 : aFinalMenu.concat(aFilesMenu, aExtraSubMenu);

        if (aFinalMenu.length)
          aFinalMenu[aFinalMenu.length - 1][1] |= MF_LAST;
      }

      aExtraMenu = GetExtraMenu(nExtraMenu);
      aFinalMenu = (nExtraMenu & PARAM_TOP) ? aExtraMenu.concat([["", MF_SEPARATOR]], aFinalMenu)
                                            : aFinalMenu.concat([["", MF_SEPARATOR]], aExtraMenu);
    }
    else
      aFinalMenu = [[sEmpty, MF_DISABLED], ["", MF_SEPARATOR], [sDialog, MF_NORMAL, 6]];
  }

  //Show menu
  if ((nMenuItem = ShowMenu(aFinalMenu, nPointX, nPointY)) != -1)
  {
    switch (aFinalMenu[nMenuItem][2])
    {
      case 1:
      case 2:
      case 3:
      case 4:
        AkelPad.Call("Sessions::Main", aFinalMenu[nMenuItem][2], aFinalMenu[nMenuItem][3]);
        break;
      case 5:
        if (AkelPad.MessageBox(AkelPad.GetMainWnd(), sMsgDelete.replace(/%s/, aFinalMenu[nMenuItem][3]),
              WScript.ScriptName, 292 /*MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2*/)
              == 6 /*IDYES*/)
          AkelPad.Call("Sessions::Main", 5, aFinalMenu[nMenuItem][3]);
        break;
      case 6:
        AkelPad.Call("Sessions::Main"); //open/close dialog
        break;
      case 7:
        RemoveNonExistFiles(aFinalMenu[nMenuItem][3]);
        break;
      case 8:
        nShowPath = !nShowPath;
        WriteIni();
        break;
      case 9:
        AddCurFileToSession(aFinalMenu[nMenuItem][3]);
        break;
      case 10:
        CreateNewSession();
        break;
      default:
        AkelPad.OpenFile(aFinalMenu[nMenuItem][3], 0x002 /*OD_ADT_REGCODEPAGE*/);
    }
  }
}

function GetSessionsFile(pSessionsDir)
{
  var oFolder = oFSO.GetFolder(pSessionsDir);
  var oFiles;
  var aSessions = [];

  for (oFiles = new Enumerator(oFolder.files); !oFiles.atEnd(); oFiles.moveNext())
  {
    if (oFSO.GetExtensionName(oFiles.item().Name).toLowerCase() == "session")
      aSessions.push([oFiles.item().Path, oFSO.GetBaseName(oFiles.item().Name)]);
  }

  if (aSessions)
  {
    //Sort array
    aSessions.sort(function(a, b)
    {
      return oSys.Call("kernel32::lstrcmpi" + _TCHAR, a[1], b[1]);
    });
  }

  return aSessions;
}

function GetFilesInSession(pSessionFile)
{
  var aFilesPath = [];
  var aFilesMenu = [];
  var pSessionText = "";
  var aSessionLines;
  var pPath;
  var pPrefix;
  var pSuffix;
  var bNonExist = false;
  var nIDMenu = 100;
  var i;

  if (oFSO.FileExists(pSessionFile))
  {
    if (pSessionText = AkelPad.ReadFile(pSessionFile))
    {
      pSessionText = pSessionText.replace(/\%a/gi, pAkelPadDir);
      pSessionText = pSessionText.replace(/(\r\n|\r|\n)/g, "\n");

      aSessionLines = pSessionText.split("\n");

      for (i = 0; i < aSessionLines.length; ++i)
      {
        if (aSessionLines[i].length)
        {
          if (aSessionLines[i].indexOf("\\") != -1)
          {
            pPath = aSessionLines[i].replace(/(^[ \t]*)|([ \t]*$)/mg, "");
            aFilesPath.push([pPath, oFSO.GetFileName(pPath)]);
          }
        }
      }

      //Sort array
      if (nSortMenu != 2)
      {
        if (nShowPath == 0)
        {
          aFilesPath.sort(function(a, b)
          {
            if (nSortMenu == 1)
              return oSys.Call("kernel32::lstrcmpiW", b[1], a[1]);
            else
              return oSys.Call("kernel32::lstrcmpiW", a[1], b[1]);
          });
        }
        else
        {
          aFilesPath.sort(function(a, b)
          {
            if (nSortMenu == 1)
              return oSys.Call("kernel32::lstrcmpiW", b[0], a[0]);
            else
              return oSys.Call("kernel32::lstrcmpiW", a[0], b[0]);
          });
        }
      }

      for (i = 0; i < aFilesPath.length; ++i)
      {
        pPrefix = "";
        pSuffix = "";

        if (!oFSO.FileExists(aFilesPath[i][0]))
        {
          pPrefix = pBeforeName;
          pSuffix = pAfterName;
          bNonExist = true;
        }

        pPath = (nShowPath) ? pPrefix + aFilesPath[i][0] + pSuffix
                            : pPrefix + aFilesPath[i][1] + pSuffix;

        aFilesMenu.push([pPath, MF_NORMAL, nIDMenu + i, aFilesPath[i][0]]);
      }

      aFilesMenu = aFilesMenu.concat([["", MF_SEPARATOR]]);

      if (bShowPath)
        aFilesMenu = (nShowPath) ? aFilesMenu.concat([[sShowPath, MF_CHECKED, 8]])
                                 : aFilesMenu.concat([[sShowPath, MF_NORMAL, 8]]);

      if (AkelPad.GetEditFile(0))
        aFilesMenu = aFilesMenu.concat([[sAddCurFile, MF_NORMAL, 9, pSessionFile]]);

      if (bNonExist)
        aFilesMenu = aFilesMenu.concat([[sNonExist, MF_NORMAL, 7, pSessionFile]]);
    }
  }
  return aFilesMenu;
}

function GetExtraSubMenu(pSessionBaseName, nFlags)
{
  var aMenuEdit = [];

  if (nFlags & PARAM_OPEN)
    aMenuEdit = aMenuEdit.concat([[sOpen,   MF_NORMAL, 1, pSessionBaseName]]);
  if (nFlags & PARAM_SAVE)
    aMenuEdit = aMenuEdit.concat([[sSave,   MF_NORMAL, 2, pSessionBaseName]]);
  if (nFlags & PARAM_CLOSE)
    aMenuEdit = aMenuEdit.concat([[sClose,  MF_NORMAL, 3, pSessionBaseName]]);
  if (nFlags & PARAM_EDIT)
    aMenuEdit = aMenuEdit.concat([[sEdit,   MF_NORMAL, 4, pSessionBaseName]]);
  if (nFlags & PARAM_DELETE)
    aMenuEdit = aMenuEdit.concat([[sDelete, MF_NORMAL, 5, pSessionBaseName]]);
  if (nFlags & PARAM_NEW)
    aMenuEdit = aMenuEdit.concat([[sCreate, MF_NORMAL, 10]]);
  if (nFlags & PARAM_DIALOG)
    aMenuEdit = aMenuEdit.concat([[sDialog, MF_NORMAL, 6]]);

  if (aMenuEdit.length)
    aMenuEdit = (nFlags & PARAM_TOP) ? aMenuEdit.concat([["", MF_SEPARATOR]])
                                     : [["", MF_SEPARATOR]].concat(aMenuEdit);
  return aMenuEdit;
}

function GetExtraMenu(nFlags)
{
  var aMenuEdit = [];

  if (nFlags & PARAM_OPEN)
    aMenuEdit = aMenuEdit.concat([[sOpen,   MF_SUBMENU]], GetSessionFiles(1));
  if (nFlags & PARAM_SAVE)
    aMenuEdit = aMenuEdit.concat([[sSave,   MF_SUBMENU]], GetSessionFiles(2));
  if (nFlags & PARAM_CLOSE)
    aMenuEdit = aMenuEdit.concat([[sClose,  MF_SUBMENU]], GetSessionFiles(3));
  if (nFlags & PARAM_EDIT)
    aMenuEdit = aMenuEdit.concat([[sEdit,   MF_SUBMENU]], GetSessionFiles(4));
  if (nFlags & PARAM_DELETE)
    aMenuEdit = aMenuEdit.concat([[sDelete, MF_SUBMENU]], GetSessionFiles(5));
  if (nFlags & PARAM_NEW)
    aMenuEdit = aMenuEdit.concat([[sCreate, MF_NORMAL, 10]]);
  if (nFlags & PARAM_DIALOG)
    aMenuEdit = aMenuEdit.concat([[sDialog, MF_NORMAL, 6]]);

  return aMenuEdit;
}

function GetSessionFiles(vIDMenu)
{
  var aSubMenu = [];

  for (var i = 0; i < aSessionsFile.length; ++i)
    aSubMenu.push([aSessionsFile[i][1], MF_NORMAL, vIDMenu, aSessionsFile[i][1]]);

  if (aSubMenu.length)
    aSubMenu[aSubMenu.length - 1][1] |= MF_LAST;

  return aSubMenu;
}

function AddCurFileToSession(pSessionFile)
{
  var pAkelDir;
  var pEditFile;
  var oSet;
  var bSaveRelative = 0;
  var pText;

  if (oFSO.FileExists(pSessionFile))
  {
    if (pEditFile = AkelPad.GetEditFile(0))
    {
      oSet = AkelPad.ScriptSettings();

      if (oSet.Begin("Sessions", 0x21 /*POB_READ|POB_PLUGS*/))
      {
        bSaveRelative = oSet.Read("SaveRelative", 1 /*PO_DWORD*/, 0);
        oSet.End();
      }

      if (bSaveRelative)
      {
        pAkelDir = pAkelPadDir.replace(/\\/g, "\\\\");
        pEditFile = pEditFile.replace(new RegExp(pAkelDir, "gi"), "%a");
      }

      pText = (AkelPad.ReadFile(pSessionFile) ? "\r\n" : "") +
              pEditFile + '\r\n' +
              '/Name="' + oFSO.GetFileName(pEditFile) + '" ' +
              '/Active=0 ' +
              '/Codepage=0 ' +
              '/Selection=0-0 ' +
              '/FirstVisChar=0 ' +
              '/WordWrap=0 ' +
              '/ReadOnly=0 ' +
              '/Overtype=0 ' +
              '/Bookmarks= ' +
              '/CoderAlias= ' +
              '/Folds= ' +
              '/Marks=\r\n';

      AkelPad.WriteFile(pSessionFile, pText, -1, 1200, true, 0x2 /*WFF_APPENDFILE*/);
    }
  }
}

function RemoveNonExistFiles(pSessionFile)
{
  var pSessionText;
  var aTextArray;
  var pLineText;
  var bNonExist = false;
  var bEmptyLine = false;
  var aNewText = [];

  if (oFSO.FileExists(pSessionFile))
  {
    if (pSessionText = AkelPad.ReadFile(pSessionFile))
    {
      pSessionText = pSessionText.replace(/(\r\n|\r|\n)/g, "\n");
      aTextArray = pSessionText.split("\n");

      for (var i = 0; i < aTextArray.length; ++i)
      {
        pLineText = aTextArray[i].replace(/(^[ \t]*)|([ \t]*$)/mg, "");

        if (pLineText.length > 0)
        {
          if (pLineText.indexOf("\\") != -1)
          {
            if (oFSO.FileExists(pLineText.replace(/\%a/i, pAkelPadDir)))
            {
              aNewText.push(aTextArray[i]);
              bNonExist = false;
              bEmptyLine = false;
            }
            else bNonExist = true;
          }
          else
          {
            if (bNonExist)
            {
              bNonExist = false;
              bEmptyLine = true;
            }
            else aNewText.push(aTextArray[i]);
          }
        }
        else
        {
          if (bEmptyLine) bEmptyLine = false;
          else  aNewText.push(aTextArray[i]);
        }
      }
    }
  }
  AkelPad.WriteFile(pSessionFile, aNewText.join("\r\n"), -1, 1200, true);
}

function CreateNewSession()
{
  var hMainWnd = AkelPad.GetMainWnd();
  var pSessionName = "";

  for (;;)
  {
    pSessionName = AkelPad.InputBox(hMainWnd, sCreate, sMsgNewName, pSessionName);

    if (pSessionName === undefined)
      break;

    if (pSessionName = pSessionName.replace(/[\\\/:\*\?"{}<>\|]/g, "_"))
    {

      if (!oFSO.FileExists(pSessionsDir + "\\" + pSessionName + ".session"))
      {
        AkelPad.Call("Sessions::Main", 2, pSessionName);
        break;
      }
      else
      {
        if (AkelPad.MessageBox(hMainWnd, sMsgExists.replace(/%s/, pSessionName),
              WScript.ScriptName, 292 /*MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2*/)
              == 6 /*MB_YES*/)
        {
          AkelPad.Call("Sessions::Main", 2, pSessionName);
          break;
        }
      }
    }
  }
}

function GetSessionsDir()
{
  var oSet = AkelPad.ScriptSettings();
  var nSaveSessions = 1 /*SDIR_PROGRAM*/;
  var lpBuffer;
  var pSessionsDir = "";

  if (oSet.Begin("Sessions", 0x21 /*POB_READ|POB_PLUGS*/))
  {
    nSaveSessions = oSet.Read("SaveSessions", 1 /*PO_DWORD*/);
    oSet.End();
  }
  if (nSaveSessions == 1 /*SDIR_PROGRAM*/)
    pSessionsDir = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\Sessions";
  else if (nSaveSessions == 2 /*SDIR_APPDATA*/)
  {
    if (lpBuffer = AkelPad.MemAlloc(256 * _TSIZE))
    {
      oSys.Call("shell32::SHGetSpecialFolderPath" + _TCHAR, AkelPad.GetMainWnd(), lpBuffer, 0x1a /*CSIDL_APPDATA*/, 0);
      pSessionsDir = AkelPad.MemRead(lpBuffer, _TSTR) + "\\AkelPad\\Sessions";
      AkelPad.MemFree(lpBuffer);
    }
  }
  return pSessionsDir;
}

function ReadIni()
{
  var oSet = AkelPad.ScriptSettings();

  if (oSet.Begin("", 0x1 /*POB_READ*/))
  {
    nShowPath = oSet.Read("ShowPath", 1 /*PO_DWORD*/, 0);
    oSet.End();
  }
}

function WriteIni()
{
  var oSet = AkelPad.ScriptSettings();

  if (oSet.Begin("", 0x2 /*POB_SAVE*/))
  {
    oSet.Write("ShowPath", 1 /*PO_DWORD*/, nShowPath);
    oSet.End();
  }
}

function GetLangStrings()
{
  if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/)
  {
    sDialog     = "Диалог...";
    sOpen       = "Открыть сессию";
    sSave       = "Сохранить сессию";
    sClose      = "Закрыть сессию";
    sEdit       = "Редактировать сессию";
    sCreate     = "Создать сессию...";
    sDelete     = "Удалить файл сессии...";
    sNonExist   = "Удалить несуществующие";
    sShowPath   = "Показывать путь файлов";
    sAddCurFile = "Добавить текущий файл";
    sEmpty      = "Пусто";
    sMsgNewName = "Новое имя:";
    sMsgExists  = "Сессия \"%s\" уже существует. Перезаписать её?";
    sMsgDelete  = "Вы уверены, что хотите удалить сессию \"%s\"?";
  }
  else
  {
    sDialog     = "Dialog...";
    sOpen       = "Open session";
    sSave       = "Save session";
    sClose      = "Close session";
    sEdit       = "Edit session";
    sCreate     = "Create session...";
    sDelete     = "Delete session file...";
    sNonExist   = "Delete non-existent";
    sShowPath   = "Show files path";
    sAddCurFile = "Add current file";
    sEmpty      = "Empty";
    sMsgNewName = "New name:";
    sMsgExists  = "Session \"%s\" already exists. Overwrite it?";
    sMsgDelete  = "Are you sure you want to delete session \"%s\"?";
  }
}
Last edited by Kley on Sun Sep 18, 2016 8:57 pm, edited 6 times in total.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Hide/Show lines that contains text.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=31498#p31498
// Version: 2016-07-03
// Author: KDJ
//
// *** Hide/Show lines that contains text ***
//
// Usage:
//   Call("Scripts::Main", 1, "LinesHideShow.js", '-hide=1 -text="^\s*$" -flag="r"')
//   Call("Scripts::Main", 1, "LinesHideShow.js", '-hide=2 -text="world" -flag="i"')
//   Call("Scripts::Main", 1, "LinesHideShow.js", '-flag="i"')
//   Call("Scripts::Main", 1, "LinesHideShow.js")
//
// Arguments:
//   -hide (number):
//     0 - show all lines,
//     1 - hide lines that contains text,
//     2 - hide lines that doesn't contain text.
//   -text (string):
//     Text to find. Can be pattern of AkelPad regular expression.
//     If not specified, it will be text selected in edit window.
//   -flag (string)
//     Can be combination of the following:
//       "i" - ignore case,
//       "w" - whole word,
//       "r" - -text is pattern of regular expression,
//       "n" - dot in regular expression specifies any character except new line "\n".
//
// Remarks:
//   Coder::CodeFold function does not work with this script, so do not use this function when any line is hidden.
//   You can not hide the first line in document.
//   Behavior when script is called without -hide and -text arguments:
//     - if no selection in edit window - show all lines,
//     - if selection is from left to right (caret is at end of selection) - hide lines that contains selected text,
//     - if selection is from right to left (caret is at beginning of selection) - hide lines that doesn't contain selected text.
//
// Warning:
//   If you select text that contains hidden lines and delete selection, the hidden lines will also be deleted!

var hMainWnd = AkelPad.GetMainWnd();
var hEditWnd = AkelPad.GetEditWnd();
var hEditWnd = AkelPad.GetEditWnd();
var oSys     = AkelPad.SystemFunction();
var nHide;
var sText;
var sFlag;
var bCodeFold;
var nLastHide;
var nFirstVisLine;
var nLastLine;
var lpCaret;
var lpSelect;
var lpPoint64;
var lpFold;
var lpPoint1;
var lpPoint2;
var lpIndex1;
var lpIndex2;
var aFold;
var nFRF;
var nOffset3;
var nLine1;
var nLine2;
var nLine3;
var nLine4;
var hFoldStack;
var i;

if (! hEditWnd)
  WScript.Quit();

nHide = AkelPad.GetArgValue("hide", 1);
sText = AkelPad.GetArgValue("text", "");
sFlag = AkelPad.GetArgValue("flag", "").toLowerCase();

ReadIni();

if ((! sText) && (! (sText = AkelPad.GetTextRange(AkelPad.GetSelStart(), AkelPad.GetSelEnd(), 1 /*\r*/))))
  nHide = 0;

nFirstVisLine = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 4 /*AEGL_FIRSTVISIBLELINE*/, 0);
nLastLine     = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 11 /*AEGL_LINEUNWRAPCOUNT*/, 0) - 1;


if (nHide == 0)
{
  if (AkelPad.SendMessage(hEditWnd, 3406 /*AEM_GETFOLDCOUNT*/, 0 /*AEFC_ALL*/, 0))
  {
    AkelPad.SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 0, 0);

    if (AkelPad.IsPluginRunning("Coder::CodeFold"))
    {
      bCodeFold = true;
      AkelPad.Call("Coder::CodeFold");
    }

    AkelPad.SendMessage(hEditWnd, 3408 /*AEM_DELETEFOLD*/, 0 /*all*/, 0);
    AkelPad.SendMessage(hEditWnd, 3418 /*AEM_SETFOLDHIDEOFFSET*/, MakeLong(1, -1), 0);

    if (bCodeFold)
      AkelPad.Call("Coder::CodeFold");

    AkelPad.SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 1, 0);
    AkelPad.SendMessage(hEditWnd, 3416 /*AEM_UPDATEFOLD*/, 0, nFirstVisLine);
    oSys.Call("User32::InvalidateRect", hEditWnd, 0, 1);
  }
}
else if (nLastLine > 1)
{
  nFRF  = 0x00000001 /*FRF_DOWN*/;
  if (sFlag.indexOf("i") == -1)
    nFRF |= 0x00000004 /*FRF_MATCHCASE*/;
  if (sFlag.indexOf("w") > -1)
    nFRF |= 0x00000002 /*FRF_WHOLEWORD*/;
  if (sFlag.indexOf("n") > -1)
    nFRF |= 0x00040000 /*FRF_REGEXPNONEWLINEDOT*/;
  if (sFlag.indexOf("r") > -1)
  {
    nFRF |= 0x00080000 /*FRF_REGEXP*/;
    nOffset3 = AkelPad.TextFind(0, sText, nFRF | 0x80000000 /*FRF_TEST*/);

    if (nOffset3 <= -100)
    {
      AkelPad.MessageBox(hMainWnd, "Syntax error in regular expression!", WScript.ScriptName, 0x10 /*MB_ICONERROR*/);
      WScript.Quit();
    }
  }

  lpCaret   = AkelPad.MemAlloc(_X64 ? 24 : 12); //AECHARINDEX
  lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32); //AESELECTION
  lpPoint64 = AkelPad.MemAlloc(_X64 ? 16 :  8); //POINT64
  lpFold    = AkelPad.MemAlloc(_X64 ? 96 : 60); //AEFOLD
  lpPoint1  = AkelPad.MemAlloc(_X64 ? 80 : 44); //AEPOINT
  lpPoint2  = AkelPad.MemAlloc(_X64 ? 80 : 44); //AEPOINT
  lpIndex1  = _PtrAdd(lpPoint1, _X64 ? 16 : 8); //ciPoint
  lpIndex2  = _PtrAdd(lpPoint2, _X64 ? 16 : 8); //ciPoint

  AkelPad.MemCopy(_PtrAdd(lpPoint1, _X64 ? 40 : 20), -2 /*AEPTO_CALC*/, 2 /*DT_QWORD*/); //nPointOffset
  AkelPad.MemCopy(_PtrAdd(lpPoint2, _X64 ? 40 : 20), -2 /*AEPTO_CALC*/, 2 /*DT_QWORD*/); //nPointOffset

  AkelPad.MemCopy(_PtrAdd(lpFold, _X64 ? 40 : 20), lpPoint1, 2 /*DT_QWORD*/); //*lpMinPoint
  AkelPad.MemCopy(_PtrAdd(lpFold, _X64 ? 48 : 24), lpPoint2, 2 /*DT_QWORD*/); //*lpMaxPoint
  AkelPad.MemCopy(_PtrAdd(lpFold, _X64 ? 64 : 36),       -1, 3 /*DT_DWORD*/); //crText
  AkelPad.MemCopy(_PtrAdd(lpFold, _X64 ? 68 : 40),       -1, 3 /*DT_DWORD*/); //crBk

  if (AkelPad.IsPluginRunning("Coder::CodeFold"))
  {
    bCodeFold = true;
    AkelPad.Call("Coder::CodeFold");
  }
  else
  {
    if (nLastHide == 0)
      bCodeFold = false;
  }

  if (AkelPad.SendMessage(hEditWnd, 3406 /*AEM_GETFOLDCOUNT*/, 0 /*AEFC_ALL*/, 0))
  {
    AkelPad.SendMessage(hEditWnd, 3408 /*AEM_DELETEFOLD*/, 0 /*all*/, 0);
    AkelPad.SendMessage(hEditWnd, 3416 /*AEM_UPDATEFOLD*/, 0, nFirstVisLine);
  }

  AkelPad.SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, lpCaret, lpSelect);
  AkelPad.SendMessage(hEditWnd, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);
  AkelPad.SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 0, 0);
  AkelPad.SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 0, 0);
  AkelPad.SetSel(0, 0);

  //reverse selection
  if ((! (/-hide=/i).test(AkelPad.GetArgLine())) && (! (/-text=/i).test(AkelPad.GetArgLine())) && (AkelPad.SendMessage(hEditWnd, 3133 /*AEM_INDEXCOMPARE*/, lpCaret, lpSelect) == 0))
    nHide = 2;

  aFold = [];

  if (nHide == 1)
  {
    nOffset3 = AkelPad.TextFind(0, sText, nFRF);

    while (nOffset3 > -1)
    {
      nLine1 = -1;

      do
      {
        nLine3 = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 21 /*AEGI_UNWRAPLINEFROMRICHOFFSET*/, nOffset3);
        nLine4 = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 21 /*AEGI_UNWRAPLINEFROMRICHOFFSET*/, -1 /*caret offset*/);

        if (nLine1 == -1)
        {
          nLine1 = nLine3;
          nLine2 = nLine4;
        }
        else if (nLine3 - nLine2 < 2)
          nLine2 = nLine4;
        else
          break;
      }
      while ((nOffset3 = AkelPad.TextFind(0, sText, nFRF)) > -1);

      if ((nLine1 != 0) || (nLine2 != 0))
      {
        if (nLine1 > 0)
          --nLine1;

        AddFold();
      }
    }
  }
  else
  {
    nOffset3 = 0;
    nLine1   = 0;
    nLine2   = nLastLine;

    while (nOffset3 > -1)
    {
      while ((nOffset3 = AkelPad.TextFind(0, sText, nFRF)) > -1)
      {
        nLine3 = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 21 /*AEGI_UNWRAPLINEFROMRICHOFFSET*/, nOffset3);
        nLine4 = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 21 /*AEGI_UNWRAPLINEFROMRICHOFFSET*/, -1 /*caret offset*/);

        if (nLine3 - nLine1 < 2)
          nLine1 = nLine4;
        else
        {
          nLine2 = nLine3 - 1;
          break;
        }
      }

      AddFold();

      nLine1 = nLine2 + 1;
      nLine2 = nLastLine;
    }
  }

  AkelPad.SendMessage(hEditWnd, 3126 /*AEM_SETSEL*/, lpCaret, lpSelect);
  AkelPad.SendMessage(hEditWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);

  if (aFold.length)
  {
    for (i = 0; i < aFold.length; ++i)
    {
      AkelPad.MemCopy(_PtrAdd(aFold[i], _X64 ?  0 :  0), (i == aFold.length - 1) ? 0 : aFold[i + 1], 2 /*DT_QWORD*/); //*next
      AkelPad.MemCopy(_PtrAdd(aFold[i], _X64 ?  8 :  4), (i == 0) ? 0 : aFold[i - 1], 2 /*DT_QWORD*/); //*prev
      AkelPad.MemCopy(_PtrAdd(aFold[i], _X64 ? 16 :  8), 0, 2 /*DT_QWORD*/); //*parent
      AkelPad.MemCopy(_PtrAdd(aFold[i], _X64 ? 24 : 12), 0, 2 /*DT_QWORD*/); //*firstChild
      AkelPad.MemCopy(_PtrAdd(aFold[i], _X64 ? 32 : 16), 0, 2 /*DT_QWORD*/); //*lastChild
    }

    hFoldStack = AkelPad.SendMessage(hEditWnd, 3405 /*AEM_GETFOLDSTACK*/, 0, 0);
    AkelPad.MemCopy(hFoldStack, aFold[0], 2 /*DT_QWORD*/); //first
    AkelPad.MemCopy(_PtrAdd(hFoldStack, _X64 ?  8 :  4), aFold[aFold.length - 1], 2 /*DT_QWORD*/); //last

    AkelPad.SendMessage(hEditWnd, 3418 /*AEM_SETFOLDHIDEOFFSET*/, MakeLong(1, 0), 0);
    AkelPad.SendMessage(hEditWnd, 3415 /*AEM_COLLAPSEFOLD*/, 0 /*all*/, 0x9 /*AECF_NOCARETCORRECT|AECF_COLLAPSE*/);
  }
  else if (bCodeFold && (! AkelPad.IsPluginRunning("Coder::CodeFold")))
    AkelPad.Call("Coder::CodeFold");

  AkelPad.SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 1, 0);
  AkelPad.SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 1, 0);
  AkelPad.SendMessage(hEditWnd, 3416 /*AEM_UPDATEFOLD*/, 0, nFirstVisLine);
  oSys.Call("User32::InvalidateRect", hMainWnd, 0, 1);
  oSys.Call("User32::InvalidateRect", hEditWnd, 0, 1);

  AkelPad.MemFree(lpCaret);
  AkelPad.MemFree(lpSelect);
  AkelPad.MemFree(lpPoint64);
  AkelPad.MemFree(lpFold);
  AkelPad.MemFree(lpPoint1);
  AkelPad.MemFree(lpPoint2);
}

WriteIni();

function MakeLong(nLoWord, nHiWord)
{
  return (nLoWord & 0xFFFF) | (nHiWord << 16);
}

function AddFold()
{
  AkelPad.SendMessage(hEditWnd, 3142 /*AEM_GETWRAPLINE*/, nLine1, lpIndex1);
  AkelPad.SendMessage(hEditWnd, 3142 /*AEM_GETWRAPLINE*/, nLine2, lpIndex2);

  aFold.push(AkelPad.SendMessage(hEditWnd, 3407 /*AEM_ADDFOLD*/, 0, lpFold));
}

function ReadIni()
{
  try
  {
    eval(AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1));
  }
  catch (oError)
  {}

  if ((typeof bCodeFold != "boolean") && (typeof bCodeFold != "number"))
    bCodeFold = false;
  if (typeof nLastHide != "number")
    nLastHide = 0;
}

function WriteIni()
{
  var sText =
       'bCodeFold=' + bCodeFold + ';\r\n' +
       'nLastHide=' + nHide + ';\r\n';

  AkelPad.WriteFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), sText, sText.length, 1200 /*UTF-16LE*/, 1, 1);
}


KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Replace text in edit window.

Part 1: TextReplace.js
Part 2: TextReplace_part2.js
Part 3:

Code: Select all

function GetAkelHelpFile()
{
  var sDir  = AkelPad.GetAkelDir(2 /*ADTYPE_DOCS*/) + "\\";
  var sFile = "";

  if (AkelPad.GetLangId() == 1049 /*Russian*/)
  {
    if (oFSO.FileExists(sDir + "AkelHelp-Rus.htm"))
      sFile = "AkelHelp-Rus.htm";
    else if (oFSO.FileExists(sDir + "AkelHelp-Eng.htm"))
      sFile = "AkelHelp-Eng.htm";
  }
  else
  {
    if (oFSO.FileExists(sDir + "AkelHelp-Eng.htm"))
      sFile = "AkelHelp-Eng.htm";
    else if (oFSO.FileExists(sDir + "AkelHelp-Rus.htm"))
      sFile = "AkelHelp-Rus.htm";
  }

  return sFile;
}

function AkelHelp(sFile)
{
  if (sFile)
  {
    sFile = AkelPad.GetAkelDir(2 /*ADTYPE_DOCS*/) + "\\" + sFile;

    if (oFSO.FileExists(AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/) + "\\HtmlView.js"))
      AkelPad.Call("Scripts::Main", 1, "HtmlView.js", sFile + "#ch7");
  }
}

function MenuFind()
{
  var MF_STRING    = 0x0000;
  var MF_GRAYED    = 0x0001;
  var MF_CHECKED   = 0x0008;
  var MF_POPUP     = 0x0010;
  var MF_SEPARATOR = 0x0800;
  var lpRECT = AkelPad.MemAlloc(16);
  var hMenu1 = oSys.Call("User32::CreatePopupMenu");
  var hMenu2 = oSys.Call("User32::CreatePopupMenu");
  var hMenu3 = oSys.Call("User32::CreatePopupMenu");
  var hMenu  = oSys.Call("User32::CreatePopupMenu");
  var nX, nY;
  var nCmd;

  oSys.Call("User32::SetFocus", GetDlgItem(hDlg, IDFINDB));
  SetDefPushButton(IDFINDB);

  oSys.Call("User32::GetWindowRect", GetDlgItem(hDlg, IDFINDB), lpRECT);
  nX = AkelPad.MemRead(_PtrAdd(lpRECT, 8), 3 /*DT_DWORD*/);
  nY = AkelPad.MemRead(_PtrAdd(lpRECT, 4), 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpRECT);

  oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, 11, sTxtNext  + "\tF7");
  oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, 12, sTxtPrev  + "\tShift+F7");
  oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, 13, sTxtLast  + "\tCtrl+F7");
  oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, 14, sTxtFirst + "\tCtrl+Shift+F7");

  oSys.Call("User32::AppendMenuW", hMenu2, MF_STRING, 21, "&1 - " + sTxtBegToCaret + "\tCtrl+1");
  oSys.Call("User32::AppendMenuW", hMenu2, MF_STRING, 22, "&2 - " + sTxtCaretToEnd + "\tCtrl+2");
  oSys.Call("User32::AppendMenuW", hMenu2, MF_STRING, 23, "&3 - " + sTxtSelection  + "\tCtrl+3");
  oSys.Call("User32::AppendMenuW", hMenu2, IsLineBoard() ? MF_STRING : MF_GRAYED, 24, "&4 - " + sTxtBookmarks + "\tCtrl+4");
  oSys.Call("User32::AppendMenuW", hMenu2, MF_STRING, 25, "&5 - " + sTxtEntireDoc  + "\tCtrl+5");
  oSys.Call("User32::AppendMenuW", hMenu2, MF_STRING, 26, "&6 - " + sTxtAllDocs    + "\tCtrl+6");

  oSys.Call("User32::AppendMenuW", hMenu3, (nFindDef == 1) ? MF_CHECKED : MF_STRING, 101, sTxtNext);
  oSys.Call("User32::AppendMenuW", hMenu3, (nFindDef == 2) ? MF_CHECKED : MF_STRING, 102, sTxtPrev);
  oSys.Call("User32::AppendMenuW", hMenu3, (nFindDef == 3) ? MF_CHECKED : MF_STRING, 103, sTxtLast);
  oSys.Call("User32::AppendMenuW", hMenu3, (nFindDef == 4) ? MF_CHECKED : MF_STRING, 104, sTxtFirst);
  oSys.Call("User32::AppendMenuW", hMenu3, MF_SEPARATOR);
  oSys.Call("User32::AppendMenuW", hMenu3, (nFindDef == 0) ? MF_CHECKED : MF_STRING, 100, sTxtNone);

  oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, 1, sTxtNext  + "\tF3");
  oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, 2, sTxtPrev  + "\tShift+F3");
  oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, 3, sTxtLast  + "\tCtrl+F3");
  oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, 4, sTxtFirst + "\tCtrl+Shift+F3");
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
  oSys.Call("User32::AppendMenuW", hMenu, IsLineBoard() ? MF_POPUP : MF_GRAYED, hMenu1, sTxtFindInBooks);
  oSys.Call("User32::AppendMenuW", hMenu, IsLineBoard() ? MF_STRING : MF_GRAYED, 15, sTxtBookmarkLines + "\tShift+Alt+Ins");
  oSys.Call("User32::AppendMenuW", hMenu, IsLineBoard() ? MF_STRING : MF_GRAYED, 16, sTxtUnmarkLines + "\tShift+Alt+Del");
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu2, sTxtCountInRange);
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu3, sTxtFindDefault);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x1A8 /*TPM_RETURNCMD|TPM_NONOTIFY|TPM_BOTTOMALIGN|TPM_RIGHTALIGN*/, nX, nY, 0, hDlg, 0);
  oSys.Call("User32::DestroyMenu", hMenu1);
  oSys.Call("User32::DestroyMenu", hMenu2);
  oSys.Call("User32::DestroyMenu", hMenu3);
  oSys.Call("User32::DestroyMenu", hMenu);

  if (nCmd > 0)
  {
    if (nCmd < 15)
      Find(nCmd);
    else if (nCmd == 15)
      BookmarkLines(true);
    else if (nCmd == 16)
      BookmarkLines(false);
    else if (nCmd < 29)
      CountInRange(nCmd - 20);
    else if (nCmd > 99)
    {
      nFindDef = nCmd - 100;
      SendDlgItemMessage(hDlg, IDFINDB, 12 /*WM_SETTEXT*/, 0, sTxtFind + (nFindDef ? "" : " >"));
    }
  }
}

function ReadIni()
{
  try
  {
    eval(AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), 0x10 /*ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1));
  }
  catch (oError)
  {}
 
  if ((typeof nWhatH != "number") || (nWhatH < nEditMinH)) nWhatH = nEditMinH;
  nDlgMinH += nWhatH - nEditMinH;
  if (typeof nDlgX != "number") nDlgX = 200;
  if (typeof nDlgY != "number") nDlgY = 200;
  if ((typeof nDlgW != "number") || (nDlgW < nDlgMinW)) nDlgW = nDlgMinW;
  if ((typeof nDlgH != "number") || (nDlgH < nDlgMinH)) nDlgH = nDlgMinH;
  if (typeof bTranspNA != "boolean") bTranspNA = false;
  if ((typeof nOpacity != "number") || (nOpacity < 15) || (nOpacity > 255)) nOpacity = 255;
  if (typeof bMatch != "boolean") bMatch = false;
  if (typeof bWord != "boolean") bWord = false;
  if (typeof bRegExp != "boolean") bRegExp = false;
  if (typeof bDotNL != "boolean") bDotNL = true;
  if (typeof bFunc != "boolean") bFunc = false;
  if (typeof bBatch != "boolean") bBatch = false;
  if (typeof bLockUndo != "boolean") bLockUndo = false;
  if ((typeof nRange != "number") || (nRange < 0) || (nRange > 5)) nRange = 3;
  if (typeof bFont1 != "boolean") bFont1 = false;
  if (typeof bFont2 != "boolean") bFont2 = false;
  if (typeof bWrap1 != "boolean") bWrap1 = false;
  if (typeof bWrap2 != "boolean") bWrap2 = false;
  if (typeof sWhat != "string") sWhat = "";
  if (typeof sWith != "string") sWith = "";
  if ((typeof sBFile != "string") || (! oFSO.FileExists(AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/) + "\\" + sBFile))) sBFile = "";
  if ((typeof nFindDef != "number") || (nFindDef < 1) || (nFindDef > 4)) nFindDef = 0;
  if (typeof nHistLen != "number") nHistLen = 10;
  if (nHistLen < 0)
    nHistLen = 0;
  else if (nHistLen > 99)
    nHistLen = 99;
  if (! (aHist instanceof Array)) aHist = [];
}

function WriteIni()
{
  var lpRECT = AkelPad.MemAlloc(16);
  var sText;
  var i;

  oSys.Call("User32::GetWindowRect", hDlg, lpRECT);
  oSys.Call("User32::ScreenToClient", hMainWnd, lpRECT);
  nDlgX = AkelPad.MemRead(_PtrAdd(lpRECT,  0), 3 /*DT_DWORD*/);
  nDlgY = AkelPad.MemRead(_PtrAdd(lpRECT,  4), 3 /*DT_DWORD*/);
  oSys.Call("User32::GetClientRect", hDlg, lpRECT);
  nDlgW = AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/);
  nDlgH = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpRECT);

  sText =
    'nDlgX='     + ScaleUX(nDlgX) + ';\r\n' +
    'nDlgY='     + ScaleUY(nDlgY) + ';\r\n' +
    'nDlgW='     + ScaleUX(nDlgW) + ';\r\n' +
    'nDlgH='     + ScaleUY(nDlgH) + ';\r\n' +
    'nWhatH='    + ScaleUY(nWhatH) + ';\r\n' +
    'bTranspNA=' + bTranspNA + ';\r\n' +
    'nOpacity='  + nOpacity + ';\r\n' +
    'bMatch='    + bMatch + ';\r\n' +
    'bWord='     + bWord + ';\r\n' +
    'bRegExp='   + bRegExp + ';\r\n' +
    'bDotNL='    + bDotNL + ';\r\n' +
    'bFunc='     + bFunc + ';\r\n' +
    'bBatch='    + bBatch + ';\r\n' +
    'bLockUndo=' + bLockUndo + ';\r\n' +
    'nRange='    + nRange + ';\r\n' +
    'bFont1='    + bFont1 + ';\r\n' +
    'bFont2='    + bFont2 + ';\r\n' +
    'bWrap1='    + bWrap1 + ';\r\n' +
    'bWrap2='    + bWrap2 + ';\r\n' +
    'sWhat="'    + EscapeStr(sWhat) + '";\r\n' +
    'sWith="'    + EscapeStr(sWith) + '";\r\n' +
    'sBFile="'   + EscapeStr(sBFile) + '";\r\n' +
    'nFindDef='  + nFindDef + ';\r\n' +
    'nHistLen='  + nHistLen + ';\r\n' +
    'aHist=[';

  for (i = 0; i < aHist.length; ++i)
    sText += '["' + EscapeStr(aHist[i][0]) + '","' + EscapeStr(aHist[i][1]) + '","' + aHist[i][2] + '"]' + ((i == aHist.length - 1) ? '' : ',');

  sText += '];\r\n';

  AkelPad.WriteFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), sText, sText.length, 1200 /*UTF-16LE*/, 1, 0x1 /*WFF_WRITEREADONLY*/);
}

function EscapeStr(sStr)
{
  return sStr.replace(/[\\"]/g, '\\$&').replace(/\0/g, '\\0').replace(/\t/g, '\\t').replace(/\n/g, '\\n');
}

function UnEscapeStr(sStr)
{
  return sStr.replace(/(\\+)(.?)/g,
           function(s0, s1, s2)
           {
             if (s1.length % 2)
             {
               if (s2 == "0") s2 = "\0";
               else if (s2 == "t") s2 = "\t";
               else if (s2 == "n") s2 = "\n";
               return s1.substr(0, (s1.length - 1) / 2) + s2;
             }
             return s1.substr(0, s1.length / 2) + s2;
           });
}

function GetLangStrings()
{
  if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1045) //Polish
  {
    sTxtDlgTitle      = 'Zamień Tekst';
    sTxtWhat          = '&Co:';
    sTxtBatch         = 'Pakiet:';
    sTxtWith          = 'Czy&m:';
    sTxtMatchCase     = 'Uwzględnij wielkość &liter';
    sTxtWholeWord     = 'Całe &wyrazy';
    sTxtRegExp        = 'Wyrażenia &regularne';
    sTxtDotMatchesNL  = '&. dopasowuje \\n';
    sTxtWithFunc      = 'Zamień przez &funkcję';
    sTxtBatchRepl     = 'Zamień &pakietowo';
    sTxtLockUndo      = 'Wyłącz "Cofnij"';
    sTxtRange         = 'Zakres do zamiany';
    sTxtBegToCaret    = 'Początek - Kursor';
    sTxtCaretToEnd    = 'Kursor - Koniec';
    sTxtSelection     = 'Zaznaczenie';
    sTxtBookmarks     = 'Zakładki';
    sTxtEntireDoc     = 'Cały dokument';
    sTxtAllDocs       = 'Wszystkie dokum.';
    sTxtTransparentNA = 'Przezroczystość - gdy nieaktywne';
    sTxtReplace1      = '&Zamień jedno';
    sTxtReplaceAll    = 'Z&amień wszystko';
    sTxtHistory       = '&Historia';
    sTxtTemplates     = '&Szablony';
    sTxtFind          = 'Z&najdź';
    sTxtClose         = 'Zamknij';
    sTxtMenu          = '&Menu';
    sTxtOK            = 'OK';
    sTxtCancel        = 'Anuluj';
    sTxtBatchFile     = 'Plik pakietu';
    sTxtNoBatchFiles  = '<brak plików pakietów>';
    sTxtUndo          = '&Cofnij';
    sTxtRedo          = '&Powtórz';
    sTxtCut           = '&Wytnij';
    sTxtCopy          = '&Kopiuj';
    sTxtPaste         = 'Wkl&ej';
    sTxtDelete        = '&Usuń';
    sTxtSelAll        = 'Zaznacz w&szystko';
    sTxtAPFont        = 'Czcionka AkelPad';
    sTxtWrap          = 'Zawijaj wiersze';
    sTxtRemove        = 'Usuń';
    sTxtClear         = 'Wyczyść';
    sTxtHistLen       = 'Długość historii';
    sTxtAdd           = 'Dodaj';
    sTxtRename        = 'Zmień nazwę';
    sTxtMoveUp        = 'W górę';
    sTxtMoveDown      = 'W dół';
    sTxtSort          = 'Sortuj';
    sTxtName          = 'Nazwa:';
    sTxtNext          = 'Następny';
    sTxtPrev          = 'Poprzedni';
    sTxtLast          = 'Ostatni';
    sTxtFirst         = 'Pierwszy';
    sTxtNone          = 'Brak';
    sTxtFindInBooks   = 'Znajdź w zakładkach';
    sTxtBookmarkLines = 'Oznacz wiersze zakładkami';
    sTxtUnmarkLines   = 'Usuń zakładki z wierszy';
    sTxtCountInRange  = 'Policz w zakresie';
    sTxtFindDefault   = 'Domyślne działanie "Znajdź"';
    sTxtFileNotExist  = 'Plik nie istnieje!';
    sTxtFileNoData    = 'Plik nie zawiera poprawnych danych!';
    sTxtAreYouSure    = 'Czy jesteś pewien ?';
    sTxtNotFound      = 'Nie znaleziono!';
    sTxtChangedDocs   = 'Zmienione dokumenty: ';
    sTxtCountChanges  = 'Łączna liczba zamian: ';
    sTxtRegExpErr     = 'Błąd składni w wyrażeniu regularnym!';
    sTxtNoFuncErr     = 'Nie można utworzyć funkcji Zamiany!';
    sTxtNoTextErr     = 'Funkcja Zamiany nie zwraca tekstu!';
    sTxtRunTimeErr    = 'Błąd w czasie wykonywania funkcji Zamiany:';
    sTxtBatchErr      = 'Błąd w pliku pakietu, wiersz: ';
    sTxtSaveDocs      = 'Wszystkie dokumenty podlegające zamianie powinny być zapisane!';
    sTxtNameExists    = 'Nazwa już istnieje!';
    sTxtTemplExists   = 'Szablon już istnieje!';
  }
  else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049) //Russian
  {
    //translated by YuS
    sTxtDlgTitle      = 'Замена текста';
    sTxtWhat          = 'Ч&то:';
    sTxtBatch         = 'Пакет:';
    sTxtWith          = 'Ч&ем:';
    sTxtMatchCase     = 'Учитывать &регистр';
    sTxtWholeWord     = 'Слово &целиком';
    sTxtRegExp        = 'Регулярные в&ыражения';
    sTxtDotMatchesNL  = '&. захватывает \\n';
    sTxtWithFunc      = 'Заменять на &функцию';
    sTxtBatchRepl     = '&Пакетная замена';
    sTxtLockUndo      = 'Выкл. "Отменить"';
    sTxtRange         = 'Диапазон для замены';
    sTxtBegToCaret    = 'До курсора';
    sTxtCaretToEnd    = 'От курсора';
    sTxtSelection     = 'В выделении';
    sTxtBookmarks     = 'Закладки';
    sTxtEntireDoc     = 'Весь файл';
    sTxtAllDocs       = 'Все файлы';
    sTxtTransparentNA = 'Прозрачный неактивный диалог';
    sTxtReplace1      = '&Заменить';
    sTxtReplaceAll    = 'Заменить &всё';
    sTxtHistory       = '&История';
    sTxtTemplates     = '&Шаблоны';
    sTxtFind          = '&Найти';
    sTxtClose         = 'Закрыть';
    sTxtMenu          = '&Меню';
    sTxtOK            = 'OK';
    sTxtCancel        = 'Отмена';
    sTxtBatchFile     = 'Пакетный файл';
    sTxtNoBatchFiles  = '<нет пакетных файлов>';
    sTxtUndo          = 'От&менить';
    sTxtRedo          = '&Повторить';
    sTxtCut           = '&Вырезать';
    sTxtCopy          = '&Копировать';
    sTxtPaste         = 'В&ставить';
    sTxtDelete        = '&Удалить';
    sTxtSelAll        = 'Вы&делить всё';
    sTxtAPFont        = 'Шрифт AkelPad';
    sTxtWrap          = 'Перенос строк';
    sTxtRemove        = 'Удалить';
    sTxtClear         = 'Удалить всё';
    sTxtHistLen       = 'Количество строк';
    sTxtAdd           = 'Добавить';
    sTxtRename        = 'Переименовать';
    sTxtMoveUp        = 'Вверх';
    sTxtMoveDown      = 'Вниз';
    sTxtSort          = 'Сортировать';
    sTxtName          = 'Имя:';
    sTxtNext          = 'Следующее';
    sTxtPrev          = 'Предыдущее';
    sTxtLast          = 'Последнее';
    sTxtFirst         = 'Первое';
    sTxtNone          = 'Нет';
    sTxtFindInBooks   = 'Найти в закладках';
    sTxtBookmarkLines = 'Пометить строки';
    sTxtUnmarkLines   = 'Снять пометки строк';
    sTxtCountInRange  = 'Посчитать в диапазоне';
    sTxtFindDefault   = 'По умолчанию: "Найти ..."';
    sTxtFileNotExist  = 'Файл не существует!';
    sTxtFileNoData    = 'Файл не содержит правильных данных!';
    sTxtAreYouSure    = 'Вы уверены?'; 
    sTxtNotFound      = 'Не найдено!';
    sTxtChangedDocs   = 'Изменённые документы: ';
    sTxtCountChanges  = 'Количество замен: ';
    sTxtRegExpErr     = 'Синтаксическая ошибка в регулярном выражении!';
    sTxtNoFuncErr     = 'Невозможно создать функцию замены!';
    sTxtNoTextErr     = 'Функция замены текст не вернула!';
    sTxtRunTimeErr    = 'Ошибка выполнения функции замены:';
    sTxtBatchErr      = 'Ошибка в пакетном файле, строка: ';
    sTxtSaveDocs      = 'Все документы, подлежащие замене, необходимо сохранить!';
    sTxtNameExists    = 'Имя уже существует!';
    sTxtTemplExists   = 'Шаблон уже существует!';
  }
  else
  {
    sTxtDlgTitle      = 'Text Replace';
    sTxtWhat          = '&What:';
    sTxtBatch         = 'Batch:';
    sTxtWith          = 'W&ith:';
    sTxtMatchCase     = 'Match &case';
    sTxtWholeWord     = '&Whole word';
    sTxtRegExp        = 'Regular e&xpressions';
    sTxtDotMatchesNL  = '&. matches \\n';
    sTxtWithFunc      = 'Replace with f&unction';
    sTxtBatchRepl     = '&Batch replace';
    sTxtLockUndo      = 'Disable "Undo"';
    sTxtRange         = 'Range for Replace';
    sTxtBegToCaret    = 'Beginning - Caret';
    sTxtCaretToEnd    = 'Caret - End';
    sTxtSelection     = 'Selection';
    sTxtBookmarks     = 'Bookmarks';
    sTxtEntireDoc     = 'Entire document';
    sTxtAllDocs       = 'All documents';
    sTxtTransparentNA = 'Transparency - only when inactive';
    sTxtReplace1      = '&Replace single';
    sTxtReplaceAll    = 'Replace &all';
    sTxtHistory       = '&History';
    sTxtTemplates     = '&Templates';
    sTxtFind          = '&Find';
    sTxtClose         = 'Close';
    sTxtMenu          = '&Menu';
    sTxtOK            = 'OK';
    sTxtCancel        = 'Cancel';
    sTxtBatchFile     = 'Batch file';
    sTxtNoBatchFiles  = '<no batch files>';
    sTxtUndo          = '&Undo';
    sTxtRedo          = '&Redo';
    sTxtCut           = 'C&ut';
    sTxtCopy          = '&Copy';
    sTxtPaste         = '&Paste';
    sTxtDelete        = '&Delete';
    sTxtSelAll        = 'Select &all';
    sTxtAPFont        = 'AkelPad font';
    sTxtWrap          = 'Wrap lines';
    sTxtRemove        = 'Remove';
    sTxtClear         = 'Clear';
    sTxtHistLen       = 'History length';
    sTxtAdd           = 'Add';
    sTxtRename        = 'Rename';
    sTxtMoveUp        = 'Move up';
    sTxtMoveDown      = 'Move down';
    sTxtSort          = 'Sort';
    sTxtName          = 'Name:';
    sTxtNext          = 'Next';
    sTxtPrev          = 'Previous';
    sTxtLast          = 'Last';
    sTxtFirst         = 'First';
    sTxtNone          = 'None';
    sTxtFindInBooks   = 'Find in bookmarks';
    sTxtBookmarkLines = 'Bookmark lines';
    sTxtUnmarkLines   = 'Unmark lines';
    sTxtCountInRange  = 'Count in range';
    sTxtFindDefault   = '"Find" - default action';
    sTxtFileNotExist  = 'File does not exist!';
    sTxtFileNoData    = 'File does not contain valid data!';
    sTxtAreYouSure    = 'Are you sure ?';
    sTxtNotFound      = 'Not found!';
    sTxtChangedDocs   = 'Changed documents: ';
    sTxtCountChanges  = 'Count of changes: ';
    sTxtRegExpErr     = 'Syntax error in regular expression!';
    sTxtNoFuncErr     = 'Can not create Replace function!';
    sTxtNoTextErr     = 'Replace function does not return a text!';
    sTxtRunTimeErr    = 'Run time error Replace function:';
    sTxtBatchErr      = 'Error in batch file, line: ';
    sTxtSaveDocs      = 'All documents that are subject to the replacement should be saved!';
    sTxtNameExists    = 'Name already exists!';
    sTxtTemplExists   = 'Template already exists!';
  }
}


Offline
Posts: 24
Joined: Sat Jul 30, 2016 9:39 am

Post by Sticher78 »

Activate window of FileZilla, when saving file on FTP:

Code: Select all

//http://akelpad.sourceforge.net/forum/viewtopic.php?p=31982#p31982
// Version: 2016-04-11
// Author: Sticher78

// Активирует окно FileZilla, при сохранении файла на FTP.
// Если файл не сохранен никуда - открывается просто окно сохранения файла.
// Если файл сохранён, но не с FTP - просто активируется окно FileZilla.


AkelPad.Command(4105); 

var WshShell;
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.AppActivate ("FileZilla");

Offline
Posts: 53
Joined: Wed Dec 09, 2015 6:33 pm

Quoted printable decode/encode

Post by beotiger »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=32125#p32125
// Version: 1.0.1 (2016-12-02)
// Author: Mathias Bynens - original version, Andrey Tzar - adaptation for AkelPad editor
// Origin: https://github.com/mathiasbynens/quoted-printable
// License: MIT https://mths.be/mit

// Description(1033): Decode/encode quoted-printable strings (selected in AkelPad editor)
// Description(1049): Декодировать/кодировать quoted-printable выбранные в редакторе строки 

/*
	Argument:
		First argument:	'decode' or 'encode' - do decode or encode operation on selected string
		Default is: `decode`

	Example:
		Call("Scripts::Main", 1, "quoted-printable.js", `encode`) - encode current selection into quoted-printable string 
	
	Note: operation performs on the spot

	Аргумент:
		Первый аргумент - 'decode' - декодировать выбранный текст из кодировки quoted-printable в простой текст (можно не указывать, т.к. это действие должно быть выполнено по умолчанию),
			'encode' - закодировать выбранный текст в кодировку quoted-printable 

	Пример:
		Call("Scripts::Main", 1, "quoted-printable.js", `encode`); 
			foo=0D=0Abar => foo=3D0D=3D0Abar 
			Привет! => =D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82! 
*/

/*! https://mths.be/quoted-printable v1.0.1 by @mathias | MIT license */
var quotedPrintable = (function() {
	function convertToUnicode(str, cp) {
		var oSys = AkelPad.SystemFunction();

		if(cp === undefined)
			cp = AkelPad.GetEditCodePage(0);
	
		var ret = "";
	
		if(
			cp == 1200 //UTF-16LE
			|| cp == 1201 //UTF-16BE
			|| cp == 12000 //UTF-32LE
			|| cp == 12001 //UTF-32BE
		) {
			var isLE = cp == 1200 || cp == 12000;
			var step = cp == 12000 || cp == 12001 ? 4 : 2;
			if(str.length % step != 0)
				throw "Invalid unicode string";
			for(var i = 0, l = str.length; i < l; i += step) {
				var chars = str.substr(i, step);
				if(isLE) {
					var b1 = chars.charCodeAt(0);
					var b2 = chars.charCodeAt(1);
				}
				else {
					var b1 = chars.charCodeAt(step - 1);
					var b2 = chars.charCodeAt(step - 2);
				}
				ret += String.fromCharCode((b2 << 8) + b1);
			}
			return ret;
		}
	
		// based on Fr0sT's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=7972#p7972
	
		// current code page is UTF16* or UTF32* - set ansi current code page
		// (WideChar <-> MultiByte functions don't work with this code pages)
		if(cp == 1 || cp == 1200 || cp == 1201 || cp == 12000 || cp == 12001)
			cp = 0;
	
		try {
			var strLen = str.length;
			var pMBBuf = AkelPad.MemAlloc(strLen * 1 /*sizeof(char)*/);
			if(!pMBBuf)
				throw new Error("MemAlloc fail");
			for(var i = 0; i < strLen; ++i)
				AkelPad.MemCopy(_PtrAdd(pMBBuf, i), str.charCodeAt(i), 5 /*DT_BYTE*/);
	
			// get required buffer size
			var bufLen = oSys.Call(
				"Kernel32::MultiByteToWideChar",
				cp,       //   __in   UINT CodePage,
				0,        //   __in   DWORD dwFlags,
				pMBBuf,   //   __in   LPCSTR lpMultiByteStr,
				strLen,   //   __in   int cbMultiByte,
				0,        //   __out  LPWSTR lpWideCharStr,
				0         //   __in   int cchWideChar
			);
			if(!bufLen)
				throw new Error("MultiByteToWideChar fail " + oSys.GetLastError());
			bufLen *= 2 /*sizeof(wchar_t)*/;
	
			var pWCBuf = AkelPad.MemAlloc(bufLen);
			if(!pWCBuf)
				throw new Error("MemAlloc fail");
	
			// convert buffer
			bufLen = oSys.Call(
				"Kernel32::MultiByteToWideChar",
				cp,       //   __in   UINT CodePage,
				0,        //   __in   DWORD dwFlags,
				pMBBuf,   //   __in   LPCSTR lpMultiByteStr,
				strLen,   //   __in   int cbMultiByte,
				pWCBuf,   //   __out  LPWSTR lpWideCharStr,
				bufLen    //   __in   int cchWideChar
			);
			if(!bufLen)
				throw new Error("MultiByteToWideChar fail " + oSys.GetLastError());
	
			//ret = AkelPad.MemRead(pWCBuf, 1 /*DT_UNICODE*/);
			for(
				var pCurr = pWCBuf, bufMax = _PtrAdd(pWCBuf, bufLen*2);
				_PtrMath(pCurr, "<", bufMax);
				pCurr = _PtrAdd(pCurr, 2)
			)
				ret += String.fromCharCode(AkelPad.MemRead(pCurr, 4 /*DT_WORD*/));
		}
		catch(e) {
			throw e;
		}
		finally {
			pMBBuf && AkelPad.MemFree(pMBBuf);
			pWCBuf && AkelPad.MemFree(pWCBuf);
		}
	
		return ret;
	}

	function convertFromUnicode(str, cp) {
		var oSys = AkelPad.SystemFunction();

		if(cp === undefined)
			cp = AkelPad.GetEditCodePage(0);
	
		var ret = "";
	
		if(
			cp == 1200 //UTF-16LE
			|| cp == 1201 //UTF-16BE
			|| cp == 12000 //UTF-32LE
			|| cp == 12001 //UTF-32BE
		) {
			var isLE = cp == 1200 || cp == 12000;
			var u32 = cp == 12000 || cp == 12001 ? "\x00\x00" : "";
			for(var i = 0, l = str.length; i < l; ++i) {
				var code = str.charCodeAt(i);
				var b1 = String.fromCharCode(code & 0xff);
				var b2 = String.fromCharCode(code >> 8 & 0xff);
				ret += isLE
					? b1 + b2 + u32
					: u32 + b2 + b1;
			}
			return ret;
		}
	
		// based on Fr0sT's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=7972#p7972
	
		// current code page is UTF16* or UTF32* - set ansi current code page
		// (WideChar <-> MultiByte functions don't work with this code pages)
		if(cp == 1 || cp == 1200 || cp == 1201 || cp == 12000 || cp == 12001)
			cp = 0;
	
		try {
			var strLen = str.length + 1;
			var pWCBuf = AkelPad.MemAlloc(strLen * _TSIZE);
			if(!pWCBuf)
				throw new Error("MemAlloc fail");
			AkelPad.MemCopy(pWCBuf, str, _TSTR);
			
			// get required buffer size
			var bufLen = oSys.Call(
				"Kernel32::WideCharToMultiByte",
				cp,       //   __in   UINT CodePage,
				0,        //   __in   DWORD dwFlags,
				pWCBuf,   //   __in   LPCWSTR lpWideCharStr,
				strLen,   //   __in   int cchWideChar,
				0,        //   __out  LPSTR lpMultiByteStr,
				0,        //   __in   int cbMultiByte,
				0,        //   __in   LPCSTR lpDefaultChar,
				0         //   __out  LPBOOL lpUsedDefaultChar
			);
			if(!bufLen)
				throw new Error("WideCharToMultiByte fail " + oSys.GetLastError());
			
			var pMBBuf = AkelPad.MemAlloc(bufLen);
			if(!pMBBuf)
				throw new Error("MemAlloc fail");
	
			// convert buffer
			bufLen = oSys.Call(
				"Kernel32::WideCharToMultiByte",
				cp,       //   __in   UINT CodePage,
				0,        //   __in   DWORD dwFlags,
				pWCBuf,   //   __in   LPCWSTR lpWideCharStr,
				strLen,   //   __in   int cchWideChar,
				pMBBuf,   //   __out  LPSTR lpMultiByteStr,
				bufLen,   //   __in   int cbMultiByte,
				0,        //   __in   LPCSTR lpDefaultChar,
				0         //   __out  LPBOOL lpUsedDefaultChar
			);
			if(!bufLen)
				throw new Error("WideCharToMultiByte fail " + oSys.GetLastError());
	
			//ret = AkelPad.MemRead(pMBBuf, 0 /*DT_ANSI*/);
			for(
				var pCurr = pMBBuf, bufMax = _PtrAdd(pMBBuf, bufLen - 1);
				_PtrMath(pCurr, "<", bufMax);
				pCurr = _PtrAdd(pCurr, 1)
			)
				ret += String.fromCharCode(AkelPad.MemRead(pCurr, 5 /*DT_BYTE*/));
		}
		catch(e) {
			throw e;
		}
		finally {
			pWCBuf && AkelPad.MemFree(pWCBuf);
			pMBBuf && AkelPad.MemFree(pMBBuf);
		}
	
		return ret;
	}

	/*--------------------------------------------------------------------------*/

	var stringFromCharCode = String.fromCharCode;

	var decode = function(input) {
		var s = input
			// https://tools.ietf.org/html/rfc2045#section-6.7, rule 3:
			// тАЬTherefore, when decoding a `Quoted-Printable` body, any trailing white
			// space on a line must be deleted, as it will necessarily have been added
			// by intermediate transport agents.тАЭ
			.replace(/[\t\x20]$/gm, '')
			// Remove hard line breaks preceded by `=`. Proper `Quoted-Printable`-
			// encoded data only contains CRLF line  endings, but for compatibility
			// reasons we support separate CR and LF too.
			.replace(/=(?:\r\n?|\n|$)/g, '')
			// Decode escape sequences of the form `=XX` where `XX` is any
			// combination of two hexidecimal digits. For optimal compatibility,
			// lowercase hexadecimal digits are supported as well. See
			// https://tools.ietf.org/html/rfc2045#section-6.7, note 1.
			.replace(/=([a-fA-F0-9]{2})/g, function($0, $1) {
				var codePoint = parseInt($1, 16);
				return stringFromCharCode(codePoint);
			});
		// WScript.Echo(s);
		return convertToUnicode(s, 65001);
		
	};

	var handleTrailingCharacters = function(string) {
		return string
			.replace(/\x20$/, '=20') // Handle trailing space.
			.replace(/\t$/, '=09') // Handle trailing tab.
	};

	var regexUnsafeSymbols = /[\0-\x08\n-\x1F=\x7F-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
	
	var encode = function(string) {
		string = convertFromUnicode(string, 65001);
		// Encode symbols that are definitely unsafe (i.e. unsafe in any context).
		var encoded = string.replace(regexUnsafeSymbols, function(symbol) {
			if (symbol > '\xFF') {
				throw RangeError(
					'`quotedPrintable.encode()` expects extended ASCII input only. ' +
					'Don\u2019t forget to encode the input first using a character ' +
					'encoding like UTF-8.'
				);
			}
			var codePoint = symbol.charCodeAt(0);
			var hexadecimal = codePoint.toString(16).toUpperCase();
			return '=' + ('0' + hexadecimal).slice(-2);
		});

		// Limit lines to 76 characters (not counting the CRLF line endings).
		var lines = encoded.split(/\r\n?|\n/g);
		var lineIndex = -1;
		var lineCount = lines.length;
		var result = [];
		while (++lineIndex < lineCount) {
			var line = lines[lineIndex];
			// Leave room for the trailing `=` for soft line breaks.
			var LINE_LENGTH = 75;
			var index = 0;
			var length = line.length;
			while (index < length) {
				var buffer = encoded.slice(index, index + LINE_LENGTH);
				// If this line ends with `=`, optionally followed by a single uppercase
				// hexadecimal digit, we broke an escape sequence in half. Fix it by
				// moving these characters to the next line.
				if (/=$/.test(buffer)) {
					buffer = buffer.slice(0, LINE_LENGTH - 1);
					index += LINE_LENGTH - 1;
				} else if (/=[A-F0-9]$/.test(buffer)) {
					buffer = buffer.slice(0, LINE_LENGTH - 2);
					index += LINE_LENGTH - 2;
				} else {
					index += LINE_LENGTH;
				}
				result.push(buffer);
			}
		}

		// Encode space and tab characters at the end of encoded lines. Note that
		// with the current implementation, this can only occur at the very end of
		// the encoded string тАФ every other line ends with `=` anyway.
		var lastLineLength = buffer.length;
		if (/[\t\x20]$/.test(buffer)) {
			// Thereт's a space or a tab at the end of the last encoded line. Remove
			// this line from the `result` array, as it needs to change.
			result.pop();
			if (lastLineLength + 2 <= LINE_LENGTH + 1) {
				// It's possible to encode the character without exceeding the line
				// length limit.
				result.push(
					handleTrailingCharacters(buffer)
				);
			} else {
				// It's not possible to encode the character without exceeding the line
				// length limit. Remvoe the character from the line, and insert a new
				// line that contains only the encoded character.
				result.push(
					buffer.slice(0, lastLineLength - 1),
					handleTrailingCharacters(
						buffer.slice(lastLineLength - 1, lastLineLength)
					)
				);
			}
		}

		// `Quoted-Printable` uses CRLF.
		var s = result.join('=\r\n');
		return s;
	};

	return {
		'encode': encode,
		'decode': decode,
		'version': '1.0.1'
	};


}());

/* AkelPad specific code below */
// check if we use this script out of AkelPad editor's environment
if (typeof AkelPad == "undefined")
{
  try
  {
    AkelPad = new ActiveXObject("AkelPad.Document");
    _PtrAdd = function(n1, n2) {return AkelPad.Global._PtrAdd(n1, n2);};
    _X64    = AkelPad.Constants._X64;
    AkelPad.ActiveXThis(this);
  }
  catch (oError)
  {
    WScript.Echo("You need to register Scripts.dll");
    WScript.Quit();
  }
}

// find selected text and throw error if there is no one
var nSelStart = AkelPad.GetSelStart(),
		nSelEnd = AkelPad.GetSelEnd();
var inputBuf = trim(AkelPad.GetSelText());
if(nSelStart == nSelEnd || inputBuf.length < 1)
	error("Select text to operate");

var option = (WScript.Arguments.length ? trim(WScript.Arguments(0)) : 'decode');
var text = option == 'encode' ? quotedPrintable.encode(inputBuf) :
	quotedPrintable.decode(inputBuf);
// var trailing = option == 'encode' ? 1 : 0; 

AkelPad.ReplaceSel(text);
AkelPad.SetSel(nSelStart, nSelStart + text.length /* - trailing */ );

/* ******************* */
/* Auxiliary functions */
/* ******************* */

// trim spaces from beginning and end of a string
function trim(pStr)
{
  return (typeof pStr == 'string' && pStr.length) ? 
  	pStr.replace(/^\s+|\s+$/, '') : '';
}

// error handling
function error(s)
{
		AkelPad.MessageBox(AkelPad.GetEditWnd(), s, WScript.ScriptName, 0x48);
		WScript.Quit();	
}


Decode/encode quoted-printable strings (selected in AkelPad editor) on the spot
Original code is from: https://github.com/mathiasbynens/quoted-printable
May be handy during reading email messages source.

Декодировать/кодировать quoted-printable выбранные в редакторе строки
Код был адаптирован для AkelPad'а (ссылку см. выше).
Может быть полезен при чтении оригиналов писем.

Offline
Posts: 142
Joined: Fri Aug 15, 2008 8:58 am

Post by Diamen »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=32545#p32545
// Version: 1.0 (2017-05-22)
// Author: Diamen
//
//
// Description(1033): WM_COPYDATA implementation
// Example: _WM_COPYDATA_Send("WindowsClass", "Command", 0, false);

function _WM_COPYDATA_Send(win, sString, dwData, post){
//_WM_COPYDATA_Send("PowerProMain", ".Lancia@test(321)", 0, false);
	var cd=AkelPad.MemAlloc(_X64?24:12);
	AkelPad.MemCopy(_PtrAdd(cd, 0), dwData, 3);
	AkelPad.MemCopy(_PtrAdd(cd, (_X64?8:4)), sString.length+1, 3);
	var cmd=AkelPad.MemAlloc(sString.length);
	AkelPad.MemCopy(cmd, sString,0);
	AkelPad.MemCopy(_PtrAdd(cd, (_X64?16:8)), cmd, 3);
	var oSys=AkelPad.SystemFunction();
	if(typeof win==="string"){win=oSys.Call("User32::FindWindowExW", 0, 0, win, 0);}
	if(win){
		if(post!==true){
			AkelPad.SendMessage(win, 0x004A, 0, cd);
		}else{
			oSys.Call("user32::SendMessageTimeoutW", win, 0x004A, 0, cd, 1, 30000, 0);
		}
		post=oSys.GetLastError();
	}
	AkelPad.MemFree(cmd);
	AkelPad.MemFree(cd);
	return post;
}

Offline
Posts: 1
Joined: Sat Dec 01, 2018 5:58 am

Select Paragraph

Post by SerpentLabs »

Code: Select all

// Description: Expand selection to current paragraph
// Version: 1.0 (2018-11-30)
// Author: SerpentLabs

var hWndEdit= AkelPad.GetEditWnd();
var newline = AkelPad.GetEditNewLine(hWndEdit);

if      (newline == 1) newline = "\r\n";
else if (newline == 2) newline = "\n";
else if (newline == 3) newline = "\r";

var selection_b = AkelPad.GetSelStart();
var selection_e = AkelPad.GetSelEnd();

if (selection_e != 0) selection_e -= 1;

AkelPad.SetSel(selection_b, selection_b);
var paragraph_begin = AkelPad.TextFind(hWndEdit, newline + newline, 0x00180000 /*FRF_UP  |FRF_REGEXP*/);
AkelPad.SetSel(selection_e, selection_e);
var paragraph_end   = AkelPad.TextFind(hWndEdit, newline + newline, 0x00080001 /*FRF_DOWN|FRF_REGEXP*/);

if (paragraph_begin == -1) paragraph_begin = 0;
else {
	paragraph_begin += 2;
	var first_char = AkelPad.GetTextRange(paragraph_begin, paragraph_begin + 1);
	if (first_char == "\r" && newline != "\r") paragraph_begin += 1;
}

if (paragraph_end != -1) paragraph_end += 1;


AkelPad.SetSel(paragraph_begin, paragraph_end);



Expands selection to current paragraph.
A paragraph is a block of text separated from other paragraphs by at least one empty line between them.
For common usage it works similar to Sublime Text feature with the same name or the "vip" command in Vim.

Offline
Posts: 330
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Code: Select all

// AZJIO, 03.09.2019
// Description(1033): Number List Generator. Select a few lines and use a script
// Description(1049): Генератор числового списка. Выделите несколько строк и используйте скрипт.
//
// Usage:
//   Call("Scripts::Main", 1, "NumberListGenerator.js")
// Примечание:
// Вставка определяется выделением, начало выделения - колонка вставки, число строк по количеству выделенного. Не обязательно выделять столбиком.
// Для дробных чисел точку можно ввести позже столбиком.
// Если указать число строк, то вставляется список в начало строк, сдвигая текст

if (! AkelPad.Include("InputBox_function.js")) WScript.Quit();

var hMainWnd = AkelPad.GetMainWnd();
var hEditWnd = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();
var nSelStart = AkelPad.GetSelStart();
var nSelEnd = AkelPad.GetSelEnd();

var sLng=AkelPad.GetLangId(0 /*LANGID_FULL*/);
if (sLng==1049) // Русский
{
  var vLabel = ["Начало отсчёта:", "Шаг (-1 уменьшает):", "Колонка:", "Ширина:", "Число строк (игнор колонки и выдел.):"];
  // var vSet = "NumberListGenerator";
  var vMsgBox = "Выделите несколько строк!\n\nНачало выделения определяет колонку\nКонец выделения - строку до которой заполнение";
}
else // English
{
  var vLabel = ["Start", "Step (-1 decreases)", "Column", "Width", "Lines (ignore column and selected)"];
  // var vSet = "NumberListGenerator";
  var vMsgBox = "Select some lines!\n\nThe beginning of the selection defines the column\nThe end of the selection is the line to which the filling";
}

if (nSelStart == nSelEnd)
  ExitError()

SetRedraw(hEditWnd, false); // чтобы не показывать происходящее и не тратить время и ресурсы и перерисовку

// Disable Word Wrap Отключить перенос строк, если включен
var nWordWrap = SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
if (nWordWrap > 0) // Если перенос включен, то переключаем
  AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

// Получить номера строк по позиции
var nLineStart = SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nSelStart);
var nLineEnd = SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nSelEnd);
if (nLineStart == nLineEnd)
  ExitError()

BeginUndoAction() // Начало действия функции "Отмена". Все что произойдёт до StopUndoAction будет отменено одним кликом (взял из SwapText.js автора Kley)

var nIndent = nSelStart - GetBeginLine(nLineStart); // Определяем отступ
var nPos; // позиция

var vRetVal = InputBox(
  hMainWnd,
  "NumberListGenerator",
  vLabel,
  ["1", "1", nIndent+"", "1", "0"]);
if (vRetVal == undefined)
  ExitError2()

var nNum = Number(vRetVal[0]); // старт
var nStep = Number(vRetVal[1]); // шаг
nIndent = parseInt(vRetVal[2]); // колонка, отступ справа
var nWidth = parseInt(vRetVal[3]); // увеличение или уменьшение
if (nWidth <= 1)
  nWidth = 0;
var nLines = parseInt(vRetVal[4]); // Число строк
if (nLines) {
  var nRes = "";
  for (var i = nLineStart; i <= (nLineStart+nLines-1); i++) {
      if (nWidth) {
        nRes += (NumWidth(nNum, nWidth) + "\n");
      } else {
        nRes += (nNum + "\n");
      }
      nNum += nStep;
    }
  AkelPad.SetSel(nSelStart, nSelStart);
  AkelPad.ReplaceSel(nRes);
  ExitError2()
}

for (var i = nLineStart; i <= nLineEnd; i++) {
  if (GetLineLength(i) >= nIndent) { // если длина строки больше отступа или равна то добавляем число
    nPos = GetBeginLine(i) + nIndent // позиция вставки от начало документа (начало строки + отступ)
    AkelPad.SetSel(nPos, nPos);
    if (nWidth) {
      AkelPad.ReplaceSel(NumWidth(nNum, nWidth));
    } else {
      AkelPad.ReplaceSel(nNum);
    }
    nNum += nStep;
  }
}

RecoveryWordWrap();
SetRedraw(hEditWnd, true);
StopUndoAction() // Конец действия функции "Отмена"

function RecoveryWordWrap() {
  if (nWordWrap > 0) { // Восстанавливаем перенос строк, если был включен
    AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
    SendMessage(hEditWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
  }
}

// Если игнорировать дробные числа, то функцию можно упростить, убрав 2 первых строки (аналогично и ранее в цикле)
function NumWidth(n, w) {
  n = n.toPrecision(6) // Срезаем числа типа 1.2000000000000001 неверно переводимые в строки
  n = Number(n) // Снова в число чтобы откинуть нули
  n = n.toString(); // В строку
  if (n.length < w) {
    w -= n.length
    for (var i = 1; i <= w; i++) {
      n = "0" + n;
    }
  }
  return n
}

function ExitError() {
  RecoveryWordWrap();
  SetRedraw(hEditWnd, true);
  AkelPad.MessageBox(hMainWnd, vMsgBox, "NumberListGenerator.js", 48);
  WScript.Quit();
}

function ExitError2() {
  RecoveryWordWrap();
  StopUndoAction()
  SetRedraw(hEditWnd, true);
  WScript.Quit();
}

function SetRedraw(hWnd, bRedraw) {
  SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  bRedraw && oSys.Call("User32::InvalidateRect", hWnd, 0, true);
}

function SendMessage(hWnd, uMsg, wParam, lParam) {
  return oSys.Call("User32::SendMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}

function GetLineLength(nLine) {
  return SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0), 0);
}

function GetBeginLine(nLine) {
  return SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0);
}

function BeginUndoAction()
{
  SendMessage(hEditWnd, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
  SendMessage(hEditWnd, 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
}

function StopUndoAction()
{
  SendMessage(hEditWnd, 3082 /*AEM_ENDUNDOACTION*/,   0, 0);
  SendMessage(hEditWnd, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
} 
- Генерирует числовой список. Из последних обновлений добавил остановку Undo, чтобы отменять не построчно, сразу все вставленные.

Code: Select all

//до
array[]
array[]
array[]
//после
array[1]
array[2]
array[3]
Нужно курсор поставить между скобками [] и выделить вниз столько строк, сколько должно быть заполнено номерами. Если строка пустая или короче чем позиция вставки, то эти строки игнорируются. Если вручную указать число строк в открываемом диалоговом окне, то числа вставятся от курсора, то есть он сформируется заранее, это полезно когда файл пустой и нужно вставить числа не создавая под него строки.
Last edited by AZJIO on Sat Sep 07, 2019 10:06 pm, edited 1 time in total.

Offline
Posts: 330
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Сделайте ссылку на этот пост в шапке с пояснением что RU-описание функций. Я переведу и добавлю остальное. Кстати, скрипт KDJ надо поправить FindFiles.js на FindReplaceFiles.js. Скрипт у Instructor указан "DeRun leteRecentFile.js - delete record from recent files " - ссылка та же на 3 строки вверх.

  • KDJ.zip - архив скриптов.
  • TextReplace.js - GUI для TextReplace_function.js
  • TextReplace_function.js - Заменить текст в окне редактирования. Include.
  • SortLinesWithIntegers.js - Сортировка строк, содержащих целые числа
  • RunScriptOnTabs.js - Запустить скрипт / метод / пакет на вкладках MDI
  • HtmlView.js - Предпросмотр HTML-файла в WebBrowser
  • OpenNextFile.js - Откройте следующий / предыдущий / первый / последний файл в каталоге текущего файла.
  • PDFtk-G.js (5 части) - GUI для PDFtk Server - управление PDF-документами.
  • RunCommand.js (2 части) - Запустить команду и захватить вывод.
  • TextMarker.js (2 части) - GUI для маркировки указанного текста с помощью плагина Coder.
  • TabFont.js - Задаёт шрифт на вкладках AkelPad (MDI / PMDI).
  • AkelPadRestart.js - Перезапустите AkelPad без использования дополнительных инструментов.
  • CreateDialog_example.js - Пример создания диалоговых окон с использованием функций CreateDialogWindow() и CreateDialogBox().
  • CreateDialog_functions.js - Функции для создания диалоговых окон.
  • TabNumberByKeyboard.js - Выбор вкладки, нажатием Ctrl/Shift/Alt+Number (MDI / PMDI).
  • AkelPadDocsView.js (2 части) - Предпросмотр файлов документов (...\AkelPad\AkelFiles\Docs\).
  • LineBoardRClickPanel.js - Клик правой кнопкой мыши на панели LineBoard для вызова любого скрипта или ContextMenu::Show вместо меню LineBoard.
  • LineBoardRulerOnOff.js - Вкл/откл линейку LineBoard.
  • LineBoardBookmarks.js - Несколько операций с закладками.
  • IconsOnTabs.js - Удаляет/восстанавливает значки файлов на вкладках (MDI/PMDI).
  • AkelPadTitle.js - Изменяет заголовок основного окна AkelPad.
  • AkelPadManualSettings.js (3 части) - GUI для ручной настройки.
  • CalculatorBin.js - Битовый калькулятор.
  • AkelPadMethodsView.js - Список методов AkelPad из файлов Scripts-Eng.txt и Scripts-Rus.txt.
  • TabMinMax.js - Свернуть, развернуть или восстановить вкладку в режиме MDI.
  • FindReplaceEx.js (3 части) - Расширенная версия диалога "Найти/Заменить". Interface language files.
  • GoToEx.js - "Перейти к" диалог с аргументом
  • ScreenView.js - Переключение между различными видами экрана AkelPad.
  • FindReplaceFiles.js - Поиск файлов по имени и содержимому
  • FontCycleSwitch.js, FontCycleSwitch_PerverseCode.js - Циклическое переключение между шрифтами.
  • InputBox_function.js, InputBox_example.js - InputBox с несколькими задаваемыми значениями и переменной шириной окна.
  • PluginText.js - Операции над текстом из плагинов: Coder, ContextMenu, Hotkeys и ToolBar.
  • FileAndStream.js (4 части) - Менеджер файлов и потоков NTFS.
  • SendData.js - Отправляет данные и нажатия клавиш из текстового файла или листа Excel в другое окно.
  • CaretOptionsSwitch.js - Переключение четырех опций каретки.
  • FileStreamsList.js, FileStreamCreate.js, FileStreamDelete.js, FileStreamOpen.js, FileStreamRead.js, FileStreamWrite.js - Примеры использования FileStreams_functions.js
  • FileStreams_functions.js - Функции для поддержки потоков файлов NTFS (альтернативные потоки данных).
  • WindowsList.js - Список окон (на рабочем столе).
  • EnumerateWindows_functions.js - Перечисляет окна верхнего уровня и дочерние окна (функции).
  • FontDialogMonospace.js, ChooseFont_examples.js - Примеры использования функции ChooseFont.
  • ChooseFont_function.js - Отображает диалоговое окно с выбором шрифтов.
  • FontIniRestore.js, FontIniRestore.vbs - Восстанавливает начальные настройки шрифта, стиля и размера шрифта из AkelPad.ini или реестра.
  • PlugTextReadFromIni.js - Opens text of ContextMenu/ToolBar plugin in AkelPad edit window.
  • PlugTextToAkelPad.js - Copy the text from edit window of ContextMenu/ToolBar plugin to AkelPad or vice versa.
  • PlugToolBarAkelFont.js - Запустите плагин ContextMenu со шрифтом, который установлен в AkelPad или изменен.
  • PlugContextMenuAkelFont.js - Измените шрифт в окне плагина панели инструментов.
  • MarginsChange.js - Изменить поля в окне редактирования.
  • ShowScrollBar.js - Показать/скрыть полосы прокрутки в окне редактирования.
  • MapNetDrive.js - Сопоставление сетевых дисков.
  • InsertFolderName.js, InsertFolderName_alternative.js, BrowseForFolder_function.js - вставляет имя папки с помощью функции SHBrowseForFolder.
  • Translator.js - переводит текст через Google и MS Bing.
  • InsertDateFromCalendar.js - вставляет дату и/или время из календаря.
  • ResetUrlDelimiters.js - восстанавливает значение по умолчанию разделителей URL (Опции-> Настройки-> Редактор 2-> Разделители)
  • ResetUrlPrefixes.js - восстанавливает префиксы URL-адресов по умолчанию (Опции-> Настройки-> Редактор 2-> Префиксы)
  • InsertTabOrSpaces.js - вставляет табуляцию или пробелы, противоположные настройке Опции-> Настройки-> Редактор 1-> Размер вкладки-> Пробелы (bTabStopAsSpaces)
  • ReplaceReplicateCharsWithOne.js - заменить повторяющиеся символы одним символом
  • SortWords.js - сортировать слова.
  • RegExpTestJS.js (2 части) - тестер регулярных выражений для JavaScript
  • SortList.js - сортирует списки в строках с помощью плагин Format
  • SortLines.js - сортирует строки по двум ключам: по длине строки и по строке, по алфавиту или по номерам; удаляет дубликаты строк, меняет порядок строк
  • SortInColumns.js
  • GetTextRangeColumn_example.js - эта функция извлекает столбик текста, не выбирая
  • DateToShortLocaleString_example.js - эта функция возвращает короткую локальную дату из системной даты
  • ArrayTextSort_example.js - функция сортировки одномерного текстового массива
  • Array2DSort_example.js - функция сортировки одного или двухмерного массива
  • Array2DTransp_example.js - функция транспонирования двумерного массива
  • BracketsGoTo.js - перейти к или выбрать между ближайшими скобками
  • FileInfo.js - информация о файле и текстовая статистика
  • LineMaxLength.js - информация о максимальной длине строки
  • SelectRangeText.js - выберите диапазон текста, измените выбор
  • FontIniSize.js, FontIniSize.vbs - Установите начальный размер шрифта из AkelPad.ini или реестра
  • ColumnsSum.js - сумма чисел (выражений) в выбранном столбце
  • ColumnsReplace.js - заменить текст в выбранном столбце
  • ColumnsDuplicateSelect.js - выбрать целые столбцы или дублировать выбранные столбцы
  • SelectionOpenInTab.js - открыть выделенный текст в новой вкладке
  • SelectionSwitchCaretMove.js - переключить режим выбора (колонка вкл/откл), переместить каретку в выделение
  • SelectionSwitch.js - изменение режима выбора (столбец вкл/откл) - простая версия
  • AlignJustify.js - выровнять выбранные строки влево, вправо, в центре или по ширине
  • SelectBeforeAfterCaret.js - выделить весь текст до или после каретки
  • CSVToColumnText.js - преобразует текст в формате CSV в текст в столбцах
  • CalculatorJS.js - Калькулятор выражений JS
  • InsertTextLN.js - вставьте текст и номер строки в начале и в конце выделения
  • InsertText.js - вставить текст в начале и в конце выделения
  • InsertFileNamePath.js - вставляет в текстовый файл имя или путь и копирует в буфер обмена
  • WordsMoveSelect.js - перемещать выбранные слова влево/вправо или только выделить целые слова
  • TextMove.js - перемещает выделенный текст влево и вправо или вверх и вниз
  • SplitSwitch_alternative.js - переключатель разделенного окна (альтернативный скрипт)
  • LinesSelectCopyMoveDuplicate.js, MoveLinesUpDown_alt.js, LinesMoveDuplicateSelect.js - Выбирает целые строки, копирует, перемещает вверх/вниз или дублирует выбранные строки.

  • VladSh.zip - архив скриптов.
  • pack7zip.js - Запаковка/распаковка архивов с помощью 7-zip
  • tidy.js - Работа с HTML Tidy: валидация / форматирование
  • ParagraphCreate.js - Формирование отступа по предыдущей строке
  • SumNumbers.js - Подсчёт суммы всех чисел, содержащихся в выделенном тексте
  • FullScreenEx.js - Переход в полноэкранный режим с возможностью отображения определённого тулбара; возвращение в нормальный режим
  • FileTabs.js - скрипт "Include" для работы с вкладками AkelPad
  • SpellCheckAddToWhiteList.js - Добавление текущего слова в белый список проверки орфографии; (альтернатива WriteInWhiteSpellCheckList.vbs)
  • SpellCheckUnderlightSwitcher.js - Включение/отключение подчёркивания неправильно набранных слов
  • CodeFoldSwitcher.js - Отображение области/окна навигации по коду
  • SpecialCharSwitcher.js - Отображение групп специальных символов
  • ScriptNameCopyAsBBCode.js - Копирует название скрипта в BBCode, подставляя в URL первую найденную в окне редактирования ссылку
  • ScriptCopyToBlock.js - Копирует содержимое файла в определённую структуру [] для выкладки на форум
  • CutFormattingText.js - Вырезает текст с "форматированием" (с подсветкой "синтаксиса" для текущего файла, установленной с помощью плагина Coder)
  • DownloadMaster.js - Передача URL на закачку в Download Master; работает из контекстного меню ссылок
  • OpenSessionsDir.js - Открывает папку, в которой сохраняются файлы сессий
  • TranslateWithGoogleAPI.js - Перевод текста используя Google-API
  • CaseUpperLower.js, CaseUpperLowerProper.js - Изменяет регистр текста по кругу: смешанный -> ВЕРХНИЙ -> нижний -> Начинать С Прописных по аналогии, как это делает MS Word
  • BlockDeclose.js - Убирает блочность (скобки { текст }) выделенного скрипта
  • BlockSelect.js - Выделяет блок по заданным границам
  • reassoc.js - Ассоциирование с программой расширений, указанных в AkelPad.ini
  • Settings.js - скрипт "Include" для работы с настройками
  • INI.js - "Include" для работы с ini-файлами
  • Favourites.js - Работа с меню "Избранное": экспорт / замена / очистка
  • SmartBackspace.js - Удаляет пробелы блоками (количество пробелов в блоке берётся из настроек программы)
  • ParagraphRemove.js - Удаление текущего параграфа Ctrl+Alt+Y
  • RegJump.js - Открывает выделенную ветвь в редакторе реестра
  • ExecuteScriptMenu.js - Запуск скрипта из собственного меню избранных скриптов
  • OpenAllFilesFromFileFolder.js - Открывает файлы, находящиеся в папке
  • ProcessFolderFiles.js - шаблон скрипта для работы со всеми файлами, расположенными в указанной папке
  • ProcessRowText.js - шаблон скрипта для работы со всеми строками текста (альтернативProcessSelectedText.js)
  • ShiftVerticaly.js - переместить текст вертикально (альтернатива MoveLinesUpDown.js)
  • OpenHelpString.js - открывает файл по указанному пути, открывает его и размещает на определенном тексте
  • OpenScriptsHelp.js - Открывает справку по Scripts-плагину и переходит к запрашиваемому методу
  • OpenCoderParamsFile.js - Открывает файл параметров Coder-плагина
  • ShowMenuEx.js - получение значения, выбранного в пользовательском меню (меню, автоматически созданное из файлов параметров)
  • ScriptNamesToContextMenuStrings.js - Преобразование имён скриптов в строки вызова ContextMenu-плагина
  • LSConst.js - Преобразование столбца наименований айтемов в строки описаний констант
  • LSGetItemValue.js - Преобразование dot-синтаксиса GetItemValue к стандартному
  • LSReplaceItemValue.js - Преобразование dot-синтаксиса ReplaceItemValue к стандартному
  • LSFunctionsItemToConst.js - Преобразование наименований полей в функциях в константы
  • CaretSelect.js - выберите слово или ссылку в позиции курсора
  • WordCaretCopy.js - скопировать слово в позиции курсора
  • SpacesToTabs.js - Преобразование пробелов в символы табуляции
  • InternetRequest.js - Интернет-запрос по сформированному в аргументах URL или выделенному тексту и открытие его в браузере по умолчанию
  • SaveAs.js - Расширенное "Сохранить как..." по аналогии с тем, как это делает MS Word
  • OpenByLSC.js - открыть файл по ссылке, выделенному или буферу обмена (поддерживается открытие скриптов из каталога AkalPad)
  • DelInsideSpaces.js - удалить повторяющиеся пробелы внутри текста
  • CreateSubParagraph.js - Создание новой строки с отступом и существующим типом пункта; поддерживается последовательная нумерация строк
  • RecalcLineNumbers.js - пересчет номеров строк
  • CreateLNMemo.js - Создание письма в клиенте Lotus Notes на основе открытого файла в текстовом редакторе AkelPad
  • urlOpen.js - Открыть ссылку или сайт, определённый из ссылки или выделения
  • UndoAllNoScroll.js - Расширенная отмена изменений; работает без скролирования документа
  • DelEmptyLines.js - Удаляет пустые строки (альтернативный скрипт)
  • DelLeadTrailSpaces.js - Убирает пустые символы по краям текста (альтернативный скрипт)
  • DelLineFeed.js - Убирает переводы строк
  • DeleteFile.js - Удаляет файл (текущий открытый на экране либо из списка свежих либо др.)
  • InsertBefore.js - Вставка переданного набора символов перед каждой строкой
  • HTMLlinefeed.js - Вставка переводов строк после <br>, замена <br> на <br /> (стандарт XHTML)
  • HTMLDelUselessTags.js - Удаление ненужных (перегружающих страницу) тегов HTML
  • HTMLDelAllTags.js - Удаляет все тэги, превращая HTML-документ в простой текстовый файл
  • CommentsAdd.js - Комментирование строки или текстового блока
  • CommentsDel.js - Раскомментирование строки или текстового блока
  • CtrlDown.js - формирование, перенос и раскрытие символов блока
  • selCompleteLine.js - общие функции для работы с текстом
  • OpenEx.js - Открытие файла с возможностью выбора расширения из списка файла параметров
  • RenameFileDialog.js - Переименование текущего файла
  • CommonFunctions.js - общие функции для WinFS
  • NewFilebyRecent.js - Универсальное создание нового файла на основе имеющегося в окне редактирования или в списке свежих
  • insertStructure.js - Преобразовывает выделенный текст в блок определённой стрктуры
  • CorrectCBCodepage.js - Корректировка кириллических символов буфера обмена
  • InsertFileEx.js - Вставка выбранного текстового файла в текущий
  • SpellCheckMSWord.js - Проверка орфографии используя MS Word (альтернативный скрипт)
  • TestCurrentScript.js - Запуск открытого в текущей вкладке скрипта (для тестирования)
  • ConsoleRun.js - Выполняет команду с помощью cmd (аналог WshShell.Run), с выводом результата выполнения в консоли Log-плагина
  • ConsoleExec.js - Выполняет команду методом WshShell.Exec; используется для запуска некоторых приложений, аналог команды "Пуск" -> "Выполнить"
  • DateFormat.js - функция возврата времени и даты в указанном формате
  • DateInsert.js - Вставка даты-времени в определённом в аргументах формате
  • DateCopyToCB.js - Копирование в буфер обмена даты-времени в определённом в аргументах формате

  • Infocatcher.zip - архив скриптов.
  • autoSaveSession.js - Автоматически сохраняет текущий сеанс после изменения выбора или прокрутки.
  • timer.js - Вспомогательные функции для user32::SetTimer(), для AkelPad.Include().
  • fullWindow.js - Так же, как в полноэкранном режиме, но сохранить размер и положение окна.
  • closeLeftOrRightTabs.js - Закройте вкладки слева или справа (временно установите флажок "Переключать вкладки: вправо-влево").
  • winMergeTabs.js - Сравнение содержимого текущей и следующей выбранной вкладки, используя WinMerge или любой другой инструмент сравнения.
  • forgetAboutTab.js - Закройте текущую вкладку и удалите информацию о ней из последних файлов.
  • restart.js - Перезапуск AkelPad.
  • adblockPlusChecksum.js - Добавляет контрольную сумму в подписку Adblock Plus.
  • tileTabs.js - Плитка текущей вкладки со следующей выбранной: выберите первую вкладку, вызовите скрипт и затем выберите вторую вкладку.
  • moveResizeWindow.js - Переместите или/и выровняйте главное окно AkelPad.
  • alignWithSpaces.js - Выровнять выделенный код с пробелами по определенной пользователем строке.
  • crypt.js - шифровать/дешифровать текст с помощью AES-256 или Blowfish.
  • unixTime.js - конвертировать время Unix
  • measuresConverter.js - Конвертировать меры (внутренние) и валюту (через Google API, но с кэшированием).
  • runScript.js, executeScript.js, executeScript.vbs - запустить скрипт из каталога AkelFiles\Plugs\Scripts\ с аргументами или выполнить выделенный или весь код.
  • tabsSwitchAlt.js - переключаться между вкладками альтернативным способом (опция "Переключить вкладки: вправо-влево" или "Переключать вкладки: следующий-предыдущий")
  • tabsNextPrevious.js - переключаться между вкладками в порядке их использования (временная опция "Переключать вкладки: следующая-предыдущая")
  • tabsRightLeft.js - переключаться между вкладками в порядке их расположения
  • openRelativeFile.js - попробовать открыть файл с относительным путем
  • jsBeautifier.js - JavaScript распаковщик и форматирование кода
  • replaceDiacriticLetters.js
  • insertTag.js - упростить вставку тегов
  • AESCrypt.js - шифровать/дешифровать текст с использованием AES-256 (см. crypt.js)
  • getHash.js - вычисляет хэш сумму текста
  • backupVersion.js - пытается найти версию файла и скопировать текущий файл в ту же папку
  • TabsToSpaces_mod.js - преобразовать табуляцию в пробел (альтернативный скрипт с TabsToSpaces.js)
  • saveStoreTime.js - сохранить файл и не обновлять время модификации
  • goToLongestLine.js - перейти к самой длинной строке ниже или выше текущей
  • openFileIn.js - открыть файл в другом приложении
  • scriptToBookmarklet.js, scriptToBookmarklet_w2k.js - конвертировать код JavaScript в одну строку букмарклета
  • textStatistics.js - предоставить статистику по английскому и русскому текстам
  • undoRedoAll.js - отменить/повторить все действия в документе
  • punctuationFixer.js - Пытается исправить некоторые пунктуации
  • colorsConverter.js - конвертировать цвета в разные форматы
  • copyPath.js - скопировать путь к файлу в настраиваемом формате (альтернативный скрипт FilePathCopyToCB.js)
  • getLinks.js - пытается извлечь ссылки из любого текста
  • insertEval.js
  • newFileTemplate.js - создать новый файл из шаблона; и его преемник - Templates-плагин.
  • toggleComments.js - переключает (добавляет/удаляет) комментарии
  • convertEscapes.js - Преобразует escape-последовательности JavaScript (\u00a9 <=> ©)
  • insertDateTemplateExample.js - вставить текущую дату (альтернативный скрипт)
  • converter.js - расширенное кодирование/декодирование (универсальный скрипт) (\u00a9 <=> ©)
  • convertHTML.js - Кодирование/декодирование HTML-псевдокода (& <=> &)
  • decodeHTML.js - декодирование HTML-псевдокода (& => &)
  • encodeHTML.js - Кодирование HTML-псевдокода (& => &)
  • highlighter.js - установить расширение вручную для плагина Coder

  • Instructor.zip - архив скриптов.
  • MacroSpeed.js - Быстрое выполнение скрипта и/или тест скорости выполнения скрипта.
  • UndoPos.js - Перейти к ближайшему месту отмены.
  • MultiClipboard.js - Множественный буфер обмена.
  • AutoScript-DetectEx.js - Определить кодировку по расширению или по содержимому файла.
  • ColumnAlign.js - Выравнивание текста в однострочном или вертикальном выделении.
  • SessionsOpenMenu.js - Показать меню сессий для открытия.
  • SmartPaste.js - Вставить текст сохраняя пробелы в начале.
  • PrintOrientation.js - Изменить ориентацию бумаги для печати.
  • DrawLine.js - Рисование таблиц псевдографическими символами.
  • FontSwitch.js - Цикличное переключение между шрифтами.
  • ShowTabMenu.js - Показать меню текущей вкладки.
  • GetNumberMembers.js - Получить составные части числа. Например: 0x7 разворачивается в 0x1|0x2|0x4 и 7 разворачивается в 1+2+4.
  • Insert.js - Данный скрипт - это расширенный аналог метода Insert ().
  • MergeDocuments.js - Соединить содержимое всех открытых документов в один файл.
  • CodePoster.js - Экспортировать подсвеченный текст в HTML или BBCode.
  • OpenSaveMask.js - Открыть/Конвертировать файлы.
  • DeleteRecentFile.js - Удалить запись из последних файлов.
  • ClearRecentFiles.js - Очистить список последних файлов.
  • OpenClosedRecentFile.js - Открыть закрытый файл.
  • NsisCall.js - Пример вызова NSIS плагина.
  • ChmKeyword.js - Показать справку по ключевому слову из * .chm-файлов (альтернатива скрипту LanguageHelp.js)
  • ShiftTabSize.js - Изменить размер табуляции на указанную величину.
  • ShiftMarker.js - Сместить позицию маркера на указанную величину.
  • ShiftAltLines.js - Изменить размер зебры на указанную величину.
  • TabsToSpaces.js - Конвертировать табуляцию в пробелы
  • DuplicateLines.js - Продублировать выделенные строки.
  • SelPoint.js - Первый вызов устанавливает начало выделения, второй вызов осуществляет выделение
  • ReplaceNoUndo.js - Отключение буфера отмен пока открыт диалог замены.
  • SelectRange.js - Выделить диапазон строк.
  • ActiveColumnSwitch.js - Включить/выключить активный столбец.
  • OpenEveryLine.js - Одна строка - один файл. Открыть все выделенные файлы в ассоциированных программах.
  • OpenFileList.js - Откройте файлы в списке файлов.
  • DeleteLastChar.js - Удалить последний символ у выделенных строк.
  • PrintAll.js - Распечатать все MDI/PMDI документы.
  • SaveDefault.js - Сохранение нового файла в папку по умолчанию.
  • VersionIncrement.js - Увеличение версии
  • TabSwitch.js - Переключение между вкладками
  • ForceNewInstance.js - Принудительно создать новый экземпляр программы.
  • UndoAll.js - Отменить все изменения в текущем документе.
  • SelNextWord.js - Выделить следующее слово.
  • CloseUnnamedAll.js - Закрыть все безымянные/несуществующие документы MDI/PMDI.
  • DelTrailSpacesAll.js - Удалить пробелы в конце во всех документах.
  • ExecTool.js - обработать текущий файл во внешнем инструменте
  • ExecConsole.js - Выполнить консольную программу без DOS-окна и захвата вывода
  • LinesUnwrap.js - Убрать перенос строк.
  • LinesWrap.js - Перенести строки по заданному формату.

Offline
Posts: 330
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Code: Select all

// AZJIO, 03.09.2019
// Description(1033): Insert HTML table
// Description(1049): Вставка HTML-таблицы.
//
// Usage:
//   Call("Scripts::Main", 1, "ins_html_table.js")
// Примечание:
// Заполнение имеет режим 1, в остальных случаях заполняется тем, что введено.
// Режим 1 удобен заполнять ячейки двойным кликом на тексте, а текст показывает номер колонки
// По умолчанию в колонку 1 генерируются номера. Чтобы игнорировать задать колонку 0, которой  нет в таблице

if (! AkelPad.Include("InputBox_function.js")) WScript.Quit();

var hMainWnd = AkelPad.GetMainWnd();
var hEditWnd = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();
var nSelStart = AkelPad.GetSelStart();
var nSelEnd = AkelPad.GetSelEnd();

var sLng=AkelPad.GetLangId(0 /*LANGID_FULL*/);
if (sLng==1049) // Русский
{
  var vLabel = ["Колонок:", "Строк:", "Заполнение (1=режим1):", "Колонка с № (0-игнор):", "Отсчёт от:", "Инкремент (-1):", "Заголовок th", "colspan"];
  var vMsgBox = "Заполните правильно поле ";
}
else // English
{
  var vLabel = ["Columns:", "Lines:", "Filling (1=mode1):", "Column No. (0-ignore):", "Countdown from:", "Increment (-1):", "Title th:", "colspan"];
  var vMsgBox = "Fill in the correct field ";
}

var vRetVal = InputBox(
  hMainWnd,
  "ins html table",
  vLabel,
  ["", "", "1", "1", "1", "1", "1", "1"]);
if (vRetVal == undefined)
  WScript.Quit();

var nCol = parseInt(Number(vRetVal[0])); // Колонок
var nLin = parseInt(Number(vRetVal[1])); // Строк
var nFill = vRetVal[2]; // Заполнение
var nNCol = parseInt(Number(vRetVal[3])); // Колонка с №
// if (nWidth <= 1)
  // nWidth = 0;
var nNStart = parseInt(Number(vRetVal[4])); // Отсчёт
var nNStep = parseInt(Number(vRetVal[5])); // Инкремент
var nTitle = parseInt(Number(vRetVal[6])); // th-заголовок
var nColspan = parseInt(Number(vRetVal[7])); // colspan
var nMode = 2

if ((nCol < 1) || (nLin < 1))
{
  ExitError("1, 2")
}
// режимы
// пусто, режим 0 -  без заполения
// 1 заполение числами 111, 222
// 2 заполение тем, что введено
switch (nFill) {
  case "":
    nMode = 0;
    break;
  case "1":
    nMode = 1;
    break;
  default:
    nMode = 2;
};

var res
res = "\n" + '<table class="param" cellspacing="0" cellpadding="3">' + "\n"

if (nTitle) {
	res += '<tr>'
	for (var j = 1; j <= nCol; j++) { // колонок
		res += '<th>'
			switch (nMode) {
				case 1: // разными числами
					// res += StringReplace('000', '0', j)
				    for (var a = 1; a <= 3; a++) {
				      res += j;
				    }
				    break;
				case 2: // тем что введено
					res += nFill
					break;
			};
		res += '</th>'
	}
	res += '</tr>' + "\n"
}

for (var i = 1; i <= nLin; i++) { // строк
	res += '<tr>'
	for (var j = 1; j <= nCol; j++) { // колонок
		res += '<td>'
		if (nNCol && (nNCol == j)) {
			res += (nNStart + (i - 1) * nNStep)
		} else {
			switch (nMode) {
				// case 0: // не заполняем
				// res += ''
				// break;
				case 1: // разными числами
					// res += StringReplace('000', '0', j)
				    for (var a = 1; a <= 3; a++) {
				      res += j;
				    }
				    break;
				case 2: // тем что введено
					res += nFill
					break;
			};
		};
		res += '</td>'
	};
	res += '</tr>' + "\n"
};

if (nColspan) {res += '<tr><td colspan=' + nCol + '></td></tr>' + "\n"}
res += '</table>' + "\n"

AkelPad.ReplaceSel(res);

function ExitError(err) {
  AkelPad.MessageBox(hMainWnd, vMsgBox + err, "ins_html_table.js", 48);
  WScript.Quit();
}

function SendMessage(hWnd, uMsg, wParam, lParam) {
  return oSys.Call("User32::SendMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}

Insert HTML table
Вставка HTML-таблицы.
Менюшкой задаём число колонок, строк, чем заполнять, строка заголовка. Заполнять проще, чем набирать теги, да ещё ошибиться с количеством колонок в строке или забыть закрыть тег.
Post Reply