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

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



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Sun Dec 23, 2012 7:41 pm    Post subject: Reply with quote

"Go to" dialog with argument.

GoToEx.js

Code:
// GoToEx.js - ver. 2013-08-22 (x86/x64)
//
// "Go to" dialog with argument
//
// Usage:
// Call("Scripts::Main", 1, "GoToEx.js")      - standard procedure call
// Call("Scripts::Main", 1, "GoToEx.js", "L") - go to Line:Column
// Call("Scripts::Main", 1, "GoToEx.js", "O") - go to Offset

if (! AkelPad.GetEditWnd())
  WScript.Quit();

var IDC_GOTO_LINE   = 3102;
var IDC_GOTO_OFFSET = 3103;

var oSys     = AkelPad.SystemFunction();
var nLineArg = -1;
var hWndGoTo;
var hWndLine;
var hWndOffset;

if (WScript.Arguments.length)
{
  if (WScript.Arguments(0).toUpperCase() == "L")
    nLineArg = 1;
  else if (WScript.Arguments(0).toUpperCase() == "O")
    nLineArg = 0;
}

AkelPad.Command(4162 /*IDM_EDIT_GOTO*/);

if (nLineArg >= 0)
{
  if (hWndGoTo = GetGoToDialog())
  {
    hWndLine   = oSys.Call("User32::GetDlgItem", hWndGoTo, IDC_GOTO_LINE);
    hWndOffset = oSys.Call("User32::GetDlgItem", hWndGoTo, IDC_GOTO_OFFSET);

    if (hWndLine && hWndOffset)
    {
      SendMessage(hWndLine,   241 /*BM_SETCHECK*/, nLineArg,   0);
      SendMessage(hWndOffset, 241 /*BM_SETCHECK*/, ! nLineArg, 0);

      if (nLineArg)
        SendMessage(hWndGoTo, 273 /*WM_COMMAND*/, IDC_GOTO_LINE, hWndLine);
      else
        SendMessage(hWndGoTo, 273 /*WM_COMMAND*/, IDC_GOTO_OFFSET, hWndOffset);
    }
  }
}

function GetGoToDialog()
{
  var lpMLT = AkelPad.MemAlloc(4);
  var hWnd  = SendMessage(AkelPad.GetMainWnd(), 1275 /*AKD_GETMODELESS*/, 0, lpMLT);
  var hDlg  = 0;

  if (AkelPad.MemRead(lpMLT, 3 /*DT_DWORD*/) == 5 /*MLT_GOTO*/)
    hDlg = hWnd;

  AkelPad.MemFree(lpMLT);

  return hDlg;
}

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


Last edited by KDJ on Sat Aug 31, 2013 12:04 pm; edited 1 time in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Wed Dec 26, 2012 8:31 pm    Post subject: Reply with quote

Extended version of "Find/Replace" dialog - part 1.
Part 2 - in the next post.
Required to include: InputBox_function.js
All in one: KDJ.zip

FindReplaceEx.js

Code:
// FindReplaceEx.js - ver. 2014-07-21 (x86/x64)
//
// "Find/Replace" dialog, extended version
//
// Required to include: InputBox_function.js
//
// Usage:
// Call("Scripts::Main", 1, "FindReplaceEx.js")             - "Find" dialog
// Call("Scripts::Main", 1, "FindReplaceEx.js", '-Dlg="R"') - "Replace" dialog
// Call("Scripts::Main", 1, "FindReplaceEx.js", '-Dlg="R" -FR="M+R+S" -RDB="A"')
// - "Replace" dialog, select "Match case" and "Regular expressions",
//   direction "In selection", set default push button to "Replace all",
//
// Arguments:
//   -Dlg - dialog type that is displayed when you run the script:
//     "F" - "Find" (default)
//     "R" - "Replace"
//     "G" - "Go to"
//   -FR - set "Find/Replace" initial parameters:
//     "M+" - select "Match case"
//     "M-" - unselect "Match case"
//     "W+" - select "Whole word"
//     "W-" - unselect "Whole word"
//     "R+" - select "Regular expressions"
//     "R-" - unselect "Regular expressions"
//     "E+" - select "Esc-sequences"
//     "E-" - unselect "Esc-sequences"
//     "D"  - "Down" (direction)
//     "U"  - "Up"
//     "B"  - "Begining"
//     "S"  - "In selection"
//     "A"  - "All files"
//   -RDB - change default push button in "Replace" dialog:
//     "R" - "Replace"
//     "A" - "Replace all"
//   -GT - set "Go to" initial parameter:
//     "L" - "Line:Column"
//     "O" - "Offset"
//
// If you don't want switching "Find/Replace" <-> "Go to", set manually in FindReplaceEx.ini:
// bGoToDlg=false;
//
// In "Find/Replace" dialog:
// F1 - help for regular expressions (if "Regular expressions" is checked)
// F2 - Find/Replace templates
//
// In "Find/Replace templates" dialog:
// Ins       - New
// Ctrl+Ins,
// Shift+Ins - Add (from "Find/Replace" dialog)
// F2, F4    - Edit
// Del       - Delete
// Enter,
// DblClick  - OK (put template in "Find/Replace" dialog)
// F1        - help for regular expressions (if "Regular expressions" is checked)
//
// Find/Replace templates are saved in file FindReplaceEx_templates.tsv

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

var DT_UNICODE = 1;
var DT_QWORD   = 2;
var DT_DWORD   = 3;
var DT_WORD    = 4;

var MLT_FIND    = 3;
var MLT_REPLACE = 4;
var MLT_GOTO    = 5;

var FRF_REPLACEALLANDCLOSE = 0x02000000;
var FRF_REPLACEALLNOMSG    = 0x20000000;
var FRF_CHECKINSELIFSEL    = 0x04000000;
var FRF_CYCLESEARCH        = 0x08000000;
var FRF_CYCLESEARCHPROMPT  = 0x10000000;

var IDCANCEL                  = 2;
var IDC_SEARCH_FIND           = 3052; //Combobox What
var IDC_SEARCH_REPLACE        = 3053; //Combobox With
var IDC_SEARCH_MATCHCASE      = 3054;
var IDC_SEARCH_WHOLEWORD      = 3055;
var IDC_SEARCH_ESCAPESEQ      = 3056;
var IDC_SEARCH_REGEXP         = 3057;
var IDC_SEARCH_BACKWARD       = 3059;
var IDC_SEARCH_FORWARD        = 3060;
var IDC_SEARCH_BEGINNING      = 3061;
var IDC_SEARCH_INSEL          = 3062;
var IDC_SEARCH_ALLFILES       = 3064;
var IDC_SEARCH_REPLACE_BUTTON = 3066;
var IDC_SEARCH_ALL_BUTTON     = 3067;
var IDC_GOTO_LINE             = 3102;
var IDC_GOTO_OFFSET           = 3103;

var IDNAMELV   = 9900;
var IDWHATS    = 9901;
var IDWITHS    = 9902;
var IDWHATE    = 9903;
var IDWITHE    = 9904;
var IDMATCHC   = 9905;
var IDWHOLEW   = 9906;
var IDREGEXP   = 9907;
var IDESCSEQ   = 9908;
var IDNEWB     = 9909;
var IDADDB     = 9910;
var IDEDITB    = 9911;
var IDDELB     = 9912;
var IDOKB      = 9913;
var IDCLOSEB   = 9914;
var IDHELP1L   = 9915;
var IDHELP2L   = 9916;
var IDFRTL     = 9917;
var IDFINDL    = 9918;
var IDREPLACEL = 9919;
var IDGOTOL    = 9920;
var IDMOREB    = 9921;
var IDRACDB    = 9922;
var IDRAWMB    = 9923;
var IDINSELB   = 9924;
var IDCYCLEB   = 9925;
var IDPROMPTB  = 9926;

var oSys         = AkelPad.SystemFunction();
var hInstDLL     = AkelPad.GetInstanceDll();
var hMainWnd     = AkelPad.GetMainWnd();
var hGuiFont     = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var sClassName   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("Kernel32::GetCurrentProcessId");
var aDlg         = [];
var bContinue    = true;
var bFirstTimeFR = true;
var bFirstTimeGT = true;
var nWhatSel1    = 0;
var nWhatSel2    = -1;
var nWithSel1    = 0;
var nWithSel2    = -1;
var nDlgType;
var nMatchCase;
var nWholeWord;
var nRegExp;
var nEscSeq;
var nDirection;
var nGoTo;
var sDefButton;
var hDlg;
var hDlgSubClass;
var aButSubClass;
var hWhatE;
var hWithE;
var hCancelB;
var hFocus;
var sWhatText;
var sWithText;
var nGapH;
var i;

var Scale =
{
  Init: function()
  {
    var hDC = oSys.Call("User32::GetDC", hMainWnd);
    this.ScaleX = oSys.Call("Gdi32::GetDeviceCaps", hDC, 88 /*LOGPIXELSX*/);
    this.ScaleY = oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/);
    oSys.Call("User32::ReleaseDC", hMainWnd, hDC);
    //Align to 16 pixel
    this.ScaleX += (16 - this.ScaleX % 16) % 16;
    this.ScaleY += (16 - this.ScaleY % 16) % 16;
  },
  X:  function(n) {return oSys.Call("Kernel32::MulDiv", n, this.ScaleX, 96);},
  Y:  function(n) {return oSys.Call("Kernel32::MulDiv", n, this.ScaleY, 96);},
  UX: function(n) {return oSys.Call("Kernel32::MulDiv", n, 96, this.ScaleX);},
  UY: function(n) {return oSys.Call("Kernel32::MulDiv", n, 96, this.ScaleY);}
}
Scale.Init();

var aWnd         = [];
var aSubClassFRT = [];
var bChangeFRT   = false;
var nFRTMinW     = Scale.X(340);
var nFRTMinH     = Scale.Y(250);
var hWndFRT;

//ini settings
var bGoToDlg = true;
var bMore    = false;
var nFRTSel  = 0;
var nFRTW;
var nFRTH;
var nDlgX;
var nDlgY;

ReadIni();

var nBufSize = 1024;
var lpBuffer = AkelPad.MemAlloc(nBufSize);
var lpLVITEM = AkelPad.MemAlloc(_X64 ? 72 : 60); //sizeof(LVITEM)

AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, DT_DWORD);
AkelPad.MemCopy(lpLVITEM + (_X64 ? 24 : 20), lpBuffer, DT_QWORD);
AkelPad.MemCopy(lpLVITEM + (_X64 ? 32 : 24), nBufSize, DT_DWORD);

//0x50000000 - WS_VISIBLE|WS_CHILD
//0x50010000 - WS_VISIBLE|WS_CHILD|WS_TABSTOP
//0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50810000 - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP
//0x5081801D - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|LVS_NOSORTHEADER|LVS_SORTASCENDING|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_REPORT
aDlg[IDHELP1L]   = {Class: "SysLink", Style: 0x50000000, Text: "?"};
aDlg[IDHELP2L]   = {Class: "SysLink", Style: 0x50000000, Text: "?"};
aDlg[IDFRTL]     = {Class: "SysLink", Style: 0x50000000, Text: sTxtTemplates + " (F2)"};
aDlg[IDFINDL]    = {Class: "SysLink", Style: 0x50000000, Text: "(Ctrl+F)", DlgID: 2004 /*IDD_FIND*/};
aDlg[IDREPLACEL] = {Class: "SysLink", Style: 0x50000000, Text: "(Ctrl+R)", DlgID: 2005 /*IDD_REPLACE*/};
aDlg[IDGOTOL]    = {Class: "SysLink", Style: 0x50000000, Text: "(Ctrl+G)", DlgID: 2006 /*IDD_GOTO*/};
aDlg[IDMOREB]    = {Class: "BUTTON",  Style: 0x50010000};
aDlg[IDRACDB]    = {Class: "BUTTON",  Style: 0x50010003, Text: sTxtReplAllCD};
aDlg[IDRAWMB]    = {Class: "BUTTON",  Style: 0x50010003, Text: sTxtReplAllWM};
aDlg[IDINSELB]   = {Class: "BUTTON",  Style: 0x50010003, Text: sTxtCheckInSel};
aDlg[IDCYCLEB]   = {Class: "BUTTON",  Style: 0x50010003, Text: sTxtCycleSearch};
aDlg[IDPROMPTB]  = {Class: "BUTTON",  Style: 0x50010003, Text: sTxtPrompt};

aWnd[IDNAMELV] = {Class: "SysListView32", Style: 0x5081801D};
aWnd[IDWHATS]  = {Class: "STATIC",        Style: 0x50000000, Text: sTxtFindWhat + ":"};
aWnd[IDWITHS]  = {Class: "STATIC",        Style: 0x50000000, Text: sTxtReplaceWith + ":"};
aWnd[IDWHATE]  = {Class: "AkelEditW",     Style: 0x50810000};
aWnd[IDWITHE]  = {Class: "AkelEditW",     Style: 0x50810000};
aWnd[IDMATCHC] = {Class: "BUTTON",        Style: 0x50010003, Text: sTxtMatchCase};
aWnd[IDWHOLEW] = {Class: "BUTTON",        Style: 0x50010003, Text: sTxtWholeWord};
aWnd[IDREGEXP] = {Class: "BUTTON",        Style: 0x50010003, Text: sTxtRegExp};
aWnd[IDESCSEQ] = {Class: "BUTTON",        Style: 0x50010003, Text: sTxtEscSeq};
aWnd[IDNEWB]   = {Class: "BUTTON",        Style: 0x50010000, Text: sTxtNew};
aWnd[IDADDB]   = {Class: "BUTTON",        Style: 0x50010000, Text: sTxtAdd};
aWnd[IDEDITB]  = {Class: "BUTTON",        Style: 0x50010000, Text: sTxtEdit};
aWnd[IDDELB]   = {Class: "BUTTON",        Style: 0x50010000, Text: sTxtDelete};
aWnd[IDOKB]    = {Class: "BUTTON",        Style: 0x50010000, Text: sTxtOK};
aWnd[IDCLOSEB] = {Class: "BUTTON",        Style: 0x50010000, Text: sTxtClose};
aWnd[IDHELP1L] = {Class: "SysLink",       Style: 0x50000000, Text: "<a>?</a>"};
aWnd[IDHELP2L] = {Class: "SysLink",       Style: 0x50000000, Text: "<a>?</a>"};

GetDialogWnd();
if (hDlg && hCancelB)
  SendMessage(hDlg, 273 /*WM_COMMAND*/, IDCANCEL, hCancelB);

GetArguments();
GetLinkText();

AkelPad.ScriptNoMutex();
AkelPad.WindowRegisterClass(sClassName);
AkelPad.WindowRegisterClass(sClassName + "ThreadMenu");

while (bContinue)
{
  bContinue = false;

  if (nDlgType == MLT_FIND)
    AkelPad.Command(4158 /*IDM_EDIT_FIND*/);
  else if (nDlgType == MLT_REPLACE)
    AkelPad.Command(4161 /*IDM_EDIT_REPLACE*/);
  else
    AkelPad.Command(4162 /*IDM_EDIT_GOTO*/);

  GetDialogWnd();

  if (! (hDlg && hCancelB))
    break;

  if ((typeof nDlgX == "number") && (typeof nDlgY == "number"))
    oSys.Call("User32::SetWindowPos", hDlg, 0, nDlgX, nDlgY, 0, 0, 0x0415 /*SWP_NOSENDCHANGING|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/);

  GetLinkPos();

  for (i = IDHELP1L; i < aDlg.length; ++i)
  {
    if (aDlg[i].Create)
      SendMessage(
        oSys.Call("User32::CreateWindowExW",
          0,             //dwExStyle
          aDlg[i].Class, //lpClassName
          (i < IDMOREB ? "<a>" : "") + aDlg[i].Text + (i < IDMOREB ? "</a>" : ""), //lpWindowName
          aDlg[i].Style, //dwStyle
          aDlg[i].X,     //x
          aDlg[i].Y,     //y
          aDlg[i].W,     //nWidth
          aDlg[i].H,     //nHeight
          hDlg,          //hWndParent
          i,             //ID
          hInstDLL,      //hInstance
          0),            //lpParam
        48 /*WM_SETFONT*/, hGuiFont, true);
  }

  if (nDlgType == MLT_GOTO)
  {
    if (bFirstTimeGT)
    {
      bFirstTimeGT = false;
      SetParamsGT(nGoTo);
    }

    if (bGoToDlg)
      ResizeDialog(30);
  }
  else
  {
    if (bFirstTimeFR)
    {
      bFirstTimeFR = false;
      SetParamsFR(nMatchCase, nWholeWord, nRegExp, nEscSeq, nDirection);
    }

    if (typeof sWhatText == "string")
    {
      oSys.Call("User32::SetWindowTextW", hWhatE, sWhatText);
      SendMessage(hWhatE, 0x00B1 /*EM_SETSEL*/, 0, -1);
    }

    if (nDlgType == MLT_REPLACE)
    {
      if (typeof sWithText == "string")
        oSys.Call("User32::SetWindowTextW", hWithE, sWithText);

      if (sDefButton)
        SendMessage(hDlg, 0x0401 /*DM_SETDEFID*/, (sDefButton == "R") ? IDC_SEARCH_REPLACE_BUTTON : IDC_SEARCH_ALL_BUTTON, 0);
    }

    ShowMore(bMore);
    ShowHelpLinksFR();
  }

  oSys.Call("User32::UpdateWindow", hDlg);

  hDlgSubClass = AkelPad.WindowSubClass(hDlg, DialogCallback, 78 /*WM_NOTIFY*/, 256 /*WM_KEYDOWN*/, 273 /*WM_COMMAND*/, 2 /*WM_DESTROY*/);

  AkelPad.WindowRegisterDialog(hDlg);
  AkelPad.WindowGetMessage();

  AkelPad.WindowUnregisterDialog(hDlg);
  AkelPad.WindowUnsubClass(hDlg);
}

WriteIni();
AkelPad.WindowUnregisterClass(sClassName);
AkelPad.WindowUnregisterClass(sClassName + "ThreadMenu");
AkelPad.MemFree(lpBuffer);
AkelPad.MemFree(lpLVITEM);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 78) //WM_NOTIFY
  {
    if (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), DT_DWORD) == -2 /*NM_CLICK*/)
    {
      if ((wParam == IDHELP1L) || (wParam == IDHELP2L))
        PostThreadMenu(wParam);
      else if (wParam == IDFRTL)
      {
        oSys.Call("User32::SetFocus", hWhatE);
        FRTemplates();
      }
      else if (wParam == IDFINDL)
        SwitchDialog(MLT_FIND);
      else if (wParam == IDREPLACEL)
        SwitchDialog(MLT_REPLACE);
      else if (wParam == IDGOTOL)
        SwitchDialog(MLT_GOTO);
    }
  }

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (! Shift())
    {
      if (Ctrl())
      {
        if ((wParam == 0x46 /*F key*/) && aDlg[IDFINDL].Create)
          SwitchDialog(MLT_FIND);
        else if ((wParam == 0x52 /*R key*/) && aDlg[IDREPLACEL].Create)
          SwitchDialog(MLT_REPLACE);
        else if ((wParam == 0x47 /*G key*/) && aDlg[IDGOTOL].Create)
          SwitchDialog(MLT_GOTO);
      }
      else
      {
        if (wParam == 0x70 /*VK_F1*/)
        {
          if (aDlg[IDHELP2L].Show && (oSys.Call("User32::GetFocus") == hWithE))
            PostThreadMenu(IDHELP2L);
          else if (aDlg[IDHELP1L].Show)
          {
            oSys.Call("User32::SetFocus", hWhatE);
            PostThreadMenu(IDHELP1L);
          }
        }
        else if ((wParam == 0x71 /*VK_F2*/) && aDlg[IDFRTL].Create)
          FRTemplates();
      }
    }
  }

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

    if (nLowParam == IDC_SEARCH_FIND)
    {
      if (nHiwParam == 3 /*CBN_SETFOCUS*/)
        SendMessage(lParam, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(nWhatSel1, nWhatSel2));
      else if (nHiwParam == 10 /*CBN_SELENDCANCEL*/)
      {
        nWhatSel1 = LoWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0));
        nWhatSel2 = HiWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0));
      }
    }
    else if (nLowParam == IDC_SEARCH_REPLACE)
    {
      if (nHiwParam == 3 /*CBN_SETFOCUS*/)
        SendMessage(lParam, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(nWithSel1, nWithSel2));
      else if (nHiwParam == 10 /*CBN_SELENDCANCEL*/)
      {
        nWithSel1 = LoWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0));
        nWithSel2 = HiWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0));
      }
    }
    else if ((nLowParam == IDC_SEARCH_REGEXP) || (nLowParam == IDC_SEARCH_ESCAPESEQ))
    {
      AkelPad.WindowNextProc(hDlgSubClass, hWnd, uMsg, wParam, lParam);
      ShowHelpLinksFR();
      oSys.Call("User32::UpdateWindow", hWnd);
    }
    else if (nLowParam == IDMOREB)
    {
      bMore = ! bMore;
      ShowMore(true);
      oSys.Call("User32::UpdateWindow", hWnd);
    }
    else if ((nLowParam >= IDRACDB) && (nLowParam <= IDPROMPTB))
    {
      var nOption;

      if (nLowParam == IDRACDB)
        nOption = FRF_REPLACEALLANDCLOSE;
      else if (nLowParam == IDRAWMB)
        nOption = FRF_REPLACEALLNOMSG;
      else if (nLowParam == IDINSELB)
        nOption = FRF_CHECKINSELIFSEL;
      else if (nLowParam == IDCYCLEB)
      {
        nOption = FRF_CYCLESEARCH;
        oSys.Call("User32::EnableWindow", oSys.Call("User32::GetDlgItem", hWnd, IDPROMPTB), SendMessage(lParam, 0x00F0 /*BM_GETCHECK*/, 0, 0));
      }
      else
        nOption = FRF_CYCLESEARCHPROMPT;

      SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 228 /*MIS_SEARCHOPTIONS*/, SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0) ^ nOption);
    }
  }

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

  return 0;
}

//unlock main thread for RegExpHelp menu
//based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=22725&highlight=#22725
function PostThreadMenu(nHelpID)
{
  var hWndThreadMenu = oSys.Call("User32::CreateWindowExW", 0, sClassName + "ThreadMenu", "", 0x80000000 /*WS_POPUP*/, 0, 0, 0, 0, hMainWnd, 0, hInstDLL, CallbackThreadMenu);
  PostMessage(hWndThreadMenu, 3000, nHelpID, 0);
}

function CallbackThreadMenu(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 3000)
  {
    RegExpHelp(wParam, hWnd);
    oSys.Call("User32::DestroyWindow", hWnd);
  }
}

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

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

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

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

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

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

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

function GetArguments()
{
  var vArg = AkelPad.GetArgValue("Dlg", "F").toUpperCase();

  if (vArg == "R")
    nDlgType = MLT_REPLACE;
  else if (vArg == "G")
    nDlgType = MLT_GOTO;
  else
    nDlgType = MLT_FIND;

  vArg = AkelPad.GetArgValue("FR", "").toUpperCase();

  if (vArg.indexOf("M+") >= 0)
    nMatchCase = 1;
  else if (vArg.indexOf("M-") >= 0)
    nMatchCase = 0;
  else
    nMatchCase = 2;

  if (vArg.indexOf("W+") >= 0)
    nWholeWord = 1;
  else if (vArg.indexOf("W-") >= 0)
    nWholeWord = 0;
  else
    nWholeWord = 2;

  if (vArg.indexOf("R+") >= 0)
    nRegExp = 1;
  else if (vArg.indexOf("R-") >= 0)
    nRegExp = 0;
  else
    nRegExp = 2;

  if (vArg.indexOf("E+") >= 0)
    nEscSeq = 1;
  else if (vArg.indexOf("E-") >= 0)
    nEscSeq = 0;
  else
    nEscSeq = 2;

  if (vArg.indexOf("D") >= 0)
    nDirection = IDC_SEARCH_FORWARD;
  else if (vArg.indexOf("U") >= 0)
    nDirection = IDC_SEARCH_BACKWARD;
  else if (vArg.indexOf("B") >= 0)
    nDirection = IDC_SEARCH_BEGINNING;
  else if (vArg.indexOf("S") >= 0)
    nDirection = IDC_SEARCH_INSEL;
  else if (vArg.indexOf("A") >= 0)
    nDirection = IDC_SEARCH_ALLFILES;
  else
    nDirection = 2;

  vArg = AkelPad.GetArgValue("RDB", "").toUpperCase();

  if ((vArg == "R") || (vArg == "A"))
    sDefButton = vArg;
  else
    sDefButton = "";

  vArg = AkelPad.GetArgValue("GT", "").toUpperCase();

  if (vArg.indexOf("L") >= 0)
    nGoTo = IDC_GOTO_LINE;
  else if (vArg.indexOf("O") >= 0)
    nGoTo = IDC_GOTO_OFFSET;
  else
    nGoTo = 2;
}

function GetLinkText()
{
  var hLangLib;
  var hRes;
  var hResData;
  var lpPointer;
  var nSize;
  var i;

  if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 52 /*MI_LANGMODULEW*/, lpBuffer))
    hLangLib = oSys.Call("Kernel32::GetModuleHandleW", AkelPad.GetAkelDir(3 /*ADTYPE_LANGS*/) + "\\" + AkelPad.MemRead(lpBuffer, DT_UNICODE));
  else //internal language
    hLangLib = AkelPad.GetInstanceExe();

  for (i = IDFINDL; i <= IDGOTOL; ++i)
  {
    hRes      = oSys.Call("Kernel32::FindResourceExW", hLangLib, 5 /*RT_DIALOG*/, aDlg[i].DlgID, AkelPad.GetLangId());
    hResData  = oSys.Call("Kernel32::LoadResource", hLangLib, hRes);
    lpPointer = oSys.Call("Kernel32::LockResource", hResData);
    nSize     = oSys.Call("Kernel32::SizeofResource", hLangLib, hRes);

    if (nSize)
    {
      //pointer to menu
      if (AkelPad.MemRead(lpPointer + 2, DT_WORD) == 0xFFFF) //DLGTEMPLATEEX
        lpPointer += 26;
      else //DLGTEMPLATE
        lpPointer += 18;

      //pointer to windowClass
      if (AkelPad.MemRead(lpPointer, DT_WORD) == 0xFFFF)
        lpPointer += 4;
      else
        lpPointer += AkelPad.MemRead(lpPointer, DT_UNICODE).length + 2;

      //pointer to title
      if (AkelPad.MemRead(lpPointer, DT_WORD) == 0xFFFF)
        lpPointer += 4;
      else
        lpPointer += AkelPad.MemRead(lpPointer, DT_UNICODE).length + 2;

      aDlg[i].Text = AkelPad.MemRead(lpPointer, DT_UNICODE) + " " + aDlg[i].Text;
    }
  }
}

function GetLinkPos()
{
  var hDC = oSys.Call("User32::GetDC", hDlg);
  var nDlgW, nDlgH;
  var i;

  oSys.Call("Gdi32::SelectObject", hDC, hGuiFont);
  oSys.Call("Gdi32::SetMapMode", hDC, 1 /*MM_TEXT*/);

  for (i = IDHELP1L; i <= IDGOTOL; ++i)
  {
    oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, aDlg[i].Text, aDlg[i].Text.length, lpBuffer);
    aDlg[i].W = AkelPad.MemRead(lpBuffer,     DT_DWORD);
    aDlg[i].H = AkelPad.MemRead(lpBuffer + 4, DT_DWORD);
  }

  oSys.Call("User32::ReleaseDC", hDlg, hDC);

  oSys.Call("User32::GetClientRect", hDlg, lpBuffer);
  nDlgW = AkelPad.MemRead(lpBuffer +  8, DT_DWORD);
  nDlgH = AkelPad.MemRead(lpBuffer + 12, DT_DWORD);

  if (nDlgType == MLT_GOTO)
  {
    aDlg[IDFINDL].X    = 10;
    aDlg[IDFINDL].Y    = nDlgH + 7;
    aDlg[IDREPLACEL].X = nDlgW - aDlg[IDREPLACEL].W - 10;
    aDlg[IDREPLACEL].Y = aDlg[IDFINDL].Y;

    aDlg[IDHELP1L].Create   = false;
    aDlg[IDHELP1L].Show     = false;
    aDlg[IDHELP2L].Create   = false;
    aDlg[IDHELP2L].Show     = false;
    aDlg[IDFRTL].Create     = false;
    aDlg[IDFINDL].Create    = bGoToDlg;
    aDlg[IDREPLACEL].Create = bGoToDlg;
    aDlg[IDGOTOL].Create    = false;
    aDlg[IDMOREB].Create    = false;
    aDlg[IDRACDB].Create    = false;
    aDlg[IDRAWMB].Create    = false;
    aDlg[IDINSELB].Create   = false;
    aDlg[IDCYCLEB].Create   = false;
    aDlg[IDPROMPTB].Create  = false;
  }
  else
  {
    GetControlRect(hCancelB);
    aDlg[IDMOREB].X = AkelPad.MemRead(lpBuffer, DT_DWORD);
    aDlg[IDMOREB].W = AkelPad.MemRead(lpBuffer + 8, DT_DWORD) - aDlg[IDMOREB].X;
    aDlg[IDMOREB].H = AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - AkelPad.MemRead(lpBuffer + 4, DT_DWORD);
    aDlg[IDMOREB].Y = nDlgH - aDlg[IDMOREB].H - (nDlgW - aDlg[IDMOREB].X - aDlg[IDMOREB].W);

    GetControlRect(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_FIND));
    aDlg[IDHELP1L].X = AkelPad.MemRead(lpBuffer + 8, DT_DWORD) + 1;
    aDlg[IDHELP1L].Y = AkelPad.MemRead(lpBuffer + 4, DT_DWORD) + (AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - AkelPad.MemRead(lpBuffer + 4, DT_DWORD) - aDlg[IDHELP1L].H) / 2;

    aDlg[IDFRTL].X     = aDlg[IDMOREB].X + (aDlg[IDMOREB].W - aDlg[IDFRTL].W) / 2;
    aDlg[IDFINDL].X    = aDlg[IDMOREB].X + (aDlg[IDMOREB].W - aDlg[IDFINDL].W) / 2;
    aDlg[IDREPLACEL].X = aDlg[IDMOREB].X + (aDlg[IDMOREB].W - aDlg[IDREPLACEL].W) / 2;
    aDlg[IDGOTOL].X    = aDlg[IDMOREB].X + (aDlg[IDMOREB].W - aDlg[IDGOTOL].W) / 2;

    GetControlRect(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_MATCHCASE));
    aDlg[IDRACDB].X   = AkelPad.MemRead(lpBuffer, DT_DWORD);
    aDlg[IDRACDB].W   = aDlg[IDHELP1L].X - aDlg[IDRACDB].X - 1;
    aDlg[IDRACDB].H   = AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - AkelPad.MemRead(lpBuffer + 4, DT_DWORD);
    aDlg[IDRAWMB].X   = aDlg[IDRACDB].X;
    aDlg[IDRAWMB].W   = aDlg[IDRACDB].W;
    aDlg[IDRAWMB].H   = aDlg[IDRACDB].H;
    aDlg[IDINSELB].X  = aDlg[IDRACDB].X;
    aDlg[IDINSELB].W  = aDlg[IDRACDB].W;
    aDlg[IDINSELB].H  = aDlg[IDRACDB].H;
    aDlg[IDCYCLEB].X  = aDlg[IDRACDB].X;
    aDlg[IDCYCLEB].W  = aDlg[IDRACDB].W / 2 - 5;
    aDlg[IDCYCLEB].H  = aDlg[IDRACDB].H;
    aDlg[IDPROMPTB].X = aDlg[IDRACDB].X + aDlg[IDRACDB].W / 2;
    aDlg[IDPROMPTB].W = aDlg[IDCYCLEB].W;
    aDlg[IDPROMPTB].H = aDlg[IDRACDB].H;

    nGapH = AkelPad.MemRead(lpBuffer + 4, DT_DWORD);
    GetControlRect(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_WHOLEWORD));
    nGapH = AkelPad.MemRead(lpBuffer + 4, DT_DWORD) - nGapH;

    aDlg[IDFRTL].Y     = nDlgH + ((nDlgType == MLT_FIND) ? (bGoToDlg ? 0 : 1) : (bGoToDlg ? 1 : 2)) * nGapH;
    aDlg[IDFINDL].Y    = nDlgH + (bGoToDlg ? 2 : 3) * nGapH;
    aDlg[IDREPLACEL].Y = nDlgH + (bGoToDlg ? 1 : 2) * nGapH;
    aDlg[IDGOTOL].Y    = nDlgH + ((nDlgType == MLT_FIND) ? 2 : 3) * nGapH;
    aDlg[IDRACDB].Y    = nDlgH;
    aDlg[IDRAWMB].Y    = nDlgH + nGapH;
    aDlg[IDINSELB].Y   = nDlgH + ((nDlgType == MLT_FIND) ? 1 : 2) * nGapH;
    aDlg[IDCYCLEB].Y   = nDlgH + ((nDlgType == MLT_FIND) ? 2 : 3) * nGapH;
    aDlg[IDPROMPTB].Y  = nDlgH + ((nDlgType == MLT_FIND) ? 2 : 3) * nGapH;

    aDlg[IDHELP1L].Create   = true;
    aDlg[IDHELP2L].Create   = true;
    aDlg[IDFRTL].Create     = true;
    aDlg[IDFINDL].Create    = (nDlgType == MLT_REPLACE);
    aDlg[IDREPLACEL].Create = (nDlgType == MLT_FIND);
    aDlg[IDGOTOL].Create    = bGoToDlg;
    aDlg[IDMOREB].Create    = true;
    aDlg[IDRACDB].Create    = (nDlgType == MLT_REPLACE);
    aDlg[IDRAWMB].Create    = (nDlgType == MLT_REPLACE);
    aDlg[IDINSELB].Create   = true;
    aDlg[IDCYCLEB].Create   = true;
    aDlg[IDPROMPTB].Create  = true;

    if (nDlgType == MLT_REPLACE)
    {
      GetControlRect(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REPLACE));
      aDlg[IDHELP2L].X = AkelPad.MemRead(lpBuffer + 8, DT_DWORD) + 1;
      aDlg[IDHELP2L].Y = AkelPad.MemRead(lpBuffer + 4, DT_DWORD) + (AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - AkelPad.MemRead(lpBuffer + 4, DT_DWORD) - aDlg[IDHELP2L].H) / 2;
    }
  }
}

function GetControlRect(hWnd)
{
  oSys.Call("User32::GetWindowRect", hWnd, lpBuffer);
  oSys.Call("User32::ScreenToClient", hDlg, lpBuffer);
  oSys.Call("User32::ScreenToClient", hDlg, lpBuffer + 8);
}

function ShowMore(bResize)
{
  var nSearchOptions;
  var i;

  oSys.Call("User32::SetWindowTextW", oSys.Call("User32::GetDlgItem", hDlg, IDMOREB), bMore ? "<< " + sTxtMore : sTxtMore + " >>");

  if (bResize)
    ResizeDialog((bMore ? 1 : -1) * (((nDlgType == MLT_FIND) ? 3 : 4) * nGapH + 6));

  for (i = IDFRTL; i <= IDPROMPTB; ++i)
  {
    if (aDlg[i].Create && (i != IDMOREB))
      oSys.Call("User32::ShowWindow", oSys.Call("User32::GetDlgItem", hDlg, i), bMore);
  }

  if (bMore)
  {
    nSearchOptions = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0);

    oSys.Call("User32::SendDlgItemMessageW", hDlg, IDRACDB,   0x00F1 /*BM_SETCHECK*/, nSearchOptions & FRF_REPLACEALLANDCLOSE, 0);
    oSys.Call("User32::SendDlgItemMessageW", hDlg, IDRAWMB,   0x00F1 /*BM_SETCHECK*/, nSearchOptions & FRF_REPLACEALLNOMSG, 0);
    oSys.Call("User32::SendDlgItemMessageW", hDlg, IDINSELB,  0x00F1 /*BM_SETCHECK*/, nSearchOptions & FRF_CHECKINSELIFSEL, 0);
    oSys.Call("User32::SendDlgItemMessageW", hDlg, IDCYCLEB,  0x00F1 /*BM_SETCHECK*/, nSearchOptions & FRF_CYCLESEARCH, 0);
    oSys.Call("User32::SendDlgItemMessageW", hDlg, IDPROMPTB, 0x00F1 /*BM_SETCHECK*/, nSearchOptions & FRF_CYCLESEARCHPROMPT, 0);
    oSys.Call("User32::EnableWindow", oSys.Call("User32::GetDlgItem", hDlg, IDPROMPTB), nSearchOptions & FRF_CYCLESEARCH);
  }
}

function ShowHelpLinksFR()
{
  if (SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REGEXP), 0x00F0 /*BM_GETCHECK*/, 0, 0))
  {
    aDlg[IDHELP1L].Show = true;
    aDlg[IDHELP2L].Show = (nDlgType == MLT_REPLACE);
  }
  else
  {
    aDlg[IDHELP1L].Show = false;
    aDlg[IDHELP2L].Show = false;
  }

  oSys.Call("User32::ShowWindow", oSys.Call("User32::GetDlgItem", hDlg, IDHELP1L), aDlg[IDHELP1L].Show);
  oSys.Call("User32::ShowWindow", oSys.Call("User32::GetDlgItem", hDlg, IDHELP2L), aDlg[IDHELP2L].Show);
}

function GetDialogWnd()
{
  var hWnd = SendMessage(hMainWnd, 1275 /*AKD_GETMODELESS*/, 0, lpBuffer);
  var nMLT = AkelPad.MemRead(lpBuffer, DT_DWORD);

  hWhatE = 0;
  hWithE = 0;

  if ((nMLT == MLT_FIND) || (nMLT == MLT_REPLACE) || (nMLT == MLT_GOTO))
  {
    nDlgType = nMLT;
    hDlg     = hWnd;
    hCancelB = oSys.Call("User32::GetDlgItem", hDlg, IDCANCEL);

    if (nMLT != MLT_GOTO)
    {
      AkelPad.MemCopy(lpBuffer, (_X64 ? 64 : 52) /*sizeof(COMBOBOXINFO)*/, DT_DWORD);
      oSys.Call("User32::GetComboBoxInfo", oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_FIND), lpBuffer);
      hWhatE = AkelPad.MemRead(lpBuffer + (_X64 ? 48 : 44) /*hwndItem*/, DT_QWORD);

      if (nMLT == MLT_REPLACE)
      {
        oSys.Call("User32::GetComboBoxInfo", oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REPLACE), lpBuffer);
        hWithE = AkelPad.MemRead(lpBuffer + (_X64 ? 48 : 44) /*hwndItem*/, DT_QWORD);
      }
    }
  }
  else
    hDlg = 0;
}

function GetDialogPos()
{
  oSys.Call("User32::GetWindowRect", hDlg, lpBuffer);

  nDlgX = AkelPad.MemRead(lpBuffer,     DT_DWORD);
  nDlgY = AkelPad.MemRead(lpBuffer + 4, DT_DWORD);
}

function SwitchDialog(nMLT)
{
  bContinue = true;
  nDlgType  = nMLT;
  SendMessage(hDlg, 273 /*WM_COMMAND*/, IDCANCEL, hCancelB);
}

function ResizeDialog(nIncreaseH)
{
  var nW, nH;

  oSys.Call("User32::GetWindowRect", hDlg, lpBuffer);
  nW = AkelPad.MemRead(lpBuffer +  8, DT_DWORD) - AkelPad.MemRead(lpBuffer,     DT_DWORD);
  nH = AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - AkelPad.MemRead(lpBuffer + 4, DT_DWORD) + nIncreaseH;

  oSys.Call("User32::SetWindowPos", hDlg, 0, 0, 0, nW, nH, 0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/);
}

function SetParamsFR(nMatchCase, nWholeWord, nRegExp, nEscSeq, nDirection)
{
  if (nMatchCase != 2)
  {
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_MATCHCASE), 0x00F1 /*BM_SETCHECK*/, nMatchCase, 0);
    SendMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_MATCHCASE, oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_MATCHCASE));
  }
  if (nWholeWord != 2)
  {
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_WHOLEWORD), 0x00F1 /*BM_SETCHECK*/, nWholeWord, 0);
    SendMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_WHOLEWORD, oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_WHOLEWORD));
  }
  if (nRegExp != 2)
  {
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REGEXP), 0x00F1 /*BM_SETCHECK*/, nRegExp, 0);
    SendMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_REGEXP, oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REGEXP));
  }
  if (nEscSeq != 2)
  {
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_ESCAPESEQ), 0x00F1 /*BM_SETCHECK*/, nEscSeq, 0);
    SendMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_ESCAPESEQ, oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_ESCAPESEQ));
  }
  if (nDirection != 2)
  {
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_BACKWARD),  0x00F1 /*BM_SETCHECK*/, 0, 0);
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_FORWARD),   0x00F1 /*BM_SETCHECK*/, 0, 0);
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_BEGINNING), 0x00F1 /*BM_SETCHECK*/, 0, 0);
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_INSEL),     0x00F1 /*BM_SETCHECK*/, 0, 0);
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_ALLFILES),  0x00F1 /*BM_SETCHECK*/, 0, 0);
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, nDirection),           0x00F1 /*BM_SETCHECK*/, 1, 0);
    SendMessage(hDlg, 273 /*WM_COMMAND*/, nDirection, oSys.Call("User32::GetDlgItem", hDlg, nDirection));
  }
}

function SetParamsGT(nGoTo)
{
  if (nGoTo != 2)
  {
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_GOTO_LINE),   0x00F1 /*BM_SETCHECK*/, 0, 0);
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_GOTO_OFFSET), 0x00F1 /*BM_SETCHECK*/, 0, 0);
    SendMessage(oSys.Call("User32::GetDlgItem", hDlg, nGoTo),           0x00F1 /*BM_SETCHECK*/, 1, 0);
    SendMessage(hDlg, 273 /*WM_COMMAND*/, nGoTo, oSys.Call("User32::GetDlgItem", hDlg, nGoTo));
  }
}

function GetWhatWithFR()
{
  if (hWhatE)
  {
    oSys.Call("User32::GetWindowTextW", hWhatE, lpBuffer, nBufSize / 2);
    sWhatText = AkelPad.MemRead(lpBuffer, DT_UNICODE);
  }

  if (hWithE)
  {
    oSys.Call("User32::GetWindowTextW", hWithE, lpBuffer, nBufSize / 2);
    sWithText = AkelPad.MemRead(lpBuffer, DT_UNICODE);
  }
}

function SetFRTtoFR()
{
  var nItem = GetCurSelLV();
  var sParams;
  var nMatchCase;
  var nWholeWord;
  var nRegExp;
  var nEscSeq;

  if (nItem > -1)
  {
    nWhatSel1 = 0;
    nWhatSel2 = -1;
    oSys.Call("User32::SetWindowTextW", hWhatE, GetTextLV(nItem, 1));

    if (hWithE)
    {
      nWithSel1 = 0;
      nWithSel2 = -1;
      oSys.Call("User32::SetWindowTextW", hWithE, GetTextLV(nItem, 2));
    }

    sParams    = GetTextLV(nItem, 3);
    nMatchCase = parseInt(sParams.substr(0, 1));
    nWholeWord = parseInt(sParams.substr(1, 1));
    nRegExp    = parseInt(sParams.substr(2, 1));
    nEscSeq    = parseInt(sParams.substr(3, 1));

    SetParamsFR(nMatchCase, nWholeWord, nRegExp, nEscSeq, 2);
  }

  PostMessage(hWndFRT, 16 /*WM_CLOSE*/, 0, 0);
}

function FRTemplates()
{
  var nDeskW, nDeskH, nFRTX, nFRTY;

  oSys.Call("User32::GetWindowRect", oSys.Call("user32::GetDesktopWindow"), lpBuffer);
  nDeskW = AkelPad.MemRead(lpBuffer +  8, DT_DWORD);
  nDeskH = AkelPad.MemRead(lpBuffer + 12, DT_DWORD);

  oSys.Call("User32::GetWindowRect", hWhatE, lpBuffer);
  nFRTX = AkelPad.MemRead(lpBuffer + 8, DT_DWORD);
  nFRTY = AkelPad.MemRead(lpBuffer + 4, DT_DWORD) - 35;

  if (nFRTX + nFRTW > nDeskW)
    nFRTX = AkelPad.MemRead(lpBuffer, DT_DWORD) - nFRTW;
  if (nFRTX < 0)
    nFRTX = 0;
  if (nFRTY + nFRTH > nDeskH)
    nFRTY = nDeskH - nFRTH;

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

  hWndFRT =
    oSys.Call("user32::CreateWindowExW",
      0,           //dwExStyle
      sClassName,  //lpClassName
      sTxtFRTempl, //lpWindowName
      0x90CC0000,  //dwStyle=WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX
      nFRTX,       //x
      nFRTY,       //y
      nFRTW,       //nWidth
      nFRTH,       //nHeight
      hDlg,        //hWndParent
      0,           //ID
      hInstDLL,    //hInstance
      CallbackFRT);//Script function callback. To use it class must be registered by WindowRegisterClass.
}

function CallbackFRT(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 1) //WM_CREATE
  {
    var i;

    for (i = IDNAMELV; i <= IDHELP2L; ++i)
    {
      aWnd[i].HWND =
        oSys.Call("User32::CreateWindowExW",
          0,            //dwExStyle
          aWnd[i].Class,//lpClassName
          aWnd[i].Text, //lpWindowName
          aWnd[i].Style,//dwStyle
          0, 0, 0, 0,   //x, y, nWidth, nHeight
          hWnd,         //hWndParent
          i,            //ID
          hInstDLL,     //hInstance
          0);           //lpParam
      SendMessage(aWnd[i].HWND, 48 /*WM_SETFONT*/, hGuiFont, true);
    }

    for (i = IDWHATE; i <= IDWITHE; ++i)
    {
      SendMessage(aWnd[i].HWND, 3262 /*AEM_SETTEXTLIMIT*/, 511, 0);
      SendMessage(aWnd[i].HWND, 1093 /*EM_SETEVENTMASK*/, 0, 0x1 /*ENM_CHANGE*/);
      aSubClassFRT[i] = AkelPad.WindowSubClass(aWnd[i].HWND, EditCallbackFRT, 256 /*WM_KEYDOWN*/);
    }

    InsertColumnsLV();
    FillLV();
    RefreshViewFRT();

    hFocus = aWnd[IDNAMELV].HWND;
  }

  else if ((uMsg == 6 /*WM_ACTIVATE*/) && (! wParam))
    hFocus = oSys.Call("User32::GetFocus");

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("User32::SetFocus", hFocus);

  else if (uMsg == 36) //WM_GETMINMAXINFO
  {
    AkelPad.MemCopy(lParam + 24, nFRTMinW, DT_DWORD); //ptMinTrackSize_x
    AkelPad.MemCopy(lParam + 28, nFRTMinH, DT_DWORD); //ptMinTrackSize_y
  }

  else if (uMsg == 5) //WM_SIZE
    ResizeFRT(LoWord(lParam), HiWord(lParam));

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

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

    if (wParam == 0x2D /*VK_INSERT*/)
    {
      if ((hFocus != aWnd[IDWHATE].HWND) && (hFocus != aWnd[IDWITHE].HWND))
      {
        if (Ctrl() || Shift())
          EditFRT(1);
        else
          EditFRT(0);
      }
    }
    else if (wParam == 0x2E /*VK_DELETE*/)
    {
      if ((hFocus != aWnd[IDWHATE].HWND) && (hFocus != aWnd[IDWITHE].HWND))
      {
        if ((! Ctrl()) && (! Shift()))
          DeleteFRT();
      }
    }
    else if (wParam == 0x70 /*VK_F1*/)
    {
      if ((! Ctrl()) && (! Shift()) && SendMessage(aWnd[IDREGEXP].HWND, 0x00F0 /*BM_GETCHECK*/, 0, 0))
      {
        if (hFocus == aWnd[IDWITHE].HWND)
          RegExpHelp(IDHELP2L);
        else
        {
          oSys.Call("User32::SetFocus", aWnd[IDWHATE].HWND);
          RegExpHelp(IDHELP1L);
        }
      }
    }
    else if ((wParam == 0x71 /*VK_F2*/) || (wParam == 0x73 /*VK_F4*/))
    {
      if ((! Ctrl()) && (! Shift()))
        EditFRT(2);
    }
    else if (wParam == 0x0D /*VK_RETURN*/)
    {
      if ((! Ctrl()) && (! Shift()))
      {
        if (oSys.Call("User32::GetDlgCtrlID", hFocus) < IDNEWB)
          SetFRTtoFR();
      }
    }
    else if (wParam == 0x1B /*VK_ESCAPE*/)
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 0x004E /*WM_NOTIFY*/)
  {
    if (wParam == IDNAMELV)
    {
      switch (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), DT_DWORD))
      {
        case -101 : //LVN_ITEMCHANGED
          if (AkelPad.MemRead(lParam + (_X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, DT_DWORD) & 0x2 /*LVIS_SELECTED*/)
            RefreshViewFRT();
          break;
        case -3 : //NM_DBLCLK
          if (AkelPad.MemRead(lParam + (_X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) == -1)
            SetCurSelLV(GetCurFocLV());
          else
            SetFRTtoFR();
          break;
        case -2 : //NM_CLICK
        case -5 : //NM_RCLICK
        case -6 : //NM_RDBLCLK
          if (AkelPad.MemRead(lParam + (_X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) == -1)
            SetCurSelLV(GetCurFocLV());
          break;
      }
    }
    else if ((wParam == IDHELP1L) || (wParam == IDHELP2L))
    {
      if (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), DT_DWORD) == -2 /*NM_CLICK*/)
        RegExpHelp(wParam);
    }
  }

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

    if ((nLowParam == IDWHATE) || (nLowParam == IDWITHE))
    {
      if ((nHiwParam == 0x0300 /*EN_CHANGE*/) && (oSys.Call("User32::GetFocus") == lParam))
        SetEditTextToLV(nLowParam, lParam);
    }
    else if ((nLowParam >= IDMATCHC) && (nLowParam <= IDESCSEQ))
      CheckButtonsFRT(nLowParam);
    else if ((nLowParam >= IDNEWB) && (nLowParam <= IDEDITB))
      EditFRT(nLowParam - IDNEWB);
    else if (nLowParam == IDDELB)
      DeleteFRT();
    else if (nLowParam == IDOKB)
      SetFRTtoFR();
    else if (nLowParam == IDCLOSEB)
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    AkelPad.WindowUnsubClass(aWnd[IDWHATE].HWND);
    AkelPad.WindowUnsubClass(aWnd[IDWITHE].HWND);

    oSys.Call("User32::GetWindowRect", hWnd, lpBuffer);
    nFRTW   = AkelPad.MemRead(lpBuffer +  8, DT_DWORD) - AkelPad.MemRead(lpBuffer,     DT_DWORD);
    nFRTH   = AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - AkelPad.MemRead(lpBuffer + 4, DT_DWORD);
    nFRTSel = GetCurSelLV();

    WriteFRT();
    oSys.Call("User32::EnableWindow", hDlg, 1);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

  else
  {
    var nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
    if ((nID >= IDNAMELV) && (nID < IDNEWB))
      oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, IDOKB, 0);
  }

  return 0;
}

function EditCallbackFRT(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 256) //WM_KEYDOWN
  {
    if ((wParam == 9 /*VK_TAB*/) && Ctrl())
      AkelPad.WindowNoNextProc(aSubClassFRT[oSys.Call("User32::GetDlgCtrlID", hWnd)]);
  }

  return 0;
}

function PaintSizeGrip(hWnd)
{
  var lpPaint = AkelPad.MemAlloc(_X64 ? 72 : 64); //sizeof(PAINTSTRUCT)
  var hDC;

  if (hDC = oSys.Call("User32::BeginPaint", hWnd, lpPaint))
  {
    oSys.Call("User32::GetClientRect", hWnd, lpBuffer);

    AkelPad.MemCopy(lpBuffer,     AkelPad.MemRead(lpBuffer +  8, DT_DWORD) - oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/), DT_DWORD);
    AkelPad.MemCopy(lpBuffer + 4, AkelPad.MemRead(lpBuffer + 12, DT_DWORD) - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), DT_DWORD);

    oSys.Call("User32::DrawFrameControl", hDC, lpBuffer, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/);
    oSys.Call("User32::EndPaint", hWnd, lpPaint);
  }

  AkelPad.MemFree(lpPaint);
}

function ResizeFRT(nW, nH)
{
  var nFlags = 0x14; //SWP_NOACTIVATE|SWP_NOZORDER
  var nW5    = Scale.X(5);
  var nW10   = Scale.X(10);
  var nH10   = Scale.Y(10);
  var nH13   = Scale.Y(13);
  var nH16   = Scale.Y(16);
  var nH20   = Scale.Y(20);
  var nH21   = Scale.Y(21);
  var nH25   = Scale.Y(25);
  var nEW    = Math.round((nW - 3 * nW10) / 2);
  var nEH    = Math.round((nH - 2 * nH25 - 3 * nH10 - 4 * nH20 - nH21) / 2);
  var nLVW   = nW - 3 * nW10 - nEW;
  var nBW    = (nW - (IDCLOSEB - IDNEWB) * nW5 - 2 * nW10) / (IDCLOSEB - IDNEWB + 1);
  var nSBW   = 0;
  var i;

  oSys.Call("User32::SetWindowPos",
    aWnd[IDNAMELV].HWND, 0,
    nW10,
    nH10,
    nLVW,
    nH - 3 * nH10 - nH21,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aWnd[IDWHATS].HWND, 0,
    nW - nEW - nW10,
    nH10,
    nEW,
    nH13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aWnd[IDHELP1L].HWND, 0,
    nW - aDlg[IDHELP1L].W - nW10,
    nH10,
    aDlg[IDHELP1L].W,
    nH13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aWnd[IDWHATE].HWND, 0,
    nW - nEW - nW10,
    nH25,
    nEW,
    nEH,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aWnd[IDWITHS].HWND, 0,
    nW - nEW - nW10,
    nH25 + nEH + nH10,
    nEW,
    nH13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aWnd[IDHELP2L].HWND, 0,
    nW - aDlg[IDHELP2L].W - nW10,
    nH25 + nEH + nH10,
    aDlg[IDHELP2L].W,
    nH13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aWnd[IDWITHE].HWND, 0,
    nW - nEW - nW10,
    2 * nH25 + nEH,
    nEW,
    nEH,
    nFlags);
  for (i = IDMATCHC; i <= IDESCSEQ; ++i)
    oSys.Call("User32::SetWindowPos",
      aWnd[i].HWND, 0,
      nW - nEW - nW10,
      nH - 2 * nH10 - nH21 - (IDESCSEQ - i + 1) * nH20,
      nEW,
      nH16,
      nFlags);
  for (i = IDNEWB; i <= IDCLOSEB; ++i)
    oSys.Call("User32::SetWindowPos",
      aWnd[i].HWND, 0,
      nW10 + (i - IDNEWB) * (nBW + nW5),
      nH - nH21 - nH10,
      nBW,
      nH21,
      nFlags);

  if (GetItemCountLV() > SendMessage(aWnd[IDNAMELV].HWND, 0x1028 /*LVM_GETCOUNTPERPAGE*/, 0, 0))
    nSBW = oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/);

  SendMessage(aWnd[IDNAMELV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, nLVW - nSBW);
  SendMessage(aWnd[IDNAMELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, GetCurSelLV(), false);

  SendMessage(aWnd[IDWHATE].HWND, 3242 /*AEM_SETWORDWRAP*/, 0x2 /*AEWW_SYMBOL*/, 0);
  SendMessage(aWnd[IDWITHE].HWND, 3242 /*AEM_SETWORDWRAP*/, 0x2 /*AEWW_SYMBOL*/, 0);
}

function RefreshViewFRT()
{
  var nItem   = GetCurSelLV();
  var bIsItem = (nItem > -1);
  var sParams = bIsItem ? GetTextLV(nItem, 3) : "";
  var i;

  for (i = IDWHATE; i <= IDWITHE; ++i)
  {
    oSys.Call("User32::SetWindowTextW", aWnd[i].HWND, bIsItem ? GetTextLV(nItem, i - IDWHATE + 1) : "");
    oSys.Call("User32::EnableWindow", aWnd[i].HWND, bIsItem);
  }

  for (i = IDMATCHC; i <= IDESCSEQ; ++i)
  {
    SendMessage(aWnd[i].HWND, 0x00F1 /*BM_SETCHECK*/, parseInt(sParams.substr(i - IDMATCHC, 1)), 0);
    oSys.Call("User32::EnableWindow", aWnd[i].HWND, bIsItem);
  }

  for (i = IDEDITB; i <= IDDELB; ++i)
    oSys.Call("User32::EnableWindow", aWnd[i].HWND, bIsItem);

  ShowHelpLinksFRT();
}

function SetEditTextToLV(nID, hWnd)
{
  oSys.Call("User32::GetWindowTextW", hWnd, lpBuffer, nBufSize / 2);
  SetTextLV(GetCurSelLV(), nID - IDWHATE + 1, AkelPad.MemRead(lpBuffer, DT_UNICODE).replace(/[\r\n\t]/g, ""));
  bChangeFRT = true;
}

function CheckButtonsFRT(nID)
{
  var sParams = "";
  var i;

  if ((nID == IDREGEXP) && SendMessage(aWnd[IDREGEXP].HWND, 0x00F0 /*BM_GETCHECK*/, 0, 0))
    SendMessage(aWnd[IDESCSEQ].HWND, 0x00F1 /*BM_SETCHECK*/, 0, 0);
  else if ((nID == IDESCSEQ) && SendMessage(aWnd[IDESCSEQ].HWND, 0x00F0 /*BM_GETCHECK*/, 0, 0))
    SendMessage(aWnd[IDREGEXP].HWND, 0x00F1 /*BM_SETCHECK*/, 0, 0);

  ShowHelpLinksFRT();

  for (i = IDMATCHC; i <= IDESCSEQ; ++i)
    sParams += SendMessage(aWnd[i].HWND, 0x00F0 /*BM_GETCHECK*/, 0, 0).toString();

  SetTextLV(GetCurSelLV(), 3, sParams);

  bChangeFRT = true;
}

function ShowHelpLinksFRT()
{
  bShow = SendMessage(aWnd[IDREGEXP].HWND, 0x00F0 /*BM_GETCHECK*/, 0, 0);

  oSys.Call("User32::ShowWindow", aWnd[IDHELP1L].HWND, bShow);
  oSys.Call("User32::ShowWindow", aWnd[IDHELP2L].HWND, bShow);
}

function GetItemCountLV()
{
  return SendMessage(aWnd[IDNAMELV].HWND, 0x1004 /*LVM_GETITEMCOUNT*/, 0, 0);
}

function GetCurFocLV()
{
  return SendMessage(aWnd[IDNAMELV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0001 /*LVNI_FOCUSED*/);
}

function GetCurSelLV()
{
  return SendMessage(aWnd[IDNAMELV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0002 /*LVNI_SELECTED*/);
}

function SetCurSelLV(nItem)
{
  AkelPad.MemCopy(lpLVITEM + 12, 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD);
  AkelPad.MemCopy(lpLVITEM + 16, 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD);
  SendMessage(aWnd[IDNAMELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
  SendMessage(aWnd[IDNAMELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, false);
}

function GetTextLV(nItem, nSubItem)
{
  AkelPad.MemCopy(lpLVITEM + 8, nSubItem, DT_DWORD);
  SendMessage(aWnd[IDNAMELV].HWND, 0x1073 /*LVM_GETITEMTEXTW*/, nItem, lpLVITEM);
  return AkelPad.MemRead(lpBuffer, DT_UNICODE);
}

function SetTextLV(nItem, nSubItem, sText)
{
  AkelPad.MemCopy(lpLVITEM + 8, nSubItem, DT_DWORD);
  AkelPad.MemCopy(lpBuffer, sText, DT_UNICODE);
  SendMessage(aWnd[IDNAMELV].HWND, 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);
}

function InsertItemLV(aField)
{
  var nItem;
  var i;

  AkelPad.MemCopy(lpLVITEM + 8, 0, DT_DWORD);
  AkelPad.MemCopy(lpBuffer, aField[0], DT_UNICODE);
  nItem = SendMessage(aWnd[IDNAMELV].HWND, 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);

  for (i = 1; i < 4; ++i)
  {
    AkelPad.MemCopy(lpLVITEM + 8, i, DT_DWORD);
    AkelPad.MemCopy(lpBuffer, aField[i], DT_UNICODE);
    SendMessage(aWnd[IDNAMELV].HWND, 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);
  }

  return nItem;
}

function DeleteItemLV(nItem)
{
  SendMessage(aWnd[IDNAMELV].HWND, 0x1008 /*LVM_DELETEITEM*/, nItem, 0);
}

function InsertColumnsLV()
{
  var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44); //sizeof(LVCOLUMN)
  var aText      = [sTxtName, sTxtFindWhat, sTxtReplaceWith, ""];
  var i;

  AkelPad.MemCopy(lpLVCOLUMN, 6 /*mask=LVCF_WIDTH|LVCF_TEXT*/, DT_DWORD);
  AkelPad.MemCopy(lpLVCOLUMN + (_X64 ? 16 : 12), lpBuffer, DT_QWORD);

  for (i = 0; i < 4; ++i)
  {
    AkelPad.MemCopy(lpBuffer, aText[i], DT_UNICODE);
    SendMessage(aWnd[IDNAMELV].HWND, 0x1061 /*LVM_INSERTCOLUMNW*/, i, lpLVCOLUMN);
  }

  SendMessage(aWnd[IDNAMELV].HWND, 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0x0020 /*LVS_EX_FULLROWSELECT*/, 0x0020);
  AkelPad.MemFree(lpLVCOLUMN);
}

function FillLV()
{
  var aRecord = AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, "_templates.tsv"), 0x1D /*OD_ADT_BINARY_ERROR|OD_ADT_DETECT_CODEPAGE|OD_ADT_DETECT_BOM|OD_ADT_NOMESSAGES*/);
  var aField;
  var i;

  if (aRecord)
    aRecord = aRecord.split("\r\n");
  else
  {
    aRecord    = ["Empty lines\t^[ \\t]*$\\n*\t\t0010"];
    bChangeFRT = true;
  }

  for (i = 0; i < aRecord.length; ++i)
  {
    aField = aRecord[i].split("\t");

    if (aField[0])
    {
      while (aField.length < 4)
        aField[aField.length] = "";

      while (aField[3].length < 4)
        aField[3] += "0";

      aField[3] = aField[3].replace(/[^1]/g, "0");

      InsertItemLV(aField);
    }
  }

  if (nFRTSel > GetItemCountLV() - 1)
    nFRTSel = GetItemCountLV() - 1;
  if (nFRTSel < 0)
    nFRTSel = 0;

  SetCurSelLV(nFRTSel);
}

function WriteFRT()
{
  if (bChangeFRT)
  {
    var nItems = GetItemCountLV();
    var sText  = "";
    var i;

    bChangeFRT = false;

    for (i = 0; i < nItems; ++i)
      sText += GetTextLV(i, 0) + "\t" + GetTextLV(i, 1) + "\t" + GetTextLV(i, 2) + "\t" + GetTextLV(i, 3) + "\r\n";

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



Last edited by KDJ on Mon Jul 21, 2014 7:11 pm; edited 12 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Fri Jan 25, 2013 11:09 pm    Post subject: Reply with quote

Extended version of "Find/Replace" dialog - part 2.

FindReplaceEx_part2.js

Code:
function EditFRT(nType)
{
  var nItem   = GetCurSelLV();
  var aField  = [];
  var sParams = "";
  var sCaption;
  var i;

  if (nType == 1) //Add
  {
    GetWhatWithFR();
    sCaption = sTxtAdd;
    aField = [
      "",
      sWhatText,
      (nDlgType == MLT_REPLACE) ? sWithText : "",
      SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_MATCHCASE), 0x00F0 /*BM_GETCHECK*/, 0, 0).toString(),
      SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_WHOLEWORD), 0x00F0 /*BM_GETCHECK*/, 0, 0).toString(),
      SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REGEXP),    0x00F0 /*BM_GETCHECK*/, 0, 0).toString(),
      SendMessage(oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_ESCAPESEQ), 0x00F0 /*BM_GETCHECK*/, 0, 0).toString()];
  }
  else
  {
    if (nType == 0) //New
      sCaption = sTxtNew;
    else //Edit
    {
      if (nItem < 0)
        return;
      sCaption = sTxtEdit;
    }

    for (i = 0; i < 3; ++i)
      aField[i] = (nItem < 0) ? "" : GetTextLV(nItem, i);

    if (nItem > -1)
      sParams = GetTextLV(nItem, 3);

    for (i = 3; i < 7; ++i)
      aField[i] = sParams.substr(i - 3, 1);
  }

  aField = InputBox(hWndFRT, sCaption, [sTxtName + ":", sTxtFindWhat + ":", sTxtReplaceWith + ":", sTxtMatchCase.replace("&", "") + " " + sTxt1Yes0No + ":", sTxtWholeWord.replace("&", "") + ":", sTxtRegExp.replace("&", "") + ":", sTxtEscSeq.replace("&", "") + ":"], aField, 0, "CheckInputFRT", nType);

  if (aField)
  {
    if (nType == 2) //Edit
      DeleteItemLV(nItem)

    for (i = 0; i < 3; ++i)
      aField[i] = aField[i].replace(/[\r\n\t]/g, "");

    for (i = 3; i < 7; ++i)
    {
      if (aField[i] != "1")
        aField[i] = "0";
    }

    if ((aField[5] == "1") && (aField[6] == "1"))
      aField[5] = "0";

    aField[3] += aField[4] + aField[5] + aField[6]
    aField.splice(4, 3);

    SetCurSelLV(InsertItemLV(aField));
    bChangeFRT = true;
  }
}

function CheckInputFRT(hWnd, aField, nType)
{
  var sCaption;
  var lpLVFINDINFO;
  var nSelItem;
  var nFindItem;

  if (nType == 0)
    sCaption = sTxtNew;
  else if (nType == 1)
    sCaption = sTxtAdd;
  else if (nType == 2)
    sCaption = sTxtEdit;

  if (aField[0])
  {
    lpLVFINDINFO = AkelPad.MemAlloc(_X64 ? 40 : 24); //sizeof(LVFINDINFO)
    AkelPad.MemCopy(lpLVFINDINFO, 0x02 /*LVFI_STRING*/, DT_DWORD);
    AkelPad.MemCopy(lpLVFINDINFO + (_X64 ? 8 : 4), lpBuffer, DT_QWORD);
    AkelPad.MemCopy(lpBuffer, aField[0], DT_UNICODE);

    nSelItem  = GetCurSelLV();
    nFindItem = SendMessage(aWnd[IDNAMELV].HWND, 0x1053 /*LVM_FINDITEMW*/, -1, lpLVFINDINFO);

    AkelPad.MemFree(lpLVFINDINFO);

    if (nFindItem > -1)
    {
      if ((nType < 2) || (nFindItem != nSelItem))
      {
        WarningBox(hWnd, sTxtNameExists, sCaption);
        return 0;
      }
    }
  }
  else
  {
    WarningBox(hWnd, sTxtNoName, sCaption);
    return 0;
  }

  if (! aField[1])
  {
    WarningBox(hWnd, sTxtNoFindWhat, sCaption);
    return 1;
  }

  return -1;
}

function DeleteFRT()
{
  var nItem = GetCurSelLV();

  if (nItem > -1)
  {
    if (QuestionBox(hWndFRT, '"' + GetTextLV(nItem, 0) + '"\n\n' + sTxtWantRemove, sTxtDelete))
    {
      DeleteItemLV(nItem);

      if (nItem == GetItemCountLV())
        --nItem;

      SetCurSelLV(nItem);
      RefreshViewFRT();
      bChangeFRT = true;

      if (! oSys.Call("User32::IsWindowEnabled", oSys.Call("User32::GetFocus")))
        oSys.Call("User32::SetFocus", aWnd[IDNAMELV].HWND);
    }
  }
}

function WarningBox(hWnd, sText, sCaption)
{
  AkelPad.MessageBox(hWnd, sText, sCaption, 0x30 /*MB_ICONWARNING*/);
}

function QuestionBox(hWnd, sText, sCaption)
{
  return (AkelPad.MessageBox(hWnd, sText, sCaption, 0x23 /*MB_ICONQUESTION|MB_YESNOCANCEL*/) == 6 /*IDYES*/);
}

function RegExpHelp(nHelpID, hWndOwn)
{
  var oFSO    = new ActiveXObject("Scripting.FileSystemObject");
  var sDir    = AkelPad.GetAkelDir(2 /*ADTYPE_DOCS*/) + "\\";
  var hMenu   = oSys.Call("User32::CreatePopupMenu");
  var nString = 0x0000; //MF_STRING
  var nGrayed = 0x0001; //MF_GRAYED
  var nBreak  = 0x0060; //MF_MENUBREAK|MF_MENUBARBREAK
  var nSepar  = 0x0800; //MF_SEPARATOR
  var hFromPos;
  var hEdit;
  var aMenu;
  var sHelpFile;
  var nX;
  var nY;
  var nCmd;
  var i;

  if (nHelpID == IDHELP1L)
  {
    if (hWndOwn)
    {
      hFromPos = oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_FIND);
      hEdit    = hWhatE;
    }
    else
    {
      hFromPos = aWnd[IDWHATE].HWND;
      hEdit    = aWnd[IDWHATE].HWND;
    }

    aMenu = [
      [nString, ".",         sHlpAnyChar],
      [nString, "\\(",       sHlpSpecChars],
      [nString, "\\f",       sHlpFF],
      [nString, "\\n",       sHlpAnyNL],
      [nString, "\\r",       sHlpAnyNL],
      [nString, "\\t",       sHlpTab],
      [nString, "\\v",       sHlpVTab],
      [nString, "\\d",       sHlpDigit],
      [nString, "\\D",       sHlpNonDigit],
      [nString, "\\s",       sHlpWhiteSp],
      [nString, "\\S",       sHlpNonWhiteSp],
      [nString, "\\w",       sHlpWordChar],
      [nString, "\\W",       sHlpNonWordChar],
      [nString, "\\x{F}",    sHlpCharHex],
      [nString, "\\xFF",     sHlpCharHex2],
      [nString, "\\uFFFF",   sHlpCharHex4],
      [nSepar],
      [nString, "ab|xy",     sHlpAlternative],
      [nString, "[abc]",     sHlpCharSet],
      [nString, "[^abc]",    sHlpNegCharSet],
      [nString, "[a-z]",     sHlpRange],
      [nString, "[^a-z]",    sHlpNegRange],
      [nSepar],
      [nString, "^",         sHlpBeginLine],
      [nString, "$",         sHlpEndLine],
      [nString, "\\A",       sHlpBeginText],
      [nString, "\\Z",       sHlpEndText],
      [nString, "\\a",       sHlpBeginRange],
      [nString, "\\z",       sHlpEndRange],
      [nString, "\\b",       sHlpWordBoun],
      [nString, "\\B",       sHlpNonWordBoun],

      [nBreak,  "?",         sHlpZeroOrOne],
      [nString, "*",         sHlpZeroOrMore],
      [nString, "+",         sHlpOneOrMore],
      [nString, "{3}",       sHlpExactly],
      [nString, "{3,}",      sHlpAtLeast],
      [nString, "{3,7}",     sHlpFromTo],
      [nGrayed, "\xA0",      sHlpGreedy1],
      [nGrayed, "\xA0",      sHlpGreedy2],
      [nGrayed, "\xA0",      sHlpGreedy3],
      [nSepar],
      [nString, "(ab)",      sHlpCapture1],
      [nString, "(?^ab)",    sHlpCapture2],
      [nString, "(?:ab)",    sHlpNotCapture],
      [nString, "(?>bc|b)",  sHlpAtomicGrouping],
      [nString, "(?<=ab)",   sHlpPreceded],
      [nString, "(?<!ab)",   sHlpNotPreceded],
      [nString, "(?=ab)",    sHlpFollowed],
      [nString, "(?!ab)",    sHlpNotFollowed],
      [nString, "(?(1)x|y)", sHlpcondition],
      [nString, "\\9",       sHlpBackrefer9],
      [nString, "\\99",      sHlpBackrefer99],
      [nSepar],
      [nString, "(?i)",      sHlpIgnoreCase],
      [nString, "(?m)",      sHlpMultiline],
      [nString, "(?s)",      sHlpDotDefault],
      [nString, "(?U)",      sHlpInvertGreed],
      [nString, "(?-i)",     sHlpMatchCase],
      [nString, "(?-m)",     sHlpMultilineOff],
      [nString, "(?-s)",     sHlpDotDefaultOff],
      [nString, "(?-U)",     sHlpInvertGreedOff]];
  }
  else
  {
    if (hWndOwn)
    {
      hFromPos = oSys.Call("User32::GetDlgItem", hDlg, IDC_SEARCH_REPLACE);
      hEdit    = hWithE;
    }
    else
    {
      hFromPos = aWnd[IDWITHE].HWND;
      hEdit    = aWnd[IDWITHE].HWND;
    }

    aMenu = [
      [nString, "\\\\",    sHlpBackslash],
      [nString, "\\f",     sHlpFF],
      [nString, "\\n",     sHlpNL],
      [nString, "\\r",     sHlpNL],
      [nString, "\\t",     sHlpTab],
      [nString, "\\v",     sHlpVTab],
      [nString, "\\x{F}",  sHlpCharHex],
      [nString, "\\xFF",   sHlpCharHex2],
      [nString, "\\uFFFF", sHlpCharHex4],
      [nSepar],
      [nString, "\\0",     sHlpEntireStr],
      [nString, "\\9",     sHlpSubmatch9],
      [nString, "\\99",    sHlpSubmatch99]];
  }

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

  if (sHelpFile)
  {
    aMenu.push([nSepar]);
    aMenu.push([nString, "\xA0", "AkelHelp"]);
  }

  oSys.Call("User32::GetWindowRect", hFromPos, lpBuffer);
  nX = AkelPad.MemRead(lpBuffer +  0, DT_DWORD);
  nY = AkelPad.MemRead(lpBuffer + 12, DT_DWORD);

  if (hWndOwn)
    oSys.Call("User32::SetFocus", oSys.Call("User32::GetDlgItem", hDlg, nHelpID));
  else
  {
    hWndOwn = hWndFRT;
    oSys.Call("User32::SetFocus", hEdit);
  }

  for (i = 0; i < aMenu.length; ++i)
    oSys.Call("User32::AppendMenuW", hMenu, aMenu[i][0], i + 1, aMenu[i][1] + "\t" + aMenu[i][2]);

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

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

  if (nCmd--)
  {
    if (aMenu[nCmd][1] != "\xA0")
      SendMessage(hEdit, 0x00C2 /*EM_REPLACESEL*/, 1, aMenu[nCmd][1]);
    else if (aMenu[nCmd][2] == "AkelHelp")
      AkelPad.Exec('rundll32.exe shell32, ShellExec_RunDLL ' + sDir + sHelpFile);
  }
}

function ReadIni()
{
  var sLangTxt = AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, "_" + AkelPad.GetLangId() + ".lng"), 0x1D /*OD_ADT_BINARY_ERROR|OD_ADT_DETECT_CODEPAGE|OD_ADT_DETECT_BOM|OD_ADT_NOMESSAGES*/);

  if (sLangTxt)
  {
    try
    {
      eval(sLangTxt);
    }
    catch (oError)
    {
      sLangTxt = "";
    }
  }

  if (! sLangTxt)
  {
    sTxtMore           = '&More';
    sTxtReplAllCD      = '"Replace all" closes dialo&g';
    sTxtReplAllWM      = '"Replace all" withou&t message';
    sTxtCheckInSel     = 'Check "in selection" if selection &not empty';
    sTxtCycleSearch    = 'C&ycle search';
    sTxtPrompt         = '&Prompt';
    sTxtFRTempl        = 'Find/Replace templates';
    sTxtTemplates      = 'Templates';
    sTxtName           = 'Name';
    sTxtFindWhat       = 'Find - What';
    sTxtReplaceWith    = 'Replace - With';
    sTxtMatchCase      = 'Match &case';
    sTxtWholeWord      = '&Whole word';
    sTxtRegExp         = 'Regular e&xpressions';
    sTxtEscSeq         = '&Esc sequences';
    sTxt1Yes0No        = '(1 = Yes, 0 = No)';
    sTxtNew            = 'New';
    sTxtAdd            = 'Add';
    sTxtEdit           = 'Edit';
    sTxtDelete         = 'Delete';
    sTxtOK             = 'OK';
    sTxtClose          = 'Close';
    sTxtNameExists     = 'This name already exists.';
    sTxtNoName         = 'Field "Name" is required.';
    sTxtNoFindWhat     = 'Field "Find - What" is required.';
    sTxtWantRemove     = 'Do you want to remove it?';
    sHlpAnyChar        = 'any character (dot)';
    sHlpSpecChars      = '()[]{}^$.?+*|\\ special chars';
    sHlpFF             = 'form feed \\x0C';
    sHlpAnyNL          = 'any new line';
    sHlpTab            = 'tab \\x09';
    sHlpVTab           = 'vertical tab \\x0B';
    sHlpDigit          = 'digit [0-9]';
    sHlpNonDigit       = 'non-digit [^0-9]';
    sHlpWhiteSp        = 'whitespace [ \\f\\n\\t\\v]';
    sHlpNonWhiteSp     = 'non-whitespace';
    sHlpWordChar       = 'word character (non-delimiter)';
    sHlpNonWordChar    = 'non-word character (delimiter)';
    sHlpCharHex        = 'char - hex code, range 0-10FFFF';
    sHlpCharHex2       = 'char - 2-digit hex code';
    sHlpCharHex4       = 'char - 4-digit hex code';
    sHlpAlternative    = 'alternative ab or xy';
    sHlpCharSet        = 'character set, any specified';
    sHlpNegCharSet     = 'negative character set';
    sHlpRange          = 'range of chars from a to z';
    sHlpNegRange       = 'negative range of chars';
    sHlpBeginLine      = 'beginning of line';
    sHlpEndLine        = 'end of line';
    sHlpBeginText      = 'beginning of text';
    sHlpEndText        = 'end of text';
    sHlpBeginRange     = 'beginning of search range';
    sHlpEndRange       = 'end of search range';
    sHlpWordBoun       = 'word boundary';
    sHlpNonWordBoun    = 'non-word boundary';
    sHlpZeroOrOne      = 'zero or one time';
    sHlpZeroOrMore     = 'zero or more times';
    sHlpOneOrMore      = 'one or more times';
    sHlpExactly        = 'exactly 3 times';
    sHlpAtLeast        = 'at least 3 times';
    sHlpFromTo         = 'from 3 to 7 times';
    sHlpBackslash      = 'backslash';
    sHlpNL             = 'new line';
    sHlpEntireStr      = 'entire string matched';
    sHlpSubmatch9      = '9th captured submatch, range 1-9';
    sHlpSubmatch99     = '99th captured submatch, range 01-99';
    sHlpGreedy1        = 'Quantifiers are greedy, except';
    sHlpGreedy2        = 'for dot. Appending "?" to';
    sHlpGreedy3        = 'a quantifier, makes it lazy';
    sHlpCapture1       = 'matches ab, captures';
    sHlpCapture2       = 'matches negative ab, captures';
    sHlpNotCapture     = 'matches ab, not captures';
    sHlpAtomicGrouping = 'atomic grouping, not captures';
    sHlpPreceded       = 'preceded by ab';
    sHlpNotPreceded    = 'not preceded by ab';
    sHlpFollowed       = 'followed by ab';
    sHlpNotFollowed    = 'not followed by ab';
    sHlpcondition      = 'if (1) then x, else y';
    sHlpBackrefer9     = 'backreference, range 1-9';
    sHlpBackrefer99    = 'backreference, range 01-99';
    sHlpIgnoreCase     = 'case insensitive';
    sHlpMultiline      = 'multiline search (default)';
    sHlpDotDefault     = 'dot matches any char (default)';
    sHlpInvertGreed    = 'invert greediness';
    sHlpMatchCase      = 'match case';
    sHlpMultilineOff   = 'turn off multiline search';
    sHlpDotDefaultOff  = 'dot matches any char, except \\n';
    sHlpInvertGreedOff = 'turn off greediness inversion';
  }

  try
  {
    eval(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)
  {}

  nFRTW = Math.max(Scale.X(nFRTW), nFRTMinW);
  nFRTH = Math.max(Scale.Y(nFRTH), nFRTMinH);
}

function WriteIni()
{
  var sIniTxt =
    'bGoToDlg=' + bGoToDlg + ';\r\n' +
    'bMore='    + bMore    + ';\r\n' +
    'nDlgX='    + nDlgX    + ';\r\n' +
    'nDlgY='    + nDlgY    + ';\r\n' +
    'nFRTW='    + Scale.UX(nFRTW) + ';\r\n' +
    'nFRTH='    + Scale.UY(nFRTH) + ';\r\n' +
    'nFRTSel='  + nFRTSel + ';';

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


Interface language files for FindReplaceEx.js.
FindReplaceEx_1033.lng

Code:
/**************************************
FindReplaceEx.js - ver. 2014-07-21
Interface language
Language:      English (1033)
Translated by: KDJ
**************************************/
sTxtMore           = '&More';
sTxtReplAllCD      = '"Replace all" closes dialo&g';
sTxtReplAllWM      = '"Replace all" withou&t message';
sTxtCheckInSel     = 'Check "in selection" if selection &not empty';
sTxtCycleSearch    = 'C&ycle search';
sTxtPrompt         = '&Prompt';
sTxtFRTempl        = 'Find/Replace templates';
sTxtTemplates      = 'Templates';
sTxtName           = 'Name';
sTxtFindWhat       = 'Find - What';
sTxtReplaceWith    = 'Replace - With';
sTxtMatchCase      = 'Match &case';
sTxtWholeWord      = '&Whole word';
sTxtRegExp         = 'Regular e&xpressions';
sTxtEscSeq         = '&Esc sequences';
sTxt1Yes0No        = '(1 = Yes, 0 = No)';
sTxtNew            = 'New';
sTxtAdd            = 'Add';
sTxtEdit           = 'Edit';
sTxtDelete         = 'Delete';
sTxtOK             = 'OK';
sTxtClose          = 'Close';
sTxtNameExists     = 'This name already exists.';
sTxtNoName         = 'Field "Name" is required.';
sTxtNoFindWhat     = 'Field "Find - What" is required.';
sTxtWantRemove     = 'Do you want to remove it?';
sHlpAnyChar        = 'any character (dot)';
sHlpSpecChars      = '()[]{}^$.?+*|\\ special chars';
sHlpFF             = 'form feed \\x0C';
sHlpAnyNL          = 'any new line';
sHlpTab            = 'tab \\x09';
sHlpVTab           = 'vertical tab \\x0B';
sHlpDigit          = 'digit [0-9]';
sHlpNonDigit       = 'non-digit [^0-9]';
sHlpWhiteSp        = 'whitespace [ \\f\\n\\t\\v]';
sHlpNonWhiteSp     = 'non-whitespace';
sHlpWordChar       = 'word character (non-delimiter)';
sHlpNonWordChar    = 'non-word character (delimiter)';
sHlpCharHex        = 'char - hex code, range 0-10FFFF';
sHlpCharHex2       = 'char - 2-digit hex code';
sHlpCharHex4       = 'char - 4-digit hex code';
sHlpAlternative    = 'alternative ab or xy';
sHlpCharSet        = 'character set, any specified';
sHlpNegCharSet     = 'negative character set';
sHlpRange          = 'range of chars from a to z';
sHlpNegRange       = 'negative range of chars';
sHlpBeginLine      = 'beginning of line';
sHlpEndLine        = 'end of line';
sHlpBeginText      = 'beginning of text';
sHlpEndText        = 'end of text';
sHlpBeginRange     = 'beginning of search range';
sHlpEndRange       = 'end of search range';
sHlpWordBoun       = 'word boundary';
sHlpNonWordBoun    = 'non-word boundary';
sHlpZeroOrOne      = 'zero or one time';
sHlpZeroOrMore     = 'zero or more times';
sHlpOneOrMore      = 'one or more times';
sHlpExactly        = 'exactly 3 times';
sHlpAtLeast        = 'at least 3 times';
sHlpFromTo         = 'from 3 to 7 times';
sHlpBackslash      = 'backslash';
sHlpNL             = 'new line';
sHlpEntireStr      = 'entire string matched';
sHlpSubmatch9      = '9th captured submatch, range 1-9';
sHlpSubmatch99     = '99th captured submatch, range 01-99';
sHlpGreedy1        = 'Quantifiers are greedy, except';
sHlpGreedy2        = 'for dot. Appending "?" to';
sHlpGreedy3        = 'a quantifier, makes it lazy';
sHlpCapture1       = 'matches ab, captures';
sHlpCapture2       = 'matches negative ab, captures';
sHlpNotCapture     = 'matches ab, not captures';
sHlpAtomicGrouping = 'atomic grouping, not captures';
sHlpPreceded       = 'preceded by ab';
sHlpNotPreceded    = 'not preceded by ab';
sHlpFollowed       = 'followed by ab';
sHlpNotFollowed    = 'not followed by ab';
sHlpcondition      = 'if (1) then x, else y';
sHlpBackrefer9     = 'backreference, range 1-9';
sHlpBackrefer99    = 'backreference, range 01-99';
sHlpIgnoreCase     = 'case insensitive';
sHlpMultiline      = 'multiline search (default)';
sHlpDotDefault     = 'dot matches any char (default)';
sHlpInvertGreed    = 'invert greediness';
sHlpMatchCase      = 'match case';
sHlpMultilineOff   = 'turn off multiline search';
sHlpDotDefaultOff  = 'dot matches any char, except \\n';
sHlpInvertGreedOff = 'turn off greediness inversion';
- English template for translation
FindReplaceEx_1045.lng

Code:
/**************************************
FindReplaceEx.js - ver. 2014-07-21
Interface language
Language:      Polish (1045)
Translated by: KDJ
**************************************/
sTxtMore           = 'Wię&cej';
sTxtReplAllCD      = '"Zamień wszystko" za&myka okno dialogowe';
sTxtReplAllWM      = '"Zamień wszystko" &bez komunikatu';
sTxtCheckInSel     = 'U&staw "W zaznaczeniu" jeśli jest zaznaczenie';
sTxtCycleSearch    = 'Szu&kaj wkoło';
sTxtPrompt         = 'Zapy&tanie';
sTxtFRTempl        = 'Szablony Znajdź/Zamień';
sTxtTemplates      = 'Szablony';
sTxtName           = 'Nazwa';
sTxtFindWhat       = 'Znajdź - Co';
sTxtReplaceWith    = 'Zamień - Czym';
sTxtMatchCase      = 'Uwzględnij wielkość &liter';
sTxtWholeWord      = 'Całe &wyrazy';
sTxtRegExp         = 'Wyrażenia &regularne';
sTxtEscSeq         = 'Sekwencje &Esc';
sTxt1Yes0No        = '(1 = Tak, 0 = Nie)';
sTxtNew            = 'Nowy';
sTxtAdd            = 'Dodaj';
sTxtEdit           = 'Edytuj';
sTxtDelete         = 'Usuń';
sTxtOK             = 'OK';
sTxtClose          = 'Zamknij';
sTxtNameExists     = 'Ta nazwa już istnieje.';
sTxtNoName         = 'Pole "Nazwa" jest wymagane.';
sTxtNoFindWhat     = 'Pole "Znajdź - Co" jest wymagane.';
sTxtWantRemove     = 'Czy chcesz to usunąć?';
sHlpAnyChar        = 'dowolny znak (kropka)';
sHlpSpecChars      = '()[]{}^$.?+*|\\ znaki specjalne';
sHlpFF             = 'wysuw strony \\x0C';
sHlpAnyNL          = 'nowy wiersz dowolnego formatu';
sHlpTab            = 'tab \\x09';
sHlpVTab           = 'pionowy tab \\x0B';
sHlpDigit          = 'cyfra [0-9]';
sHlpNonDigit       = 'inny niż cyfra [^0-9]';
sHlpWhiteSp        = 'biały znak [ \\f\\n\\t\\v]';
sHlpNonWhiteSp     = 'inny niż biały znak';
sHlpWordChar       = 'znak słowa (nie separator)';
sHlpNonWordChar    = 'inny niż znak słowa (separator)';
sHlpCharHex        = 'znak - kod hex, zakres 0-10FFFF';
sHlpCharHex2       = 'znak - 2-cyfrowy kod hex';
sHlpCharHex4       = 'znak - 4-cyfrowy kod hex';
sHlpAlternative    = 'alternatywa ab lub xy';
sHlpCharSet        = 'zestaw znaków, dowolny z abc';
sHlpNegCharSet     = 'zaprzeczenie zestawu znaków';
sHlpRange          = 'zakres znaków od a do z';
sHlpNegRange       = 'zaprzeczenie zakresu znaków';
sHlpBeginLine      = 'początek wiersza';
sHlpEndLine        = 'koniec wiersza';
sHlpBeginText      = 'początek tekstu';
sHlpEndText        = 'koniec tekstu';
sHlpBeginRange     = 'początek zakresu wyszukiwania';
sHlpEndRange       = 'koniec zakresu wyszukiwania';
sHlpWordBoun       = 'granica słowa';
sHlpNonWordBoun    = 'brak granicy słowa';
sHlpZeroOrOne      = 'zero lub jeden raz';
sHlpZeroOrMore     = 'zero lub więcej razy';
sHlpOneOrMore      = 'jeden lub więcej razy';
sHlpExactly        = 'dokładnie 3 razy';
sHlpAtLeast        = 'co najmniej 3 razy';
sHlpFromTo         = 'od 3 do 7 razy';
sHlpBackslash      = 'backslash';
sHlpNL             = 'nowy wiersz';
sHlpEntireStr      = 'cały dopasowany ciąg';
sHlpSubmatch9      = '9-ty dopasowany podciąg, zakres 1-9';
sHlpSubmatch99     = '99-ty dopasowany podciąg, zakres 01-99';
sHlpGreedy1        = 'Kwantyfikatory są zachłanne, oprócz';
sHlpGreedy2        = 'dla kropki. Żeby zrobić kwantyfikator';
sHlpGreedy3        = 'leniwym, dodaj znak "?",';
sHlpCapture1       = 'dopasowuje ab, przechwytuje';
sHlpCapture2       = 'zaprzeczenie ab, przechwytuje';
sHlpNotCapture     = 'dopasowuje ab, nie przechwytuje';
sHlpAtomicGrouping = 'atomowe grupowanie, nie przechwytuje';
sHlpPreceded       = 'przed ciągiem jest ab';
sHlpNotPreceded    = 'przed ciągiem nie ma ab';
sHlpFollowed       = 'za ciągiem jest ab';
sHlpNotFollowed    = 'za ciągiem nie ma ab';
sHlpcondition      = 'jeśli (1) to x, w przeciwnym razie y';
sHlpBackrefer9     = 'odwołanie wsteczne, zakres 1-9';
sHlpBackrefer99    = 'odwołanie wsteczne, zakres 01-99';
sHlpIgnoreCase     = 'ignoruje wielkość liter';
sHlpMultiline      = 'szukanie wielowierszowe (domyślne)';
sHlpDotDefault     = 'kropka = dowlony znak (domyślne)';
sHlpInvertGreed    = 'wyłącza zachłanność kwanyfikatorów';
sHlpMatchCase      = 'uwzględnia wielkość liter';
sHlpMultilineOff   = 'wyłącza szukanie wielowierszowe';
sHlpDotDefaultOff  = 'kropka = dowlony znak, oprócz \\n';
sHlpInvertGreedOff = 'włącza zachłanność kwanyfikatorów';
- Polish
FindReplaceEx_1049.lng

Code:
/**************************************
FindReplaceEx.js - ver. 2014-07-21
Interface language
Language:      Russian (1049)
Translated by: F.Phoenix
**************************************/
sTxtMore           = 'Ещё';
sTxtReplAllCD      = '"Заменить всё" закрывает диалог';
sTxtReplAllWM      = '"Заменить всё" без сообщения';
sTxtCheckInSel     = 'Отметить "В выделении" если есть выделение';
sTxtCycleSearch    = 'Поиск по кругу';
sTxtPrompt         = 'Запрос';
sTxtFRTempl        = 'Шаблоны поиска и замены';
sTxtTemplates      = 'Шаблоны';
sTxtName           = 'Наименование';
sTxtFindWhat       = 'Что найти';
sTxtReplaceWith    = 'Чем заменить';
sTxtMatchCase      = 'Учитывать регистр';
sTxtWholeWord      = 'Слово целиком';
sTxtRegExp         = 'Регулярные выражения';
sTxtEscSeq         = 'Esc-последовательности';
sTxt1Yes0No        = '(1 = да, 0 = нет)';
sTxtNew            = 'Создать';
sTxtAdd            = 'Добавить';
sTxtEdit           = 'Изменить';
sTxtDelete         = 'Удалить';
sTxtOK             = 'OK';
sTxtClose          = 'Закрыть';
sTxtNameExists     = 'Такое наименование шаблона уже используется.';
sTxtNoName         = 'Необходимо заполнить поле "Наименование".';
sTxtNoFindWhat     = 'Необходимо заполнить поле "Что найти".';
sTxtWantRemove     = 'Вы дейстительно хотите удалить этот шаблон?';
sHlpAnyChar        = 'любой символ (точка)';
sHlpSpecChars      = '()[]{}^$.?+*|\\ специальные символы';
sHlpFF             = 'перевод страницы \\x0C';
sHlpAnyNL          = 'перевод строки';
sHlpTab            = 'табуляция \\x09';
sHlpVTab           = 'вертикальная табуляция \\x0B';
sHlpDigit          = 'цифра [0-9]';
sHlpNonDigit       = 'не цифра [^0-9]';
sHlpWhiteSp        = 'пробельный символ [ \\f\\n\\t\\v]';
sHlpNonWhiteSp     = 'непробельный символ';
sHlpWordChar       = 'словесный символ  (non-delimiter)';       //changed
sHlpNonWordChar    = 'несловесный символ (delimiter)';          //changed
sHlpCharHex        = 'символ - код в диапазоне 0-10FFFF';
sHlpCharHex2       = 'символ - 2-значный код';
sHlpCharHex4       = 'символ - 4-значный код';
sHlpAlternative    = 'одна из альтернатив: ab либо xy';
sHlpCharSet        = 'набор символов, нужен любой из них';
sHlpNegCharSet     = 'исключающий набор символов';
sHlpRange          = 'диапазон символов от a до z';
sHlpNegRange       = 'исключающий диапазон';
sHlpBeginLine      = 'начало строки';
sHlpEndLine        = 'конец строки';
sHlpBeginText      = 'начало документа';                        // вариант: 'начало текста'
sHlpEndText        = 'конец документа';                         // вариант: 'конец текста'
sHlpBeginRange     = 'начало диапазона поиска';
sHlpEndRange       = 'конец диапазона поиска';
sHlpWordBoun       = 'граница слова';
sHlpNonWordBoun    = 'не граница слова';
sHlpZeroOrOne      = '0 или 1 раз';
sHlpZeroOrMore     = '0 или более раз';
sHlpOneOrMore      = '1 или более раз';
sHlpExactly        = 'ровно 3 раза';
sHlpAtLeast        = 'не менее 3 раз';
sHlpFromTo         = 'от 3 до 7 раз';
sHlpBackslash      = 'обратный слеш';
sHlpNL             = 'перевод строки';
sHlpEntireStr      = 'вся захваченная строка';
sHlpSubmatch9      = '9я подстрока (диапазон 1-9)';
sHlpSubmatch99     = '99я подстрока (диапазон 01-99)';
sHlpGreedy1        = 'Quantifiers are greedy, except';          //new
sHlpGreedy2        = 'for dot. Appending "?" to';               //new
sHlpGreedy3        = 'a quantifier, makes it lazy';             //new
sHlpCapture1       = 'запоминающая скобка';                     //changed in English: 'matches ab, captures'
sHlpCapture2       = 'matches negative ab, captures';           //new
sHlpNotCapture     = 'незапоминающая скобка';                   //changed in English: 'matches ab, not captures'
sHlpAtomicGrouping = 'atomic grouping, not captures';           //new
sHlpPreceded       = 'строка следует за ab';                    // вариант: 'ранее следует ab'
sHlpNotPreceded    = 'строка не следует за ab';                 // вариант: 'ранее не следует ab'
sHlpFollowed       = 'строка предшествует ab';                  // вариант: 'далее следует ab'
sHlpNotFollowed    = 'строка не предшествует ab';               // вариант: 'далее не следует ab'
sHlpcondition      = 'if (1) then x, else y';                   //new
sHlpBackrefer9     = 'обратная ссылка, диапазон 1-9';
sHlpBackrefer99    = 'обратная ссылка, диапазон 01-99';
sHlpIgnoreCase     = 'case insensitive';                        //new
sHlpMultiline      = 'multiline search (default)';              //new
sHlpDotDefault     = 'dot matches any char (default)';          //new
sHlpInvertGreed    = 'invert greediness';                       //new
sHlpMatchCase      = 'match case';                              //new
sHlpMultilineOff   = 'turn off multiline search';               //new
sHlpDotDefaultOff  = 'dot matches any char, except \\n';        //new
sHlpInvertGreedOff = 'turn off greediness inversion';           //new
- Russian by F. Phoenix
FindReplaceEx_2052.lng

Code:
/**************************************
FindReplaceEx.js - ver. 2014-07-21
Interface language
Language:      ChineseSimplified (2052)
Translated by: cnnnc
**************************************/
sTxtMore           = 'More';                                            //new
sTxtReplAllCD      = '"Replace all" closes dialo&g';                    //new
sTxtReplAllWM      = '"Replace all" without message';                   //new
sTxtCheckInSel     = 'Check "in selection" if selection &not empty';    //new
sTxtCycleSearch    = 'C&ycle search';                                   //new
sTxtPrompt         = '&Prompt';                                         //new
sTxtFRTempl        = '查找/替换 模板';
sTxtTemplates      = '模板';
sTxtName           = '名称';
sTxtFindWhat       = '查找';
sTxtReplaceWith    = '替换';
sTxtMatchCase      = '区分大小写';
sTxtWholeWord      = '整字匹配';
sTxtRegExp         = '正则表达式';
sTxtEscSeq         = '转义符序列';
sTxt1Yes0No        = '(1 = 是, 0 = 否)';
sTxtNew            = '新建';
sTxtAdd            = '添加';
sTxtEdit           = '编辑';
sTxtDelete         = '删除';
sTxtOK             = '确定';
sTxtClose          = '关闭';
sTxtNameExists     = '名称已经存在。';
sTxtNoName         = '需要名称。';
sTxtNoFindWhat     = '“查找”内容不能为空。';
sTxtWantRemove     = '是否想要删除?';
sHlpAnyChar        = '任意单一字符';
sHlpSpecChars      = '()[]{}^$.?+*|\\ 特殊符号';
sHlpFF             = '换页符 \\x0C';
sHlpAnyNL          = '任何换行符';
sHlpTab            = '制表符 \\x09';
sHlpVTab           = '垂直制表符 \\x0B';
sHlpDigit          = '数字 [0-9]';
sHlpNonDigit       = '非数字 [^0-9]';
sHlpWhiteSp        = '空白字符 [ \\f\\n\\t\\v]';
sHlpNonWhiteSp     = '非空白字符';
sHlpWordChar       = '单词字符';                                  //changed in English: 'word character (non-delimiter)'
sHlpNonWordChar    = '非单词字符';                                 //changed in English: 'non-word character (delimiter)'
sHlpCharHex        = '字符 - 16 进制编码, 范围 0-10FFFF';
sHlpCharHex2       = '字符 - 2 位 16 进制编码';
sHlpCharHex4       = '字符 - 4 位 16 进制编码';
sHlpAlternative    = '匹配 ab 或 xy';
sHlpCharSet        = '字符集合, 匹配所包含的任意一个字符';
sHlpNegCharSet     = '负值字符集合,匹配未包含的任意字符';
sHlpRange          = '匹配 a 到 z 范围内的任意小写字母字符';
sHlpNegRange       = '匹配任何不在 a 到 z 范围内的任意字符';
sHlpBeginLine      = '行开头';
sHlpEndLine        = '行末尾';
sHlpBeginText      = '文本开头';
sHlpEndText        = '文本末尾';
sHlpBeginRange     = '搜索范围的开头';
sHlpEndRange       = '搜索范围的末尾';
sHlpWordBoun       = '单词边界';
sHlpNonWordBoun    = '非单词边界';
sHlpZeroOrOne      = '匹配前面的子表达式零次或一次';
sHlpZeroOrMore     = '匹配前面的子表达式零次或多次';
sHlpOneOrMore      = '匹配前面的子表达式一次或多次';
sHlpExactly        = '精确匹配 3 次';
sHlpAtLeast        = '最少匹配 3 次';
sHlpFromTo         = '匹配 3 到 7 次的';
sHlpBackslash      = '反斜线';
sHlpNL             = '换行符';
sHlpEntireStr      = '匹配整个字符串';
sHlpSubmatch9      = '第 9 个捕捉子匹配, 范围 1-9';
sHlpSubmatch99     = '第 99 个捕捉子匹配, 范围 01-99';
sHlpGreedy1        = 'Quantifiers are greedy, except';        //new
sHlpGreedy2        = 'for dot. Appending "?" to';             //new
sHlpGreedy3        = 'a quantifier, makes it lazy';           //new
sHlpCapture1       = '匹配 ab 并获取这一匹配';                         //changed in English: 'matches ab, captures'
sHlpCapture2       = 'matches negative ab, captures';         //new
sHlpNotCapture     = '匹配 ab 但不获取匹配';                          //changed in English: 'matches ab, not captures'
sHlpAtomicGrouping = 'atomic grouping, not captures';         //new
sHlpPreceded       = '前面带有 ab';
sHlpNotPreceded    = '前面不带有 ab';
sHlpFollowed       = '在任何匹配 ab 的字符串开始处匹配查找字符串';
sHlpNotFollowed    = '在任何不匹配 ab 的字符串开始处匹配查找字符串';
sHlpcondition      = 'if (1) then x, else y';                 //new
sHlpBackrefer9     = '向后引用, 范围 1-9';
sHlpBackrefer99    = '向后引用, 范围 01-99';
sHlpIgnoreCase     = 'case insensitive';                      //new
sHlpMultiline      = 'multiline search (default)';            //new
sHlpDotDefault     = 'dot matches any char (default)';        //new
sHlpInvertGreed    = 'invert greediness';                     //new
sHlpMatchCase      = 'match case';                            //new
sHlpMultilineOff   = 'turn off multiline search';             //new
sHlpDotDefaultOff  = 'dot matches any char, except \\n';      //new
sHlpInvertGreedOff = 'turn off greediness inversion';         //new
- Chinese-Simplified by cnnnc


Last edited by KDJ on Mon Jul 21, 2014 7:19 pm; edited 14 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Tue Feb 05, 2013 5:54 pm    Post subject: Reply with quote

Minimize, maximize or restore tab in MDI mode.

TabMinMax.js

Code:
// TabMinMax.js - ver. 2013-08-22 (x86/x64)
//
// Minimize, maximize or restore tab in MDI mode
//
// Usage:
// Call("Scripts::Main", 1, "TabMinMax.js")      - restore tab
// Call("Scripts::Main", 1, "TabMinMax.js", "-") - minimize tab
// Call("Scripts::Main", 1, "TabMinMax.js", "+") - maximize tab

if (AkelPad.GetEditWnd() && (AkelPad.IsMDI() == 1 /*WMD_MDI*/))
{
  var oSys     = AkelPad.SystemFunction();
  var hMainWnd = AkelPad.GetMainWnd();
  var lpFrame  = oSys.Call("User32::SendMessageW", hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
  var hWndMdi  = oSys.Call("User32::SendMessageW", hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, lpFrame);
  var nAction  = 9 /*SW_RESTORE*/;

  if (WScript.Arguments.length)
  {
    if (WScript.Arguments(0) == "-")
      nAction = 2 /*SW_SHOWMINIMIZED*/;
    else if (WScript.Arguments(0) == "+")
      nAction = 3 /*SW_MAXIMIZE*/;
  }

  oSys.Call("User32::ShowWindow", hWndMdi, nAction);

  if (nAction == 3 /*SW_MAXIMIZE*/)
    oSys.Call("User32::SetForegroundWindow", hWndMdi);
}


Last edited by KDJ on Sat Aug 31, 2013 12:22 pm; edited 1 time in total
Back to top
View user's profile Send private message
akkorn



Joined: 08 Feb 2013
Posts: 39

PostPosted: Mon Feb 18, 2013 11:06 am    Post subject: Comparison checksum of selected texts Reply with quote

Comparison checksum of selected texts (CRC32txt)
Функция отображения контрольной суммы выделенного текста+ сравнение с предыдущими результатами (отображаются в новой вкладке при согласии пользователя).

Условия работы:
1) Нужен установленный плагин Scripts
2) В папке (...\AkelFiles\Plugs\Scripts\) создаем Новый текстовый документ и копируем в него код, расположенный ниже
3) Изменяем имя созданного файла на "CRC32txt.vbs"
4) Вызываем скрипт следующей командой:
Code:
Call("Scripts::Main", 1, "CRC32txt.vbs")

Из панели плагина Toolbar код вызова плагина будет следующим (обратите внимание на лидирующий минус, иначе кнопка будет "залипать"):
Code:
-"Check CRC selected text" Call("Scripts::Main", 1, "CRC32txt.vbs") Icon(38)


CRC32txt.vbs
Code:

' [Start script CRC32txt]
'
' VBScript CRC32txt file
' by akkorn for AkelPad
' Changed: 22:30 18.03.2013

' Usage:
' Call("Scripts::Main", 1, "CRC32txt.vbs")

' Test script:
' Text "Test" has a checksum is "784DD132"

' Declarations
Option Explicit

' Defines
Dim aCRC32Table(255)
Dim CRC32SetupExit, ErrorChecksum, vTimer, FormatNewLine, hMainWnd, lpCurrFrameTab, lpCurrFrameTabText, CurrMDIMode
Const sTitleLogTab = "AkelPad plugin [CRC32txt] log:"

' Executes
vTimer = Timer
Call Main
WScript.Quit(-1)

' ===============
' List procedures
' ===============

Sub Main()
'vTimer = Timer
'msgbox fTimer

Call PreparingData()

Dim oShell
Set oShell = CreateObject("Wscript.Shell")
Dim t, CurrCRC, StatText, StatText2, StatAvailable, Answer, l, m1, m2
t = AkelPad.GetSelText(0)

If t="" Then
    Msgbox "No text is selected.",, "Checksum text"
    Exit sub
End if

l = Len(t)
If l > 1000 Then l = FormatNumber(l,0)

ErrorChecksum = True
CurrCRC = CRC32Text(t)
CurrCRC = CStr(CurrCRC)

If l<2 Then ErrorChecksum = False
If ErrorChecksum Then
    m1 = "Chance of a checksum error." & vbcrlf & vbcrlf
    m2 = 64
Else
    m1 = ""
    m2 = 0
End if

StatText2 = PreviewText(t,l)
StatText = CorrectDate & CurrCRC & String(13-Len(CurrCRC),Chr(32)) & "Length: " & l & StatText2

If (CurrMDIMode = 0) Then
    call MsgBox(m1 & "Checksum selection of text:" & vbTab & CurrCRC & VbCrLf & VbCrLf & _
                "To activate the advance mode please change" & VbCrLf & "the operation mode to MDI or PMDI.",m2,"Checksum text")
Else
    StatAvailable = LogTabIsAvailable
    If StatAvailable = True Then
        If AddTextToLogTab(StatText) = False Then
        call oShell.Popup(m1 & "Checksum selection of text:" & vbTab & CurrCRC & _
                          vbCrLf & "Statistics are available on one of the tabs.",1,"Checksum text",m2)
        End if
    Else
        Answer = MsgBox(m1 & "Checksum selection of text:" & vbTab & CurrCRC & _
                        vbCrLf & "Allow display of statistics in a new tab?",m2+260,"Checksum text")
        If Answer = vbYes Then
        call AddTextToLogTab(StatText)
        End if
    End if
End if
Set oShell = Nothing
End sub

Sub PreparingData()
Const AKD_FRAMEFINDW=1290, FWF_CURRENT=1, AKD_GETFRAMEINFO=1223, FI_WNDEDIT=2
Call SetFormatNewLine()
CurrMDIMode = AkelPad.IsMDI()
hMainWnd = AkelPad.GetMainWnd()
lpCurrFrameTab = AkelPad.SendMessage(hMainWnd, AKD_FRAMEFINDW, FWF_CURRENT, 0)
lpCurrFrameTabText = AkelPad.SendMessage(hMainWnd, AKD_GETFRAMEINFO, FI_WNDEDIT, lpCurrFrameTab)
End sub

Function fTimer()
dim i
i= Timer - vTimer
i= FormatNumber(i,3)
fTimer = i
End Function

Sub SetFormatNewLine()
Select Case AkelPad.GetEditNewLine(0)
    Case 1: FormatNewLine = VbCrLf
    Case 2: FormatNewLine = VbLf
    Case 3: FormatNewLine = VbCr
End Select
End sub

Function CorrectDate()
dim i,d
i = cStr(now())
d = 30-Len(i)
d = String(d,Chr(32))
CorrectDate = i & d
End Function

Function PreviewText(sText, sLenght)
Dim StatText

StatText= sText
StatText= Left(StatText,1000)
DO
    StatText = Replace(StatText, FormatNewLine & FormatNewLine, FormatNewLine)
LOOP UNTIL (InStr(1, StatText, FormatNewLine & FormatNewLine, 1)=0)

StatText= Replace(StatText, FormatNewLine, Chr(124))

StatText=Left(StatText,30)
StatText= String(20-len(sLenght),Chr(32)) & "First 30 chars: " & Chr(34) & StatText & Chr(34)
PreviewText = StatText
End Function

Function AddTextToLogTab(sNewText)
AddTextToLogTab = False
sNewText= cStr(sNewText)
if (CurrMDIMode = 0) OR (Len(sNewText)=0) Then Exit function 'MDI or PMDI

Dim lpFrameTab, lpFrameCur, sText, i, SelectionStart, SelectionEnd, FindLogTab
Const AKD_FRAMEFINDW=1290, FWF_BYTABINDEX=8, WM_SETREDRAW=&HB, AKD_FRAMEACTIVATE=1285, FWF_CURRENT=1, WM_COMMAND=273, IDM_FILE_NEW=4101

FindLogTab = False

i=0
lpFrameTab = AkelPad.SendMessage(hMainWnd, AKD_FRAMEFINDW, FWF_BYTABINDEX, i)
call AkelPad.SendMessage(hMainWnd, WM_SETREDRAW, false, 0)

DO WHILE lpFrameTab>0
  lpFrameCur = AkelPad.SendMessage(hMainWnd, AKD_FRAMEACTIVATE, 0, lpFrameTab)
  sText = AkelPad.GetTextRange(0, -1)
 
    if left(sText,30) = sTitleLogTab Then
      SelectionStart = AkelPad.GetSelStart()
      SelectionEnd = AkelPad.GetSelEnd()
      sText = sText & FormatNewLine & sNewText
      call AkelPad.SetSel(0, -1)
      call AkelPad.ReplaceSel(sText,False)
      call AkelPad.SetSel(SelectionStart, SelectionEnd)
      FindLogTab = True
        If (lpCurrFrameTab=lpFrameTab) Then AddTextToLogTab = True
    End if
 
  i = i+1
  lpFrameTab = AkelPad.SendMessage(hMainWnd, AKD_FRAMEFINDW, FWF_BYTABINDEX, i)
LOOP

If FindLogTab = False then
  call AkelPad.SendMessage (hMainWnd, WM_COMMAND, IDM_FILE_NEW, 0)
  lpFrameTab = AkelPad.SendMessage(hMainWnd, AKD_FRAMEFINDW, FWF_CURRENT, 0)
  sText = sTitleLogTab & FormatNewLine & String(30,Chr(61)) & FormatNewLine & sNewText
  call AkelPad.ReplaceSel(sText,False)
  call AkelPad.SetSel(0,0)
End if

call AkelPad.SendMessage(hMainWnd, AKD_FRAMEACTIVATE, 0, lpCurrFrameTab)
call AkelPad.SendMessage(hMainWnd, WM_SETREDRAW, true, 0)
call AkelPad.SystemFunction().Call("user32.dll::InvalidateRect",hMainWnd,0)
call AkelPad.SystemFunction().Call("user32.dll::InvalidateRect",lpCurrFrameTabText,0)
End Function

Function LogTabIsAvailable()
LogTabIsAvailable = False
if (CurrMDIMode = 0) Then Exit function 'MDI or PMDI

Dim lpFrameTab, lpFrameCur, sText, i
Const AKD_FRAMEFINDW=1290, FWF_BYTABINDEX=8, WM_SETREDRAW=&HB, AKD_FRAMEACTIVATE=1285

i=0
lpFrameTab = AkelPad.SendMessage(hMainWnd, AKD_FRAMEFINDW, FWF_BYTABINDEX, i)
call AkelPad.SendMessage(hMainWnd, WM_SETREDRAW, false, 0)

DO WHILE lpFrameTab>0
  lpFrameCur = AkelPad.SendMessage(hMainWnd, AKD_FRAMEACTIVATE, 0, lpFrameTab)
  sText = AkelPad.GetTextRange(0, -1)
  if left(sText,30) = sTitleLogTab Then LogTabIsAvailable = True
  i = i+1
  lpFrameTab = AkelPad.SendMessage(hMainWnd, AKD_FRAMEFINDW, FWF_BYTABINDEX, i)
LOOP

call AkelPad.SendMessage(hMainWnd, AKD_FRAMEACTIVATE, 0, lpCurrFrameTab)
call AkelPad.SendMessage(hMainWnd, WM_SETREDRAW, true, 0)
call AkelPad.SystemFunction().Call("user32.dll::InvalidateRect",hMainWnd,0)
call AkelPad.SystemFunction().Call("user32.dll::InvalidateRect",lpCurrFrameTabText,0)
End Function

Function CRC32Text(sText)
Dim iCRC
Call CRC32Setup
iCRC = CRC32(sText)
CRC32Text = Hex(iCRC)
End Function

Public Function CRC32(sMessage)
Dim iCRC, i, bytT, bytC, lngA, s, l

l = Len(sMessage)
If l=0 Then Exit function

Call CRC32Setup
iCRC = &HFFFFFFFF

s = Asc(Mid(sMessage, 1, 1))
For i = 1 To l
    bytC = Asc(Mid(sMessage, i, 1))
    If Not (bytC = s) Then ErrorChecksum = False
    s = bytC
    bytT = Abs((iCRC And &HFF) Xor bytC) Mod &H100
    lngA = ulShiftRightBy8(iCRC)
    iCRC = lngA Xor aCRC32Table(bytT)
Next

CRC32 = iCRC Xor &HFFFFFFFF
End Function

Public Function ulShiftRightBy8(x)
Dim iNew
iNew = (x And &H7FFFFFFF) \ 256
If (x And &H80000000) <> 0 Then
    iNew = iNew Or &H800000
End If
ulShiftRightBy8 = iNew
End Function

Public Function CRC32Setup()
Dim vntA, i, iOffset, nLen

If CRC32SetupExit Then
    Exit Function
End If

iOffset = 0
nLen = 32

vntA = Array( _
    &H0, &H77073096, &HEE0E612C, &H990951BA, _
    &H76DC419, &H706AF48F, &HE963A535, &H9E6495A3, _
    &HEDB8832, &H79DCB8A4, &HE0D5E91E, &H97D2D988, _
    &H9B64C2B, &H7EB17CBD, &HE7B82D07, &H90BF1D91, _
    &H1DB71064, &H6AB020F2, &HF3B97148, &H84BE41DE, _
    &H1ADAD47D, &H6DDDE4EB, &HF4D4B551, &H83D385C7, _
    &H136C9856, &H646BA8C0, &HFD62F97A, &H8A65C9EC, _
    &H14015C4F, &H63066CD9, &HFA0F3D63, &H8D080DF5)

For i = iOffset To iOffset + nLen - 1
aCRC32Table(i) = vntA(i - iOffset)
Next
iOffset = iOffset + nLen

vntA = Array( _
    &H3B6E20C8, &H4C69105E, &HD56041E4, &HA2677172, _
    &H3C03E4D1, &H4B04D447, &HD20D85FD, &HA50AB56B, _
    &H35B5A8FA, &H42B2986C, &HDBBBC9D6, &HACBCF940, _
    &H32D86CE3, &H45DF5C75, &HDCD60DCF, &HABD13D59, _
    &H26D930AC, &H51DE003A, &HC8D75180, &HBFD06116, _
    &H21B4F4B5, &H56B3C423, &HCFBA9599, &HB8BDA50F, _
    &H2802B89E, &H5F058808, &HC60CD9B2, &HB10BE924, _
    &H2F6F7C87, &H58684C11, &HC1611DAB, &HB6662D3D)

For i = iOffset To iOffset + nLen - 1
aCRC32Table(i) = vntA(i - iOffset)
Next
iOffset = iOffset + nLen

vntA = Array( _
    &H76DC4190, &H1DB7106, &H98D220BC, &HEFD5102A, _
    &H71B18589, &H6B6B51F, &H9FBFE4A5, &HE8B8D433, _
    &H7807C9A2, &HF00F934, &H9609A88E, &HE10E9818, _
    &H7F6A0DBB, &H86D3D2D, &H91646C97, &HE6635C01, _
    &H6B6B51F4, &H1C6C6162, &H856530D8, &HF262004E, _
    &H6C0695ED, &H1B01A57B, &H8208F4C1, &HF50FC457, _
    &H65B0D9C6, &H12B7E950, &H8BBEB8EA, &HFCB9887C, _
    &H62DD1DDF, &H15DA2D49, &H8CD37CF3, &HFBD44C65)

For i = iOffset To iOffset + nLen - 1
aCRC32Table(i) = vntA(i - iOffset)
Next
iOffset = iOffset + nLen

vntA = Array( _
    &H4DB26158, &H3AB551CE, &HA3BC0074, &HD4BB30E2, _
    &H4ADFA541, &H3DD895D7, &HA4D1C46D, &HD3D6F4FB, _
    &H4369E96A, &H346ED9FC, &HAD678846, &HDA60B8D0, _
    &H44042D73, &H33031DE5, &HAA0A4C5F, &HDD0D7CC9, _
    &H5005713C, &H270241AA, &HBE0B1010, &HC90C2086, _
    &H5768B525, &H206F85B3, &HB966D409, &HCE61E49F, _
    &H5EDEF90E, &H29D9C998, &HB0D09822, &HC7D7A8B4, _
    &H59B33D17, &H2EB40D81, &HB7BD5C3B, &HC0BA6CAD)
   
For i = iOffset To iOffset + nLen - 1
aCRC32Table(i) = vntA(i - iOffset)
Next
iOffset = iOffset + nLen

vntA = Array( _
    &HEDB88320, &H9ABFB3B6, &H3B6E20C, &H74B1D29A, _
    &HEAD54739, &H9DD277AF, &H4DB2615, &H73DC1683, _
    &HE3630B12, &H94643B84, &HD6D6A3E, &H7A6A5AA8, _
    &HE40ECF0B, &H9309FF9D, &HA00AE27, &H7D079EB1, _
    &HF00F9344, &H8708A3D2, &H1E01F268, &H6906C2FE, _
    &HF762575D, &H806567CB, &H196C3671, &H6E6B06E7, _
    &HFED41B76, &H89D32BE0, &H10DA7A5A, &H67DD4ACC, _
    &HF9B9DF6F, &H8EBEEFF9, &H17B7BE43, &H60B08ED5)

For i = iOffset To iOffset + nLen - 1
aCRC32Table(i) = vntA(i - iOffset)
Next
iOffset = iOffset + nLen

vntA = Array( _
    &HD6D6A3E8, &HA1D1937E, &H38D8C2C4, &H4FDFF252, _
    &HD1BB67F1, &HA6BC5767, &H3FB506DD, &H48B2364B, _
    &HD80D2BDA, &HAF0A1B4C, &H36034AF6, &H41047A60, _
    &HDF60EFC3, &HA867DF55, &H316E8EEF, &H4669BE79, _
    &HCB61B38C, &HBC66831A, &H256FD2A0, &H5268E236, _
    &HCC0C7795, &HBB0B4703, &H220216B9, &H5505262F, _
    &HC5BA3BBE, &HB2BD0B28, &H2BB45A92, &H5CB36A04, _
    &HC2D7FFA7, &HB5D0CF31, &H2CD99E8B, &H5BDEAE1D)

For i = iOffset To iOffset + nLen - 1
aCRC32Table(i) = vntA(i - iOffset)
Next
iOffset = iOffset + nLen

vntA = Array( _
    &H9B64C2B0, &HEC63F226, &H756AA39C, &H26D930A, _
    &H9C0906A9, &HEB0E363F, &H72076785, &H5005713, _
    &H95BF4A82, &HE2B87A14, &H7BB12BAE, &HCB61B38, _
    &H92D28E9B, &HE5D5BE0D, &H7CDCEFB7, &HBDBDF21, _
    &H86D3D2D4, &HF1D4E242, &H68DDB3F8, &H1FDA836E, _
    &H81BE16CD, &HF6B9265B, &H6FB077E1, &H18B74777, _
    &H88085AE6, &HFF0F6A70, &H66063BCA, &H11010B5C, _
    &H8F659EFF, &HF862AE69, &H616BFFD3, &H166CCF45)

For i = iOffset To iOffset + nLen - 1
aCRC32Table(i) = vntA(i - iOffset)
Next
iOffset = iOffset + nLen

vntA = Array( _
    &HA00AE278, &HD70DD2EE, &H4E048354, &H3903B3C2, _
    &HA7672661, &HD06016F7, &H4969474D, &H3E6E77DB, _
    &HAED16A4A, &HD9D65ADC, &H40DF0B66, &H37D83BF0, _
    &HA9BCAE53, &HDEBB9EC5, &H47B2CF7F, &H30B5FFE9, _
    &HBDBDF21C, &HCABAC28A, &H53B39330, &H24B4A3A6, _
    &HBAD03605, &HCDD70693, &H54DE5729, &H23D967BF, _
    &HB3667A2E, &HC4614AB8, &H5D681B02, &H2A6F2B94, _
    &HB40BBE37, &HC30C8EA1, &H5A05DF1B, &H2D02EF8D)

For i = iOffset To iOffset + nLen - 1
    aCRC32Table(i) = vntA(i - iOffset)
Next
iOffset = iOffset + nLen

CRC32SetupExit = True
End Function
'
' [End script CRC32txt]


Обсуждение скрипта, вопросы- все здесь:
http://akelpad.sourceforge.net/forum/viewtopic.php?t=1504


Last edited by akkorn on Mon Mar 18, 2013 6:34 pm; edited 29 times in total
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1602

PostPosted: Sun Feb 24, 2013 8:27 pm    Post subject: Reply with quote

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

// (c) Infocatcher 2013-2014
// version 0.1.2 - 2014-04-13

// Compare contents of current and next selected tab using WinMerge (http://winmerge.org/)
// or any other compare tool
// Required MDI or PMDI window mode and timer.js library!
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/Include/timer.js
// (or use -noBlink=true argument to work without timer.js)

// Arguments:
//   -path="%ProgramFiles%\WinMerge\WinMerge.exe" - path to WinMerge executable
//                                                  (or many paths: "path1|path2|path3")
//   -cmd="<exe> /S=C <f1> <f2>"                  - set custom command line for any other compare tool
//                                                  (an example for Total Commander)
//   -save=true                                   - true  - save (already saved, but modified) file before compare
//                                                  false - use temporary files for modified files
//   -temp="%AkelScripts%\temp"                   - path to temporary directory
//   -useTabsOrder=true                           - always compare left tab with right tab
//   -noBlink=true                                - disable blink in status bar (and just show "Select tab!" text)

// Usage:
//   Call("Scripts::Main", 1, "winMergeTabs.js")
//   Call("Scripts::Main", 1, "winMergeTabs.js", '-path="%COMMANDER_PATH%\TOTALCMD.EXE" -cmd="<exe> /S=C <f1> <f2>"')

function _localize(s) {
   var strings = {
      "No tabs!": {
         ru: "Отсутствуют вкладки!"
      },
      "MDI or PMDI window mode required!": {
         ru: "Требуется оконный режим MDI или PMDI!"
      },
      "WinMerge not found!": {
         ru: "Не удалось найти WinMerge!"
      },
      "Select tab!": {
         ru: "Выберите вкладку!"
      },
      "Not found file from first tab:\n": {
         ru: "Не найден файл из первой вкладки:\n"
      },
      "Not found file from second tab:\n": {
         ru: "Не найден файл из второй вкладки:\n"
      }
   };
   var lng;
   switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
      case 0x19: lng = "ru"; break;
      default:   lng = "en";
   }
   _localize = function(s) {
      return strings[s] && strings[s][lng] || s;
   };
   return _localize(s);
}

var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
if(hScript) do {
   if(AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/)) {
      // Script is running, second call close it
      AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
      WScript.Quit();
   }
}
while(hScript = AkelPad.ScriptHandle(hScript, 32 /*SH_NEXTSAMESCRIPT*/));

var paths = AkelPad.GetArgValue("path", "");
var cmdLineTemplate = AkelPad.GetArgValue("cmd", "<exe> <f1> <f2>");
var save = AkelPad.GetArgValue("save", false);
var tempDir = AkelPad.GetArgValue("temp", "%temp%");
var useTabsOrder = AkelPad.GetArgValue("useTabsOrder", false);

var winMergePaths = paths
   ? paths.split("|")
   : [
      "<HKCU\\Software\\Thingamahoochie\\WinMerge\\Executable>",
      "<HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\WinMergeU.exe\\>",
      "<HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\WinMerge.exe\\>",
      "%ProgramFiles%\\WinMerge\\WinMergeU.exe",
      "%ProgramFiles (x86)%\\WinMerge\\WinMergeU.exe",
      "%AkelDir%\\..\\WinMergePortable\\WinMergePortable.exe",
      "%COMMANDER_PATH%\\..\\WinMergePortable\\WinMergePortable.exe"
   ];

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var fso = new ActiveXObject("Scripting.FileSystemObject");
var wsh = new ActiveXObject("WScript.Shell");

if(
   hMainWnd
   && AkelPad.IsMDI() // WMD_MDI or WMD_PMDI
) {
   var lpFrame = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
   var lpFrame2;

   if(lpFrame) {
      var statusbar = new Statusbar();
      statusbar.save();
      var statusMsg = _localize("Select tab!");
      statusbar.set(statusMsg);

      if(
         !AkelPad.GetArgValue("noBlink", false)
         && AkelPad.Include("timer.js")
      ) {
         var showDelay = 600;
         var hideDelay = 150;
         // show -> [showDelay] -> hide -> [hideDelay] -> show -> [showDelay] -> hide
         var timerHide = setTimeout(function() {
            statusbar.set("");
            clearTimeout(timerHide);
            timerHide = setInterval(function() {
               statusbar.set("");
            }, showDelay + hideDelay, timerHide);
         }, showDelay);
         var timerShow = setInterval(function() {
            statusbar.set(statusMsg);
         }, showDelay + hideDelay);
         var stopTimers = function() {
            clearInterval(timerHide);
            clearInterval(timerShow);
         };
      }
   }

   if(
      lpFrame
      && AkelPad.WindowSubClass(
         1 /*WSC_MAINPROC*/,
         mainCallback,
         0x416 /*AKDN_FRAME_ACTIVATE*/,
         0x418 /*AKDN_FRAME_DESTROY*/
      )
   ) {
      AkelPad.ScriptNoMutex(); // Allow other scripts running
      AkelPad.WindowGetMessage(); // Message loop
      AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);

      stopTimers && stopTimers();
      statusbar.restore();
      if(lpFrame2)
         compareTabs(lpFrame, lpFrame2);
   }
   else {
      stopTimers && stopTimers();
      statusbar && statusbar.restore();
      AkelPad.MessageBox(hMainWnd, _localize("No tabs!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
   }
}
else {
   AkelPad.MessageBox(hMainWnd, _localize("MDI or PMDI window mode required!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}
function mainCallback(hWnd, uMsg, wParam, lParam) {
   if(uMsg == 0x416 /*AKDN_FRAME_ACTIVATE*/) {
      if(lParam != lpFrame) {
         lpFrame2 = lParam;
         oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
      }
   }
   else if(uMsg == 0x418 /*AKDN_FRAME_DESTROY*/) {
      if(lParam == lpFrame)
         oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
   }
}

function compareTabs(lpFrame, lpFrame2) {
   var winMerge = getWinMerge();
   if(!winMerge) {
      AkelPad.MessageBox(
         hMainWnd,
         _localize("WinMerge not found!") + "\n\n" + getWinMergePaths(),
         WScript.ScriptName,
         48 /*MB_ICONEXCLAMATION*/
      );
      return;
   }

   setRedraw(hMainWnd, false);

   var file  = getFile(lpFrame);
   var file2 = getFile(lpFrame2);

   //if(AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0) != lpFrame2)
   //   AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame2);
   setRedraw(hMainWnd, true);
   // Force redraw current edit window
   oSys.Call("user32::InvalidateRect", AkelPad.GetEditWnd(), 0, true);

   var noFile  = !fso.FileExists(file);
   var noFile2 = !fso.FileExists(file2);
   if(noFile || noFile2) {
      var errs = [];
      if(noFile)
         errs[errs.length] = _localize("Not found file from first tab:\n") + file;
      if(noFile2)
         errs[errs.length] = _localize("Not found file from second tab:\n") + file2;
      AkelPad.MessageBox(
         hMainWnd,
         errs.join("\n\n"),
         WScript.ScriptName,
         48 /*MB_ICONEXCLAMATION*/
      );
      if(!noFile && file.isTemp)
         fso.DeleteFile(file);
      if(!noFile2 && file2.isTemp)
         fso.DeleteFile(file2);
      return;
   }

   if(useTabsOrder) {
      var pos  = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrame);
      var pos2 = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrame2);
      if(pos2 < pos) {
         var tmp = file;
         file = file2;
         file2 = tmp;
      }
   }

   var cmdLine = cmdLineTemplate
      .replace("<exe>", '"' + winMerge + '"')
      .replace("<f1>", '"' + file + '"')
      .replace("<f2>", '"' + file2 + '"');
   var wm = wsh.Exec(cmdLine);
   if(file.isTemp || file2.isTemp) {
      // If WinMerge are already opened, new process will be immediately closed,
      // so don't delete files too early
      WScript.Sleep(4000);
      for(;;) {
         if(wm.Status != 0) {
            if(file.isTemp)
               fso.DeleteFile(file);
            if(file2.isTemp)
               fso.DeleteFile(file2);
            break;
         }
         WScript.Sleep(1500);
      }
   }
}
function getFile(lpFrame) {
   AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame);
   var hWndEdit = AkelPad.GetEditWnd();
   var origFile = AkelPad.GetEditFile(hWndEdit);
   var file = origFile;
   if(!origFile || AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0)) {
      if(origFile && save)
         AkelPad.Command(4105); // IDM_FILE_SAVE
      else {
         var tempFile = file = getTempFile(hWndEdit, origFile);
         var codePage = -1;
         var hasBOM = -1;
         if(!origFile) {
            // Will use UTF-8 with BOM to correctly save all (most?) new documents
            codePage = 65001;
            hasBOM = 1;
         }
         AkelPad.SaveFile(AkelPad.GetEditWnd(), tempFile, codePage, hasBOM, 0 /* W/o SD_UPDATE */);
      }
   }
   return file;
}
function getWinMerge() {
   for(var i = 0, l = winMergePaths.length; i < l; ++i) {
      var path = expandVariables(winMergePaths[i]);
      if(fso.FileExists(path))
         return path;
   }
   return "";
}
function getWinMergePaths() {
   var out = [];
   for(var i = 0, l = winMergePaths.length; i < l; ++i) {
      var rawPath = winMergePaths[i];
      var path = expandVariables(rawPath);
      out[out.length] = path == rawPath
         ? path
         : rawPath + " => " + path
   }
   return out.join("\n");
}
function getTempFile(hWndEdit, file) {
   var fileName, fileExt;
   var tmp = file && /[^\/\\]+$/.test(file) && RegExp.lastMatch;
   if(tmp) {
      fileExt = /\.[^.]+$/.test(tmp) && RegExp.lastMatch || "";
      fileName = tmp.slice(0, -fileExt.length);
   }
   else {
      fileExt = getCurrentExtension();
      fileName = "akelpad-temp";
   }
   var tmpDir = expandVariables(tempDir);
   if(!fso.FolderExists(tmpDir))
      fso.CreateFolder(tmpDir);
   var i = -1;
   do tmp = tmpDir + "\\" + fileName + (++i ? "-" + i : "") + fileExt;
   while(fso.FileExists(tmp));
   var out = new String(tmp);
   out.isTemp = true;
   return out;
}
function getCurrentExtension() {
   var alias = getCoderAlias();
   if(/\.[^.]+$/.test(alias))
      return RegExp.lastMatch;
   return ".txt";
}
function getCoderAlias() {
   if(
      !AkelPad.IsPluginRunning("Coder::HighLight")
      && !AkelPad.IsPluginRunning("Coder::CodeFold")
      && !AkelPad.IsPluginRunning("Coder::AutoComplete")
   )
      return "";
   // http://akelpad.sourceforge.net/forum/viewtopic.php?p=19363#19363
   var hWndEdit = AkelPad.GetEditWnd();
   var hDocEdit = AkelPad.GetEditDoc();
   var pAlias = "";
   if(hWndEdit && hDocEdit) {
      var lpAlias = AkelPad.MemAlloc(256 * 2 /*sizeof(wchar_t)*/);
      if(lpAlias) {
         AkelPad.CallW("Coder::Settings", 18 /*DLLA_CODER_GETALIAS*/, hWndEdit, hDocEdit, lpAlias, 0);
         pAlias = AkelPad.MemRead(lpAlias, 1 /*DT_UNICODE*/);
         AkelPad.MemFree(lpAlias);
      }
   }
   return pAlias;
}

function expandVariables(s) {
   return expandEnvironmentVariables(expandRegistryVariables(s));
}
function expandEnvironmentVariables(s) {
   if(s.substr(0, 9) == "%AkelDir%")
      s = AkelPad.GetAkelDir() + s.substr(9);
   if(s.substr(0, 13) == "%AkelScripts%")
      s = AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/) + s.substr(13);
   return wsh.ExpandEnvironmentStrings(s);
}
function expandRegistryVariables(s) { // <HKCU\Software\Foo\installPath>\foo.exe
   return s.replace(/<(.+?)>/g, function(s, path) {
      var val = getRegistryValue(path);
      if(val)
         return val;
      return s;
   });
}
function getRegistryValue(path) {
   try {
      return wsh.RegRead(path);
   }
   catch(e) {
   }
   return "";
}

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

function Statusbar() {
   this.get = this.set = this.save = this.restore = function() {};

   // Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=13656#13656
   var hWndStatus = oSys.Call("user32::GetDlgItem", hMainWnd, 10002 /*ID_STATUS*/);
   if(!hWndStatus || !oSys.Call("user32::IsWindowVisible", hWndStatus))
      return;
   var nParts = AkelPad.SendMessage(hWndStatus, 1030 /*SB_GETPARTS*/, 0, 0);
   if(nParts <= 5)
      return;
   var _origStatus, _customStatus;
   var _this = this;
   function buffer(callback) {
      var lpTextBuffer = AkelPad.MemAlloc(1024 * _TSIZE);
      if(lpTextBuffer) {
         var ret = callback.call(_this, lpTextBuffer);
         AkelPad.MemFree(lpTextBuffer);
         return ret;
      }
      return undefined;
   }
   this.get = function() {
      return buffer(function(lpTextBuffer) {
         AkelPad.SendMessage(hWndStatus, _TSTR ? 1037 /*SB_GETTEXTW*/ : 1026 /*SB_GETTEXTA*/, nParts - 1, lpTextBuffer);
         return AkelPad.MemRead(lpTextBuffer, _TSTR);
      });
   };
   this.set = function(pStatusText) {
      buffer(function(lpTextBuffer) {
         _customStatus = pStatusText;
         AkelPad.MemCopy(lpTextBuffer, pStatusText, _TSTR);
         AkelPad.SendMessage(hWndStatus, _TSTR ? 1035 /*SB_SETTEXTW*/ : 1025 /*SB_SETTEXTA*/, nParts - 1, lpTextBuffer);
      });
   };
   this.save = function() {
      _origStatus = this.get();
   };
   this.restore = function() {
      if(_origStatus != undefined && this.get() == _customStatus)
         this.set(_origStatus);
   };
}
<download | mirror | development version>
Compare contents of current and next selected tab using WinMerge or any other compare tool.
Required MDI or PMDI window mode and timer.js library!


Last edited by Infocatcher on Sat Apr 12, 2014 8:41 pm; edited 2 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Sat Jun 08, 2013 9:36 pm    Post subject: Reply with quote

List of AkelPad methods from Scripts-Eng.txt and Scripts-Rus.txt files.

Required to include: BrowseForFolder_function.js and InputBox_function.js
All in one: KDJ.zip

AkelPadMethodsView.js

Code:
// AkelPadMethodsView.js - ver. 2014-07-23 (x86/x64)
//
// List of AkelPad methods from Scripts-*.txt files
//
// Usage:
// Call("Scripts::Main", 1, "AkelPadMethodsView.js")
// Required to include: BrowseForFolder_function.js and InputBox_function.js
//
// Hotkeys:
// Tab - rigth <-> left panel
// Ctrl(+Shift)+Tab - next/previous item on methods list
// F1 - menu
// F4 - maximize/restore window

var oSys       = AkelPad.SystemFunction();
var hInstDLL   = AkelPad.GetInstanceDll();
var sClassName = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var hDlg       = oSys.Call("User32::FindWindowExW", 0, 0, sClassName, 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();
}

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

GetLangStrings();

var Scale =
{
  Init: function()
  {
    var hDC = oSys.Call("User32::GetDC", hMainWnd);
    this.ScaleX = oSys.Call("Gdi32::GetDeviceCaps", hDC, 88 /*LOGPIXELSX*/);
    this.ScaleY = oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/);
    oSys.Call("User32::ReleaseDC", hMainWnd, hDC);
    //Align to 16 pixel
    this.ScaleX += (16 - this.ScaleX % 16) % 16;
    this.ScaleY += (16 - this.ScaleY % 16) % 16;
  },
  X:  function(n) {return oSys.Call("Kernel32::MulDiv", n, this.ScaleX, 96);},
  Y:  function(n) {return oSys.Call("Kernel32::MulDiv", n, this.ScaleY, 96);},
  UX: function(n) {return oSys.Call("Kernel32::MulDiv", n, 96, this.ScaleX);},
  UY: function(n) {return oSys.Call("Kernel32::MulDiv", n, 96, this.ScaleY);}
}
Scale.Init();

var hMainWnd     = AkelPad.GetMainWnd();
var hWndParent   = hMainWnd;
var hGuiFont     = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var nDlgMinW     = Scale.X(640);
var nDlgMinH     = Scale.Y(300);
var oDlgPos      = {"X": 230, "Y": 200, "W": nDlgMinW, "H": nDlgMinH, "Max": 0};
var bSeparateWnd = false;
var nAPMSel      = 0;
var bAPMSort     = true;
var nAPMLang     = 0;
var bMatchCase   = false;
var bWordWrap    = false;
var sFindName    = "";
var sFindText    = "";
var sAltDir      = "";
var aAPM         = [];
var aAESel       = [{}, {}];
var aIsLang;
var sHeader;
var hSubClass;
var hFocus;
var bCloseDlg;

var nTextMax = 512;
var lpTextLV = AkelPad.MemAlloc(nTextMax * 2);
var lpLVITEM = AkelPad.MemAlloc(_X64 ? (72) : (60)); //sizeof(LVITEM)
AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpLVITEM + (_X64 ? 24 : 20), lpTextLV, 2 /*DT_QWORD*/);
AkelPad.MemCopy(lpLVITEM + (_X64 ? 32 : 24), nTextMax, 3 /*DT_DWORD*/);

var aDlg      = [];
var IDHEADERS = 1000;
var IDNAMELV  = 1001;
var IDTEXTAE  = 1002;
var IDSORTB   = 1003;
var IDLANG1B  = 1004;
var IDLANG2B  = 1005;
var IDMENUB   = 1006;
var IDOKB     = 1007;
var IDCLOSEB  = 1008;

AkelPad.ScriptNoMutex();
AkelPad.WindowRegisterClass(sClassName);

while (! bCloseDlg)
{
  bCloseDlg = true;

  ReadIni();
  GetArrayAPM(hMainWnd);
  if (! aAPM.length)
    break;

  aDlg[IDHEADERS] = {Txt: sHeader,     Class: "STATIC",        Style: 0x50000001 /*WS_VISIBLE|WS_CHILD|SS_CENTER*/};
  aDlg[IDNAMELV ] = {Txt: "",          Class: "SysListView32", Style: 0x5080800D /*WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_REPORT*/};
  aDlg[IDTEXTAE ] = {Txt: "",          Class: "AkelEditW",     Style: 0x50B00804 /*WS_VISIBLE|WS_CHILD|WS_BORDER|WS_VSCROLL|WS_HSCROLL|ES_READONLY|ES_MULTILINE*/};
  aDlg[IDSORTB  ] = {Txt: sTxtSort,    Class: "BUTTON",        Style: 0x50000003 /*WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX*/};
  aDlg[IDLANG1B ] = {Txt: sTxtEnglish, Class: "BUTTON",        Style: 0x50000009 /*WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON*/};
  aDlg[IDLANG2B ] = {Txt: sTxtRussian, Class: "BUTTON",        Style: 0x50000009 /*WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON*/};
  aDlg[IDMENUB  ] = {Txt: sTxtMenu,    Class: "BUTTON",        Style: 0x50000000 /*WS_VISIBLE|WS_CHILD*/};
  aDlg[IDOKB    ] = {Txt: sTxtOK,      Class: "BUTTON",        Style: 0x50000001 /*WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON*/};
  aDlg[IDCLOSEB ] = {Txt: sTxtClose,   Class: "BUTTON",        Style: 0x50000000 /*WS_VISIBLE|WS_CHILD*/};

  oSys.Call("User32::CreateWindowExW",
    0,               //dwExStyle
    sClassName,      //lpClassName
    sTxtDlgTitle,    //lpWindowName
    0x80CF0000,      //dwStyle=WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX
    oDlgPos.X,       //x
    oDlgPos.Y,       //y
    oDlgPos.W,       //nWidth
    oDlgPos.H,       //nHeight
    hWndParent,      //hWndParent
    0,               //ID
    hInstDLL,        //hInstance
    DialogCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.

  oSys.Call("User32::ShowWindow", hDlg, oDlgPos.Max ? 3 /*SW_MAXIMIZE*/ : 1 /*SW_SHOWNORMAL*/);
  AkelPad.WindowGetMessage();
}

AkelPad.WindowUnregisterClass(sClassName);
AkelPad.MemFree(lpTextLV);
AkelPad.MemFree(lpLVITEM);

if (! oSys.Call("User32::IsWindowVisible", hMainWnd))
  oSys.Call("User32::ShowWindow", hMainWnd, 8 /*SW_SHOWNA*/);
if (oSys.Call("User32::IsIconic", hMainWnd))
  oSys.Call("User32::ShowWindow", hMainWnd, 9 /*SW_RESTORE*/);

oSys.Call("User32::SetForegroundWindow", hMainWnd);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 1) //WM_CREATE
  {
    var i;

    hDlg = hWnd;

    for (i = IDHEADERS; i < aDlg.length; ++i)
    {
      aDlg[i].HWND = oSys.Call("User32::CreateWindowExW",
        0,            //dwExStyle
        aDlg[i].Class,//lpClassName
        aDlg[i].Txt,  //lpWindowName
        aDlg[i].Style,//dwStyle
        0, 0, 0, 0,   //x, y, nWidth, nHeight
        hDlg,         //hWndParent
        i,            //ID
        hInstDLL,     //hInstance
        0);           //lpParam
      SetWindowFont(aDlg[i].HWND, hGuiFont);
    }

    CheckButtons();

    hSubClass = AkelPad.WindowSubClass(aDlg[IDTEXTAE].HWND, EditCallback, 135 /*WM_GETDLGCODE*/, 256 /*WM_KEYDOWN*/);
    SetOptionsAE();

    InsertColumnLV();
    FillLV(nAPMSel, AkelPad.GetSelText(), true);

    oSys.Call("User32::SetFocus", aDlg[IDTEXTAE].HWND);
    oSys.Call("User32::SetFocus", aDlg[IDNAMELV].HWND);

    PostMessage(hDlg, 0x8000 /*WM_APP*/, 0, 0);
  }

  else if (uMsg == 0x8000 /*WM_APP*/)
  {
    if (aAESel[nAPMLang][aAPM[nAPMSel][0]])
      SetSelAE(aAESel[nAPMLang][aAPM[nAPMSel][0]][0], aAESel[nAPMLang][aAPM[nAPMSel][0]][1]);
  }

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("User32::SetFocus", hFocus);

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

  else if (uMsg == 3) //WM_MOVE
  {
    if (! (oSys.Call("User32::IsZoomed", hDlg) || oSys.Call("User32::IsIconic", hDlg)))
      GetWindowPos(hDlg, oDlgPos);
  }

  else if (uMsg == 5) //WM_SIZE
  {
    if (wParam == 0 /*SIZE_RESTORED*/)
      GetWindowPos(hDlg, oDlgPos);

    ResizeDlg(LoWord(lParam), HiWord(lParam));
  }

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

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 9 /*VK_TAB*/)
    {
      if (Ctrl())
      {
        if (Shift())
        {
          if (nAPMSel > 0)
            --nAPMSel;
          else
            nAPMSel = aAPM.length - 1;
        }
        else
        {
          if (nAPMSel < aAPM.length - 1)
            ++nAPMSel;
          else
            nAPMSel = 0;
        }
        SetCurSelLV(nAPMSel);
        oSys.Call("User32::SetFocus", hFocus);
      }
      else
      {
        if (hFocus == aDlg[IDNAMELV].HWND)
          oSys.Call("User32::SetFocus", aDlg[IDTEXTAE].HWND);
        else
          oSys.Call("User32::SetFocus", aDlg[IDNAMELV].HWND);
      }
    }
    else if ((wParam >= 0x21 /*VK_PRIOR*/) && (wParam <= 0x28 /*VK_DOWN*/))
    {
      if (Ctrl() && (! Shift()) && Alt())
        MoveDlg(wParam);
    }
    else if (wParam == 0x43 /*C key*/)
    {
      if  (Ctrl() && (! Alt()))
      {
        if (hFocus == aDlg[IDNAMELV].HWND)
        {
          if (Shift())
            InsertNameToAP();
          else
            InsertNameToCB();
        }
        else
          InsertTextTo(! Shift());
      }
    }
    else if (wParam == 0x46 /*F key*/)
    {
      if (Ctrl() && (! Alt()))
      {
        if (hFocus == aDlg[IDNAMELV].HWND)
          FindName(Shift() ? 2 : 0);
        else
          FindText(Shift() ? 2 : 0);
      }
    }
    else if (wParam == 0x55 /*U key*/)
    {
      if (Ctrl() && (! Shift()) && (! Alt()))
      {
        bWordWrap = ! bWordWrap;
        SetWordWrapAE();
      }
    }
    else if (wParam == 0x70 /*VK_F1*/)
    {
      if ((! Ctrl()) && (! Shift()))
        MenuMain();
    }
    else if (wParam == 0x72 /*VK_F3*/)
    {
      if (! Ctrl())
      {
        if (hFocus == aDlg[IDNAMELV].HWND)
          FindNameNext(Shift() ? 3 : 1);
        else
          FindTextNext(Shift() ? 3 : 1);
      }
    }
    else if (wParam == 0x73 /*VK_F4*/)
    {
      if ((! Ctrl()) && (! Shift()))
        oSys.Call("User32::ShowWindow", hDlg, oSys.Call("User32::IsZoomed", hDlg) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
    }
    else if (wParam == 13 /*VK_RETURN*/)
    {
      if ((! Ctrl()) && (! Shift()) && (oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus")) < IDMENUB))
        PostMessage(hDlg, 273 /*WM_COMMAND*/, IDOKB, 0);
    }
    else if (wParam == 27 /*VK_ESCAPE*/)
      PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 260) //WM_SYSKEYDOWN
  {
    if (wParam == 0x46 /*F key*/)
    {
      if (hFocus == aDlg[IDNAMELV].HWND)
        FindName(Shift() ? 3 : 1);
      else
        FindText(Shift() ? 3 : 1);
    }
    else if (wParam == 13 /*VK_RETURN*/)
    {
      if (! Shift())
        oSys.Call("User32::ShowWindow", hDlg, oSys.Call("User32::IsZoomed", hDlg) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
    }
  }

  else if ((uMsg == 0x004E /*WM_NOTIFY*/) && (wParam == IDNAMELV))
  {
    switch (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), 3 /*DT_DWORD*/))
    {
      case -101 : //LVN_ITEMCHANGED
        if (AkelPad.MemRead(lParam + (_X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, 3 /*DT_DWORD*/) & 0x2 /*LVIS_SELECTED*/)
        {
          nAPMSel = GetCurSelLV();
          SetWindowText(aDlg[IDTEXTAE].HWND, aAPM[nAPMSel][1]);

          if (aAESel[nAPMLang][aAPM[nAPMSel][0]])
            SetSelAE(aAESel[nAPMLang][aAPM[nAPMSel][0]][0], aAESel[nAPMLang][aAPM[nAPMSel][0]][1]);
        }
        break;
      case -3 : //NM_DBLCLK
        if (AkelPad.MemRead(lParam + (_X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
          SetCurSelLV(GetCurFocLV());
        else
          PostMessage(hDlg, 273 /*WM_COMMAND*/, IDOKB, 0);
        break;
      case -2 : //NM_CLICK
      case -5 : //NM_RCLICK
      case -6 : //NM_RDBLCLK
        if (AkelPad.MemRead(lParam + (_X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
          SetCurSelLV(GetCurFocLV());
        break;
      case -7 : //NM_SETFOCUS
        hFocus = aDlg[IDNAMELV].HWND;
        break;
    }
  }

  else if (uMsg == 123) //WM_CONTEXTMENU
  {
    if (wParam == aDlg[IDNAMELV].HWND)
      MenuName(LoWord(lParam), HiWord(lParam));
    else if (wParam == aDlg[IDTEXTAE].HWND)
    {
      oSys.Call("User32::SetFocus", aDlg[IDTEXTAE].HWND);
      MenuText(LoWord(lParam), HiWord(lParam));
    }
  }

  else if (uMsg == 273) //WM_COMMAND
  {
    var nLowParam = LoWord(wParam);
    var nHiwParam = HiWord(wParam);
    var sFind;

    if (nLowParam == IDTEXTAE)
    {
      if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
      {
        if (SendMessage(AkelPad.GetEditWnd(), 3227 /*AEM_GETOPTIONS*/, 0, 0) & 0x00000800 /*AECO_ACTIVELINE*/)
          SendMessage(lParam, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00000800 /*AECO_ACTIVELINE*/);
        hFocus = lParam;
      }
      if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        SendMessage(lParam, 3228 /*AEM_SETOPTIONS*/, 4 /*AECOOP_XOR*/, 0x00000800 /*AECO_ACTIVELINE*/);
        aAESel[nAPMLang][aAPM[nAPMSel][0]] = [GetSelStartAE(), GetSelEndAE()];
      }
    }
    else if ((nLowParam >= IDSORTB) && (nLowParam <= IDLANG2B))
    {
      sFind = aAPM[nAPMSel][0];
      CheckButtons(nLowParam);
      GetArrayAPM(hDlg);

      if (aAPM.length)
      {
        CheckButtons();
        SetWindowText(aDlg[IDHEADERS].HWND, sHeader);
        FillLV(nAPMSel, sFind, false);
        oSys.Call("User32::SetFocus", hFocus);
      }
      else
        PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
    }
    else if (nLowParam == IDMENUB)
    {
      oSys.Call("User32::DefDlgProcW", hDlg, 1025 /*DM_SETDEFID*/, IDMENUB, 0);
      oSys.Call("User32::DefDlgProcW", hDlg, 1025 /*DM_SETDEFID*/, IDOKB, 0);
      oSys.Call("User32::SetFocus", hFocus);
      MenuMain();
    }
    else if (nLowParam == IDOKB)
      PostMessage(hDlg, 16 /*WM_CLOSE*/, 1, 0);
    else if (nLowParam == IDCLOSEB)
      PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    if (wParam)
      InsertNameToAP();

    aAESel[nAPMLang][aAPM[nAPMSel][0]] = [GetSelStartAE(), GetSelEndAE()];
    WriteIni();
    AkelPad.WindowUnsubClass(aDlg[IDTEXTAE].HWND);
    oSys.Call("User32::DestroyWindow", hDlg);
  }

  else if (uMsg == 2) //WM_DESTROY
    oSys.Call("User32::PostQuitMessage", 0);

  return 0;
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 135) //WM_GETDLGCODE
  {
    AkelPad.WindowNoNextProc(hSubClass);
    return 0x1; //DLGC_WANTARROWS
  }

  if (uMsg == 256) //WM_KEYDOWN
  {
    if ((wParam >= 0x21 /*VK_PRIOR*/) && (wParam <= 0x28 /*VK_DOWN*/) && Ctrl() && (!Shift()) && Alt())
      AkelPad.WindowNoNextProc(hSubClass);
  }

  return 0;
}

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

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

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

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

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

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

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

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

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

  if (hWnd)
    oSys.Call("User32::GetWindowRect", hWnd, lpRect);
  else
    oSys.Call("User32::SystemParametersInfoW", 0x30 /*SPI_GETWORKAREA*/, 0, lpRect, 0);

  oRect.X = AkelPad.MemRead(lpRect,      3 /*DT_DWORD*/);
  oRect.Y = AkelPad.MemRead(lpRect +  4, 3 /*DT_DWORD*/);
  oRect.W = AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/) - oRect.X;
  oRect.H = AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/) - oRect.Y;

  AkelPad.MemFree(lpRect);
}

function SetWindowText(hWnd, sText)
{
  oSys.Call("User32::SetWindowTextW", hWnd, sText);
}

function SetWindowFont(hWnd, hFont)
{
  SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
}

function GetSelStartAE()
{
  AkelPad.SetEditWnd(aDlg[IDTEXTAE].HWND);
  var nSelStart = AkelPad.GetSelStart();
  AkelPad.SetEditWnd(0);
  return nSelStart;
}

function GetSelEndAE()
{
  AkelPad.SetEditWnd(aDlg[IDTEXTAE].HWND);
  var nSelEnd = AkelPad.GetSelEnd();
  AkelPad.SetEditWnd(0);
  return nSelEnd;
}

function SetSelAE(nSelStart, nSelEnd)
{
  AkelPad.SetEditWnd(aDlg[IDTEXTAE].HWND);
  AkelPad.SetSel(nSelStart, nSelEnd);
  AkelPad.SetEditWnd(0);
}

function GetSelTextAE()
{
  AkelPad.SetEditWnd(aDlg[IDTEXTAE].HWND);
  var sText = AkelPad.GetSelText(0);
  AkelPad.SetEditWnd(0);
  return sText;
}

function SetWordWrapAE()
{
  SendMessage(aDlg[IDTEXTAE].HWND, 0x0CAA /*AEM_SETWORDWRAP*/, bWordWrap ? 1 /*AEWW_WORD*/ : 0 /*AEWW_NONE*/, 0);
}

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

  SetWindowFont(aDlg[IDTEXTAE].HWND, SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, 0, 0));
  SetWordWrapAE();

  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
  AkelPad.MemCopy(lpRect,      4, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect +  4, 4, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect +  8, 4, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect + 12, 4, 3 /*DT_DWORD*/);
  SendMessage(aDlg[IDTEXTAE].HWND, 3178 /*AEM_SETRECT*/, 0x03 /*AERC_MARGINS|AERC_UPDATE*/, lpRect);
  AkelPad.MemFree(lpRect);

  if (hEditWnd)
  {
    var lpAECOLORS = AkelPad.MemAlloc(17 * 4);
    AkelPad.MemCopy(lpAECOLORS, 0x0001FFFE /*AECLR_ALL*/, 3 /*DT_DWORD*/);
    SendMessage(hEditWnd, 3231 /*AEM_GETCOLORS*/, 0, lpAECOLORS);
    SendMessage(aDlg[IDTEXTAE].HWND, 3232 /*AEM_SETCOLORS*/, 0, lpAECOLORS);
    AkelPad.MemFree(lpAECOLORS);

    if (SendMessage(hEditWnd, 3227 /*AEM_GETOPTIONS*/, 0, 0) & 0x00001000 /*AECO_ACTIVELINEBORDER*/)
      SendMessage(aDlg[IDTEXTAE].HWND, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00001000 /*AECO_ACTIVELINEBORDER*/);

    var lpPOINT = AkelPad.MemAlloc(8);
    SendMessage(hEditWnd, 3237 /*AEM_GETCARETWIDTH*/, 0, lpPOINT);
    SendMessage(aDlg[IDTEXTAE].HWND, 3238 /*AEM_SETCARETWIDTH*/, 0, lpPOINT);
    AkelPad.MemFree(lpPOINT);

    SendMessage(aDlg[IDTEXTAE].HWND, 3260 /*AEM_SETLINEGAP*/, SendMessage(hEditWnd, 3259 /*AEM_GETLINEGAP*/, 0, 0), 0);
  }
}

function GetCurFocLV()
{
  return SendMessage(aDlg[IDNAMELV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0001 /*LVNI_FOCUSED*/);
}

function GetCurSelLV()
{
  return SendMessage(aDlg[IDNAMELV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0002 /*LVNI_SELECTED*/);
}

function SetCurSelLV(nItem)
{
  AkelPad.MemCopy(lpLVITEM + 12, 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpLVITEM + 16, 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/);
  SendMessage(aDlg[IDNAMELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
  SendMessage(aDlg[IDNAMELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, false);
}

function InsertColumnLV()
{
  var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44); //sizeof(LVCOLUMN)

  AkelPad.MemCopy(lpLVCOLUMN, 4 /*mask=LVCF_TEXT*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpLVCOLUMN + (_X64 ? 16 : 12), lpTextLV, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(lpTextLV, sTxtName, 1 /*DT_UNICODE*/);

  SendMessage(aDlg[IDNAMELV].HWND, 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0x0020 /*LVS_EX_FULLROWSELECT*/, 0x0020);
  SendMessage(aDlg[IDNAMELV].HWND, 0x1061 /*LVM_INSERTCOLUMNW*/, 0, lpLVCOLUMN);
  AkelPad.MemFree(lpLVCOLUMN);
}

function FillLV(nSel, sFind, bFindOnStart)
{
  var oRE = GetFindNameRegExp(sFind);
  var i;

  SendMessage(aDlg[IDNAMELV].HWND, 0x000B /*WM_SETREDRAW*/, false, 0);
  SendMessage(aDlg[IDNAMELV].HWND, 0x1009 /*LVM_DELETEALLITEMS*/, 0, 0);

  for (i = 0; i < aAPM.length; ++i)
  {
    AkelPad.MemCopy(lpLVITEM + 4, i, 3 /*DT_DWORD*/);
    AkelPad.MemCopy(lpTextLV, aAPM[i][0].replace(/^AkelPad\./, ""), 1 /*DT_UNICODE*/);
    SendMessage(aDlg[IDNAMELV].HWND, 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);

    if (sFind)
    {
      if ((bFindOnStart && oRE.test(aAPM[i][0])) || ((! bFindOnStart) && (aAPM[i][0] == sFind)))
      {
        if (bFindOnStart)
          sFindName = sFind;

        nSel  = i;
        sFind = "";
      }
    }
  }

  if (nSel >= aAPM.length)
    nSel = aAPM.length - 1;
  if (nSel < 0)
    nSel = 0;

  SetCurSelLV(nSel);
  SendMessage(aDlg[IDNAMELV].HWND, 0x000B /*WM_SETREDRAW*/, true, 0);
}

function GetArrayAPM(hWnd)
{
  var oFSO      = new ActiveXObject("Scripting.FileSystemObject");
  var sDocsDir  = AkelPad.GetAkelDir(2 /*ADTYPE_DOCS*/) + "\\";
  var aDocFile  = ["Scripts-Eng.txt", "Scripts-Rus.txt"];
  var nCodePage = 1251 /*ANSI Cyrillic*/;
  var sText;
  var lpTextA;
  var lpTextW;
  var nTextWLen;
  var aExec;
  var oRE;
  var i;

  aIsLang     = [false, false];
  sHeader     = "";
  aAPM.length = 0;

  while (! (aIsLang[0] || aIsLang[1]))
  {
    if (sAltDir)
    {
      for (i = 0; i < 2; ++i)
        aIsLang[i] = oFSO.FileExists(sAltDir + aDocFile[i]);
    }

    if (aIsLang[0] || aIsLang[1])
      sDocsDir = sAltDir;
    else
    {
      for (i = 0; i < 2; ++i)
        aIsLang[i] = oFSO.FileExists(sDocsDir + aDocFile[i]);

      if (! (aIsLang[0] || aIsLang[1]))
      {
        AkelPad.MessageBox(hWnd, sTxtNoFiles + "\n" + ((sAltDir && (sAltDir.toUpperCase() != sDocsDir.toUpperCase())) ? (sAltDir + aDocFile[0] + "\n" + sAltDir + aDocFile[1] + "\n") : "") + sDocsDir + aDocFile[0] + "\n" + sDocsDir + aDocFile[1], sTxtDlgTitle, 0x30 /*MB_ICONWARNING*/);

        if (! sAltDir)
          sAltDir = AkelPad.GetAkelDir(1 /*ADTYPE_AKELFILES*/) + "\\";

        sAltDir = BrowseForFolder(hWnd, sTxtChooseDir, sAltDir);

        if (! sAltDir)
          return;
        else if (sAltDir.slice(-1) != "\\")
          sAltDir += "\\";
      }
    }
  }

  if (! aIsLang[nAPMLang])
    nAPMLang = Number(! nAPMLang);

  oFile = oFSO.OpenTextFile(sDocsDir + aDocFile[nAPMLang], 1, false, 0 /*ASCII*/);
  sText = oFile.ReadAll().replace(/\r\n/g, "\n");
  oFile.Close();

  if (nAPMLang == 1)
  {
    //convert ANSII to UTF-16LE
    lpTextA = AkelPad.MemAlloc(sText.length + 1);
    AkelPad.MemCopy(lpTextA, sText, 0 /*DT_ANSI*/);
    if (nTextWLen = oSys.Call("Kernel32::MultiByteToWideChar", nCodePage, 0, lpTextA, -1, 0, 0))
    {
      lpTextW = AkelPad.MemAlloc(nTextWLen * 2);
      oSys.Call("Kernel32::MultiByteToWideChar", nCodePage, 0, lpTextA, -1, lpTextW, nTextWLen);
      sText = AkelPad.MemRead(lpTextW, 1 /*DT_UNICODE*/);
      AkelPad.MemFree(lpTextW);
    }
    AkelPad.MemFree(lpTextA);
  }

  //methods and constants
  oRE = /^(([\w.()]+)\n_+\n+[\s\S]+?\n)\n*(?=[\w.()]+\n_+)|^(([\w.()]+)\n_+\n+[\s\S]+?\n)\n*(?=\*{3} \S.+\S \*{3}\n)/gm
  while (aExec = oRE.exec(sText))
  {
    if (aExec[1])
      aAPM.push([aExec[2], aExec[1]]);
    else if (aExec[3])
      aAPM.push([aExec[4], aExec[3]]);
  }

  if (bAPMSort)
    aAPM.sort(
      function(a1, a2)
      {
        if (a1[0] < a2[0])
          return -1;
        else if (a1[0] > a2[0])
          return 1;
        else
          return 0;
      });

  //Scripts-*.txt
  //first char in Name must be "*"
  if (aExec = /(^\*{4,}\n\*{3} +(\S.+\S) +\*{3}\n\*{4,}\n+[\s\S]+?\n)/m.exec(sText))
  {
    sHeader = aExec[2];
    aAPM.push(["*** " + aDocFile[nAPMLang] + " ***", aExec[1]]);
  }

  oRE = /^((\*{3} \S.+\S \*{3})\n+[\s\S]+?\n)\n*(?=\*{3} \S.+\S \*{3}\n)|(^(\*{3} \S.+\S \*{3})\n+[\s\S]+)/gm;
  while (aExec = oRE.exec(sText))
  {
    if (aExec[1])
      aAPM.push([aExec[2].replace(/ \(.+\)/, ""), aExec[1]]);
    else if (aExec[3])
      aAPM.push([aExec[4].replace(/ \(.+\)/, ""), aExec[3]]);
  }
}

function CheckButtons(nButton)
{
  if (nButton == IDSORTB)
    bAPMSort = ! bAPMSort;
  else if ((nButton == IDLANG1B) || (nButton == IDLANG2B))
    nAPMLang = nButton - IDLANG1B;

  SendMessage(aDlg[IDSORTB ].HWND, 241 /*BM_SETCHECK*/, bAPMSort, 0);
  SendMessage(aDlg[IDLANG1B].HWND, 241 /*BM_SETCHECK*/, (nAPMLang == 0), 0);
  SendMessage(aDlg[IDLANG2B].HWND, 241 /*BM_SETCHECK*/, (nAPMLang == 1), 0);

  oSys.Call("User32::EnableWindow", aDlg[IDLANG1B].HWND, aIsLang[0]);
  oSys.Call("User32::EnableWindow", aDlg[IDLANG2B].HWND, aIsLang[1]);
}

function PaintSizeGrip()
{
  var lpPaint = AkelPad.MemAlloc(_X64 ? 72 : 64); //sizeof(PAINTSTRUCT)
  var lpRect  = AkelPad.MemAlloc(16); //sizeof(RECT)
  var hDC;

  if (hDC = oSys.Call("User32::BeginPaint", hDlg, lpPaint))
  {
    oSys.Call("User32::GetClientRect", hDlg, lpRect);

    AkelPad.MemCopy(lpRect,     AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/) - oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/), 3 /*DT_DWORD*/);
    AkelPad.MemCopy(lpRect + 4, AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/) - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), 3 /*DT_DWORD*/);

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

  AkelPad.MemFree(lpPaint);
  AkelPad.MemFree(lpRect);
}

function ResizeDlg(nW, nH)
{
  var nFlags = 0x14; //SWP_NOACTIVATE|SWP_NOZORDER
  var nGapW  = Scale.X(10);
  var nGapH  = Scale.Y(10);
  var nLVW   = Scale.X(205);
  var nAEW   = nW - nLVW - 3 * nGapW;
  var i;

  oSys.Call("User32::SetWindowPos",
    aDlg[IDHEADERS].HWND, 0,
    nW - nAEW - nGapW,
    nGapH,
    nAEW,
    Scale.Y(13),
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDNAMELV].HWND, 0,
    nGapW,
    nGapH,
    nLVW,
    nH - 3 * nGapH - Scale.Y(23) - Scale.Y(25) - Scale.Y(20),
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDTEXTAE].HWND, 0,
    nW - nAEW - nGapW,
    3 * nGapH,
    nAEW,
    nH - 4 * nGapH,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDSORTB].HWND, 0,
    nGapW,
    nH - nGapH - Scale.Y(23) - Scale.Y(25) - Scale.Y(20),
    Scale.X(80),
    Scale.Y(16),
    nFlags);
  for (i = IDLANG1B; i <= IDLANG2B; ++i)
  {
    oSys.Call("User32::SetWindowPos",
      aDlg[i].HWND, 0,
      Scale.X(150),
      nH - nGapH - Scale.Y(23) - Scale.Y(25) - (IDLANG2B - i) * Scale.Y(20),
      Scale.X(60),
      Scale.Y(16),
      nFlags);
  }
  for (i = IDMENUB; i <= IDCLOSEB; ++i)
  {
    oSys.Call("User32::SetWindowPos",
      aDlg[i].HWND, 0,
      nGapW + Scale.X((i - IDMENUB) * 70),
      nH - nGapH - Scale.Y(23),
      Scale.X(65),
      Scale.Y(23),
      nFlags);
  }

  SendMessage(aDlg[IDNAMELV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
  SendMessage(aDlg[IDNAMELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, GetCurSelLV(), false);
}

function MoveDlg(nKey)
{
  var oRectWA = {};
  var oRect   = {};

  GetWindowPos(0, oRectWA);
  GetWindowPos(hDlg, oRect);

  if (nKey == 0x21 /*VK_PRIOR*/)
    oRect.Y = oRectWA.Y;
  else if (nKey == 0x22 /*VK_NEXT*/)
    oRect.Y = oRectWA.Y + oRectWA.H - oRect.H;
  else if (nKey == 0x23 /*VK_END*/)
    oRect.X = oRectWA.X + oRectWA.W - oRect.W;
  else if (nKey == 0x24 /*VK_HOME*/)
    oRect.X = oRectWA.X;
  else if (nKey == 0x25 /*VK_LEFT*/)
  {
    if (oRect.X > oRectWA.X)
      oRect.X = (oRect.X - oRectWA.X > 20) ? oRect.X - 20 : oRectWA.X;
  }
  else if (nKey == 0x26 /*VK_UP*/)
  {
    if (oRect.Y > oRectWA.Y)
      oRect.Y = (oRect.Y - oRectWA.Y > 20) ? oRect.Y - 20 : oRectWA.Y;
  }
  else if (nKey == 0x27 /*VK_RIGHT*/)
  {
    if (oRect.X + oRect.W < oRectWA.X + oRectWA.W)
      oRect.X = (oRectWA.X + oRectWA.W - oRect.X - oRect.W > 20) ? oRect.X + 20 : oRectWA.X + oRectWA.W - oRect.W;
  }
  else if (nKey == 0x28 /*VK_DOWN*/)
  {
    if (oRect.Y + oRect.H < oRectWA.Y + oRectWA.H)
      oRect.Y = (oRectWA.Y + oRectWA.H - oRect.Y - oRect.H > 20) ? oRect.Y + 20 : oRectWA.Y + oRectWA.H - oRect.H;
  }

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

function FindName(nDirection)
{
  InputBox(aDlg[IDNAMELV].HWND, sTxtFindName, [sTxtDownFromBeg, sTxtDownFromCur, sTxtUpFromEnd, sTxtUpFromCur][nDirection] + "\n\n" + sTxtName + ":", sFindName, 0, CheckFindName, nDirection, 0, (bMatchCase ? sTxtMatchCase : sTxtIgnoreCase));
}

function CheckFindName(hWnd, aName, nDirection)
{
  if (aName[0])
  {
    sFindName = aName[0];
    if (! FindNameNext(nDirection))
    {
      AkelPad.MessageBox(hWnd, sTxtNotFound, sTxtDlgTitle, 0x30 /*MB_ICONWARNING*/);
      return 0;
    }
  }
  else
    return 0;

  return -1;
}

function FindNameNext(nDirection)
{
  var bFound = false;

  if (sFindName)
  {
    var oRE = GetFindNameRegExp(sFindName);
    var nStart;
    var i;

    if (nDirection < 2)
    {
      if (nDirection == 0)
        nStart = 0;
      else
        nStart = GetCurSelLV() + 1;
 
      for (i = nStart; i < aAPM.length; ++i)
      {
        if (oRE.test(aAPM[i][0]))
        {
          SetCurSelLV(i);
          bFound = true;
          break;
        }
      }
    }
    else
    {
      if (nDirection == 2)
        nStart = aAPM.length - 1;
      else
        nStart = GetCurSelLV() - 1;
 
      for (i = nStart; i >= 0; --i)
      {
        if (oRE.test(aAPM[i][0]))
        {
          SetCurSelLV(i);
          bFound = true;
          break;
        }
      }
    }
  }

  return bFound;
}

function GetFindNameRegExp(sText)
{
  return new RegExp(sText.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&"), (bMatchCase ? "" : "i"));
}

function FindText(nDirection)
{
  var sText = GetSelTextAE();

  if (! sText)
    sText = sFindText;

  InputBox(aDlg[IDTEXTAE].HWND, sTxtFindText, [sTxtDownFromBeg, sTxtDownFromCur, sTxtUpFromEnd, sTxtUpFromCur][nDirection] + "\n\n" + sTxtText + ":", sText, 0, CheckFindText, nDirection, 0, (bMatchCase ? sTxtMatchCase : sTxtIgnoreCase));
}

function CheckFindText(hWnd, aText, nDirection)
{
  if (aText[0])
  {
    sFindText = aText[0];
    if (! FindTextNext(nDirection))
    {
      AkelPad.MessageBox(hWnd, sTxtNotFound, sTxtDlgTitle, 0x30 /*MB_ICONWARNING*/);
      return 0;
    }
  }
  else
    return 0;

  return -1;
}

function FindTextNext(nDirection)
{
  var bFound = false;
  var nNameStart;
  var nTextStart;
  var nSel;
  var i;

  if (nDirection < 2)
  {
    if (nDirection == 0)
    {
      nNameStart = 0;
      nTextStart = 0;
    }
    else
    {
      nNameStart = GetCurSelLV();
      nTextStart = GetSelEndAE();
    }

    for (i = nNameStart; i < aAPM.length; ++i)
    {
      if (bMatchCase)
        nSel = aAPM[i][1].indexOf(sFindText, (i == nNameStart) ? nTextStart : 0);
      else
        nSel = aAPM[i][1].toUpperCase().indexOf(sFindText.toUpperCase(), (i == nNameStart) ? nTextStart : 0);

      if (nSel > -1)
      {
        SetCurSelLV(i);
        SetSelAE(nSel, nSel + sFindText.length);
        bFound = true;
        break;
      }
    }
  }
  else
  {
    if (nDirection == 2)
    {
      nNameStart = aAPM.length - 1;
      nTextStart = aAPM[nNameStart][1].length;
    }
    else
    {
      nNameStart = GetCurSelLV();
      nTextStart = GetSelStartAE() - sFindText.length;

      if ((nTextStart < 0) && (--nNameStart >= 0))
        nTextStart = aAPM[nNameStart][1].length;
    }

    for (i = nNameStart; i >= 0; --i)
    {
      if (bMatchCase)
        nSel = aAPM[i][1].lastIndexOf(sFindText, (i == nNameStart) ? nTextStart : aAPM[i][1].length);
      else
        nSel = aAPM[i][1].toUpperCase().lastIndexOf(sFindText.toUpperCase(), (i == nNameStart) ? nTextStart : aAPM[i][1].length);

      if (nSel > -1)
      {
        SetCurSelLV(i);
        SetSelAE(nSel, nSel + sFindText.length);
        bFound = true;
        break;
      }
    }
  }

  return bFound;
}

function InsertNameToCB()
{
  if ((nAPMSel >= 0) && (aAPM[nAPMSel][0].charAt(0) != "*"))
    AkelPad.SetClipboardText(aAPM[nAPMSel][0] + ((aAPM[nAPMSel][0].substr(0, 8) == "AkelPad.") ? "()" : ""));
}

function InsertNameToAP()
{
  if ((nAPMSel >= 0) && (aAPM[nAPMSel][0].charAt(0) != "*") && AkelPad.GetEditWnd() && (! AkelPad.GetEditReadOnly(0)))
  {
    if (aAPM[nAPMSel][0].substr(0, 8) == "AkelPad.")
    {
      var sSelText = AkelPad.GetSelText(0);
      AkelPad.ReplaceSel(aAPM[nAPMSel][0] + "(" + sSelText + ")");
      AkelPad.SetSel(AkelPad.GetSelEnd() - sSelText.length - 1, AkelPad.GetSelEnd() - 1);
    }
    else
      AkelPad.ReplaceSel(aAPM[nAPMSel][0], true);
  }
}

function InsertTextTo(bClipboard)
{
  var sText = GetSelTextAE();

  if (sText)
  {
    if (bClipboard)
      AkelPad.SetClipboardText(sText);
    else
      AkelPad.ReplaceSel(sText, true);
  }
}

function MenuMain()
{
  var MF_STRING    = 0x0000;
  var MF_CHECKED   = 0x0008;
  var MF_POPUP     = 0x0010;
  var MF_SEPARATOR = 0x0800;
  var hMenu1 = oSys.Call("User32::CreatePopupMenu");
  var hMenu2 = oSys.Call("User32::CreatePopupMenu");
  var hMenu3 = oSys.Call("User32::CreatePopupMenu");
  var hMenu  = oSys.Call("User32::CreatePopupMenu");
  var aMenu  = [hMenu1, hMenu2];
  var oRect  = {};
  var nCmd;
  var nCmd1;
  var i;

  for (i = 1; i <= 2; ++i)
  {
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0000 | i, sTxtDownFromBeg + "\tCtrl+F");
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0200 | i, sTxtUpFromEnd   + "\tCtrl+Shift+F");
    oSys.Call("user32::AppendMenuW", aMenu[i - 1], MF_SEPARATOR, 0);
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0100 | i, sTxtDownFromCur + "\tAlt+F");
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0300 | i, sTxtUpFromCur   + "\tShift+Alt+F");
    oSys.Call("user32::AppendMenuW", aMenu[i - 1], MF_SEPARATOR, 0);
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0400 | i, sTxtNext     + "\tF3");
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0500 | i, sTxtPrevious + "\tShift+F3");
  }

  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2503 /*VK_LEFT*/,  sTxtLeft  + "\tCtrl+Alt+Left");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2703 /*VK_RIGHT*/, sTxtRight + "\tCtrl+Alt+Right");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2603 /*VK_UP*/,    sTxtUp    + "\tCtrl+Alt+Up");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2803 /*VK_DOWN*/,  sTxtDown  + "\tCtrl+Alt+Down");
  oSys.Call("user32::AppendMenuW", hMenu3, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2403 /*VK_HOME*/,  sTxtToLeftEdge   + "\tCtrl+Alt+Home");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2303 /*VK_END*/,   sTxtToRightEdge  + "\tCtrl+Alt+End");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2103 /*VK_PRIOR*/, sTxtToTopEdge    + "\tCtrl+Alt+PgUp");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2203 /*VK_NEXT*/,  sTxtToBottomEdge + "\tCtrl+Alt+PgDn");

  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP,  hMenu1, sTxtFindName);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP,  hMenu2, sTxtFindText);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP,  hMenu3, sTxtMoveWindow);
  oSys.Call("user32::AppendMenuW", hMenu, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu, (bMatchCase ? MF_CHECKED : MF_STRING), 0x0004, sTxtFindCase);
  oSys.Call("User32::AppendMenuW", hMenu, (bWordWrap ? MF_CHECKED : MF_STRING), 0x0005, sTxtWrapLines + "\tCtrl+U");
  oSys.Call("User32::AppendMenuW", hMenu, (bSeparateWnd ? MF_CHECKED : MF_STRING), 0x0006, sTxtSeparateWnd);

  GetWindowPos(aDlg[IDMENUB].HWND, oRect);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x01A0 /*TPM_NONOTIFY|TPM_RETURNCMD|TPM_BOTTOMALIGN*/, oRect.X, oRect.Y, 0, hDlg, 0);

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

  nCmd1 = (nCmd >> 8) & 0xFF;
  nCmd  = nCmd & 0xFF;

  if (nCmd == 1)
  {
    oSys.Call("User32::SetFocus", aDlg[IDNAMELV].HWND);
    if (nCmd1 < 4)
      FindName(nCmd1);
    else if (nCmd1 == 4)
      FindNameNext(1);
    else if (nCmd1 == 5)
      FindNameNext(3);
  }
  else if (nCmd == 2)
  {
    oSys.Call("User32::SetFocus", aDlg[IDTEXTAE].HWND);
    if (nCmd1 < 4)
      FindText(nCmd1);
    else if (nCmd1 == 4)
      FindTextNext(1);
    else if (nCmd1 == 5)
      FindTextNext(3);
  }
  else if (nCmd == 3)
    MoveDlg(nCmd1);
  else if (nCmd == 4)
    bMatchCase = ! bMatchCase;
  else if (nCmd == 5)
  {
    bWordWrap = ! bWordWrap;
    SetWordWrapAE();
  }
  else if (nCmd == 6)
  {
    bSeparateWnd = ! bSeparateWnd;
    bCloseDlg    = false;
    PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }
}

function MenuName(nX, nY)
{
  var lpRect;
  var nX1, nY1, nY2;
  var hMenu;
  var nCmd;

  if ((nAPMSel < 0) || (aAPM[nAPMSel][0].charAt(0) == "*"))
    return;

  //menu from keyboard
  if (nX == 0xFFFF)
    SendMessage(aDlg[IDNAMELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nAPMSel, false);

  lpRect = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
  SendMessage(aDlg[IDNAMELV].HWND, 0x100E /*LVM_GETITEMRECT*/, nAPMSel, lpRect);
  oSys.Call("User32::ClientToScreen", aDlg[IDNAMELV].HWND, lpRect);
  oSys.Call("User32::ClientToScreen", aDlg[IDNAMELV].HWND, lpRect + 8);
  nX1 = AkelPad.MemRead(lpRect,      3 /*DT_DWORD*/);
  nY1 = AkelPad.MemRead(lpRect +  4, 3 /*DT_DWORD*/);
  nY2 = AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpRect);

  if (nX == 0xFFFF)
  {
    nX = nX1;
    nY = nY2;
  }
  else if ((nY < nY1) || (nY > nY2))
    return;

  hMenu = oSys.Call("User32::CreatePopupMenu");
  oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, 1, sTxtCopyToCB + "\tCtrl+C");
  oSys.Call("User32::AppendMenuW", hMenu, AkelPad.GetEditWnd() && (! AkelPad.GetEditReadOnly(0)) ? 0 /*MF_STRING*/ : 0x01 /*MF_GRAYED*/, 2, sTxtInsertToAP + "\tCtrl+Shift+C");

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

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

  if (nCmd == 1)
    InsertNameToCB();
  else if (nCmd == 2)
    InsertNameToAP();
}

function MenuText(nX, nY)
{
  var bSel  = SendMessage(aDlg[IDTEXTAE].HWND, 3125 /*AEM_GETSEL*/, 0, 0);
  var hMenu = oSys.Call("User32::CreatePopupMenu");
  var lpPoint;
  var nCmd;

  //menu from keyboard
  if (nX == 0xFFFF)
  {
    lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
    oSys.Call("User32::GetCaretPos", lpPoint);
    oSys.Call("User32::ClientToScreen", aDlg[IDTEXTAE].HWND, lpPoint);
    nX = AkelPad.MemRead(lpPoint,     3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(lpPoint + 4, 3 /*DT_DWORD*/) + SendMessage(aDlg[IDTEXTAE].HWND, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, 0);
    AkelPad.MemFree(lpPoint);
  }

  oSys.Call("User32::AppendMenuW", hMenu, bSel ? 0 /*MF_STRING*/ : 0x01 /*MF_GRAYED*/, 1, sTxtCopyToCB + "\tCtrl+C");
  oSys.Call("User32::AppendMenuW", hMenu, AkelPad.GetEditWnd() && (! AkelPad.GetEditReadOnly(0)) && bSel ? 0 /*MF_STRING*/ : 0x01 /*MF_GRAYED*/, 2, sTxtInsertToAP + "\tCtrl+Shift+C");
  oSys.Call("user32::AppendMenuW", hMenu, 0x0800 /*MF_SEPARATOR*/, 0);
  oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, 3, sTxtSelectAll + "\tCtrl+A");

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

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

  if (nCmd == 1)
    InsertTextTo(true);
  else if (nCmd == 2)
    InsertTextTo(false);
  else if (nCmd == 3)
    SetSelAE(0, -1);
}

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

  oDlgPos.W  = Math.max(Scale.X(oDlgPos.W), nDlgMinW);
  oDlgPos.H  = Math.max(Scale.Y(oDlgPos.H), nDlgMinH);
  hWndParent = bSeparateWnd ? 0 : hMainWnd;
}

function WriteIni()
{
  var sIniTxt = "";
  var i;

  oDlgPos.W   = Scale.UX(oDlgPos.W);
  oDlgPos.H   = Scale.UY(oDlgPos.H);
  oDlgPos.Max = oSys.Call("User32::IsZoomed", hDlg);

  for (i in oDlgPos)
    sIniTxt += 'oDlgPos.' + i + '=' + oDlgPos[i] + ';\r\n';

  sIniTxt +=
    'bSeparateWnd=' + bSeparateWnd + ';\r\n' +
    'nAPMSel='      + nAPMSel + ';\r\n' +
    'bAPMSort='     + bAPMSort + ';\r\n' +
    'nAPMLang='     + nAPMLang + ';\r\n' +
    'bMatchCase='   + bMatchCase + ';\r\n' +
    'bWordWrap='    + bWordWrap + ';\r\n' +
    'sFindName="'   + EscapeStr(sFindName) + '";\r\n' +
    'sFindText="'   + EscapeStr(sFindText) + '";\r\n' +
    'sAltDir="'     + EscapeStr(sAltDir) + '";\r\n' +
    'aAESel[0]={';

  for (i in aAESel[0])
    sIniTxt += '"' + i + '":[' + aAESel[0][i] + '],';

  if (sIniTxt.slice(-1) == ',')
    sIniTxt = sIniTxt.slice(0, -1);

  sIniTxt += '};\r\naAESel[1]={';

  for (i in aAESel[1])
    sIniTxt += '"' + i + '":[' + aAESel[1][i] + '],';

  if (sIniTxt.slice(-1) == ',')
    sIniTxt = sIniTxt.slice(0, -1);

  sIniTxt += '};';
   
  AkelPad.WriteFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), sIniTxt, sIniTxt.length, 1200 /*UTF-16LE*/, true);
}

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

function GetLangStrings()
{
//  if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/)
//  {
//  }
//  else
  {
    sTxtDlgTitle     = "AkelPad methods view";
    sTxtNoFiles      = "Files not found:";
    sTxtChooseDir    = "Choose directory with documentation of Scripts plugin:";
    sTxtSort         = "&Sort methods";
    sTxtEnglish      = "&English";
    sTxtRussian      = "&Russian";
    sTxtMenu         = "&Menu";
    sTxtOK           = "OK";
    sTxtClose        = "Close";
    sTxtName         = "Name";
    sTxtText         = "Text";
    sTxtFindName     = "Find name";
    sTxtFindText     = "Find text";
    sTxtDownFromBeg  = "Down from beginning";
    sTxtDownFromCur  = "Down from current position";
    sTxtUpFromEnd    = "Up from end";
    sTxtUpFromCur    = "Up from current position";
    sTxtNext         = "Next";
    sTxtPrevious     = "Previous";
    sTxtMatchCase    = "Match case";
    sTxtIgnoreCase   = "Ignore case";
    sTxtNotFound     = "Not found.";
    sTxtMoveWindow   = "Move window";
    sTxtLeft         = "Left";
    sTxtRight        = "Right";
    sTxtUp           = "Up";
    sTxtDown         = "Down";
    sTxtToLeftEdge   = "To left edge";
    sTxtToRightEdge  = "To right edge";
    sTxtToTopEdge    = "To top edge";
    sTxtToBottomEdge = "To bottom edge";
    sTxtFindCase     = "Find - match case";
    sTxtWrapLines    = "Wrap lines";
    sTxtSeparateWnd  = "Run in separate window";
    sTxtCopyToCB     = "Copy to clipboard";
    sTxtInsertToAP   = "Insert to AkelPad";
    sTxtSelectAll    = "Select all";
  }
}


Last edited by KDJ on Wed Jul 23, 2014 11:16 am; edited 16 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Sat Jul 27, 2013 11:45 am    Post subject: Reply with quote

Bitwise calculator.

CalculatorBin.js

Code:
// CalculatorBin.js - ver. 2013-08-02 (x86/x64)
//
// Bitwise calculator.
//
// Run in AkelPad window:
//   Call("Scripts::Main", 1, "CalculatorBin.js")
// Run from command line (required registration: regsvr32.exe Scripts.dll):
//   wscript.exe CalculatorBin.js
//
// Hotkeys:
// Alt+(F1,F2,F3) - set focus to binA, hexA, decA
// Alt+(1,2,3) - set focus to binB, hexB, decB
// Ctrl+Alt+(arrows,PgUp,PgDn,Home,End) - move window

if (typeof AkelPad == "undefined")
{
  try
  {
    AkelPad = new ActiveXObject("AkelPad.Document");
  }
  catch (oError)
  {
    WScript.Echo("You need register Scripts.dll");
    WScript.Quit();
  }
}

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

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

  oSys.Call("User32::SetForegroundWindow", hDlg);
}
else
{
  var hIcon = oSys.Call("User32::LoadImageW",
        hInstDLL,   //hinst
        101,        //lpszName
        1,          //uType=IMAGE_ICON
        0,          //cxDesired
        0,          //cyDesired
        0x00000040);//fuLoad=LR_DEFAULTSIZE

  var hMainWnd = AkelPad.GetMainWnd();
  var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
  var aOper    = [["|", "OR"], ["&", "AND"], ["^", "XOR"], ["<<", "LShift"], [">>", "RShift"], [">>>", "URShift"], ["none", ""]];
  var nTextLen = 65;
  var lpText   = AkelPad.MemAlloc(nTextLen * 2);
  var hBitmap  = CreateCaretBitmap();
  var hFocus;
  var hSubClass;
  var bCloseCB;

  //.ini settings
  var nDlgX     = 100;
  var nDlgY     = 120;
  var bOverType = true;
  var bSigned   = true;
  var nBits     = 32;
  var nOper     = 0;
  var bNotA     = false;
  var bNotB     = false;
  var sDecA     = "0";
  var sDecB     = "0";
  ReadIni();

  var aDlg       = [];
  var IDNOT      = 1000;
  var IDHEX      = 1001;
  var IDDEC      = 1002;
  var IDBIN      = 1003;
  var IDNOTA     = 1004;
  var IDBINA     = 1005;
  var IDHEXA     = 1006;
  var IDDECA     = 1007;
  var IDOPER     = 1008;
  var IDOPERS    = 1009;
  var IDOPERNAME = 1010;
  var IDNOTB     = 1011;
  var IDBINB     = 1012;
  var IDHEXB     = 1013;
  var IDDECB     = 1014;
  var IDRESULT   = 1015;
  var IDBINR     = 1016;
  var IDHEXR     = 1017;
  var IDDECR     = 1018;
  var IDBITS     = 1019;
  var IDSIGNED   = 1020;
  var IDBYTES    = 1021;
  var IDQWORD    = 1022;
  var IDDWORD    = 1023;
  var IDWORD     = 1024;
  var IDBYTE     = 1025;
  var IDCLEAR    = 1026;
  var IDCLOSE    = 1027;

  //0x50000000 - WS_VISIBLE|WS_CHILD
  //0x50000002 - WS_VISIBLE|WS_CHILD|SS_RIGHT
  //0x50000007 - WS_VISIBLE|WS_CHILD|BS_GROUPBOX
  //0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
  //0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|CBS_DROPDOWNLIST
  //0x50010009 = WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON
  //0x5081000A - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|ES_UPPERCASE|ES_RIGHT
  //0x50810802 - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|ES_READONLY|ES_RIGHT
  aDlg[IDNOT]      = {Class: 'STATIC',   Style: 0x50000000, X:  10, Y:  14, W:  25, H:  13, Txt: 'NOT'};
  aDlg[IDBIN]      = {Class: 'STATIC',   Style: 0x50000002, X:  40, Y:  14, W: 387, H:  13, Txt: 'bin'};
  aDlg[IDHEX]      = {Class: 'STATIC',   Style: 0x50000002, X: 435, Y:  14, W: 132, H:  13, Txt: 'hex'};
  aDlg[IDDEC]      = {Class: 'STATIC',   Style: 0x50000002, X: 575, Y:  14, W: 127, H:  13, Txt: 'dec'};
  aDlg[IDNOTA]     = {Class: 'BUTTON',   Style: 0x50010003, X:  10, Y:  30, W:  25, H:  16, Txt: '~'};
  aDlg[IDBINA]     = {Class: 'EDIT',     Style: 0x5081000A, X:  40, Y:  30, W: 390, H:  19, Txt: ''};
  aDlg[IDHEXA]     = {Class: 'EDIT',     Style: 0x5081000A, X: 435, Y:  30, W: 135, H:  19, Txt: ''};
  aDlg[IDDECA]     = {Class: 'EDIT',     Style: 0x5081000A, X: 575, Y:  30, W: 130, H:  19, Txt: ''};
  aDlg[IDOPER]     = {Class: 'STATIC',   Style: 0x50000000, X: 715, Y:  25, W:  50, H:  13, Txt: '&Operator:'};
  aDlg[IDOPERS]    = {Class: 'COMBOBOX', Style: 0x50010003, X: 715, Y:  41, W:  50, H: 130, Txt: ''};
  aDlg[IDOPERNAME] = {Class: 'STATIC',   Style: 0x50000000, X: 715, Y:  65, W:  50, H:  13, Txt: ''};
  aDlg[IDNOTB]     = {Class: 'BUTTON',   Style: 0x50010003, X:  10, Y:  53, W:  25, H:  16, Txt: '~'};
  aDlg[IDBINB]     = {Class: 'EDIT',     Style: 0x5081000A, X:  40, Y:  53, W: 390, H:  19, Txt: ''};
  aDlg[IDHEXB]     = {Class: 'EDIT',     Style: 0x5081000A, X: 435, Y:  53, W: 135, H:  19, Txt: ''};
  aDlg[IDDECB]     = {Class: 'EDIT',     Style: 0x5081000A, X: 575, Y:  53, W: 130, H:  19, Txt: ''};
  aDlg[IDRESULT]   = {Class: 'STATIC',   Style: 0x50000000, X:  30, Y:  76, W:  55, H:  16, Txt: '='};
  aDlg[IDBINR]     = {Class: 'EDIT',     Style: 0x50810802, X:  40, Y:  76, W: 390, H:  19, Txt: ''};
  aDlg[IDHEXR]     = {Class: 'EDIT',     Style: 0x50810802, X: 435, Y:  76, W: 135, H:  19, Txt: ''};
  aDlg[IDDECR]     = {Class: 'EDIT',     Style: 0x50810802, X: 575, Y:  76, W: 130, H:  19, Txt: ''};
  aDlg[IDBITS]     = {Class: 'STATIC',   Style: 0x50000002, X:  40, Y:  98, W: 387, H:  13, Txt: ''};
  aDlg[IDSIGNED]   = {Class: 'BUTTON',   Style: 0x50010003, X:  40, Y: 130, W:  50, H:  16, Txt: '&Signed'};
  aDlg[IDBYTES]    = {Class: 'BUTTON',   Style: 0x50000007, X: 100, Y: 117, W: 230, H:  35, Txt: ''};
  aDlg[IDQWORD]    = {Class: 'BUTTON',   Style: 0x50010009, X: 110, Y: 130, W:  50, H:  16, Txt: '&Qword'};
  aDlg[IDDWORD]    = {Class: 'BUTTON',   Style: 0x50010009, X: 170, Y: 130, W:  50, H:  16, Txt: '&Dword'};
  aDlg[IDWORD]     = {Class: 'BUTTON',   Style: 0x50010009, X: 230, Y: 130, W:  50, H:  16, Txt: '&Word'};
  aDlg[IDBYTE]     = {Class: 'BUTTON',   Style: 0x50010009, X: 285, Y: 130, W:  40, H:  16, Txt: '&Byte'};
  aDlg[IDCLEAR]    = {Class: 'BUTTON',   Style: 0x50010000, X: 620, Y: 130, W:  70, H:  23, Txt: '&Clear'};
  aDlg[IDCLOSE]    = {Class: 'BUTTON',   Style: 0x50010000, X: 695, Y: 130, W:  70, H:  23, Txt: 'Close'};

  AkelPad.WindowRegisterClass(sClassName);

  hDlg = oSys.Call("User32::CreateWindowExW",
    0,              //dwExStyle
    sClassName,     //lpClassName
    "CalculatorBin",//lpWindowName
    0x90CA0000,     //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
    nDlgX,          //x
    nDlgY,          //y
    781,            //nWidth
    194,            //nHeight
    hMainWnd,       //hWndParent
    0,              //ID
    hInstDLL,       //hInstance
    DialogCallback);//Script function callback. To use it class must be registered by WindowRegisterClass.

  AkelPad.ScriptNoMutex();
  AkelPad.WindowGetMessage();

  AkelPad.WindowUnregisterClass(sClassName);
  AkelPad.MemFree(lpText);
  oSys.Call("User32::DestroyIcon", hIcon);
  oSys.Call("Gdi32::DeleteObject", hBitmap);
}

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 1) //WM_CREATE
  {
    var hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
    var i;

    for (i = 1000; i < aDlg.length; ++i)
    {
      aDlg[i].Handle = oSys.Call("User32::CreateWindowExW",
        0,            //dwExStyle
        aDlg[i].Class,//lpClassName
        aDlg[i].Txt,  //lpWindowName
        aDlg[i].Style,//dwStyle
        aDlg[i].X,    //x
        aDlg[i].Y,    //y
        aDlg[i].W,    //nWidth
        aDlg[i].H,    //nHeight
        hWnd,         //hWndParent
        i,            //ID
        hInstDLL,     //hInstance
        0);           //lpParam
      AkelPad.SendMessage(aDlg[i].Handle, 48 /*WM_SETFONT*/, hGuiFont, true);
    }

    AkelPad.SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIcon);
    AkelPad.SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 1 /*ICON_BIG*/, hIcon);

    AkelPad.SendMessage(aDlg[IDSIGNED].Handle, 0x00F1 /*BM_SETCHECK*/, bSigned, 0);
    AkelPad.SendMessage(aDlg[IDQWORD].Handle,  0x00F1 /*BM_SETCHECK*/, (nBits == 64), 0);
    AkelPad.SendMessage(aDlg[IDDWORD].Handle,  0x00F1 /*BM_SETCHECK*/, (nBits == 32), 0);
    AkelPad.SendMessage(aDlg[IDWORD].Handle,   0x00F1 /*BM_SETCHECK*/, (nBits == 16), 0);
    AkelPad.SendMessage(aDlg[IDBYTE].Handle,   0x00F1 /*BM_SETCHECK*/, (nBits ==  8), 0);
    AkelPad.SendMessage(aDlg[IDNOTA].Handle,   0x00F1 /*BM_SETCHECK*/, bNotA, 0);
    AkelPad.SendMessage(aDlg[IDNOTB].Handle,   0x00F1 /*BM_SETCHECK*/, bNotB, 0);

    for (i = 0; i < aOper.length; ++i)
      oSys.Call("User32::SendMessageW", aDlg[IDOPERS].Handle, 0x143 /*CB_ADDSTRING*/, 0, aOper[i][0]);
    AkelPad.SendMessage(aDlg[IDOPERS].Handle, 0x14E /*CB_SETCURSEL*/, nOper, 0);

    ShowOperator();
    SetBytes();
    oSys.Call("User32::SetWindowTextW", aDlg[IDDECA].Handle, sDecA);
    oSys.Call("User32::SetWindowTextW", aDlg[IDDECB].Handle, sDecB);
    SetValuesFromID(IDDECA);
    SetValuesFromID(IDDECB);
    Calculate();

    hFocus = aDlg[IDBINA].Handle;
  }

  else if ((uMsg == 6 /*WM_ACTIVATE*/) && (! wParam))
    hFocus = oSys.Call("User32::GetFocus");

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("User32::SetFocus", hFocus);

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if ((wParam >= 0x21 /*VK_PRIOR*/) && (wParam <= 0x28 /*VK_DOWN*/) && Ctrl() && !Shift() && Alt())
      MoveWindow(hWnd, wParam);
    else if ((wParam == 27 /*VK_ESCAPE*/) && (bCloseCB))
      oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 260) //WM_SYSKEYDOWN
  {
    if ((wParam >= 0x70 /*VK_F1*/) && (wParam <= 0x72 /*VK_F3*/))
      oSys.Call("User32::SetFocus", aDlg[IDBINA + wParam - 0x70].Handle);
    else if ((wParam >= 0x31 /*1 key*/) && (wParam <= 0x33 /*3 key*/))
      oSys.Call("User32::SetFocus", aDlg[IDBINB + wParam - 0x31].Handle);
  }

  else if (uMsg == 273) //WM_COMMAND
  {
    var nLowParam = LoWord(wParam);
    var nHiwParam = HiWord(wParam);
    bCloseCB = true;

    if ((nLowParam >= IDBINA) && (nLowParam <= IDDECA) || (nLowParam >= IDBINB) && (nLowParam <= IDDECB) || (nLowParam >= IDBINR) && (nLowParam <= IDDECR))
    {
      if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
      {
        AkelPad.SendMessage(lParam, 0x00B1 /*EM_SETSEL*/, LoWord(aDlg[nLowParam].Sel), HiWord(aDlg[nLowParam].Sel));
        CreateCaret(lParam);
        hSubClass = AkelPad.WindowSubClass(lParam, EditCallback, 256 /*WM_KEYDOWN*/, 258 /*WM_CHAR*/);
      }
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        aDlg[nLowParam].Sel = AkelPad.SendMessage(lParam, 0x00B0 /*EM_GETSEL*/, 0, 0);
        AkelPad.WindowUnsubClass(lParam);
      }
      else if (nHiwParam == 0x0300 /*EN_CHANGE*/)
      {
        if (oSys.Call("User32::GetFocus") == lParam)
        {
          SetValuesFromID(nLowParam);
          Calculate();
        }
      }
    }
    else if (nLowParam == IDNOTA)
    {
      bNotA = ! bNotA;
      Calculate();
    }
    else if (nLowParam == IDNOTB)
    {
      bNotB = ! bNotB;
      Calculate();
    }
    else if (nLowParam == IDOPERS)
    {
      if (nHiwParam == 1 /*CBN_SELCHANGE*/)
      {
        nOper = AkelPad.SendMessage(lParam, 0x147 /*CB_GETCURSEL*/, 0, 0);
        ShowOperator();
        Calculate();
      }
      else if (nHiwParam == 3 /*CBN_SETFOCUS*/)
        hSubClass = AkelPad.WindowSubClass(lParam, ComboCallback, 256 /*WM_KEYDOWN*/);
      else if (nHiwParam == 4 /*CBN_KILLFOCUS*/)
        AkelPad.WindowUnsubClass(lParam);
      else if (nHiwParam == 8 /*CBN_CLOSEUP*/)
        bCloseCB = false;
    }
    else if (nLowParam == IDSIGNED)
    {
      bSigned = ! bSigned;
      SetBytes();
      SetValuesFromID(IDBINA);
      SetValuesFromID(IDBINB);
      Calculate();
    }
    else if ((nLowParam >= IDQWORD) && (nLowParam <= IDBYTE))
    {
      nBits = Math.pow(2, IDQWORD - nLowParam + 3) * 8;
      SetBytes();
      SetValuesFromID(IDBINA);
      SetValuesFromID(IDBINB);
      Calculate();
    }
    else if (nLowParam == IDCLEAR)
    {
      oSys.Call("User32::SetWindowTextW", aDlg[IDDECA].Handle, "0");
      oSys.Call("User32::SetWindowTextW", aDlg[IDDECB].Handle, "0");
      SetValuesFromID(IDDECA);
      SetValuesFromID(IDDECB);
      Calculate();
    }
    else if (nLowParam == IDCLOSE)
      oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

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

  else if (uMsg == 2) //WM_DESTROY
    oSys.Call("User32::PostQuitMessage", 0);

  return 0;
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  var nID = oSys.Call("User32::GetDlgCtrlID", hWnd);

  if (uMsg == 256) //WM_KEYDOWN
  {
    if ((wParam == 0x2D /*VK_INSERT*/) && (! Ctrl()) && (! Shift()))
    {
      bOverType = ! bOverType;
      CreateCaret(hWnd);
    }
    else if ((wParam >= 0x21 /*VK_PRIOR*/) && (wParam <= 0x28 /*VK_DOWN*/) && Ctrl() && !Shift() && Alt())
      AkelPad.WindowNoNextProc(hSubClass);
  }
  else if (uMsg == 258) //WM_CHAR
  {
    if ((wParam == 3 /*Ctrl+C*/) || (wParam == 8 /*BackSpace*/) || (wParam == 22 /*Ctrl+V*/) || (wParam == 24 /*Ctrl+X*/) || (wParam == 26 /*Ctrl+Z*/))
      return 0;

    if (wParam == 1 /*Ctrl+A*/)
    {
      AkelPad.SendMessage(hWnd, 0x00B1 /*EM_SETSEL*/, 0, -1);
      AkelPad.WindowNoNextProc(hSubClass);
      return 0;
    }

    aDlg[nID].Sel = AkelPad.SendMessage(hWnd, 0x00B0 /*EM_GETSEL*/, 0, 0);

    if ((nID == IDBINA) || (nID == IDBINB))
    {
      if ((wParam == 48 /*0*/) || (wParam == 49 /*1*/))
      {
        if (bOverType && (LoWord(aDlg[nID].Sel) == HiWord(aDlg[nID].Sel)))
        {
          AkelPad.SendMessage(hWnd, 0x00B1 /*EM_SETSEL*/, LoWord(aDlg[nID].Sel), LoWord(aDlg[nID].Sel) + 1);
          oSys.Call("User32::SendMessageW", hWnd, 0x00C2 /*EM_REPLACESEL*/, true, String.fromCharCode(wParam));
          AkelPad.WindowNoNextProc(hSubClass);
        }
      }
      else
        AkelPad.WindowNoNextProc(hSubClass);
    }
    else if ((nID == IDHEXA) || (nID == IDHEXB))
    {
      if ((wParam >= 48 /*0*/) && (wParam <= 57 /*9*/) || (wParam >= 65 /*A*/) && (wParam <= 70 /*F*/) || (wParam >= 97 /*a*/) && (wParam <= 102 /*f*/) || (wParam == 45 /*-*/))
      {
        if (bOverType && (LoWord(aDlg[nID].Sel) == HiWord(aDlg[nID].Sel)))
        {
          if ((wParam != 45 /*-*/) || bSigned && (LoWord(aDlg[nID].Sel) == 0))
          {
            AkelPad.SendMessage(hWnd, 0x00B1 /*EM_SETSEL*/, LoWord(aDlg[nID].Sel), LoWord(aDlg[nID].Sel) + 1);
            oSys.Call("User32::SendMessageW", hWnd, 0x00C2 /*EM_REPLACESEL*/, true, String.fromCharCode(wParam));
          }
          AkelPad.WindowNoNextProc(hSubClass);
        }
        else if ((wParam == 45 /*-*/) && ((! bSigned) || (LoWord(aDlg[nID].Sel) > 0) || (HiWord(aDlg[nID].Sel) == 0) && (GetWindowText(hWnd).charAt(0) == "-")))
          AkelPad.WindowNoNextProc(hSubClass);
      }
      else
        AkelPad.WindowNoNextProc(hSubClass);
    }
    else if ((nID == IDDECA) || (nID == IDDECB))
    {
      if ((wParam >= 48 /*0*/) && (wParam <= 57 /*9*/) || (wParam == 45 /*-*/))
      {
        if (bOverType && (LoWord(aDlg[nID].Sel) == HiWord(aDlg[nID].Sel)))
        {
          if ((wParam != 45 /*-*/) || bSigned && (LoWord(aDlg[nID].Sel) == 0))
          {
            AkelPad.SendMessage(hWnd, 0x00B1 /*EM_SETSEL*/, LoWord(aDlg[nID].Sel), LoWord(aDlg[nID].Sel) + 1);
            oSys.Call("User32::SendMessageW", hWnd, 0x00C2 /*EM_REPLACESEL*/, true, String.fromCharCode(wParam));
          }
          AkelPad.WindowNoNextProc(hSubClass);
        }
        else if ((wParam == 45 /*-*/) && ((! bSigned) || (LoWord(aDlg[nID].Sel) > 0) || (HiWord(aDlg[nID].Sel) == 0) && (GetWindowText(hWnd).charAt(0) == "-")))
          AkelPad.WindowNoNextProc(hSubClass);
      }
      else
        AkelPad.WindowNoNextProc(hSubClass);
    }
  }

  return 0;
}

function ComboCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 256) //WM_KEYDOWN
  {
    if ((wParam >= 0x21 /*VK_PRIOR*/) && (wParam <= 0x28 /*VK_DOWN*/) && Ctrl() && !Shift() && Alt())
    {
      AkelPad.SendMessage(hWnd, 0x014F /*CB_SHOWDROPDOWN*/, false, 0);
      AkelPad.WindowNoNextProc(hSubClass);
    }
  }

  return 0;
}

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

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

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

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

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

function CreateCaretBitmap()
{
  var hDC     = oSys.Call("Gdi32::CreateCompatibleDC", 0);
  var hBitmap = oSys.Call("Gdi32::CreateBitmap", 6, 14, 1, 1, 0);
  var hBmOld  = oSys.Call("Gdi32::SelectObject", hDC, hBitmap);

  oSys.Call("Gdi32::SelectObject", hDC, oSys.Call("Gdi32::GetStockObject", 0 /*WHITE_BRUSH*/));
  oSys.Call("Gdi32::SelectObject", hDC, oSys.Call("Gdi32::GetStockObject", 6 /*WHITE_PEN*/));
  oSys.Call("Gdi32::Rectangle", hDC, 0, 12, 6, 14);

  oSys.Call("Gdi32::SelectObject", hDC, hBmOld);
  oSys.Call("Gdi32::DeleteDC", hDC);

  return hBitmap;
}

function CreateCaret(hWnd)
{
  oSys.Call("User32::CreateCaret", hWnd, (bOverType ? hBitmap : 0), 1, 13);
  oSys.Call("User32::ShowCaret", hWnd);
}

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

  if (hWnd)
    oSys.Call("User32::GetWindowRect", hWnd, lpRect);
  else
    oSys.Call("User32::SystemParametersInfoW", 0x30 /*SPI_GETWORKAREA*/, 0, lpRect, 0);

  oRect.X = AkelPad.MemRead(lpRect,      3 /*DT_DWORD*/);
  oRect.Y = AkelPad.MemRead(lpRect +  4, 3 /*DT_DWORD*/);
  oRect.W = AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/) - oRect.X;
  oRect.H = AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/) - oRect.Y;

  AkelPad.MemFree(lpRect);
}

function GetWindowText(hWnd)
{
  oSys.Call("User32::GetWindowTextW", hWnd, lpText, nTextLen);
  return AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
}

function MoveWindow(hWnd, nKey)
{
  var oRectWA = {};
  var oRect   = {};
  var nStep   = 20;

  GetWindowPos(0, oRectWA);
  GetWindowPos(hWnd, oRect);

  if (nKey == 0x21 /*VK_PRIOR*/)
    oRect.Y = oRectWA.Y;
  else if (nKey == 0x22 /*VK_NEXT*/)
    oRect.Y = oRectWA.Y + oRectWA.H - oRect.H;
  else if (nKey == 0x23 /*VK_END*/)
    oRect.X = oRectWA.X + oRectWA.W - oRect.W;
  else if (nKey == 0x24 /*VK_HOME*/)
    oRect.X = oRectWA.X;
  else if (nKey == 0x25 /*VK_LEFT*/)
  {
    if (oRect.X > oRectWA.X)
      oRect.X = (oRect.X - oRectWA.X > nStep) ? oRect.X - nStep : oRectWA.X;
  }
  else if (nKey == 0x26 /*VK_UP*/)
  {
    if (oRect.Y > oRectWA.Y)
      oRect.Y = (oRect.Y - oRectWA.Y > nStep) ? oRect.Y - nStep : oRectWA.Y;
  }
  else if (nKey == 0x27 /*VK_RIGHT*/)
  {
    if (oRect.X + oRect.W < oRectWA.X + oRectWA.W)
      oRect.X = (oRectWA.X + oRectWA.W - oRect.X - oRect.W > nStep) ? oRect.X + nStep : oRectWA.X + oRectWA.W - oRect.W;
  }
  else if (nKey == 0x28 /*VK_DOWN*/)
  {
    if (oRect.Y + oRect.H < oRectWA.Y + oRectWA.H)
      oRect.Y = (oRectWA.Y + oRectWA.H - oRect.Y - oRect.H > nStep) ? oRect.Y + nStep : oRectWA.Y + oRectWA.H - oRect.H;
  }

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

function ShowOperator()
{
  oSys.Call("User32::SetWindowTextW", aDlg[IDOPERNAME].Handle, aOper[nOper][1]);

  for (var i = IDNOTB; i <= IDDECB; ++i)
    oSys.Call("User32::ShowWindow", aDlg[i].Handle, (nOper != 6));
}

function SetBytes()
{
  var nHexLen = nBits / 4 + bSigned;
  var nDecLen = parseInt(("FFFFFFFFFFFFFFFF").substr(0, nBits / 4), 16).toString().length + bSigned;
  var aBinVal = [GetWindowText(aDlg[IDBINA].Handle), GetWindowText(aDlg[IDBINB].Handle)];
  var i;

  AkelPad.SendMessage(aDlg[IDBINA].Handle, 0x00C5 /*EM_LIMITTEXT*/, nBits, 0);
  AkelPad.SendMessage(aDlg[IDBINB].Handle, 0x00C5 /*EM_LIMITTEXT*/, nBits, 0);
  AkelPad.SendMessage(aDlg[IDHEXA].Handle, 0x00C5 /*EM_LIMITTEXT*/, nHexLen, 0);
  AkelPad.SendMessage(aDlg[IDHEXB].Handle, 0x00C5 /*EM_LIMITTEXT*/, nHexLen, 0);
  AkelPad.SendMessage(aDlg[IDDECA].Handle, 0x00C5 /*EM_LIMITTEXT*/, nDecLen, 0);
  AkelPad.SendMessage(aDlg[IDDECB].Handle, 0x00C5 /*EM_LIMITTEXT*/, nDecLen, 0);

  for (i = 0; i < 2; ++i)
  {
    if (aBinVal[i].length < nBits)
    {
      if (bSigned && (aBinVal[i].charAt(0) == "1"))
        aBinVal[i] = Pad(aBinVal[i], nBits, "L", "1");
      else
        aBinVal[i] = Pad(aBinVal[i], nBits, "L", "0");
    }
    else
      aBinVal[i] = aBinVal[i].slice(-nBits);

    oSys.Call("User32::SetWindowTextW", aDlg[(i == 0) ? IDBINA : IDBINB].Handle, aBinVal[i]);
  }

  oSys.Call("User32::SetWindowTextW", aDlg[IDBITS].Handle, ("7654321076543210765432107654321076543210765432107654321076543210").substr(0, nBits));
}

function SetValuesFromID(nID)
{
  var sValue = GetWindowText(aDlg[nID].Handle);
  var sBin;

  switch (nID)
  {
    case IDBINA:
    case IDBINB:
      oSys.Call("User32::SetWindowTextW", aDlg[nID + 1].Handle, BinToHex(sValue));
      oSys.Call("User32::SetWindowTextW", aDlg[nID + 2].Handle, BinToDec(sValue));
      break;
    case IDHEXA:
    case IDHEXB:
      sBin = HexToBin(sValue);
      oSys.Call("User32::SetWindowTextW", aDlg[nID - 1].Handle, sBin);
      oSys.Call("User32::SetWindowTextW", aDlg[nID + 1].Handle, BinToDec(sBin));
      break;
    case IDDECA:
    case IDDECB:
      sBin = DecToBin(sValue);
      oSys.Call("User32::SetWindowTextW", aDlg[nID - 2].Handle, sBin);
      oSys.Call("User32::SetWindowTextW", aDlg[nID - 1].Handle, BinToHex(sBin));
      break;
  }
}

function NotBin(sBin)
{
  return sBin.replace(/./g, function(sChar) {return (sChar == "0") ? "1": "0";});
}

function OppositeBin(sBin)
{
  sBin = NotBin(sBin);
  return Pad(sBin.substr(0, sBin.lastIndexOf("0")) + "1", sBin.length, "R", "0");
}

function BinToDec(sBin)
{
  var sSign = "";
  var sDec  = "";
  var i, n;

  if ((sBin.length == nBits) && (! /[^01]/.test(sBin)))
  {
    if (bSigned && (sBin.charAt(0) == "1"))
    {
      sSign = "-";
      sBin  = OppositeBin(sBin);
    }

    //Horner scheme
    sDec = "0";
    for (i = 0; i < sBin.length; ++i)
    {
      sDec = MultiplyBy2(sDec);
      if (sBin.charAt(i) == "1")
      {
        n = sDec.search(/[^9]9*$/);
        if (n >= 0)
          sDec = Pad(sDec.substr(0, n) + (parseInt(sDec.charAt(n), 10) + 1).toString(10), sDec.length, "R", "0");
        else
          sDec = Pad("1", sDec.length + 1, "R", "0");
      }
    }
  }

  return sSign + sDec;
}

function MultiplyBy2(sDec)
{
  var sOut   = "";
  var nCarry = 0;
  var nSum;
  var i;

  for (i = sDec.length - 1; i >= 0; --i)
  {
    nSum   = parseInt(sDec.charAt(i), 10) * 2 + nCarry;
    nCarry = Math.floor(nSum / 10);
    sOut   = nSum.toString(10).slice(-1) + sOut;
  }

  if (nCarry) sOut = "1" + sOut;

  return sOut;
}

function DecToBin(sDec)
{
  var sBin = "";
  var nRem;
  var sDiv;
  var nDiv;
  var bSign;
  var sMax;
  var i;

  if (bSigned && /^-?\d+$/.test(sDec) || /^\d+$/.test(sDec))
  {
    if (sDec.charAt(0) == "-")
    {
      if (/[^0]/.test(sDec.substr(1)))
      {
        sDec  = sDec.substr(1);
        bSign = true;
      }
      else
        sDec = "0";
    }

    do
    {
      nRem = 0;
      sDiv = "";
      for (i = 0; i < sDec.length; ++i)
      {
        nDiv = nRem * 10 + parseInt(sDec.charAt(i), 10);
        nRem = nDiv % 2;
        sDiv += Math.floor(nDiv / 2).toString(10);
      }

      if ((sDiv.charAt(0) == "0") && (sDiv.length > 1))
        sDiv = sDiv.substr(1);

      sDec = sDiv;
      sBin = nRem.toString(10) + sBin;
    }
    while (sDiv != "0");

    if (sBin.length > nBits)
      sBin = "";
    else
      sBin = Pad(sBin, nBits, "L", "0");

    if (bSigned && sBin)
    {
      sMax = Pad("1", nBits, "R", "0");
      if (bSign)
      {
        if (sBin > sMax)
          sBin = "";
        else
          sBin = OppositeBin(sBin);
      }
      else if (sBin >= sMax)
        sBin = "";
    }
  }

  return sBin;
}

function BinToHex(sBin)
{
  var sSign = "";
  var sHex  = "";
  var i;

  if ((sBin.length == nBits) && (! /[^01]/.test(sBin)))
  {
    if (bSigned && (sBin.charAt(0) == "1"))
    {
      sSign = "-";
      sBin  = OppositeBin(sBin);
    }

    i = sBin.indexOf("1");
    if (i >= 0)
    {
      i -= (i % 4);
      for (i; i < sBin.length; i += 4)
        sHex += parseInt(sBin.substr(i, 4), 2).toString(16).toUpperCase();
    }
    else
      sHex = "0";
  }

  return sSign + sHex;
}

function HexToBin(sHex)
{
  var sBin = "";
  var bSign;
  var sMax;
  var i;

  if (bSigned && /^-?[\dA-F]+$/i.test(sHex) || /^[\dA-F]+$/i.test(sHex))
  {
    if (sHex.charAt(0) == "-")
    {
      if (/[^0]/.test(sHex.substr(1)))
      {
        sHex  = sHex.substr(1);
        bSign = true;
      }
      else
        sHex = "0";
    }

    for (i = sHex.length - 1; i >= 0; --i)
      sBin = Pad(parseInt(sHex.charAt(i), 16).toString(2), 4, "L", "0") + sBin;

    if (sBin.length > nBits)
      sBin = sBin.replace(/^0+/, "");

    if (sBin.length > nBits)
      sBin = "";
    else
      sBin = Pad(sBin, nBits, "L", "0");

    if (bSigned && sBin)
    {
      sMax = Pad("1", nBits, "R", "0");
      if (bSign)
      {
        if (sBin > sMax)
          sBin = "";
        else
          sBin = OppositeBin(sBin);
      }
      else if (sBin >= sMax)
        sBin = "";
    }
  }

  return sBin;
}

function Pad(sStr, nLen, sType, sChar)
{
  if (sType == "R")
  {
    while (sStr.length < nLen)
      sStr += sChar;
  }
  else if (sType == "L")
  {
    while (sStr.length < nLen)
      sStr = sChar + sStr;
  }

  return sStr;
}

function Calculate()
{
  var sBinA = GetWindowText(aDlg[IDBINA].Handle);
  var sBinB = GetWindowText(aDlg[IDBINB].Handle);
  var sBinR = "";
  var sSignB;
  var nShift;
  var i;

  sDecA = GetWindowText(aDlg[IDDECA].Handle);
  sDecB = GetWindowText(aDlg[IDDECB].Handle);

  if (sBinA && sDecA && ((nOper == 6) || sBinB && sDecB))
  {
    if (bNotA) sBinA = NotBin(sBinA);
    if (bNotB) sBinB = NotBin(sBinB);

    if (nOper == 6)
      sBinR = sBinA;
    else
    {
      if (nOper == 0) //OR |
      {
        for (i = 0; i < nBits; ++i)
          sBinR += ((sBinA.charAt(i) == "1") || (sBinB.charAt(i) == "1")) ? "1" : "0";
      }
      else if (nOper == 1) //AND &
      {
        for (i = 0; i < nBits; ++i)
          sBinR += ((sBinA.charAt(i) == "1") && (sBinB.charAt(i) == "1")) ? "1" : "0";
      }
      else if (nOper == 2) //XOR ^
      {
        for (i = 0; i < nBits; ++i)
          sBinR += (sBinA.charAt(i) != sBinB.charAt(i)) ? "1" : "0";
      }
      else
      {
        if (sDecB.charAt(0) == "-")
        {
          sSignB = "-";
          sDecB  = sDecB.substr(1);
        }
        else
          sSignB = "";

        sDecB  = sSignB + sDecB.slice(-Math.round(Math.LOG2E * Math.log(nBits)));
        nShift = (parseInt(sDecB, 10) % nBits + nBits) % nBits;

        if (nOper == 3) //LShift <<
          sBinR = Pad(sBinA.substr(nShift), nBits, "R", "0");
        else if (nOper == 4) //RShift >>
          sBinR = Pad(sBinA.substr(0, nBits - nShift), nBits, "L", sBinA.charAt(0));
        else if (nOper == 5) //URShift >>>
          sBinR = Pad(sBinA.substr(0, nBits - nShift), nBits, "L", "0");
      }
    }
  }

  oSys.Call("User32::SetWindowTextW", aDlg[IDBINR].Handle, sBinR);
  oSys.Call("User32::SetWindowTextW", aDlg[IDHEXR].Handle, BinToHex(sBinR));
  oSys.Call("User32::SetWindowTextW", aDlg[IDDECR].Handle, BinToDec(sBinR));
}

function ReadIni()
{
  var sIniFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var oFile;

  if (oFSO.FileExists(sIniFile))
  {
    oFile = oFSO.OpenTextFile(sIniFile, 1, false, -1);
    try
    {
      eval(oFile.ReadAll());
    }
    catch (oError)
    {}
    oFile.Close();
  }
}

function WriteIni()
{
  var oFile = oFSO.OpenTextFile(WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini", 2, true, -1);
  var oRect = {};
  var sIniTxt;

  GetWindowPos(hDlg, oRect);
  sDecA = GetWindowText(aDlg[IDDECA].Handle);
  sDecB = GetWindowText(aDlg[IDDECB].Handle);

  sIniTxt =
    'nDlgX='     + oRect.X + ';\r\n' +
    'nDlgY='     + oRect.Y + ';\r\n' +
    'bOverType=' + bOverType + ';\r\n' +
    'bSigned='   + bSigned + ';\r\n' +
    'nBits='     + nBits + ';\r\n' +
    'nOper='     + nOper + ';\r\n' +
    'bNotA='     + bNotA + ';\r\n' +
    'bNotB='     + bNotB + ';\r\n' +
    'sDecA="'    + sDecA + '";\r\n' +
    'sDecB="'    + sDecB + '";\r\n';

  oFile.Write(sIniTxt);
  oFile.Close();
}
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Thu Aug 15, 2013 2:02 pm    Post subject: Reply with quote

GUI for manual settings - part 1.
The script should be saved in Unicode format.
Part 2 and 3 - in the next posts.
All in one: KDJ.zip

AkelPadManualSettings.js

Code:
// AkelPadManualSettings.js - ver. 2014-06-27 (x86/x64)
//
// GUI for manual settings.
//
// Usage:
// Call("Scripts::Main", 1, "AkelPadManualSettings.js")
//
// Note:
// The script should be saved in Unicode format

var oSys        = AkelPad.SystemFunction();
var hMainWnd    = AkelPad.GetMainWnd();
var hEditWnd    = AkelPad.GetEditWnd();
var hInstDLL    = AkelPad.GetInstanceDll();
var sClassName  = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var sScriptName = "AkelPad manual settings";
var nHistMax    = 20;
var bSaveHist;
var bChanged;
var hFocus;
var i;

var nTextLen = 8192;
var lpText   = AkelPad.MemAlloc(nTextLen * 2);
var lpLVITEM = AkelPad.MemAlloc(_X64 ? 72 : 60); //sizeof(LVITEM)
AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpLVITEM + (_X64 ? 24 : 20), lpText, 2 /*DT_QWORD*/);
AkelPad.MemCopy(lpLVITEM + (_X64 ? 32 : 24), nTextLen, 3 /*DT_DWORD*/);

//.ini settings
var nDlgX = 100;
var nDlgY = 120;
var nSel  = 0;
var nLang = 0;
var aAkelUpdaterOptions = [];
var aCmdLineBegin       = [];
var aCmdLineEnd         = [];
var aDateInsertFormat   = [];
var aDateLogFormat      = [];
var aStatusUserFormat   = [];
var aTabNameFind        = [];
var aTabNameRep         = [];
var aUrlCommand         = [];
ReadIni();

//0x50000000 = WS_VISIBLE|WS_CHILD
//0x50000001 = WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON
//0x50000009 = WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON
//0x50010003 = WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50012403 = WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_MULTILINE|BS_TOP|BS_AUTOCHECKBOX
//0x50010009 = WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON
//0x50010042 = WS_VISIBLE|WS_CHILD|WS_TABSTOP|CBS_AUTOHSCROLL|CBS_DROPDOWN
//0x50010800 = WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_READONLY
//0x50310804 = WS_VISIBLE|WS_CHILD|WS_HSCROLL|WS_VSCROLL|WS_TABSTOP|ES_READONLY|ES_MULTILINE
//0x5081800D = WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_REPORT

var oAkelAdminResident =
{
  Default  : 1,
  Wnd      : [],
  IDTEXT   : 2001,
  IDBUTTON1: 2002,
  IDBUTTON2: 2003,
  IDDEF    : 2004,

  Initialize: function()
  {
    this.Value   = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 126 /*MI_AKELADMINRESIDENT*/, 0);
    this.Initial = this.Value;

    this.Wnd[this.IDTEXT   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13, Txt: 'Defines residency of "AkelAdmin.exe":',
                                                                                                    Rus: 'Определяет будет ли AkelAdmin.exe оставаться в памяти:'};
    this.Wnd[this.IDBUTTON1] = {Class: 'BUTTON', Style: 0x50010009, X: 140, Y:  35, W: 640, H:  16, Txt: '0 - AkelAdmin.exe unloaded from memory. Password will be prompted each time to change protected file.',
                                                                                                    Rus: '0 - AkelAdmin.exe выгружается из памяти. Каждый раз будет запрашиваться пароль на изменение защищенного файла.'};
    this.Wnd[this.IDBUTTON2] = {Class: 'BUTTON', Style: 0x50010009, X: 140, Y:  55, W: 640, H:  16, Txt: '1 - AkelAdmin.exe remains in memory. Password will be prompted only for the first time to change protected file.',
                                                                                                    Rus: '1 - AkelAdmin.exe остается в памяти. Пароль будет запрошен только первый раз на изменение защищенного файла.'};
    this.Wnd[this.IDDEF    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  81, W: 640, H:  16, Txt: 'By default: 1',
                                                                                                    Rus: 'По умолчанию: 1'};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 126 /*MIS_AKELADMINRESIDENT*/, this.Value);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON2; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value == i - this.IDBUTTON1, 0);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON2))
    {
      bChanged = 1;
      this.Value = nID - this.IDBUTTON1;
      this.SetValue();
      SendMessage(aDlg[IDENGB + nLang].HWND, 241 /*BM_SETCHECK*/, 1, 0);
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
    else if ((nID == IDENGB) ||(nID == IDRUSB))
      this.SetValue();
  }
};

var oAkelUpdaterOptions =
{
  Value  : '',
  Default: '',
  Wnd    : [],
  IDTEXT : 2001,
  IDVALUE: 2002,
  IDDEF  : 2003,
  IDEDIT : 2004,

  Initialize: function()
  {
    if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 131 /*MI_AKELUPDATEROPTIONS*/, lpText))
      this.Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);

    this.Initial = this.Value;

    this.Wnd[this.IDTEXT ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13, Txt: 'Defines command line options for the AkelUpdater.exe, when launched from "Help/Update..." menu item:',
                                                                                                     Rus: 'Определяет параметры командной строки для AkelUpdater.exe:'};
    this.Wnd[this.IDVALUE] = {Class: 'COMBOBOX',  Style: 0x50010042, X: 140, Y:  35, W: 640, H:  21};
    this.Wnd[this.IDDEF  ] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  66, W: 640, H:  16, Txt: 'By default: ""',
                                                                                                     Rus: 'По умолчанию: ""'};
    this.Wnd[this.IDEDIT ] = {Class: 'AkelEditW', Style: 0x50310804, X: 140, Y:  91, W: 640, H: 318, Txt: '/PROXY=IP:PORT\n\tCurrent proxy settings. IE settings will be used by default.\n/AUTH=LOGIN:PASSWORD\n\tProxy login and password (http only).\n/NOPROXY\n\tDisables proxy settings for this connection (if any).\n/LANG=[eng|rus]\n\tSelect language.\n/BIT=[32|64]\n\tUpdate to 32-bit or to 64-bit version. If not specified it will be autodetected.\n/SAVEDIR=[path]\n\tSave downloads to directory.\n/DLONLY\n\tDon\'t update, download only.\n/AUTO\n\tAutomatically choose Update if possible or Cancel/Close otherwise.\n/NORUN\n\tTurn off "Run AkelPad" checkbox.\n/NOCOPIES\n\tDon\'t load DLLs to find original plugin name.\n/UNZIP=[options]\n\tnsUnzip options.\n\nExample: /PROXY=192.168.0.1:3128 /SAVEDIR="%a\\AkelFiles\\Updates"'};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 131 /*MIS_AKELUPDATEROPTIONS*/, this.Value);
  },

  SetValue: function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVALUE].HWND, this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if (nID == this.IDVALUE)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oCmdLineBegin =
{
  Value  : '',
  Default: '',
  Wnd    : [],
  IDTEXT : 2001,
  IDVALUE: 2002,
  IDDEF  : 2003,
  IDEDIT1: 2004,
  IDEDIT2: 2005,

  Initialize: function()
  {
    if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 105 /*MI_CMDLINEBEGIN*/, lpText))
      this.Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);

    this.Initial = this.Value;

    this.Wnd[this.IDTEXT ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13, Txt: 'Specifies code to be added to the beginning of the command line before processing it:',
                                                                                                     Rus: 'Задает код, который будет добавлен к началу командной строки, перед ее обработкой:'};
    this.Wnd[this.IDVALUE] = {Class: 'COMBOBOX',  Style: 0x50010042, X: 140, Y:  35, W: 640, H:  21};
    this.Wnd[this.IDDEF  ] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  66, W: 640, H:  16, Txt: 'By default: ""',
                                                                                                     Rus: 'По умолчанию: ""'};
    this.Wnd[this.IDEDIT1] = {Class: 'AkelEditW', Style: 0x50010800, X: 140, Y:  91, W: 640, H:  21, Txt: 'Example: /C+',
                                                                                                     Rus: 'Пример: /C+'};
    this.Wnd[this.IDEDIT2] = {Class: 'AkelEditW', Style: 0x50310804, X: 140, Y: 122, W: 640, H: 358, Txt: '*** Command line parameters ***\n\nAkelPad.exe [parameters] "file1.ext" [parameters] "file2.ext" [parameters] ...\n\n/x\t\t- don\'t use MS Notepad compatibility mode when parsing command line parameters.\n/p\t\t- print next file and close it.\n/C+\t\t- silently create new file, if it doesn\'t exist.\n/C-\t\t- don\'t create new file, if it doesn\'t exist.\n/C\t\t- ask for new file creation, if it doesn\'t exist (by default).\n/B+\t\t- silently open file, if binary.\n/B-\t\t- don\'t open file, if binary.\n/B\t\t- ask for file open, if binary (by default).\n/L+\t\t- silently save file, even if symbols will be lost in specified encoding.\n/L-\t\t- don\'t save file, if symbols will be lost in specified encoding.\n/L\t\t- ask for file save, if symbols will be lost in specified encoding (by default).\n/Z\t\t- ignore next command line parameter.\n/reassoc\t- reinstall assigned earlier associations of file types.\n/deassoc\t- uninstall assigned earlier associations of file types.\n/quit\t\t- stop parsing command line parameters and close program.\n/end\t\t- stop parsing command line parameters.\n\nMethods:\n/Show(MainWindowStyle)\n\tMainWindowStyle\n\t\t0 hidden window.\n\t\t1 window as is (by default).\n\t\t2 minimized window.\n\t\t3 maximized window.\n\t\t6 minimized, inactive window.\n\t\t9 non-maximized window.\n\t/Show(2)\n\t\tmethod shows main window in minimized style.\n/OpenFile("file", [OpenCodepage], [OpenBOM])\n\t"file"\n\t\tFile to open.\n\tOpenCodepage\n\t\tOpen codepage. If -1 or not specified, it will be autodetected.\n\tOpenBOM\n\t\tFile byte order mark. If -1 or not specified, it will be autodetected.\n\t/OpenFile("C:\File.txt", 65001, -1)\n\t\tmethod opens file in UTF-8 codepage.\n/SaveFile("file", [SaveCodepage], [SaveBOM])\n\t"file"\n\t\tSave current document to a specified file name.\n\tSaveCodepage\n\t\tSave codepage. If -1 or not specified, current codepage will be used.\n\tSaveBOM\n\t\tFile byte order mark. 1 - exist, 0 - doesn\'t exist, -1 or not specified - current BOM will be used.\n\t/SaveFile("C:\\File.txt", 65001, 0)\n\t\tmethod saves file in UTF-8 codepage without BOM.\n/Command(InternalCommand, [Parameter])\n\t/Command(4162)\n\t\tmethod calls the internal command at number 4162.\n/Call("Plugin::Function", [additional parameters])\n\t/Call("Scripts::Main")\n\t\tmethod calls Scripts plugin and Main function.\n/Exec("command line", ["working directory"], [Wait])\n\t"command line"\n\t\tCommand line string.\n\t"working directory"\n\t\tWorking directory string. Default is "".\n\tWait\n\t\tWait until the program finishes. 1 - wait, 0 - return immediately.\n\t/Exec("notepad.exe")\n\t\tmethod calls notepad.\n\t/Exec(`notepad.exe`)\n\t\tmethod calls notepad.\n\t/Exec(\'notepad.exe\')\n\t\tmethod calls notepad.\n\t/Exec(\'%windir%\\notepad.exe\')\n\t\tmethod calls notepad.\n\t/Exec(`rundll32.exe shell32,ShellExec_RunDLL "%%f"`, "%%d")\n\t\tmethod pass an active file for opening on Windows association.\n/Font("FaceName", Style, Size)\n\t"FaceName"\n\t\tFont face, for example, "Courier". Unchanged, if "".\n\tStyle (one of the following):\n\t\t0 ignored.\n\t\t1 normal.\n\t\t2 bold.\n\t\t3 italic.\n\t\t4 bold italic.\n\tSize\n\t\tFont size. Unchanged, if 0.\n\t/Font("Courier", 4, 10)\n\t\tmethod sets Courier bold italic font with 10 pt.\n/Recode(RecodeFrom, RecodeTo)\n\tRecodeFrom\n\t\tCodepage source. If -1, it will be auto-detected.\n\tRecodeTo\n\t\tCodepage target. If -1, it will be auto-detected.\n\t/Recode(1252, 437)\n\t\tmethod recodes the text from 1252 codepage to 437.\n/Insert("text", [Esc-sequences])\n\t"text"\n\t\tInserted text.\n\tEsc-sequences:\n\t\t0 - "text" doesn\'t contain Esc-sequences (default).\n\t\t1 - "text" contains Esc-sequences. A set of sequences similar to the find/replace dialog in the program, and also:\n\t\t\t"\\s" - replaced by the selected text of the editing window;\n\t\t\t"\\|" - set the caret position after text insertion.\n\t/Insert("Some string")\n\t\tmethod replaces selection with the specified text.\n\t/Insert("<B>\\s</B>", 1)\n\t\tmethod enclose selection.\n\t/Insert("\\[0031 0032 0033]", 1)\n\t\tmethod replaces selection with "123".\n\nVariables available for use in methods:\n\t%%f - active file\n\t%%d - directory of active file\n\t%%a - AkelPad\'s directory (i.e. contains AkelPad.exe)\n\t%%%% - % symbol\n\t%system variable% (i.e. Environment variable)\n\n\n*** Internal commands ***\n\nCan be used in command line method /Command() and also in ContextMenu, ToolBar, Hotkeys, Scripts plugins.\n\n4101\tCreate new edit window\n4102\tCreate new instance of program\n4103\tOpen file dialog\n4104\tReopen file\n4105\tSave file\n4106\tSave file dialog\n4107\tPrint setup dialog\n4108\tPrint dialog\n4109\tExit program\n4110\tSave all documents\n4111\tSave all as dialog\n4113\tPrint without dialog\n4114\tPrint preview dialog\n4121\tRedetect code page of the current file\n4122\tReopen file as ANSI\n4123\tReopen file as OEM\n4124\tReopen file as KOI-R\n4125\tReopen file as UTF16LE\n4126\tReopen file as UTF16BE\n4127\tReopen file as UTF8\n4131\tSave file as ANSI\n4132\tSave file as OEM\n4133\tSave file as KOI-R\n4134\tSave file as UTF16LE\n4135\tSave file as UTF16BE\n4136\tSave file as UTF8\n4137\tSave file as UTF8 without BOM\n4140\tShow codepages context menu\n4151\tUndo last operation\n4152\tRedo last operation\n4153\tCut\n4154\tCopy\n4155\tPaste\n4156\tDelete\n4157\tSelect all\n4158\tFind dialog\n4159\tFind last string down\n4160\tFind last string up\n4161\tReplace dialog\n4162\tGo to line dialog\n4163\tRun charmap.exe\n4164\tInsert tabulation\n4165\tInsert tabulation only if several lines selected\n4166\tDelete tabulation\n4167\tDelete tabulation only if several lines selected\n4168\tInsert space\n4169\tInsert space only if several lines selected\n4170\tDelete space\n4171\tDelete space only if several lines selected\n4172\tDelete first char\n4173\tDelete first char only if selection not empty\n4174\tDelete trailing whitespaces\n4175\tConvert text to "UPPERCASE". Optional parameter: 1 - change case for current word if no selection.\n4176\tConvert text to "lowercase". Optional parameter: 1 - change case for current word if no selection.\n4177\tConvert text to "Sentence case.". Optional parameter: 1 - change case for current word if no selection.\n4178\tConvert text to "Title Case". Optional parameter: 1 - change case for current word if no selection.\n4179\tConvert text to "iNVERT cASE". Optional parameter: 1 - change case for current word if no selection.\n4180\tCycle case. Optional parameter: 1 - change case for current word if no selection.\n4182\tRecode dialog\n4183\tInsert date\n4184\tWindows newline format\n4185\tUnix newline format\n4186\tMac newline format\n4190\tInsert/Overtype mode\n4191\tPaste as ANSI text\n4192\tPaste to column selection\n4193\tPaste text after caret\n4194\tPaste text taking into account selection case\n4195\tDelete all whitespaces in selection\n4196\tInsert new line with keeping left spaces, if option "Keep space" is off. Insert new line without keeping left spaces, if option "Keep space" is on.\n4197\tDelete current line. Optional parameter: 1 - delete all wrapped line.\n4198\tMove caret to opposite end of selection\n4199\tMove caret to previous location\n4200\tMove caret to next location\n4201\tFont dialog\n4202\tColor theme dialog\n4204\tIncrease font 1pt\n4205\tDecrease font 1pt\n4206\tRestore font to size at startup\n4209\tWord wrap (on/off)\n4210\tAlways on top (on/off)\n4211\tShow status bar (on/off)\n4212\tSplit window into four panes\n4213\tSplit window into two vertical panes\n4214\tSplit window into two horizontal panes\n4215\tSplit window (on/off)\n4216\tRead only (on/off)\n4251\tExecute command\n4252\tSave file time (on/off)\n4253\tWatch file change (on/off)\n4254\tKeep left spaces (on/off)\n4255\tSingle open file (on/off)\n4256\tSingle open program (on/off)\n4259\tPlugins dialog\n4260\tOptions dialog\n4261\tSDI mode\n4262\tMDI mode\n4263\tPseudo MDI mode\n4301\tTab list window at the top of the main window\n4302\tTab list window at the bottom of the main window\n4303\tHide tab list\n4304\tStandard tab list style\n4305\tButtons tab list style\n4306\tFlat buttons tab list style\n4307\tMDI windows - horizontal tile\n4308\tMDI windows - vertical tile\n4309\tMDI windows - cascade\n4310\tSwitch tabs: next-previous.\n4311\tSwitch tabs: right-left.\n4316\tActivate next tab\n4317\tActivate previous tab\n4318\tClose current tab\n4319\tClose all tabs\n4320\tClose all tabs but active\n4321\tClose all unmodified tabs\n4324\tClose file\n4325\tClose file and exit program (SDI) or close tab of a file (MDI/PMDI).\n4327\tSelect window dialog (MDI/PMDI). Same as 10019.\n4331\tRestore/Maximize main window\n4332\tActivate next dialog window\n4333\tActivate previous dialog window\n4341\tActivate next pane (split window)\n4342\tActivate previous pane (split window)\n4351\tAbout dialog\n4352\tOpen user\'s manual (this file)\n4353\tCheck updates (AkelUpdater), uses AkelUpdaterOptions string\n5001\tDelete dead recent files from "Recent files" list\n5001+n\tOpen recent file n\n6001\tActivate internal language\n6001+n\tActivate language n\n7001\tReopen file in first codepage of codepage list\n7001+n\tReopen file in codepage n of codepage list\n8001\tSave file in first codepage of codepage list\n8001+n\tSave file in codepage n of codepage list\n10019\tSelect window dialog (MDI/PMDI). Same as 4327.',
                                                                                                     Rus: '*** Параметры командной строки ***\n\nAkelPad.exe [параметры] "file1.ext" [параметры] "file2.ext" [параметры] ...\n\n/x\t\t- не использовать режим совместимости с MS Notepad при обработке параметров командной строки.\n/p\t\t- напечатать следующий файл и закрыть его.\n/C+\t\t- молча создавать новый файл, если он не существует.\n/C-\t\t- не создавать новый файл, если он не существует.\n/C\t\t- спрашивать о создании нового файла, если он не существует (по умолчанию).\n/B+\t\t- молча открывать файл, если он бинарный.\n/B-\t\t- не открывать файл, если он бинарный.\n/B\t\t- спрашивать об открытии файла, если он бинарный (по умолчанию).\n/L+\t\t- молча сохранить файл, даже если потеряются символы в указанной кодировке.\n/L-\t\t- не сохранять файл, если потеряются символы в указанной кодировке.\n/L\t\t- спрашивать о сохранении файла, если потеряются символы в указанной кодировке (по умолчанию).\n/Z\t\t- игнорировать следующий параметр командной строки.\n/reassoc\t- переустановить ранее назначенные ассоциации типов файлов.\n/deassoc\t- снять ранее назначенные ассоциации типов файлов.\n/quit\t\t- закончить обработку параметров командной строки и выйти из программы.\n/end\t\t- закончить обработку параметров командной строки.\n\nМетоды:\n/Show(СтильГлавногоОкна)\n\tСтильГлавногоОкна\n\t\t0 скрытое окно.\n\t\t1 окно как есть (по умолчанию).\n\t\t2 свернутое окно.\n\t\t3 развернутое окно.\n\t\t6 свернутое, не активное окно.\n\t\t9 не развернутое окно.\n\t/Show(2)\n\t\tметод отображает главное окно в свернутом режиме.\n/OpenFile("файл", [Кодировка], [СигнатураBOM])\n\t"файл"\n\t\tФайл для открытия.\n\tКодировка\n\t\tКодировка открытия. Если -1 либо не указана, она будет определена автоматически.\n\tСигнатураBOM\n\t\tСигнатура BOM файла. Если -1 либо не указана, она будет определена автоматически.\n\t/OpenFile("C:\\File.txt", 65001, -1)\n\t\tметод открывает файл в кодировке UTF-8.\n/SaveFile("файл", [Кодировка], [СигнатураBOM])\n\t"файл"\n\t\tСохранение текущего документа в указанный файл.\n\tКодировка\n\t\tКодировка сохранения. Если -1 либо не указана, будет использована текущая кодировка.\n\tСигнатураBOM\n\t\tСигнатура BOM файла. 1 - присутствует, 0 - отсутствует, -1 либо не указана - используется текущий BOM.\n\t/SaveFile("C:\\File.txt", 65001, 0)\n\t\tметод сохраняет файл в кодировке UTF-8 без BOM.\n/Command(ВнутренняяКоманда, [Параметр])\n\t/Command(4162)\n\t\tметод вызывает внутреннюю команду под номером 4162.\n/Call("Плагин::Функция", [дополнительные параметры])\n\t/Call("Scripts::Main")\n\t\tметод вызывает плагин Scripts и функцию Main.\n/Exec("командная строка", ["рабочая директория"], [Ожидать])\n\t"командная строка"\n\t\tКомандная строка.\n\t"рабочая директория"\n\t\tРабочая директория. По умолчанию "".\n\tОжидать\n\t\tОжидать завершения программы. 1 - ожидать, 0 - не ожидать.\n\t/Exec("notepad.exe")\n\t\tметод вызывает блокнот.\n\t/Exec(`notepad.exe`)\n\t\tметод вызывает блокнот.\n\t/Exec(\'notepad.exe\')\n\t\tметод вызывает блокнот.\n\t/Exec(\'%windir%\\notepad.exe\')\n\t\tметод вызывает блокнот.\n\t/Exec(`rundll32.exe shell32,ShellExec_RunDLL "%%f"`, "%%d")\n\t\tметод передает активный файл для открытия по ассоциации Windows.\n/Font("Шрифт", Начертание, Размер)\n\t"Шрифт"\n\t\tИмя шрифта, например, "Courier". Не изменяется, если "".\n\tНачертание (одно из следующих):\n\t\t0 игнорировать.\n\t\t1 обычный шрифт.\n\t\t2 жирный шрифт.\n\t\t3 курсивный шрифт.\n\t\t4 жирный курсивный шрифт.\n\tРазмер\n\t\tРазмер шрифта. Не изменяется, если 0.\n\t/Font("Courier", 4, 10)\n\t\tметод устанавливает жирный курсив Courier шрифт размером 10 pt.\n/Recode(ПерекодироватьИз, ПерекодироватьВ)\n\tПерекодироватьИз\n\t\tКодировка источник. Если -1, она будет определена автоматически.\n\tПерекодироватьВ\n\t\tКодировка приемник. Если -1, она будет определена автоматически.\n\t/Recode(1251, 866)\n\t\tметод перекодирует текст из кодировки 1251 в 866.\n/Insert("текст", [Esc-последовательности])\n\t"текст"\n\t\tВставляемый текст.\n\tEsc-последовательности:\n\t\t0 - "текст" не содержит Esc-последовательностей (по умолчанию).\n\t\t1 - "текст" содержит Esc-последовательности. Набор последовательностей аналогичен диалогу поиска/замены в программе, а также:\n\t\t\t"\\s" - заменяется на выделенный в окне редактирования текст;\n\t\t\t"\\|" - указывает на положение каретки после вставки текста.\n\t/Insert("Некая строка")\n\t\tметод заменяет выделение на указанный текст.\n\t/Insert("<B>\\s</B>", 1)\n\t\tметод добавляет к выделению текст по краям.\n\t/Insert("\\[0031 0032 0033]", 1)\n\t\tметод заменяет выделение на "123".\n\nПеременные в методах:\n\t%%f - активный файл\n\t%%d - директория активного файла\n\t%%a - директория AkelPad\'а\n\t%%%% - символ %\n\t%системная переменная%\n\n\n*** Внутренние команды ***\n\nМогут быть использованы в параметрах командной строки, а также в ContextMenu, ToolBar, Hotkeys, Scripts плагинах.\n\n4101\tСоздать новое окно редактирования\n4102\tСоздать новую копию программы\n4103\tДиалог открытия файлов\n4104\tПереоткрыть файл\n4105\tСохранить файл\n4106\tДиалог сохранения файлов\n4107\tДиалог настроек печати\n4108\tДиалог печати\n4109\tВыход из программы\n4110\tСохранить все документы\n4111\tДиалог сохранения всех документов\n4113\tПечать без диалога\n4114\tДиалог предпросмотра печати\n4121\tОпределить кодировку текущего документа заново\n4122\tПереоткрыть файл как ANSI\n4123\tПереоткрыть файл как OEM\n4124\tПереоткрыть файл как KOI-R\n4125\tПереоткрыть файл как UTF16LE\n4126\tПереоткрыть файл как UTF16BE\n4127\tПереоткрыть файл как UTF8\n4131\tСохранить файл как ANSI\n4132\tСохранить файл как OEM\n4133\tСохранить файл как KOI-R\n4134\tСохранить файл как UTF16LE\n4135\tСохранить файл как UTF16BE\n4136\tСохранить файл как UTF8\n4137\tСохранить файл как UTF8 без BOM\n4140\tПоказать контекстное меню кодировок\n4151\tОтменить последнюю операцию (Undo)\n4152\tПовторить последнюю операцию (Redo)\n4153\tВырезать\n4154\tСкопировать\n4155\tВставить\n4156\tУдалить\n4157\tВыделить все\n4158\tДиалог поиска\n4159\tНайти далее вниз\n4160\tНайти далее вверх\n4161\tДиалог замены\n4162\tДиалог перехода к строке\n4163\tЗапуск charmap.exe\n4164\tВставить табуляцию\n4165\tВставить табуляцию, только если выделено несколько строк\n4166\tУдалить табуляцию\n4167\tУдалить табуляцию, только если выделено несколько строк\n4168\tВставить пробел\n4169\tВставить пробел, только если выделено несколько строк\n4170\tУдалить пробел\n4171\tУдалить пробел, только если выделено несколько строк\n4172\tУдалить первый символ\n4173\tУдалить первый символ, только если есть выделение\n4174\tУдалить табы и пробелы в конце\n4175\tПреобразовать в "ВСЕ ПРОПИСНЫЕ". Необязательный параметр: 1 - изменить регистр для текущего слова, если нет выделения.\n4176\tПреобразовать в "все строчные". Необязательный параметр: 1 - изменить регистр для текущего слова, если нет выделения.\n4177\tПреобразовать в "Как в предложениях.". Необязательный параметр: 1 - изменить регистр для текущего слова, если нет выделения.\n4178\tПреобразовать в "Начинать С Прописных". Необязательный параметр: 1 - изменить регистр для текущего слова, если нет выделения.\n4179\tПреобразовать в "иНВЕРТИРОВАТЬ". Необязательный параметр: 1 - изменить регистр для текущего слова, если нет выделения.\n4180\tПреобразовать по кругу. Необязательный параметр: 1 - изменить регистр для текущего слова, если нет выделения.\n4182\tДиалог перекодирования\n4183\tВставить дату\n4184\tФормат новой строки Windows\n4185\tФормат новой строки Unix\n4186\tФормат новой строки Mac\n4190\tРежим вставки/замены\n4191\tВставить текст как ANSI\n4192\tВставить из буфера обмена в вертикальное выделение\n4193\tВставить текст из буфера обмена после каретки\n4194\tВставить текст из буфера обмена с учетом регистра выделения\n4195\tУдалить все табы и пробелы в выделении\n4196\tВставить новую строку с сохранением отступов слева, если отключено "Сохранять отступы слева". Вставить новую строку без сохранения отступов слева, если включено "Сохранять отступы слева".\n4197\tУдалить текущую строку. Необязательный параметр: 1 - удалить всю перенесённую строку.\n4198\tПеревести каретку на другой конец выделения\n4199\tПеревести каретку на предыдущую позицию\n4200\tПеревести каретку на следующую позицию\n4201\tДиалог выбора шрифта\n4202\tДиалог выбора цветовой темы\n4204\tУвеличить шрифт на 1pt\n4205\tУменьшить шрифт на 1pt\n4206\tВосстановить размер шрифта\n4209\tПеренос по словам (вкл/выкл)\n4210\tПоверх всех окон (вкл/выкл)\n4211\tПоказать строку состояния (вкл/выкл)\n4212\tРазделить окно на четыре части\n4213\tРазделить окно на две вертикальные части\n4214\tРазделить окно на две горизонтальные части\n4215\tРазделить окно (вкл/выкл)\n4216\tТолько чтение (вкл/выкл)\n4251\tВыполнить\n4252\tСохранять время файла (вкл/выкл)\n4253\tСледить за изменением файла (вкл/выкл)\n4254\tСохранять отступы слева (вкл/выкл)\n4255\tНе открывать файл дважды (вкл/выкл)\n4256\tНе открывать программу дважды (вкл/выкл)\n4259\tДиалог плагинов\n4260\tДиалог настроек\n4261\tОднооконный (SDI) режим\n4262\tМногооконный (MDI) режим\n4263\tПсевдо-многооконный (PMDI) режим\n4301\tВкладки сверху\n4302\tВкладки снизу\n4303\tСкрыть вкладки\n4304\tСтандартные вкладки\n4305\tВкладки как кнопки\n4306\tВкладки как плоские кнопки\n4307\tВыстроить горизонтально MDI окна\n4308\tВыстроить вертикально MDI окна\n4309\tВыстроить каскадом MDI окна\n4310\tПереключение вкладок: следующая-предыдущая.\n4311\tПереключение вкладок: правая-левая.\n4316\tАктивировать следующую вкладку\n4317\tАктивировать предыдущую вкладку\n4318\tЗакрыть текущую вкладку\n4319\tЗакрыть все вкладки\n4320\tЗакрыть все вкладки, кроме активной\n4321\tЗакрыть все неизмененные вкладки\n4324\tЗакрыть файл\n4325\tЗакрыть файл и выйти из программы (SDI) или закрыть вкладку файла (MDI/PMDI).\n4327\tДиалог выбора окна (MDI/PMDI). Тоже что и 10019.\n4331\tВосстановить/Развернуть главное окно программы\n4332\tПерейти к следующему диалогу\n4333\tПерейти к предыдущему диалогу\n4341\tПерейти к следующей части разделенного окна\n4342\tПерейти к предыдущей части разделенного окна\n4351\tДиалог о программе\n4352\tОткрыть руководство пользователя\n4353\tПроверить обновления (AkelUpdater)\n5001\tВ списке последних файлов удалить несуществующие\n5001+n\tИз списка последних файлов, открыть файл n\n6001\tВыбрать внутренний язык\n6001+n\tИз списка языков, выбрать язык n\n7001\tИз списка кодировок, открыть в первой кодировке\n7001+n\tИз списка кодировок, открыть в кодировке n\n8001\tИз списка кодировок, сохранить в первой кодировке\n8001+n\tИз списка кодировок, сохранить в кодировке n\n10019\tДиалог выбора окна (MDI/PMDI). Тоже что и 4327.'};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 105 /*MIS_CMDLINEBEGIN*/, this.Value);
  },

  SetValue: function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVALUE].HWND, this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if (nID == this.IDVALUE)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oCmdLineEnd =
{
  Value  : '',
  Default: '',
  Wnd    : [],
  IDTEXT : 2001,
  IDVALUE: 2002,
  IDDEF  : 2003,
  IDEDIT1: 2004,
  IDEDIT2: 2005,

  Initialize: function()
  {
    if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 106 /*MI_CMDLINEEND*/, lpText))
      this.Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);

    this.Initial = this.Value;

    this.Wnd[this.IDTEXT ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13, Txt: 'Specifies code to be added to the end of the command line before processing it:',
                                                                                                     Rus: 'Задает код, который будет добавлен к концу командной строки, перед ее обработкой:'};
    this.Wnd[this.IDVALUE] = {Class: 'COMBOBOX',  Style: 0x50010042, X: 140, Y:  35, W: 640, H:  21};
    this.Wnd[this.IDDEF  ] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  66, W: 640, H:  16, Txt: 'By default: ""',
                                                                                                     Rus: 'По умолчанию: ""'};
    this.Wnd[this.IDEDIT1] = {Class: 'AkelEditW', Style: 0x50010800, X: 140, Y:  91, W: 640, H:  21, Txt: 'Example: /Call("Scripts::Main", 1, "InsertDate.js", "") /C /B /L',
                                                                                                     Rus: 'Пример: /Call("Scripts::Main", 1, "InsertDate.js", "") /C /B /L'};
    this.Wnd[this.IDEDIT2] = {Class: 'AkelEditW', Style: 0x50310804, X: 140, Y: 122, W: 640, H: 358, Txt: oCmdLineBegin.Wnd[oCmdLineBegin.IDEDIT2].Txt,
                                                                                                     Rus: oCmdLineBegin.Wnd[oCmdLineBegin.IDEDIT2].Rus};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 106 /*MIS_CMDLINEEND*/, this.Value);
  },

  SetValue: function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVALUE].HWND, this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if (nID == this.IDVALUE)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oDateInsertFormat =
{
  Value  : '',
  Default: '',
  Wnd    : [],
  IDTEXT : 2001,
  IDVALUE: 2002,
  IDDEF  : 2003,
  IDEDIT : 2004,

  Initialize: function()
  {
    if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 130 /*MI_DATEINSERTFORMAT*/, lpText))
      this.Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);

    this.Initial = this.Value;

    this.Wnd[this.IDTEXT ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13, Txt: 'Defines insert date and time format:',
                                                                                                     Rus: 'Определяет формат вставляемой даты:'};
    this.Wnd[this.IDVALUE] = {Class: 'COMBOBOX',  Style: 0x50010042, X: 140, Y:  35, W: 640, H:  21};
    this.Wnd[this.IDDEF  ] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  66, W: 640, H:  16, Txt: 'By default: "" - program defined date and time format.',
                                                                                                     Rus: 'По умолчанию: "" - формат определяется программой.'};
    this.Wnd[this.IDEDIT ] = {Class: 'AkelEditW', Style: 0x50310804, X: 140, Y:  91, W: 640, H: 357, Txt: 'Time:\nh\t\tHours with no leading zero for single-digit hours; 12-hour clock.\nhh\t\tHours with leading zero for single-digit hours; 12-hour clock.\nH\t\tHours with no leading zero for single-digit hours; 24-hour clock.\nHH\t\tHours with leading zero for single-digit hours; 24-hour clock.\nm\t\tMinutes with no leading zero for single-digit minutes.\nmm\t\tMinutes with leading zero for single-digit minutes.\ns\t\tSeconds with no leading zero for single-digit seconds.\nss\t\tSeconds with leading zero for single-digit seconds.\nt\t\tOne character time-marker string, such as A or P.\ntt\t\tMulticharacter time-marker string, such as AM or PM.\n\nDate:\nd\t\tDay of month as digits with no leading zero for single-digit days.\ndd\t\tDay of month as digits with leading zero for single-digit days.\nddd\t\tDay of week as a three-letter abbreviation.\ndddd\tDay of week as its full name.\nM\t\tMonth as digits with no leading zero for single-digit months.\nMM\t\tMonth as digits with leading zero for single-digit months.\nMMM\tMonth as a three-letter abbreviation.\nMMMM\tMonth as its full name.\ny\t\tYear as last two digits, but with no leading zero for years less than 10.\nyy\t\tYear as last two digits, but with leading zero for years less than 10.\nyyyy\t\tYear represented by full four digits.\ngg\t\tPeriod/era string (e.g. B.C., A.D.).\n\nExample: "H:mm:ss dd MMMM yyyy" -> "12:50:24 01 September 2010"',
                                                                                                     Rus: 'Время:\nh\t\tЧасы без ведущего нуля в 12-часовом формате.\nhh\t\tЧасы с ведущим нулем в 12-часовом формате.\nH\t\tЧасы без ведущего нуля в 24-часовом формате.\nHH\t\tЧасы с ведущим нулем в 24-часовом формате.\nm\t\tМинуты без ведущего нуля.\nmm\t\tМинуты с ведущим нулем.\ns\t\tСекунды без ведущего нуля.\nss\t\tСекунды с ведущим нулем.\nt\t\tМаркер (такой как A или P).\ntt\t\tМногосимвольный маркер (такой как AM или PM).\n\nДата:\nd\t\tДень месяца без ведущего нуля.\ndd\t\tДень месяца с ведущим нулем.\nddd\t\tТрехбуквенное сокращение дня недели.\ndddd\tПолное название дня недели.\nM\t\tНомер месяца без ведущего нуля.\nMM\t\tНомер месяца с ведущим нулем.\nMMM\tТрехбуквенное сокращение названия месяца.\nMMMM\tПолное название месяца.\ny\t\tДвухзначное обозначение года без ведущего нуля (последние две цифры года).\nyy\t\tДвухзначное обозначение года с ведущим нулем.\nyyyy\t\tПолный номер года.\ngg\t\tНазвание периода или эры.\n\nПример: "H:mm:ss dd MMMM yyyy" -> "12:50:24 01 сентября 2010"'};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 130 /*MIS_DATEINSERTFORMAT*/, this.Value);
  },

  SetValue: function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVALUE].HWND, this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if (nID == this.IDVALUE)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oDateLogFormat =
{
  Value   : '',
  Default : '',
  Wnd     : [],
  IDTEXT  : 2001,
  IDVALUE : 2002,
  IDDEF   : 2003,
  IDENABLE: 2004,
  IDEDIT  : 2005,

  Initialize: function()
  {
    if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 129 /*MI_DATELOGFORMAT*/, lpText))
      this.Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);

    this.Initial   = this.Value;
    this.Enable    = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 217 /*MI_DATELOG*/, 0);
    this.EnableIni = this.Enable;

    this.Wnd[this.IDTEXT  ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13, Txt: 'Defines date and time format for files containing ".LOG" at the beginning:',
                                                                                                      Rus: 'Определяет формат даты для файлов содержащих ".LOG" в начале:'};
    this.Wnd[this.IDVALUE ] = {Class: 'COMBOBOX',  Style: 0x50010042, X: 140, Y:  35, W: 640, H:  21};
    this.Wnd[this.IDDEF   ] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  66, W: 640, H:  16, Txt: oDateInsertFormat.Wnd[oDateInsertFormat.IDDEF].Txt,
                                                                                                      Rus: oDateInsertFormat.Wnd[oDateInsertFormat.IDDEF].Rus};
    this.Wnd[this.IDENABLE] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  86, W: 640, H:  16, Txt: 'Works only if enabled "Insert date if file has .LOG at the beginning" in settings (DateLog=1).',
                                                                                                      Rus: 'Работает только при отмеченном пункте в настройках "Вставить дату, если файл содержит .LOG в начале" (DateLog=1).'};
    this.Wnd[this.IDEDIT  ] = {Class: 'AkelEditW', Style: 0x50310804, X: 140, Y: 112, W: 640, H: 357, Txt: oDateInsertFormat.Wnd[oDateInsertFormat.IDEDIT].Txt,
                                                                                                      Rus: oDateInsertFormat.Wnd[oDateInsertFormat.IDEDIT].Rus};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 129 /*MIS_DATELOGFORMAT*/, this.Value);
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 217 /*MIS_DATELOG*/, this.Enable);
  },

  SetValue: function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVALUE].HWND, this.Value);
    SendMessage(this.Wnd[this.IDDEF   ].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
    SendMessage(this.Wnd[this.IDENABLE].HWND, 241 /*BM_SETCHECK*/, this.Enable, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if (nID == this.IDVALUE)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
    else if (nID == this.IDENABLE)
    {
      bChanged = 1;
      this.Enable = SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0);
    }
  }
};

var oEditStyle =
{
  Default  : 0,
  Wnd      : [],
  IDTEXT   : 2001,
  IDBUTTON1: 2002,
  IDDEF    : 2003,
  IDSUM    : 2004,

  Initialize: function()
  {
    this.Value   = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 122 /*MI_EDITSTYLE*/, 0);
    this.Initial = this.Value;

    this.Wnd[this.IDTEXT   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13,                             Txt: 'Defines some edit window creation flags. Sets by the sum of members:',
                                                                                                                                Rus: 'Определяет некоторые флаги создания окна редактирования. Задается суммой членов:'};
    this.Wnd[this.IDBUTTON1] = {Class: 'BUTTON', Style: 0x50012403, X: 140, Y:  35, W: 640, H:  26, Type: 1 /*EDS_GLOBALUNDO*/, Txt: '1 - Use process heap for Undo buffer instead of window heap. This flag required for work of AEM_DETACHUNDO and AEM_ATTACHUNDO messages, but when closing edit window the memory releasing will be slower.',
                                                                                                                                Rus: '1 - Буфер отмен использует кучу процесса, вместо кучи окна. Данный флаг необходим для работы сообщений AEM_DETACHUNDO и AEM_ATTACHUNDO, но при закрытии окна освобождение памяти будет происходить медленнее.'};
    this.Wnd[this.IDDEF    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  93, W: 640, H:  16,                             Txt: 'By default: 0',
                                                                                                                                Rus: 'По умолчанию: 0'};
    this.Wnd[this.IDSUM    ] = {Class: 'STATIC', Style: 0x50000000, X: 150, Y:  67, W:  70, H:  13};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 122 /*MIS_EDITSTYLE*/, this.Value);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON1; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON1))
    {
      bChanged = 1;
      this.Value = 0;
      for (var i = this.IDBUTTON1; i <= this.IDBUTTON1; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Value |= this.Wnd[i].Type;
      }
      this.SetValue();
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oMouseOptions =
{
  Default  : 7,
  Wnd      : [],
  IDTEXT   : 2001,
  IDBUTTON1: 2002,
  IDBUTTON2: 2003,
  IDBUTTON3: 2004,
  IDBUTTON4: 2005,
  IDBUTTON5: 2006,
  IDBUTTON6: 2007,
  IDBUTTON7: 2008,
  IDBUTTON8: 2009,
  IDDEF    : 2010,
  IDSUM    : 2011,

  Initialize: function()
  {
    if (! hEditWnd)
      SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*wParam=MAKEWPARAM(0,IDM_FILE_NEW)*/, 1 /*lParam=TRUE*/);

    this.Value   = SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 87 /*FI_MOUSEOPTIONS*/, 0);
    this.Initial = this.Value;

    if (! hEditWnd)
      AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);

    this.Wnd[this.IDTEXT   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13,                                        Txt: 'Defines mouse settings. Set by the sum of members:',
                                                                                                                                           Rus: 'Определяет настройки мыши. Задается суммой членов:'};
    this.Wnd[this.IDBUTTON1] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  35, W: 640, H:  16, Type:   1 /*MO_LEFTMARGINSELECTION*/,  Txt: '1 - GUI (left click on margin selects line).',
                                                                                                                                           Rus: '1 - GUI (левый клик в отступ выделяет строку).'};
    this.Wnd[this.IDBUTTON2] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  55, W: 640, H:  16, Type:   2 /*MO_RICHEDITMOUSE*/,        Txt: '2 - GUI (use RichEdit mouse selection).',
                                                                                                                                           Rus: '2 - GUI (RichEdit выделение мышью).'};
    this.Wnd[this.IDBUTTON3] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  75, W: 640, H:  16, Type:   4 /*MO_MOUSEDRAGGING*/,        Txt: '4 - GUI (enable mouse dragging).',
                                                                                                                                           Rus: '4 - GUI (перетаскивание мышью).'};
    this.Wnd[this.IDBUTTON4] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  95, W: 640, H:  16, Type:   8 /*MO_RCLICKMOVECARET*/,      Txt: '8 - GUI (right click moves caret).',
                                                                                                                                           Rus: '8 - GUI (правый клик смещает каретку).'};
    this.Wnd[this.IDBUTTON5] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 115, W: 640, H:  16, Type:  16 /*MO_NONEWLINEMOUSESELECT*/, Txt: '16 - Triple click and left margin click selects line without newline character(s).',
                                                                                                                                           Rus: '16 - Не выделять новую строку при клике в зону левого отступа, а также при тройном клике.'};
    this.Wnd[this.IDBUTTON6] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 135, W: 640, H:  16, Type:  32 /*MO_NOWHEELFONTCHANGE*/,    Txt: '32 - Disable font size change using Ctrl+mouse scroll wheel.',
                                                                                                                                           Rus: '32 - Не менять размер шрифта посредством колесика мыши и клавиши Ctrl.'};
    this.Wnd[this.IDBUTTON7] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 155, W: 640, H:  16, Type:  64 /*MO_MARGINSELUNWRAPLINE*/,  Txt: '64 - Left margin line selection with mouse selects all wrapped line.',
                                                                                                                                           Rus: '64 - Выделять всю, разделенную переносами, строку при клике в зону левого отступа.'};
    this.Wnd[this.IDBUTTON8] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 175, W: 640, H:  16, Type: 128 /*MO_MBUTTONDOWNNOSCROLL*/,  Txt: '128 - No scrolling after middle mouse click.',
                                                                                                                                           Rus: '128 - Не прокручивать окно после клика средней клавишей мыши.'};
    this.Wnd[this.IDDEF    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 221, W: 640, H:  16,                                        Txt: 'By default: 1+2+4=7',
                                                                                                                                           Rus: 'По умолчанию: 1+2+4=7'};
    this.Wnd[this.IDSUM    ] = {Class: 'STATIC', Style: 0x50000000, X: 150, Y: 195, W:  70, H:  13};
  },

  Apply: function()
  {
    if (! hEditWnd)
      SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*wParam=MAKEWPARAM(0,IDM_FILE_NEW)*/, 1 /*lParam=TRUE*/);

    AkelPad.SetFrameInfo(0, 34 /*FIS_MOUSEOPTIONS*/, this.Value);

    if (! hEditWnd)
      AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON8; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON8))
    {
      bChanged = 1;
      this.Value = 0;
      for (var i = this.IDBUTTON1; i <= this.IDBUTTON8; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Value |= this.Wnd[i].Type;
      }
      this.SetValue();
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};



Last edited by KDJ on Fri Jun 27, 2014 10:04 pm; edited 17 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Thu Aug 15, 2013 2:03 pm    Post subject: Reply with quote

GUI for manual settings - part 2.

AkelPadManualSettings_part2.js

Code:
var oPaintOptions =
{
  Default  : 0,
  Wnd      : [],
  IDTEXT   : 2001,
  IDBUTTON1: 2002,
  IDBUTTON2: 2003,
  IDBUTTON3: 2004,
  IDBUTTON4: 2005,
  IDBUTTON5: 2006,
  IDBUTTON6: 2007,
  IDBUTTON7: 2008,
  IDBUTTON8: 2009,
  IDDEF    : 2010,
  IDSUM    : 2011,
  IDNOTE   : 2012,

  Initialize: function()
  {
    this.Value   = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 121 /*MI_PAINTOPTIONS*/, 0);
    this.Initial = this.Value;

    this.Wnd[this.IDTEXT   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13,                                             Txt: 'Defines, some text draw settings. Sets by the sum of members:',
                                                                                                                                                Rus: 'Определяет некоторые установки по рисованию текста. Задается суммой членов:'};
    this.Wnd[this.IDBUTTON1] = {Class: 'BUTTON', Style: 0x50012403, X: 140, Y:  35, W: 640, H:  52, Type:    1 /*PAINT_PAINTGROUP*/,            Txt: '1 - Paint text by groups of characters (default is character by character). With this flag some text recognition programs could start to work, printer could print faster, but highlighted symbols and combined unicode symbols can be drawn differently and editing of whose characters may become uncomfortable.',
                                                                                                                                                Rus: '1 - Рисование текста по группам символов (по умолчанию посимвольная прорисовка). С этим флагом некоторые программы, использующие графическое распознавание текста, могут начать работать (если не работали), принтер может печатать быстрее, но подсвеченные символы и комбинированные символы юникода могут рисоваться иначе, а также редактирование этих символов может стать некомфортным.'};
    this.Wnd[this.IDBUTTON2] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  93, W: 640, H:  16, Type:    2 /*PAINT_NONEWLINEDRAW*/,         Txt: '2 - Disable drawing new line selection as space character.',
                                                                                                                                                Rus: '2 - Не рисовать выделение перевода строки как пробела.'};
    this.Wnd[this.IDBUTTON3] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 113, W: 640, H:  16, Type:    4 /*PAINT_ENTIRENEWLINEDRAW*/,     Txt: '4 - Draw newline selection to right edge of text area.',
                                                                                                                                                Rus: '4 - Рисовать выделение перевода строки до правой границы.'};
    this.Wnd[this.IDBUTTON4] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 133, W: 640, H:  16, Type:    8 /*PAINT_HIDESEL*/,               Txt: '8 - Hides the selection when the control loses the input focus.',
                                                                                                                                                Rus: '8 - Скрывать выделение при потере фокуса.'};
    this.Wnd[this.IDBUTTON5] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 153, W: 640, H:  16, Type:   16 /*PAINT_NOMARKERAFTERLASTLINE*/, Txt: '16 - Disable marker painting after last line.',
                                                                                                                                                Rus: '16 - Не рисовать вертикальный маркер после последней строки.'};
    this.Wnd[this.IDBUTTON6] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 173, W: 640, H:  16, Type:  256 /*PAINT_HIDENOSCROLL*/,          Txt: '256 - Show scroll bars only when needed.',
                                                                                                                                                Rus: '256 - Скрывать прокрутку текста у окна редактирования, если она не требуется.'};
    this.Wnd[this.IDBUTTON7] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 193, W: 640, H:  16, Type:  512 /*PAINT_STATICEDGE*/,            Txt: '512 - Draw thin edit window border.',
                                                                                                                                                Rus: '512 - Рисовать тонкую границу у окна редактирования.'};
    this.Wnd[this.IDBUTTON8] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 213, W: 640, H:  16, Type: 1024 /*PAINT_NOEDGE*/,                Txt: '1024 - Draw no edit window border.',
                                                                                                                                                Rus: '1024 - Не рисовать границу у окна редактирования.'};
    this.Wnd[this.IDDEF    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 259, W: 640, H:  16,                                             Txt: 'By default: 0',
                                                                                                                                                Rus: 'По умолчанию: 0'};
    this.Wnd[this.IDSUM    ] = {Class: 'STATIC', Style: 0x50000000, X: 150, Y: 233, W:  70, H:  13};
    this.Wnd[this.IDNOTE   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y: 285, W: 640, H:  13,                                             Txt: 'Note: changes are applied for a new edit windows.',
                                                                                                                                                Rus: 'Замечание: изменения будут применены для новых окон редактирования.'};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 121 /*MIS_PAINTOPTIONS*/, this.Value);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON8; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON8))
    {
      bChanged = 1;
      this.Value = 0;
      for (var i = this.IDBUTTON1; i <= this.IDBUTTON8; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Value |= this.Wnd[i].Type;
      }
      this.SetValue();
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oRichEditClass =
{
  Default  : 0,
  Wnd      : [],
  IDTEXT   : 2001,
  IDBUTTON1: 2002,
  IDBUTTON2: 2003,
  IDDEF    : 2004,
  IDNOTE   : 2005,

  Initialize: function()
  {
    this.Value   = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 125 /*MI_RICHEDITCLASS*/, 0);
    this.Initial = this.Value;

    this.Wnd[this.IDTEXT   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13, Txt: 'Defines edit control class name:',
                                                                                                    Rus: 'Определяет какое имя класса будет у окна редактирования:'};
    this.Wnd[this.IDBUTTON1] = {Class: 'BUTTON', Style: 0x50010009, X: 140, Y:  35, W: 640, H:  16, Txt: '0 - "AkelEdit".'};
    this.Wnd[this.IDBUTTON2] = {Class: 'BUTTON', Style: 0x50010009, X: 140, Y:  55, W: 640, H:  16, Txt: '1 - "RichEdit20".'};
    this.Wnd[this.IDDEF    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  81, W: 640, H:  16, Txt: 'By default: 0',
                                                                                                    Rus: 'По умолчанию: 0'};
    this.Wnd[this.IDNOTE   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y: 110, W: 640, H:  13, Txt: oPaintOptions.Wnd[oPaintOptions.IDNOTE].Txt,
                                                                                                    Rus: oPaintOptions.Wnd[oPaintOptions.IDNOTE].Rus};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 125 /*MIS_RICHEDITCLASS*/, this.Value);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON2; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value == i - this.IDBUTTON1, 0);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON2))
    {
      bChanged = 1;
      this.Value = nID - this.IDBUTTON1;
      this.SetValue();
      SendMessage(aDlg[IDENGB + nLang].HWND, 241 /*BM_SETCHECK*/, 1, 0);
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
    else if ((nID == IDENGB) ||(nID == IDRUSB))
      this.SetValue();
  }
};

var oShowModify =
{
  Default  : 9,
  ShowAll  : 15,
  Wnd      : [],
  IDTEXT   : 2001,
  IDBUTTON1: 2002,
  IDBUTTON2: 2003,
  IDBUTTON3: 2004,
  IDBUTTON4: 2005,
  IDDEF    : 2006,
  IDALL    : 2007,
  IDSUM    : 2008,

  Initialize: function()
  {
    this.Value   = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 110 /*MI_SHOWMODIFY*/, 0);
    this.Initial = this.Value;

    this.Wnd[this.IDTEXT   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13,                                Txt: 'Determines where document changed status will be displayed. Set by the sum of members:',
                                                                                                                                   Rus: 'Определяет, где можно будет увидеть, что документ изменен. Задается суммой членов:'};
    this.Wnd[this.IDBUTTON1] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  35, W: 640, H:  16, Type: 1 /*SM_STATUSBAR*/,      Txt: '1 - Display "Modified" in status bar.',
                                                                                                                                   Rus: '1 - Отображение "Изменен" в строке состояния.'};
    this.Wnd[this.IDBUTTON2] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  55, W: 640, H:  16, Type: 2 /*SM_MAINTITLE_SDI*/,  Txt: '2 - Display asterisk * in main window title (SDI).',
                                                                                                                                   Rus: '2 - Отображение звездочки * в заголовке главного окна (SDI).'};
    this.Wnd[this.IDBUTTON3] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  75, W: 640, H:  16, Type: 4 /*SM_FRAMETITLE_MDI*/, Txt: '4 - Display asterisk * in main window title and in frame window title (MDI/PMDI).',
                                                                                                                                   Rus: '4 - Отображение звездочки * в заголовке главного окна и в заголовке окна вкладки (MDI/PMDI).'};
    this.Wnd[this.IDBUTTON4] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  95, W: 640, H:  16, Type: 8 /*SM_TABTITLE_MDI*/,   Txt: '8 - Display asterisk * in tab button name (MDI/PMDI).',
                                                                                                                                   Rus: '8 - Отображение звездочки * в имени кнопки вкладки (MDI/PMDI).'};
    this.Wnd[this.IDDEF    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 141, W: 640, H:  16,                                Txt: 'By default: 1+8=9',
                                                                                                                                   Rus: 'По умолчанию: 1+8=9'};
    this.Wnd[this.IDALL    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 161, W: 640, H:  16,                                Txt: 'Show all: 1+2+4+8=15',
                                                                                                                                   Rus: 'Отображать везде: 1+2+4+8=15'};
    this.Wnd[this.IDSUM    ] = {Class: 'STATIC', Style: 0x50000000, X: 150, Y: 115, W:  70, H:  13};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 110 /*MIS_SHOWMODIFY*/, this.Value);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON4; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
    SendMessage(this.Wnd[this.IDALL].HWND, 241 /*BM_SETCHECK*/, this.Value == this.ShowAll, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON4))
    {
      bChanged = 1;
      this.Value = 0;
      for (var i = this.IDBUTTON1; i <= this.IDBUTTON4; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Value |= this.Wnd[i].Type;
      }
      this.SetValue();
    }
    else if (((nID == this.IDDEF) || (nID == this.IDALL)) && (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0)))
    {
      bChanged = 1;
      this.Value = (nID == this.IDDEF) ? this.Default : this.ShowAll;
      this.SetValue();
    }
  }
};

var oSingleOpenProgram =
{
  Default  : 1,
  Wnd      : [],
  IDTEXT   : 2001,
  IDBUTTON1: 2002,
  IDBUTTON2: 2003,
  IDDEF    : 2004,
  IDSUM    : 2005,

  Initialize: function()
  {
    this.Value   = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 153 /*MI_SINGLEOPENPROGRAM*/, 0);
    this.Initial = this.Value;

    this.Wnd[this.IDTEXT   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13,                          Txt: 'Option "Don\'t open a program twice" in MDI/PMDI mode. Set by the sum of members:',
                                                                                                                             Rus: 'Опция "Не открывать программу дважды" в режиме MDI/PMDI. Задается суммой членов:'};
    this.Wnd[this.IDBUTTON1] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  35, W: 640, H:  16, Type: 1 /*SOP_ON*/,      Txt: '1 - GUI (option is on).',
                                                                                                                             Rus: '1 - GUI (опция включена).'};
    this.Wnd[this.IDBUTTON2] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  55, W: 640, H:  16, Type: 2 /*SOP_SAMEEXE*/, Txt: '2 - option works only for the same exe file. Requires run as administrator (UAC).',
                                                                                                                             Rus: '2 - опция работает только для совпадающего exe файла. Требует запуска от имени администратора (UAC).'};
    this.Wnd[this.IDDEF    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 101, W: 640, H:  16,                          Txt: 'By default: 1',
                                                                                                                             Rus: 'По умолчанию: 1'};
    this.Wnd[this.IDSUM    ] = {Class: 'STATIC', Style: 0x50000000, X: 150, Y:  75, W:  70, H:  13};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 153 /*MIS_SINGLEOPENPROGRAM*/, this.Value);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON2; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON2))
    {
      bChanged = 1;
      this.Value = 0;
      for (var i = this.IDBUTTON1; i <= this.IDBUTTON2; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Value |= this.Wnd[i].Type;
      }
      this.SetValue();
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oStatusPosType =
{
  Default  : 0,
  Wnd      : [],
  IDTEXT   : 2001,
  IDBUTTON1: 2002,
  IDBUTTON2: 2003,
  IDDEF    : 2004,
  IDSUM    : 2005,

  Initialize: function()
  {
    this.Value   = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 111 /*MI_STATUSPOSTYPE*/, 0);
    this.Initial = this.Value;

    this.Wnd[this.IDTEXT   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13,                           Txt: 'Defines how status bar statistics will be displayed. Set by the sum of members:',
                                                                                                                              Rus: 'Определяет, как будет отражаться статистика в строке статуса. Задается суммой членов:'};
    this.Wnd[this.IDBUTTON1] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  35, W: 640, H:  16, Type: 1 /*SPT_COLUMN*/,   Txt: '1 - "Line:Column". By default: "Line:Symbol".',
                                                                                                                              Rus: '1 - "Строка:Столбец". По умолчанию: "Строка:Символ".'};
    this.Wnd[this.IDBUTTON2] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  55, W: 640, H:  16, Type: 2 /*SPT_LINEWRAP*/, Txt: '2 - Wrap line numbers. By default: Non-wrap line numbers.',
                                                                                                                              Rus: '2 - Перенесённые номера строк. По умолчанию: неперенесённые номера строк.'};
    this.Wnd[this.IDDEF    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 101, W: 640, H:  16,                           Txt: 'By default: 0',
                                                                                                                              Rus: 'По умолчанию: 0'};
    this.Wnd[this.IDSUM    ] = {Class: 'STATIC', Style: 0x50000000, X: 150, Y:  75, W:  70, H:  13};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 111 /*MIS_STATUSPOSTYPE*/, this.Value);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON2; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON2))
    {
      bChanged = 1;
      this.Value = 0;
      for (var i = this.IDBUTTON1; i <= this.IDBUTTON2; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Value |= this.Wnd[i].Type;
      }
      this.SetValue();
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oStatusUserFormat =
{
  Value  : '',
  Default: '',
  Wnd    : [],
  IDTEXT : 2001,
  IDVALUE: 2002,
  IDDEF  : 2003,
  IDEDIT : 2004,

  Initialize: function()
  {
    if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 112 /*MI_STATUSUSERFORMAT*/, lpText))
      this.Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/).replace(/\t/g, '\\t');

    this.Initial = this.Value;

    this.Wnd[this.IDTEXT ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13, Txt: 'Defines user status bar format:',
                                                                                                     Rus: 'Определяет формат пользователя для строки состояния:'};
    this.Wnd[this.IDVALUE] = {Class: 'COMBOBOX',  Style: 0x50010042, X: 140, Y:  35, W: 640, H:  21};
    this.Wnd[this.IDDEF  ] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  66, W: 640, H:  16, Txt: 'By default: "" - format is not defined, additional status bar section is not displayed.',
                                                                                                     Rus: 'По умолчанию: "" - формат не определен, дополнительная секция строки состояния не отображается.'};
    this.Wnd[this.IDEDIT ] = {Class: 'AkelEditW', Style: 0x50310804, X: 140, Y:  91, W: 640, H: 383, Txt: '%[width]\t\tAdd status bar delimiter.\n%Ch\t\t\tCurrent character hex code in file codepage (lowercase).\n%CH\t\t\tCurrent character hex code in file codepage (uppercase).\n%ch\t\t\tCurrent character hex code (lowercase).\n%cH\t\t\tCurrent character hex code (uppercase).\n%cd\t\t\tCurrent character decimal code.\n%cl\t\t\tCurrent character letter.\n%or\t\t\tOffset in symbols. Any newline breaks counted as one symbol (RichEdit).\n%ob\t\t\tOffset in symbols. Newline breaks: \\r\\r\\n - three symbols, \\r\\n - two symbols, \\r - one symbol, \\n - one symbol. Use only if necessary because on large files can cause slowdown.\n%al\t\t\tCount of lines in document.\n%ar\t\t\tCount of symbols in document (RichEdit).\n%lb\t\t\tNumber of first selected line.\n%le\t\t\tNumber of last selected line.\n%ls\t\t\tCount of lines in selection.\n%f\t\t\tFont size.\n%t\t\t\tTabulation size.\n%m\t\t\tColumn marker position.\n%cap[text]\tText displayed when "Caps Lock" is on.\n%num[text]\tText displayed when "Num Lock" is on.\n%se[text]\t\tText displayed when end of the document reached during search.\n%r\t\t\tReplace count after "Replace all".\n%dc\t\t\tCount of all documents (MDI/PMDI).\n%dm\t\t\tCount of modified documents (MDI/PMDI).\n%ds\t\t\tCount of unmodified documents (MDI/PMDI).\n%di\t\t\tActive document index (MDI/PMDI).\n%%\t\t\t% symbol.\nTabulation\tOne tabulation aligns text to center, second tabulation to right edge (use \\t or \\t\\t).\n\nExample: "Symbol:0x%ch%[85]Font:%f%[48]Tab:%t%[38]Marker:%m%[60]Docs:%dm*/%dc"',
                                                                                                     Rus: '%[ширина]\tДобавить разделитель в строку состояния.\n%Ch\t\t\tШестнадцатеричный код текущего символа в кодировке файла (нижний регистр).\n%CH\t\t\tШестнадцатеричный код текущего символа в кодировке файла (верхний регистр).\n%ch\t\t\tШестнадцатеричный код текущего символа (нижний регистр).\n%cH\t\t\tШестнадцатеричный код текущего символа (верхний регистр).\n%cd\t\t\tДесятеричный код текущего символа.\n%cl\t\t\tБуква текущего символа.\n%or\t\t\tСмещение в символах. Любые переводы строки считаются за один символ (RichEdit).\n%ob\t\t\tСмещение в символах. Переводы строки: \\r\\r\\n - три символа, \\r\\n - два символа, \\r - один символ, \\n - один символ. Используйте только при необходимости, т.к. на больших файлах может вызывать замедление работы.\n%al\t\t\tКоличество строк в документе.\n%ar\t\t\tКоличество символов в документе (RichEdit).\n%lb\t\t\tНомер первой строки выделения.\n%le\t\t\tНомер последней строки выделения.\n%ls\t\t\tКоличество выделенных строк.\n%f\t\t\tРазмер шрифта.\n%t\t\t\tРазмер табуляции.\n%m\t\t\tРазмер вертикального маркера.\n%cap[текст]\tТекст отображающийся при включенной клавише CapsLock.\n%num[текст]\tТекст отображающийся при включенной клавише NumLock.\n%se[текст]\tТекст отображающийся по достижению конца документа при поиске.\n%r\t\t\tКоличество замен после "Заменить все".\n%dc\t\t\tКоличество всех документов (MDI/PMDI).\n%dm\t\t\tКоличество измененных документов (MDI/PMDI).\n%ds\t\t\tКоличество неизмененных документов (MDI/PMDI).\n%di\t\t\tИндекс активного документа (MDI/PMDI).\n%%\t\t\tСимвол %.\nТабуляция\tПервая табуляция выравнивает текст по центру, вторая по правому краю (\\t или \\t\\t).\n\nПример: "Символ:0x%ch%[88]Шрифт:%f%[62]Таб:%t%[38]Маркер:%m%[64]Док:%dm*/%dc"'};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 112 /*MIS_STATUSUSERFORMAT*/, this.Value.replace(/\\t/g, '\t'));
  },

  SetValue: function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVALUE].HWND, this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if (nID == this.IDVALUE)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oTabNameFind =
{
  Value  : '',
  Default: '',
  Wnd    : [],
  IDTEXT : 2001,
  IDVALUE: 2002,
  IDDEF  : 2003,
  IDEDIT : 2004,
  IDNOTE : 2005,
  IDLINK : 2006,

  Initialize: function()
  {
    if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 133 /*MI_TABNAMEFIND*/, lpText))
      this.Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);

    this.Initial = this.Value;

    this.Wnd[this.IDTEXT ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y:  15, W: 640, H:  26, Txt: 'Defines regular expression search pattern for tab name in MDI/PMDI mode.\nIf pattern not found, file name displayed without changes. Used with TabNameRep.',
                                                                                                     Rus: 'Определяет шаблон поиска регулярного выражения для имени вкладки в режиме MDI/PMDI.\nЕсли шаблон не найден, имя файла отображается без изменений. Используется совместно с TabNameRep.'};
    this.Wnd[this.IDVALUE] = {Class: 'COMBOBOX',  Style: 0x50010042, X: 140, Y:  48, W: 640, H:  21};
    this.Wnd[this.IDDEF  ] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  79, W: 640, H:  16, Txt: 'By default: ""',
                                                                                                     Rus: 'По умолчанию: ""'};
    this.Wnd[this.IDEDIT ] = {Class: 'AkelEditW', Style: 0x50010800, X: 140, Y: 104, W: 640, H:  21, Txt: 'Example: (.{20})[^.]{4,}(.*)',
                                                                                                     Rus: 'Пример: (.{20})[^.]{4,}(.*)'};
    this.Wnd[this.IDNOTE ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y: 138, W: 640, H:  13, Txt: 'Note: changes are applied for a new opened documents.',
                                                                                                     Rus: 'Замечание: изменения будут применены для последующих открытых документов.'};
    this.Wnd[this.IDLINK ] = {Class: 'SysLink',   Style: 0x50000000, X: 140, Y: 164, W: 640, H:  13, Txt: '<a>TabNameRep</a>'};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 133 /*MIS_TABNAMEFIND*/, this.Value);
  },

  SetValue: function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVALUE].HWND, this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Notify: function(wParam, lParam)
  {
    if ((wParam == this.IDLINK) && (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), 3 /*DT_DWORD*/) == -2 /*NM_CLICK*/))
    {
      SetCurSelLV(FindInArray(aParam, "TabNameRep"));
      oSys.Call("User32::SetFocus", oTabNameRep.Wnd[oTabNameRep.IDVALUE].HWND);
    }
  },

  Command: function(nID, nCode, hWnd)
  {
    if (nID == this.IDVALUE)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oTabNameRep =
{
  Value  : '',
  Default: '',
  Wnd    : [],
  IDTEXT : 2001,
  IDVALUE: 2002,
  IDDEF  : 2003,
  IDEDIT : 2004,
  IDNOTE : 2005,
  IDLINK : 2006,

  Initialize: function()
  {
    if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 134 /*MI_TABNAMEREP*/, lpText))
      this.Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);

    this.Initial = this.Value;

    this.Wnd[this.IDTEXT ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y:  15, W: 640, H:  26, Txt: 'Defines regular expression replace pattern for tab name in MDI/PMDI mode.\nUsed with TabNameFind.',
                                                                                                     Rus: 'Определяет шаблон замены регулярного выражения для имени вкладки в режиме MDI/PMDI.\nИспользуется совместно с TabNameFind.'};
    this.Wnd[this.IDVALUE] = {Class: 'COMBOBOX',  Style: 0x50010042, X: 140, Y:  48, W: 640, H:  21};
    this.Wnd[this.IDDEF  ] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  79, W: 640, H:  16, Txt: 'By default: ""',
                                                                                                     Rus: 'По умолчанию: ""'};
    this.Wnd[this.IDEDIT ] = {Class: 'AkelEditW', Style: 0x50010800, X: 140, Y: 104, W: 640, H:  21, Txt: 'Example: \\1..\\2',
                                                                                                     Rus: 'Пример: \\1..\\2'};
    this.Wnd[this.IDNOTE ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y: 138, W: 640, H:  13, Txt: oTabNameFind.Wnd[oTabNameFind.IDNOTE].Txt,
                                                                                                     Rus: oTabNameFind.Wnd[oTabNameFind.IDNOTE].Rus};
    this.Wnd[this.IDLINK ] = {Class: 'SysLink',   Style: 0x50000000, X: 140, Y: 164, W: 640, H:  13, Txt: '<a>TabNameFind</a>'};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 134 /*MIS_TABNAMEREP*/, this.Value);
  },

  SetValue: function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVALUE].HWND, this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Notify: function(wParam, lParam)
  {
    if ((wParam == this.IDLINK) && (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), 3 /*DT_DWORD*/) == -2 /*NM_CLICK*/))
    {
      SetCurSelLV(FindInArray(aParam, "TabNameFind"));
      oSys.Call("User32::SetFocus", oTabNameFind.Wnd[oTabNameFind.IDVALUE].HWND);
    }
  },

  Command: function(nID, nCode, hWnd)
  {
    if (nID == this.IDVALUE)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oTabOptionsMDI =
{
  Default   : 131330,
  Wnd       : [],
  IDTEXT    : 2001,
  IDBUTTON1 : 2002,
  IDBUTTON2 : 2003,
  IDBUTTON3 : 2004,
  IDBUTTON4 : 2005,
  IDBUTTON5 : 2006,
  IDBUTTON6 : 2007,
  IDBUTTON7 : 2008,
  IDBUTTON8 : 2009,
  IDBUTTON9 : 2010,
  IDBUTTON10: 2011,
  IDBUTTON11: 2012,
  IDBUTTON12: 2013,
  IDBUTTON13: 2014,
  IDDEF     : 2015,
  IDSUM     : 2016,

  Initialize: function()
  {
    this.Value   = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
    this.Initial = this.Value;

    this.Wnd[this.IDTEXT    ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13,                                            Txt: 'Defines tabs settings in MDI/PMDI mode. Set by the sum of members:',
                                                                                                                                                Rus: 'Определяет настройки вкладок в режиме MDI/PMDI. Задается суммой членов:'};
    this.Wnd[this.IDBUTTON1 ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  35, W: 640, H:  16, Type: 1       /*TAB_VIEW_NONE*/,           Txt: '1 - GUI (tabs are hidden).',
                                                                                                                                                Rus: '1 - GUI (скрыть вкладки).'};
    this.Wnd[this.IDBUTTON2 ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  55, W: 640, H:  16, Type: 2       /*TAB_VIEW_TOP*/,            Txt: '2 - GUI (tabs shown at top of edit window).',
                                                                                                                                                Rus: '2 - GUI (отобразить вкладки сверху).'};
    this.Wnd[this.IDBUTTON3 ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  75, W: 640, H:  16, Type: 4       /*TAB_VIEW_BOTTOM*/,         Txt: '4 - GUI (tabs shown at bottom of edit window).',
                                                                                                                                                Rus: '4 - GUI (отобразить вкладки снизу).'};
    this.Wnd[this.IDBUTTON4 ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  95, W: 640, H:  16, Type: 256     /*TAB_TYPE_STANDARD*/,       Txt: '256 - GUI (standard tab style).',
                                                                                                                                                Rus: '256 - GUI (стандартный стиль).'};
    this.Wnd[this.IDBUTTON5 ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 115, W: 640, H:  16, Type: 512     /*TAB_TYPE_BUTTONS*/,        Txt: '512 - GUI (button tab style).',
                                                                                                                                                Rus: '512 - GUI (стиль кнопки).'};
    this.Wnd[this.IDBUTTON6 ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 135, W: 640, H:  16, Type: 1024    /*TAB_TYPE_FLATBUTTONS*/,    Txt: '1024 - GUI (flat button tab style).',
                                                                                                                                                Rus: '1024 - GUI (стиль плоской кнопки).'};
    this.Wnd[this.IDBUTTON7 ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 155, W: 640, H:  16, Type: 65536   /*TAB_SWITCH_NEXTPREV*/,     Txt: '65536 - GUI (hotkeys transfer focus as next-prev).',
                                                                                                                                                Rus: '65536 - GUI (переключаться между вкладками как Следующая-Предыдущая).'};
    this.Wnd[this.IDBUTTON8 ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 175, W: 640, H:  16, Type: 131072  /*TAB_SWITCH_RIGHTLEFT*/,    Txt: '131072 - GUI (hotkeys transfer focus as right-left).',
                                                                                                                                                Rus: '131072 - GUI (переключаться между вкладками как Правая-Левая).'};
    this.Wnd[this.IDBUTTON9 ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 195, W: 640, H:  16, Type: 524288  /*TAB_ADD_AFTERCURRENT*/,    Txt: '524288 - create tabs after the current one.',
                                                                                                                                                Rus: '524288 - создавать вкладки сразу после текущей.'};
    this.Wnd[this.IDBUTTON10] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 215, W: 640, H:  16, Type: 1048576 /*TAB_NOADD_LBUTTONDBLCLK*/, Txt: '1048576 - disable new tab creation using left button double click on the tab bar.',
                                                                                                                                                Rus: '1048576 - не создавать вкладки двойным кликом левой кнопки по панели вкладок.'};
    this.Wnd[this.IDBUTTON11] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 235, W: 640, H:  16, Type: 2097152 /*TAB_NOADD_MBUTTONDOWN*/,   Txt: '2097152 - disable new tab creation using middle button click on the tab bar.',
                                                                                                                                                Rus: '2097152 - не создавать вкладки кликом средней кнопки по панели вкладок.'};
    this.Wnd[this.IDBUTTON12] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 255, W: 640, H:  16, Type: 4194304 /*TAB_NODEL_LBUTTONDBLCLK*/, Txt: '4194304 - disable close tab using left button double click on the tab.',
                                                                                                                                                Rus: '4194304 - не закрывать вкладки двойным кликом левой кнопки по вкладке.'};
    this.Wnd[this.IDBUTTON13] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 275, W: 640, H:  16, Type: 8388608 /*TAB_NODEL_MBUTTONDOWN*/,   Txt: '8388608 - disable close tab using middle button click on the tab.',
                                                                                                                                                Rus: '8388608 - не закрывать вкладки кликом средней кнопки по вкладке.'};
    this.Wnd[this.IDDEF     ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 321, W: 640, H:  16,                                            Txt: 'By default: 2+256+131072=131330',
                                                                                                                                                Rus: 'По умолчанию: 2+256+131072=131330'};
    this.Wnd[this.IDSUM     ] = {Class: 'STATIC', Style: 0x50000000, X: 150, Y: 295, W:  70, H:  13};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, this.Value);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON13; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON13))
    {
      if (nID == this.IDBUTTON1)
      {
        if (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        {
          SendMessage(this.Wnd[this.IDBUTTON2].HWND, 241 /*BM_SETCHECK*/, 0, 0);
          SendMessage(this.Wnd[this.IDBUTTON3].HWND, 241 /*BM_SETCHECK*/, 0, 0);
        }
        else
          SendMessage(this.Wnd[this.IDBUTTON2].HWND, 241 /*BM_SETCHECK*/, 1, 0);
      }
      else if (nID == this.IDBUTTON2)
      {
        if (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        {
          SendMessage(this.Wnd[this.IDBUTTON1].HWND, 241 /*BM_SETCHECK*/, 0, 0);
          SendMessage(this.Wnd[this.IDBUTTON3].HWND, 241 /*BM_SETCHECK*/, 0, 0);
        }
        else
          SendMessage(this.Wnd[this.IDBUTTON3].HWND, 241 /*BM_SETCHECK*/, 1, 0);
      }
      else if (nID == this.IDBUTTON3)
      {
        if (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        {
          SendMessage(this.Wnd[this.IDBUTTON1].HWND, 241 /*BM_SETCHECK*/, 0, 0);
          SendMessage(this.Wnd[this.IDBUTTON2].HWND, 241 /*BM_SETCHECK*/, 0, 0);
        }
        else
          SendMessage(this.Wnd[this.IDBUTTON2].HWND, 241 /*BM_SETCHECK*/, 1, 0);
      }

      else if (nID == this.IDBUTTON4)
      {
        if (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        {
          SendMessage(this.Wnd[this.IDBUTTON5].HWND, 241 /*BM_SETCHECK*/, 0, 0);
          SendMessage(this.Wnd[this.IDBUTTON6].HWND, 241 /*BM_SETCHECK*/, 0, 0);
        }
        else
          SendMessage(this.Wnd[this.IDBUTTON5].HWND, 241 /*BM_SETCHECK*/, 1, 0);
      }
      else if (nID == this.IDBUTTON5)
      {
        if (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        {
          SendMessage(this.Wnd[this.IDBUTTON4].HWND, 241 /*BM_SETCHECK*/, 0, 0);
          SendMessage(this.Wnd[this.IDBUTTON6].HWND, 241 /*BM_SETCHECK*/, 0, 0);
        }
        else
          SendMessage(this.Wnd[this.IDBUTTON6].HWND, 241 /*BM_SETCHECK*/, 1, 0);
      }
      else if (nID == this.IDBUTTON6)
      {
        if (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        {
          SendMessage(this.Wnd[this.IDBUTTON4].HWND, 241 /*BM_SETCHECK*/, 0, 0);
          SendMessage(this.Wnd[this.IDBUTTON5].HWND, 241 /*BM_SETCHECK*/, 0, 0);
        }
        else
          SendMessage(this.Wnd[this.IDBUTTON5].HWND, 241 /*BM_SETCHECK*/, 1, 0);
      }
      else if (nID == this.IDBUTTON7)
        SendMessage(this.Wnd[this.IDBUTTON8].HWND, 241 /*BM_SETCHECK*/, (! SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0)), 0);
      else if (nID == this.IDBUTTON8)
        SendMessage(this.Wnd[this.IDBUTTON7].HWND, 241 /*BM_SETCHECK*/, (! SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0)), 0);

      bChanged = 1;
      this.Value = 0;

      for (var i = this.IDBUTTON1; i <= this.IDBUTTON13; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Value |= this.Wnd[i].Type;
      }
      this.SetValue();
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};

var oUrlCommand =
{
  Value  : '',
  Default: '',
  Wnd    : [],
  IDTEXT : 2001,
  IDVALUE: 2002,
  IDDEF  : 2003,
  IDEDIT : 2004,

  Initialize: function()
  {
    if (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 132 /*MI_URLCOMMAND*/, lpText))
      this.Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);

    this.Initial = this.Value;

    this.Wnd[this.IDTEXT ] = {Class: 'STATIC',    Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13, Txt: 'Defines command for hyperlink click. Herewith variable %u denotes hyperlink text:',
                                                                                                     Rus: 'Определяет команду для запуска при клике по гиперссылке. При этом переменная %u обозначает текст гиперссылки:'};
    this.Wnd[this.IDVALUE] = {Class: 'COMBOBOX',  Style: 0x50010042, X: 140, Y:  35, W: 640, H:  21};
    this.Wnd[this.IDDEF  ] = {Class: 'BUTTON',    Style: 0x50010003, X: 140, Y:  66, W: 640, H:  16, Txt: 'By default: "" - hyperlink opens by operating system.',
                                                                                                     Rus: 'По умолчанию: "" - гиперссылка открывается операционной системой.'};
    this.Wnd[this.IDEDIT ] = {Class: 'AkelEditW', Style: 0x50010800, X: 140, Y:  91, W: 640, H:  21, Txt: 'Example: Exec(`"%ProgramFiles%\\Mozilla Firefox\\firefox.exe" "%u"`)',
                                                                                                     Rus: 'Пример: Exec(`"%ProgramFiles%\\Mozilla Firefox\\firefox.exe" "%u"`)'};
  },

  Apply: function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 132 /*MIS_URLCOMMAND*/, this.Value);
  },

  SetValue: function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVALUE].HWND, this.Value);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if (nID == this.IDVALUE)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Value = this.Default;
      this.SetValue();
    }
  }
};



Last edited by KDJ on Fri Jun 27, 2014 10:06 pm; edited 8 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Fri Aug 16, 2013 11:14 am    Post subject: Reply with quote

GUI for manual settings - part 3.

AkelPadManualSettings_part3.js

Code:
var oWordBreak =
{
  Default  : 9,
  DefaultAE: 111,
  Wnd      : [],
  IDTEXT   : 2001,
  IDBUTTON1: 2002,
  IDBUTTON2: 2003,
  IDBUTTON3: 2004,
  IDBUTTON4: 2005,
  IDBUTTON5: 2006,
  IDBUTTON6: 2007,
  IDBUTTON7: 2008,
  IDBUTTON8: 2009,
  IDBUTTON9: 2010,
  IDDEF    : 2011,
  IDDEFAE  : 2012,
  IDENABLE : 2013,
  IDSUM    : 2014,
  IDNOTE   : 2015,

  Initialize: function()
  {
    if (! hEditWnd)
      SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*wParam=MAKEWPARAM(0,IDM_FILE_NEW)*/, 1 /*lParam=TRUE*/);

    this.Value     = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 117 /*MI_WORDBREAKCUSTOM*/, 0);
    this.Initial   = this.Value;
    this.Enable    = SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 107 /*FI_WORDDELIMITERSENABLE*/, 0);
    this.EnableIni = this.Enable;

    if (! hEditWnd)
      AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);

    this.Wnd[this.IDTEXT   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y:  15, W: 640, H:  13,                                    Txt: 'Defines how the caret on Ctrl+Left/Ctrl+Right will move. Set by the sum of members:',
                                                                                                                                       Rus: 'Определяет, как будет перемещаться каретка по Ctrl+Left/Ctrl+Right. Задается суммой членов:'};
    this.Wnd[this.IDBUTTON1] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  35, W: 640, H:  16, Type:   1 /*AEWB_LEFTWORDSTART*/,  Txt: '1 - Left movement is stopped, when word start is found.',
                                                                                                                                       Rus: '1 - Движение влево прекращается, когда встречается начало слова.'};
    this.Wnd[this.IDBUTTON2] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  55, W: 640, H:  16, Type:   2 /*AEWB_LEFTWORDEND*/,    Txt: '2 - Left movement is stopped, when word end is found.',
                                                                                                                                       Rus: '2 - Движение влево прекращается, когда встречается конец слова.'};
    this.Wnd[this.IDBUTTON3] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  75, W: 640, H:  16, Type:   4 /*AEWB_RIGHTWORDSTART*/, Txt: '4 - Right movement is stopped, when word start is found.',
                                                                                                                                       Rus: '4 - Движение вправо прекращается, когда встречается начало слова.'};
    this.Wnd[this.IDBUTTON4] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y:  95, W: 640, H:  16, Type:   8 /*AEWB_RIGHTWORDEND*/,   Txt: '8 - Right movement is stopped, when word end is found.',
                                                                                                                                       Rus: '8 - Движение вправо прекращается, когда встречается конец слова.'};
    this.Wnd[this.IDBUTTON5] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 115, W: 640, H:  16, Type:  16 /*AEWB_STOPSPACESTART*/, Txt: '16 - Movement is stopped, when spacing start is found. Cannot be combined with 64.',
                                                                                                                                       Rus: '16 - Движение прекращается, когда встречается начало серии пробелов. Не может быть использовано совместно с 64.'};
    this.Wnd[this.IDBUTTON6] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 135, W: 640, H:  16, Type:  32 /*AEWB_STOPSPACEEND*/,   Txt: '32 - Movement is stopped, when spacing end is found. Cannot be combined with 128.',
                                                                                                                                       Rus: '32 - Движение прекращается, когда встречается конец серии пробелов. Не может быть использовано совместно с 128.'};
    this.Wnd[this.IDBUTTON7] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 155, W: 640, H:  16, Type:  64 /*AEWB_SKIPSPACESTART*/, Txt: '64 - Movement is continued, when spacing start is found. Cannot be combined with 16.',
                                                                                                                                       Rus: '64 - Движение продолжается, когда встречается начало серии пробелов. Не может быть использовано совместно с 16.'};
    this.Wnd[this.IDBUTTON8] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 175, W: 640, H:  16, Type: 128 /*AEWB_SKIPSPACEEND*/,   Txt: '128 - Movement is continued, when spacing end is found. Cannot be combined with 32.',
                                                                                                                                       Rus: '128 - Движение продолжается, когда встречается конец серии пробелов. Не может быть использовано совместно с 32.'};
    this.Wnd[this.IDBUTTON9] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 195, W: 640, H:  16, Type: 256 /*AEWB_STOPNEWLINE*/,    Txt: '256 - Movement is stopped, when new line is found.',
                                                                                                                                       Rus: '256 - Движение прекращается, когда встречается конец строки.'};
    this.Wnd[this.IDDEF    ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 241, W: 640, H:  16,                                    Txt: 'By default: 1+8=9 (AkelPad)',
                                                                                                                                       Rus: 'По умолчанию: 1+8=9 (AkelPad)'};
    this.Wnd[this.IDDEFAE  ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 261, W: 640, H:  16,                                    Txt: 'By default: 1+2+4+8+32+64=111 (AkelEdit)',
                                                                                                                                       Rus: 'По умолчанию: 1+2+4+8+32+64=111 (AkelEdit)'};
    this.Wnd[this.IDENABLE ] = {Class: 'BUTTON', Style: 0x50010003, X: 140, Y: 281, W: 640, H:  16,                                    Txt: 'Works only if enabled "Word delimiters" in settings (WordDelimitersEnable=1).',
                                                                                                                                       Rus: 'Работает только при отмеченном пункте в настройках "Разделители слов" (WordDelimitersEnable=1).'};
    this.Wnd[this.IDSUM    ] = {Class: 'STATIC', Style: 0x50000000, X: 150, Y: 215, W:  70, H:  13};
    this.Wnd[this.IDNOTE   ] = {Class: 'STATIC', Style: 0x50000000, X: 140, Y: 310, W: 640, H:  13,                                    Txt: oPaintOptions.Wnd[oPaintOptions.IDNOTE].Txt,
                                                                                                                                       Rus: oPaintOptions.Wnd[oPaintOptions.IDNOTE].Rus};
  },

  Apply: function()
  {
    if (! hEditWnd)
      SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*wParam=MAKEWPARAM(0,IDM_FILE_NEW)*/, 1 /*lParam=TRUE*/);

    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 117 /*MIS_WORDBREAKCUSTOM*/, this.Value);
    AkelPad.SetFrameInfo(0, 54 /*FIS_WORDDELIMITERSENABLE*/, this.Enable);

    if (! hEditWnd)
      AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
  },

  SetValue: function()
  {
    for (var i = this.IDBUTTON1; i <= this.IDBUTTON9; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Value & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Value);
    SendMessage(this.Wnd[this.IDDEF   ].HWND, 241 /*BM_SETCHECK*/, this.Value == this.Default, 0);
    SendMessage(this.Wnd[this.IDDEFAE ].HWND, 241 /*BM_SETCHECK*/, this.Value == this.DefaultAE, 0);
    SendMessage(this.Wnd[this.IDENABLE].HWND, 241 /*BM_SETCHECK*/, this.Enable, 0);
  },

  Command: function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUTTON1) && (nID <= this.IDBUTTON9))
    {
      if ((nID == this.IDBUTTON5) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        SendMessage(this.Wnd[this.IDBUTTON7].HWND, 241 /*BM_SETCHECK*/, 0, 0);
      else if ((nID == this.IDBUTTON7) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        SendMessage(this.Wnd[this.IDBUTTON5].HWND, 241 /*BM_SETCHECK*/, 0, 0);
      else if ((nID == this.IDBUTTON6) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        SendMessage(this.Wnd[this.IDBUTTON8].HWND, 241 /*BM_SETCHECK*/, 0, 0);
      else if ((nID == this.IDBUTTON8) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        SendMessage(this.Wnd[this.IDBUTTON6].HWND, 241 /*BM_SETCHECK*/, 0, 0);

      bChanged = 1;
      this.Value = 0;

      for (var i = this.IDBUTTON1; i <= this.IDBUTTON9; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Value |= this.Wnd[i].Type;
      }
      this.SetValue();
    }
    else if (((nID == this.IDDEF) || (nID == this.IDDEFAE)) && (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0)))
    {
      bChanged = 1;
      this.Value = (nID == this.IDDEF) ? this.Default : this.DefaultAE;
      this.SetValue();
    }
    else if (nID == this.IDENABLE)
    {
      bChanged = 1;
      this.Enable = SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0);
    }
  }
};

var aParam =
[
  ["AkelAdminResident",  oAkelAdminResident],
  ["AkelUpdaterOptions", oAkelUpdaterOptions, aAkelUpdaterOptions],
  ["CmdLineBegin",       oCmdLineBegin,       aCmdLineBegin],
  ["CmdLineEnd",         oCmdLineEnd,         aCmdLineEnd],
  ["DateInsertFormat",   oDateInsertFormat,   aDateInsertFormat],
  ["DateLogFormat",      oDateLogFormat,      aDateLogFormat],
  ["EditStyle",          oEditStyle],
  ["MouseOptions",       oMouseOptions],
  ["PaintOptions",       oPaintOptions],
  ["RichEditClass",      oRichEditClass],
  ["ShowModify",         oShowModify],
  ["SingleOpenProgram",  oSingleOpenProgram],
  ["StatusPosType",      oStatusPosType],
  ["StatusUserFormat",   oStatusUserFormat,   aStatusUserFormat],
  ["TabNameFind",        oTabNameFind,        aTabNameFind],
  ["TabNameRep",         oTabNameRep,         aTabNameRep],
  ["TabOptionsMDI",      oTabOptionsMDI],
  ["UrlCommand",         oUrlCommand,         aUrlCommand],
  ["WordBreak",          oWordBreak]
];

for (i = 0; i < aParam.length; ++i)
  aParam[i][1].Initialize();

var Scale =
{
  Init: function()
  {
    var hDC = oSys.Call("User32::GetDC", hMainWnd);
    this.ScaleX = oSys.Call("Gdi32::GetDeviceCaps", hDC, 88 /*LOGPIXELSX*/);
    this.ScaleY = oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/);
    oSys.Call("User32::ReleaseDC", hMainWnd, hDC);
    //Align to 16 pixel
    this.ScaleX += (16 - this.ScaleX % 16) % 16;
    this.ScaleY += (16 - this.ScaleY % 16) % 16;
  },
  X: function(n) {return oSys.Call("Kernel32::MulDiv", n, this.ScaleX, 96);},
  Y: function(n) {return oSys.Call("Kernel32::MulDiv", n, this.ScaleY, 96);}
}
Scale.Init();

var aDlg      = [];
var IDNAMELV  = 1001;
var IDENGB    = 1002;
var IDRUSB    = 1003;
var IDRESETB  = 1004;
var IDUNDOB   = 1005;
var IDAPPLYB  = 1006;
var IDOKB     = 1007;
var IDCLOSEB  = 1008;
aDlg[IDNAMELV ] = {Class: 'SysListView32', Style: 0x5081800D, X:  5, Y:   5, W: 120, H: 327};
aDlg[IDENGB   ] = {Class: 'BUTTON',        Style: 0x50000009, X:  5, Y: 342, W:  55, H:  16, Txt: '&English'};
aDlg[IDRUSB   ] = {Class: 'BUTTON',        Style: 0x50000009, X: 70, Y: 342, W:  55, H:  16, Txt: '&Russian'};
aDlg[IDRESETB ] = {Class: 'BUTTON',        Style: 0x50000000, X:  5, Y: 367, W: 120, H:  23, Txt: '&Default all'};
aDlg[IDUNDOB  ] = {Class: 'BUTTON',        Style: 0x50000000, X:  5, Y: 392, W: 120, H:  23, Txt: '&Undo changes'};
aDlg[IDAPPLYB ] = {Class: 'BUTTON',        Style: 0x50000000, X:  5, Y: 417, W: 120, H:  23, Txt: '&Apply'};
aDlg[IDOKB    ] = {Class: 'BUTTON',        Style: 0x50000001, X:  5, Y: 442, W: 120, H:  23, Txt: 'OK'};
aDlg[IDCLOSEB ] = {Class: 'BUTTON',        Style: 0x50000000, X:  5, Y: 467, W: 120, H:  23, Txt: 'Close'};

var nFX = oSys.Call("User32::GetSystemMetrics", 7 /*SM_CXDLGFRAME*/) * 2;
var nFY = oSys.Call("User32::GetSystemMetrics", 8 /*SM_CYDLGFRAME*/) * 2 + oSys.Call("User32::GetSystemMetrics", 4 /*SM_CYCAPTION*/);

AkelPad.WindowRegisterClass(sClassName);

var hDlg = oSys.Call("User32::CreateWindowExW",
  0,                  //dwExStyle
  sClassName,         //lpClassName
  sScriptName,        //lpWindowName
  0x90C80000,         //dwStyle=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU
  nDlgX,              //x
  nDlgY,              //y
  Scale.X(795) + nFX, //nWidth
  Scale.Y(495) + nFY, //nHeight
  hMainWnd,           //hWndParent
  0,                  //ID
  hInstDLL,           //hInstance
  DialogCallback);    //Script function callback. To use it class must be registered by WindowRegisterClass.

oSys.Call("User32::EnableWindow", hMainWnd, false);
AkelPad.WindowGetMessage();
AkelPad.WindowUnregisterClass(sClassName);
AkelPad.MemFree(lpText);
AkelPad.MemFree(lpLVITEM);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 1) //WM_CREATE
  {
    CreateWindows(hWnd, aDlg, IDNAMELV);
    SendMessage(aDlg[IDENGB + nLang].HWND, 241 /*BM_SETCHECK*/, 1, 0);
    FillLV();
    EnableButtons();
    hFocus = aDlg[IDNAMELV].HWND;
  }

  else if ((uMsg == 6 /*WM_ACTIVATE*/) && (! wParam))
    hFocus = oSys.Call("User32::GetFocus");

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("User32::SetFocus", hFocus);

  else if (uMsg == 15) //WM_PAINT
    PaintFrame();

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 9 /*VK_TAB*/)
    {
      hFocus = oSys.Call("User32::GetFocus");
      if (Ctrl())
      {
        oSys.Call("User32::SetFocus", aDlg[IDNAMELV].HWND);
        if (Shift())
        {
          if (nSel > 0)
            SetCurSelLV(nSel - 1);
          else
            SetCurSelLV(aParam.length - 1);
        }
        else
        {
          if (nSel < aParam.length - 1)
            SetCurSelLV(nSel + 1);
          else
            SetCurSelLV(0);
        }
      }
      else if ((hFocus == aDlg[IDENGB].HWND) || (hFocus == aDlg[IDRUSB].HWND))
        oSys.Call("User32::SetFocus", oSys.Call("User32::GetNextDlgTabItem", hWnd, hFocus, Shift()));
    }
    else if ((wParam == 13 /*VK_RETURN*/) && IsCloseCB())
      PostMessage(hWnd, 273 /*WM_COMMAND*/, IDOKB, 0);
  }

  else if (uMsg == 260) //WM_SYSKEYDOWN
  {
    if ((wParam == 0x2E /*VK_DELETE*/) && aParam[nSel][2] && (! IsCloseCB()))
      DeleteFromHistory();
  }

  else if (uMsg == 0x004E /*WM_NOTIFY*/)
  {
    if (wParam > 2001)
    {
      if (aParam[nSel][1].Notify)
        aParam[nSel][1].Notify(wParam, lParam);
    }
    else if (wParam == IDNAMELV)
    {
      switch (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), 3 /*DT_DWORD*/))
      {
        case -101 : //LVN_ITEMCHANGED
          if (AkelPad.MemRead(lParam + (_X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, 3 /*DT_DWORD*/) & 0x2 /*LVIS_SELECTED*/)
          {
            DestroyWindows(aParam[nSel][1].Wnd, 2001);
            nSel = GetCurSelLV();
            CreateWindows(hWnd, aParam[nSel][1].Wnd, 2001);
            if (aParam[nSel][2])
              FillCB();
            aParam[nSel][1].SetValue();
          }
          break;
        case -2 : //NM_CLICK
        case -3 : //NM_DBLCLK
        case -5 : //NM_RCLICK
        case -6 : //NM_RDBLCLK
          if (AkelPad.MemRead(lParam + (_X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
            SetCurSelLV(GetCurFocLV());
          break;
      }
    }
  }

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

    if (nLowParam > 2001)
    {
      aParam[nSel][1].Command(nLowParam, nHiwParam, lParam);
      EnableButtons();
    }
    else if ((nLowParam == IDENGB) || (nLowParam == IDRUSB))
    {
      nLang = nLowParam - IDENGB;
      aParam[nSel][1].Command(nLowParam, nHiwParam, lParam);
      SetTextInWindows(aParam[nSel][1].Wnd, 2001);
      oSys.Call("User32::SetFocus", aDlg[IDNAMELV].HWND);
    }
    else if (nLowParam == IDRESETB)
    {
      SetDefPushButton(nLowParam);
      ResetAll();
    }
    else if (nLowParam == IDUNDOB)
    {
      SetDefPushButton(nLowParam);
      UndoAll();
    }
    else if (nLowParam == IDAPPLYB)
    {
      SetDefPushButton(nLowParam);
      ApplyAll();
    }
    else if (nLowParam == IDOKB)
    {
      bSaveHist = true;
      ApplyAll();
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }
    else if ((nLowParam == IDCLOSEB) || (nLowParam == 2 /*IDCANCEL*/))
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    WriteIni();
    oSys.Call("User32::EnableWindow", hMainWnd, true);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

  else if (uMsg == 2) //WM_DESTROY
    oSys.Call("User32::PostQuitMessage", 0);

  return 0;
}

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

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

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

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

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

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

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

function GetWindowText(hWnd)
{
  oSys.Call("User32::GetWindowTextW", hWnd, lpText, nTextLen);
  return AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
}

function GetCurFocLV()
{
  return SendMessage(aDlg[IDNAMELV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0001 /*LVNI_FOCUSED*/);
}

function GetCurSelLV()
{
  return SendMessage(aDlg[IDNAMELV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0002 /*LVNI_SELECTED*/);
}

function SetCurSelLV(nItem)
{
  AkelPad.MemCopy(lpLVITEM + 12, 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpLVITEM + 16, 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/);
  SendMessage(aDlg[IDNAMELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
  SendMessage(aDlg[IDNAMELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, false);
}

function FillLV()
{
  var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44); //sizeof(LVCOLUMN)
  var i;

  AkelPad.MemCopy(lpLVCOLUMN, 4 /*mask=LVCF_TEXT*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpLVCOLUMN + (_X64 ? 16 : 12), lpText, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(lpText, "Parameter", 1 /*DT_UNICODE*/);

  SendMessage(aDlg[IDNAMELV].HWND, 0x1061 /*LVM_INSERTCOLUMNW*/, 0, lpLVCOLUMN);
  AkelPad.MemFree(lpLVCOLUMN);

  for (i = 0; i < aParam.length; ++i)
  {
    AkelPad.MemCopy(lpLVITEM + 4, i, 3 /*DT_DWORD*/);
    AkelPad.MemCopy(lpText, aParam[i][0], 1 /*DT_UNICODE*/);
    SendMessage(aDlg[IDNAMELV].HWND, 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);
  }

  if (nSel < 0)
    nSel = 0;
  else if (nSel >= aParam.length)
    nSel = aParam.length - 1;

  SetCurSelLV(nSel);
  SendMessage(aDlg[IDNAMELV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
  SendMessage(aDlg[IDNAMELV].HWND, 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0x0020 /*LVS_EX_FULLROWSELECT*/, 0x0020);
}

function FillCB()
{
  var hWndCB = aParam[nSel][1].Wnd[aParam[nSel][1].IDVALUE].HWND;
  var i;

  SendMessage(hWndCB, 321 /*CB_LIMITTEXT*/, nTextLen, 0);
  SendMessage(hWndCB, 341 /*CB_SETEXTENDEDUI*/, 1, 0);

  for (i = 0; i < aParam[nSel][2].length; ++i)
    SendMessage(hWndCB, 0x0143 /*CB_ADDSTRING*/, 0, aParam[nSel][2][i]);
}

function ProcessCB(hWndCB, nCode)
{
  var i;

  if (nCode == 5 /*CBN_EDITCHANGE*/)
  {
    bChanged = 1;
    aParam[nSel][1].Value = GetWindowText(hWndCB);
    SendMessage(aParam[nSel][1].Wnd[aParam[nSel][1].IDDEF].HWND, 241 /*BM_SETCHECK*/, aParam[nSel][1].Value == aParam[nSel][1].Default, 0);
  }
  else if (nCode == 7 /*CBN_DROPDOWN*/)
  {
    for (i = 0; i < aParam[nSel][2].length; ++i)
    {
      if (aParam[nSel][2][i] == aParam[nSel][1].Value)
      {
        PostMessage(hWndCB, 0x014E /*CB_SETCURSEL*/, i, 0);
        break;
      }
    }
  }
  else if (nCode == 8 /*CBN_CLOSEUP*/)
  {
    if ((SendMessage(hWndCB, 0x0148 /*CB_GETLBTEXT*/, SendMessage(hWndCB, 0x0147 /*CB_GETCURSEL*/, 0, 0), lpText) > -1 /*CB_ERR*/) && (aParam[nSel][1].Value != AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/)))
    {
      bChanged = 1;
      aParam[nSel][1].Value = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
      oSys.Call("User32::SetWindowTextW", hWndCB, lpText);
      SendMessage(hWndCB, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(0, -1));
      SendMessage(aParam[nSel][1].Wnd[aParam[nSel][1].IDDEF].HWND, 241 /*BM_SETCHECK*/, aParam[nSel][1].Value == aParam[nSel][1].Default, 0);
    }
  }
}

function IsCloseCB()
{
  if (aParam[nSel][2])
    return (! SendMessage(aParam[nSel][1].Wnd[aParam[nSel][1].IDVALUE].HWND, 343 /*CB_GETDROPPEDSTATE*/, 0, 0));

  return true;
}

function DeleteFromHistory()
{
  if (aParam[nSel][2].length)
  {
    var hWndCB = aParam[nSel][1].Wnd[aParam[nSel][1].IDVALUE].HWND;
    var nPos   = SendMessage(hWndCB, 0x0147 /*CB_GETCURSEL*/, 0, 0);

    aParam[nSel][2].splice(nPos, 1);
    SendMessage(hWndCB, 0x0144 /*CB_DELETESTRING*/, nPos, 0);

    if (aParam[nSel][2].length)
    {
      if (nPos > aParam[nSel][2].length - 1)
        nPos = aParam[nSel][2].length - 1;

      SendMessage(hWndCB, 0x014E /*CB_SETCURSEL*/, nPos, 0);
    }
    else
    {
      aParam[nSel][1].Value = "";
      oSys.Call("User32::SetWindowTextW", hWndCB, "");
      SendMessage(aParam[nSel][1].Wnd[aParam[nSel][1].IDDEF].HWND, 241 /*BM_SETCHECK*/, aParam[nSel][1].Value == aParam[nSel][1].Default, 0);
    }
  }
}

function CreateWindows(hWndParent, aWnd, nFirst)
{
  var hGuiFont   = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
  var lpAECOLORS = AkelPad.MemAlloc(17 * 4);
  var lpRect     = AkelPad.MemAlloc(16); //sizeof(RECT)
  var i;

  AkelPad.MemCopy(lpAECOLORS, 0x00000008 /*AECLR_BASICBK*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpAECOLORS + 12, oSys.Call("User32::GetSysColor", 15 /*COLOR_BTNFACE*/), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect,      2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect +  4, 2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect +  8, 2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect + 12, 2, 3 /*DT_DWORD*/);

  for (i = nFirst; i < aWnd.length; ++i)
  {
    aWnd[i].HWND = oSys.Call("User32::CreateWindowExW",
      0,                  //dwExStyle
      aWnd[i].Class,      //lpClassName
      0,                  //lpWindowName
      aWnd[i].Style,      //dwStyle
      Scale.X(aWnd[i].X), //x
      Scale.Y(aWnd[i].Y), //y
      Scale.X(aWnd[i].W), //nWidth
      Scale.Y(aWnd[i].H), //nHeight
      hWndParent,         //hWndParent
      i,                  //ID
      hInstDLL,           //hInstance
      0);                 //lpParam

    SendMessage(aWnd[i].HWND, 48 /*WM_SETFONT*/, hGuiFont, true);

    if (aWnd[i].Class == "AkelEditW")
    {
      oSys.Call("User32::SetWindowLongW", aWnd[i].HWND, -20 /*GWL_EXSTYLE*/, 0x20000 /*WS_EX_STATICEDGE*/);
      oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0, 0, 0, 0, 0, 0x37 /*SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE*/);
      SendMessage(aWnd[i].HWND, 3232 /*AEM_SETCOLORS*/, 0, lpAECOLORS);
      SendMessage(aWnd[i].HWND, 3178 /*AEM_SETRECT*/, 0x02 /*AERC_MARGINS*/, lpRect);
    }
  }

  SetTextInWindows(aWnd, nFirst);
  AkelPad.MemFree(lpAECOLORS);
  AkelPad.MemFree(lpRect);
}

function SetTextInWindows(aWnd, nFirst)
{
  for (var i = nFirst; i < aWnd.length; ++i)
  {
    if (aWnd[i].Txt)
      oSys.Call("User32::SetWindowTextW", aWnd[i].HWND, ((nLang == 1) && aWnd[i].Rus) ? aWnd[i].Rus : aWnd[i].Txt);
  }
}

function DestroyWindows(aWnd, nFirst)
{
  for (var i = nFirst; i < aWnd.length; ++i)
  {
    oSys.Call("User32::DestroyWindow", aWnd[i].HWND);
    aWnd[i].HWND = 0;
  }
}

function ResetAll()
{
  if (AkelPad.MessageBox(hDlg, "Set all parameters to default values?", sScriptName, 0x21 /*MB_ICONQUESTION|MB_OKCANCEL*/) == 1 /*IDOK*/)
  {
    for (var i = 0; i < aParam.length; ++i)
      aParam[i][1].Value = aParam[i][1].Default;

    aParam[nSel][1].SetValue();
    bChanged = 1;
    EnableButtons();
  }
}

function UndoAll()
{
  if (AkelPad.MessageBox(hDlg, "Undo all changes?", sScriptName, 0x21 /*MB_ICONQUESTION|MB_OKCANCEL*/) == 1 /*IDOK*/)
  {
    for (var i = 0; i < aParam.length; ++i)
    {
      aParam[i][1].Value = aParam[i][1].Initial;
      if ("Enable" in aParam[i][1])
        aParam[i][1].Enable = aParam[i][1].EnableIni;
    }

    aParam[nSel][1].SetValue();
    bChanged = 1;
    EnableButtons();
  }
}

function ApplyAll()
{
  oSys.Call("User32::EnableWindow", hMainWnd, true);

  for (var i = 0; i < aParam.length; ++i)
    aParam[i][1].Apply();

  oSys.Call("User32::RedrawWindow", hMainWnd, 0, 0, 0x0485 /*RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN*/);
  oSys.Call("User32::EnableWindow", hMainWnd, false);
  bChanged = 0;
  EnableButtons();
}

function EnableButtons()
{
  var bDefault = 1;
  var bInitial = 1;
  var i;

  for (i = 0; i < aParam.length; ++i)
  {
    if (aParam[i][1].Value != aParam[i][1].Default)
    {
      bDefault = 0;
      break;
    }
  }

  for (i = 0; i < aParam.length; ++i)
  {
    if ((aParam[i][1].Value != aParam[i][1].Initial) || (("Enable" in aParam[i][1]) && (aParam[i][1].Enable != aParam[i][1].EnableIni)))
    {
      bInitial = 0;
      break;
    }
  }

  oSys.Call("User32::EnableWindow", aDlg[IDRESETB].HWND, ! bDefault);
  oSys.Call("User32::EnableWindow", aDlg[IDUNDOB ].HWND, ! bInitial);
  oSys.Call("User32::EnableWindow", aDlg[IDAPPLYB].HWND, bChanged);
}

function SetDefPushButton(nID)
{
  if (oSys.Call("User32::GetFocus") == aDlg[nID].HWND)
  {
    oSys.Call("User32::SetFocus", aDlg[IDNAMELV].HWND);
    SendMessage(aDlg[nID  ].HWND, 0xF4 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
    SendMessage(aDlg[IDOKB].HWND, 0xF4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
  }
}

function PaintFrame()
{
  var lpPaint = AkelPad.MemAlloc(_X64 ? 72 : 64); //sizeof(PAINTSTRUCT)
  var lpRect  = AkelPad.MemAlloc(16); //sizeof(RECT)
  var hDC     = oSys.Call("User32::BeginPaint", hDlg, lpPaint);

  AkelPad.MemCopy(lpRect,      Scale.X(130), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect +  4, Scale.Y(  5), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect +  8, Scale.X(790), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpRect + 12, Scale.Y(490), 3 /*DT_DWORD*/);

  oSys.Call("User32::DrawEdge", hDC, lpRect, 0x9 /*EDGE_BUMP*/, 0x800F /*BF_MONO|BF_RECT*/);
  oSys.Call("User32::EndPaint", hDlg, lpPaint);

  AkelPad.MemFree(lpPaint);
  AkelPad.MemFree(lpRect);
}

function FindInArray(aArray, sText)
{
  for (var i = 0; i < aArray.length; ++i)
  {
    if (aArray[i][0] == sText)
      return i;
  }
  return -1;
}

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

function WriteIni()
{
  var lpRect = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
  var sIniTxt;
  var i, n;

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

  sIniTxt =
    'nDlgX=' + AkelPad.MemRead(lpRect,     3 /*DT_DWORD*/) + ';\r\n' +
    'nDlgY=' + AkelPad.MemRead(lpRect + 4, 3 /*DT_DWORD*/) + ';\r\n' +
    'nSel='  + nSel + ';\r\n' +
    'nLang=' + nLang + ';\r\n';

  for (i = 0; i < aParam.length; ++i)
  {
    if (aParam[i][2])
    {
      //add to history
      if (bSaveHist && aParam[i][1].Value)
      {
        for (n = aParam[i][2].length - 1; n >= 0; --n)
        {
          if (aParam[i][2][n] == aParam[i][1].Value)
            aParam[i][2].splice(n, 1);
        }

        aParam[i][2].unshift(aParam[i][1].Value);

        if (aParam[i][2].length > nHistMax)
          aParam[i][2].length = nHistMax;
      }

      sIniTxt += 'a' + aParam[i][0] + '=[';

      for (n = 0; n < aParam[i][2].length; ++n)
        sIniTxt += '"' + aParam[i][2][n].replace(/[\\"]/g, '\\$&') + '"' + ((n < aParam[i][2].length - 1) ? ',' : '');

      sIniTxt += '];\r\n';
    }
  }

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



Last edited by KDJ on Fri Jun 27, 2014 10:08 pm; edited 7 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Fri Oct 11, 2013 6:37 pm    Post subject: Reply with quote

Changes AkelPad main window title.

AkelPadTitle.js

Code:
/*
AkelPadTitle.js - ver. 2014-06-29 (x86/x64)

Changes AkelPad main window title.

Usage:
  Call("Scripts::Main", 1, "AkelPadTitle.js", '-t="NoEditMDIPattern" -t0="NoFilePattern" -t1="FilePattern" -m="ModifiedString"')
  Call("Scripts::Main", 1, "AkelPadTitle.js", "1") - run script with default all arguments
  Call("Scripts::Main", 1, "AkelPadTitle.js") - without arguments - closes the script

Arguments:
  -t  - title pattern for MDI mode without edit window, default is: -t="%%e"
  -t0 - title pattern for empty tab without opened file, default is: -t0="%%mnew - %%e"
  -t1 - title pattern for tab with opened file, default is: -t1="%%m%%F - %%e"
  -m  - modified flag string, default is asterisk: -m="*"
  -a  - text displayed, if AkelPad is running as administrator (Win-Vista+), default is: -a="Admin"

  -t, -t0, -t1 can  contain:
  %%f - editing file name without the path
  %%F - full file name with the path
  %%m - modified flag
  %%e - exe file base name eg. "AkelPad", "AkelPad_test"
  %%v - AkelPad version eg. "4.8.5"
  %%b - AkelPad bit version: "x86" or "x64"
  %%w - windows mode: "SDI", "MDI" or "PMDI"
  %%a - AkelPad is running in administrator mode (Win-Vista+)

Notes:
  After first call with any argument, the script resides in the memory.
  Second script call without arguments, restores standard title and closes the script.

For autostart, in AkelPad.ini or registry CmdLineBegin key, need to add eg:
  /Call("Scripts::Main", 1, "AkelPadTitle.js", '-t0="no file%%m - AkelPad" -t1="%%f%%m - AkelPad" -m=" [modified]"')
  /Call("Scripts::Main", 1, "AkelPadTitle.js", '-t="%%e %%v (%%b) - %%w" -t0="%%mnew - %%e %%v (%%b) - %%w" -t1="%%m%%f - %%e %%v (%%b) - %%w"')
*/

var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);

//script already is running
if (hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
  if (! WScript.Arguments.length)
    AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}

else if (WScript.Arguments.length)
{
  var oSys        = AkelPad.SystemFunction();
  var nMDI        = AkelPad.IsMDI();
  var hMainWnd    = AkelPad.GetMainWnd();
  var sTitlePat   = AkelPad.GetArgValue("t", "%e");
  var sTitlePat0  = AkelPad.GetArgValue("t0", "%mnew - %e");
  var sTitlePat1  = AkelPad.GetArgValue("t1", "%m%F - %e");
  var sModified   = AkelPad.GetArgValue("m", "*");
  var sAdmin      = IsRunningAsAdmin() ? AkelPad.GetArgValue("a", "Admin") : "";
  var sExeName    = GetExeName();
  var sAPVersion  = GetAkelPadVersion();
  var sBitVersion = _X64 ? "x64" : "x86";
  var sWinMode    = (nMDI == 0) ? "SDI" : ((nMDI == 1) ? "MDI" : "PMDI");
  var hSubClassMain;
  var hSubClassFrame;

  if (hSubClassMain = AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback,
                                             1046 /*AKDN_FRAME_ACTIVATE*/,
                                             1078 /*AKDN_OPENDOCUMENT_FINISH*/,
                                             1080 /*AKDN_SAVEDOCUMENT_FINISH*/,
                                             1047 /*AKDN_FRAME_DEACTIVATE*/,
                                             1035 /*AKDN_EDIT_ONSTART*/,
                                             1045 /*AKDN_FRAME_NOWINDOWS*/,
                                             78   /*WM_NOTIFY*/))
  {
    hSubClassFrame = AkelPad.WindowSubClass(3 /*WSC_FRAMEPROC*/, FrameCallback, 78 /*WM_NOTIFY*/, 5 /*WM_SIZE*/);
    SetMainTitle();

    //Allow other scripts running
    AkelPad.ScriptNoMutex();

    //Message loop
    AkelPad.WindowGetMessage();

    AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);

    if (hSubClassFrame)
      AkelPad.WindowUnsubClass(3 /*WSC_FRAMEPROC*/);

    RestoreFrameTitle();
    RestoreMainTitle();
  }
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if ((uMsg == 1046 /*AKDN_FRAME_ACTIVATE*/) || (uMsg == 1078 /*AKDN_OPENDOCUMENT_FINISH*/) || (uMsg == 1080 /*AKDN_SAVEDOCUMENT_FINISH*/))
    SetMainTitle();
  else if ((uMsg == 1047 /*AKDN_FRAME_DEACTIVATE*/) || (uMsg == 1035 /*AKDN_EDIT_ONSTART*/))
    RestoreFrameTitle();
  else if (uMsg == 1045 /*AKDN_FRAME_NOWINDOWS*/)
    SetMainTitle(true);
  else if ((uMsg == 78 /*WM_NOTIFY*/) && (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), 3 /*DT_DWORD*/) == 2076 /*AEN_MODIFY*/))
  {
    AkelPad.WindowNextProc(hSubClassMain, hWnd, uMsg, wParam, lParam);
    SetMainTitle();
    AkelPad.WindowNoNextProc(hSubClassMain);
  }

  return 0;
}

function FrameCallback(hWnd, uMsg, wParam, lParam)
{
  if ((uMsg == 78 /*WM_NOTIFY*/) && (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), 3 /*DT_DWORD*/) == 2076 /*AEN_MODIFY*/))
  {
    AkelPad.WindowNextProc(hSubClassFrame, hWnd, uMsg, wParam, lParam);
    SetMainTitle();
    AkelPad.WindowNoNextProc(hSubClassFrame);
  }
  else if (uMsg == 5 /*WM_SIZE*/)
  {
    if (wParam == 2 /*SIZE_MAXIMIZED*/)
      SetMainTitle();
    else
      RestoreFrameTitle();
  }

  return 0;
}

function SetMainTitle(bNoWindows)
{
  if (bNoWindows && (nMDI == 1 /*WMD_MDI*/))
    oSys.Call("User32::SetWindowTextW", hMainWnd, sTitlePat.replace(/%e/g, sExeName).replace(/%v/g, sAPVersion).replace(/%b/g, sBitVersion).replace(/%w/g, sWinMode).replace(/%a/g, sAdmin));
  else
  {
    var hWndFrame = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, 0 /*current frame*/);
    var bModified = AkelPad.GetEditModified(0);
    var sFileFull = AkelPad.GetEditFile(0);
    var sFile     = sFileFull.replace(/.+\\/, "");

    if ((nMDI == 1 /*WMD_MDI*/) && oSys.Call("User32::IsZoomed", hWndFrame))
      //remove frame title
      oSys.Call("User32::SetWindowTextW", hWndFrame, "");

    if (sFile)
      oSys.Call("User32::SetWindowTextW", hMainWnd, sTitlePat1.replace(/%f/g, sFile).replace(/%F/g, sFileFull).replace(/%m/g, bModified ? sModified : "").replace(/%e/g, sExeName).replace(/%v/g, sAPVersion).replace(/%b/g, sBitVersion).replace(/%w/g, sWinMode).replace(/%a/g, sAdmin));
    else
      oSys.Call("User32::SetWindowTextW", hMainWnd, sTitlePat0.replace(/%m/g, bModified ? sModified : "").replace(/%e/g, sExeName).replace(/%v/g, sAPVersion).replace(/%b/g, sBitVersion).replace(/%w/g, sWinMode).replace(/%a/g, sAdmin));
  }
}

function RestoreFrameTitle()
{
  if (nMDI == 1 /*WMD_MDI*/)
  {
    var bModified   = AkelPad.GetEditModified(0);
    var bShowModify = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 110 /*MI_SHOWMODIFY*/, 0) & 4 /*SM_FRAMETITLE_MDI*/;

    oSys.Call("User32::SetWindowTextW",
              AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, 0 /*current frame*/),
              AkelPad.GetEditFile(0) + ((bModified && bShowModify) ? "*" : ""));
  }
}

function RestoreMainTitle()
{
  var sTitle    = "AkelPad";
  var sFile     = AkelPad.GetEditFile(0);
  var bModified = AkelPad.GetEditModified(0);
  var bShowModify;

  if (nMDI == 0 /*WMD_SDI*/)
  {
    sFile       = sFile.replace(/.+\\/, "");
    bShowModify = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 110 /*MI_SHOWMODIFY*/, 0) & 2 /*SM_MAINTITLE_SDI*/;

    if (sFile)
      sTitle = ((bModified && bShowModify) ? "*" : "") + sFile + " - " + sTitle;
    else if (bModified && bShowModify)
      sTitle = "* - " + sTitle;
  }
  else if (nMDI == 2 /*WMD_PMDI*/)
  {
    bShowModify = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 110 /*MI_SHOWMODIFY*/, 0) & 4 /*SM_FRAMETITLE_MDI*/;

    if (sFile)
      sTitle += " - [" + sFile + ((bModified && bShowModify) ? "*]" : "]");
    else if (bModified && bShowModify)
      sTitle += " - [*]";
  }

  oSys.Call("User32::SetWindowTextW", hMainWnd, sTitle);
}

function GetExeName()
{
  var lpName = AkelPad.MemAlloc(260 * 2);
  var sName;

  oSys.Call("Kernel32::GetModuleFileNameW", 0, lpName, 260);
  sName = AkelPad.MemRead(lpName, 1 /*DT_UNICODE*/);
  AkelPad.MemFree(lpName);

  return sName.replace(/.+\\(.+)\..*$/, "$1");
}

function GetAkelPadVersion()
{
  var nVer    = AkelPad.SendMessage(hMainWnd, 1225 /*AKD_PROGRAMVERSION*/, 0, 0);
  var nLoWord = nVer & 0xFFFF;
  var nHiWord = (nVer >> 16) & 0xFFFF;

  return (nLoWord & 0xFF) + "." + ((nLoWord >> 8) & 0xFF) + "." + (nHiWord & 0xFF);
}

function IsRunningAsAdmin()
{
  var bRetVal = false;

  if (((oSys.Call("Kernel32::GetVersion") & 0xFFFF) & 0xFF) > 5)
  {
    var lpToken = AkelPad.MemAlloc(_X64 ? 8 : 4);
    var lpInfo  = AkelPad.MemAlloc(4);
    var lpSize  = AkelPad.MemAlloc(4);
    var hToken;

    if (oSys.Call("Advapi32::OpenProcessToken", oSys.Call("Kernel32::GetCurrentProcess"), 0x0008 /*TOKEN_QUERY*/, lpToken))
    {
      hToken = AkelPad.MemRead(lpToken, 2 /*DT_QWORD*/);

      if ((oSys.Call("Advapi32::GetTokenInformation", hToken, 20 /*TokenElevation*/, lpInfo, 4, lpSize)) && AkelPad.MemRead(lpInfo, 3 /*DT_DWORD*/))
        bRetVal = true;

      oSys.Call("Kernel32::CloseHandle", hToken);
    }

    AkelPad.MemFree(lpToken);
    AkelPad.MemFree(lpInfo);
    AkelPad.MemFree(lpSize);
  }

  return bRetVal;
}


Last edited by KDJ on Sun Jun 29, 2014 6:24 pm; edited 1 time in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Sat Nov 23, 2013 8:52 pm    Post subject: Reply with quote

Removes/restores file icons on the tabs (MDI/PMDI).

IconsOnTabs.js

Code:
/*
IconsOnTabs.js - ver. 2013-11-24 (x86/x64)

Removes/restores file icons on the tabs (MDI/PMDI)

Usage:
Call("Scripts::Main", 1, "IconsOnTabs.js")

Notes:
First script call, removes the icons from the tabs.
Second script call, restores the icons.

For autostart, in AkelPad.ini or registry CmdLineBegin key, need to add:
/Call("Scripts::Main", 1, "IconsOnTabs.js")
*/

if (! AkelPad.IsMDI()) WScript.Quit();

var hMainWnd   = AkelPad.GetMainWnd();
var hTab       = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 13 /*MI_WNDTAB*/, 0);
var hImageList = AkelPad.SendMessage(hTab, 0x1302 /*TCM_GETIMAGELIST*/, 0, 0);
var sIniFile   = WScript.ScriptFullName.replace(/\.[^.]+$/, ".ini");
var oFSO       = new ActiveXObject("Scripting.FileSystemObject");
var oFile;

if (hImageList)
{
  oFile = oFSO.OpenTextFile(sIniFile, 2, true, -1);
  oFile.Write("hImageList=" + hImageList + ";")
  oFile.Close();

  AkelPad.SendMessage(hTab, 0x1303 /*TCM_SETIMAGELIST*/, 0, 0);
}
else if (oFSO.FileExists(sIniFile))
{
  try
  {
    eval(AkelPad.ReadFile(sIniFile));

    if ((typeof hImageList == "number") && hImageList && AkelPad.SystemFunction().Call("Comctl32::ImageList_GetImageCount", hImageList))
      AkelPad.SendMessage(hTab, 0x1303 /*TCM_SETIMAGELIST*/, 0, hImageList);
  }
  catch (oError)
  {
  }
}
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Sat Jan 04, 2014 7:51 pm    Post subject: Reply with quote

A few operations on the bookmarks.

LineBoardBookmarks.js

Code:
/*
LineBoardBookmarks.js - ver. 2014-04-16 (x86/x64)

A few operations on the bookmarks.

Usage:
  Call("Scripts::Main", 1, "LineBoardBookmarks.js", "Action LineLength")
  Call("Scripts::Main", 1, "LineBoardBookmarks.js") - without argument - show menu on caret position

Arguments:
  Action can be (not case sensitive):
    XB  - cut all bookmarked lines
    XU  - cut all unmarked lines
    XBS - cut bookmarked lines in selection
    XUS - cut unmarked lines in selection
    CB  - copy all bookmarked lines
    CU  - copy all unmarked lines
    CBS - copy bookmarked lines in selection
    CUS - copy unmarked lines in selection
    OB  - open in new tab all bookmarked lines
    OU  - open in new tab all unmarked lines
    OBS - open in new tab bookmarked lines in selection
    OUS - open in new tab unmarked lines in selection
    VB  - paste to all bookmarked lines
    VU  - paste to all unmarked lines
    VBS - paste to bookmarked lines in selection
    VUS - paste to unmarked lines in selection
    RB  - replace all bookmarked lines
    RU  - replace all unmarked lines
    RBS - replace bookmarked lines in selection
    RUS - replace unmarked lines in selection
    DB  - delete all bookmarked lines
    DU  - delete all unmarked lines
    DBS - delete bookmarked lines in selection
    DUS - delete unmarked lines in selection
    S+  - expand selection to nearest bookmarks
    S-  - reduce selection to nearest bookmarks
    S+T - expand top of selection to previous bookmark
    S-T - reduce top of selection to next bookmark
    S+B - expand bottom of selection to next bookmark
    S-B - reduce bottom of selection to previous bookmark
    B   - bookmark all lines
    BS  - bookmark selected lines
    U   - unmark all lines
    US  - unmark selected lines
    I   - inverse all bookmarks
    IS  - inverse bookmarks for selected lines
    MC  - show menu on caret position (default)
    MM  - show menu on mouse cursor position
  LineLength
    number of characters from line, which will be displayed on bookmarks list in option "Go to";
    range is 0 - 512, default 128;
    if 0, only numbers of lines are visible;
    applies only to Action MC and MM

Remarks:
  The script performs operations on entire unwrapped lines. "Word wrap" setting is ignored.
  The script should be saved in Unicode format.
*/

var hMainWnd    = AkelPad.GetMainWnd();
var hEditWnd    = AkelPad.GetEditWnd();
var sPluginFunc = "LineBoard::Main";

if (! (hEditWnd && AkelPad.IsPluginRunning(sPluginFunc)))
  WScript.Quit();

var oSys          = AkelPad.SystemFunction();
var bPanelVisible = IsPanelVisible();
var bRulerVisible = IsRulerdVisible();
var nRulerHeight  = GetRulerHeight();
var sAction       = "";
var nLineLen      = 128;
var sAction1, sAction2;

GetLangStrings();

if (WScript.Arguments.length)
{
  sAction = WScript.Arguments(0).toUpperCase().replace(/\s+/g, "");

  if (WScript.Arguments.length > 1)
  {
    nLineLen = parseInt(WScript.Arguments(1), 10);

    if (isNaN(nLineLen))
      nLineLen = 128;
    else if (nLineLen < 0)
      nLineLen = 0;
    else if (nLineLen > 512)
      nLineLen = 512;
  }
}

if ((! sAction) || (sAction.charAt(0) == "M"))
  sAction = Menu(sAction.charAt(1) == "M");

sAction1 = sAction.charAt(1);
sAction2 = sAction.charAt(2);

switch (sAction.charAt(0))
{
  case "":
    break;
  case "X":
    CopyOpenDeleteLines(sAction1 == "U", sAction2 == "S", true, false, true);
    break;
  case "C":
    CopyOpenDeleteLines(sAction1 == "U", sAction2 == "S", true, false, false);
    break;
  case "O":
    CopyOpenDeleteLines(sAction1 == "U", sAction2 == "S", false, true, false);
    break;
  case "V":
    PasteReplaceLines(sAction1 == "U", sAction2 == "S", true);
    break;
  case "R":
    PasteReplaceLines(sAction1 == "U", sAction2 == "S", false);
    break;
  case "D":
    CopyOpenDeleteLines(sAction1 == "U", sAction2 == "S", false, false, true);
    break;
  case "S":
    SetSelection(sAction1 == "+", sAction2);
    break;
  case "B":
    BookmarkLines(sAction1 == "S");
    break;
  case "U":
    UnmarkLines(sAction1 == "S");
    break;
  case "I":
    InverseBookmarks(sAction1 == "S");
    break;
  case "G":
    if (sAction1 == "N")
      AkelPad.Call(sPluginFunc + "::NextBookmark");
    else if (sAction1 == "P")
      AkelPad.Call(sPluginFunc + "::PrevBookmark");
    else
      GoToLine(parseInt(sAction.substr(1), 10));
    break;
  case "+":
    if (sAction1 == "P")
      ShowPanel();
    else if (sAction1 == "R")
      ShowRuler();
    break;
  case "L":
    AkelPad.Call("LineBoard::Settings");
    break;
  default:
    WScript.Echo(sTxtInvalidArg + sAction);
}

function CopyOpenDeleteLines(bUnmarked, bSelection, bCopy, bOpen, bDelete)
{
  if ((bOpen && (! AkelPad.IsMDI())) || (bDelete && AkelPad.GetEditReadOnly(0)))
    return;

  var aLine   = GetLines(bUnmarked, bSelection);
  var lpIndex = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var sText   = "";
  var nOffset1, nOffset2;
  var i;

  if (bDelete)
  {
    SetRedraw(false);
    BeginUndoAction();
  }

  for (i = aLine.length - 1; i >= 0; --i)
  {
    if (i in aLine)
    {
      AkelPad.SendMessage(hEditWnd, 3131 /*AEM_GETLINEINDEX*/, AkelPad.SendMessage(hEditWnd, 3142 /*AEM_GETWRAPLINE*/, i, 0), lpIndex);
      nOffset1 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);

      AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 19 /*AEGI_WRAPLINEEND*/, lpIndex);
      nOffset2 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex) + 1;

      if (bCopy || bOpen)
        sText = AkelPad.GetTextRange(nOffset1, nOffset2, 0 /*new line as is*/) + sText;

      if (bDelete)
      {
        AkelPad.SetSel(nOffset1, nOffset2);
        AkelPad.Command(4156 /*IDM_EDIT_CLEAR*/);
      }
    }
  }

  AkelPad.MemFree(lpIndex);

  if (bCopy)
    AkelPad.SetClipboardText(sText);

  if (bDelete)
  {
    SetRedraw(true);
    StopUndoAction();
  }

  if (bOpen && sText)
  {
    AkelPad.Command(4101 /*IDM_FILE_NEW*/, 1 /*to eliminate conflict with Templates plugin: lParam=true*/);
    AkelPad.ReplaceSel(sText);
  }
}

function PasteReplaceLines(bUnmarked, bSelection, bPaste)
{
  if (AkelPad.GetEditReadOnly(0))
    return;

  var sText;

  if (bPaste)
    sText = AkelPad.GetClipboardText();
  else
    sText = GetReplaceText(bUnmarked, bSelection);

  if (sText)
  {
    var aLine   = GetLines(bUnmarked, bSelection);
    var lpIndex = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
    var nOffset1, nOffset2;
    var i;

    SetRedraw(false);
    BeginUndoAction();

    for (i = aLine.length - 1; i >= 0; --i)
    {
      if (i in aLine)
      {
        AkelPad.SendMessage(hEditWnd, 3131 /*AEM_GETLINEINDEX*/, AkelPad.SendMessage(hEditWnd, 3142 /*AEM_GETWRAPLINE*/, i, 0), lpIndex);
        nOffset1 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);

        AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 19 /*AEGI_WRAPLINEEND*/, lpIndex);
        nOffset2 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);

        AkelPad.SetSel(nOffset1, nOffset2);
        AkelPad.ReplaceSel(sText);
      }
    }

    AkelPad.MemFree(lpIndex);
    SetRedraw(true);
    StopUndoAction();
  }
}

function GetReplaceText(bUnmarked, bSelection)
{
  var sCaption;
  var sText;

  if (bUnmarked)
  {
    if (bSelection)
      sCaption = sTxtUnLinesSel;
    else
      sCaption = sTxtUnLinesAll;
  }
  else
  {
    if (bSelection)
      sCaption = sTxtBookLinesSel;
    else
      sCaption = sTxtBookLinesAll;
  }

  if (! bSelection)
    sText = AkelPad.GetSelText(0);

  sText = AkelPad.InputBox(hMainWnd, sCaption, sTxtReplaceWith, sText);

  return sText;
}

function SetSelection(bExpand, sTopBottom)
{
  var aNearBook = GetNearBookmarks(bExpand, sTopBottom);
  var nSelStart = AkelPad.GetSelStart();
  var nSelEnd   = AkelPad.GetSelEnd();
  var lpIndex   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);

  if (sTopBottom != "B")
  {
    if (aNearBook[0] >= 0)
    {
      AkelPad.SendMessage(hEditWnd, 3131 /*AEM_GETLINEINDEX*/, AkelPad.SendMessage(hEditWnd, 3142 /*AEM_GETWRAPLINE*/, aNearBook[0], 0), lpIndex);
      nSelStart = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);
    }
  }

  if (sTopBottom != "T")
  {
    if (aNearBook[1] >= 0)
    {
      AkelPad.SendMessage(hEditWnd, 3131 /*AEM_GETLINEINDEX*/, AkelPad.SendMessage(hEditWnd, 3142 /*AEM_GETWRAPLINE*/, aNearBook[1], 0), lpIndex);
      AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 19 /*AEGI_WRAPLINEEND*/, lpIndex);
      nSelEnd = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);
    }
  }

  AkelPad.MemFree(lpIndex);

  if ((nSelStart != AkelPad.GetSelStart()) || (nSelEnd != AkelPad.GetSelEnd()))
    AkelPad.SetSel(nSelStart, nSelEnd);
}

function BookmarkLines(bSelection)
{
  var nLines = GetLinesCount();
  var sBooks = "";
  var aBook;
  var aSelLine;
  var i;

  if (bSelection)
  {
    aBook    = GetBookmarksArray();
    aSelLine = GetSelLines();

    for (i = 0; i < nLines; ++i)
    {
      if ((i >= aSelLine[0]) && (i <= aSelLine[1]))
        sBooks += i + ",";
      else
      {
        if (i in aBook)
          sBooks += i + ",";
      }
    }
  }
  else
  {
    for (i = 0; i < nLines; ++i)
      sBooks += i + ",";
  }

  SetBookmarks(sBooks);
}

function UnmarkLines(bSelection)
{
  var sBooks = "";

  if (bSelection)
  {
    var aBook    = GetBookmarksArray();
    var nLines   = GetLinesCount();
    var aSelLine = GetSelLines();
    var i;

    for (i = 0; i < nLines; ++i)
    {
      if ((i < aSelLine[0]) || (i > aSelLine[1]))
      {
        if (i in aBook)
          sBooks += i + ",";
      }
    }
  }

  SetBookmarks(sBooks);
}

function InverseBookmarks(bSelection)
{
  var nLines = GetLinesCount();
  var sBooks = "";
  var aBook  = GetBookmarksArray();
  var aSelLine;
  var i;

  if (bSelection)
  {
    aSelLine = GetSelLines();

    for (i = 0; i < nLines; ++i)
    {
      if ((i >= aSelLine[0]) && (i <= aSelLine[1]))
      {
        if (! (i in aBook))
          sBooks += i + ",";
      }
      else
      {
        if (i in aBook)
          sBooks += i + ",";
      }
    }
  }
  else
  {
    for (i = 0; i < nLines; ++i)
    {
      if (! (i in aBook))
        sBooks += i + ",";
    }
  }

  SetBookmarks(sBooks);
}

function GetLines(bUnmarked, bSelection)
{
  var aBook = GetBookmarksArray();
  var aLine = [];
  var aSelLine;
  var nLines;
  var i;

  if (bSelection)
  {
    aSelLine = GetSelLines();

    if (bUnmarked)
    {
      for (i = aSelLine[0]; i <= aSelLine[1]; ++i)
      {
        if (! (i in aBook))
          aLine[i] = 0;
      }
    }
    else
    {
      for (i = aSelLine[0]; i <= aSelLine[1]; ++i)
      {
        if (i in aBook)
          aLine[i] = 0;
      }
    }
  }
  else
  {
    if (bUnmarked)
    {
      nLines = GetLinesCount();

      for (i = 0; i < nLines; ++i)
      {
        if (! (i in aBook))
          aLine[i] = 0;
      }
    }
    else
      aLine = aBook;
  }

  return aLine;
}

function GetLinesCount(bWrap)
{
  return AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, bWrap ? 0 /*AEGL_LINECOUNT*/ : 11 /*AEGL_LINEUNWRAPCOUNT*/, 0);
}

function GetSelLines()
{
  return [AkelPad.SendMessage(hEditWnd, 3143 /*AEM_GETUNWRAPLINE*/, AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 1 /*AEGL_FIRSTSELLINE*/, 0), 0),
          AkelPad.SendMessage(hEditWnd, 3143 /*AEM_GETUNWRAPLINE*/, AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 2 /*AEGL_LASTSELLINE*/, 0), 0)];
}

function GetNearBookmarks(bExpand, sTopBottom)
{
  var aBook1   = GetBookmarksArray();
  var aBook2   = [-1, -1];
  var aSelLine = GetSelLines();
  var nLines   = GetLinesCount();
  var i;

  if (bExpand)
  {
    if (sTopBottom != "B")
    {
      for (i = aSelLine[0] - 1; i >= 0; --i)
      {
        if (i in aBook1)
        {
          aBook2[0] = i;
          break;
        }
      }
    }
    if (sTopBottom != "T")
    {
      for (i = aSelLine[1] + 1; i < nLines; ++i)
      {
        if (i in aBook1)
        {
          aBook2[1] = i;
          break;
        }
      }
    }
  }
  else
  {
    if (sTopBottom != "B")
    {
      for (i = aSelLine[0] + 1; i <= aSelLine[1]; ++i)
      {
        if (i in aBook1)
        {
          aBook2[0] = i;
          break;
        }
      }
    }
    if (sTopBottom != "T")
    {
      for (i = aSelLine[1] - 1; i >= aSelLine[0]; --i)
      {
        if (i in aBook1)
        {
          aBook2[1] = i;
          break;
        }
      }
    }
  }

  if ((aBook2[1] >= 0) && (aBook2[0] > aBook2[1]))
    aBook2 = [-1, -1];

  return aBook2;
}

function GetBookmarksArray()
{
  //returns sparse array
  var aBook1    = [];
  var aBook2    = [];
  var lpBookLen = AkelPad.MemAlloc(4 /*sizeof(int)*/);
  var lpBookStr;
  var sBooks;
  var i;

  AkelPad.CallW(sPluginFunc, 12, hEditWnd, 0, 0, lpBookLen);
  lpBookStr = AkelPad.MemAlloc(AkelPad.MemRead(lpBookLen, 3 /*DT_DWORD*/) * 2 /*sizeof(wchar_t)*/);

  AkelPad.CallW(sPluginFunc, 12, hEditWnd, 0, lpBookStr, 0);
  sBooks = AkelPad.MemRead(lpBookStr, 1 /*DT_UNICODE*/);

  AkelPad.MemFree(lpBookLen);
  AkelPad.MemFree(lpBookStr);

  if (sBooks)
  {
    aBook1 = sBooks.split(",");

    for (i = 0; i < aBook1.length; ++i)
      aBook2[aBook1[i]] = 0;
  }

  return aBook2;
}

function SetBookmarks(sBooks)
{
  //delete all bookmarks
  AkelPad.CallW(sPluginFunc, 14, hEditWnd, 0);
  //set new bookmarks (works very slow, if amount > 10000)
  AkelPad.CallW(sPluginFunc, 13, hEditWnd, 0, sBooks);
}

function SetRedraw(bRedraw)
{
   AkelPad.SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   AkelPad.SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   if (bRedraw)
  {
    oSys.Call("User32::InvalidateRect", hMainWnd, 0, true);
     oSys.Call("User32::InvalidateRect", hEditWnd, 0, true);
  }
}

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

function StopUndoAction()
{
  AkelPad.SendMessage(hEditWnd, 3082 /*AEM_ENDUNDOACTION*/, 0, 0);
  AkelPad.SendMessage(hEditWnd, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
}

function GoToLine(nLine)
{
  if (! isNaN(nLine))
  {
    var lpIndex = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);

    AkelPad.SendMessage(hEditWnd, 3131 /*AEM_GETLINEINDEX*/, AkelPad.SendMessage(hEditWnd, 3142 /*AEM_GETWRAPLINE*/, nLine, 0), lpIndex);
    AkelPad.SendMessage(hEditWnd, 3124 /*AEM_EXSETSEL*/, lpIndex, lpIndex);

    AkelPad.MemFree(lpIndex);
  }
}

function Menu(bOnCursor)
{
  var aMenu1 = [[sTxtBookLinesAll, "B" ],
                [sTxtUnLinesAll,   "U" ],
                [""],
                [sTxtBookLinesSel, "BS"],
                [sTxtUnLinesSel,   "US"]];

  var aMenu2 = [[sTxtExpand,       "+" ],
                [sTxtExpandTop,    "+T"],
                [sTxtExpandBottom, "+B"],
                [""],
                [sTxtReduce,       "-" ],
                [sTxtReduceTop,    "-T"],
                [sTxtReduceBottom, "-B"]];

  var aMenu3 = [[sTxtAll,   "" ],
                [sTxtInSel, "S"]];

  var aMenu4 = GetBookmarksListArray();

  var aMenu = [[sTxtCut,           "X",  aMenu1, ! AkelPad.GetEditReadOnly(0)],
               [sTxtCopy,          "C",  aMenu1, true],
               [sTxtOpenInTab,     "O",  aMenu1, AkelPad.IsMDI()],
               [sTxtPasteTo,       "V",  aMenu1, AkelPad.SendMessage(hEditWnd, 3035 /*AEM_CANPASTE*/, 0, 0)],
               [sTxtReplace,       "R",  aMenu1, ! AkelPad.GetEditReadOnly(0)],
               [sTxtDelete,        "D",  aMenu1, ! AkelPad.GetEditReadOnly(0)],
               [""],
               [sTxtSelection,     "S",  aMenu2, true],
               [""],
               [sTxtBookmarkLines, "B",  aMenu3, true],
               [sTxtUnmarkLines,   "U",  aMenu3, true],
               [sTxtInverseBooks,  "I",  aMenu3, true],
               [""],
               [sTxtGoTo,          "G",  aMenu4, aMenu4.length],
               [sTxtNext,          "GN",      0, aMenu4.length],
               [sTxtPrevious,      "GP",      0, aMenu4.length],
               [""],
               [sTxtShowPanel,     "+P",      0, true, bPanelVisible],
               [sTxtShowRuler,     "+R",      0, true, bPanelVisible && bRulerVisible && nRulerHeight],
               [sTxtLBSettings,    "L",       0, true]];

  var sReturn = "";
  var hMenu;
  var nFlag;
  var nMenuID;
  var lpPoint;
  var nX, nY;
  var hWndHid;
  var nCmd, nCmd1, nCmd2;
  var i, n;

  for (i = 0; i < aMenu.length; ++i)
  {
    if (aMenu[i][0] && aMenu[i][2])
    {
      aMenu[i].Handle = oSys.Call("User32::CreatePopupMenu");
      for (n = 0; n < aMenu[i][2].length; ++n)
        oSys.Call("User32::AppendMenuW", aMenu[i].Handle, aMenu[i][2][n][0] ? 0 /*MF_STRING*/ : 0x0800 /*MF_SEPARATOR*/, ((i + 1) << 24) | n, aMenu[i][2][n][0]);
    }
  }

  hMenu = oSys.Call("User32::CreatePopupMenu");
  for (i = 0; i < aMenu.length; ++i)
  {
    if (aMenu[i].Handle)
    {
      nFlag = 0x10 /*MF_POPUP*/;

      if (! aMenu[i][3])
        nFlag |= 0x01 /*MF_GRAYED*/;

      nMenuID = aMenu[i].Handle;
    }
    else if (aMenu[i][0])
    {
      nFlag = 0 /*MF_STRING*/;

      if (! aMenu[i][3])
        nFlag |= 0x01 /*MF_GRAYED*/;
      if (aMenu[i][4])
        nFlag |= 0x08 /*MF_CHECKED*/;

      nMenuID = (i + 1) << 24;
    }
    else
      nFlag = 0x0800 /*MF_SEPARATOR*/;

    oSys.Call("User32::AppendMenuW", hMenu, nFlag, nMenuID, aMenu[i][0]);
  }

  lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);

  if (bOnCursor)
  {
    oSys.Call("User32::GetCursorPos", lpPoint);
    nX = AkelPad.MemRead(lpPoint,     3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(lpPoint + 4, 3 /*DT_DWORD*/);
  }
  else
  {
    AkelPad.SendMessage(hEditWnd, 3190 /*AEM_GETCARETPOS*/, lpPoint, 0);
    oSys.Call("User32::GetCaretPos", lpPoint);
    oSys.Call("User32::ClientToScreen", hEditWnd, lpPoint);
    nX = AkelPad.MemRead(lpPoint,     3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(lpPoint + 4, 3 /*DT_DWORD*/) + AkelPad.SendMessage(hEditWnd, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, 0);
  }

  AkelPad.MemFree(lpPoint);

  hWndHid = oSys.Call("User32::CreateWindowExW", 0, "STATIC", 0, 0x50000000 /*WS_VISIBLE|WS_CHILD*/, 0, 0, 0, 0, hEditWnd, 0, AkelPad.GetInstanceDll(), 0);
  oSys.Call("User32::SetFocus", hWndHid);

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

  for (i = 0; i < aMenu.length; ++i)
    oSys.Call("User32::DestroyMenu", aMenu[i].Handle);
  oSys.Call("User32::DestroyMenu", hMenu);
  oSys.Call("User32::DestroyWindow", hWndHid);

  if (nCmd)
  {
    nCmd1   = ((nCmd >> 24) & 0xFFFFFF) - 1;
    nCmd2   = nCmd & 0xFFFFFF;
    sReturn = aMenu[nCmd1][1];

    if (aMenu[nCmd1][2])
      sReturn += aMenu[nCmd1][2][nCmd2][1];
  }

  return sReturn;
}

function GetBookmarksListArray()
{
  var aBook1    = GetBookmarksArray();
  var aBook2    = [];
  var bLineWrap =  AkelPad.SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0) && (AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 111 /*MI_STATUSPOSTYPE*/, 0) & 2 /*SPT_LINEWRAP*/);
  var nNumLen   = GetLinesCount(bLineWrap).toString().length;
  var lpIndex   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var sNumber;
  var nOffset1, nOffset2;
  var i;

  for (i in aBook1)
  {
    sNumber = (bLineWrap ? AkelPad.SendMessage(hEditWnd, 3142 /*AEM_GETWRAPLINE*/, parseInt(i), 0) + 1 : parseInt(i) + 1).toString();

    while (sNumber.length < nNumLen)
      sNumber = "0" + sNumber;

    AkelPad.SendMessage(hEditWnd, 3131 /*AEM_GETLINEINDEX*/, AkelPad.SendMessage(hEditWnd, 3142 /*AEM_GETWRAPLINE*/, parseInt(i), 0), lpIndex);
    nOffset1 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);

    AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 19 /*AEGI_WRAPLINEEND*/, lpIndex);
    nOffset2 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);

    aBook2.push([sNumber + ":    " + AkelPad.GetTextRange(nOffset1, nOffset2).replace(/^\s+/, "").substr(0, nLineLen), i]);
  }

  AkelPad.MemFree(lpIndex);

  return aBook2;
}

function IsPanelVisible()
{
  var lpVisible = AkelPad.MemAlloc(4 /*sizeof(BOOL)*/);
  var bVisible;

  AkelPad.CallW(sPluginFunc, 4, lpVisible);
  bVisible = AkelPad.MemRead(lpVisible, 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpVisible);

  return bVisible;
}

function IsRulerdVisible()
{
  var lpHeight  = AkelPad.MemAlloc(4 /*sizeof(int)*/);
  var lpVisible = AkelPad.MemAlloc(4 /*sizeof(BOOL)*/);
  var bVisible;

  AkelPad.CallW(sPluginFunc, 2, lpHeight, lpVisible);
  bVisible = AkelPad.MemRead(lpVisible, 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpHeight);
  AkelPad.MemFree(lpVisible);

  return bVisible;
}

function GetRulerHeight()
{
  var lpHeight = AkelPad.MemAlloc(4 /*sizeof(int)*/);
  var nHeight;

  AkelPad.CallW(sPluginFunc, 2, lpHeight);
  nHeight = AkelPad.MemRead(lpHeight, 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpHeight);

  return nHeight;
}

function SetRulerHeight(nHeight)
{
  //if nHeight==-1, then invert ruler visibility
  AkelPad.CallW(sPluginFunc, 3, nHeight);
}

function ShowPanel()
{
  AkelPad.CallW(sPluginFunc, 4); //show/hide panel
}

function ShowRuler()
{
  if (bPanelVisible && bRulerVisible && nRulerHeight)
    SetRulerHeight(-1);
  else
  {
    if (! bPanelVisible)
      ShowPanel();
    if (! bRulerVisible)
      SetRulerHeight(-1);
    if (! nRulerHeight)
      SetRulerHeight(17);
  }
}

function GetLangStrings()
{
  if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1045 /*Polish*/)
  {
    sTxtInvalidArg    = "Błędny argument: ";
    sTxtCut           = "Wytnij";
    sTxtCopy          = "Kopiuj";
    sTxtOpenInTab     = "Otwórz na nowej karcie";
    sTxtPasteTo       = "Wklej do";
    sTxtReplace       = "Zamień";
    sTxtDelete        = "Usuń";
    sTxtSelection     = "Zaznaczenie";
    sTxtBookmarkLines = "Wstaw zakładki";
    sTxtUnmarkLines   = "Usuń zakładki";
    sTxtInverseBooks  = "Odwróć zakładki";
    sTxtGoTo          = "Przejdź do";
    sTxtNext          = "Następna";
    sTxtPrevious      = "Poprzednia";
    sTxtShowPanel     = "Pokaż panel";
    sTxtShowRuler     = "Pokaż linijkę";
    sTxtLBSettings    = "Ustawienia LineBoard...";
    sTxtBookLinesAll  = "Wszystkie wiersze z zakładkami";
    sTxtUnLinesAll    = "Wszystkie wiersze bez zakładek";
    sTxtBookLinesSel  = "Wiersze z zakładkami w zaznaczeniu";
    sTxtUnLinesSel    = "Wiersze bez zakładek w zaznaczeniu";
    sTxtExpand        = "Rozszerz do najbliższych zakładek";
    sTxtExpandTop     = "Rozszerz na górze do poprzedniej zakładki";
    sTxtExpandBottom  = "Rozszerz na dole do następnej zakładki";
    sTxtReduce        = "Zmniejsz do najbliższych zakładek";
    sTxtReduceTop     = "Zmniejsz na górze do następnej zakładki";
    sTxtReduceBottom  = "Zmniejsz na dole do poprzedniej zakładki";
    sTxtAll           = "We wszystkich wierszach";
    sTxtInSel         = "W zaznaczeniu";
    sTxtReplaceWith   = "zamień na:";
  }
//  else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/)
//  {
//    sTxtInvalidArg    = "Invalid argument: ";
//    sTxtCut           = "Cut";
//    sTxtCopy          = "Copy";
//    sTxtOpenInTab     = "Open in new tab";
//    sTxtPasteTo       = "Paste to";
//    sTxtReplace       = "Replace";
//    sTxtDelete        = "Delete";
//    sTxtSelection     = "Selection";
//    sTxtBookmarkLines = "Bookmark lines";
//    sTxtUnmarkLines   = "Unmark lines";
//    sTxtInverseBooks  = "Inverse bookmarks";
//    sTxtGoTo          = "Go to";
//    sTxtNext          = "Next";
//    sTxtPrevious      = "Previous";
//    sTxtLBSettings    = "LineBoard settings...";
//    sTxtBookLinesAll  = "All bookmarked lines";
//    sTxtUnLinesAll    = "All unmarked lines";
//    sTxtBookLinesSel  = "Bookmarked lines in selection";
//    sTxtUnLinesSel    = "Unmarked lines in selection";
//    sTxtExpand        = "Expand to nearest bookmarks";
//    sTxtExpandTop     = "Expand top to previous bookmark";
//    sTxtExpandBottom  = "Expand bottom to next bookmark";
//    sTxtReduce        = "Reduce to nearest bookmarks";
//    sTxtReduceTop     = "Reduce top to next bookmark";
//    sTxtReduceBottom  = "Reduce bottom to previous bookmark";
//    sTxtAll           = "All";
//    sTxtInSel         = "In selection";
//    sTxtReplaceWith   = "replace with:";
//  }
  else
  {
    sTxtInvalidArg    = "Invalid argument: ";
    sTxtCut           = "Cut";
    sTxtCopy          = "Copy";
    sTxtOpenInTab     = "Open in new tab";
    sTxtPasteTo       = "Paste to";
    sTxtReplace       = "Replace";
    sTxtDelete        = "Delete";
    sTxtSelection     = "Selection";
    sTxtBookmarkLines = "Bookmark lines";
    sTxtUnmarkLines   = "Unmark lines";
    sTxtInverseBooks  = "Inverse bookmarks";
    sTxtGoTo          = "Go to";
    sTxtNext          = "Next";
    sTxtPrevious      = "Previous";
    sTxtShowPanel     = "Show panel";
    sTxtShowRuler     = "Show ruler";
    sTxtLBSettings    = "LineBoard settings...";
    sTxtBookLinesAll  = "All bookmarked lines";
    sTxtUnLinesAll    = "All unmarked lines";
    sTxtBookLinesSel  = "Bookmarked lines in selection";
    sTxtUnLinesSel    = "Unmarked lines in selection";
    sTxtExpand        = "Expand to nearest bookmarks";
    sTxtExpandTop     = "Expand top to previous bookmark";
    sTxtExpandBottom  = "Expand bottom to next bookmark";
    sTxtReduce        = "Reduce to nearest bookmarks";
    sTxtReduceTop     = "Reduce top to next bookmark";
    sTxtReduceBottom  = "Reduce bottom to previous bookmark";
    sTxtAll           = "All";
    sTxtInSel         = "In selection";
    sTxtReplaceWith   = "replace with:";
  }
}


Last edited by KDJ on Wed Apr 16, 2014 8:09 pm; edited 2 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1326
Location: Poland

PostPosted: Sun Jan 05, 2014 10:55 pm    Post subject: Reply with quote

Turn on/off LineBoard ruler.

LineBoardRulerOnOff.js

Code:
/*
LineBoardRulerOnOff.js - ver. 2014-04-16 (x86/x64)

Turn on/off LineBoard ruler.

Usage:
  Call("Scripts::Main", 1, "LineBoardRulerOnOff.js", "nHeight")

"nHeight"
  Ruler height in pixels when visible. If < 1 or > 99 or ommited (and in plugin settings is 0), is set to default value 17.
*/

if (! AkelPad.GetEditWnd())
  WScript.Quit();

var sPluginFile  = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\LineBoard.dll";
var sPluginFunc = "LineBoard::Main";
var nArgHeight;
var nCurHeight;
var bPanelVisible;
var bRulerVisible;

if (WScript.Arguments.length)
  nArgHeight = parseInt(WScript.Arguments(0), 10);

if (isNaN(nArgHeight) || (nArgHeight < 1) || (nArgHeight > 99))
  nArgHeight = 0;

if (AkelPad.IsPluginRunning(sPluginFunc))
{
  bPanelVisible = IsPanelVisible();
  bRulerVisible = IsRulerdVisible();
  nCurHeight    = GetRulerHeight();

  if (bPanelVisible && bRulerVisible && nCurHeight)
    SetRulerHeight(-1);
  else
    ShowRuler();
}
else
{
  if (new ActiveXObject("Scripting.FileSystemObject").FileExists(sPluginFile))
  {
    if (AkelPad.CallW(sPluginFunc, 1) > 0)
    {
      bPanelVisible = IsPanelVisible();
      bRulerVisible = IsRulerdVisible();
      nCurHeight    = GetRulerHeight();

      ShowRuler();
    }
  }
  else
    WScript.Echo("File not exists: " + sPluginFile);
}

function IsPanelVisible()
{
  var lpVisible = AkelPad.MemAlloc(4 /*sizeof(BOOL)*/);
  var bVisible;

  AkelPad.CallW(sPluginFunc, 4, lpVisible);
  bVisible = AkelPad.MemRead(lpVisible, 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpVisible);

  return bVisible;
}

function IsRulerdVisible()
{
  var lpHeight  = AkelPad.MemAlloc(4 /*sizeof(int)*/);
  var lpVisible = AkelPad.MemAlloc(4 /*sizeof(BOOL)*/);
  var bVisible;

  AkelPad.CallW(sPluginFunc, 2, lpHeight, lpVisible);
  bVisible = AkelPad.MemRead(lpVisible, 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpHeight);
  AkelPad.MemFree(lpVisible);

  return bVisible;
}

function GetRulerHeight()
{
  var lpHeight = AkelPad.MemAlloc(4 /*sizeof(int)*/);
  var nHeight;

  AkelPad.CallW(sPluginFunc, 2, lpHeight);
  nHeight = AkelPad.MemRead(lpHeight, 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpHeight);

  return nHeight;
}

function SetRulerHeight(nHeight)
{
  //if nHeight==-1, then invert ruler visibility
  AkelPad.CallW(sPluginFunc, 3, nHeight);
}

function ShowRuler()
{
  if (! bPanelVisible)
    AkelPad.CallW(sPluginFunc, 4); //show/hide panel

  if (! bRulerVisible)
    SetRulerHeight(-1);

  if ((! nCurHeight) || nArgHeight && (nArgHeight != nCurHeight))
    SetRulerHeight(nArgHeight ? nArgHeight : 17);
}


Last edited by KDJ on Wed Apr 16, 2014 5:45 pm; edited 1 time in total
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3 ... , 16, 17, 18  Next
Page 17 of 18

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


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