AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Scripts collection
Goto page Previous  1, 2, 3 ... 20, 21, 22
 
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
KDJ



Joined: 06 Mar 2010
Posts: 1907
Location: Poland

PostPosted: Sat Mar 05, 2016 6:39 pm    Post subject: Reply with quote

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: TextReplace.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30804#30804
// 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#17609
//     TextReplace_function.js: http://akelpad.sourceforge.net/forum/viewtopic.php?p=30653#30653
//   For view AkelPad help file, is needed HtmlView.js: http://akelpad.sourceforge.net/forum/viewtopic.php?p=29221#29221
//   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
Back to top
View user's profile Send private message
nbsp



Joined: 17 Jan 2016
Posts: 19

PostPosted: Tue Mar 08, 2016 8:40 am    Post subject: fullWindow.js - resizable window Reply with quote

Infocatcher wrote:
fullWindow.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=24434#24434
// 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!

fullWindowRes.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=24434#24434
// 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:
Call("ContextMenu::Show", 2, "-6", "-6")
Back to top
View user's profile Send private message
Kley



Joined: 28 Mar 2015
Posts: 202
Location: Russia

PostPosted: Wed Mar 09, 2016 4:52 pm    Post subject: Reply with quote

Removing lines containing / not containing the selected phrase.

DeletePhrasesInText.js

Code:
//  ============================================================================
//  http://akelpad.sourceforge.net/forum/viewtopic.php?p=30854#30854
//  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;
}

Back to top
View user's profile Send private message
Kley



Joined: 28 Mar 2015
Posts: 202
Location: Russia

PostPosted: Mon Mar 21, 2016 8:56 pm    Post subject: Reply with quote

ConvertNumColorValue part2.js

Code:
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
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1907
Location: Poland

PostPosted: Wed Mar 23, 2016 6:06 pm    Post subject: Reply with quote

Replace text in edit window.

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

Code:
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
Back to top
View user's profile Send private message
Kley



Joined: 28 Mar 2015
Posts: 202
Location: Russia

PostPosted: Sat Mar 26, 2016 5:59 pm    Post subject: Reply with quote

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

SessionMenu.js

Code:
//  ============================================================================
//  http://akelpad.sourceforge.net/forum/viewtopic.php?p=30939#30939
//  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
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1907
Location: Poland

PostPosted: Fri Jul 01, 2016 8:53 pm    Post subject: Reply with quote

Hide/Show lines that contains text.

LinesHideShow.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=31498#31498
// 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);
}

Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1907
Location: Poland

PostPosted: Wed Jul 20, 2016 10:45 am    Post subject: Reply with quote

Replace text in edit window.

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

Code:
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!';
  }
}

Back to top
View user's profile Send private message
Sticher78



Joined: 30 Jul 2016
Posts: 22

PostPosted: Fri Nov 04, 2016 11:10 pm    Post subject: Reply with quote

Activate window of FileZilla, when saving file on FTP:

ActivateFZ.js

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

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


AkelPad.Command(4105);

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

Back to top
View user's profile Send private message
beotiger



Joined: 09 Dec 2015
Posts: 53

PostPosted: Fri Dec 02, 2016 7:43 pm    Post subject: Quoted printable decode/encode Reply with quote

quoted-printable.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=32125#32125
// 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#7972
   
      // 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#7972
   
      // 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'а (ссылку см. выше).
Может быть полезен при чтении оригиналов писем.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3 ... 20, 21, 22
Page 22 of 22

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group