Scripts collection

Discuss and announce AkelPad plugins
Post Reply
  • Author
  • Message
Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Shift tabulation size at specified offset.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9209#p9209
// Version: 1.9
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Shift tabulation size at specified offset.
// Description(1049): Изменить размер табуляции на указанную величину.
//
// Arguments:
//  First argument      -Current tabulation size:
//                        +2  increase.
//                        -2  decrease.
//                         8  set to.
// -Local=true          -Change tabulation size locally. Not saved by program (default is false).
// -ShowInput=true      -Show input dialog. Default is false, but true if first argument not specified.
//
// Usage:
// "Set tab manually" Call("Scripts::Main", 1, "ShiftTabSize.js")
// "Increase tab" Call("Scripts::Main", 1, "ShiftTabSize.js", `+2`)
// "Set tab to 8 locally" Call("Scripts::Main", 1, "ShiftTabSize.js", `8 -Local=true`)

//Arguments
var pTabShift="";
var bLocal=AkelPad.GetArgValue("Local", false);
var bShowInput=AkelPad.GetArgValue("ShowInput", false);
if (WScript.Arguments.length >= 1)
  pTabShift=WScript.Arguments(0);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var pSign;
var nTabShift;
var nTabSize;

if (bLocal)
  nTabSize=AkelPad.SendMessage(hWndEdit, 3239 /*AEM_GETTABSTOP*/, 0, 0);
else
  nTabSize=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 52 /*FI_TABSTOPSIZE*/, 0);

nTabShift=parseInt(pTabShift);
if (isNaN(nTabShift))
{
  pTabShift="";
  bShowInput=true;
}
if (bShowInput)
{
  if (!pTabShift)
    pTabShift="" + nTabSize;
  pTabShift=AkelPad.InputBox(hMainWnd, WScript.ScriptName, GetLangString(0), pTabShift);
  nTabShift=parseInt(pTabShift);
  if (isNaN(nTabShift)) pTabShift="";
}

if (hWndEdit && pTabShift)
{
  pSign=pTabShift.substr(0, 1);

  if (pSign == '+' || pSign == '-')
  {
    nTabSize=nTabSize + nTabShift;
    nTabSize=Math.max(nTabSize, 0);
  }
  else nTabSize=nTabShift;

  if (bLocal)
    AkelPad.SendMessage(hWndEdit, 3240 /*AEM_SETTABSTOP*/, nTabSize, 0);
  else
    AkelPad.SetFrameInfo(0, 1 /*FIS_TABSTOPSIZE*/, nTabSize);
}

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

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u0420\u0430\u0437\u043C\u0435\u0440\u0020\u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438:";
  }
  else
  {
    if (nStringID == 0)
      return "Tabulation size:";
  }
  return "";
}


Shift marker position at specified offset.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9209#p9209
// Version: 1.8
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Shift marker position at specified offset.
// Description(1049): Сместить позицию маркера на указанную величину.
//
// Arguments:
//  First argument      -Current marker position:
//                        +10  increase.
//                        -10  decrease.
//                         80  set to.
//                          0  turn off.
// -Local=true          -Change marker position size locally. Not saved by program (default is false).
// -ShowInput=true      -Show input dialog. Default is false, but true if first argument not specified.
//
// Usage:
// "Set marker manually" Call("Scripts::Main", 1, "ShiftMarker.js")
// "Increase marker" Call("Scripts::Main", 1, "ShiftMarker.js", `+10`)
// "Set marker to 80 locally" Call("Scripts::Main", 1, "ShiftMarker.js", `80 -Local=true`)

//Arguments
var pMarkerShift="";
var bLocal=AkelPad.GetArgValue("Local", false);
var bShowInput=AkelPad.GetArgValue("ShowInput", false);
if (WScript.Arguments.length >= 1)
  pMarkerShift=WScript.Arguments(0);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var pSign;
var nMarkerShift;
var nMarkerPos;

if (bLocal)
  nMarkerPos=AkelPad.SendMessage(hWndEdit, 3257 /*AEM_GETMARKER*/, 0, 0);
else
  nMarkerPos=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 64 /*FI_MARKER*/, 0);

nMarkerShift=parseInt(pMarkerShift);
if (isNaN(nMarkerShift))
{
  pMarkerShift="";
  bShowInput=true;
}
if (bShowInput)
{
  if (!pMarkerShift)
    pMarkerShift="" + nMarkerPos;
  pMarkerShift=AkelPad.InputBox(hMainWnd, WScript.ScriptName, GetLangString(0), pMarkerShift);
  nMarkerShift=parseInt(pMarkerShift);
  if (isNaN(nMarkerShift)) pMarkerShift="";
}

if (hWndEdit && pMarkerShift)
{
  pSign=pMarkerShift.substr(0, 1);

  if (pSign == '+' || pSign == '-')
  {
    nMarkerPos=nMarkerPos + nMarkerShift;
    nMarkerPos=Math.max(nMarkerPos, 0);
  }
  else nMarkerPos=nMarkerShift;

  if (bLocal)
    AkelPad.SendMessage(hWndEdit, 3258 /*AEM_SETMARKER*/, 1 /*AEMT_SYMBOL*/, nMarkerPos);
  else
    AkelPad.SetFrameInfo(0, 12 /*FIS_MARKER*/, nMarkerPos);
}

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

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u041F\u043E\u0437\u0438\u0446\u0438\u044F\u0020\u043C\u0430\u0440\u043A\u0435\u0440\u0430:";
  }
  else
  {
    if (nStringID == 0)
      return "Marker position:";
  }
  return "";
}


Change alternating lines size.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9209#p9209
// Version: 1.2
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Change alternating lines size.
// Description(1049): Изменить размер зебры на указанную величину.
//
// Arguments:
//  First argument      -Current alternating lines size:
//                           +1  increase.
//                           -1  decrease.
//                            3  set to.
//                        +1;+1  increase.
//                        -1;-1  decrease.
//                          2;3  set to.
//                            0  turn off.
// -Local=true          -Change alternating lines size locally. Not saved by program (default is false).
// -ShowInput=true      -Show input dialog. Default is false, but true if first argument not specified.
//
// Usage:
// "Set alt lines manually" Call("Scripts::Main", 1, "ShiftAltLines.js")
// "Increase alt lines" Call("Scripts::Main", 1, "ShiftAltLines.js", `+1`)
// "Set alt lines to 3 locally" Call("Scripts::Main", 1, "ShiftAltLines.js", `3 -Local=true`)

//Arguments
var pAltLineShift="";
var bLocal=AkelPad.GetArgValue("Local", false);
var bShowInput=AkelPad.GetArgValue("ShowInput", false);
if (WScript.Arguments.length >= 1)
  pAltLineShift=WScript.Arguments(0);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var pSkipSign;
var nSkipShift;
var nSkipSize;
var pFillSign;
var nFillShift;
var nFillSize;
var aAltLineShift;
var dwAltLineSize;

if (bLocal)
  dwAltLineSize=AkelPad.SendMessage(hWndEdit, 3264 /*AEM_GETALTLINE*/, 0, 0);
else
  dwAltLineSize=MAKELONG(AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 74 /*FI_ALTLINESKIP*/, 0), AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 73 /*FI_ALTLINEFILL*/, 0));

nSkipShift=parseInt(pAltLineShift);
if (isNaN(nSkipShift))
{
  pAltLineShift="";
  bShowInput=true;
}
if (bShowInput)
{
  if (!pAltLineShift)
    pAltLineShift="" + LOWORD(dwAltLineSize) + ";" + HIWORD(dwAltLineSize);
  pAltLineShift=AkelPad.InputBox(hMainWnd, WScript.ScriptName, GetLangString(0), pAltLineShift);
}

if (hWndEdit && pAltLineShift)
{
  aAltLineShift=pAltLineShift.split(";");

  if (aAltLineShift.length > 1)
  {
    pSkipSign=aAltLineShift[0].substr(0, 1);
    nSkipShift=parseInt(aAltLineShift[0]);
    pFillSign=aAltLineShift[1].substr(0, 1);
    nFillShift=parseInt(aAltLineShift[1]);
  }
  else
  {
    pSkipSign=pAltLineShift.substr(0, 1);
    nSkipShift=parseInt(pAltLineShift);
    pFillSign="";
    nFillShift=0;
  }

  if (pSkipSign == '+' || pSkipSign == '-')
  {
    nSkipSize=LOWORD(dwAltLineSize) + nSkipShift;
    nSkipSize=Math.max(nSkipSize, 0);
  }
  else nSkipSize=nSkipShift;

  if (aAltLineShift.length > 1)
  {
    if (pFillSign == '+' || pFillSign == '-')
    {
      nFillSize=HIWORD(dwAltLineSize) + nFillShift;
      nFillSize=Math.max(nFillSize, 0);
    }
    else nFillSize=nFillShift;
  }
  else nFillSize=nSkipSize;

  if (bLocal)
    AkelPad.SendMessage(hWndEdit, 3265 /*AEM_SETALTLINE*/, MAKELONG(nSkipSize, nFillSize), 0);
  else
    AkelPad.SetFrameInfo(0, 21 /*FIS_ALTLINES*/, MAKELONG(nSkipSize, nFillSize));
}

function LOWORD(dwNumber)
{
  return (dwNumber & 0xffff);
}

function HIWORD(dwNumber)
{
  return (dwNumber >> 16);
}

function MAKELONG(a, b)
{
  return (a & 0xffff) | ((b & 0xffff) << 16);
}

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

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u0420\u0430\u0437\u043C\u0435\u0440\u0020\u0437\u0435\u0431\u0440\u044B:";
  }
  else
  {
    if (nStringID == 0)
      return "Alternating lines size:";
  }
  return "";
}
Last edited by Instructor on Mon Feb 09, 2015 1:06 pm, edited 16 times in total.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

autotag.js v1.4

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9326#p9326
// http://outstanding.hmarka.net/akelpad/scripts/autotag.js
//
// Version: 1.4 (2013.05.20) (by VladSh)
//    Исправлено неверное определение тэга при указании нескольких слов текста после открывающего тэга
// Version: 1.3 (2012.10.20) (by VladSh)
//   Исправлено:
//     - неправильное срабатывание после уже установленного закрывающего символа;
//     - раздвоение закрывающего символа в некоторых случаях
//   + Оптимизация кода
// Version: 1.2 (2011.06.24) (by Poma)
//     Now correctly closes tags with attributes
// Version: 1.1 (2010.09.27) (by VladSh)
//     Added handling BBCode-style tags
// Version: 1.0 (2010.09.26) (by FeyFre)
//     Initial release
//
// Examples:
//   Call("Scripts::Main", 1, "AutoTag.js", `"<" ">"`) or without arguments      ;for HTML   (Ctrl+.)
//   Call("Scripts::Main", 1, "AutoTag.js", `"[" "]"`)      ;for BBCode (Ctlr+])
// Usage:
//   For smooth integration into AkelPad you can assign hotkey for this Script, which equal keystroke correspondent closing tag style you using (i.e ] for BBCode and Shift+. for XML/HTML/SGML derived markups)

var hWndEdit = AkelPad.GetEditWnd();
if (hWndEdit)
{
   var qStart = "<";
   var qEnd = ">";
   if (WScript.Arguments.length >= 1) {
      qStart = WScript.Arguments(0) || qStart;
      if (WScript.Arguments.length >= 2) {
         qEnd = WScript.Arguments(1) || qEnd;
      }
   }

   var lEnd = qEnd.length;
   var nCaret = AkelPad.GetSelStart();
   var worker = nCaret - lEnd;
   var text = "";
   var tag = new Array();
   var ntag;
   while (worker >= 0)      // берём по одному символу от каретки до открывающего символа
   {
      ntag = worker + lEnd;   // текущая позиция
      text = AkelPad.GetTextRange(worker, ntag);
      if (text.match(/[^<(){}\[\]\\\/]/i)) {      // собираем тэг
         if (text != " " && text != ">")
            tag.push(text);
         else
            tag = new Array();
      }
      else if (text == qStart) {      // получаем тэг и добавляем
         tag = tag.reverse().join("");
         text = qStart + "/" + tag;

         ntag += tag.length;   // текущая позиция + длина тэга
         if (AkelPad.GetTextRange(ntag, ntag + lEnd) != qEnd &&      // закрывающий символ тэга перед значением
            AkelPad.GetTextRange(nCaret - lEnd, nCaret) != qEnd) {   // закрывающий символ тэга, когда нет текста
            text = qEnd + text;
            nCaret += lEnd;
         }
         if (tag.substr(tag.length - lEnd) != qEnd)
            text += qEnd;      // закрывающий символ закрывающего тэга

         AkelPad.ReplaceSel(text);
         AkelPad.SetSel(nCaret, nCaret);

         WScript.Quit();
      }
      else break;
      worker --;
   }

   AkelPad.ReplaceSel(qEnd);
}
Last edited by FeyFre on Mon May 20, 2013 1:27 pm, edited 3 times in total.

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

Post by KDJ »

Changing selection mode (column on/off) - simple version.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9380#p9380
// Version: 2014-12-20
// Author: KDJ
//
// *** Changing selection mode (column on/off) ***
//
// Usage:
//   Call("Scripts::Main", 1, "SelectionSwitch.js")

var hEditWnd = AkelPad.GetEditWnd();

if (hEditWnd)
{
  if (AkelPad.SendMessage(hEditWnd, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0))
    AkelPad.SendMessage(hEditWnd, 3128 /*AEM_UPDATESEL*/, 0x0 /*column off*/, 0);
  else
    AkelPad.SendMessage(hEditWnd, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);
}

Last edited by KDJ on Sat Dec 20, 2014 7:22 pm, edited 3 times in total.

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

Post by KDJ »

Changing selection mode (column on/off) - extended version.
Move caret in the selection.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9415#p9415
// Version: 2015-01-08
// Author: KDJ
//
// *** Switch selection mode (column on/off) or move caret in the selection ***
//
// Usage:
//   Call("Scripts::Main", 1, "SelectionSwitchCaretMove.js", "0") - switch selection mode
//   Call("Scripts::Main", 1, "SelectionSwitchCaretMove.js", "1") - move caret - begin/end of selection
//   Call("Scripts::Main", 1, "SelectionSwitchCaretMove.js", "2") - in the columnar selection, sequentially, move caret to the four vertices of the rectangle

var hEditWnd = AkelPad.GetEditWnd();
var nAction;

if (! hEditWnd)
  WScript.Quit();
if (WScript.Arguments.length)
  nAction = WScript.Arguments(0);
if (! ((nAction == 0) || (nAction == 1) || (nAction == 2)))
  WScript.Quit();

var DT_QWORD          = 2;
var DT_DWORD          = 3;
var AEGI_FIRSTSELCHAR = 3;
var AEGI_LASTSELCHAR  = 4;
var AESELT_COLUMNOFF  = 0x0;
var AESELT_COLUMNON   = 0x1;
var AEM_GETSEL        = 3125;
var AEM_SETSEL        = 3126;
var AEM_UPDATESEL     = 3128;
var AEM_GETCOLUMNSEL  = 3127;
var AEM_GETINDEX      = 3130;
var AEM_INDEXUPDATE   = 3132;
var AEM_INDEXCOMPARE  = 3133;

var bColSel   = SendMessage(hEditWnd, AEM_GETCOLUMNSEL, 0, 0);
var lpFirstC  = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpLastC   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpCaret   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
var lpBegSel  = lpSelect;
var lpEndSel  = _PtrAdd(lpSelect, _X64 ? 24 : 12);
var lpSelFlag = _PtrAdd(lpSelect, _X64 ? 48 : 24);

SendMessage(hEditWnd, AEM_GETINDEX, AEGI_FIRSTSELCHAR, lpFirstC);
SendMessage(hEditWnd, AEM_GETINDEX, AEGI_LASTSELCHAR,  lpLastC);
SendMessage(hEditWnd, AEM_GETSEL, lpCaret, lpSelect);

if (nAction == 0)
{
  if (bColSel)
    SendMessage(hEditWnd, AEM_UPDATESEL, AESELT_COLUMNOFF, 0);

  else
  {
    if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpCaret, lpEndSel) == 1)
    {
      CopyCharIndex(lpEndSel, lpCaret);
    }
    else
      if ((SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpCaret, lpBegSel) == 1) &&
          (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpCaret, lpEndSel) == -1))
      {
        CopyCharIndex(lpBegSel, lpEndSel);
        CopyCharIndex(lpEndSel, lpCaret);
      }

    AkelPad.MemCopy(lpSelFlag, AESELT_COLUMNON, DT_DWORD);
    SendMessage(hEditWnd, AEM_SETSEL, lpCaret, lpSelect);
  }
}

else if (nAction == 1)
{
  if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpCaret, lpEndSel) == -1)
    CopyCharIndex(lpCaret, lpEndSel);
  else
    CopyCharIndex(lpCaret, lpBegSel);

  SendMessage(hEditWnd, AEM_SETSEL, lpCaret, lpSelect);
}

else if (bColSel)
{
  if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpBegSel, lpFirstC) == 0)
  {
    if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpCaret, lpBegSel) == 0)
    {
      CopyCharIndexRowCol(lpBegSel, lpLastC,  lpFirstC);
      CopyCharIndexRowCol(lpEndSel, lpFirstC, lpLastC);
    }
    else
    {
      CopyCharIndexRowCol(lpBegSel, lpFirstC, lpLastC);
      CopyCharIndexRowCol(lpEndSel, lpLastC,  lpFirstC);
    }
    CopyCharIndex(lpCaret, lpEndSel);
  }

  else
  {
    if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpCaret, lpBegSel) == 0)
    {
      CopyCharIndex(lpBegSel, lpFirstC);
      CopyCharIndex(lpEndSel, lpLastC);
      CopyCharIndex(lpCaret,  lpEndSel);
    }
    else
    {
      CopyCharIndex(lpBegSel, lpLastC);
      CopyCharIndex(lpEndSel, lpFirstC);
      CopyCharIndex(lpCaret,  lpBegSel);
    }
  }
  SendMessage(hEditWnd, AEM_SETSEL, lpCaret, lpSelect);
}

AkelPad.MemFree(lpFirstC);
AkelPad.MemFree(lpLastC);
AkelPad.MemFree(lpCaret);
AkelPad.MemFree(lpSelect);

function CopyCharIndex(lpToIndex, lpFromIndex)
{
  AkelPad.MemCopy(lpToIndex, AkelPad.MemRead(lpFromIndex, DT_DWORD), DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpToIndex, _X64 ?  8 : 4), AkelPad.MemRead(_PtrAdd(lpFromIndex, _X64 ?  8 : 4), DT_QWORD), DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpToIndex, _X64 ? 16 : 8), AkelPad.MemRead(_PtrAdd(lpFromIndex, _X64 ? 16 : 8), DT_DWORD), DT_DWORD);
}

function CopyCharIndexRowCol(lpToIndex, lpFromIndexRow, lpFromIndexCol)
{
  var nRow = AkelPad.MemRead(lpFromIndexRow, DT_DWORD);
  var nCol = AkelPad.MemRead(_PtrAdd(lpFromIndexCol, _X64 ? 16 : 8), DT_DWORD);

  AkelPad.MemCopy(lpToIndex, nRow, DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpToIndex, _X64 ? 16 : 8), nCol, DT_DWORD);
  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpToIndex);
}

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

Last edited by KDJ on Thu Jan 08, 2015 8:33 pm, edited 4 times in total.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9418#p9418
// Version: 2.4
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Show help for keyword.
// Description(1049): Показать помощь по слову.
//
// Arguments:
// -File="ext1:file1.chm|ext2:file2.chm"  -Define which chm file should be open for specified extension (default is predefined CHM names).
//                                         Default chm file (for any other extension) must be specified without extension: "file.chm".
// -Path="C:\MyPath"                      -Path to CHM files (default is "[AkelPad]\AkelFiles\Help").
// -Maximize=false                        -Don't maximize CHM help dialog (default is true).
// -CatchEsc=false                        -Don't close CHM help dialog after escape key pressed (default is true).
// -MethodsView=false                     -Don't check conditions of AkelPadMethodsView.js execution (default is true).
//
// Usage #1. Use predefined CHM names that depends on current file extension:
// Call("Scripts::Main", 1, "ChmKeyword.js")
//
// Usage #2. Use "help_name.chm" to search keyword:
// Call("Scripts::Main", 1, "ChmKeyword.js", `-File="help_name.chm"`)

//Arguments
var pChmFile=AkelPad.GetArgValue("File", "js  :wsh.chm|" +
                                         "vbs :wsh.chm|" +
                                         "c   :cpp.chm|" +
                                         "cpp :cpp.chm|" +
                                         "h   :cpp.chm|" +
                                         "nsi :nsis.chm|" +
                                         "css :css.chm|" +
                                         "php :php.chm|" +
                                         "htm :html.chm|" +
                                         "html:html.chm|" +
                                         "     html.chm");
var pChmPath=AkelPad.GetArgValue("Path", AkelPad.GetAkelDir() + "\\AkelFiles\\Help");
var bMaximize=AkelPad.GetArgValue("Maximize", true);
var bCatchEsc=AkelPad.GetArgValue("CatchEsc", true);
var bMethodsView=AkelPad.GetArgValue("MethodsView", true);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var hWndHelpDlg=0;
var aChmFile=[];
var aChmItem=[];
var aExt2Chm=[];
var pChmFileDef="";
var pFile;
var pExt;
var pKeyword="";
var pScriptsDir=AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/).toLowerCase();
var nSelStart;
var nSelEnd;
var nWordBegin=0;
var nWordEnd=0;
var pCheckLeft;
var nTimeOut;
var bClosed=false;
var i;

if (hWndEdit)
{
  //Fill aExt2Chm
  if (aChmFile=pChmFile.split("|"))
  {
    for (i=0; i < aChmFile.length; ++i)
    {
      if ((aChmItem=aChmFile[i].split(":")) && aChmItem.length >= 2)
      {
        pExt=trim(aChmItem[0]).toLowerCase();
        aExt2Chm[pExt]=trim(aChmItem[1]);
      }
      else if (!pChmFileDef)
      {
        pChmFileDef=trim(aChmFile[i]);
      }
    }
  }

  pExt=AkelPad.GetFilePath(AkelPad.GetEditFile(0), 4 /*CPF_FILEEXT*/).toLowerCase();
  if (aExt2Chm[pExt])
    pFile=aExt2Chm[pExt];
  else if (pChmFileDef)
    pFile=pChmFileDef;
  else
  {
    AkelPad.MessageBox(hMainWnd, GetLangString(0).replace(/%s/, pExt), WScript.ScriptName, 16 /*MB_ICONERROR*/);
    WScript.Quit();
  }
  pFile=pChmPath + "\\" + pFile;

  if (!IsFileExist(pFile))
  {
    AkelPad.MessageBox(hMainWnd, GetLangString(1).replace(/%s/, pFile), WScript.ScriptName, 16 /*MB_ICONERROR*/);
    WScript.Quit();
  }

  //Keyword
  nSelStart=AkelPad.GetSelStart();
  nSelEnd=AkelPad.GetSelEnd();

  if (nSelStart == nSelEnd)
  {
    //Select word under caret
    nWordBegin=AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 0 /*WB_LEFT*/, nSelStart);
    nWordEnd=AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 7 /*WB_RIGHTBREAK*/, nWordBegin);
    if (nWordEnd > nSelStart)
      pKeyword=AkelPad.GetTextRange(nWordBegin, nWordEnd);
  }
  else pKeyword=AkelPad.GetTextRange(nSelStart, nSelEnd);

  //File into scripts directory
  if (bMethodsView && AkelPad.GetEditFile(0).substr(0, pScriptsDir.length).toLowerCase() == pScriptsDir && IsFileExist(pScriptsDir + "\\AkelPadMethodsView.js"))
  {
    for (pCheckLeft=pKeyword;;)
    {
      if (pCheckLeft.substr(0, 8).toLowerCase() == "akelpad.")
      {
        AkelPad.Call("Scripts::Main", 1, "AkelPadMethodsView.js");
        WScript.Quit();
      }
      else if (pCheckLeft == pKeyword)
      {
        if (nWordEnd)
        {
          if (nWordBegin - 8 >= 0)
          {
            pCheckLeft=AkelPad.GetTextRange(nWordBegin - 8, nWordEnd);
            continue;
          }
        }
        else
        {
          if (nSelStart - 8 >= 0)
          {
            pCheckLeft=AkelPad.GetTextRange(nSelStart - 8, nSelEnd);
            continue;
          }
        }
      }
      break;
    }
  }

  //Show help
  ChmKeyword(pFile, pKeyword);
}

//Functions
function ChmKeyword(pFile, pKeyword)
{
  var hModule;
  var lpKeywordBuffer;
  var lpStructure;
  var hWndHelpList=0;
  var hWndHelpChild;
  var hWndHelpFocus;
  var dwCurThreadID;
  var dwHelpThreadID;
  var hHook;
  var hMutex;

  //Load library manually to prevent hhctrl.ocx unload after HtmlHelp call
  if (!(hModule=oSys.Call("kernel32::GetModuleHandle" + _TCHAR, "hhctrl.ocx")))
    hModule=oSys.Call("kernel32::LoadLibrary" + _TCHAR, "hhctrl.ocx");

  if (hModule)
  {
    if (lpKeywordBuffer=AkelPad.MemAlloc(256 * _TSIZE))
    {
      AkelPad.MemCopy(lpKeywordBuffer, pKeyword.substr(0, 255), _TSTR);

      if (lpStructure=AkelPad.MemAlloc(_X64?56:32 /*sizeof(HH_AKLINK)*/))
      {
        //Fill structure
        AkelPad.MemCopy(_PtrAdd(lpStructure, 0) /*offsetof(HH_AKLINK, cbStruct)*/, _X64?56:32, 3 /*DT_DWORD*/);
        AkelPad.MemCopy(_PtrAdd(lpStructure, _X64?8:8) /*offsetof(HH_AKLINK, pszKeywords)*/, lpKeywordBuffer, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(_PtrAdd(lpStructure, _X64?48:28) /*offsetof(HH_AKLINK, fIndexOnFail)*/, true, 3 /*DT_DWORD*/);

        hWndHelpDlg=oSys.Call("hhctrl.ocx::HtmlHelp" + _TCHAR, oSys.Call("user32::GetDesktopWindow"), pFile, 0xD /*HH_KEYWORD_LOOKUP*/, lpStructure);

        //Send VK_RETURN
        if (hWndHelpDlg)
        {
          dwCurThreadID=oSys.Call("kernel32::GetCurrentThreadId");
          dwHelpThreadID=oSys.Call("user32::GetWindowThreadProcessId", hWndHelpDlg, 0);

          if (pKeyword)
          {
            if (oSys.Call("user32::AttachThreadInput", dwCurThreadID, dwHelpThreadID, true))
            {
              hWndHelpFocus=oSys.Call("user32::GetFocus");

              if (oSys.Call("user32::GetWindowTextLength" + _TCHAR, hWndHelpFocus))
              {
                AkelPad.SendMessage(hWndHelpFocus, 0x0100 /*WM_KEYDOWN*/, 0x0D /*VK_RETURN*/, 0x011C001);
                AkelPad.SendMessage(hWndHelpFocus, 0x0101 /*WM_KEYUP*/, 0x0D /*VK_RETURN*/, 0xC11C001);
              }
              else oSys.Call("user32::SetWindowText" + _TCHAR, hWndHelpFocus, lpKeywordBuffer);

              oSys.Call("user32::AttachThreadInput", dwCurThreadID, dwHelpThreadID, false);
            }
          }

          if (bMaximize)
          {
            //Maximize CHM window
            oSys.Call("user32::ShowWindow", hWndHelpDlg, 3 /*SW_MAXIMIZE*/);
          }
          if (bCatchEsc)
          {
            if (hMutex=oSys.Call("kernel32::CreateEvent" + _TCHAR, 0, 0, 0, WScript.ScriptName))
            {
              //Allow WindowSubClass and ThreadHook only for single script
              if (oSys.GetLastError() != 183 /*ERROR_ALREADY_EXISTS*/)
              {
                //Catch WM_CLOSE
                if (AkelPad.WindowSubClass(hWndHelpDlg, SubClassCallback, 2 /*WM_DESTROY*/))
                {
                  //Catch VK_ESCAPE
                  if (hHook=AkelPad.ThreadHook(3 /*WH_GETMESSAGE*/, HookCallback, dwHelpThreadID))
                  {
                    //Allow other scripts running
                    AkelPad.ScriptNoMutex();

                    //Message loop
                    AkelPad.WindowGetMessage();

                    if (!bClosed)
                    {
                      //Unexpected leaving loop (could be caused by program quiting)
                      AkelPad.SendMessage(hWndHelpDlg, 16 /*WM_CLOSE*/, 0, 0);
                      bClosed=true;
                    }

                    AkelPad.ThreadUnhook(hHook);
                  }
                  AkelPad.WindowUnsubClass(hWndHelpDlg);
                }
              }
              oSys.Call("kernel32::CloseHandle", hMutex);
            }
          }
        }
        AkelPad.MemFree(lpStructure);
      }
      AkelPad.MemFree(lpKeywordBuffer);
    }
  }
}

function SubClassCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 2 /*WM_DESTROY*/)
  {
    //Exit message loop
    oSys.Call("user32::PostQuitMessage", 0);
    bClosed=true;
  }
}

function HookCallback(nCode, wParam, lParam)
{
  var uMsg=AkelPad.MemRead(_PtrAdd(lParam, _X64?8:4) /*offsetof(MSG, message)*/, 3 /*DT_DWORD*/);
  var wParam;

  if (uMsg == 0x100 /*WM_KEYDOWN*/)
  {
    wParam=AkelPad.MemRead(_PtrAdd(lParam, _X64?16:8) /*offsetof(MSG, wParam)*/, 2 /*DT_QWORD*/);

    if (wParam == 0x1B /*VK_ESCAPE*/)
    {
      if (oSys.Call("user32::GetForegroundWindow") == hWndHelpDlg)
        AkelPad.SendMessage(hWndHelpDlg, 16 /*WM_CLOSE*/, 0, 0);
    }
  }
}

function IsFileExist(pFile)
{
  if (oSys.Call("kernel32::GetFileAttributes" + _TCHAR, pFile) == -1)
    return false;
  return true;
}

function trim(pStr)
{
  return pStr.replace(/^\s+/, "").replace(/\s+$/, "");
}

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

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \"%s\" \u043D\u0435\u0020\u0430\u0441\u0441\u043E\u0446\u0438\u0438\u0440\u043E\u0432\u0430\u043D\u043E\u0020\u043D\u0438\u0020\u0441\u0020\u043E\u0434\u043D\u0438\u043C\u0020\u0043\u0048\u004D\u0020\u0444\u0430\u0439\u043B\u043E\u043C\u0020\u0438\u0020\u043D\u0435\u0020\u0437\u0430\u0434\u0430\u043D\u0020\u0043\u0048\u004D\u0020\u0444\u0430\u0439\u043B\u0020\u043F\u043E\u0020\u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E\u002E";
    if (nStringID == 1)
      return "\u041D\u0435\u0020\u043D\u0430\u0439\u0434\u0435\u043D\u043E\u003A \"%s\"";
  }
  else
  {
    if (nStringID == 0)
      return "Extension \"%s\" is not associated with any CHM file and default CHM file not specified.";
    if (nStringID == 1)
      return "Missing: \"%s\"";
  }
  return "";
}


- Набор файлов помощи CHM для C/C++, CSS, HTML, VBS, JS, NSIS: скачать (14.5 Mb).
- Файл помощи для PHP.
Last edited by Instructor on Sat Apr 18, 2015 4:14 am, edited 23 times in total.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Win32 Constants Library
Set of constants usable during writing scripts using Win32 system calls.
Includes constants related to such Win32 system libraries
1. Kernel32.js: most often used non-GUI system calls declared in Kernel32.dll and partially in AdvApi32.dll: File/Handle operations, Memory management, Process/Thread management, Registry operations, Resources, Code-page, Language constants
2. User32.js: GUI-related Syscalls: Windows, Controls, Keyboard and Mouse codes(user32.dll)
3. Gdi32.js: Device-Context painting operations(gdi32.dll)
4. Shell32.js: a few constants to interact with Shell (Windows Explorer in most cases) (shell32.dll)
5. Comdlg32.js: constants usable during calling Common Dialog Syscalls (Open/Save file dialog, Color chooser, Print dialog etc) (Comdlg32.dll)
6. Comctl32.js: Common Controls related constants: messages, notification codes, windows class names etc(comctl32.dll)
7. Wsock32.js: a few winsock related constants (wsock32.dll)
Since I have not enough power to test it You always should doublecheck if that or this constant defined correctly. Especially if You know constant You use is result of a series of bitwise operations(and, or, xor, not). Any fixes are welcomed.
Last edited by FeyFre on Sun Jun 29, 2014 10:26 pm, edited 2 times in total.

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

Post by KDJ »

Open selected text in new tab.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9440#p9440
// Version: 2016-11-01
// Author: KDJ
//
// *** Open selected text in new tab ***
//
// Usage:
//   Call("Scripts::Main", 1, "SelectionOpenInTab.js")
//
// Can assign shortcut key, eg: Shift+Alt+N

var sSelText;
var sAlias;

if (AkelPad.GetEditWnd() && AkelPad.IsMDI() && (sSelText = AkelPad.GetSelText()))
{
  sAlias = GetAlias();

  AkelPad.Command(4101 /*IDM_FILE_NEW*/, 1 /*lParam=TRUE*/);
  AkelPad.ReplaceSel(sSelText);

  if (sAlias)
    AkelPad.CallW("Coder::Settings", 6, sAlias);
}

function GetAlias()
{
  var lpAlias = AkelPad.MemAlloc(256 * 2 /*sizeof(wchar_t)*/);
  var sAlias;

  AkelPad.CallW("Coder::Settings", 18, 0, 0, lpAlias, 0);
  sAlias = AkelPad.MemRead(lpAlias, 1 /*DT_UNICODE*/);
  AkelPad.MemFree(lpAlias);

  return sAlias;
}

Last edited by KDJ on Tue Nov 01, 2016 9:40 pm, edited 6 times in total.

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

Post by KDJ »

Select entire columns or duplicate selected columns.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9448#p9448
// Version: 2015-01-06
// Author: KDJ
//
// *** Select/duplicate entire columns ***
//
// Usage:
//   Call("Scripts::Main", 1, "ColumnsDuplicateSelect.js"[, "Action"])
//
// Action:
//   0 - select entire columns (default)
//   2 - duplicate columns
//
// Can assign shortcut keys, eg: Ctrl+Shift+C, Ctrl+Shift+D

var hEditWnd = AkelPad.GetEditWnd();
var nAction;

if (! hEditWnd)
  WScript.Quit();
if (WScript.Arguments.length)
  nAction = WScript.Arguments(0);
if (nAction != 2)
  nAction = 0;

var DT_QWORD             = 2;
var DT_DWORD             = 3;
var AEGI_FIRSTSELCHAR    = 3;
var AEGI_LASTSELCHAR     = 4;
var AEGL_LINEUNWRAPCOUNT = 11;
var AESELT_COLUMNON      = 0x1;
var AEM_GETSEL           = 3125;
var AEM_SETSEL           = 3126;
var AEM_GETLINENUMBER    = 3129;
var AEM_GETINDEX         = 3130;
var AEM_INDEXUPDATE      = 3132;
var AEM_GETWORDWRAP      = 3241;
var IDM_VIEW_WORDWRAP    = 4209;

var oSys       = AkelPad.SystemFunction();
var nWordWrap  = SendMessage(hEditWnd, AEM_GETWORDWRAP, 0, 0);
var lpFirstC   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpLastC    = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpCaret    = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpSelect   = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
var lpSelect1  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
var lpBegSel   = lpSelect;
var lpEndSel   = _PtrAdd(lpSelect, _X64 ? 24 : 12);
var lpSelFlag  = _PtrAdd(lpSelect, _X64 ? 48 : 24);
var lpBegSel1  = lpSelect1;
var lpEndSel1  = _PtrAdd(lpSelect1, _X64 ? 24 : 12);
var lpSelFlag1 = _PtrAdd(lpSelect1, _X64 ? 48 : 24);
var nLastLine  = SendMessage(hEditWnd, AEM_GETLINENUMBER, AEGL_LINEUNWRAPCOUNT, 0) - 1;
var sSelTxt;

if (nWordWrap)
  AkelPad.Command(IDM_VIEW_WORDWRAP);

SendMessage(hEditWnd, AEM_GETINDEX, AEGI_FIRSTSELCHAR, lpFirstC);
SendMessage(hEditWnd, AEM_GETINDEX, AEGI_LASTSELCHAR,  lpLastC);
SendMessage(hEditWnd, AEM_GETSEL, lpCaret, lpSelect);

ReplaceCharIndex(lpBegSel, nLastLine, AkelPad.MemRead(_PtrAdd(lpFirstC, _X64 ? 16 : 8), DT_DWORD));
ReplaceCharIndex(lpEndSel, 0,         AkelPad.MemRead(_PtrAdd(lpLastC,  _X64 ? 16 : 8), DT_DWORD));
CopyCharIndex(lpCaret, lpEndSel);

AkelPad.MemCopy(lpSelFlag, AESELT_COLUMNON, DT_DWORD);

SendMessage(hEditWnd, AEM_SETSEL, lpCaret, lpSelect);

if (nAction == 2)
{
  sSelTxt = AkelPad.GetSelText(1 /*\r*/);

  ReplaceCharIndex(lpBegSel1, 0, AkelPad.MemRead(_PtrAdd(lpLastC, _X64 ? 16 : 8), DT_DWORD));
  ReplaceCharIndex(lpEndSel1, 0, AkelPad.MemRead(_PtrAdd(lpLastC, _X64 ? 16 : 8), DT_DWORD));
  AkelPad.MemCopy(lpSelFlag1, AESELT_COLUMNON, DT_DWORD);

  SetRedraw(hEditWnd, false);
  SendMessage(hEditWnd, AEM_SETSEL, 0, lpSelect1);
  AkelPad.ReplaceSel(sSelTxt);

  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpBegSel);
  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpEndSel);
  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpCaret);
  SendMessage(hEditWnd, AEM_SETSEL, lpCaret, lpSelect);
  SetRedraw(hEditWnd, true);
}

AkelPad.MemFree(lpFirstC);
AkelPad.MemFree(lpLastC);
AkelPad.MemFree(lpCaret);
AkelPad.MemFree(lpSelect);
AkelPad.MemFree(lpSelect1);

if (nWordWrap)
  AkelPad.Command(IDM_VIEW_WORDWRAP);

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

function CopyCharIndex(lpToIndex, lpFromIndex)
{
  AkelPad.MemCopy(lpToIndex, AkelPad.MemRead(lpFromIndex, DT_DWORD), DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpToIndex, _X64 ?  8 : 4), AkelPad.MemRead(_PtrAdd(lpFromIndex, _X64 ?  8 : 4), DT_QWORD), DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpToIndex, _X64 ? 16 : 8), AkelPad.MemRead(_PtrAdd(lpFromIndex, _X64 ? 16 : 8), DT_DWORD), DT_DWORD);
}

function ReplaceCharIndex(lpIndex, nRow, nCol) /*if nRow or nCol == -1, no change*/
{
  if (nRow > -1)
    AkelPad.MemCopy(lpIndex, nRow, DT_DWORD);
  if (nCol > -1)
    AkelPad.MemCopy(_PtrAdd(lpIndex, _X64 ? 16 : 8), nCol, DT_DWORD);

  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpIndex);
}

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

Last edited by KDJ on Tue Jan 06, 2015 6:58 pm, edited 4 times in total.

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

Post by KDJ »

Replace text in selected column.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9470#p9470
// Version: 2015-09-23
// Author: KDJ
//
// *** Replace text in selected column ***
//
// Usage:
//   Call("Scripts::Main", 1, "ColumnsReplace.js")
//
// Can assign shortcut key, eg: Shift+Alt+Insert
//
// Note:
//   This script should be saved in Unicode format

GetLangStrins();

var DT_DWORD          = 3;
var AEGI_FIRSTSELCHAR = 3;
var AEGI_LASTSELCHAR  = 4;
var AEM_GETSEL        = 3125;
var AEM_SETSEL        = 3126;
var AEM_GETCOLUMNSEL  = 3127;
var AEM_GETINDEX      = 3130;
var AEM_INDEXUPDATE   = 3132;
var AEM_INDEXCOMPARE  = 3133;

var hEditWnd = AkelPad.GetEditWnd();

if (! hEditWnd)
  WScript.Quit();

if (AkelPad.GetEditReadOnly(hEditWnd))
{
  AkelPad.MessageBox(hEditWnd, sTxtReadOnly, sTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
  WScript.Quit();
}

if (! SendMessage(hEditWnd, AEM_GETCOLUMNSEL, 0, 0))
{
  AkelPad.MessageBox(hEditWnd, sTxtNoColSel, sTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
  WScript.Quit();
}

var lpFirstC = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpCaret  = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpSelect = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
var lpBegSel = lpSelect;
var lpEndSel = _PtrAdd(lpSelect, _X64 ? 24 : 12);
var nCarPos;
var aSelText;
var sText;
var nShiftCol;
var i;

SendMessage(hEditWnd, AEM_GETINDEX, AEGI_FIRSTSELCHAR, lpFirstC);
SendMessage(hEditWnd, AEM_GETSEL, lpCaret, lpSelect);

//nCarPos   0   1
//          3   2
if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpBegSel, lpFirstC) == 0)
{
  if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpCaret, lpBegSel) == 0)
    nCarPos = 0;
  else
    nCarPos = 2;
}
else
{
  if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpCaret, lpEndSel) == 0)
    nCarPos = 3;
  else
    nCarPos = 1;
}

aSelText = AkelPad.GetSelText(1 /*\r*/).split("\r");

if (nCarPos < 2)
  sText = aSelText[0];
else
  sText = aSelText[aSelText.length - 1];

sText = AkelPad.InputBox(hEditWnd, sTxtCaption, sTxtLabel, sText);

if (sText)
{
  nShiftCol = sText.length - aSelText[0].length;

  for (i = 0; i < aSelText.length; ++i)
    aSelText[i] = sText;

  sText = aSelText.join("\r");
  AkelPad.ReplaceSel(sText);

  if (nCarPos == 0)
    ShiftCharIndex(lpEndSel, nShiftCol);
  else if (nCarPos == 1)
  {
    ShiftCharIndex(lpBegSel, nShiftCol);
    ShiftCharIndex(lpCaret, nShiftCol);
  }
  else if (nCarPos == 2)
  {
    ShiftCharIndex(lpEndSel, nShiftCol);
    ShiftCharIndex(lpCaret, nShiftCol);
  }
  else
    ShiftCharIndex(lpBegSel, nShiftCol);

  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpBegSel);
  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpEndSel);
  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpCaret);

  SendMessage(hEditWnd, AEM_SETSEL, lpCaret, lpSelect);
}

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

function ShiftCharIndex(lpIndex, nCol)
{
  AkelPad.MemCopy(_PtrAdd(lpIndex, _X64 ? 16 : 8), AkelPad.MemRead(_PtrAdd(lpIndex, _X64 ? 16 : 8), DT_DWORD) + nCol, DT_DWORD);
}

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

function GetLangStrins()
{
  if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1045 /*Polish*/)
  {
    sTxtCaption  = 'Zamiana tekstu w kolumnie';
    sTxtReadOnly = 'Ustawiony jest tryb "Tylko do odczytu".';
    sTxtNoColSel = 'Brak zaznaczenia kolumnowego.';
    sTxtLabel    = 'Podaj tekst do zamiany:';
  }
  else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/)
  {
    //translated by yozhic
    sTxtCaption  = 'Замена текста в выделенном блоке';
    sTxtReadOnly = 'Включен режим "Только для чтения".';
    sTxtNoColSel = 'Отсутствует блочное выделение.';
    sTxtLabel    = 'Введите текст для замены:';
  
  }
  else
  {
    sTxtCaption  = 'Replace text in selected column';
    sTxtReadOnly = '"Read only" mode is set.';
    sTxtNoColSel = 'There is no columnar selection.';
    sTxtLabel    = 'Input text to replace:';
  }
}

Last edited by KDJ on Wed Sep 23, 2015 6:27 pm, edited 8 times in total.

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

Post by KDJ »

Sum numbers (expressions) in selected column.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9472#p9472
// Version: 2015-01-07
// Author: KDJ
//
// *** Sum numbers/expressions in selected column ***
//
// Usage:
//   Call("Scripts::Main", 1, "ColumnsSum.js")
//
// Remarks:
//   Dialog box can be moved using keys: Shift+Alt+C, Right, Left, Down, Up, End, Home, PgDown, PgUp.
//   Can assign shortcut key, eg: Shift+Alt+S

var oSys = AkelPad.SystemFunction();

if (oSys.Call("kernel32::GetUserDefaultLangID") == 0x0415) //Polish
{
  var pTxtCaption   = "Sumowanie w kolumnie";
  var pTxtNoColSel  = "Brak zaznaczenia pionowego.";
  var pTxtBadSep    = "Separator nie moe być literą ani cyfrą.";
  var pTxtEqualSep  = "Separatory nie mogą być takie same.";
  var pTxtBadRound  = "Zaokrąglenie musi być liczbą z zakresu od -9 do 20.";
  var pTxtSum       = "Suma:";
  var pTxtMin       = "Minimum:";
  var pTxtMax       = "Maksimum:";
  var pTxtAve       = "Średnia:";
  var pTxtCountA    = "Licznik razem:";
  var pTxtCountN    = "- liczby:";
  var pTxtCountT    = "- tekst:";
  var pTxtCountE    = "- puste:";
  var pTxtOptions   = "Opcje";
  var pTxtDecSep    = "Separator dziesiętny:";
  var pTxtGroSep    = "Separator tysięcy:";
  var pTxtRound     = "Zaokrąglij do:";
  var pTxtTextAs0   = "Traktuj tekst jak liczbę 0";
  var pTxtEmptyAs0  = "Traktuj puste jak liczbę 0";
  var pTxtCalculate = "Sumuj";
  var pTxtClose     = "Zamknij";
}
else
{
  var pTxtCaption   = "Sum in the column";
  var pTxtNoColSel  = "There is no columnar selection.";
  var pTxtBadSep    = "Separator can not be letter or digit.";
  var pTxtEqualSep  = "Separators can not be the same.";
  var pTxtBadRound  = "Round must be a number in the range from -9 to 20.";
  var pTxtSum       = "Sum:";
  var pTxtMin       = "Minimum:";
  var pTxtMax       = "Maximum:";
  var pTxtAve       = "Average:";
  var pTxtCountA    = "Count all:";
  var pTxtCountN    = "- numbers:";
  var pTxtCountT    = "- text:";
  var pTxtCountE    = "- empty:";
  var pTxtOptions   = "Options";
  var pTxtDecSep    = "Decimal separator:";
  var pTxtGroSep    = "Group separator:";
  var pTxtRound     = "Round to:";
  var pTxtTextAs0   = "Treat text as a zero";
  var pTxtEmptyAs0  = "Treat empty as a zero";
  var pTxtCalculate = "Calculate";
  var pTxtClose     = "Close";
}

var DT_DWORD = 3;

var hMainWnd     = AkelPad.GetMainWnd();
var hEditWnd     = AkelPad.GetEditWnd();
var hGuiFont     = oSys.Call("gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var pScriptName  = WScript.ScriptName;
var hInstanceDLL = AkelPad.GetInstanceDll();
var bColSel      = AkelPad.SendMessage(hEditWnd, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);

var pDecSep   = ".";
var pGroSep   = "";
var pRound    = "2";
var bTextAs0  = 0;
var bEmptyAs0 = 0;
var pSum;
var pMin;
var pMax;
var pAve;
var pCountA;
var pCountN;
var pCountE;
var pCountT;
var hWndDlg;
var lpBuffer;
var nWndPosX;
var nWndPosY;

ReadWriteIni(0);

var aWnd        = [];
var IDRESULT    = 1000;
var IDTXTSUM    = 1001;
var IDTXTMIN    = 1002;
var IDTXTMAX    = 1003;
var IDTXTAVE    = 1004;
var IDTXTCOUNTA = 1005;
var IDTXTCOUNTN = 1006;
var IDTXTCOUNTT = 1007;
var IDTXTCOUNTE = 1008;
var IDSUM       = 1009;
var IDMIN       = 1010;
var IDMAX       = 1011;
var IDAVE       = 1012;
var IDCOUNTA    = 1013;
var IDCOUNTN    = 1014;
var IDCOUNTT    = 1015;
var IDCOUNTE    = 1016;
var IDOPTIONS   = 1017;
var IDTXTDECSEP = 1018;
var IDTXTGROSEP = 1019;
var IDTXTROUND  = 1020;
var IDDECSEP    = 1021;
var IDGROSEP    = 1022;
var IDROUND     = 1023;
var IDTEXTAS0   = 1024;
var IDEMPTYAS0  = 1025;
var IDCALCULATE = 1026;
var IDCLOSE     = 1027;

var WNDTYPE  = 0;
var WND      = 1;
var WNDEXSTY = 2;
var WNDSTY   = 3;
var WNDX     = 4;
var WNDY     = 5;
var WNDW     = 6;
var WNDH     = 7;
var WNDTXT   = 8;

//0x50000000 - WS_VISIBLE|WS_CHILD
//0x50000007 - WS_VISIBLE|WS_CHILD|BS_GROUPBOX
//0x50010000 - WS_VISIBLE|WS_CHILD|WS_TABSTOP
//0x50010001 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
//0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50010080 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL
//0x50010880 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL|ES_READONLY
//Windows              WNDTYPE, WND,WNDEXSTY,     WNDSTY,WNDX,WNDY,WNDW,WNDH, WNDTXT
aWnd[IDRESULT   ] = ["BUTTON",   0,       0, 0x50000007,  10,   5, 200, 220, ""];
aWnd[IDTXTSUM   ] = ["STATIC",   0,       0, 0x50000000,  20,  20, 100,  13, pTxtSum];
aWnd[IDTXTMIN   ] = ["STATIC",   0,       0, 0x50000000,  20,  45, 100,  13, pTxtMin];
aWnd[IDTXTMAX   ] = ["STATIC",   0,       0, 0x50000000,  20,  70, 100,  13, pTxtMax];
aWnd[IDTXTAVE   ] = ["STATIC",   0,       0, 0x50000000,  20,  95, 100,  13, pTxtAve];
aWnd[IDTXTCOUNTA] = ["STATIC",   0,       0, 0x50000000,  20, 120, 100,  13, pTxtCountA];
aWnd[IDTXTCOUNTN] = ["STATIC",   0,       0, 0x50000000,  40, 145, 100,  13, pTxtCountN];
aWnd[IDTXTCOUNTT] = ["STATIC",   0,       0, 0x50000000,  40, 170, 100,  13, pTxtCountT];
aWnd[IDTXTCOUNTE] = ["STATIC",   0,       0, 0x50000000,  40, 195, 100,  13, pTxtCountE];
aWnd[IDSUM      ] = ["EDIT",     0,   0x200, 0x50010880,  90,  20, 110,  20, ""];
aWnd[IDMIN      ] = ["EDIT",     0,   0x200, 0x50010880,  90,  45, 110,  20, ""];
aWnd[IDMAX      ] = ["EDIT",     0,   0x200, 0x50010880,  90,  70, 110,  20, ""];
aWnd[IDAVE      ] = ["EDIT",     0,   0x200, 0x50010880,  90,  95, 110,  20, ""];
aWnd[IDCOUNTA   ] = ["EDIT",     0,   0x200, 0x50010880,  90, 120,  80,  20, ""];
aWnd[IDCOUNTN   ] = ["EDIT",     0,   0x200, 0x50010880, 100, 145,  80,  20, ""];
aWnd[IDCOUNTT   ] = ["EDIT",     0,   0x200, 0x50010880, 100, 170,  80,  20, ""];
aWnd[IDCOUNTE   ] = ["EDIT",     0,   0x200, 0x50010880, 100, 195,  80,  20, ""];
aWnd[IDOPTIONS  ] = ["BUTTON",   0,       0, 0x50000007, 220,  30, 153, 165, pTxtOptions];
aWnd[IDTXTDECSEP] = ["STATIC",   0,       0, 0x50000000, 230,  50, 100,  13, pTxtDecSep];
aWnd[IDTXTGROSEP] = ["STATIC",   0,       0, 0x50000000, 230,  75, 100,  13, pTxtGroSep];
aWnd[IDTXTROUND ] = ["STATIC",   0,       0, 0x50000000, 230, 100, 100,  13, pTxtRound];
aWnd[IDDECSEP   ] = ["EDIT",     0,   0x200, 0x50010080, 342,  50,  20,  20, pDecSep];
aWnd[IDGROSEP   ] = ["EDIT",     0,   0x200, 0x50010080, 342,  75,  20,  20, pGroSep];
aWnd[IDROUND    ] = ["EDIT",     0,   0x200, 0x50010080, 342, 100,  20,  20, pRound];
aWnd[IDTEXTAS0  ] = ["BUTTON",   0,       0, 0x50010003, 230, 145, 140,  16, pTxtTextAs0];
aWnd[IDEMPTYAS0 ] = ["BUTTON",   0,       0, 0x50010003, 230, 170, 140,  16, pTxtEmptyAs0];
aWnd[IDCALCULATE] = ["BUTTON",   0,       0, 0x50010001, 220, 205,  70,  23, pTxtCalculate];
aWnd[IDCLOSE    ] = ["BUTTON",   0,       0, 0x50010000, 305, 205,  70,  23, pTxtClose];

if (hEditWnd)
{
  if (! bColSel)
  {
    AkelPad.MessageBox(hEditWnd, pTxtNoColSel, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    WScript.Quit();
  }

  if (AkelPad.WindowRegisterClass(pScriptName))
  {
    if (lpBuffer = AkelPad.MemAlloc(256 * _TSIZE))
    {
      //Create dialog
      AkelPad.MemCopy(lpBuffer, pScriptName, _TSTR);
      hWndDlg = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                          0,               //dwExStyle
                          lpBuffer,        //lpClassName
                          0,               //lpWindowName
                          0x90CA0000,      //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
                          0,               //x
                          0,               //y
                          390,             //nWidth
                          268,             //nHeight
                          hMainWnd,        //hWndParent
                          0,               //ID
                          hInstanceDLL,    //hInstance
                          DialogCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.
      if (hWndDlg)
      {
        //Disable main window, to make dialog modal
        oSys.Call("user32::EnableWindow", hMainWnd, false);

        //Message loop
        AkelPad.WindowGetMessage();
      }
      AkelPad.MemFree(lpBuffer);
    }
    AkelPad.WindowUnregisterClass(pScriptName);
  }
}

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  var i;
  var nLowParam;

  if (uMsg == 1) //WM_CREATE
  {
    //Dialog caption
    AkelPad.MemCopy(lpBuffer, pTxtCaption, _TSTR);
    oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, lpBuffer);

    //Create windows
    for (i = 1000; i < aWnd.length; ++i)
    {
      AkelPad.MemCopy(lpBuffer, aWnd[i][WNDTYPE], _TSTR);
      aWnd[i][WND] = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                               aWnd[i][WNDEXSTY], //dwExStyle
                               lpBuffer,          //lpClassName
                               0,                 //lpWindowName
                               aWnd[i][WNDSTY],   //dwStyle
                               aWnd[i][WNDX],     //x
                               aWnd[i][WNDY],     //y
                               aWnd[i][WNDW],     //nWidth
                               aWnd[i][WNDH],     //nHeight
                               hWnd,              //hWndParent
                               i,                 //ID
                               hInstanceDLL,      //hInstance
                               0);                //lpParam
      SetWindowFontAndText(aWnd[i][WND], hGuiFont, aWnd[i][WNDTXT]);
    }

    //Check
    if (bTextAs0)
      AkelPad.SendMessage(aWnd[IDTEXTAS0][WND], 241 /*BM_SETCHECK*/, 1 /*BST_CHECKED*/, 0);
    if (bEmptyAs0)
      AkelPad.SendMessage(aWnd[IDEMPTYAS0][WND], 241 /*BM_SETCHECK*/, 1 /*BST_CHECKED*/, 0);

    //Set limit edit text
    AkelPad.SendMessage(aWnd[IDDECSEP][WND], 197 /*EM_LIMITTEXT*/, 1, 0);
    AkelPad.SendMessage(aWnd[IDGROSEP][WND], 197 /*EM_LIMITTEXT*/, 1, 0);
    AkelPad.SendMessage(aWnd[IDROUND][WND],  197 /*EM_LIMITTEXT*/, 2, 0);

    Calculate();

    //Select text
    AkelPad.SendMessage(aWnd[IDSUM][WND], 177 /*EM_SETSEL*/, 0, -1);

    //Set window position
    if ((nWndPosX == undefined) || (nWndPosY == undefined))
      MoveWindow(hMainWnd, hWnd, "RT");
    else
      MoveWindow(hMainWnd, hWnd, [nWndPosX, nWndPosY]);
  }

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("user32::SetFocus", aWnd[IDSUM][WND]);

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 13)  //VK_RETURN
      oSys.Call("user32::PostMessage" + _TCHAR, hWndDlg, 273 /*WM_COMMAND*/, IDCALCULATE, 0);
    else if (wParam == 27)  //VK_ESCAPE
      oSys.Call("user32::PostMessage" + _TCHAR, hWndDlg, 273 /*WM_COMMAND*/, IDCLOSE, 0);
  }

  else if ((uMsg == 260) /*WM_SYSKEYDOWN*/ &&
           (oSys.Call("user32::GetAsyncKeyState", 0xA0 /*VK_LSHIFT*/)))
  {
    if (wParam == 0x27) //VK_RIGHT
      MoveWindow(hMainWnd, hWnd, "R");
    else if (wParam == 0x25) //VK_LEFT
      MoveWindow(hMainWnd, hWnd, "L");
    else if (wParam == 0x28) //VK_DOWN
      MoveWindow(hMainWnd, hWnd, "D");
    else if (wParam == 0x26) //VK_UP
      MoveWindow(hMainWnd, hWnd, "U");
    else if (wParam == 0x23) //VK_END
      MoveWindow(hMainWnd, hWnd, "E");
    else if (wParam == 0x24) //VK_HOME
      MoveWindow(hMainWnd, hWnd, "H");
    else if (wParam == 0x22) //VK_NEXT
      MoveWindow(hMainWnd, hWnd, "B");
    else if (wParam == 0x21) //VK_PRIOR
      MoveWindow(hMainWnd, hWnd, "T");
  }

  else if (uMsg == 273) //WM_COMMAND
  {
    nLowParam = LoWord(wParam);

    if (nLowParam == IDTEXTAS0)
      bTextAs0 = AkelPad.SendMessage(aWnd[IDTEXTAS0][WND],  240 /*BM_GETCHECK*/, 0, 0);

    else if (nLowParam == IDEMPTYAS0)
      bEmptyAs0 = AkelPad.SendMessage(aWnd[IDEMPTYAS0][WND], 240 /*BM_GETCHECK*/, 0, 0);

    else if (nLowParam == IDCALCULATE)
    {
      //pDecSep
      oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[IDDECSEP][WND], lpBuffer, 256);
      pDecSep = AkelPad.MemRead(lpBuffer, _TSTR);
      if (! pDecSep)
      {
        pDecSep = ".";
        SetWindowFontAndText(aWnd[IDDECSEP][WND], hGuiFont, pDecSep);
      }

      //pGroSep
      oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[IDGROSEP][WND], lpBuffer, 256);
      pGroSep = AkelPad.MemRead(lpBuffer, _TSTR);

      //pRound
      oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[IDROUND][WND], lpBuffer, 256);
      pRound = AkelPad.MemRead(lpBuffer, _TSTR);

      if (/[0-9a-zA-Z]/.test(pDecSep))
      {
        AkelPad.MessageBox(hWnd, pTxtBadSep, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
        oSys.Call("user32::SetFocus", aWnd[IDDECSEP][WND]);
      }
      else if (/[0-9a-zA-Z]/.test(pGroSep))
      {
        AkelPad.MessageBox(hWnd, pTxtBadSep, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
        oSys.Call("user32::SetFocus", aWnd[IDGROSEP][WND]);
      }
      else if (pDecSep && (pDecSep == pGroSep))
      {
        AkelPad.MessageBox(hWnd, pTxtEqualSep, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
        oSys.Call("user32::SetFocus", aWnd[IDDECSEP][WND]);
      }
      else if (pRound && (isNaN(pRound) || (pRound > 20)))
      {
        AkelPad.MessageBox(hWnd, pTxtBadRound, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
        oSys.Call("user32::SetFocus", aWnd[IDROUND][WND]);
      }
      else
        Calculate();
    }

    else if (nLowParam == IDCLOSE)
      oSys.Call("user32::PostMessage" + _TCHAR, hWndDlg, 16 /*WM_CLOSE*/, 0, 0);

  }
  else if (uMsg == 16) //WM_CLOSE
  {
    ReadWriteIni(1);

    //Enable main window
    oSys.Call("user32::EnableWindow", hMainWnd, true);
    //Destroy dialog
    oSys.Call("user32::DestroyWindow", hWnd);
  }

  else if (uMsg == 2) //WM_DESTROY
  {
    //Exit message loop
    oSys.Call("user32::PostQuitMessage", 0);
  }

  else
  {
    if (oSys.Call("user32::GetFocus") != aWnd[IDCLOSE][WND])
      oSys.Call("user32::DefDlgProc" + _TCHAR, hWnd, 1025 /*DM_SETDEFID*/, IDCALCULATE, 0);
  }

  return 0;
}

function SetWindowFontAndText(hWnd, hFont, pText)
{
  AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
  oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, pText);
}

function MoveWindow(hWndParent, hWnd, Action)
{
  var rcWndParent;
  var rcWnd;
  var nX;
  var nY;

  if (! hWndParent)
    hWndParent=oSys.Call("user32::GetDesktopWindow");

  rcWndParent = GetWindowPos(hWndParent);
  rcWnd       = GetWindowPos(hWnd);

  nX = rcWnd.left;
  nY = rcWnd.top;

  if (Action == "R") //Move right
    nX = rcWnd.left + ((rcWnd.left < rcWndParent.right - 50) ? 20: 0);
  else if (Action == "L") //Move left
    nX = rcWnd.left - ((rcWnd.right > rcWndParent.left + 50) ? 20: 0);
  else if (Action == "D") //Move down
    nY = rcWnd.top + ((rcWnd.top < rcWndParent.bottom - 50) ? 20: 0);
  else if (Action == "U") //Move up
    nY = rcWnd.top - ((rcWnd.bottom > rcWndParent.top + 50) ? 20: 0);
  else if (Action == "E") //Move end (right)
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
  else if (Action == "H") //Move home (left)
    nX = rcWnd.left + (rcWndParent.left - rcWnd.left);
  else if (Action == "B") //Move bottom
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  else if (Action == "T") //Move top
    nY = rcWnd.top + (rcWndParent.top - rcWnd.top);
  else if (Action == "C") //Center window
  {
    nX = rcWndParent.left + ((rcWndParent.right  - rcWndParent.left) / 2 - (rcWnd.right  - rcWnd.left) / 2);
    nY = rcWndParent.top  + ((rcWndParent.bottom - rcWndParent.top)  / 2 - (rcWnd.bottom - rcWnd.top)  / 2);
  }
  else if (Action == "LT") //Move left top
  {
    nX = rcWndParent.left;
    nY = rcWndParent.top;
  }
  else if (Action == "RT") //Move right top
  {
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
    nY = rcWndParent.top;
  }
  else if (Action == "LB") //Move left bottom
  {
    nX = rcWndParent.left;
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  }
  else if (Action == "RB") //Move right bottom
  {
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  }
  else
  {
    nX = Action[0];
    nY = Action[1];
  }

  oSys.Call("user32::SetWindowPos", hWnd, 0, nX, nY, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
}

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

  oSys.Call("user32::GetWindowRect", hWnd, lpRect);

  rcRect.left   = AkelPad.MemRead(_PtrAdd(lpRect,  0), DT_DWORD);
  rcRect.top    = AkelPad.MemRead(_PtrAdd(lpRect,  4), DT_DWORD);
  rcRect.right  = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD);
  rcRect.bottom = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD);
  AkelPad.MemFree(lpRect);

  return rcRect;
}

function LoWord(nParam)
{
  return (nParam & 0xffff);
}

function ReadWriteIni(bWrite)
{
  var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
  var pIniName = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var rcWnd;
  var nError;
  var oFile;
  var pTxt;

  if (bWrite)
  {
    rcWnd = GetWindowPos(hWndDlg);

    oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[IDDECSEP][WND], lpBuffer, 256);
    pDecSep = AkelPad.MemRead(lpBuffer, _TSTR);
    oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[IDGROSEP][WND], lpBuffer, 256);
    pGroSep = AkelPad.MemRead(lpBuffer, _TSTR);
    oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[IDROUND][WND], lpBuffer, 256);
    pRound = AkelPad.MemRead(lpBuffer, _TSTR);

    pTxt = 'nWndPosX='  + rcWnd.left + ';\r\n' +
           'nWndPosY='  + rcWnd.top  + ';\r\n' +
           'pDecSep="'  + pDecSep.replace(/[\\"]/g, "\\$&") + '";\r\n' + 
           'pGroSep="'  + pGroSep.replace(/[\\"]/g, "\\$&") + '";\r\n' +
           'pRound="'   + pRound    + '";\r\n' +
           'bTextAs0='  + bTextAs0  + ';\r\n' + 
           'bEmptyAs0=' + bEmptyAs0 + ';';

    oFile = oFSO.OpenTextFile(pIniName, 2, true, 0);
    oFile.Write(pTxt);
    oFile.Close();
  }

  else if ((! bWrite) && (oFSO.FileExists(pIniName)))
  {
    try
    {
      eval(AkelPad.ReadFile(pIniName));
    }
    catch (nError)
    {
    }
  }
}

function Calculate()
{
  var pSelTxt   = AkelPad.GetSelText(1 /*\r*/);
  var nCountN   = 0;
  var nCountE   = 0;
  var nCountT   = 0;
  var nSum      = 0;
  var nMin      = "";
  var nMax      = "";
  var nAve      = "";
  var nNum;
  var oPattern;
  var aTxt;
  var nCountA;
  var nCount;
  var nRound;
  var nError;
  var i;

  if (pGroSep)
  {
    oPattern = new RegExp("\\" + pGroSep, "gm");
    pSelTxt  = pSelTxt.replace(oPattern, "");
  }

  oPattern = new RegExp("\\" + pDecSep, "gm");
  pSelTxt  = pSelTxt.replace(oPattern, ".");

  aTxt    = pSelTxt.split("\r");
  nCountA = aTxt.length;

  for (i = 0; i < nCountA; ++i)
  {
    if (/[^ \t]/.test(aTxt[i])) /*no empty*/
    {
      try
      {
        with (Math)
        {
          nNum = eval(aTxt[i]);
          if (isFinite(nNum))
          {
            ++ nCountN;
            if (nMin === "")
            {
              nMin = nNum;
              nMax = nNum;
            }
            else if (nNum < nMin)
              nMin = nNum;
            else if (nNum > nMax)
              nMax = nNum;
          }
          else
          {
            ++ nCountT;
            nNum = 0;
            if (bTextAs0)
            {
              if (nMin === "")
              {
                nMin = nNum;
                nMax = nNum;
              }
              else if (nNum < nMin)
                nMin = nNum;
              else if (nNum > nMax)
                nMax = nNum;
            }
          }
        }
      }
      catch (nError)
      {
        ++ nCountT;
        nNum = 0;
        if (bTextAs0)
        {
          if (nMin === "")
          {
            nMin = nNum;
            nMax = nNum;
          }
          else if (nNum < nMin)
            nMin = nNum;
          else if (nNum > nMax)
            nMax = nNum;
        }
      }
    }
    else
    {
      ++ nCountE;
      nNum = 0;
      if (bEmptyAs0)
      {
        if (nMin === "")
        {
          nMin = nNum;
          nMax = nNum;
        }
        else if (nNum < nMin)
          nMin = nNum;
        else if (nNum > nMax)
          nMax = nNum;
      }
    }
    nSum += nNum;
  }

  if ((nCountN == 0) && (! bTextAs0) && (! bEmptyAs0))
    nSum = "";

  if (nSum !== "")
  {
    nCount = nCountN;
    if (bTextAs0)
      nCount += nCountT;
    if (bEmptyAs0)
      nCount += nCountE;

    nAve = nSum / nCount;
  }

  if ((nSum !== "") && (pRound))
  {
    nRound = parseInt(pRound);  
    nSum   = round2(nSum, nRound);
    nMin   = round2(nMin, nRound);
    nMax   = round2(nMax, nRound);
    nAve   = round2(nAve, nRound);

    if (nRound >= 0)
    {
      nSum = nSum.toFixed(nRound);
      nMin = nMin.toFixed(nRound);
      nMax = nMax.toFixed(nRound);
      nAve = nAve.toFixed(nRound);
    }
  }

  nSum    = nSum.toString().replace(".", pDecSep);
  nMin    = nMin.toString().replace(".", pDecSep);
  nMax    = nMax.toString().replace(".", pDecSep);
  nAve    = nAve.toString().replace(".", pDecSep);
  nCountA = nCountA.toString();
  nCountN = nCountN.toString();
  nCountT = nCountT.toString();
  nCountE = nCountE.toString();

  if (pGroSep)
  {
    nSum    = InsertGroSep(nSum,    pGroSep, pDecSep);
    nMin    = InsertGroSep(nMin,    pGroSep, pDecSep);
    nMax    = InsertGroSep(nMax,    pGroSep, pDecSep);
    nAve    = InsertGroSep(nAve,    pGroSep, pDecSep);
    nCountA = InsertGroSep(nCountA, pGroSep, pDecSep);
    nCountN = InsertGroSep(nCountN, pGroSep, pDecSep);
    nCountT = InsertGroSep(nCountT, pGroSep, pDecSep);
    nCountE = InsertGroSep(nCountE, pGroSep, pDecSep);
  }

  SetWindowFontAndText(aWnd[IDSUM][WND],    hGuiFont, nSum);
  SetWindowFontAndText(aWnd[IDMIN][WND],    hGuiFont, nMin);
  SetWindowFontAndText(aWnd[IDMAX][WND],    hGuiFont, nMax);
  SetWindowFontAndText(aWnd[IDAVE][WND],    hGuiFont, nAve);
  SetWindowFontAndText(aWnd[IDCOUNTA][WND], hGuiFont, nCountA);
  SetWindowFontAndText(aWnd[IDCOUNTN][WND], hGuiFont, nCountN);
  SetWindowFontAndText(aWnd[IDCOUNTT][WND], hGuiFont, nCountT);
  SetWindowFontAndText(aWnd[IDCOUNTE][WND], hGuiFont, nCountE);

  oSys.Call("user32::SetFocus", aWnd[IDSUM][WND]);
}

function round2(nNum, nDec)
{
  return Math.round(nNum * Math.pow(10, nDec))/Math.pow(10, nDec);
}

function InsertGroSep(pNum, pGroSep, pDecSep)
{
  var nInd = pNum.indexOf(pDecSep);
  var pStr = "";
  var pNum1;
  var pNum2;
  var nInt;
  var nRest;
  var i;

  if (nInd == -1)
  {
    pNum1 = pNum;
    pNum2 = "";
  }
  else
  {
    pNum1 = pNum.substr(0, nInd);
    pNum2 = pNum.substr(nInd);
  }

  if (pNum1.length > 3)
  {
    nInt  = Math.floor(pNum1.length / 3);
    nRest = pNum1.length % 3;

    if (nRest > 0)
      pStr = pNum1.substr(0, nRest) + pGroSep;

    for (i = 0; i < nInt; ++i)
      pStr = pStr + pNum1.substr(nRest + i * 3, 3) + (i < nInt - 1 ? pGroSep : "");

    pNum1 = pStr;
  }

  return pNum1 + pNum2;
}

Last edited by KDJ on Wed Jan 07, 2015 8:05 pm, edited 13 times in total.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Call NSIS plugin example.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9530#p9530
// Version: 1.2
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Call NSIS plugin example.
// Description(1049): Пример вызова NSIS плагина.

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

//NSIS
var NSIS_MAX_STRLEN=1024;
var nNsisUnicode=0 /*DT_ANSI*/;
var lpStack=0;

//Get MD5 of file
pushstring(AkelPad.GetAkelDir() + "\\AkelPad.exe");
nsiscall("c:\\Program Files\\NSIS\\Plugins\\md5dll.dll::GetMD5File");
pMD5=popstring();
WScript.Echo(pMD5);


//Functions
function nsiscall(pFunction)
{
  var lppStack;

  if (lppStack=AkelPad.MemAlloc(4 /*DWORD*/))
  {
    AkelPad.MemCopy(lppStack, lpStack, 3 /*DT_DWORD*/);
    oSys.Call(pFunction, hMainWnd, NSIS_MAX_STRLEN, 0, lppStack);
    lpStack=AkelPad.MemRead(lppStack, 3 /*DT_DWORD*/);
    AkelPad.MemFree(lppStack);
  }
}

function pushstring(pString)
{
  var lpTop;

  if (lpTop=oSys.Call("kernel32::GlobalAlloc", 0x40 /*GPTR*/, (nNsisUnicode?NSIS_MAX_STRLEN * 2:NSIS_MAX_STRLEN) + 8 /*sizeof(stack_t)*/))
  {
    AkelPad.MemCopy(_PtrAdd(lpTop, 4) /*stack_t.text*/, pString.substr(0, NSIS_MAX_STRLEN), nNsisUnicode);
    AkelPad.MemCopy(_PtrAdd(lpTop, 0) /*stack_t.next*/, lpStack, 3 /*DT_DWORD*/);
    lpStack=lpTop;
  }
}

function popstring(pString)
{
  var lpTop;
  var pString="";

  if (lpStack)
  {
    lpTop=lpStack;
    pString=AkelPad.MemRead(_PtrAdd(lpTop, 4) /*stack_t.text*/, nNsisUnicode);
    lpStack=AkelPad.MemRead(_PtrAdd(lpTop, 0) /*stack_t.next*/, 3 /*DT_DWORD*/);
    oSys.Call("kernel32::GlobalFree", lpTop);
  }
  return pString;
}
Last edited by Instructor on Sat Apr 18, 2015 4:19 am, edited 5 times in total.

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

Post by KDJ »

Set initial font size from AkelPad.ini or registry.
This feature is built into version 4.5.6 AkelPad as command 4206.

Code: Select all

// Set initial font size from AkelPad.ini or registry - 2010-10-26
//
// Call("Scripts::Main", 1, "FontIniSize.js")
//
// Can assign shortcut key, eg: Ctrl+Num0 or Ctrl+Num/

var hEditWnd = AkelPad.GetEditWnd();
var oSys     = AkelPad.SystemFunction();
var pIniFile = AkelPad.GetAkelDir() + "\\AkelPad.ini";

var pTxtIni     = "";
var pTxtSaveSet = "";
var pTxtFont    = "";
var pTxt        = "";
var lfHeight;
var hDC;
var nDevCap;
var nFontSize;
var i;

if (! hEditWnd)
  WScript.Quit();

pTxtIni     = AkelPad.ReadFile(pIniFile);
pTxtSaveSet = pTxtIni.substr(pTxtIni.indexOf("SaveSettings=") + 13, 1);

//settings in .ini file
if (pTxtSaveSet == "2")
{
  pTxtFont = pTxtIni.substr(pTxtIni.indexOf("Font=") + 5, 8);
  for (i = 6; i >= 0; i -= 2)
    pTxt += pTxtFont.substr(i, 2);

  lfHeight = Number("0x" + pTxt);
}
//settings in registry
else
{
  lfHeight = ReadRegistry();
}

hDC       = oSys.Call("user32::GetDC", hEditWnd);
nDevCap   = oSys.Call("gdi32::GetDeviceCaps" , hDC, 90 /*LOGPIXELSY*/);
nFontSize = -oSys.Call("kernel32::MulDiv", lfHeight, 72, nDevCap);
oSys.Call("user32::ReleaseDC", hEditWnd, hDC); 

if (nFontSize > 0)
  AkelPad.Font("", 0, nFontSize);

//////////////////
function ReadRegistry()
{
  var DT_DWORD          = 3;
  var HKEY_CURRENT_USER = 0x80000001;
  var KEY_QUERY_VALUE   = 0x0001;
  var REG_BINARY        = 3;
  var ERROR_SUCCES      = 0;
  var ERROR_MORE_DATA   = 234;

  var lpSubKey   = MakeString("SOFTWARE\\Akelsoft\\AkelPad\\Options");
  var lpValue    = MakeString("Font");
  var lpKey      = AkelPad.MemAlloc(4);
  var lpType     = AkelPad.MemAlloc(4);
  var lpData     = AkelPad.MemAlloc(28);
  var lpDataSize = AkelPad.MemAlloc(4);
  var lfHeight   = 0;
  var hKey;
  var nError;

  nError = oSys.Call("advapi32::RegOpenKeyEx" + _TCHAR,
             HKEY_CURRENT_USER, // Parent key
             lpSubKey,          // Subkey
             0,                 // Reserved. must be 0
             KEY_QUERY_VALUE,   // Desired access
             lpKey);            // Result key

  if(nError == ERROR_SUCCES)
  {
    hKey = AkelPad.MemRead(lpKey, DT_DWORD);
    AkelPad.MemCopy(lpType, REG_BINARY, DT_DWORD);
    AkelPad.MemCopy(lpDataSize, 28, DT_DWORD);

    nError = oSys.Call("advapi32::RegQueryValueEx" + _TCHAR,
               hKey,        // Parent key
               lpValue,     // Value name
               0,           // Must be NULL
               lpType,      // Value type receiver: will be REG_BINARY
               lpData,      // Buffer with data
               lpDataSize); // Buffer size
    if ((nError == ERROR_SUCCES || nError == ERROR_MORE_DATA) &&
        (AkelPad.MemRead(lpType, DT_DWORD) == REG_BINARY)     && //! Must be binary
        (AkelPad.MemRead(lpDataSize, DT_DWORD) >= 4)             //! Must be at least 4 bytes
       )
    {
      lfHeight = AkelPad.MemRead(lpData, DT_DWORD);
    }

    oSys.Call("advapi32::RegCloseKey", hKey);
  }

  AkelPad.MemFree(lpDataSize);
  AkelPad.MemFree(lpData);
  AkelPad.MemFree(lpType);
  AkelPad.MemFree(lpKey);
  AkelPad.MemFree(lpValue);
  AkelPad.MemFree(lpSubKey);
  return lfHeight;
}

function MakeString(pStr)
{
  var lpBuffer = AkelPad.MemAlloc((pStr.length + 1) * _TSIZE);
  AkelPad.MemCopy(lpBuffer, pStr, _TSTR);
  return lpBuffer;
}


A similar function in VBS (for AkelPad ver. 4.5).

Code: Select all

' Set the initial font size from AkelPad.ini or registry - 2011-01-08
'
' Call("Scripts::Main", 1, "FontIniSize.vbs")
'
' Can assign shortcut key, eg: Ctrl+Num/ or Ctrl+Num*

Option Explicit
On Error Resume Next

Const LOGPIXELSY = 90

Dim hEditWnd
Dim oSys
Dim pIniFile
Dim WshShell
Dim pTxtIni
Dim pTxtSaveSet
Dim pTxt
Dim lfHeight
Dim hDC
Dim nDevCap
Dim nFontSize
Dim i

hEditWnd = AkelPad.GetEditWnd()

If (hEditWnd = 0) Then
  WScript.Quit
End If

set oSys     = AkelPad.SystemFunction()
set WshShell = CreateObject("WScript.shell")

pIniFile    = (AkelPad.GetAkelDir & "\AkelPad.ini")
pTxtIni     = AkelPad.ReadFile(pIniFile)
pTxtSaveSet = Mid(pTxtIni, InStr(pTxtIni, "SaveSettings=") + 13, 1)
pTxt        = ""

'settings in .ini file
If pTxtSaveSet = "2" Then
  For i = 6 To 0 Step -2
    pTxt = pTxt & Mid(pTxtIni, InStr(pTxtIni, "Font=") + 5 + i, 2)
  Next

'settings in registry
Else
  pTxtIni = WshShell.RegRead("HKCU\Software\Akelsoft\AkelPad\Options\Font")

  If Err.Number Then
    WScript.Quit
  End If

  If IsArray(pTxtIni) Then
    For i = 3 To 0 Step -1
      pTxt = pTxt & PadL0(Hex(pTxtIni(i)))
    Next
  Else
    WScript.Quit
  End If
End If

lfHeight = Eval("&H" + pTxt)

If (lfHeight < 0) Then
  lfHeight = lfHeight + 4294967296
End If

hDC       = oSys.Call("user32::GetDC", hEditWnd)
nDevCap   = oSys.Call("gdi32::GetDeviceCaps", hDC, LOGPIXELSY)
nFontSize = -oSys.Call("kernel32::MulDiv", lfHeight, 72, nDevCap)
oSys.Call "user32::ReleaseDC", hEditWnd, hDC

If nFontSize > 0 Then
  AkelPad.Font "", 0, nFontSize
End If

''''''''''''''''''''
Function PadL0(pTxt)
  Do While len(pTxt) < 2
    pTxt = "0" & pTxt
  Loop 

  PadL0 = pTxt
End Function


----
PS: Instructor and FeyFre, thanks for the lessons.
Last edited by KDJ on Sun Mar 27, 2011 1:07 pm, edited 2 times in total.

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

Post by KDJ »

Select range of text, change selection.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9672#p9672
// Version: 2015-08-29
// Author: KDJ
//
// *** Select range of text ***
//
// Usage:
//   Call("Scripts::Main", 1, "SelectRangeText.js")
//
// Shortcut keys in dialog box:
//   Enter - Apply
//   Esc   - Close
//   Alt+End, Home, PgDn, PgUp - set caret position
//   Shift+Alt+Right(Left,Down,Up,End,Home,PgDn,PgUp) - move dialog box
//   Shift+Alt+Del(Ins) - center dialog box
//
// Note:
//   The script should be saved in Unicode format

var oSys   = AkelPad.SystemFunction();
var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + AkelPad.GetInstanceDll();
var hDlg   = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0);

if (hDlg)
{
  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();
}

var AEGI_FIRSTSELCHAR     = 3;
var AEM_GETSEL            = 3125;
var AEM_SETSEL            = 3126;
var AEM_GETCOLUMNSEL      = 3127;
var AEM_GETINDEX          = 3130;
var AEM_INDEXUPDATE       = 3132;
var AEM_INDEXCOMPARE      = 3133;
var AEM_INDEXTORICHOFFSET = 3136;
var AEM_RICHOFFSETTOINDEX = 3137;

var hMainWnd  = AkelPad.GetMainWnd();
var bOffset   = 0;
var lpFirstC  = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpCaret   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
var lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
var lpBegSel  = lpSelect;
var lpEndSel  = _PtrAdd(lpSelect, _X64 ? 24 : 12);
var lpSelFlag = _PtrAdd(lpSelect, _X64 ? 48 : 24);
var lpBegL    = lpBegSel;
var lpBegC    = _PtrAdd(lpBegSel, _X64 ? 16 : 8);
var lpEndL    = lpEndSel;
var lpEndC    = _PtrAdd(lpEndSel, _X64 ? 16 : 8);
var lpCarL    = lpCaret;
var lpCarC    = _PtrAdd(lpCaret, _X64 ? 16 : 8);
var nBegOf;
var nEndOf;
var nCarOf;
var hEditWnd;
var bColSel;
var nDlgX;
var nDlgY;

ReadIni();
GetLangStrings();

var IDCOORDIN = 1000;
var IDTXTBEG  = 1001;
var IDTXTEND  = 1002;
var IDTXTCAR  = 1003;
var IDTXTLIN  = 1004;
var IDTXTCOL  = 1005;
var IDBEGL    = 1006;
var IDBEGC    = 1007;
var IDENDL    = 1008;
var IDENDC    = 1009;
var IDCARL    = 1010;
var IDCARC    = 1011;
var IDTXTOF   = 1012;
var IDBEGOF   = 1013;
var IDENDOF   = 1014;
var IDCAROF   = 1015;
var IDOFFSET  = 1016;
var IDCOLSEL  = 1017;
var IDCARPOS  = 1018;
var IDCARPOSB = 1019;
var IDCARPOSE = 1020;
var IDCARPOS0 = 1021;
var IDCARPOS1 = 1022;
var IDCARPOS2 = 1023;
var IDCARPOS3 = 1024;
var IDAPPLY   = 1025;
var IDCLOSE   = 1026;

AkelPad.WindowRegisterClass(sClass);

//0x50000000 - WS_VISIBLE|WS_CHILD
//0x50000007 - WS_VISIBLE|WS_CHILD|BS_GROUPBOX
//0x50000009 - WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON
//0x50010000 - WS_VISIBLE|WS_CHILD|WS_TABSTOP
//0x50010001 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
//0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50012080 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL|ES_NUMBER
//0x90CA0040 = WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|DS_SETFONT
AkelPad.CreateDialog(0, sClass, sTxtCaption, 0x90CA0040, nDlgX, nDlgY, 355, 156, hMainWnd, DialogCallback, 0x2 /*CDF_PIXELS*/, 0, 0, "MS Shell Dlg", 1, 8, "|",
  //ExSt, Class,      Title,                       Style,        X,   Y,   W,   H, ID,      lParam,
  0x0000, "BUTTON",   sTxtCoordin,                 0x50000007,  10,  10, 185, 135, IDCOORDIN,    0, "|",
  0x0000, "STATIC",   sTxtBegin,                   0x50000000,  20,  48,  50,  13, IDTXTBEG,     0, "|",
  0x0000, "STATIC",   sTxtEnd,                     0x50000000,  20,  73,  50,  13, IDTXTEND,     0, "|",
  0x0000, "STATIC",   sTxtCaret,                   0x50000000,  20,  98,  50,  13, IDTXTCAR,     0, "|",
  0x0000, "STATIC",   sTxtLine,                    0x50000000,  70,  30,  50,  13, IDTXTLIN,     0, "|",
  0x0000, "STATIC",   sTxtColumn,                  0x50000000, 130,  30,  50,  13, IDTXTCOL,     0, "|",
  0x0200, "EDIT",     "",                          0x50012080,  70,  45,  55,  20, IDBEGL,       0, "|",
  0x0200, "EDIT",     "",                          0x50012080, 130,  45,  55,  20, IDBEGC,       0, "|",
  0x0200, "EDIT",     "",                          0x50012080,  70,  70,  55,  20, IDENDL,       0, "|",
  0x0200, "EDIT",     "",                          0x50012080, 130,  70,  55,  20, IDENDC,       0, "|",
  0x0200, "STATIC",   "",                          0x50000000,  70,  95,  55,  20, IDCARL,       0, "|",
  0x0200, "STATIC",   "",                          0x50000000, 130,  95,  55,  20, IDCARC,       0, "|",
  0x0000, "STATIC",   sTxtOffset.replace("&", ""), 0x50000000,  70,  30,  50,  13, IDTXTOF,      0, "|",
  0x0200, "EDIT",     "",                          0x50012080,  70,  45, 115,  20, IDBEGOF,      0, "|",
  0x0200, "EDIT",     "",                          0x50012080,  70,  70, 115,  20, IDENDOF,      0, "|",
  0x0200, "STATIC",   "",                          0x50000000,  70,  95, 115,  20, IDCAROF,      0, "|",
  0x0000, "BUTTON",   sTxtOffset,                  0x50010003,  70, 122, 120,  16, IDOFFSET,     0, "|",
  0x0000, "BUTTON",   sTxtColSel,                  0x50010003, 225,  15, 120,  16, IDCOLSEL,     0, "|",
  0x0000, "BUTTON",   sTxtCarPos,                  0x50000007, 205,  45, 140,  65, IDCARPOS,     0, "|",
  0x0000, "BUTTON",   sTxtBegin,                   0x50000009, 215,  65,  60,  16, IDCARPOSB,    0, "|",
  0x0000, "BUTTON",   sTxtEnd,                     0x50000009, 280,  85,  60,  16, IDCARPOSE,    0, "|",
  0x0000, "BUTTON",   sTxtCarPos0,                 0x50000009, 215,  65,  60,  16, IDCARPOS0,    0, "|",
  0x0000, "BUTTON",   sTxtCarPos1,                 0x50000009, 280,  65,  60,  16, IDCARPOS1,    0, "|",
  0x0000, "BUTTON",   sTxtCarPos2,                 0x50000009, 280,  85,  60,  16, IDCARPOS2,    0, "|",
  0x0000, "BUTTON",   sTxtCarPos3,                 0x50000009, 215,  85,  60,  16, IDCARPOS3,    0, "|",
  0x0000, "BUTTON",   sTxtApply,                   0x50010001, 205, 123,  67,  23, IDAPPLY,      0, "|",
  0x0000, "BUTTON",   sTxtClose,                   0x50010000, 278, 123,  67,  23, IDCLOSE,      0);

if (hDlg)
{
  AkelPad.ScriptNoMutex();
  AkelPad.WindowGetMessage();
}

AkelPad.WindowUnregisterClass(sClass);

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

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  var nID, i;

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

    //Set limit edit text
    for (i = IDBEGL; i <= IDENDC; ++i)
      SendDlgItemMessage(i, 197 /*EM_LIMITTEXT*/, 9, 0);
    for (i = IDBEGOF; i <= IDENDOF; ++i)
      SendDlgItemMessage(i, 197 /*EM_LIMITTEXT*/, 9, 0);

    //Set dialog position
    if ((typeof nDlgX != "number") || (typeof nDlgY != "number"))
      MoveDialog("RT");
  }

  else if (uMsg == 6 /*WM_ACTIVATE*/)
  {
    if (LoWord(wParam))
    {
      hEditWnd = AkelPad.GetEditWnd();
      bColSel  = SendMessage(hEditWnd, AEM_GETCOLUMNSEL, 0, 0);

      GetSelection();
      CheckButtons();
      ShowHideWindows();
    }
  }

  else if (uMsg == 260 /*WM_SYSKEYDOWN*/)
  {
    if (oSys.Call("User32::GetAsyncKeyState", 0xA0 /*VK_LSHIFT*/))
    {
      if (wParam == 0x27) //VK_RIGHT
        MoveDialog("R");
      else if (wParam == 0x25) //VK_LEFT
        MoveDialog("L");
      else if (wParam == 0x28) //VK_DOWN
        MoveDialog("D");
      else if (wParam == 0x26) //VK_UP
        MoveDialog("U");
      else if (wParam == 0x23) //VK_END
        MoveDialog("E");
      else if (wParam == 0x24) //VK_HOME
        MoveDialog("H");
      else if (wParam == 0x22) //VK_NEXT
        MoveDialog("B");
      else if (wParam == 0x21) //VK_PRIOR
        MoveDialog("T");
      else if ((wParam == 0x2D /*VK_INSERT*/) || (wParam == 0x2E /*VK_DELETE*/))
        MoveDialog("C");
    }
    else
    {
      if (wParam == 0x24) //VK_HOME
        CheckRadiobutton(bColSel ? IDCARPOS0 : IDCARPOSB);
      else if (wParam == 0x21) //VK_PRIOR
        CheckRadiobutton(bColSel ? IDCARPOS1 : IDCARPOSB);
      else if (wParam == 0x22) //VK_NEXT
        CheckRadiobutton(bColSel ? IDCARPOS2 : IDCARPOSE);
      else if (wParam == 0x23) //VK_END
        CheckRadiobutton(bColSel ? IDCARPOS3 : IDCARPOSE);
    }
  }

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

    if (nID == IDOFFSET)
    {
      bOffset = SendDlgItemMessage(IDOFFSET, 240 /*BM_GETCHECK*/, 0, 0);
      ShowHideWindows();
      SendDlgItemMessage(bOffset ? IDBEGOF : IDBEGL, 177 /*EM_SETSEL*/, 0, -1);
      oSys.Call("User32::SetFocus", GetDlgItem(bOffset ? IDBEGOF : IDBEGL));
    }

    else if (nID == IDCOLSEL)
    {
      bColSel = SendDlgItemMessage(IDCOLSEL, 240 /*BM_GETCHECK*/, 0, 0);
      CheckButtons();
      ShowHideWindows();
    }

    else if (nID == IDAPPLY)
    {
      SetSelection();
      GetSelection();
    }

    else if ((nID == IDCLOSE) || (nID == 2 /*IDCANCEL*/))
      oSys.Call("User32::PostMessageW", hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }

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

  return 0;
}

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

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

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

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

function GetDlgItemText(nID)
{
  var nTextLen = SendDlgItemMessage(nID, 14 /*WM_GETTEXTLENGTH*/, 0, 0);
  var sText    = "";
  var lpText;

  if (nTextLen)
  {
    lpText = AkelPad.MemAlloc(nTextLen * 2 + 2);
    SendDlgItemMessage(nID, 13 /*WM_GETTEXT*/, nTextLen + 1, lpText);
    sText = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
    AkelPad.MemFree(lpText);
  }

  return sText;
}

function SetDlgItemText(nID, vText)
{
  SendDlgItemMessage(nID, 12 /*WM_SETTEXT*/, 0, vText.toString());
}

function CheckRadiobutton(nButton)
{
  oSys.Call("User32::CheckRadioButton", hDlg, IDCARPOSB, IDCARPOS3, nButton);
}

function MoveDialog(sAction)
{
  var lpRect    = AkelPad.MemAlloc(16); //sizeof(RECT)
  var oRectMain = {};
  var oRectDlg  = {};
  var nX;
  var nY;

  oSys.Call("User32::GetWindowRect", hMainWnd, lpRect);
  RectToObject(lpRect, oRectMain);

  oSys.Call("User32::GetWindowRect", hDlg, lpRect);
  RectToObject(lpRect, oRectDlg);

  nX = oRectDlg.left;
  nY = oRectDlg.top;

  if (sAction == "R") //Move right
    nX = oRectDlg.left + ((oRectDlg.right < oRectMain.right) ? 10 : 0);
  else if (sAction == "L") //Move left
    nX = oRectDlg.left - ((oRectDlg.left > oRectMain.left) ? 10 : 0);
  else if (sAction == "D") //Move down
    nY = oRectDlg.top + ((oRectDlg.bottom < oRectMain.bottom) ? 10 : 0);
  else if (sAction == "U") //Move up
    nY = oRectDlg.top - ((oRectDlg.top > oRectMain.top) ? 10 : 0);
  else if (sAction == "E") //Move end (right)
    nX = oRectDlg.left + (oRectMain.right - oRectDlg.right);
  else if (sAction == "H") //Move home (left)
    nX = oRectDlg.left + (oRectMain.left - oRectDlg.left);
  else if (sAction == "B") //Move bottom
    nY = oRectDlg.top + (oRectMain.bottom - oRectDlg.bottom);
  else if (sAction == "T") //Move top
    nY = oRectDlg.top + (oRectMain.top - oRectDlg.top);
  else if (sAction == "C") //Center window
  {
    nX = oRectMain.left + ((oRectMain.right  - oRectMain.left) / 2 - (oRectDlg.right  - oRectDlg.left) / 2);
    nY = oRectMain.top  + ((oRectMain.bottom - oRectMain.top)  / 2 - (oRectDlg.bottom - oRectDlg.top)  / 2);
  }
  else if (sAction == "LT") //Move left top
  {
    nX = oRectMain.left;
    nY = oRectMain.top;
  }
  else if (sAction == "RT") //Move right top
  {
    nX = oRectDlg.left + (oRectMain.right - oRectDlg.right);
    nY = oRectMain.top;
  }
  else if (sAction == "LB") //Move left bottom
  {
    nX = oRectMain.left;
    nY = oRectDlg.top + (oRectMain.bottom - oRectDlg.bottom);
  }
  else if (sAction == "RB") //Move right bottom
  {
    nX = oRectDlg.left + (oRectMain.right - oRectDlg.right);
    nY = oRectDlg.top + (oRectMain.bottom - oRectDlg.bottom);
  }

  oSys.Call("User32::SetWindowPos", hDlg, 0, nX, nY, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
  AkelPad.MemFree(lpRect);
}

function RectToObject(lpRect, oRect)
{
  oRect.left   = AkelPad.MemRead(_PtrAdd(lpRect,  0), 3 /*DT_DWORD*/);
  oRect.top    = AkelPad.MemRead(_PtrAdd(lpRect,  4), 3 /*DT_DWORD*/);
  oRect.right  = AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/);
  oRect.bottom = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/);
}

function CheckButtons()
{
  SendDlgItemMessage(IDOFFSET, 241 /*BM_SETCHECK*/, bOffset, 0);
  SendDlgItemMessage(IDCOLSEL, 241 /*BM_SETCHECK*/, bColSel, 0);

  if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpCaret, lpEndSel) == -1)
  {
    if (bColSel)
    {
      if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpBegSel, lpFirstC) == 0)
        CheckRadiobutton(IDCARPOS0);
      else
        CheckRadiobutton(IDCARPOS1);
    }
    else
      CheckRadiobutton(IDCARPOSB);
  }
  else
  {
    if (bColSel)
    {
      if (SendMessage(hEditWnd, AEM_INDEXCOMPARE, lpBegSel, lpFirstC) == 0)
        CheckRadiobutton(IDCARPOS2);
      else
        CheckRadiobutton(IDCARPOS3);
    }
    else
      CheckRadiobutton(IDCARPOSE);
  }
}

function ShowHideWindows()
{
  var i;

  for (i = IDTXTLIN; i <= IDCARC; ++i)
    oSys.Call("User32::ShowWindow", GetDlgItem(i), ! bOffset);
  for (i = IDTXTOF; i <= IDCAROF; ++i)
    oSys.Call("User32::ShowWindow", GetDlgItem(i), bOffset);

  for (i = IDCARPOSB; i <= IDCARPOSE; ++i)
    oSys.Call("User32::ShowWindow", GetDlgItem(i), ! bColSel);
  for (i = IDCARPOS0; i <= IDCARPOS3; ++i)
    oSys.Call("User32::ShowWindow", GetDlgItem(i), bColSel);
}

function GetSelection()
{
  var i;

  SendMessage(hEditWnd, AEM_GETINDEX, AEGI_FIRSTSELCHAR, lpFirstC);
  SendMessage(hEditWnd, AEM_GETSEL, lpCaret, lpSelect);

  nBegOf = SendMessage(hEditWnd, AEM_INDEXTORICHOFFSET, 0, lpBegSel);
  nEndOf = SendMessage(hEditWnd, AEM_INDEXTORICHOFFSET, 0, lpEndSel);
  nCarOf = SendMessage(hEditWnd, AEM_INDEXTORICHOFFSET, 0, lpCaret);

  SetDlgItemText(IDBEGL, AkelPad.MemRead(lpBegL, 3 /*DT_DWORD*/) + 1);
  SetDlgItemText(IDBEGC, AkelPad.MemRead(lpBegC, 3 /*DT_DWORD*/) + 1);
  SetDlgItemText(IDENDL, AkelPad.MemRead(lpEndL, 3 /*DT_DWORD*/) + 1);
  SetDlgItemText(IDENDC, AkelPad.MemRead(lpEndC, 3 /*DT_DWORD*/) + 1);
  SetDlgItemText(IDCARL, AkelPad.MemRead(lpCarL, 3 /*DT_DWORD*/) + 1);
  SetDlgItemText(IDCARC, AkelPad.MemRead(lpCarC, 3 /*DT_DWORD*/) + 1);

  SetDlgItemText(IDBEGOF, nBegOf);
  SetDlgItemText(IDENDOF, nEndOf);
  SetDlgItemText(IDCAROF, nCarOf);

  for (i = IDBEGL; i <= IDENDC; ++i)
    SendDlgItemMessage(i, 177 /*EM_SETSEL*/, 0, -1);
  for (i = IDBEGOF; i <= IDENDOF; ++i)
    SendDlgItemMessage(i, 177 /*EM_SETSEL*/, 0, -1);
}

function SetSelection()
{
  var aCoord = new Array(4);
  var nBegL;
  var nBegC;
  var nEndL;
  var nEndC;
  var nOffset;
  var lpIndex;
  var i;

  if (bOffset)
  {
    lpIndex = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
    for (i = 0; i < 2; ++i)
    {
      nOffset = parseInt(GetDlgItemText(i + IDBEGOF));
      SendMessage(hEditWnd, AEM_RICHOFFSETTOINDEX, nOffset, lpIndex);
      aCoord[i*2]   = AkelPad.MemRead(lpIndex, 3 /*DT_DWORD*/);
      aCoord[i*2+1] = AkelPad.MemRead(_PtrAdd(lpIndex, _X64 ? 16 : 8), 3 /*DT_DWORD*/);
    }
    AkelPad.MemFree(lpIndex);
  }
  else
  {
    for (i = 0; i < 4; ++i)
    {
      aCoord[i] = parseInt(GetDlgItemText(i + IDBEGL));

      if (aCoord[i] > 0)
        --aCoord[i];
    }
  }

  if ((aCoord[0] > aCoord[2]) || ((aCoord[0] == aCoord[2]) && (aCoord[1] > aCoord[3])))
  {
    nBegL = aCoord[2];
    nBegC = aCoord[3];
    nEndL = aCoord[0];
    nEndC = aCoord[1];
  }
  else
  {
    nBegL = aCoord[0];
    nBegC = aCoord[1];
    nEndL = aCoord[2];
    nEndC = aCoord[3];
  }

  if (bColSel)
  {
    if (SendDlgItemMessage(IDCARPOS0, 240 /*BM_GETCHECK*/, 0, 0))
    {
      if (nBegC < nEndC)
        CopyCoordinatesToIndex(nBegL, nBegC, nEndL, nEndC, nBegL, nBegC);
      else
        CopyCoordinatesToIndex(nBegL, nEndC, nEndL, nBegC, nBegL, nEndC);
    }
    else if (SendDlgItemMessage(IDCARPOS1, 240 /*BM_GETCHECK*/, 0, 0))
    {
      if (nBegC < nEndC)
        CopyCoordinatesToIndex(nBegL, nEndC, nEndL, nBegC, nBegL, nEndC);
      else
        CopyCoordinatesToIndex(nBegL, nBegC, nEndL, nEndC, nBegL, nBegC);
    }
    else if (SendDlgItemMessage(IDCARPOS2, 240 /*BM_GETCHECK*/, 0, 0))
    {
      if (nBegC < nEndC)
        CopyCoordinatesToIndex(nBegL, nBegC, nEndL, nEndC, nEndL, nEndC);
      else
        CopyCoordinatesToIndex(nBegL, nEndC, nEndL, nBegC, nEndL, nBegC);
    }
    else
    {
      if (nBegC < nEndC)
        CopyCoordinatesToIndex(nBegL, nEndC, nEndL, nBegC, nEndL, nBegC);
      else
        CopyCoordinatesToIndex(nBegL, nBegC, nEndL, nEndC, nEndL, nEndC);
    }
  }
  else
  {
    if (SendDlgItemMessage(IDCARPOSB, 240 /*BM_GETCHECK*/, 0, 0))
      CopyCoordinatesToIndex(nBegL, nBegC, nEndL, nEndC, nBegL, nBegC);
    else
      CopyCoordinatesToIndex(nBegL, nBegC, nEndL, nEndC, nEndL, nEndC);
  }

  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpBegSel);
  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpEndSel);
  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpCaret);

  AkelPad.MemCopy(lpSelFlag, bColSel, 3 /*DT_DWORD*/);
  SendMessage(hEditWnd, AEM_SETSEL, lpCaret, lpSelect);

  oSys.Call("User32::InvalidateRect", hEditWnd, 0, true);
}

function CopyCoordinatesToIndex(n1, n2, n3, n4, n5, n6)
{
  AkelPad.MemCopy(lpBegL, n1, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpBegC, n2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpEndL, n3, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpEndC, n4, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpCarL, n5, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpCarC, n6, 3 /*DT_DWORD*/);
}

function ReadIni()
{
  try
  {
    eval(ReadIni.Text = AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), 0x1D /*OD_ADT_BINARY_ERROR|OD_ADT_DETECT_CODEPAGE|OD_ADT_DETECT_BOM|OD_ADT_NOMESSAGES*/));
  }
  catch (oError)
  {}
}

function WriteIni()
{
  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
  var sText;

  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*/);
  AkelPad.MemFree(lpRect);

  sText = 'nDlgX='   + nDlgX + ';\r\n' + 
          'nDlgY='   + nDlgY + ';\r\n' + 
          'bOffset=' + bOffset + ';\r\n';

  if (sText != ReadIni.Text) 
    AkelPad.WriteFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), sText, sText.length, 1200 /*UTF-16LE*/, true);
}

function GetLangStrings()
{
  switch (AkelPad.GetLangId())
  {
    case 1045: //Polish
      sTxtCaption = "Zaznacz zakres";
      sTxtCoordin = "Współrzędne";
      sTxtLine    = "Wiersz";
      sTxtColumn  = "Kolumna";
      sTxtBegin   = "Początek";
      sTxtEnd     = "Koniec";
      sTxtCaret   = "Kursor";
      sTxtOffset  = "&Offset";
      sTxtColSel  = "&Zaznaczenie pionowe";
      sTxtCarPos  = "Pozycja kursora";
      sTxtCarPos0 = "L.góra";
      sTxtCarPos1 = "P.góra";
      sTxtCarPos2 = "P.dół";
      sTxtCarPos3 = "L.dół";
      sTxtApply   = "Zastosuj";
      sTxtClose   = "Zamknij";
      break;
    case 1049: //Russian, translated by Skif_off
      sTxtCaption = "Диапазон выделения";
      sTxtCoordin = "Координаты";
      sTxtLine    = "Строка";
      sTxtColumn  = "Колонка";
      sTxtBegin   = "Начало";
      sTxtEnd     = "Конец";
      sTxtCaret   = "Каретка";
      sTxtOffset  = "&Смещение";
      sTxtColSel  = "&Колонка";
      sTxtCarPos  = "Позиция каретки";
      sTxtCarPos0 = "L.верх";
      sTxtCarPos1 = "R.верх";
      sTxtCarPos2 = "R.низ";
      sTxtCarPos3 = "L.низ";
      sTxtApply   = "Применить";
      sTxtClose   = "Закрыть";
      break;
    default: //English
      sTxtCaption = "Select range";
      sTxtCoordin = "Coordinates";
      sTxtLine    = "Line";
      sTxtColumn  = "Column";
      sTxtBegin   = "Begin";
      sTxtEnd     = "End";
      sTxtCaret   = "Caret";
      sTxtOffset  = "&Offset";
      sTxtColSel  = "&Columnar selection";
      sTxtCarPos  = "Caret position";
      sTxtCarPos0 = "L.top";
      sTxtCarPos1 = "R.top";
      sTxtCarPos2 = "R.bottom";
      sTxtCarPos3 = "L.bottom";
      sTxtApply   = "Apply";
      sTxtClose   = "Close";
  }
}

Last edited by KDJ on Sat Aug 29, 2015 1:40 pm, edited 12 times in total.

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

Post by KDJ »

Information about maximum line length.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9758#p9758
// Version: 2010-11-07
// Author: KDJ

// *** Show maximum line length ***
//
// Usage
//   Call("Scripts::Main", 1, "LineMaxLength.js")

var hEditWnd = AkelPad.GetEditWnd();
var nMaxLenL = 0;
var nWordWrap;
var nLines;
var nBegLine;
var nLenLine;
var i;

if (! hEditWnd) WScript.Quit();

nWordWrap = AkelPad.SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
if (nWordWrap > 0) AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

nLines = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 0 /*AEGL_LINECOUNT*/, 0);

for (i = 0; i < nLines; ++i)
{
  nBegLine = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, i, 0);
  nLenLine = AkelPad.SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, nBegLine, 0);
  if (nLenLine > nMaxLenL)
    nMaxLenL = nLenLine;
}

if (nWordWrap > 0) AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

AkelPad.MessageBox(hEditWnd, "Maximum line length = " + nMaxLenL, "Line length", 64 /*MB_ICONINFORMATION*/);

Last edited by KDJ on Sat Dec 20, 2014 7:05 pm, edited 1 time in total.

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

Post by KDJ »

File info and text statistics.
Required to include: ChooseFont_function.js and FileAndStream_functions.js
All in one: KDJ.zip

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=9791#p9791
// Version: 2016-06-21
// Author: KDJ
//
// *** File info and text statistics ***
//
// Required to include: ChooseFont_function.js and FileAndStream_functions.js
//
// Usage:
//   Call("Scripts::Main", 1, "FileInfo.js")               - without arguments - shows dialog box
//   Call("Scripts::Main", 1, "FileInfo.js", "0")          - general statistics all
//   Call("Scripts::Main", 1, "FileInfo.js", "1")          - detailed statistics all
//   Call("Scripts::Main", 1, "FileInfo.js", "1 CL")       - detailed statistics of chars and lines only
//   Call("Scripts::Main", 1, "FileInfo.js", "0 W 2")      - general statistics of words, outupt in log window
//   Call("Scripts::Main", 1, "FileInfo.js", "1 CWL 2 -1") - detailed statistics all, outupt in log window, sort by statistics descending
//
// First argument:
//   0 - general
//   1 - details
// Second argument (default is "CWL"):
//   C - chars
//   W - words
//   L - lines
// Third argument, output:
//  -1 - MDI mode - output in new tab, SDI - output in log window (default)
//   0 - output in new window
//   1 - output in new tab (MDI), SDI - output in new window
//   2 - output in log window
// Fourth argument, sort by statistics:
//  -1 - sort descending
//   0 - not sort
//   1 - sort ascending
//
// Note:
//   This script should be saved in Unicode format

var DT_QWORD  = 2;
var DT_DWORD  = 3;
var DT_WORD   = 4;
var oSys      = AkelPad.SystemFunction();
var hMainWnd  = AkelPad.GetMainWnd();
var hEditWnd  = AkelPad.GetEditWnd();
var hInstDLL  = AkelPad.GetInstanceDll();
var bChars    = 1;
var bWords    = 1;
var bLines    = 1;
var bCharsDet = 0;
var bWordsDet = 0;
var bLinesDet = 0;
var bSort     = 0;
var bDesc     = 0;
var nOutput   = -1;
var bFont     = 0;
var aFontOut;

if ((! hEditWnd) || (! AkelPad.Include("ChooseFont_function.js")) || (! AkelPad.Include("FileAndStream_functions.js")))
  WScript.Quit();

GetLangStrins();

if (WScript.Arguments.length)
{
  if (WScript.Arguments(0) == "1")
  {
    bCharsDet = 1;
    bWordsDet = 1;
    bLinesDet = 1;
  }

  if (WScript.Arguments.length > 1)
  {
    bChars = /C/i.test(WScript.Arguments(1));
    bWords = /W/i.test(WScript.Arguments(1));
    bLines = /L/i.test(WScript.Arguments(1));
  }

  if (WScript.Arguments.length > 2)
  {
    nOutput = parseInt(WScript.Arguments(2));

    if (isNaN(nOutput) || (nOutput < 0) || (nOutput > 2))
      nOutput = -1;
  }

  if (WScript.Arguments.length > 3)
  {
    bSort = parseInt(WScript.Arguments(3));

    if (isNaN(bSort))
      bSort = 0;
    else if (bSort > 0)
      bDesc = 0;
    else if (bSort < 0)
      bDesc = 1;
  }
}
else
{
  var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
  var hDlg;
  var bOK;

  var IDSTATSG   = 1000;
  var IDALLG     = 1001;
  var IDCHARS    = 1002;
  var IDCHARSDET = 1003;
  var IDWORDS    = 1004;
  var IDWORDSDET = 1005;
  var IDLINES    = 1006;
  var IDLINESDET = 1007;
  var IDALL      = 1008;
  var IDALLDET   = 1009;
  var IDOUTPUTG  = 1010;
  var IDWND      = 1011;
  var IDTAB      = 1012;
  var IDLOG      = 1013;
  var IDFONT     = 1014;
  var IDFONTSETB = 1015;
  var IDSORT     = 1016;
  var IDDESC     = 1017;
  var IDOKB      = 1018;
  var IDCANCELB  = 1019;

  ReadWriteIni(0);
  if (! aFontOut)
    aFontOut = ConvertFontFormat(AkelPad.SendMessage(hEditWnd, 49 /*WM_GETFONT*/, 0, 0), 2, 3);

  AkelPad.WindowRegisterClass(sClass);

  //0x50000007=WS_VISIBLE|WS_CHILD|BS_GROUPBOX
  //0x50000009=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON
  //0x50010000=WS_VISIBLE|WS_CHILD|WS_TABSTOP
  //0x50010001=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
  //0x50010003=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
  //0x90C80040=WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|DS_SETFONT

  AkelPad.CreateDialog(0, sClass, sTxtCaption, 0x90C80040, 0, 0, 200, 353, hMainWnd, DlgCallback, 0x3 /*CDF_PIXELS|CDF_MODAL*/, 0, 0, "", 0, 0, "|",
    // Class,    Title,               Style,        X,   Y,   W,   H, ID,         lParam
    0, "BUTTON", sTxtStats,           0x50000007,  10,  10, 180, 115, IDSTATSG,   0, "|",
    0, "BUTTON", "",                  0x50000007,  10,  85, 180,  40, IDALLG,     0, "|",
    0, "BUTTON", sTxtChars,           0x50010003,  20,  30,  80,  16, IDCHARS,    0, "|",
    0, "BUTTON", sTxtDetails,         0x50010003, 100,  30,  80,  16, IDCHARSDET, 0, "|",
    0, "BUTTON", sTxtWords,           0x50010003,  20,  50,  80,  16, IDWORDS,    0, "|",
    0, "BUTTON", sTxtDetails,         0x50010003, 100,  50,  80,  16, IDWORDSDET, 0, "|",
    0, "BUTTON", sTxtLines,           0x50010003,  20,  70,  80,  16, IDLINES,    0, "|",
    0, "BUTTON", sTxtDetails,         0x50010003, 100,  70,  80,  16, IDLINESDET, 0, "|",
    0, "BUTTON", sTxtAll,             0x50010003,  20, 100,  80,  16, IDALL,      0, "|",
    0, "BUTTON", sTxtAllDet,          0x50010003, 100, 100,  80,  16, IDALLDET,   0, "|",
    0, "BUTTON", sTxtOutput,          0x50000007,  10, 135, 180, 175, IDOUTPUTG,  0, "|",
    0, "BUTTON", sTxtNewWnd,          0x50000009,  50, 155, 120,  16, IDWND,      0, "|",
    0, "BUTTON", sTxtNewTab,          0x50000009,  50, 175, 120,  16, IDTAB,      0, "|",
    0, "BUTTON", sTxtLogWnd,          0x50000009,  50, 195, 120,  16, IDLOG,      0, "|",
    0, "BUTTON", sTxtFont,            0x50010003,  20, 215, 120,  16, IDFONT,     0, "|",
    0, "BUTTON", aFontOut.toString(), 0x50010000,  20, 235, 160,  20, IDFONTSETB, 0, "|",
    0, "BUTTON", sTxtSort,            0x50010003,  20, 265, 120,  16, IDSORT,     0, "|",
    0, "BUTTON", sTxtDesc,            0x50010003,  35, 285, 105,  16, IDDESC,     0, "|",
    0, "BUTTON", sTxtOK,              0x50010001,  10, 320,  85,  23, IDOKB,      0, "|",
    0, "BUTTON", sTxtCancel,          0x50010000, 105, 320,  85,  23, IDCANCELB,  0);

  AkelPad.WindowUnregisterClass(sClass);

  if (! bOK)
    WScript.Quit();
}

var hWndWait       = GetWaitWindow();
var sLineSep       = Pad("", 49, "R","-");
var sFileName      = AkelPad.GetEditFile(0);
var aOutput        = [];
var aChars         = [];
var aWords         = [];
var aLines         = [];
var aLinesWhite    = [];
var aLinesWhiteEnd = [];
var aLinesBadNL    = [];
var aStreams       = [];
var bStream        = false;
var nMinLenL       = Infinity;
var nMaxLenL       = 0;
var nEmptyEntire   = 0;
var sStreamName;
var oFSO;
var oFile;
var nFileSize;
var dFileDate;
var sFileDateC;
var sFileDateM;
var sText;
var nChars;
var nLatins;
var nDigits;
var nUnders;
var nWhites;
var nSpaces;
var nHTabs;
var nVTabs;
var nFF;
var nCR;
var nLF;
var nOthers;
var aWordTDH;
var nWordTDH;
var nWordDH;
var nWordT;
var nWordD;
var nWordH;
var aTextLines;
var nFirstLine;
var nEmptyLines;
var nEmptyWhite;
var nWhiteEnd;
var reBadNL;
var sChar;
var nCode;
var sWord;
var aExec;
var i, n;

if (sFileName)
{
  i = sFileName.lastIndexOf(":");

  if (i > 3) //NTFS stream
  {
    bStream     = true;
    sStreamName = sFileName.substr(i + 1);
    sFileName   = sFileName.substr(0, i);
  }

  aStreams = EnumStreams(sFileName);

  if (bStream)
  {
    for (i = 1; i < aStreams.length; ++i)
    {
      if (aStreams[i][0] == sStreamName)
      {
        nFileSize  = aStreams[i][1];
        break;
      }
    }
    sFileName = sFileName + ":" + sStreamName;
  }
  else
  {
    oFSO       = new ActiveXObject("Scripting.FileSystemObject");
    oFile      = oFSO.GetFile(sFileName);
    nFileSize  = oFile.Size;
    dFileDate  = new Date(oFile.DateCreated);
    sFileDateC = DateToShortLocaleString(dFileDate);
    dFileDate  = new Date(oFile.DateLastModified);
    sFileDateM = DateToShortLocaleString(dFileDate);
  }
}
else
{
  sFileName  = sTxtNoFile;
  nFileSize  = "?";
  sFileDateC = "?";
  sFileDateM = "?";
}

aOutput.push(Pad(sTxtFile, 22) + sFileName);
aOutput.push(Pad(sTxtSize, 22) + nFileSize + (bStream ? " " + sTxtStream : ""));

if (! bStream)
{
  aOutput.push(Pad(sTxtCreated,  22) + sFileDateC);
  aOutput.push(Pad(sTxtModified, 22) + sFileDateM);

  for (i = 1; i < aStreams.length; ++i)
  {
    if (i == 1)
      aOutput.push(Pad(sTxtStreams, 22) + aStreams[i][0]);
    else
      aOutput.push(Pad(aStreams[i][0], aStreams[i][0].length + 22, "L"));
  }
}

if (bLines)
{
  if (AkelPad.GetSelStart() == AkelPad.GetSelEnd())
  {
    sText      = AkelPad.GetTextRange(0, -1, 1 /*\r*/);
    nFirstLine = 1;
  }
  else
  {
    sText      = AkelPad.GetSelText(1 /*\r*/);
    nFirstLine = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 1 /*AEGL_FIRSTSELLINE*/, 0);
    nFirstLine = AkelPad.SendMessage(hEditWnd, 3143 /*AEM_GETUNWRAPLINE*/, nFirstLine, 0) + 1;
  }
  aTextLines = sText.split("\r");
}

if (AkelPad.GetSelStart() == AkelPad.GetSelEnd())
{
  sText = AkelPad.GetTextRange(0, -1, 0);
  sTxtStatsTxt += sTxtEntire;
}
else
{
  sText = AkelPad.GetSelText(0);
  sTxtStatsTxt += sTxtSelect;
}

if (bChars || bWords || bLines)
{
  aOutput.push(sLineSep);
  aOutput.push(Pad(sTxtStatsTxt, 49, "C"));
  aOutput.push(sLineSep);
}

//chars
if (bChars)
{
  nChars  = sText.length;
  nLatins = Count(/[a-z]/gi);
  nDigits = Count(/\d/g);
  nUnders = Count(/_/g);
  nSpaces = Count(/ /g);
  nHTabs  = Count(/\t/g);
  nVTabs  = Count(/\v/g);
  nFF     = Count(/\f/g);
  nCR     = Count(/\r/g);
  nLF     = Count(/\n/g);
  nWhites = nSpaces + nHTabs + nVTabs + nFF + nCR + nLF;
  nOthers = nChars - nLatins - nDigits - nUnders - nWhites;

  aOutput.push(         Pad(sTxtChars + ":",  32) + nChars);
  aOutput.push("  "   + Pad(sTxtLatin, 32) + nLatins);
  aOutput.push("  "   + Pad(sTxtDigit, 32) + nDigits);
  aOutput.push("  "   + Pad(sTxtUnder, 32) + nUnders);
  aOutput.push("  "   + Pad(sTxtWhite, 32) + nWhites);
  aOutput.push("    " + Pad(sTxtSpace, 32) + nSpaces);
  aOutput.push("    " + Pad(sTxtHTab,  32) + nHTabs);
  aOutput.push("    " + Pad(sTxtVTab,  32) + nVTabs);
  aOutput.push("    " + Pad(sTxtFF,    32) + nFF);
  aOutput.push("    " + Pad(sTxtCR,    32) + nCR);
  aOutput.push("    " + Pad(sTxtLF,    32) + nLF);
  aOutput.push("  "   + Pad(sTxtOther, 32) + nOthers);
  aOutput.push(sLineSep);
}

//words
if (bWords)
{
  aWordTDH = sText.match(/[^\x00-\x20'`"\\\|\[\]\(\)\{\}<>,\.;:\+\-=~!@#\$%^&\*/\?]+/g);
  nWordTDH = aWordTDH ? aWordTDH.length : 0;
  nWordD   = Count(/(^|[\x00-\x20'`"\\\|\[\]\(\)\{\}<>,\.;:\+\-=~!@#\$%^&\*/\?])\d+(?=($|[\x00-\x20'`"\\\|\[\]\(\)\{\}<>,\.;:\+\-=~!@#\$%^&\*/\?]))/g);
  nWordH   = Count(/(^|[\x00-\x20'`"\\\|\[\]\(\)\{\}<>,\.;:\+\-=~!@#\$%^&\*/\?])0x[\da-f]+(?=($|[\x00-\x20'`"\\\|\[\]\(\)\{\}<>,\.;:\+\-=~!@#\$%^&\*/\?]))/gi);
  nWordT   = nWordTDH - nWordD - nWordH;
  nWordDH  = nWordD   + nWordH;

  aOutput.push(         Pad(sTxtWords + ":", 32) + nWordTDH);
  aOutput.push("  "   + Pad(sTxtText,  32) + nWordT);
  aOutput.push("  "   + Pad(sTxtInt,   32) + nWordDH);
  aOutput.push("    " + Pad(sTxtDec,   32) + nWordD);
  aOutput.push("    " + Pad(sTxtHex,   32) + nWordH);
  aOutput.push(sLineSep);
}

//lines
if (bLines)
{
  for (i = 0; i < aTextLines.length; ++i)
  {
    if (aTextLines[i].length < nMinLenL)
      nMinLenL = aTextLines[i].length;
    if (aTextLines[i].length > nMaxLenL)
      nMaxLenL = aTextLines[i].length;
    if (aTextLines[i].length == 0)
      ++nEmptyEntire;
  }

  nEmptyWhite = Count(/^[ \t\v\f]+$/gm);
  nWhiteEnd   = Count(/\S+[ \t\v\f]+$/gm);
  nEmptyLines = nEmptyEntire + nEmptyWhite;

  if (AkelPad.GetEditNewLine(hEditWnd) == 1) //Win
  {
    reBadNL = /\r\r\n|\r\n|\r|\n/g;
    while (aExec = reBadNL.exec(sText))
    {
      if (aExec[0] != "\r\n")
        aLinesBadNL.push(RegExp.index);
    }
  }
  else
  {
    if (AkelPad.GetEditNewLine(hEditWnd) == 2) //Unix
      reBadNL = /\r{1,2}\n|\r/g;
    else //Mac
      reBadNL = /\r{0,2}\n/g;
    while (reBadNL.test(sText))
      aLinesBadNL.push(RegExp.index);
  }

  aOutput.push(         Pad(sTxtLines + ":",    32) + aTextLines.length);
  aOutput.push("  "   + Pad(sTxtEmptyL,   32) + nEmptyLines);
  aOutput.push("    " + Pad(sTxtEnEmptyL, 32) + nEmptyEntire);
  aOutput.push("    " + Pad(sTxtWhiteL,   32) + nEmptyWhite);
  aOutput.push("  "   + Pad(sTxtWhiteEnd, 32) + nWhiteEnd);
  aOutput.push("  "   + Pad(sTxtBadNLF,   32) + aLinesBadNL.length);
  aOutput.push(sLineSep);
  aOutput.push(         Pad(sTxtMinLenL,  32) + nMinLenL);
  aOutput.push(         Pad(sTxtMaxLenL,  32) + nMaxLenL);
  aOutput.push(sLineSep);
}

//chars details
if (bChars && bCharsDet)
{
  for (i = 0; i < sText.length; ++i)
  {
    nCode = sText.charCodeAt(i);

    if (nCode > 31)
      sChar = sText.charAt(i);
    else
      sChar = " ";

    if (aChars[nCode])
      ++aChars[nCode][0];
    else
      aChars[nCode] = [1, sChar, nCode];
  }

  if (aChars.length)
  {
    aOutput.push(sTxtChars + " - " + sTxtDetails);
    aOutput.push(Pad(sTxtStats, 10, "L") + "     %      " + Pad(sTxtChar, 7) + Pad(sTxtCode, 6, "L") + Pad("(hex)", 11, "L"));
    aOutput.push(sLineSep);

    if (bSort)
      SortByStats(aChars);

    for (i = 0; i < aChars.length; ++i)
    {
      if (aChars[i])
        aOutput.push(Pad(aChars[i][0].toString(), 10, "L") + Pad(Percent(aChars[i][0] / nChars), 9, "L") + "    " + aChars[i][1] + Pad("(" + aChars[i][2] + ")", 11, "L") + "     (" + Pad(aChars[i][2].toString(16).toUpperCase(), 4, "L", "0") + ")");
    }

    aOutput.push(sLineSep);
  }
}

//words details
if (bWords && bWordsDet)
{
  if (nWordTDH)
  {
    aWordTDH.sort();
    i = 0;
    while (i < nWordTDH)
    {
      sWord = aWordTDH[i];
      n     = 1;
      ++i;
      while ((i < nWordTDH) && (sWord == aWordTDH[i]))
      {
        ++n;
        ++i;
      }
      aWords.push([n, sWord]);
    }
  }

  if (aWords.length)
  {
    aOutput.push(sTxtWords + " - " + sTxtDetails);
    aOutput.push(Pad(sTxtStats, 10, "L") + "     %       " + sTxtWord);
    aOutput.push(sLineSep);

    if (bSort)
      SortByStats(aWords);

    for (i = 0; i < aWords.length; ++i)
      aOutput.push(Pad(aWords[i][0].toString(), 10, "L") + Pad(Percent(aWords[i][0] / nWordTDH), 9, "L") + "    " + aWords[i][1]);

    aOutput.push(sLineSep);
  }
}

//lines details
if (bLines && bLinesDet)
{
  for (i = 0; i < aTextLines.length; ++i)
  {
    if (/^\s+$/.test(aTextLines[i]))
      aLinesWhite.push(i + nFirstLine);
    else if (/\S+\s+$/.test(aTextLines[i]))
      aLinesWhiteEnd.push(i + nFirstLine);

    if (aLines[aTextLines[i].length])
    {
      ++aLines[aTextLines[i].length][0];
      aLines[aTextLines[i].length][2].push(i + nFirstLine);
    }
    else
      aLines[aTextLines[i].length] = [1, aTextLines[i].length, [i + nFirstLine]];
  }

  aOutput.push(sTxtLines + " - " + sTxtDetails);
  aOutput.push(Pad(sTxtStats, 10, "L") + "     %      " + Pad(sTxtLength, 7, "L") + "    " + sTxtLineNum);
  aOutput.push(sLineSep);

  if (bSort)
    SortByStats(aLines);

  for (i = 0; i < aLines.length; ++i)
  {
    if (aLines[i])
      aOutput.push(Pad(aLines[i][0].toString(), 10, "L") + Pad(Percent(aLines[i][0] / aTextLines.length), 9, "L") + Pad(aLines[i][1].toString(), 10, "L") + "    [" + aLines[i][2] + "]");
  }

  if (aLinesWhite.length)
    aOutput.push(Pad(sTxtWhiteL, 33) + "[" + aLinesWhite + "]");
  if (aLinesWhiteEnd.length)
    aOutput.push(Pad(sTxtWhiteEnd, 33) + "[" + aLinesWhiteEnd + "]");
  if (aLinesBadNL.length)
  {
    OffsetToLineNumber(aLinesBadNL);
    aOutput.push(Pad(sTxtBadNLF, 33) + "[" + aLinesBadNL + "]");
  }

  aOutput.push(sLineSep);
}

oSys.Call("User32::DestroyWindow", hWndWait);
AkelPad.SendMessage(GetOutputWindow(), 12 /*WM_SETTEXT*/, 0, aOutput.join("\r"));

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

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

    CheckButtons();
    CheckRadioButtons();
    CenterWindow(hWnd);
  }

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    nID = wParam & 0xFFFF;

    if (((nID >= IDCHARS) && (nID <= IDALLDET)) || (nID == IDFONT) || (nID == IDSORT) || (nID == IDDESC))
    {
      if (nID == IDCHARS)
        bChars = ! bChars;
      else if (nID == IDWORDS)
        bWords = ! bWords;
      else if (nID == IDLINES)
        bLines = ! bLines;
      else if (nID == IDCHARSDET)
        bCharsDet = ! bCharsDet;
      else if (nID == IDWORDSDET)
        bWordsDet = ! bWordsDet;
      else if (nID == IDLINESDET)
        bLinesDet = ! bLinesDet;
      else if (nID == IDALL)
        bChars = bWords = bLines = AkelPad.SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      else if (nID == IDALLDET)
        bCharsDet = bWordsDet = bLinesDet = AkelPad.SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      else if (nID == IDFONT)
        bFont = ! bFont;
      else if (nID == IDSORT)
        bSort = ! bSort;
      else if (nID == IDDESC)
        bDesc = ! bDesc;

      CheckButtons();
    }
    else if ((nID >= IDWND) && (nID <= IDLOG))
      nOutput = nID - IDWND;
    else if (nID == IDFONTSETB)
      MenuFont(hWnd);
    else if ((nID == IDOKB) || (nID == IDCANCELB) || (nID == 2 /*IDCANCEL*/))
    {
      bOK = (nID == IDOKB);
      oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }
  }

  else if (uMsg == 16 /*WM_CLOSE*/)
  {
    ReadWriteIni(1);
    oSys.Call("User32::EndDialog", hDlg, 0);
  }

  return 0;
}

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 CheckButtons()
{
  SendDlgItemMessage(hDlg, IDCHARS,    241 /*BM_SETCHECK*/, bChars, 0);
  SendDlgItemMessage(hDlg, IDWORDS,    241 /*BM_SETCHECK*/, bWords, 0);
  SendDlgItemMessage(hDlg, IDLINES,    241 /*BM_SETCHECK*/, bLines, 0);
  SendDlgItemMessage(hDlg, IDCHARSDET, 241 /*BM_SETCHECK*/, bCharsDet, 0);
  SendDlgItemMessage(hDlg, IDWORDSDET, 241 /*BM_SETCHECK*/, bWordsDet, 0);
  SendDlgItemMessage(hDlg, IDLINESDET, 241 /*BM_SETCHECK*/, bLinesDet, 0);
  SendDlgItemMessage(hDlg, IDALL,      241 /*BM_SETCHECK*/, bChars && bWords && bLines, 0);
  SendDlgItemMessage(hDlg, IDALLDET,   241 /*BM_SETCHECK*/, bCharsDet && bWordsDet && bLinesDet, 0);
  SendDlgItemMessage(hDlg, IDFONT,     241 /*BM_SETCHECK*/, bFont, 0);
  SendDlgItemMessage(hDlg, IDSORT,     241 /*BM_SETCHECK*/, bSort, 0);
  SendDlgItemMessage(hDlg, IDDESC,     241 /*BM_SETCHECK*/, bDesc, 0);

  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDCHARSDET), bChars);
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDWORDSDET), bWords);
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDLINESDET), bLines);
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDFONTSETB), bFont);
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDSORT),     bChars && bCharsDet || bWords && bWordsDet || bLines && bLinesDet);
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDDESC),     bSort && (bChars && bCharsDet || bWords && bWordsDet || bLines && bLinesDet));
}

function CheckRadioButtons()
{
  if (nOutput < 0)
  {
    if (AkelPad.IsMDI())
      nOutput = 1;
    else
      nOutput = 0;
  }

  if ((nOutput == 2) && (! IsLogPluginExists()))
    nOutput = 1;

  if ((nOutput == 1) && (! AkelPad.IsMDI()))
    nOutput = 0;

  SendDlgItemMessage(hDlg, IDWND + nOutput, 241 /*BM_SETCHECK*/, 1, 0);

  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDTAB), AkelPad.IsMDI());
  oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDLOG), IsLogPluginExists());
}

function IsLogPluginExists()
{
  return IsFileExists(AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\Log.dll");
}

function MenuFont(hWndOwn)
{
  var hMenu = oSys.Call("User32::CreatePopupMenu");
  var oRect = {};
  var nCmd;
  var vCF;

  GetWindowPos(GetDlgItem(hDlg, IDFONT), oRect);

  oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, 1, sTxtMonoFonts);
  oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, 2, sTxtAllFonts);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0180 /*TPM_RETURNCMD|TPM_NONOTIFY*/, oRect.X + 16, oRect.Y + 16, 0, hWndOwn, 0);
  oSys.Call("User32::DestroyMenu", hMenu);

  if (nCmd)
  {
    if (vCF = ChooseFont(hWndOwn, 3, aFontOut, 0, nCmd - 2, 3))
    {
      aFontOut = vCF;
      SendDlgItemMessage(hDlg, IDFONTSETB, 12 /*WM_SETTEXT*/, 0, aFontOut.toString());
    }
  }
}

function GetWindowPos(hWnd, oRect)
{
  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)

  oSys.Call("User32::GetWindowRect", hWnd, lpRect);

  oRect.X = AkelPad.MemRead(_PtrAdd(lpRect,  0), DT_DWORD);
  oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect,  4), DT_DWORD);
  oRect.W = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD) - oRect.X;
  oRect.H = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - oRect.Y;

  AkelPad.MemFree(lpRect);
}

function GetWaitWindow()
{
  var hWnd =
        oSys.Call("User32::CreateWindowExW",
                  0,          //dwExStyle
                  "STATIC",   //lpClassName
                  0,          //lpWindowName
                  0x90400001, //dwStyle=WS_POPUP|WS_VISIBLE|WS_DLGFRAME|SS_CENTER
                  0,          //x
                  0,          //y
                  200,        //nWidth
                  80,         //nHeight
                  hMainWnd,   //hWndParent
                  0,          //ID
                  hInstDLL,
                  0);

  CenterWindow(hWnd);
  AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/), 0);
  AkelPad.SendMessage(hWnd, 12 /*WM_SETTEXT*/, 0, "\n\n" + sTxtWait);

  return hWnd;
}

function CenterWindow(hWnd)
{
  var oRectEdit = {};
  var oRect     = {};

  GetWindowPos(hEditWnd, oRectEdit);
  GetWindowPos(hWnd, oRect);

  oRect.X = oRectEdit.X + (oRectEdit.W - oRect.W) / 2;
  oRect.Y = oRectEdit.Y + (oRectEdit.H - oRect.H) / 2;

  oSys.Call("User32::SetWindowPos", hWnd, 0, oRect.X, oRect.Y, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
}

function Count(oRE)
{
  var aMatch = sText.match(oRE);
  return aMatch ? aMatch.length : 0;
}

function Pad(sString, nLen, sType, sChar)
{
  var i = 0;

  if (! sType) sType = "R";
  if (! sChar) sChar = " ";

  if (sType == "R")
  {
    while (sString.length < nLen)
      sString += sChar;
  }
  else if (sType == "L")
  {
    while (sString.length < nLen)
      sString = sChar + sString;
  }
  else if (sType == "C")
  {
    while (sString.length < nLen)
    {
      if ((i % 2) == 0)
        sString += sChar;
      else
        sString = sChar + sString;
      ++ i;
    }
  }
  return sString;
}

function SortByStats(a)
{
  a.sort(function(a1, a2)
         {
           if (a1[0] < a2[0])
             return bDesc ? 1 : -1;
           if (a1[0] > a2[0])
             return bDesc ? -1 : 1;
           return 0;
         });
}

function Percent(n)
{
  var s = (Math.round(n * 10000) / 100).toString();

  n = s.indexOf(".");

  if (n == -1)
    s = s + ".00";
  else if (n == s.length - 2)
    s = s + "0";

  return s;
}

function DateToShortLocaleString(dDate)
{
  var lpSysTime = AkelPad.MemAlloc(16 /*sizeof(SYSTEMTIME)*/);
  var lpString  = AkelPad.MemAlloc(256 * 2);
  var sDateTime;

  AkelPad.MemCopy(_PtrAdd(lpSysTime,  0), dDate.getFullYear(),     DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime,  2), dDate.getMonth() + 1,    DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime,  4), dDate.getDay(),          DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime,  6), dDate.getDate(),         DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime,  8), dDate.getHours(),        DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime, 10), dDate.getMinutes(),      DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime, 12), dDate.getSeconds(),      DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime, 14), dDate.getMilliseconds(), DT_WORD);

  oSys.Call("Kernel32::GetDateFormatW",
            0x400, //LOCALE_USER_DEFAULT
            0x1,   //DATE_SHORTDATE
            lpSysTime,
            0,
            lpString,
            256);
  sDateTime = AkelPad.MemRead(lpString, 1 /*DT_UNICODE*/) + " ";

  oSys.Call("Kernel32::GetTimeFormatW",
            0x400, //LOCALE_USER_DEFAULT
            0x8,   //TIME_FORCE24HOURFORMAT
            lpSysTime,
            0,
            lpString,
            256);
  sDateTime += AkelPad.MemRead(lpString, 1 /*DT_UNICODE*/);

  AkelPad.MemFree(lpSysTime);
  AkelPad.MemFree(lpString);

  return sDateTime;
}

function OffsetToLineNumber(aLinesBadNL)
{
  var lpCharIndex1  = AkelPad.MemAlloc(_X64 ? 24 : 12); //sizeof(AECHARINDEX)
  var lpCharIndex2  = AkelPad.MemAlloc(_X64 ? 24 : 12); //sizeof(AECHARINDEX)
  var lpIndexOffset = AkelPad.MemAlloc(_X64 ? 32 : 16); //sizeof(AEINDEXOFFSET)
  var i;

  AkelPad.MemCopy(lpIndexOffset, lpCharIndex1, DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpIndexOffset, _X64 ? 8 : 4), lpCharIndex2, DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpIndexOffset, _X64 ? 24 : 12), 3 /*AELB_ASIS*/, DT_DWORD);

  AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, (AkelPad.GetSelStart() == AkelPad.GetSelEnd()) ? 1 /*AEGI_FIRSTCHAR*/ : 3 /*AEGI_FIRSTSELCHAR*/, lpCharIndex1);

  for (i = 0; i < aLinesBadNL.length; ++i)
  {
    AkelPad.MemCopy(_PtrAdd(lpIndexOffset, _X64 ? 16 : 8), aLinesBadNL[i], DT_QWORD);
    AkelPad.SendMessage(hEditWnd, 3135 /*AEM_INDEXOFFSET*/, 0, lpIndexOffset);

    aLinesBadNL[i] = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpCharIndex2);
    aLinesBadNL[i] = AkelPad.SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, aLinesBadNL[i]);
    aLinesBadNL[i] = AkelPad.SendMessage(hEditWnd, 3143 /*AEM_GETUNWRAPLINE*/, aLinesBadNL[i], 0) + 1;
  }

  AkelPad.MemFree(lpCharIndex1);
  AkelPad.MemFree(lpCharIndex2);
  AkelPad.MemFree(lpIndexOffset);
}

function GetOutputWindow()
{
  var hWnd;

  if (AkelPad.IsMDI())
  {
    if (nOutput == 2)
      hWnd = GetLogWindow();
    else
      hWnd = GetNewEditWindow(nOutput);
  }
  else
  {
    if ((nOutput == -1) || (nOutput == 2))
      hWnd = GetLogWindow();
    else
      hWnd = GetNewEditWindow(0);
  }

  return hWnd;
}

function GetNewEditWindow(bNewTab)
{
  var aFontEdit;

  if (bNewTab)
  {
    //To eliminate conflict with Templates plugin: lParam=1
    AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*wParam=MAKEWPARAM(0,IDM_FILE_NEW)*/, 1 /*lParam=TRUE*/);

    if (bFont)
    {
      WScript.Sleep(10);
      AkelPad.Font(aFontOut[0], aFontOut[1], aFontOut[2])
    }
  }
  else
  {
    if (bFont)
    {
      aFontEdit = ConvertFontFormat(AkelPad.SendMessage(hEditWnd, 49 /*WM_GETFONT*/, 0, 0), 2, 3);

      AkelPad.SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 0, 0);
      AkelPad.Font(aFontOut[0], aFontOut[1], aFontOut[2])
    }

    //Force create new instance
    if (AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 153 /*MI_SINGLEOPENPROGRAM*/, 0))
    {
      AkelPad.Command(4256 /*IDM_OPTIONS_SINGLEOPEN_PROGRAM*/);
      hMainWnd = AkelPad.Command(4102 /*IDM_FILE_CREATENEW*/);
      AkelPad.Command(4256 /*IDM_OPTIONS_SINGLEOPEN_PROGRAM*/);
      AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4256 /*IDM_OPTIONS_SINGLEOPEN_PROGRAM*/, 0);
    }
    else
      hMainWnd = AkelPad.Command(4102 /*IDM_FILE_CREATENEW*/);

    if (bFont)
    {
      AkelPad.Font(aFontEdit[0], aFontEdit[1], aFontEdit[2])
      AkelPad.SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 1, 0);
    }
  }

  return AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 2 /*FI_WNDEDIT*/, 0);
}

function GetLogWindow()
{
  var lpWnd = AkelPad.MemAlloc(_X64 ? 8 : 4); //sizeof(HWND)
  var hWnd;

  if (! AkelPad.IsPluginRunning("Log::Output"))
    AkelPad.Call("Log::Output");

  AkelPad.Call("Log::Output", 2, lpWnd);
  hWnd = AkelPad.MemRead(lpWnd, DT_QWORD);
  AkelPad.MemFree(lpWnd);

  if (bFont)
    AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, ConvertFontFormat(aFontOut, 3, 2), 0);

  return hWnd;
}

function ReadWriteIni(bWrite)
{
  var sIniFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var sIniTxt;
  var oError;

  if (bWrite)
  {
    sIniTxt = 'bChars='     + bChars    + ';\r\n' +
              'bWords='     + bWords    + ';\r\n' +
              'bLines='     + bLines    + ';\r\n' +
              'bCharsDet='  + bCharsDet + ';\r\n' +
              'bWordsDet='  + bWordsDet + ';\r\n' +
              'bLinesDet='  + bLinesDet + ';\r\n' +
              'bSort='      + bSort     + ';\r\n' +
              'bDesc='      + bDesc     + ';\r\n' +
              'nOutput='    + nOutput   + ';\r\n' +
              'bFont='      + bFont     + ';\r\n' +
              'aFontOut=["' + aFontOut[0] + '",' + aFontOut[1] + ',' + aFontOut[2] + '];';

    WriteFile(sIniFile, null, sIniTxt, 1);
  }

  else if (IsFileExists(sIniFile))
  {
    try
    {
      eval(AkelPad.ReadFile(sIniFile));
    }
    catch (oError)
    {
    }
  }
}

function GetLangStrins()
{
  if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1045) //Polish
  {
    sTxtCaption   = "Informacja o pliku";
    sTxtWait      = "Proszę czekać...";
    sTxtNoFile    = "Brak nazwy, plik nie został zapisany";
    sTxtStatsTxt  = "Statystyka tekstu";
    sTxtEntire    = " - cały tekst";
    sTxtSelect    = " - obszar zaznaczenia";
    sTxtDetails   = "Szczegóły";
    sTxtWord      = "Słowo";
    sTxtChar      = "Znak";
    sTxtCode      = "(Kod)";
    sTxtLength    = "Długość";
    sTxtLineNum   = "[Numery wierszy]";
    sTxtFile      = "Plik, pełna nazwa:";
    sTxtSize      = "Rozmiar [Bajty]:";
    sTxtCreated   = "Utworzony:";
    sTxtModified  = "Ostatnio zapisany:";
    sTxtChars     = "Znaki";
    sTxtLatin     = "Litera łacińska:";
    sTxtDigit     = "Cyfra:";
    sTxtUnder     = "Znak podkreślenia:";
    sTxtWhite     = "Biały znak:";
    sTxtSpace     = "Spacja (20h):";
    sTxtHTab      = "Tabulator (09h):";
    sTxtVTab      = "Tabulator pionowy (0Bh):";
    sTxtFF        = "Wysuw strony FF (0Ch):";
    sTxtCR        = "Powrót karetki CR (0Dh):";
    sTxtLF        = "Nowy wiersz LF (0Ah):";
    sTxtOther     = "Inne:";
    sTxtWords     = "Słowa";
    sTxtText      = "Tekst:";
    sTxtInt       = "Liczba całkowita:";
    sTxtDec       = "Dziesiętna:";
    sTxtHex       = "Hex (0x...):";
    sTxtLines     = "Wiersze";
    sTxtEmptyL    = "Pusty wiersz:";
    sTxtEnEmptyL  = "Całkowicie pusty:";
    sTxtWhiteL    = "Tylko białe znaki:";
    sTxtWhiteEnd  = "Zakończony białym znakiem:";
    sTxtBadNLF    = "Błędny format nowego wiersza:";
    sTxtMinLenL   = "Min. długość wiersza:";
    sTxtMaxLenL   = "Max. długość wiersza:";
    sTxtStream    = "(strumień NTFS)";
    sTxtStreams   = "Strumienie NTFS:";
    sTxtStats     = "Statystyka";
    sTxtAll       = "&Wszystko";
    sTxtAllDet    = "&Szczegółowo";
    sTxtOutput    = "Wyjście";
    sTxtNewWnd    = "Nowe okno";
    sTxtNewTab    = "Nowa karta (MDI)";
    sTxtLogWnd    = "Okno log";
    sTxtFont      = "Czcionka";
    sTxtMonoFonts = "Czcionki monospace";
    sTxtAllFonts  = "Wszystkie czcionki";
    sTxtSort      = "Sortuj wg statystyki";
    sTxtDesc      = "Malejąco";
    sTxtOK        = "OK";
    sTxtCancel    = "Anuluj";
  }
  else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049) //Russian
  {
    //translated by yozhic
    sTxtCaption   = "Информация о файле";
    sTxtWait      = "Пожалуйста, подождите...";
    sTxtNoFile    = "Отсутствует имя, файл не сохранён";
    sTxtStatsTxt  = "Статистика по тексту";
    sTxtEntire    = " - полный текст";
    sTxtSelect    = " - выделенный текст";
    sTxtDetails   = "Детально";
    sTxtWord      = "Слово";
    sTxtChar      = "Символ";
    sTxtCode      = "(Код)";
    sTxtLength    = "Длина";
    sTxtLineNum   = "[Номера строк]";
    sTxtFile      = "Файл, полное имя:";
    sTxtSize      = "Размер [в Байтах]:";
    sTxtCreated   = "Дата создания:";
    sTxtModified  = "Дата модификации:";
    sTxtChars     = "Символы";
    sTxtLatin     = "Латинские буквы:";
    sTxtDigit     = "Цифра:";
    sTxtUnder     = "Символы подчёркивания:";
    sTxtWhite     = "Пробельные символы:";
    sTxtSpace     = "Пробел (20h):";
    sTxtHTab      = "Табуляция (09h):";
    sTxtVTab      = "Вертикальная табуляция (0Bh):";
    sTxtFF        = "Перевод страницы (0Ch):";
    sTxtCR        = "Возврат каретки (0Dh):";
    sTxtLF        = "Перевод строки (0Ah):";
    sTxtOther     = "Другие:";
    sTxtWords     = "Слова";
    sTxtText      = "Текст:";
    sTxtInt       = "Целые числа:";
    sTxtDec       = "Десятичные:";
    sTxtHex       = "Hex (0x...):";
    sTxtLines     = "Строки";
    sTxtEmptyL    = "Пустые строки:";
    sTxtEnEmptyL  = "Абсолютно пустые:";
    sTxtWhiteL    = "Только из пробельных символов:";
    sTxtWhiteEnd  = "Заканчивающиеся проб. символами:";
    sTxtBadNLF    = "Неверный формат новой строки:";
    sTxtMinLenL   = "Min. длина строки:";
    sTxtMaxLenL   = "Max. длина строки:";
    sTxtStream    = "(поток NTFS)";
    sTxtStreams   = "Потоки NTFS:";
    sTxtStats     = "Статистика";
    sTxtAll       = "Вс&я";
    sTxtAllDet    = "Дет&альная";
    sTxtOutput    = "Вывод";
    sTxtNewWnd    = "Новое окно";
    sTxtNewTab    = "Новая вкладка (MDI)";
    sTxtLogWnd    = "Панель вывода";
    sTxtFont      = "Шрифт";
    sTxtMonoFonts = "Моноширинный шрифт";
    sTxtAllFonts  = "Все шрифты";
    sTxtSort      = "Sort by statistics";                  //new
    sTxtDesc      = "Descending";                          //new
    sTxtOK        = "OK";
    sTxtCancel    = "Отмена";
  }
  else
  {
    sTxtCaption   = "File info";
    sTxtWait      = "Please wait...";
    sTxtNoFile    = "No name, the file is not saved";
    sTxtStatsTxt  = "Text statistics";
    sTxtEntire    = " - entire text";
    sTxtSelect    = " - selected text";
    sTxtDetails   = "Details";
    sTxtWord      = "Word";
    sTxtChar      = "Char";
    sTxtCode      = "(Code)";
    sTxtLength    = "Length";
    sTxtLineNum   = "[Line numbers]";
    sTxtFile      = "File, full name:";
    sTxtSize      = "Size [Bytes]:";
    sTxtCreated   = "Created time:";
    sTxtModified  = "Last modified:";
    sTxtChars     = "Chars";
    sTxtLatin     = "Latin letter:";
    sTxtDigit     = "Digit:";
    sTxtUnder     = "Underscore char:";
    sTxtWhite     = "Whitespace:";
    sTxtSpace     = "Space (20h):";
    sTxtHTab      = "Tab (09h):";
    sTxtVTab      = "Vertical Tab (0Bh):";
    sTxtFF        = "Form Feed (0Ch):";
    sTxtCR        = "Carriage Return (0Dh):";
    sTxtLF        = "Line Feed (0Ah):";
    sTxtOther     = "Other:";
    sTxtWords     = "Words";
    sTxtText      = "Text:";
    sTxtInt       = "Integer:";
    sTxtDec       = "Decimal:";
    sTxtHex       = "Hex (0x...):";
    sTxtLines     = "Lines";
    sTxtEmptyL    = "Empty line:";
    sTxtEnEmptyL  = "Entirely empty:";
    sTxtWhiteL    = "Whitespaces only:";
    sTxtWhiteEnd  = "Terminated by whitespace:";
    sTxtBadNLF    = "Bad NewLine format:";
    sTxtMinLenL   = "Min line length:";
    sTxtMaxLenL   = "Max line length:";
    sTxtStream    = "(NTFS stream)";
    sTxtStreams   = "NTFS streams:";
    sTxtStats     = "Statistics";
    sTxtAll       = "&All";
    sTxtAllDet    = "With &details";
    sTxtOutput    = "Output";
    sTxtNewWnd    = "New window";
    sTxtNewTab    = "New tab (MDI)";
    sTxtLogWnd    = "Log window";
    sTxtFont      = "Font";
    sTxtMonoFonts = "Monospace fonts";
    sTxtAllFonts  = "All fonts";
    sTxtSort      = "Sort by statistics";
    sTxtDesc      = "Descending";
    sTxtOK        = "OK";
    sTxtCancel    = "Cancel";
  }
}

Last edited by KDJ on Tue Jun 21, 2016 6:12 pm, edited 23 times in total.
Post Reply