Scripts collection

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

Post by KDJ »

"Go to" dialog with argument.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=20829#p20829
// Version: 2013-08-23
// Author: KDJ
//
// *** "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 Dec 20, 2014 6:53 pm, edited 2 times in total.

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

Post by KDJ »

Extended version of "Find/Replace" dialog - part 1.
Part 2 - in the next post. Part 3 is here: FindReplaceEx_part3.js
All parts you should save in one file.
Required to include: InputBox_function.js
All in one: KDJ.zip

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=20852#p20852
// Version: 2018-11-06
// Author: KDJ
//
// *** Extended version of "Find/Replace" dialog ***
//
// 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",
//  Call("Scripts::Main", 1, "FindReplaceEx.js", '-dlg="B" -FR="A" -FRE="D+M+" -BR=-2') - replace all files using batch #2 without confirmation and message, next close dialog
//
// Arguments:
//   -dlg - dialog that will be displayed when you run the script:
//     "F" - "Find" (default)
//     "R" - "Replace"
//     "G" - "Go to"
//     "B" - "Batch replace"
//   -GT - set "Go to" initial parameter:
//     "L" - "Line:Column"
//     "O" - "Offset"
//   -FR - set "Find/Replace" initial parameters:
//     "M+"  - "Match case" check
//     "M-"  - "Match case" uncheck
//     "W+"  - "Whole word" check
//     "W-"  - "Whole word" uncheck
//     "R+"  - "Regular expressions" check
//     "R-"  - "Regular expressions" uncheck
//     "RN+" - ". matches \n" check
//     "RN-" - ". matches \n" uncheck
//     "E+"  - "Esc-sequences" check
//     "E-"  - "Esc-sequences" uncheck
//     "D"   - "Down" (direction)
//     "U"   - "Up"
//     "B"   - "Begining"
//     "S"   - "In selection"
//     "A"   - "All files"
//   -FRE - set "Find/Replace" extended parameters:
//     "D+" - ""Replace all" closes dialog" check
//     "D-" - ""Replace all" closes dialog" uncheck
//     "M+" - ""Replace all" without message" check
//     "M-" - ""Replace all" without message" uncheck
//     "S+" - "Check "in selection" if selection not empty" check
//     "S-" - "Check "in selection" if selection not empty" uncheck
//     "C+" - "Cycle search" check
//     "C-" - "Cycle search" uncheck
//     "P+" - "Prompt" check
//     "P-" - "Prompt" uncheck
//   -RDB - change default push button in "Replace" dialog:
//     "R" - "Replace"
//     "A" - "Replace all"
//   -BR - batch replace all using batch with the specified number, eg:
//     -BR=5  - replace all using batch #5
//     -BR=-5 - same, but without confirmation
//
// Manual parameters (set in FindReplaceEx.ini file):
//   bGoToDlg=true; - allows to switch to "Go to" dialog
//   bFastCount=false; - if true, "Count" function is executed faster, but it can't be stopped
//
// In "Find/Replace" dialog:
//   F1       - help for regular expressions (if "Regular expressions" is checked)
//   Ctrl+F1  - AkelHelp-*.htm in default browser (if "Regular expressions" is checked)
//   Shift+F1 - AkelHelp-*.htm in HtmlView.js (if "Regular expressions" is checked and HtmlView.js is available)
//   F2       - Templates/Batches
//
// In "Templates/Batches" dialog:
//   F1         - help for regular expressions
//   Ctrl+F1    - AkelHelp-*.htm in default browser
//   Shift+F1   - AkelHelp-*.htm in HtmlView.js
//   F3         - next template (Shift+F3 - previous)
//   Ctrl+Tab   - next batch (Ctrl+Shift+Tab - previous batch)
//   Ctrl+(1-9) - select batch number
//   Alt+Right  - add template to batch
//   Enter      - OK, set current template into "Find/Replace" dialog (also double click in item list)
//   Esc        - close dialog
//   RightClick - context menu (edit boxes, list headers and batch tabs)
//   If focus is in templates list:
//     Ins       - New button, new template based on current one
//     Ctrl+Ins  - Add button, add template based on "Find/Replace" dialog (also with Shift)
//     F2        - rename template
//     Alt+Up    - move template up (move works only if sorting isn't set)
//     Alt+Down  - move template down
//     Ctrl+Del  - remove template (also with Shift or Alt)
//   If focus is in batches list:
//     F2       - rename batch
//     Alt+Up   - move item up
//     Alt+Down - move item down
//     Ctrl+Del - remove item from list (also with Shift or Alt)
//
// Remarks:
//   Find/Replace templates are saved in file FindReplaceEx_templates.tsv
//   HtmlView.js is here: http://akelpad.sourceforge.net/forum/viewtopic.php?p=29221#p29221

var oSys     = AkelPad.SystemFunction();
var hInstDLL = AkelPad.GetInstanceDll();
var sClass   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("Kernel32::GetCurrentProcessId");

if ((! AkelPad.GetEditWnd()) || (! AkelPad.Include("InputBox_function.js")) || oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0))
  WScript.Quit();

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

//AKD_GETMODELESS types
var MLT_FIND    = 3;
var MLT_REPLACE = 4;
var MLT_GOTO    = 5;

//Find/Replace flags
var FRF_DOWN               = 0x00000001;
var FRF_WHOLEWORD          = 0x00000002;
var FRF_MATCHCASE          = 0x00000004;
var FRF_REGEXPNONEWLINEDOT = 0x00040000;
var FRF_REGEXP             = 0x00080000;
var FRF_UP                 = 0x00100000;
var FRF_BEGINNING          = 0x00200000; //FRF_DOWN|FRF_BEGINNING
var FRF_SELECTION          = 0x00400000; //FRF_DOWN|FRF_SELECTION
var FRF_ESCAPESEQ          = 0x00800000;
var FRF_ALLFILES           = 0x01000000; //FRF_DOWN|FRF_BEGINNING|FRF_ALLFILES
var FRF_REPLACEALLANDCLOSE = 0x02000000;
var FRF_CHECKINSELIFSEL    = 0x04000000;
var FRF_CYCLESEARCH        = 0x08000000;
var FRF_CYCLESEARCHPROMPT  = 0x10000000;
var FRF_REPLACEALLNOMSG    = 0x20000000;

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_FIND_BUTTON    = 3065;
var IDC_SEARCH_REPLACE_BUTTON = 3066;
var IDC_SEARCH_ALL_BUTTON     = 3067;
var IDC_SEARCH_REGEXP_ARROW   = 3068;
var IDC_GOTO_LINE             = 3102;
var IDC_GOTO_OFFSET           = 3103;

var hMainWnd     = AkelPad.GetMainWnd();
var hGuiFont     = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var oFSO         = new ActiveXObject("Scripting.FileSystemObject");
var bContinueDlg = true;
var bFirstTimeGT = true;
var nWhatSel1    = 0;
var nWhatSel2    = -1;
var nWithSel1    = 0;
var nWithSel2    = -1;
var hDlg;
var hDlgSubClass;
var aButSubClass;
var hWhatE;
var hWithE;
var hCancelB;
var hFocus;
var sWhatText;
var sWithText;
var nResizeW;
var nResizeH;
var bQSearchDialogSwitcher;
var i;

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

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

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 aDlg         = [];
var aWnd         = [];
var aSubClassFRT = [];
var nFRTMinW     = Scale.X(778);
var nFRTMinH     = Scale.Y(312);
var hWndFRT;
var bCheckBRLV;

//ini settings
var bGoToDlg    = true;
var bFastCount  = false;
var bTranspNA   = false;
var nOpacity    = 255;
var bMore       = false;
var bAEFont     = false;
var nFRTSel     = 0;
var bFRTSort    = false;
var nFRTX       = 0;
var nFRTY       = 0;
var nBRX        = 200;
var nBRY        = 200;
var nFRTW;
var nFRTH;
var nDlgX;
var nDlgY;
var nBR;
var aBR;
var aBRCB;
var aBRName;
var aFRTCol;
var aBRCol;

//script arguments
var nFRF;
var nDlgType;
var nDefButID;
var nGoTo;
var nBatchNum;

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

ReadIni();
GetArguments();

var IDFRTS      = 9000;
var IDFRTLV     = 9001;
var IDWHATS     = 9002;
var IDWITHS     = 9003;
var IDWHATE     = 9004;
var IDWITHE     = 9005;
var IDMATCHB    = 9006;
var IDWHOLEWB   = 9007;
var IDREGEXPB   = 9008;
var IDDOTNLB    = 9009;
var IDESCSEQB   = 9010;
var IDDIRG      = 9011;
var IDDIRDOWNB  = 9012;
var IDDIRUPB    = 9013;
var IDDIRBEGB   = 9014;
var IDDIRSELB   = 9015;
var IDDIRALLB   = 9016;
var IDBRS       = 9017;
var IDBRNAMES   = 9018;
var IDBRTC      = 9019;
var IDBRLV      = 9020;
var IDFRTNEWB   = 9021;
var IDFRTADDB   = 9022;
var IDFRTRENB   = 9023;
var IDFRTUPB    = 9024;
var IDFRTDOWNB  = 9025;
var IDFRTDELB   = 9026;
var IDCHECKEXPB = 9027;
var IDTOBATCH   = 9028;
var IDOKB       = 9029;
var IDBRUPB     = 9030;
var IDBRDOWNB   = 9031;
var IDBRDELB    = 9032;
var IDBRALLB    = 9033;
var IDBRENABLEB = 9034;
var IDBRACDB    = 9035;
var IDBRAWMB    = 9036;
var IDHELP1L    = 9037;
var IDHELP2L    = 9038;
var IDFINDL     = 9039;
var IDREPLACEL  = 9040;
var IDGOTOL     = 9041;
var IDMOREB     = 9042;
var IDRACDB     = 9043;
var IDRAWMB     = 9044;
var IDINSELB    = 9045;
var IDCYCLEB    = 9046;
var IDPROMPTB   = 9047;
var IDTRACKBAR  = 9048;
var IDTRANSPNAB = 9049;
var IDCOUNTB    = 9050;
var IDFINDALLB  = 9051;
var IDFRTB      = 9052;
var IDLINE      = 9053;

//0x50000000=WS_VISIBLE|WS_CHILD
//0x50000003=WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX
//0x50000007=WS_VISIBLE|WS_CHILD|BS_GROUPBOX
//0x50000009=WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON
//0x50001201=WS_CHILD|WS_VISIBLE|SS_SUNKEN|SS_CENTERIMAGE|SS_CENTER
//0x50008400=WS_VISIBLE|WS_CHILD|TCS_FOCUSNEVER|TCS_FIXEDWIDTH
//0x50010000=WS_VISIBLE|WS_CHILD|WS_TABSTOP
//0x50010005=WS_VISIBLE|WS_CHILD|WS_TABSTOP|TBS_TOP|TBS_AUTOTICKS
//0x50010003=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50800000=WS_VISIBLE|WS_CHILD|WS_BORDER
//0x50804280=WS_VISIBLE|WS_CHILD|WS_BORDER|SS_ENDELLIPSIS|SS_CENTERIMAGE|SS_NOPREFIX
//0x50810000=WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP
//0x5081000D=WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_REPORT
aDlg[IDHELP1L]   ={S:0x50000000, C:"SysLink", T:"?"};
aDlg[IDHELP2L]   ={S:0x50000000, C:"SysLink", T:"?"};
aDlg[IDFINDL]    ={S:0x50000000, C:"SysLink", T:"(Ctrl+F)", DlgID: 2004 /*IDD_FIND*/};
aDlg[IDREPLACEL] ={S:0x50000000, C:"SysLink", T:"(Ctrl+H/R)", DlgID: 2005 /*IDD_REPLACE*/};
aDlg[IDGOTOL]    ={S:0x50000000, C:"SysLink", T:"(Ctrl+G)", DlgID: 2006 /*IDD_GOTO*/};
aDlg[IDMOREB]    ={S:0x50010000, C:"BUTTON"};
aDlg[IDRACDB]    ={S:0x50010003, C:"BUTTON", T:sTxtReplAllCD};
aDlg[IDRAWMB]    ={S:0x50010003, C:"BUTTON", T:sTxtReplAllWM};
aDlg[IDINSELB]   ={S:0x50010003, C:"BUTTON", T:sTxtCheckInSel};
aDlg[IDCYCLEB]   ={S:0x50010003, C:"BUTTON", T:sTxtCycleSearch};
aDlg[IDPROMPTB]  ={S:0x50010003, C:"BUTTON", T:sTxtPrompt};
aDlg[IDTRACKBAR] ={S:0x50010005, C:"msctls_trackbar32"};
aDlg[IDTRANSPNAB]={S:0x50010003, C:"BUTTON", T:sTxtTransparentNA};
aDlg[IDCOUNTB]   ={S:0x50010000, C:"BUTTON", T:sTxtCount};
aDlg[IDFINDALLB] ={S:0x50010000, C:"BUTTON", T:sTxtFindAll + "..."};
aDlg[IDFRTB]     ={S:0x50010000, C:"BUTTON", T:sTxtTemplates + "&/" + sTxtBatches + "..."};
aDlg[IDLINE]     ={S:0x50800000, C:"STATIC"};
//Teplates/Batches
aWnd[IDFRTS]     ={S:0x50001201, C:"STATIC", T:sTxtTemplates};
aWnd[IDFRTLV]    ={S:0x5081000D, C:"SysListView32"};
aWnd[IDWHATS]    ={S:0x50000000, C:"STATIC", T:sTxtWhatFind + ":"};
aWnd[IDWITHS]    ={S:0x50000000, C:"STATIC", T:sTxtReplaceWith + ":"};
aWnd[IDWHATE]    ={S:0x50810000, C:"AkelEditW"};
aWnd[IDWITHE]    ={S:0x50810000, C:"AkelEditW"};
aWnd[IDMATCHB]   ={S:0x50010003, C:"BUTTON", T:sTxtMatchCase};
aWnd[IDWHOLEWB]  ={S:0x50010003, C:"BUTTON", T:sTxtWholeWord};
aWnd[IDREGEXPB]  ={S:0x50010003, C:"BUTTON", T:sTxtRegExp};
aWnd[IDDOTNLB]   ={S:0x50010003, C:"BUTTON", T:sTxtDotMatchesNL};
aWnd[IDESCSEQB]  ={S:0x50010003, C:"BUTTON", T:sTxtEscSeq};
aWnd[IDDIRG]     ={S:0x50000007, C:"BUTTON", T:sTxtDirection};
aWnd[IDDIRDOWNB] ={S:0x50000009, C:"BUTTON", T:sTxtDirDown};
aWnd[IDDIRUPB]   ={S:0x50000009, C:"BUTTON", T:sTxtDirUp};
aWnd[IDDIRBEGB]  ={S:0x50000009, C:"BUTTON", T:sTxtDirBeginning};
aWnd[IDDIRSELB]  ={S:0x50000009, C:"BUTTON", T:sTxtDirInSel};
aWnd[IDDIRALLB]  ={S:0x50000009, C:"BUTTON", T:sTxtDirAllFiles};
aWnd[IDBRS]      ={S:0x50001201, C:"STATIC", T:sTxtBatches};
aWnd[IDBRNAMES]  ={S:0x50804280, C:"STATIC"};
aWnd[IDBRTC]     ={S:0x50008400, C:"SysTabControl32"};
aWnd[IDBRLV]     ={S:0x5081000D, C:"SysListView32"};
aWnd[IDFRTNEWB]  ={S:0x50000000, C:"BUTTON",  T:sTxtNew};
aWnd[IDFRTADDB]  ={S:0x50000000, C:"BUTTON",  T:sTxtAdd};
aWnd[IDFRTRENB]  ={S:0x50000000, C:"BUTTON",  T:sTxtRename};
aWnd[IDFRTUPB]   ={S:0x50000000, C:"BUTTON",  T:sTxtMoveUp};
aWnd[IDFRTDOWNB] ={S:0x50000000, C:"BUTTON",  T:sTxtMoveDown};
aWnd[IDFRTDELB]  ={S:0x50000000, C:"BUTTON",  T:sTxtRemove};
aWnd[IDCHECKEXPB]={S:0x50000000, C:"BUTTON",  T:sTxtCheckExpr};
aWnd[IDTOBATCH]  ={S:0x50000000, C:"BUTTON",  T:sTxtAddToBatch};
aWnd[IDOKB]      ={S:0x50000000, C:"BUTTON",  T:sTxtOK};
aWnd[IDBRUPB]    ={S:0x50000000, C:"BUTTON",  T:sTxtMoveUp};
aWnd[IDBRDOWNB]  ={S:0x50000000, C:"BUTTON",  T:sTxtMoveDown};
aWnd[IDBRDELB]   ={S:0x50000000, C:"BUTTON",  T:sTxtRemove};
aWnd[IDBRALLB]   ={S:0x50000000, C:"BUTTON",  T:sTxtBatchReplAll};
aWnd[IDBRENABLEB]={S:0x50000003, C:"BUTTON",  T:sTxtEnableAll};
aWnd[IDBRACDB]   ={S:0x50000003, C:"BUTTON",  T:sTxtClosesDialog};
aWnd[IDBRAWMB]   ={S:0x50000003, C:"BUTTON",  T:sTxtWithoutMsg};
aWnd[IDHELP1L]   ={S:0x50000000, C:"SysLink", T:"<a>?</a>"};
aWnd[IDHELP2L]   ={S:0x50000000, C:"SysLink", T:"<a>?</a>"};

if (bQSearchDialogSwitcher = AkelPad.IsPluginRunning("QSearch::DialogSwitcher"))
  AkelPad.Call("QSearch::DialogSwitcher");

AkelPad.ScriptNoMutex();
AkelPad.WindowRegisterClass(sClass);

if (nDlgType == -1)
{
  hDlg = 0;
  FRTemplates();
}
else
{
  GetLinkText();
  AkelPad.WindowRegisterClass(sClass + "ThreadMenu");

  while (bContinueDlg)
  {
    bContinueDlg = false;
    nFRF = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0);

    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)
      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].C, //lpClassName
            (i < IDMOREB ? "<a>" : "") + aDlg[i].T + (i < IDMOREB ? "</a>" : ""), //lpWindowName
            aDlg[i].S, //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;

        if (nGoTo != 2)
        {
          oSys.Call("User32::CheckRadioButton", hDlg, IDC_GOTO_LINE, IDC_GOTO_OFFSET, nGoTo);
          SendMessage(hDlg, 273 /*WM_COMMAND*/, nGoTo, GetDlgItem(hDlg, nGoTo));
        }
      }

      if (bGoToDlg)
        ResizeDialog(0, 30);
    }
    else
    {
      if (nFRF & FRF_SELECTION)
      {
        oSys.Call("User32::CheckRadioButton", hDlg, IDC_SEARCH_BACKWARD, IDC_SEARCH_ALLFILES, IDC_SEARCH_INSEL);
        SendMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_INSEL, GetDlgItem(hDlg, IDC_SEARCH_INSEL));
      }

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

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

        SendMessage(hDlg, 1025 /*DM_SETDEFID*/, nDefButID, 0);
      }

      SetTrackBar();
      ResizeDialog(nResizeW, bMore ? nResizeH : 0);
      ShowMore();
      ShowHelpLinksFR();
      SetTransparency(1);
    }

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

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

    if (nBatchNum)
      PostMessage(hDlg, 273 /*WM_COMMAND*/, IDFRTB, GetDlgItem(hDlg, IDFRTB));

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

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

  AkelPad.WindowUnregisterClass(sClass + "ThreadMenu");
}

WriteIni();
AkelPad.WindowUnregisterClass(sClass);
AkelPad.MemFree(lpBuffer);
AkelPad.MemFree(lpLVITEM);

if (bQSearchDialogSwitcher)
  AkelPad.Call("QSearch::DialogSwitcher");

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

  if (uMsg == 6 /*WM_ACTIVATE*/)
  {
    if (aDlg[IDMOREB].Create)
    {
      if (LoWord(wParam))
        ShowMore();

      SetTransparency(LoWord(wParam));
    }
  }

  else if (uMsg == 78 /*WM_NOTIFY*/)
  {
    if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), DT_DWORD) == -2 /*NM_CLICK*/)
    {
      if ((wParam == IDHELP1L) || (wParam == IDHELP2L))
        PostThreadMenu(wParam);
      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 ((wParam == 0x46 /*F key*/) && aDlg[IDFINDL].Create)
    {
      if (aDlg[IDFINDL].Create && Ctrl() && (! Shift()) && (! Alt()))
        SwitchDialog(MLT_FIND);
    }
    else if ((wParam == 0x48 /*H key*/) || (wParam == 0x52 /*R key*/))
    {
      if (aDlg[IDREPLACEL].Create && Ctrl() && (! Shift()) && (! Alt()))
        SwitchDialog(MLT_REPLACE);
    }
    else if (wParam == 0x47 /*G key*/)
    {
      if (aDlg[IDGOTOL].Create && Ctrl() && (! Shift()) && (! Alt()))
        SwitchDialog(MLT_GOTO);
    }
    else if (wParam == 0x70 /*VK_F1*/)
    {
      if (aDlg[IDHELP1L].Show)
      {
        if (Ctrl() || Shift())
          AkelHelp(GetAkelHelpFile());
        else
        {
          if (aDlg[IDHELP2L].Show && (oSys.Call("User32::GetFocus") == hWithE))
            PostThreadMenu(IDHELP2L);
          else
          {
            oSys.Call("User32::SetFocus", hWhatE);
            PostThreadMenu(IDHELP1L);
          }
        }
      }
    }
    else if (wParam == 0x71 /*VK_F2*/)
    {
      if (aDlg[IDFRTB].Create && (! Ctrl()) && (! Shift()))
        PostMessage(hDlg, 273 /*WM_COMMAND*/, IDFRTB, GetDlgItem(hDlg, IDFRTB));
    }
  }

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

    if (nID == IDC_SEARCH_FIND)
    {
      if ((nCode == 1 /*CBN_SELCHANGE*/) || (nCode == 5 /*CBN_EDITCHANGE*/))
        EnableCount();
      else if (nCode == 3 /*CBN_SETFOCUS*/)
        SendMessage(lParam, 322 /*CB_SETEDITSEL*/, 0, MkLong(nWhatSel1, nWhatSel2));
      else if (nCode == 10 /*CBN_SELENDCANCEL*/)
      {
        nWhatSel1 = LoWord(SendMessage(lParam, 320 /*CB_GETEDITSEL*/, 0, 0));
        nWhatSel2 = HiWord(SendMessage(lParam, 320 /*CB_GETEDITSEL*/, 0, 0));
      }
    }
    else if (nID == IDC_SEARCH_REPLACE)
    {
      if (nCode == 3 /*CBN_SETFOCUS*/)
        SendMessage(lParam, 322 /*CB_SETEDITSEL*/, 0, MkLong(nWithSel1, nWithSel2));
      else if (nCode == 10 /*CBN_SELENDCANCEL*/)
      {
        nWithSel1 = LoWord(SendMessage(lParam, 320 /*CB_GETEDITSEL*/, 0, 0));
        nWithSel2 = HiWord(SendMessage(lParam, 320 /*CB_GETEDITSEL*/, 0, 0));
      }
    }
    else if ((nID >= IDC_SEARCH_MATCHCASE) && (nID <= IDC_SEARCH_REGEXP_ARROW))
    {
      EnableCount();

      if ((nID == IDC_SEARCH_ESCAPESEQ) || (nID == IDC_SEARCH_REGEXP))
      {
        AkelPad.WindowNextProc(hDlgSubClass, hDlg, uMsg, wParam, lParam);
        ShowHelpLinksFR();
        oSys.Call("User32::UpdateWindow", hDlg);
      }
      else if ((nID >= IDC_SEARCH_FIND_BUTTON) && (nID <= IDC_SEARCH_ALL_BUTTON))
      {
        if ((SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0) & FRF_SELECTION) && (AkelPad.GetSelStart() == AkelPad.GetSelEnd()))
          AkelPad.WindowNoNextProc(hDlgSubClass);
        else if (GetDlgCtrlID(oSys.Call("User32::GetFocus")) >= IDFRTS)
          oSys.Call("User32::SetFocus", hWhatE);
      }
    }
    else if (nID == IDMOREB)
    {
      bMore = ! bMore;
      aDlg[IDMOREB].T = bMore ? "<< " + sTxtMore : sTxtMore + " >>";
      oSys.Call("User32::SetWindowTextW", lParam, aDlg[IDMOREB].T);
      ResizeDialog(0, (bMore ? 1 : -1) * nResizeH);
      ShowMore();
      oSys.Call("User32::UpdateWindow", hDlg);
    }
    else if ((nID >= IDRACDB) && (nID <= IDPROMPTB))
    {
      if (nID == IDRACDB)
        nOption = FRF_REPLACEALLANDCLOSE;
      else if (nID == IDRAWMB)
        nOption = FRF_REPLACEALLNOMSG;
      else if (nID == IDINSELB)
        nOption = FRF_CHECKINSELIFSEL;
      else if (nID == IDCYCLEB)
      {
        nOption = FRF_CYCLESEARCH;
        oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDPROMPTB), SendMessage(lParam, 240 /*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 (nID == IDTRANSPNAB)
    {
      bTranspNA = ! bTranspNA;
      SetTransparency(1);
    }
    else if (nID == IDCOUNTB)
    {
      if (GetWindowText(lParam) != sTxtCount)
        oSys.Call("User32::SetWindowTextW", lParam, sTxtCount);
      else
      {
        if (nCode)
          Count(lParam, nID);
        else
        {
          Count_AddToHistory();
          PostMessage(hDlg, 273 /*WM_COMMAND*/, MkLong(nID, 1), lParam);
        }
      }
    }
    else if (nID == IDFINDALLB)
    {
      if (nCode)
        PostThreadMenu(nID);
      else
      {
        Count_AddToHistory();
        PostMessage(hDlg, 273 /*WM_COMMAND*/, MkLong(nID, 1), lParam);
      }
    }
    else if (nID == IDFRTB)
    {
      oSys.Call("User32::SetWindowTextW", GetDlgItem(hDlg, IDCOUNTB), sTxtCount);
      FRTemplates();
    }
  }

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

  else if (uMsg == 2 /*WM_DESTROY*/)
  {
    GetWhatWithFR();
    oSys.Call("User32::GetWindowRect", hDlg, lpBuffer);
    nDlgX = AkelPad.MemRead(_PtrAdd(lpBuffer, 0), DT_DWORD);
    nDlgY = AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD);

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

  return 0;
}

function PostThreadMenu(nID)
{
  //unlock main thread for context menu, based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=22725#p22725

  var hWndThreadMenu = oSys.Call("User32::CreateWindowExW", 0, sClass + "ThreadMenu", "", 0x80000000 /*WS_POPUP*/, 0, 0, 0, 0, hMainWnd, 0, hInstDLL, CallbackThreadMenu);
  PostMessage(hWndThreadMenu, 3000, nID, 0);
}

function CallbackThreadMenu(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 3000)
  {
    if (wParam == IDFINDALLB)
      FindAllMenu(hWnd, wParam);
    else
      HelpMenu(hWnd, wParam, SendDlgItemMessage(hDlg, IDC_SEARCH_REGEXP, 240 /*BM_GETCHECK*/, 0, 0));

    oSys.Call("User32::DestroyWindow", hWnd);
  }
}

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

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

function GetWindowText(hWnd)
{
  oSys.Call("User32::GetWindowTextW", hWnd, lpBuffer, nBufSize / 2);
  return AkelPad.MemRead(lpBuffer, DT_UNICODE);
}

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

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 oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
}

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

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

function GetArguments()
{
  var sArg;
  var nDirection;

  nFRF = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0);

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

  if (sArg.indexOf("M+") >= 0)
    nFRF |= FRF_MATCHCASE;
  else if (sArg.indexOf("M-") >= 0)
    nFRF &= ~FRF_MATCHCASE;

  if (sArg.indexOf("W+") >= 0)
    nFRF |= FRF_WHOLEWORD;
  else if (sArg.indexOf("W-") >= 0)
    nFRF &= ~FRF_WHOLEWORD;

  if (sArg.indexOf("R+") >= 0)
    nFRF = (nFRF | FRF_REGEXP) & ~FRF_ESCAPESEQ;
  else if (sArg.indexOf("R-") >= 0)
    nFRF &= ~FRF_REGEXP;

  if (sArg.indexOf("RN+") >= 0)
    nFRF &= ~FRF_REGEXPNONEWLINEDOT;
  else if (sArg.indexOf("RN-") >= 0)
    nFRF |= FRF_REGEXPNONEWLINEDOT;

  if (sArg.indexOf("E+") >= 0)
  {
    if (sArg.indexOf("R+") < 0)
      nFRF = (nFRF | FRF_ESCAPESEQ) & ~FRF_REGEXP;
  }
  else if (sArg.indexOf("E-") >= 0)
    nFRF &= ~FRF_ESCAPESEQ;

  if (sArg.indexOf("D") >= 0)
    nDirection = FRF_DOWN;
  else if (sArg.indexOf("U") >= 0)
    nDirection = FRF_UP;
  else if (sArg.indexOf("B") >= 0)
    nDirection = FRF_DOWN | FRF_BEGINNING;
  else if (sArg.indexOf("S") >= 0)
    nDirection = FRF_DOWN | FRF_SELECTION;
  else if (sArg.indexOf("A") >= 0)
    nDirection = FRF_DOWN | FRF_BEGINNING | FRF_ALLFILES;

  if (nDirection)
    nFRF = (nFRF & ~(FRF_DOWN | FRF_UP | FRF_BEGINNING | FRF_SELECTION | FRF_ALLFILES)) | nDirection;

  sArg = AkelPad.GetArgValue("FRE", "").toUpperCase();

  if (sArg.indexOf("D+") >= 0)
    nFRF |= FRF_REPLACEALLANDCLOSE;
  else if (sArg.indexOf("D-") >= 0)
    nFRF &= ~FRF_REPLACEALLANDCLOSE;

  if (sArg.indexOf("M+") >= 0)
    nFRF |= FRF_REPLACEALLNOMSG;
  else if (sArg.indexOf("M-") >= 0)
    nFRF &= ~FRF_REPLACEALLNOMSG;

  if (sArg.indexOf("S+") >= 0)
    nFRF |= FRF_CHECKINSELIFSEL;
  else if (sArg.indexOf("S-") >= 0)
    nFRF &= ~FRF_CHECKINSELIFSEL;

  if (sArg.indexOf("C+") >= 0)
    nFRF |= FRF_CYCLESEARCH;
  else if (sArg.indexOf("C-") >= 0)
    nFRF &= ~FRF_CYCLESEARCH;

  if (sArg.indexOf("P+") >= 0)
    nFRF |= FRF_CYCLESEARCHPROMPT;
  else if (sArg.indexOf("P-") >= 0)
    nFRF &= ~FRF_CYCLESEARCHPROMPT;

  SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 228 /*MIS_SEARCHOPTIONS*/, nFRF);

  sArg = AkelPad.GetArgValue("dlg", "F").toUpperCase();

  if (sArg == "R")
    nDlgType = MLT_REPLACE;
  else if (sArg == "G")
    nDlgType = MLT_GOTO;
  else if (sArg == "B")
    nDlgType = -1;
  else
    nDlgType = MLT_FIND;

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

  if (sArg == "R")
    nDefButID = IDC_SEARCH_REPLACE_BUTTON;
  else if (sArg == "A")
    nDefButID = IDC_SEARCH_ALL_BUTTON;
  else
    nDefButID = IDC_SEARCH_FIND_BUTTON;

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

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

  nBatchNum = AkelPad.GetArgValue("BR", 0);

  if ((Math.abs(nBatchNum) > aBR.length) || (nDlgType == MLT_GOTO) || AkelPad.GetEditReadOnly(0))
    nBatchNum = 0;

  if (nBatchNum)
    nBR = Math.abs(nBatchNum) - 1;
}

function GetLinkText()
{
  var hLangLib = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 50 /*MI_LANGHANDLE*/, 0);
  var hRes;
  var hResData;
  var lpPointer;
  var nSize;
  var i;

  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(_PtrAdd(lpPointer, 2), DT_WORD) == 0xFFFF) //DLGTEMPLATEEX
        lpPointer = _PtrAdd(lpPointer, 26);
      else //DLGTEMPLATE
        lpPointer = _PtrAdd(lpPointer, 18);

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

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

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

function GetLinkPos()
{
  var hDC = oSys.Call("User32::GetDC", hDlg);
  var nDlgW, nDlgH;
  var nButX, nButW, nButH;
  var nGapH;
  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].T, aDlg[i].T.length, lpBuffer);
    aDlg[i].W = AkelPad.MemRead(_PtrAdd(lpBuffer, 0), DT_DWORD);
    aDlg[i].H = AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD);
  }

  oSys.Call("User32::GetClientRect", hDlg, lpBuffer);
  nDlgW = AkelPad.MemRead(_PtrAdd(lpBuffer,  8), DT_DWORD);
  nDlgH = AkelPad.MemRead(_PtrAdd(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[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;
    aDlg[IDTRANSPNAB].Create= false;
    aDlg[IDTRACKBAR].Create = false;
    aDlg[IDCOUNTB].Create   = false;
    aDlg[IDFINDALLB].Create = false;
    aDlg[IDFRTB].Create     = false;
    aDlg[IDLINE].Create     = false;
  }
  else
  {
    aDlg[IDMOREB].T = bMore ? "<< " + sTxtMore : sTxtMore + " >>";

    oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, aDlg[IDMOREB].T, aDlg[IDMOREB].T.length, lpBuffer);
    aDlg[IDMOREB].W = AkelPad.MemRead(lpBuffer, DT_DWORD);

    for (i = IDCOUNTB; i <= IDFRTB; ++i)
    {
      oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, aDlg[i].T, aDlg[i].T.length, lpBuffer);
      aDlg[i].W = AkelPad.MemRead(lpBuffer, DT_DWORD) + Scale.X(10);
    }

    GetControlRect(hCancelB);
    nButX = AkelPad.MemRead(_PtrAdd(lpBuffer,  0), DT_DWORD);
    nButW = AkelPad.MemRead(_PtrAdd(lpBuffer,  8), DT_DWORD) - nButX;
    nButH = AkelPad.MemRead(_PtrAdd(lpBuffer, 12), DT_DWORD) - AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD);

    nResizeW = Math.max(0, Math.max(aDlg[IDFINDL].W, aDlg[IDREPLACEL].W, aDlg[IDGOTOL].W, aDlg[IDMOREB].W, aDlg[IDCOUNTB].W, aDlg[IDFINDALLB].W, aDlg[IDFRTB].W) - nButW);

    if (nResizeW)
    {
      nDlgW += nResizeW;
      nButW += nResizeW;

      oSys.Call("User32::SetWindowPos", hCancelB, 0, 0, 0, nButW, nButH, 0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/);
      oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, IDC_SEARCH_FIND_BUTTON), 0, 0, 0, nButW, nButH, 0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/);

      if (nDlgType == MLT_REPLACE)
      {
        oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, IDC_SEARCH_REPLACE_BUTTON), 0, 0, 0, nButW, nButH, 0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/);
        oSys.Call("User32::SetWindowPos", GetDlgItem(hDlg, IDC_SEARCH_ALL_BUTTON), 0, 0, 0, nButW, nButH, 0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/);
      }
    }

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

    GetControlRect(GetDlgItem(hDlg, IDC_SEARCH_REPLACE));
    aDlg[IDHELP2L].X = AkelPad.MemRead(_PtrAdd(lpBuffer, 8), DT_DWORD) + 1;
    aDlg[IDHELP2L].Y = AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD) + (AkelPad.MemRead(_PtrAdd(lpBuffer, 12), DT_DWORD) - AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD) - aDlg[IDHELP2L].H) / 2;

    GetControlRect(GetDlgItem(hDlg, IDC_SEARCH_WHOLEWORD));
    nGapH = AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD);
    GetControlRect(GetDlgItem(hDlg, IDC_SEARCH_MATCHCASE));
    nGapH = nGapH - AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD);

    aDlg[IDLINE].X = 0;
    aDlg[IDLINE].Y = nDlgH;
    aDlg[IDLINE].W = nDlgW;
    aDlg[IDLINE].H = 1;

    aDlg[IDRACDB].X   = AkelPad.MemRead(lpBuffer, DT_DWORD);
    aDlg[IDRACDB].Y   = nDlgH + Math.round(nGapH / 2);
    aDlg[IDRACDB].W   = aDlg[IDHELP1L].X - aDlg[IDRACDB].X - 1;
    aDlg[IDRACDB].H   = AkelPad.MemRead(_PtrAdd(lpBuffer, 12), DT_DWORD) - AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD);
    aDlg[IDRAWMB].X   = aDlg[IDRACDB].X;
    aDlg[IDRAWMB].Y   = aDlg[IDRACDB].Y + nGapH;
    aDlg[IDRAWMB].W   = aDlg[IDRACDB].W;
    aDlg[IDRAWMB].H   = aDlg[IDRACDB].H;
    aDlg[IDINSELB].X  = aDlg[IDRACDB].X;
    aDlg[IDINSELB].Y  = aDlg[IDRAWMB].Y + nGapH;
    aDlg[IDINSELB].W  = aDlg[IDRACDB].W;
    aDlg[IDINSELB].H  = aDlg[IDRACDB].H;
    aDlg[IDCYCLEB].X  = aDlg[IDRACDB].X;
    aDlg[IDCYCLEB].Y  = aDlg[IDINSELB].Y + nGapH;
    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].Y = aDlg[IDCYCLEB].Y;
    aDlg[IDPROMPTB].W = aDlg[IDCYCLEB].W;
    aDlg[IDPROMPTB].H = aDlg[IDRACDB].H;

    aDlg[IDTRACKBAR].X = aDlg[IDRACDB].X;
    aDlg[IDTRACKBAR].Y = aDlg[IDCYCLEB].Y + nGapH * 2;
    aDlg[IDTRACKBAR].W = Scale.X(70);
    aDlg[IDTRACKBAR].H = nButH;
    aDlg[IDTRACKBAR].H = nGapH;

    aDlg[IDTRANSPNAB].X = aDlg[IDTRACKBAR].X + aDlg[IDTRACKBAR].W + 5;
    aDlg[IDTRANSPNAB].Y = aDlg[IDTRACKBAR].Y;
    aDlg[IDTRANSPNAB].W = aDlg[IDRACDB].X + aDlg[IDRACDB].W - aDlg[IDTRANSPNAB].X;
    aDlg[IDTRANSPNAB].H = aDlg[IDCYCLEB].H;

    aDlg[IDMOREB].X = nButX;
    aDlg[IDMOREB].Y = nDlgH - nButH - Math.round(nGapH / 2);
    aDlg[IDMOREB].W = nButW;
    aDlg[IDMOREB].H = nButH;

    aDlg[IDCOUNTB].X = nButX;
    aDlg[IDCOUNTB].Y = aDlg[IDRACDB].Y;
    aDlg[IDCOUNTB].W = nButW;
    aDlg[IDCOUNTB].H = nButH;

    aDlg[IDFINDALLB].X = nButX;
    aDlg[IDFINDALLB].Y = aDlg[IDCOUNTB].Y + nButH + Math.round(nGapH / 6);
    aDlg[IDFINDALLB].W = nButW;
    aDlg[IDFINDALLB].H = nButH;

    aDlg[IDFRTB].X = nButX;
    aDlg[IDFRTB].Y = aDlg[IDFINDALLB].Y + nButH + Math.round(nGapH / 6);
    aDlg[IDFRTB].W = nButW;
    aDlg[IDFRTB].H = nButH;

    aDlg[IDFINDL].X    = nButX + (nButW - aDlg[IDFINDL].W) / 2;
    aDlg[IDFINDL].Y    = aDlg[IDTRACKBAR].Y + aDlg[IDTRACKBAR].H - aDlg[IDFINDL].H;
    aDlg[IDREPLACEL].X = nButX + (nButW - aDlg[IDREPLACEL].W) / 2;
    aDlg[IDREPLACEL].Y = aDlg[IDFINDL].Y;
    aDlg[IDGOTOL].X    = nButX + (nButW - aDlg[IDGOTOL].W) / 2;
    aDlg[IDGOTOL].Y    = aDlg[IDFINDL].Y - nGapH;

    aDlg[IDHELP1L].Create   = true;
    aDlg[IDHELP2L].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    = true;
    aDlg[IDRAWMB].Create    = true;
    aDlg[IDINSELB].Create   = true;
    aDlg[IDCYCLEB].Create   = true;
    aDlg[IDPROMPTB].Create  = true;
    aDlg[IDTRANSPNAB].Create= true;
    aDlg[IDTRACKBAR].Create = true;
    aDlg[IDCOUNTB].Create   = true;
    aDlg[IDFINDALLB].Create = true;
    aDlg[IDFRTB].Create     = true;
    aDlg[IDLINE].Create     = true;

    nResizeH = nGapH * 7;
  }

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

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

function ShowMore()
{
  var nID = GetDlgCtrlID(oSys.Call("User32::GetFocus"));
  var i;

  nFRF = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0);

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

  if (bMore)
  {
    SendDlgItemMessage(hDlg, IDRACDB,     241 /*BM_SETCHECK*/, nFRF & FRF_REPLACEALLANDCLOSE, 0);
    SendDlgItemMessage(hDlg, IDRAWMB,     241 /*BM_SETCHECK*/, nFRF & FRF_REPLACEALLNOMSG, 0);
    SendDlgItemMessage(hDlg, IDINSELB,    241 /*BM_SETCHECK*/, nFRF & FRF_CHECKINSELIFSEL, 0);
    SendDlgItemMessage(hDlg, IDCYCLEB,    241 /*BM_SETCHECK*/, nFRF & FRF_CYCLESEARCH, 0);
    SendDlgItemMessage(hDlg, IDPROMPTB,   241 /*BM_SETCHECK*/, nFRF & FRF_CYCLESEARCHPROMPT, 0);
    SendDlgItemMessage(hDlg, IDTRANSPNAB, 241 /*BM_SETCHECK*/, bTranspNA, 0);

    oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDRACDB), nDlgType == MLT_REPLACE);
    oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDRAWMB), nDlgType == MLT_REPLACE);
    oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, IDPROMPTB), nFRF & FRF_CYCLESEARCH);
    EnableCount();
  }
  else if ((nID >= IDCOUNTB) && (nID <= IDFRTB))
  {
    SendDlgItemMessage(hDlg, nID, 244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
    SendDlgItemMessage(hDlg, nDefButID, 244 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
  }
}

function EnableCount()
{
  for (var i = IDCOUNTB; i <= IDFINDALLB; ++i)
    oSys.Call("User32::EnableWindow", GetDlgItem(hDlg, i), oSys.Call("User32::IsWindowEnabled", GetDlgItem(hDlg, IDC_SEARCH_FIND_BUTTON)));

  oSys.Call("User32::SetWindowTextW", GetDlgItem(hDlg, IDCOUNTB), sTxtCount);
}

function ShowHelpLinksFR()
{
  if ((SendDlgItemMessage(hDlg, IDC_SEARCH_REGEXP, 240 /*BM_GETCHECK*/, 0, 0)) || (SendDlgItemMessage(hDlg, IDC_SEARCH_ESCAPESEQ, 240 /*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", GetDlgItem(hDlg, IDHELP1L), aDlg[IDHELP1L].Show);
  oSys.Call("User32::ShowWindow", 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 = GetDlgItem(hDlg, IDCANCEL);

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

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

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

function ResizeDialog(nResizeW, nResizeH)
{
  var nW, nH;

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

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

function SetTrackBar()
{
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1030 /*TBM_SETRANGE*/, 0, MkLong(0, 240));
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1047 /*TBM_SETLINESIZEE*/, 0, 10);
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1045 /*TBM_SETPAGESIZE*/, 0, 40);
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1044 /*TBM_SETTICFREQ*/, 20, 0);
  SendDlgItemMessage(hDlg, IDTRACKBAR, 1029 /*TBM_SETPOS*/, 1, -(nOpacity - 255));
}

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

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

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

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

function GetWhatWithFR()
{
  if (hWhatE) sWhatText = GetWindowText(hWhatE);
  if (hWithE) sWithText = GetWindowText(hWithE);
}

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

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

  return sFile;
}

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

    if (oFSO.FileExists(AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/) + "\\HtmlView.js") && (! Ctrl()))
      AkelPad.Call("Scripts::Main", 1, "HtmlView.js", sFile + "#ch7");
    else
      AkelPad.Exec('rundll32.exe shell32, ShellExec_RunDLL ' + sFile);
  }
}

function Count_AddToHistory()
{
  var hWndCB  = GetDlgItem(hDlg, IDC_SEARCH_FIND);
  var nCurLen = SendMessage(hWndCB, 326 /*CB_GETCOUNT*/, 0, 0);
  var nMaxLen = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 198 /*MI_SEARCHSTRINGS*/, 0);
  var sText;
  var i;

  GetWhatWithFR();

  if (nMaxLen > 0)
  {
    for (i = 0; i < nCurLen; ++i)
    {
      SendMessage(hWndCB, 328 /*CB_GETLBTEXT*/, i, lpBuffer);
      sText = AkelPad.MemRead(lpBuffer, DT_UNICODE);

      if (sText == sWhatText)
      {
        SendMessage(hWndCB, 324 /*CB_DELETESTRING*/, i, 0);
        --nCurLen;
        break;
      }
    }

    if (nCurLen == nMaxLen)
      SendMessage(hWndCB, 324 /*CB_DELETESTRING*/, nCurLen - 1, 0);

    SendMessage(hWndCB, 330 /*CB_INSERTSTRING*/, 0, sWhatText);
    SendMessage(hWndCB, 334 /*CB_SETCURSEL*/, 0, 0);
  }
}

Last edited by KDJ on Tue Nov 06, 2018 7:28 pm, edited 57 times in total.

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

Post by KDJ »

Extended version of "Find/Replace" dialog - part 2.
Part 3 is here: FindReplaceEx_part3.js

Code: Select all

function Count_EnableButtons(aButton, nID)
{
  var hWnd;
  var i;

  if (aButton.length)
  {
    for (i = 1; i < aButton.length; ++i)
      oSys.Call("User32::EnableWindow", aButton[i], 1);

    oSys.Call("User32::SetFocus", aButton[0]);
  }
  else
  {
    aButton[0] = oSys.Call("User32::GetFocus");

    oSys.Call("User32::EnableWindow", hWnd = GetDlgItem(hDlg, IDCANCEL), 0);
    aButton.push(hWnd);

    for (i = IDC_SEARCH_MATCHCASE; i <= IDC_SEARCH_REGEXP_ARROW; ++i)
    {
      if (oSys.Call("User32::IsWindowEnabled", hWnd = GetDlgItem(hDlg, i)))
      {
        oSys.Call("User32::EnableWindow", hWnd, 0);
        aButton.push(hWnd);
      }
    }

    for (i = IDHELP1L; i <= IDFRTB; ++i)
    {
      if ((i != nID) && (oSys.Call("User32::IsWindowEnabled", hWnd = GetDlgItem(hDlg, i))))
      {
        oSys.Call("User32::EnableWindow", hWnd, 0);
        aButton.push(hWnd);
      }
    }
  }
}

function Count(hButton, nID)
{
  var nRESE        = 0x1002 /*RESE_GLOBAL|RESE_MULTILINE*/;
  var lpFrameStart = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);
  var lpFrameCurr  = lpFrameStart;
  var lpCallback   = 0;
  var nCountAll    = 0;
  var bContinue    = true;
  var nErrOffset;
  var nAEGI1;
  var nAEGI2;
  var aButton;
  var lpMsg;
  var lpDelim;
  var lpPat;
  var lpPatExec;
  var hEditWnd;
  var nMaxDelim;

  nFRF = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0);

  if (nFRF & FRF_REGEXP)
    nErrOffset = CheckRegExp(sWhatText);
  else if (nFRF & FRF_ESCAPESEQ)
    nErrOffset = CheckEscSeq(sWhatText);

  if (nErrOffset)
  {
    //to call "Syntax error ..." message
    PostMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_FIND_BUTTON, 0);
    return;
  }

  if (nFRF & FRF_ESCAPESEQ)
    sWhatText = EscSeqToRegExp(sWhatText);
  else if (! (nFRF & FRF_REGEXP))
    sWhatText = sWhatText.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&");

  if (nFRF & FRF_MATCHCASE)
    nRESE |= 0x0001 /*RESE_MATCHCASE*/;
  if (nFRF & FRF_WHOLEWORD)
    nRESE |= 0x0004 /*RESE_WHOLEWORD*/;
  if (nFRF & FRF_REGEXPNONEWLINEDOT)
    nRESE |= 0x0008 /*RESE_NONEWLINEDOT*/;

  if ((nFRF & FRF_BEGINNING) || (nFRF & FRF_ALLFILES))
  {
    nAEGI1 = 1 /*AEGI_FIRSTCHAR*/;
    nAEGI2 = 2 /*AEGI_LASTCHAR*/;
  }
  else if (nFRF & FRF_SELECTION)
  {
    nAEGI1 = 3 /*AEGI_FIRSTSELCHAR*/;
    nAEGI2 = 4 /*AEGI_LASTSELCHAR*/;
  }
  else if (nFRF & FRF_DOWN)
  {
    nAEGI1 = 4 /*AEGI_LASTSELCHAR*/;
    nAEGI2 = 2 /*AEGI_LASTCHAR*/;
  }
  else //nFRF & FRF_UP
  {
    nAEGI1 = 1 /*AEGI_FIRSTCHAR*/;
    nAEGI2 = 3 /*AEGI_FIRSTSELCHAR*/;
  }

  if (! bFastCount)
  {
    try
    {
      lpCallback = oSys.RegisterCallback(PatExecCallback);
    }
    catch (oError)
    {}
  }

  aButton   = [];
  lpMsg     = AkelPad.MemAlloc(_X64 ? 48 : 28 /*sizeof(MSG)*/);
  lpDelim   = AkelPad.MemAlloc(128 /*WORD_DELIMITERS_SIZE*/ * 2);
  lpPat     = AkelPad.MemAlloc((sWhatText.length + 1) * 2);
  lpPatExec = AkelPad.MemAlloc(_X64? 216 : 108 /*sizeof(PATEXEC)*/);

  AkelPad.MemCopy(lpPat, sWhatText, DT_UNICODE);
  AkelPad.MemCopy(lpPatExec /*PATEXEC.dwOptions*/, nRESE, DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 112 :  56) /*PATEXEC.wpPat*/, lpPat, DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 120 :  60) /*PATEXEC.wpMaxPat*/, _PtrAdd(lpPat, sWhatText.length * 2), DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 200 : 100) /*PATEXEC.lpCallback*/, lpCallback, DT_QWORD);

  oSys.Call("User32::SetWindowTextW", hButton, lpCallback ? sTxtStop : sTxtWait);
  Count_EnableButtons(aButton, lpCallback ? nID : 0);

  do
  {
    hEditWnd  = AkelPad.GetEditWnd();
    nMaxDelim = SendMessage(hEditWnd, 3243 /*AEM_GETWORDDELIMITERS*/, 128 /*WORD_DELIMITERS_SIZE*/, lpDelim) - 2;

    AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ?  8 : 4) /*PATEXEC.wpDelim*/, nMaxDelim ? lpDelim : 0, DT_QWORD);
    AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 16 : 8) /*PATEXEC.wpMaxDelim*/, _PtrAdd(lpDelim, nMaxDelim * 2), DT_QWORD);

    SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI1, _PtrAdd(lpPatExec, _X64 ?  56 : 28) /*PATEXEC.ciRange*/);
    SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI2, _PtrAdd(lpPatExec, _X64 ?  80 : 40) /*PATEXEC.ciMaxRange*/);
    SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI1, _PtrAdd(lpPatExec, _X64 ? 144 : 72) /*PATEXEC.ciStr*/);
    SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI2, _PtrAdd(lpPatExec, _X64 ? 168 : 84) /*PATEXEC.ciMaxStr*/);

    nCountAll += SendMessage(hMainWnd, 1415 /*AKD_PATEXEC*/, 0, lpPatExec);
  }
  while (bContinue && (nFRF & FRF_ALLFILES) && ((lpFrameCurr = SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0x10 /*FWA_NEXT*/, lpFrameCurr)) != lpFrameStart))

  if (lpCallback)
    oSys.UnregisterCallback(lpCallback);

  AkelPad.MemFree(lpMsg);
  AkelPad.MemFree(lpDelim);
  AkelPad.MemFree(lpPat);
  AkelPad.MemFree(lpPatExec);
  SendMessage(hMainWnd, 1423 /*AKD_PATFREE*/, 0, lpPatExec);
  SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameStart);
  oSys.Call("User32::SetWindowTextW", hButton, bContinue ? nCountAll.toString() : aDlg[nID].T);
  Count_EnableButtons(aButton);

  function PatExecCallback(lpPatExec, lpREGroupRoot, bMatched)
  {
    if (oSys.Call("User32::PeekMessageW", lpMsg, hButton, 513 /*WM_LBUTTONDOWN*/, 513 /*WM_LBUTTONDOWN*/, 0x1 /*PM_REMOVE*/))
    {
      bContinue = false;
      return -1 /*RESEC_STOP*/;
    }

    return 0 /*RESEC_CONTINUE*/;
  }
}

function FindAll(hButton, nID, nCmd)
{
  var nAEFR        = 0x00000001 /*AEFR_DOWN*/;
  var lpFrameStart = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0);
  var lpFrameCurr  = lpFrameStart;
  var sText        = "";
  var bContinue    = true;
  var nCountAll    = 0;
  var nCountInDoc;
  var nErrOffset;
  var nOffset3;
  var nOffset4;
  var nAEGI1;
  var nAEGI2;
  var aButton;
  var lpMsg;
  var lpWhat;
  var lpFind;
  var lpIndex1;
  var lpIndex2;
  var lpIndex3;
  var lpIndex4;
  var hEditWnd;
  var hEditDoc;
  var bWordWrap;
  var bWrapNotNum;
  var nLine;
  var oLine;
  var nColumn;
  var i;

  nFRF = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0);

  if (nFRF & FRF_REGEXP)
    nErrOffset = CheckRegExp(sWhatText);
  else if (nFRF & FRF_ESCAPESEQ)
    nErrOffset = CheckEscSeq(sWhatText);

  if (nErrOffset)
  {
    //to call "Syntax error ..." message
    PostMessage(hDlg, 273 /*WM_COMMAND*/, IDC_SEARCH_FIND_BUTTON, 0);
    return;
  }

  if (nCmd <= 2)
  {
    if (! AkelPad.IsPluginRunning("Log::Output"))
    {
      if (AkelPad.Call("Log::Output") == 1 /*UD_NONUNLOAD_ACTIVE*/)
        oSys.Call("User32::UpdateWindow", hMainWnd);
      else
        return;
    }

    AkelPad.Call("Log::Output", 4, "", -1, 0);
    AkelPad.Call("Log::Output", 1, "", "", "^  \\[\\d+, (\\d+), (\\d+), \\d+:\\d+\\]", "/FRAME=\\1 /GOTOCHAR=\\2");
  }
  else if (nCmd >= 5)
  {
    if (! AkelPad.IsPluginRunning("LineBoard::Main"))
    {
      if (AkelPad.Call("LineBoard::Main") != 1 /*UD_NONUNLOAD_ACTIVE*/)
        return;
    }

    ShowLineBoardPanel();
    oSys.Call("User32::UpdateWindow", hMainWnd);
  }

  if (nFRF & FRF_WHOLEWORD)
    nAEFR |= 0x00000002 /*AEFR_WHOLEWORD*/;
  if (nFRF & FRF_MATCHCASE)
    nAEFR |= 0x00000004 /*AEFR_MATCHCASE*/;
  if ((nFRF & FRF_REGEXP) || (nFRF & FRF_ESCAPESEQ))
  {
    nAEFR |= 0x00080000 /*AEFR_REGEXP*/;
    if (nFRF & FRF_REGEXP)
    {
      if (nFRF & FRF_REGEXPNONEWLINEDOT)
        nAEFR |= 0x00100000 /*AEFR_REGEXPNONEWLINEDOT*/;
    }
    else
      sWhatText = EscSeqToRegExp(sWhatText);
  }

  if ((nFRF & FRF_BEGINNING) || (nFRF & FRF_ALLFILES))
  {
    nAEGI1 = 1 /*AEGI_FIRSTCHAR*/;
    nAEGI2 = 2 /*AEGI_LASTCHAR*/;
  }
  else if (nFRF & FRF_SELECTION)
  {
    nAEGI1 = 3 /*AEGI_FIRSTSELCHAR*/;
    nAEGI2 = 4 /*AEGI_LASTSELCHAR*/;
  }
  else if (nFRF & FRF_DOWN)
  {
    nAEGI1 = 4 /*AEGI_LASTSELCHAR*/;
    nAEGI2 = 2 /*AEGI_LASTCHAR*/;
  }
  else //nFRF & FRF_UP
  {
    nAEGI1 = 1 /*AEGI_FIRSTCHAR*/;
    nAEGI2 = 3 /*AEGI_FIRSTSELCHAR*/;
  }

  aButton = [];
  lpMsg   = AkelPad.MemAlloc(_X64 ? 48 : 28 /*sizeof(MSG)*/);
  lpWhat  = AkelPad.MemAlloc((sWhatText.length + 1) * 2);
  lpFind  = AkelPad.MemAlloc(_X64 ? 136 : 68 /*sizeof(AEFINDTEXTW)*/);

  AkelPad.MemCopy(lpWhat, sWhatText, DT_UNICODE);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ?  8 :  4) /**pText*/, lpWhat, DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ? 16 :  8) /*dwTextLen*/, -1, DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ? 24 : 12) /*nNewLine*/, 3 /*AELB_ASIS*/, DT_DWORD);
  lpIndex1 = _PtrAdd(lpFind, _X64 ?  32 : 16);
  lpIndex2 = _PtrAdd(lpFind, _X64 ?  56 : 28);
  lpIndex3 = _PtrAdd(lpFind, _X64 ?  80 : 40);
  lpIndex4 = _PtrAdd(lpFind, _X64 ? 104 : 52);

  oSys.Call("User32::SetWindowTextW", hButton, sTxtStop);
  Count_EnableButtons(aButton, nID);

  do
  {
    hEditWnd    = AkelPad.GetEditWnd();
    hEditDoc    = AkelPad.GetEditDoc();
    bWordWrap   = SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
    bWrapNotNum = bWordWrap && (! (SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 111 /*MI_STATUSPOSTYPE*/, 0) & 2 /*SPT_LINEWRAP*/));
    nCountInDoc = 0;

    EnableMainWnd(0, hEditWnd);

    if (nCmd >= 5)
    {
      if (bWordWrap)
        AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

      if (nCmd == 6)
      {
        sText = "," + GetBookmarks(hEditWnd, hEditDoc) + ",";
        oLine = {};
      }
    }

    SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI1, lpIndex1);
    SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI2, lpIndex2);

    AkelPad.MemCopy(lpFind /*dwFlags*/, nAEFR | 0x00200000 /*AEFR_REGEXPMINMATCH*/, DT_DWORD);

    while (SendMessage(hEditWnd, 3041 /*AEM_FINDTEXTW*/, 0, lpFind))
    {
      AkelPad.MemCopy(lpFind /*dwFlags*/, nAEFR & ~0x00200000 /*AEFR_REGEXPMINMATCH*/, DT_DWORD);

      if (nCmd <= 4)
      {
        nOffset3 = SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex3);
        nOffset4 = SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex4);

        if (nCmd <= 2)
        {
          ++nCountAll;
          ++nCountInDoc;

          if (bWrapNotNum)
          {
            nLine   = SendMessage(hEditWnd, 3143 /*AEM_GETUNWRAPLINE*/, AkelPad.MemRead(lpIndex3, DT_DWORD), 0);
            nColumn = nOffset3 - SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 18 /*AEGI_WRAPLINEBEGIN*/, nOffset3);
          }
          else
          {
            nLine   = AkelPad.MemRead(lpIndex3, DT_DWORD);
            nColumn = AkelPad.MemRead(_PtrAdd(lpIndex3, _X64 ? 16 : 8), DT_DWORD);
          }

          if (nCountInDoc == 1)
            sText += ((nCountAll > 1) ? "\n" : "") + (AkelPad.GetEditFile(0) ? AkelPad.GetEditFile(0) : sTxtNoName) + ":\n";

          sText += "  [" + nCountInDoc + ", " + lpFrameCurr + ", " + nOffset3 + ", " + (++nLine) + ":" + (++nColumn) + "] " +
                   ((nCmd == 1) ? AkelPad.GetTextRange(nOffset3, nOffset4, 2 /*\n*/)
                                : AkelPad.MemRead(AkelPad.MemRead(_PtrAdd(AkelPad.MemRead(_PtrAdd(lpIndex3, _X64 ? 8 : 4), DT_QWORD), _X64 ? 16 : 8), DT_QWORD), DT_UNICODE)) +
                   "\n";
        }
        else if (nOffset3 != nOffset4)
          sText += AkelPad.GetTextRange(nOffset3, nOffset4, 2 /*\n*/) + "\n";
      }
      else
      {
        if (nCmd == 5)
          sText += AkelPad.MemRead(lpIndex3, DT_DWORD) + ",";
        else
          oLine[AkelPad.MemRead(lpIndex3, DT_DWORD)] = true;
      }

      if (SendMessage(hEditWnd, 3133 /*AEM_INDEXCOMPARE*/, lpIndex1, lpIndex4) == -1)
      {
        AkelPad.MemCopy(lpIndex1, AkelPad.MemRead(lpIndex4, DT_DWORD), DT_DWORD);
        AkelPad.MemCopy(_PtrAdd(lpIndex1, _X64 ?  8 : 4), AkelPad.MemRead(_PtrAdd(lpIndex4, _X64 ?  8 : 4), DT_QWORD), DT_QWORD);
        AkelPad.MemCopy(_PtrAdd(lpIndex1, _X64 ? 16 : 8), AkelPad.MemRead(_PtrAdd(lpIndex4, _X64 ? 16 : 8), DT_DWORD), DT_DWORD);
      }
      else if (! SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 22 /*AEGI_NEXTCHAR*/, lpIndex1))
        break;

      if (oSys.Call("User32::PeekMessageW", lpMsg, hButton, 513 /*WM_LBUTTONDOWN*/, 513 /*WM_LBUTTONDOWN*/, 0x1 /*PM_REMOVE*/))
      {
        bContinue = false;
        break;
      }
    }

    if (nCmd <= 2)
    {
      AkelPad.Call("Log::Output", 4, sText, sText.length);
      sText = "";
    }
    else if (nCmd >= 5)
    {
      if (bContinue)
      {
        if (nCmd == 6)
        {
          AkelPad.CallW("LineBoard::Main", 14, hEditWnd, hEditDoc); //Delete all bookmarks

          for (i in oLine)
            sText = sText.replace("," + i + ",", ",");

          sText = sText.substr(1);
        }

        AkelPad.CallW("LineBoard::Main", 13, hEditWnd, hEditDoc, sText); //Set bookmarks
        sText = "";
      }

      if (bWordWrap)
        AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
    }

    EnableMainWnd(1, hEditWnd);
  }
  while (bContinue && (nFRF & FRF_ALLFILES) && ((lpFrameCurr = SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0x10 /*FWA_NEXT*/, lpFrameCurr)) != lpFrameStart))

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

  if (nCmd <= 2)
    AkelPad.Call("Log::Output", 4, bContinue ? sTxtTotalFound + nCountAll : "...", -1);
  else if (bContinue)
  {
    if (nCmd == 3)
      AkelPad.SetClipboardText(sText);
    else if (nCmd == 4)
    {
      AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 1 /*lParam=TRUE*/);
      AkelPad.ReplaceSel(sText);
    }
  }

  AkelPad.MemFree(lpMsg);
  AkelPad.MemFree(lpWhat);
  AkelPad.MemFree(lpFind);
  oSys.Call("User32::SetWindowTextW", hButton, aDlg[nID].T);
  Count_EnableButtons(aButton);
}

function EnableMainWnd(bEnable, hEditWnd)
{
  oSys.Call("User32::EnableWindow", hMainWnd, bEnable);
  SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, bEnable, 0);
  SendMessage(hEditWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, ! bEnable);

  if (bEnable)
    oSys.Call("User32::InvalidateRect", hEditWnd, 0, 1);
}

function ShowLineBoardPanel()
{
  var lpVisible = AkelPad.MemAlloc(4);

  AkelPad.Call("LineBoard::Main", 4, lpVisible);

  if (! AkelPad.MemRead(lpVisible, DT_DWORD))
    AkelPad.Call("LineBoard::Main", 4);

  AkelPad.MemFree(lpVisible);
}

function GetBookmarks(hEditWnd, hEditDoc)
{
  var lpLength  = AkelPad.MemAlloc(4 /*sizeof(int)*/);
  var sBookmark = "";
  var lpBookmark;
  var nLength;

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

  if ((nLength = AkelPad.MemRead(lpLength, 3 /*DT_DWORD*/)) > 1)
  {
    lpBookmark = AkelPad.MemAlloc(nLength * 2 /*sizeof(wchar_t)*/);
    AkelPad.CallW("LineBoard::Main", 12, hEditWnd, hEditDoc, lpBookmark, 0);
    sBookmark = AkelPad.MemRead(lpBookmark, 1 /*DT_UNICODE*/);
    AkelPad.MemFree(lpBookmark);
  }

  AkelPad.MemFree(lpLength);

  return sBookmark;
}

function FRTemplates()
{
  var nX, nY;
  var sTitle;
  var hWndOwn;

  if (hDlg)
  {
    oSys.Call("User32::EnableWindow", hDlg, 0);
    oSys.Call("User32::GetWindowRect", GetDlgItem(hDlg, IDC_SEARCH_MATCHCASE), lpBuffer);
    nX = nFRTX + AkelPad.MemRead(_PtrAdd(lpBuffer, 0), DT_DWORD);
    nY = nFRTY + AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD);
    sTitle  = sTxtTemplates + "/" + sTxtBatches;
    hWndOwn = hDlg;
  }
  else
  {
    nX = nBRX;
    nY = nBRY;
    sTitle  = sTxtBatchReplace;
    hWndOwn = hMainWnd;
    aWnd[IDOKB].T = sTxtClose;
  }

  oSys.Call("user32::CreateWindowExW",
    0,            //dwExStyle
    sClass,       //lpClassName
    sTitle,       //lpWindowName
    0x90CC0000,   //dwStyle=WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX
    nX,           //x
    nY,           //y
    nFRTW,        //nWidth
    nFRTH,        //nHeight
    hWndOwn,      //hWndParent
    0,            //hMenu
    hInstDLL,     //hInstance
    CallbackFRT); //Script function callback. To use it class must be registered by WindowRegisterClass.

  if (! hDlg)
    AkelPad.WindowGetMessage();
}

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

  if (uMsg == 1 /*WM_CREATE*/)
  {
    hWndFRT = hWnd;
    InitDialogFRT();
  }

  else if (uMsg == 0x8001 /*WM_APP+1*/)
    oSys.Call("User32::SetFocus", aWnd[lParam].HWND);

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

  else if (uMsg == 7 /*WM_SETFOCUS*/)
  {
    oSys.Call("User32::SetFocus", hFocus);
    EnableButtonsFRT();
    SetSearchOptionsFRT();
  }

  else if (uMsg == 36 /*WM_GETMINMAXINFO*/)
  {
    AkelPad.MemCopy(_PtrAdd(lParam, 24), nFRTMinW, DT_DWORD); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(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*/)
  {
    nID = GetDlgCtrlID(oSys.Call("User32::GetFocus"));

    if (wParam == 0x09 /*VK_TAB*/)
    {
      if (Ctrl())
      {
        if (Shift())
          nBR = (nBR == 0) ? aBR.length - 1 : nBR - 1;
        else
          nBR = (nBR == aBR.length - 1) ? 0 : nBR + 1;

        SendMessage(aWnd[IDBRTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nBR, 0);
        oSys.Call("User32::SetFocus", aWnd[IDBRLV].HWND);
      }
    }
    else if ((wParam >= 0x31 /*1 key*/) && (wParam <= 0x39 /*9 key*/) || (wParam >= 0x61 /*VK_NUMPAD1*/) && (wParam <= 0x69 /*VK_NUMPAD9*/))
    {
      if (Ctrl())
      {
        nBR = wParam - ((wParam <= 0x39) ? 0x31 : 0x61);
        SendMessage(aWnd[IDBRTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nBR, 0);

        if ((nID >= IDFRTLV) && (nID <= IDDIRALLB))
          oSys.Call("User32::SetFocus", aWnd[nID].HWND);
      }
    }
    else if (wParam == 0x70 /*VK_F1*/)
    {
      if (oSys.Call("User32::IsWindowVisible", aWnd[IDHELP1L].HWND))
      {
        if (Ctrl() || Shift())
          AkelHelp(GetAkelHelpFile());
        else
        {
          if (nID == IDWITHE)
            HelpMenu(0, IDHELP2L, SendMessage(aWnd[IDREGEXPB].HWND, 240 /*BM_GETCHECK*/, 0, 0));
          else
          {
            oSys.Call("User32::SetFocus", aWnd[IDWHATE].HWND);
            HelpMenu(0, IDHELP1L, SendMessage(aWnd[IDREGEXPB].HWND, 240 /*BM_GETCHECK*/, 0, 0));
          }
        }
      }
    }
    else if (wParam == 0x71 /*VK_F2*/)
    {
      if (nID == IDFRTLV)
      {
        if ((! Ctrl()) && (! Shift()))
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDFRTRENB, aWnd[IDFRTRENB].HWND);
      }
      else if ((nID == IDBRTC) || (nID == IDBRLV))
      {
        if ((! Ctrl()) && (! Shift()))
          RenameBR();
      }
    }
    else if (wParam == 0x72 /*VK_F3*/)
    {
      if (! Ctrl())
      {
        nFRTSel = GetCurSelLV(IDFRTLV);
        if (Shift())
        {
          if (nFRTSel > 0)
            --nFRTSel;
        }
        else
        {
          if (nFRTSel < GetItemCountLV(IDFRTLV) - 1)
            ++nFRTSel;
        }

        SetCurSelLV(IDFRTLV, nFRTSel);
      }
    }
    else if (wParam == 0x2D /*VK_INSERT*/)
    {
      if (nID == IDFRTLV)
      {
        if (Ctrl() || Shift())
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDFRTADDB, aWnd[IDFRTADDB].HWND);
        else
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDFRTNEWB, aWnd[IDFRTNEWB].HWND);
      }
    }
    else if (wParam == 0x2E /*VK_DELETE*/)
    {
      if (nID == IDFRTLV)
      {
        if (Ctrl() || Shift())
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDFRTDELB, aWnd[IDFRTDELB].HWND);
      }
      else if (nID == IDBRLV)
      {
        if (Ctrl() || Shift())
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDBRDELB, aWnd[IDBRDELB].HWND);
      }
    }
    else if (wParam == 0x46 /*F key*/)
    {
      if ((nID == IDWHATE) || (nID == IDWITHE))
      {
        if (Ctrl() && (! Shift()) && (! Alt()))
        {
          bAEFont = ! bAEFont;
          SetEditFontFRT();
        }
      }
    }
    else if (wParam == 0x0D /*VK_RETURN*/)
    {
      if ((nID >= IDFRTLV) && (nID <= IDBRLV) || (nID >= IDBRENABLEB) && (nID <= IDBRAWMB))
      {
        if ((! Ctrl()) && (! Shift()))
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDOKB, aWnd[IDOKB].HWND);
      }
    }
  }

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

    if (wParam == 0x2E /*VK_DELETE*/)
    {
      if (nID == IDFRTLV)
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDFRTDELB, aWnd[IDFRTDELB].HWND);
      else if (nID == IDBRLV)
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDBRDELB, aWnd[IDBRDELB].HWND);
    }
    else if (wParam == 0x27 /*VK_RIGHT*/)
    {
      if (! Shift())
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDTOBATCH, aWnd[IDTOBATCH].HWND);
    }
    else if (wParam == 0x26 /*VK_UP*/)
    {
      if (nID == IDFRTLV)
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDFRTUPB, aWnd[IDFRTUPB].HWND);
      else if (nID == IDBRLV)
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDBRUPB, aWnd[IDBRUPB].HWND);
    }
    else if (wParam == 0x28 /*VK_DOWN*/)
    {
      if (nID == IDFRTLV)
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDFRTDOWNB, aWnd[IDFRTDOWNB].HWND);
      else if (nID == IDBRLV)
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDBRDOWNB, aWnd[IDBRDOWNB].HWND);
    }
  }

  else if (uMsg == 78 /*WM_NOTIFY*/)
  {
    if (wParam == IDFRTLV)
    {
      switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), DT_DWORD))
      {
        case -101 : //LVN_ITEMCHANGED
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, DT_DWORD) & 0x2 /*LVIS_SELECTED*/)
          {
            sName = GetTextLV(IDFRTLV, AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMLISTVIEW.iItem*/, DT_DWORD), 0);

            if (sName.toUpperCase() != GetTextLV(IDBRLV, GetCurSelLV(IDBRLV), 0).toUpperCase())
              SetCurSelLV(IDBRLV, FindItemLV(IDBRLV, sName, -1));

            RefreshViewFRT();
          }
          break;
        case -3 : //NM_DBLCLK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) != -1)
          {
            if (hDlg)
            {
              PostMessage(hWnd, 273 /*WM_COMMAND*/, IDOKB, aWnd[IDOKB].HWND);
              break;
            }
          }
        case -2 : //NM_CLICK
        case -5 : //NM_RCLICK
        case -6 : //NM_RDBLCLK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) == -1)
            SetCurSelLV(IDFRTLV, GetCurFocLV(IDFRTLV));
          break;
        case -7 : //NM_SETFOCUS
          EnableButtonsFRT();
          break;
        case -108 : //LVN_COLUMNCLICK
          HeaderLVMenu(aWnd[IDFRTLV].HWND, -1, -1);
          break;
      }
    }
    else if (wParam == IDBRLV)
    {
      switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), DT_DWORD))
      {
        case -101 : //LVN_ITEMCHANGED
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, DT_DWORD) & 0x2 /*LVIS_SELECTED*/)
          {
            sName = GetTextLV(IDBRLV, AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMLISTVIEW.iItem*/, DT_DWORD), 0);

            if (sName.toUpperCase() != GetTextLV(IDFRTLV, GetCurSelLV(IDFRTLV), 0).toUpperCase())
              SetCurSelLV(IDFRTLV, FindItemLV(IDFRTLV, sName, -1));

            EnableButtonsFRT();
          }
          else if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, DT_DWORD) & 0xF000 /*LVIS_STATEIMAGEMASK*/)
          {
            if (bCheckBRLV)
            {
              GetCheckBRLV(AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMLISTVIEW.iItem*/, DT_DWORD));
              EnableButtonsFRT();
            }
          }
          break;
        case -3 : //NM_DBLCLK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) != -1)
          {
            if (hDlg)
            {
              PostMessage(hWnd, 273 /*WM_COMMAND*/, IDOKB, aWnd[IDOKB].HWND);
              break;
            }
          }
        case -2 : //NM_CLICK
        case -5 : //NM_RCLICK
        case -6 : //NM_RDBLCLK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) == -1)
            SetCurSelLV(IDBRLV, GetCurFocLV(IDBRLV));
          break;
        case -7 : //NM_SETFOCUS
          EnableButtonsFRT();
          break;
        case -108 : //LVN_COLUMNCLICK
          HeaderLVMenu(aWnd[IDBRLV].HWND, -1, -1);
          break;
      }
    }
    else if (wParam == IDBRTC)
    {
      switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), DT_DWORD))
      {
        case -551 : //TCN_SELCHANGE
          nBR = SendMessage(aWnd[IDBRTC].HWND, 4875 /*TCM_GETCURSEL*/, 0, 0);
          SetNameBR();
          FillBRLV();
          EnableButtonsFRT();
          oSys.Call("User32::SetFocus", aWnd[IDBRLV].HWND);
          break;
        case -5 : //NM_RCLICK
          TabMenu();
          break;
      }
    }
    else if ((wParam == IDHELP1L) || (wParam == IDHELP2L))
    {
      if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), DT_DWORD) == -2 /*NM_CLICK*/)
        HelpMenu(0, wParam, SendMessage(aWnd[IDREGEXPB].HWND, 240 /*BM_GETCHECK*/, 0, 0));
    }
  }

  else if (uMsg == 123 /*WM_CONTEXTMENU*/)
  {
    if ((wParam == aWnd[IDWHATE].HWND) || (wParam == aWnd[IDWITHE].HWND))
      EditMenu(wParam, LoWord(lParam), HiWord(lParam));
    else if ((wParam == aWnd[IDFRTLV].HWND) || (wParam == aWnd[IDBRLV].HWND))
      HeaderLVMenu(wParam, LoWord(lParam), HiWord(lParam));
  }

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

    if ((nID == IDWHATE) || (nID == IDWITHE))
    {
      if (nCode == 256 /*EN_SETFOCUS*/)
        EnableButtonsFRT();
      else if ((nCode == 768 /*EN_CHANGE*/) && (oSys.Call("User32::GetFocus") == lParam))
      {
        oSys.Call("User32::GetWindowTextW", lParam, lpBuffer, nBufSize / 2);
        SetParametersFRTToLV(nID - IDWHATE + 1, AkelPad.MemRead(lpBuffer, DT_UNICODE).replace(/[\r\n\t]/g, ""))
        EnableButtonsFRT();
      }
    }
    else if ((nID >= IDMATCHB) && (nID <= IDESCSEQB))
    {
      CheckButtonsFRT(nID);
      EnableButtonsFRT();
    }
    else if ((nID >= IDDIRDOWNB) && (nID <= IDDIRALLB))
      SetSearchDirectionFRT(nID);
    else if ((nID >= IDFRTNEWB) && (nID <= IDFRTRENB))
    {
      if (oSys.Call("User32::IsWindowEnabled", lParam))
      {
        NewAddRenameFRT(nID);
        PostMessage(hWnd, 0x8001 /*WM_APP+1*/, 0, IDFRTLV);
      }
    }
    else if ((nID == IDFRTUPB) || (nID == IDFRTDOWNB))
    {
      if (oSys.Call("User32::IsWindowEnabled", lParam))
      {
        UpDownFRT(nID);
        PostMessage(hWnd, 0x8001 /*WM_APP+1*/, 0, IDFRTLV);
      }
    }
    else if (nID == IDFRTDELB)
    {
      if (oSys.Call("User32::IsWindowEnabled", lParam))
      {
        RemoveFRT();
        PostMessage(hWnd, 0x8001 /*WM_APP+1*/, 0, IDFRTLV);
      }
    }
    else if (nID == IDCHECKEXPB)
    {
      if (oSys.Call("User32::IsWindowEnabled", lParam))
        CheckExpressionFRT(GetCurSelLV(IDFRTLV), 1);
    }
    else if (nID == IDTOBATCH)
    {
      if (oSys.Call("User32::IsWindowEnabled", lParam))
        AddToBatch();
    }
    else if (nID == IDOKB)
    {
      if (oSys.Call("User32::IsWindowEnabled", lParam))
      {
        if (hDlg)
          SetFRTtoFR();

        PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
      }
    }
    else if ((nID == IDBRUPB) || (nID == IDBRDOWNB))
    {
      if (oSys.Call("User32::IsWindowEnabled", lParam))
      {
        UpDownBR(nID);
        PostMessage(hWnd, 0x8001 /*WM_APP+1*/, 0, IDBRLV);
      }
    }
    else if (nID == IDBRDELB)
    {
      if (oSys.Call("User32::IsWindowEnabled", lParam))
      {
        RemoveBR();
        PostMessage(hWnd, 0x8001 /*WM_APP+1*/, 0, IDBRLV);
      }
    }
    else if (nID == IDBRALLB)
    {
      if (oSys.Call("User32::IsWindowEnabled", lParam))
        BatchReplaceAll();

      nBatchNum = 0;
    }
    else if (nID == IDBRENABLEB)
      SetCheckBRLV(-1, SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0));
    else if ((nID == IDBRACDB) || (nID == IDBRAWMB))
    {
      nFRF = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0) ^ ((nID == IDBRACDB) ? FRF_REPLACEALLANDCLOSE : FRF_REPLACEALLNOMSG);
      SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 228 /*MIS_SEARCHOPTIONS*/, nFRF);
    }
    else if (nID == IDCANCEL)
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16 /*WM_CLOSE*/)
  {
    SaveFRT();
    AkelPad.WindowUnsubClass(aWnd[IDWHATE].HWND);
    AkelPad.WindowUnsubClass(aWnd[IDWITHE].HWND);
    if (hDlg)
      oSys.Call("User32::EnableWindow", hDlg, 1);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

  else if (uMsg == 2 /*WM_DESTROY*/)
  {
    if (! hDlg)
      oSys.Call("User32::PostQuitMessage", 0);
  }

  return 0;
}

function InitDialogFRT()
{
  var lpTCITEM;
  var hDC;
  var i;

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

  if (! hDlg)
  {
    hDC = oSys.Call("User32::GetDC", hWndFRT);
    oSys.Call("Gdi32::SelectObject", hDC, hGuiFont);
    oSys.Call("Gdi32::SetMapMode", hDC, 1 /*MM_TEXT*/);
    oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, aDlg[IDHELP1L].T, aDlg[IDHELP1L].T.length, lpBuffer);
    aDlg[IDHELP1L].W = AkelPad.MemRead(_PtrAdd(lpBuffer, 0), DT_DWORD);
    aDlg[IDHELP1L].H = AkelPad.MemRead(_PtrAdd(lpBuffer, 4), DT_DWORD);
    oSys.Call("User32::ReleaseDC", hWndFRT, hDC);
  }

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

  SetEditFontFRT();

  SendMessage(aWnd[IDFRTLV].HWND, 4150 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0, 0x0421 /*LVS_EX_INFOTIP|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES*/);
  SendMessage(aWnd[IDBRLV].HWND,  4150 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0, 0x0425 /*LVS_EX_INFOTIP|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES|LVS_EX_GRIDLINES*/);
  InsertColumnsLV(IDFRTLV);
  InsertColumnsLV(IDBRLV);
  SetSortFRTLV();
  FillFRTLV();
  FillBRLV();

  //Tab
  lpTCITEM = AkelPad.MemAlloc(_X64 ? 40 : 28 /*sizeof(TCITEM)*/);
  AkelPad.MemCopy(_PtrAdd(lpTCITEM, 0),     1 /*TCIF_TEXT*/,   DT_DWORD); //mask
  AkelPad.MemCopy(_PtrAdd(lpTCITEM, _X64 ? 16 : 12), lpBuffer, DT_QWORD); //pszText

  for (i = 0; i < aBR.length; ++i)
  {
    AkelPad.MemCopy(lpBuffer, (i + 1).toString(), DT_UNICODE);
    SendMessage(aWnd[IDBRTC].HWND, 4926 /*TCM_INSERTITEMW*/, i, lpTCITEM);
  }

  SendMessage(aWnd[IDBRTC].HWND, 4905 /*TCM_SETITEMSIZE*/, 0, MkLong(Scale.X(25), Scale.Y(20)));
  SendMessage(aWnd[IDBRTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nBR, 0);
  SetNameBR();
  AkelPad.MemFree(lpTCITEM);

  for (i = IDDIRDOWNB; i <= IDDIRALLB; ++i)
    oSys.Call("User32::SetWindowLongW", aWnd[i].HWND, -16 /*GWL_STYLE*/, aWnd[i].S);

  hFocus = aWnd[IDFRTLV].HWND;
  oSys.Call("User32::SetFocus", hFocus);

  if (nBatchNum)
    PostMessage(hWndFRT, 273 /*WM_COMMAND*/, IDBRALLB, aWnd[IDBRALLB].HWND);
}

function EditCallbackFRT(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if (wParam == 0x09 /*VK_TAB*/)
      AkelPad.WindowNoNextProc(aSubClassFRT[GetDlgCtrlID(hWnd)]);
  }
  else if (uMsg == 260 /*WM_SYSKEYDOWN*/)
  {
    if (wParam == 0x27 /*VK_RIGHT*/)
    {
      if (! Shift())
        AkelPad.WindowNoNextProc(aSubClassFRT[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(_PtrAdd(lpBuffer, 0), AkelPad.MemRead(_PtrAdd(lpBuffer,  8), DT_DWORD) - oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/), DT_DWORD);
    AkelPad.MemCopy(_PtrAdd(lpBuffer, 4), AkelPad.MemRead(_PtrAdd(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 nW16   = Scale.X(16);
  var nW75   = Scale.X(75);
  var nW90   = Scale.X(90);
  var nW145  = Scale.X(145);
  var nH5    = Scale.Y(5);
  var nH10   = Scale.Y(10);
  var nH13   = Scale.Y(13);
  var nH16   = Scale.Y(16);
  var nH18   = Scale.Y(18);
  var nH20   = Scale.Y(20);
  var nH23   = Scale.Y(23);
  var nH25   = Scale.Y(25);
  var nLW    = Math.round((nW - nW10 * 4) / 3) - nW10;
  var nEW    = nW - nLW * 2 - nW10 * 4;
  var nEH    = Math.round((nH - nH25 * 2 - nH23 * 2 - nH10 * 14) / 2);
  var nX;
  var i;

  oSys.Call("User32::SetWindowPos", aWnd[IDFRTS].HWND, 0,
    nW10,
    nH10,
    nLW,
    nH20,
    nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDFRTLV].HWND, 0,
    nW10,
    nH20 + nH10,
    nLW,
    nH - nH23 * 2 - nH20 - nH10 * 3,
    nFlags);
  for (i = IDWHATS; i <= IDWITHS; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0,
      nLW + nW10 * 2,
      nH10 + (nH25 + nEH) * (i - IDWHATS),
      nW145,
      nH13,
      nFlags);
  for (i = IDHELP1L; i <= IDHELP2L; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0,
      nLW + nW10 * 2 + nEW - aDlg[IDHELP1L].W,
      nH10 + (nH25 + nEH) * (i - IDHELP1L),
      aDlg[IDHELP1L].W,
      aDlg[IDHELP1L].H,
      nFlags);
  for (i = IDWHATE; i <= IDWITHE; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0,
      nLW + nW10 * 2,
      nH25 + (nH25 + nEH) * (i - IDWHATE),
      nEW,
      nEH,
      nFlags);
  for (i = IDMATCHB; i <= IDREGEXPB; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0,
      nLW + nW10 * 2,
      (nH25 + nEH) * 2 + nH10 + nH20 * (i - IDMATCHB),
      nW145,
      nH16,
      nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDDOTNLB].HWND, 0,
    nLW + nW10 * 2 + nW16,
    (nH25 + nEH) * 2 + nH10 + nH20 * 3,
    nW145 - nW16,
    nH16,
    nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDESCSEQB].HWND, 0,
    nLW + nW10 * 2,
    (nH25 + nEH) * 2 + nH10 + nH20 * 4,
    nW145,
    nH16,
    nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDDIRG].HWND, 0,
    nLW + nEW - nW90,
    (nH25 + nEH) * 2 + nH10,
    nW90 + nW10 * 2,
    nH18 * 6,
    nFlags);
  for (i = IDDIRDOWNB; i <= IDDIRALLB; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0,
      nLW + nEW - nW90 + nW10,
      (nH25 + nEH + nH10) * 2 + nH5 + nH18 * (i - IDDIRDOWNB),
      nW90,
      nH16,
      nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDBRS].HWND, 0,
    nW - nLW - nW10,
    nH10,
    nLW,
    nH20,
    nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDBRTC].HWND, 0,
    nW - nLW - nW10,
    nH20 + nH10,
    nLW,
    nH20,
    nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDBRNAMES].HWND, 0,
    nW - nLW - nW10,
    nH20 * 2  + nH10,
    nLW,
    Scale.Y(21),
    nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDBRLV].HWND, 0,
    nW - nLW - nW10,
    nH20 * 3 + nH10,
    nLW,
    nH - nH20 * 3 - (nH23 + nH16 + nH10) * 2 - nH5 * 4,
    nFlags);
  nX = nW10 + Math.round((nLW - (nW75 * 3 + nW5 * 2)) / 2);
  for (i = IDFRTNEWB; i <= IDFRTRENB; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0,
      nX + (nW75 + nW5) * (i - IDFRTNEWB),
      nH - nH23 * 2 - nH10 - nH5,
      nW75,
      nH23,
      nFlags);
  for (i = IDFRTUPB; i <= IDFRTDELB; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0,
      nX + (nW75 + nW5) * (i - IDFRTUPB),
      nH - nH23 - nH10,
      nW75,
      nH23,
      nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDCHECKEXPB].HWND, 0,
    Math.round((nW - (nW75 * 2 + nW5)) / 2),
    nH - nH23 * 2 - nH5 - nH10,
    nW75 * 2 + nW5,
    nH23,
    nFlags);
  for (i = IDTOBATCH; i <= IDOKB; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0,
      Math.round((nW - (nW75 * 2 + nW5)) / 2) + (nW75 + nW5) * (i - IDTOBATCH),
      nH - nH23 - nH10,
      nW75,
      nH23,
      nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDBRENABLEB].HWND, 0,
    nW - nLW - nW10,
    nH - (nH23 + nH16) * 2 - nH10 - nH5 * 3,
    nW75 * 2,
    nH16,
    nFlags);
  nX = nW - nLW - nW10 + Math.round((nLW - (nW75 * 3 + nW5 * 2)) / 2);
  for (i = IDBRUPB; i <= IDBRDELB; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i].HWND, 0,
      nX + (nW75 + nW5) * (i - IDBRUPB),
      nH - nH23 * 2 - nH16 - nH10 - nH5 * 2,
      nW75,
      nH23,
      nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDBRALLB].HWND, 0,
    nX,
    nH - nH23 - nH16 - nH10 - nH5,
    nW75 * 3 + nW5 * 2,
    nH23,
    nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDBRACDB].HWND, 0,
    nX,
    nH - nH16 - nH10,
    Scale.X(115),
    nH16,
    nFlags);
  oSys.Call("User32::SetWindowPos", aWnd[IDBRAWMB].HWND, 0,
    nX + Scale.X(130),
    nH - nH16 - nH10,
    Scale.X(105),
    nH16,
    nFlags);

  SendMessage(aWnd[IDFRTLV].HWND, 4115 /*LVM_ENSUREVISIBLE*/, GetCurSelLV(IDFRTLV), false);
  SendMessage(aWnd[IDBRLV].HWND,  4115 /*LVM_ENSUREVISIBLE*/, GetCurSelLV(IDBRLV),  false);
  SendMessage(aWnd[IDWHATE].HWND, 3242 /*AEM_SETWORDWRAP*/, 0x2 /*AEWW_SYMBOL*/, 0);
  SendMessage(aWnd[IDWITHE].HWND, 3242 /*AEM_SETWORDWRAP*/, 0x2 /*AEWW_SYMBOL*/, 0);
  oSys.Call("user32::InvalidateRect", hWndFRT, 0, true);
}

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

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

  for (i = IDMATCHB; i <= IDESCSEQB; ++i)
  {
    SendMessage(aWnd[i].HWND, 241 /*BM_SETCHECK*/, parseInt(sConds.substr(i - IDMATCHB, 1)), 0);
    oSys.Call("User32::EnableWindow", aWnd[i].HWND, (nItem > -1));
  }

  EnableButtonsFRT();
  ShowHelpLinksFRT();
}

function EnableButtonsFRT()
{
  var nItemFRT = GetCurSelLV(IDFRTLV);
  var nItemBR  = GetCurSelLV(IDBRLV);
  var nCheckBR = 0;
  var i;

  for (i = 0; i < aBRCB[nBR].length; ++i)
    nCheckBR += aBRCB[nBR][i];

  oSys.Call("User32::EnableWindow", aWnd[IDDOTNLB].HWND,    SendMessage(aWnd[IDREGEXPB].HWND, 240 /*BM_GETCHECK*/, 0, 0));
  oSys.Call("User32::EnableWindow", aWnd[IDDIRALLB].HWND,   AkelPad.IsMDI());
  oSys.Call("User32::EnableWindow", aWnd[IDFRTADDB].HWND,   hDlg);
  oSys.Call("User32::EnableWindow", aWnd[IDFRTRENB].HWND,   (nItemFRT > -1));
  oSys.Call("User32::EnableWindow", aWnd[IDFRTUPB].HWND,    (nItemFRT > 0) && (! bFRTSort));
  oSys.Call("User32::EnableWindow", aWnd[IDFRTDOWNB].HWND,  (nItemFRT > -1) && (nItemFRT < GetItemCountLV(IDFRTLV) - 1) && (! bFRTSort));
  oSys.Call("User32::EnableWindow", aWnd[IDFRTDELB].HWND,   (nItemFRT > -1));
  oSys.Call("User32::EnableWindow", aWnd[IDCHECKEXPB].HWND, (nItemFRT > -1) && GetTextLV(IDFRTLV, nItemFRT, 1).length && ((GetTextLV(IDFRTLV, nItemFRT, 3).charAt(2) == "1") || (GetTextLV(IDFRTLV, nItemFRT, 3).charAt(4) == "1")));
  oSys.Call("User32::EnableWindow", aWnd[IDTOBATCH].HWND,   (nItemFRT > -1));
  oSys.Call("User32::EnableWindow", aWnd[IDOKB].HWND,       (nItemFRT > -1) || (! hDlg));
  oSys.Call("User32::EnableWindow", aWnd[IDBRUPB].HWND,     nItemBR > 0);
  oSys.Call("User32::EnableWindow", aWnd[IDBRDOWNB].HWND,   (nItemBR > -1) && (nItemBR < aBR[nBR].length - 1));
  oSys.Call("User32::EnableWindow", aWnd[IDBRDELB].HWND,    (nItemBR > -1) && aBR[nBR].length);
  oSys.Call("User32::EnableWindow", aWnd[IDBRALLB].HWND,    aBR[nBR].length && nCheckBR && (! AkelPad.GetEditReadOnly(0)));
  oSys.Call("User32::EnableWindow", aWnd[IDBRENABLEB].HWND, aBR[nBR].length);

  SendMessage(aWnd[IDBRENABLEB].HWND, 241 /*BM_SETCHECK*/, aBR[nBR].length && (nCheckBR == aBRCB[nBR].length), 0);

  for (i = IDFRTNEWB; i <= IDBRALLB; ++i)
    SendMessage(aWnd[i].HWND, 244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);

  if ((nItemFRT > -1) || (! hDlg))
    SendMessage(aWnd[IDOKB].HWND, 244 /*BM_SETSTYLE*/, 1 /*BS_DRFPUSHBUTTON*/, 1);
}

function SetSearchOptionsFRT()
{
  var nID;

  nFRF = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0);

  if (nFRF & FRF_ALLFILES)
    nID = IDDIRALLB;
  else if (nFRF & FRF_SELECTION)
    nID = IDDIRSELB;
  else if ((nFRF & FRF_BEGINNING) || hDlg && (SendDlgItemMessage(hDlg, IDC_SEARCH_BEGINNING, 242 /*BM_GETSTATE*/, 0, 0) & 4 /*BST_PUSHED*/))
    nID = IDDIRBEGB;
  else if (nFRF & FRF_UP)
    nID = IDDIRUPB;
  else
    nID = IDDIRDOWNB;

  oSys.Call("User32::CheckRadioButton", hWndFRT, IDDIRDOWNB, IDDIRALLB, nID);

  SendMessage(aWnd[IDBRACDB].HWND, 241 /*BM_SETCHECK*/, nFRF & FRF_REPLACEALLANDCLOSE, 0);
  SendMessage(aWnd[IDBRAWMB].HWND, 241 /*BM_SETCHECK*/, nFRF & FRF_REPLACEALLNOMSG, 0);
}

function SetSearchDirectionFRT(nID)
{
  var nDlgID;

  nFRF = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 228 /*MI_SEARCHOPTIONS*/, 0) & ~(FRF_DOWN | FRF_UP | FRF_BEGINNING | FRF_SELECTION | FRF_ALLFILES);

  if (nID == IDDIRDOWNB)
  {
    nFRF |= FRF_DOWN
    nDlgID = IDC_SEARCH_FORWARD;
  }
  else if (nID == IDDIRUPB)
  {
    nFRF |= FRF_UP;
    nDlgID = IDC_SEARCH_BACKWARD;
  }
  else if (nID == IDDIRBEGB)
  {
    nFRF |= FRF_DOWN | FRF_BEGINNING;
    nDlgID = IDC_SEARCH_BEGINNING;
  }
  else if (nID == IDDIRSELB)
  {
    nFRF |= FRF_DOWN | FRF_SELECTION;
    nDlgID = IDC_SEARCH_INSEL;
  }
  else
  {
    nFRF |= FRF_DOWN | FRF_BEGINNING | FRF_ALLFILES;
    nDlgID = IDC_SEARCH_ALLFILES;
  }

  oSys.Call("User32::SetWindowLongW", aWnd[nID].HWND, -16 /*GWL_STYLE*/, aWnd[nID].S);

  if (hDlg)
  {
    oSys.Call("User32::CheckRadioButton", hDlg, IDC_SEARCH_BACKWARD, IDC_SEARCH_ALLFILES, nDlgID);
    SendMessage(hDlg, 273 /*WM_COMMAND*/, nDlgID, GetDlgItem(hDlg, nDlgID));
  }
  else
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 228 /*MIS_SEARCHOPTIONS*/, nFRF);
}

function SetParametersFRTToLV(nCol, sText)
{
  var nItem = GetCurSelLV(IDFRTLV);
  var sName = GetTextLV(IDFRTLV, nItem, 0).toUpperCase();
  var i;

  SetTextLV(IDFRTLV, nItem, nCol, sText);

  for (i = 0; i < aBR[nBR].length; ++i)
  {
    if (aBR[nBR][i].toUpperCase() == sName)
      SetTextLV(IDBRLV, i, nCol, sText);
  }
}

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

  if ((nID == IDREGEXPB) && SendMessage(aWnd[IDREGEXPB].HWND, 240 /*BM_GETCHECK*/, 0, 0))
    SendMessage(aWnd[IDESCSEQB].HWND, 241 /*BM_SETCHECK*/, 0, 0);
  else if ((nID == IDESCSEQB) && SendMessage(aWnd[IDESCSEQB].HWND, 240 /*BM_GETCHECK*/, 0, 0))
    SendMessage(aWnd[IDREGEXPB].HWND, 241 /*BM_SETCHECK*/, 0, 0);

  ShowHelpLinksFRT();

  for (i = IDMATCHB; i <= IDESCSEQB; ++i)
    sConds += SendMessage(aWnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0).toString();

  SetParametersFRTToLV(3, sConds);
}

function ShowHelpLinksFRT()
{
  var bShow = SendMessage(aWnd[IDREGEXPB].HWND, 240 /*BM_GETCHECK*/, 0, 0) || SendMessage(aWnd[IDESCSEQB].HWND, 240 /*BM_GETCHECK*/, 0, 0);

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

function SetEditFontFRT()
{
  var hFont = bAEFont ? SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, 0, 0) : hGuiFont;

  SendMessage(aWnd[IDWHATE].HWND, 48 /*WM_SETFONT*/, hFont, 0);
  SendMessage(aWnd[IDWITHE].HWND, 48 /*WM_SETFONT*/, hFont, 0);
  oSys.Call("User32::InvalidateRect", aWnd[IDWHATE].HWND, 0, 1);
  oSys.Call("User32::InvalidateRect", aWnd[IDWITHE].HWND, 0, 1);
}

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

function GetCurFocLV(nID)
{
  return SendMessage(aWnd[nID].HWND, 4108 /*LVM_GETNEXTITEM*/, -1, 0x1 /*LVNI_FOCUSED*/);
}

function GetCurSelLV(nID)
{
  return SendMessage(aWnd[nID].HWND, 4108 /*LVM_GETNEXTITEM*/, -1, 0x2 /*LVNI_SELECTED*/);
}

function SetCurSelLV(nID, nItem)
{
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x3 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD); //stateMask

  if (nItem > -1)
  {
    AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x3 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD); //state
    SendMessage(aWnd[nID].HWND, 4139 /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
    SendMessage(aWnd[nID].HWND, 4115 /*LVM_ENSUREVISIBLE*/, nItem, false);
  }
  else
  {
    AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0, DT_DWORD);
    SendMessage(aWnd[nID].HWND, 4139 /*LVM_SETITEMSTATE*/, GetCurSelLV(nID), lpLVITEM);
  }
}

function GetTextLV(nID, nItem, nSubItem)
{
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), nSubItem, DT_DWORD);

  if (SendMessage(aWnd[nID].HWND, 4211 /*LVM_GETITEMTEXTW*/, nItem, lpLVITEM))
    return AkelPad.MemRead(lpBuffer, DT_UNICODE);

  return "";
}

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

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

Post by KDJ »

Minimize, maximize or restore tab in MDI mode.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=21150#p21150
// Version: 2013-08-23
// Author: KDJ
//
// *** Minimize/maximize/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 Dec 20, 2014 7:29 pm, edited 2 times in total.

Offline
Posts: 39
Joined: Fri Feb 08, 2013 6:49 am

Comparison checksum of selected texts

Post by akkorn »

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

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

Code: Select all

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

Code: Select all

-"Check CRC selected text" Call("Scripts::Main", 1, "CRC32txt.vbs") Icon(38)

Code: Select all

' [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]


Обсуждение скрипта, вопросы- все здесь:
viewtopic.php?t=1504
Last edited by akkorn on Mon Mar 18, 2013 6:34 pm, edited 29 times in total.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Code: Select all

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

// (c) Infocatcher 2013-2020
// Version: 0.1.3.1 - 2020-11-14
// Author: Infocatcher

//// 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 compare tool executable:
//                                                  - %AkelDir% - path to AkelPad directory
//                                                  - %AkelScripts% - path to scripts directory
//                                                  - <HKLM\…\key> - value from registry
//                                                  - path1|path2|path3 - to specify many paths
//   -cmd="<exe> /S=C <f1> <f2>"                  - set custom command line (example for Total Commander)
//   -save=true                                   - save (already saved, but modified) file before compare
//        =false                                  - (default) use temporary files for modified files
//   -temp="%AkelScripts%\temp"                   - path to temporary directory (%temp% by default)
//   -useTabsOrder=true                           - always compare left tab with right tab
//   -noBlink=true                                - disable blink in status bar (and just show "Select tab!" text)
//   -item="%m:%i"                                - check toolbar button or menu item

// 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!"
		},
		"Compare tool not found!": {
			ru: "Не удалось найти программу для сравнения!"
		},
		"Select tab!": {
			ru: "Выберите вкладку!"
		},
		"Not found file from first tab:\n": {
			ru: "Не найден файл из первой вкладки:\n"
		},
		"Not found file from second tab:\n": {
			ru: "Не найден файл из второй вкладки:\n"
		}
	};
	var lng = "en";
	switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
		case 0x19: lng = "ru";
	}
	_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 oSys = AkelPad.SystemFunction();
var fso = new ActiveXObject("Scripting.FileSystemObject");
var wsh = new ActiveXObject("WScript.Shell");

var hMainWnd = AkelPad.GetMainWnd();
var isMDI = AkelPad.IsMDI(); // WMD_MDI or WMD_PMDI
var isPMDI = isMDI == 2 /*WMD_PMDI*/;

if(hMainWnd && isMDI) {
	var lpFrame = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
	var lpFrame2;
	if(!lpFrame) {
		AkelPad.MessageBox(hMainWnd, _localize("No tabs!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
		WScript.Quit();
	}

	var item = new Item();
	item.check(true);

	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(
		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, "AkelPad.WindowSubClass() failed!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
	}
	item.check(false);
}
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(paths ? "Compare tool not found!" : "WinMerge not found!")
				+ "\n\n" + getWinMergePaths(),
			WScript.ScriptName,
			48 /*MB_ICONEXCLAMATION*/
		);
		return;
	}

	isPMDI && setRedraw(hMainWnd, false);
	var file  = getFile(lpFrame);
	var file2 = getFile(lpFrame2);
	isPMDI && setRedraw(hMainWnd, 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 is already opened, new process will be closed immediately,
		// so don't delete files too early
		WScript.Sleep(4000);
		while(!wm.Status)
			WScript.Sleep(1500);
		file.isTemp  && fso.DeleteFile(file);
		file2.isTemp && fso.DeleteFile(file2);
	}
}
function getFile(lpFrame) {
	isPMDI && AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame);

	var hWndEdit = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 2 /*FI_WNDEDIT*/, lpFrame);
	var hDocEdit = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 3 /*FI_DOCEDIT*/, lpFrame);
	var origFile = AkelPad.GetEditFile(hWndEdit);
	var file = origFile;
	if(!origFile || AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0)) {
		if(origFile && save)
			AkelPad.SaveFile(hWndEdit, origFile);
		else {
			var tempFile = file = getTempFile(hWndEdit, hDocEdit, 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(hWndEdit, 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 + "\n=> " + path
	}
	return out.join("\n");
}
function getTempFile(hWndEdit, hDocEdit, 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 = getExtension(hWndEdit, hDocEdit);
		fileName = "AkelPad_winMergeTabs_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) || fso.FolderExists(tmp));
	var out = new String(tmp);
	out.isTemp = true;
	return out;
}
function getExtension(hWndEdit, hDocEdit) {
	var alias = getCoderAlias(hWndEdit, hDocEdit);
	if(/\.[^.]+$/.test(alias))
		return RegExp.lastMatch;
	return ".txt";
}
function getCoderAlias(hWndEdit, hDocEdit) {
	if(
		!AkelPad.IsPluginRunning("Coder::HighLight")
		&& !AkelPad.IsPluginRunning("Coder::CodeFold")
		&& !AkelPad.IsPluginRunning("Coder::AutoComplete")
	)
		return "";
	// http://akelpad.sourceforge.net/forum/viewtopic.php?p=19363#p19363
	//hWndEdit = hWndEdit || AkelPad.GetEditWnd();
	//hDocEdit = 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) {
		return getRegistryValue(path) || 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 Item() {
	this.check = function() {};
	// "%m:%i" (legacy: "menu:%m:%i" or "toolbar:%m:%i")
	var itemData = AkelPad.GetArgValue("item", "").split(":");
	if(itemData[0] == "menu" || itemData[0] == "toolbar") // Legacy
		itemData.shift();
	if(itemData.length != 2)
		return;
	var hHandle = +itemData[0];
	var nItemID = +itemData[1];
	if(!hHandle || !nItemID)
		return;
	this.check = function(checked) {
		if(oSys.Call("User32::IsMenu", hHandle)) {
			var cmd = checked ? 0x8 /*MF_BYCOMMAND|MF_CHECKED*/ : 0 /*MF_BYCOMMAND|MF_UNCHECKED*/;
			oSys.call("user32::CheckMenuItem", hHandle, nItemID, cmd);
		}
		else {
			AkelPad.SendMessage(hHandle, 1026 /*TB_CHECKBUTTON*/, nItemID, checked);
		}
	};
}
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#p13656
	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 | 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 Nov 14, 2020 12:05 pm, edited 4 times in total.

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

Post by KDJ »

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

The script should be saved in Unicode format.
Required to include: BrowseForFolder_function.js and InputBox_function.js
All in one: KDJ.zip

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=22073#p22073
// Version: 2016-02-06
// Author: KDJ
//
// *** List of AkelPad Scripts methods (Scripts-*.txt files) ***
//
// Usage:
//   Call("Scripts::Main", 1, "AkelPadMethodsView.js")
//
// Required to include: BrowseForFolder_function.js and InputBox_function.js
//
// Keyboard and mouse:
//   Tab - rigth <-> left panel
//   Ctrl(+Shift)+Tab - next/previous item in methods list
//   F1 - menu
//   F4 - maximize/restore window (also Alt+Enter)
//   right click on method name or on edit window - context menu
//   double click on method name = "OK"
//
// Remark:
//   The script should be saved in Unicode format.

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

if (hDlg)
{
  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(_PtrAdd(lpLVITEM, _X64 ? 24 : 20), lpTextLV, 2 /*DT_QWORD*/);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 32 : 24), nTextMax, 3 /*DT_DWORD*/);

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

AkelPad.ScriptNoMutex();
AkelPad.WindowRegisterClass(sClass);

while (! bCloseDlg)
{
  bCloseDlg = true;

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

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

  SetForegroundWindow(hMainWnd);

  oSys.Call("User32::CreateWindowExW",
    0,               //dwExStyle
    sClass,          //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(sClass);
AkelPad.MemFree(lpTextLV);
AkelPad.MemFree(lpLVITEM);

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].C, //lpClassName
        aDlg[i].T, //lpWindowName
        aDlg[i].S, //dwStyle
        0,0,0,0,   //x, y, nWidth, nHeight
        hDlg,      //hWndParent
        i,         //ID
        hInstDLL,  //hInstance
        0);        //lpParam
      SetWindowFont(aDlg[i].HWND, hGuiFont);
    }

    CheckButtons();
    SetOptionsAE();

    InsertColumnLV();
    FillLV(nAPMSel, GetInputName(), true);

    oSys.Call("User32::SetFocus", aDlg[IDTEXT].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(_PtrAdd(lParam, 24), nDlgMinW, 3 /*DT_DWORD*/); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(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[IDTEXT].HWND);
        else
          oSys.Call("User32::SetFocus", aDlg[IDNAMELV].HWND);
      }
    }
    else if (wParam == 0x43 /*C key*/)
    {
      if  (Ctrl() && (! Alt()))
      {
        if (hFocus == aDlg[IDNAMELV].HWND)
        {
          if (Shift())
            InsertNameToAP();
          else
            CopytNameToCB();
        }
        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(_PtrAdd(lParam, _X64 ? 16 : 8), 3 /*DT_DWORD*/))
    {
      case -101 : //LVN_ITEMCHANGED
        if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, 3 /*DT_DWORD*/) & 0x2 /*LVIS_SELECTED*/)
        {
          nAPMSel = GetCurSelLV();
          SetWindowText(aDlg[IDTEXT].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(_PtrAdd(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(_PtrAdd(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[IDTEXT].HWND)
    {
      oSys.Call("User32::SetFocus", aDlg[IDTEXT].HWND);
      MenuText(LoWord(lParam), HiWord(lParam));
    }
  }

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

    if (nLowParam == IDTEXT)
    {
      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[IDTEXT].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)
{
  var lpPOINT;
  var lpAECHARRANGE;
  var nOffset1;
  var nOffset2;
  var sLink;

  if (uMsg == 515 /*WM_LBUTTONDBLCLK*/)
  {
    lpPOINT       = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
    lpAECHARRANGE = AkelPad.MemAlloc(_X64 ? 48 : 24 /*sizeof(AECHARRANGE)*/);

    AkelPad.MemCopy(_PtrAdd(lpPOINT, 0), LoWord(lParam), 3 /*DT_DWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpPOINT, 4), HiWord(lParam), 3 /*DT_DWORD*/);

    if (AkelPad.SendMessage(hWnd, 3196 /*AEM_POINTONURL*/, lpPOINT, lpAECHARRANGE))
    {
      nOffset1 = AkelPad.SendMessage(hWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpAECHARRANGE);
      nOffset2 = AkelPad.SendMessage(hWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpAECHARRANGE, _X64 ? 24 : 12));

      AkelPad.SetEditWnd(hWnd);
      sLink = AkelPad.GetTextRange(nOffset1, nOffset2);
      AkelPad.SetEditWnd(0);

      oSys.Call("Shell32::ShellExecuteW", 0, "open", sLink, 0, 0, 1 /*SW_SHOWNORMAL*/);
      AkelPad.WindowNoNextProc(hSubClass);
    }

    AkelPad.MemFree(lpPOINT);
    AkelPad.MemFree(lpAECHARRANGE);
  }

  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 oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
}

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

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

function GetInputName()
{
  var hEditWnd = AkelPad.GetEditWnd();
  var lpIndex1 = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var lpIndex2 = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var nOffset1;
  var nOffset2;

  SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 3 /*AEGI_FIRSTSELCHAR*/, lpIndex1);
  SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 4 /*AEGI_LASTSELCHAR*/, lpIndex2);

  if (SendMessage(hEditWnd, 3133 /*AEM_INDEXCOMPARE*/, lpIndex1, lpIndex2) == 0)
  {
    if (! SendMessage(hEditWnd, 3146 /*AEM_ISDELIMITER*/, 0x11 /*AEDLM_WORD|AEDLM_PREVCHAR*/, lpIndex1))
      SendMessage(hEditWnd, 3145 /*AEM_GETPREVBREAK*/, 0x1 /*AEWB_LEFTWORDSTART*/, lpIndex1);

    if (! SendMessage(hEditWnd, 3146 /*AEM_ISDELIMITER*/, 0x10 /*AEDLM_WORD*/, lpIndex2))
      SendMessage(hEditWnd, 3144 /*AEM_GETNEXTBREAK*/, 0x8 /*AEWB_RIGHTWORDEND*/, lpIndex2);
  }

  nOffset1 = SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex1);
  nOffset2 = SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex2);

  AkelPad.MemFree(lpIndex1);
  AkelPad.MemFree(lpIndex2);

  return AkelPad.GetTextRange(nOffset1, nOffset2).replace(/^\s*(AkelPad)?\.?|\s+$/g, "");
}

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(_PtrAdd(lpRect,  0), 3 /*DT_DWORD*/);
  oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect,  4), 3 /*DT_DWORD*/);
  oRect.W = AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/) - oRect.X;
  oRect.H = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/) - oRect.Y;

  AkelPad.MemFree(lpRect);
}

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

  oSys.Call("User32::SetForegroundWindow", hWnd);
}

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[IDTEXT].HWND);
  var nSelStart = AkelPad.GetSelStart();
  AkelPad.SetEditWnd(0);
  return nSelStart;
}

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

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

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

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

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

  hSubClass = AkelPad.WindowSubClass(aDlg[IDTEXT].HWND, EditCallback, 515 /*WM_LBUTTONDBLCLK*/);

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

  SetWindowFont(aDlg[IDTEXT].HWND, SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, 0, 0));
  SendMessage(aDlg[IDTEXT].HWND, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x10000000 /*AECO_DISABLEBEEP*/);
  SendMessage(aDlg[IDTEXT].HWND, 3234 /*AEM_EXSETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00000001 /*AECOE_DETECTURL*/);
  SetWordWrapAE();

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

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

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

    SendMessage(aDlg[IDTEXT].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(_PtrAdd(lpLVITEM, 12), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(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, 6, 3 /*DT_DWORD*/); //mask=LVCF_WIDTH|LVCF_TEXT
  AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, 8),          Scale.X(182), 3 /*DT_DWORD*/); //cx
  AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, _X64 ? 16 : 12), lpTextLV, 2 /*DT_QWORD*/); //pszText
  AkelPad.MemCopy(lpTextLV, sTxtName, 1 /*DT_UNICODE*/);
  SendMessage(aDlg[IDNAMELV].HWND, 0x1061 /*LVM_INSERTCOLUMNW*/, 0, lpLVCOLUMN);

  AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, 8), 0, 3 /*DT_DWORD*/); //cx
  AkelPad.MemCopy(lpTextLV, "AX", 1 /*DT_UNICODE*/);
  SendMessage(aDlg[IDNAMELV].HWND, 0x1061 /*LVM_INSERTCOLUMNW*/, 1, lpLVCOLUMN);

  SendMessage(aDlg[IDNAMELV].HWND, 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0, 0x0021 /*LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES*/);
  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(_PtrAdd(lpLVITEM, 4), i, 3 /*DT_DWORD*/); //iItem
    AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), 0, 3 /*DT_DWORD*/); //iSubItem
    AkelPad.MemCopy(lpTextLV, aAPM[i][0], 1 /*DT_UNICODE*/);
    SendMessage(aDlg[IDNAMELV].HWND, 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);

    AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), 1, 3 /*DT_DWORD*/); //iSubItem
    AkelPad.MemCopy(lpTextLV, aAPM[i][3], 1 /*DT_UNICODE*/);
    SendMessage(aDlg[IDNAMELV].HWND, 0x1074 /*LVM_SETITEMTEXTW*/, i, 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 sText;
  var oRE;
  var aExec;
  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);

  sText = AkelPad.ReadFile(sDocsDir + aDocFile[nAPMLang], 0, 1251 /*ANSI Cyrillic*/, 0).replace(/\r\n/g, "\n");

  //aAPM["name", "text", "AkelPad." if method name, "+" if ActiveX]
  //methods and constants
  oRE = /^((AkelPad\.)?([\w.()]+)( \(\+ActiveX\))?\n_+\n+[\s\S]+?\n)\n*(?=[\w.() +]+\n_+)|^((AkelPad\.)?([\w.()]+)( \(\+ActiveX\))?\n_+\n+[\s\S]+?\n)\n*(?=\*{3} \S.+\S \*{3}\n)/gm
  while (aExec = oRE.exec(sText))
  {
    if (aExec[1])
      aAPM.push([aExec[3], aExec[1], aExec[2], aExec[4] ? "+" : ""]);
    else if (aExec[5])
      aAPM.push([aExec[7], aExec[5], aExec[6], aExec[8] ? "+" : ""]);
  }

  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(_PtrAdd(lpRect, 0), AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/) - oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/), 3 /*DT_DWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpRect, 4), AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/) - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), 3 /*DT_DWORD*/);

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

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

function ResizeDlg(nW, nH)
{
  var nFlags = 0x14; //SWP_NOACTIVATE|SWP_NOZORDER
  var nGapW  = Scale.X(10);
  var nGapH  = Scale.Y(10);
  var nLVW   = Scale.X(230);
  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[IDTEXT].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(160),
      nH - nGapH - Scale.Y(23) - Scale.Y(25) - (IDLANG2B - i) * Scale.Y(20),
      Scale.X(80),
      Scale.Y(16),
      nFlags);
  }
  for (i = IDMENUB; i <= IDCLOSEB; ++i)
  {
    oSys.Call("User32::SetWindowPos",
      aDlg[i].HWND, 0,
      nGapW + Scale.X((i - IDMENUB) * 80),
      nH - nGapH - Scale.Y(23),
      Scale.X(70),
      Scale.Y(23),
      nFlags);
  }

  SendMessage(aDlg[IDNAMELV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 1, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
  SendMessage(aDlg[IDNAMELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, GetCurSelLV(), false);
  oSys.Call("user32::InvalidateRect", hDlg, 0, true);
}

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[IDTEXT].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 CopytNameToCB()
{
  if ((nAPMSel >= 0) && (aAPM[nAPMSel][0].charAt(0) != "*"))
    AkelPad.SetClipboardText(aAPM[nAPMSel][2] + aAPM[nAPMSel][0] + (aAPM[nAPMSel][2] ? "()" : ""));
}

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

function CopyListToCB()
{
  var sText = "";
  var i;

  for (i = 0; i < aAPM.length; ++i)
  {
    if (aAPM[i][0].charAt(0) != "*")
      sText += aAPM[i][2] + aAPM[i][0] + "\r\n";
  }

  AkelPad.SetClipboardText(sText);
}

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

  if (sText)
  {
    if (bClipboard)
      AkelPad.SetClipboardText(sText);
    else
      AkelPad.ReplaceSel(sText, -1 /*RST_SELECT*/);
  }
}

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 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", hMenu, MF_POPUP,  hMenu1, sTxtFindName);
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP,  hMenu2, sTxtFindText);
  oSys.Call("user32::AppendMenuW", hMenu, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu, (bMatchCase ? MF_CHECKED : MF_STRING), 0x0003, sTxtFindCase);
  oSys.Call("User32::AppendMenuW", hMenu, (bWordWrap ? MF_CHECKED : MF_STRING), 0x0004, sTxtWrapLines + "\tCtrl+U");
  oSys.Call("User32::AppendMenuW", hMenu, (bSeparateWnd ? MF_CHECKED : MF_STRING), 0x0005, 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", 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[IDTEXT].HWND);
    if (nCmd1 < 4)
      FindText(nCmd1);
    else if (nCmd1 == 4)
      FindTextNext(1);
    else if (nCmd1 == 5)
      FindTextNext(3);
  }
  else if (nCmd == 3)
    bMatchCase = ! bMatchCase;
  else if (nCmd == 4)
  {
    bWordWrap = ! bWordWrap;
    SetWordWrapAE();
  }
  else if (nCmd == 5)
  {
    bSeparateWnd = ! bSeparateWnd;
    bCloseDlg    = false;
    PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }
}

function MenuName(nX, nY)
{
  var MF_STRING    = 0x0000;
  var MF_SEPARATOR = 0x0800;
  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, _PtrAdd(lpRect, 8));
  nX1 = AkelPad.MemRead(_PtrAdd(lpRect,  0), 3 /*DT_DWORD*/);
  nY1 = AkelPad.MemRead(_PtrAdd(lpRect,  4), 3 /*DT_DWORD*/);
  nY2 = AkelPad.MemRead(_PtrAdd(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, MF_STRING, 1, sTxtCopyToCB + "\tCtrl+C");
  oSys.Call("User32::AppendMenuW", hMenu, AkelPad.GetEditWnd() && (! AkelPad.GetEditReadOnly(0)) ? MF_STRING : 0x01 /*MF_GRAYED*/, 2, sTxtInsertToAP + "\tCtrl+Shift+C");
  oSys.Call("user32::AppendMenuW", hMenu, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, 3, sTxtCopyListToCB);

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

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

  if (nCmd == 1)
    CopytNameToCB();
  else if (nCmd == 2)
    InsertNameToAP();
  else if (nCmd == 3)
    CopyListToCB();
}

function MenuText(nX, nY)
{
  var bSel  = SendMessage(aDlg[IDTEXT].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[IDTEXT].HWND, lpPoint);
    nX = AkelPad.MemRead(_PtrAdd(lpPoint, 0), 3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(_PtrAdd(lpPoint, 4), 3 /*DT_DWORD*/) + SendMessage(aDlg[IDTEXT].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*/)
  {
    //translated by Andrey_A_A and Kley
    sTxtDlgTitle     = "Просмотр методов скриптинга AkelPad";
    sTxtNoFiles      = "Нет файлов:";
    sTxtChooseDir    = "Выберите папку с документацией для Scripts плагина:";
    sTxtSort         = "&Сортировать";
    sTxtEnglish      = "&Английский";
    sTxtRussian      = "&Русский";
    sTxtMenu         = "&Меню";
    sTxtOK           = "OK";
    sTxtClose        = "Закрыть";
    sTxtName         = "Имя";
    sTxtText         = "Текст";
    sTxtFindName     = "Поиск имени";
    sTxtFindText     = "Поиск текста";
    sTxtDownFromBeg  = "С начала";
    sTxtDownFromCur  = "Вниз";
    sTxtUpFromEnd    = "Снизу";
    sTxtUpFromCur    = "Вверх";
    sTxtNext         = "Следующий";
    sTxtPrevious     = "Предыдущий";
    sTxtMatchCase    = "С учётом регистра";
    sTxtIgnoreCase   = "Без учёта регистра";
    sTxtNotFound     = "Не найдено.";
    sTxtFindCase     = "Поиск с учетом регистра";
    sTxtWrapLines    = "Перенос по словам";
    sTxtSeparateWnd  = "Запускать в отдельном окне";
    sTxtCopyToCB     = "Копировать";
    sTxtInsertToAP   = "Вставить в AkelPad";
    sTxtSelectAll    = "Выделить всё";
    sTxtCopyListToCB = "Копировать список";
  }
  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.";
    sTxtFindCase     = "Find - match case";
    sTxtWrapLines    = "Wrap lines";
    sTxtSeparateWnd  = "Run in separate window";
    sTxtCopyToCB     = "Copy to clipboard";
    sTxtInsertToAP   = "Insert to AkelPad";
    sTxtSelectAll    = "Select all";
    sTxtCopyListToCB = "Copy list to clipboard";
  }
}

Last edited by KDJ on Sat Feb 06, 2016 4:10 pm, edited 30 times in total.

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

Post by KDJ »

Bitwise calculator.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=22406#p22406
// Version: 2016-08-05
// Author: KDJ
//
// *** 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");
    _PtrAdd = function(n1, n2) {return AkelPad.Global._PtrAdd(n1, n2);};
    _X64    = AkelPad.Constants._X64;
  }
  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.ScriptNoMutex(0x11 /*ULT_LOCKSENDMESSAGE|ULT_UNLOCKSCRIPTSQUEUE*/);
  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.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(_PtrAdd(lpRect,  0), 3 /*DT_DWORD*/);
  oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect,  4), 3 /*DT_DWORD*/);
  oRect.W = AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/) - oRect.X;
  oRect.H = AkelPad.MemRead(_PtrAdd(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();
}

Last edited by KDJ on Fri Aug 05, 2016 9:23 pm, edited 5 times in total.

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

Post by KDJ »

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=22567#p22567
// Version: 2016-07-19
// Author: KDJ
//
// *** 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 bCloseCB;
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(_PtrAdd(lpLVITEM, _X64 ? 24 : 20), lpText, 2 /*DT_QWORD*/);
AkelPad.MemCopy(_PtrAdd(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
//0x50210003=WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_TABSTOP|CBS_DROPDOWNLIST
//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 =
{
  Def   :1,
  Wnd   :[],
  IDTXT :2001,
  IDBUT1:2002,
  IDBUT2:2003,
  IDDEF :2004,

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

    this.Wnd[this.IDTXT ]={C:'STATIC', S:0x50000000, X:140, Y:15, W:640, H:13, Txt:'Defines residency of "AkelAdmin.exe":',
                                                                               Rus:'Определяет будет ли AkelAdmin.exe оставаться в памяти:'};
    this.Wnd[this.IDBUT1]={C:'BUTTON', S: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.IDBUT2]={C:'BUTTON', S: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 ]={C:'BUTTON', S: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.Val);
  },

  SetVal:function()
  {
    for (var i = this.IDBUT1; i <= this.IDBUT2; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Val == i - this.IDBUT1, 0);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUT1) && (nID <= this.IDBUT2))
    {
      bChanged = 1;
      this.Val = nID - this.IDBUT1;
      this.SetVal();
      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.Val = this.Def;
      this.SetVal();
    }
    else if ((nID == IDENGB) ||(nID == IDRUSB))
      this.SetVal();
  }
};

var oAkelUpdaterOptions =
{
  Val  :'',
  Def  :'',
  Wnd  :[],
  IDTXT:2001,
  IDVAL:2002,
  IDDEF:2003,
  IDED :2004,

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

    this.Ini = this.Val;

    this.Wnd[this.IDTXT]={C:'STATIC',    S: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.IDVAL]={C:'COMBOBOX',  S:0x50010042, X:140, Y:35, W:640, H: 21};
    this.Wnd[this.IDDEF]={C:'BUTTON',    S:0x50010003, X:140, Y:66, W:640, H: 16, Txt:'By default: ""',
                                                                                  Rus:'По умолчанию: ""'};
    this.Wnd[this.IDED ]={C:'AkelEditW', S:0x50310804, X:140, Y:91, W:640, H:344, 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/ONTOP\n\tSet dialog always on top.\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.Val);
  },

  SetVal:function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVAL].HWND, this.Val);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

var oCmdLineBegin =
{
  Val  :'',
  Def  :'',
  Wnd  :[],
  IDTXT:2001,
  IDVAL:2002,
  IDDEF:2003,
  IDED1:2004,
  IDED2:2005,

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

    this.Ini = this.Val;

    this.Wnd[this.IDTXT]={C:'STATIC',    S: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.IDVAL]={C:'COMBOBOX',  S:0x50010042, X:140, Y: 35, W:640, H: 21};
    this.Wnd[this.IDDEF]={C:'BUTTON',    S:0x50010003, X:140, Y: 66, W:640, H: 16, Txt:'By default: ""',
                                                                                   Rus:'По умолчанию: ""'};
    this.Wnd[this.IDED1]={C:'AkelEditW', S:0x50010800, X:140, Y: 91, W:640, H: 21, Txt:'Example: /C+',
                                                                                   Rus:'Пример: /C+'};
    this.Wnd[this.IDED2]={C:'AkelEditW', S: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/NewInstance\n\t\t- force create new program instance.\n/MainClass("MyAkelPad4")\n\t\t- set class name for a new program instance. Name could contain variable %d, which is replaced with process id.\n/Reassoc\t- reinstall assigned earlier associations of file types.\n/Deassoc\t- uninstall assigned earlier associations of file types.\n/Quit\t- stop parsing command line parameters and close program.\n/End\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][, WindowStyle])\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 (default).\n\tWindowStyle\n\t\tSee MainWindowStyle description of /Show() method. Note: programs could ignore this parameter.\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/If("expression", "IfTrue", "IfFalse")\n\t"expression"\n\t\tExpression could consist of:\n\t\t- mathematical operations: +, -, *, /, %, &, |, ^.\n\t\t- logical operations: >, <, ==, !=, >=, <=, &&, ||, x?y:z.\n\t\t- comments: /*comment*/\n\t\t- methods:\n\t\t\tSendMain(nMessage, wParam, lParam)\n\t\t\t\tnMessage\n\t\t\t\t\tSpecifies the message to be sent to the main window.\n\t\t\t\twParam\n\t\t\t\t\tSpecifies additional message-specific information.\n\t\t\t\tlParam\n\t\t\t\t\tSpecifies additional message-specific information.\n\t\t\tSendEdit(nMessage, wParam, lParam)\n\t\t\t\tnMessage\n\t\t\t\t\tSpecifies the message to be sent to the current edit window.\n\t\t\t\twParam\n\t\t\t\t\tSpecifies additional message-specific information.\n\t\t\t\tlParam\n\t\t\t\t\tSpecifies additional message-specific information.\n\t\t\tCall("Plugin::Function"[, additional parameters])\n\t\t\t\t- If a plugin is called, then exit code transfered via special parameter &nResult. &nResult must be located in a place where external call syntax requires a pointer to an integer.\n\t\t\t\t/If(`Call("Coder::CodeFold", 1, &nResult)`, `/Call("Coder::CodeFold", 1)`, ``)\n\t\t\t\t\tClose CodeFold window, if opened.\n\t\t\t\t- If a script is called, then it is necessary to use external calls 2 or 4 and also transfer exit code from script via AkelPad.ScriptExitCode.\n\t\t\t\t/If(`Call("Scripts::Main", 4, "EvalCmd.js", \'if (AkelPad.GetEditFile(0)) AkelPad.ScriptExitCode(1);\')`, ``, `/Quit`)\n\t\t\t\t\tQuit, if current document has no name.\n\t\t\t\t- It is possible to call Scripts plugin method directly.\n\t\t\t\t/If(`AkelPad.Constants._X64 == 1`, `/Quit`, ``)\n\t\t\t\t\tQuit, if program is x64.\n\t"IfTrue"\n\t\tCommand line, if expression result is true (not equal to zero).\n\t"IfFalse"\n\t\tCommand line, if expression result is false (equal to zero).\n\t/If(`SendMain(1222 /*AKD_GETMAININFO*/, 5 /*MI_SAVESETTINGS*/, 0) == 2 /*SS_INI*/`, `/OpenFile("%a\\AkelPad.ini")`, ``)\n\t\tmethod opens AkelPad.ini, if settings saved to ini file.\n/Var(Flags)\n\tFlags to use variables for the following command line methods. Set by the sum of members:\n\t\t0 don\'t expand variables.\n\t\t1 expand system variables (for example, %windir%).\n\t\t2 expand program variables %f,%d,%a. If flag set, then symbol % specified as %%.\n\t\tBy default: 1+2=3.\n\t/Var(0) /OpenFile("1%a%2.txt")\n\t\topen file "1%a%2.txt".\n\nVariables available for use in methods:\n\tNormal usage:\n\t\t%f - active file\n\t\t%d - directory of active file\n\t\t%a - AkelPad\'s directory (i.e. contains AkelPad.exe)\n\t\t%% - % symbol\n\t\t%system variable% (i.e. environment variable)\n\tBatch files (bat,cmd):\n\t\t%%f - active file\n\t\t%%d - directory of active file\n\t\t%%a - AkelPad\'s directory (i.e. contains AkelPad.exe)\n\t\t%%%% - % symbol\n\t\t%system variable% (i.e. environment variable)\n\t\t^& - & symbol\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. Optional parameter:\n\t\t1 - force to use last directory.\n4104\tReopen file\n4105\tSave file\n4106\tSave file dialog. Optional parameter:\n\t\t1 - force to use last directory.\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 if several lines selected, otherwise insert tabulation. Optional parameter:\n\t\t1 - delete tabulation in single line selection.\n4167\tDelete tabulation only if several lines selected\n4168\tInsert space\n4169\tInsert space only if several lines selected\n4170\tDelete space if several lines selected, otherwise insert space. Optional parameter:\n\t\t1 - delete space in single line selection.\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:\n\t\t1 - change case for all text if no selection.\n4176\tConvert text to "lowercase".Optional parameter:\n\t\t1 - change case for all text if no selection.\n4177\tConvert text to "Sentence case.". Optional parameter:\n\t\t1 - change case for all text if no selection.\n4178\tConvert text to "Title Case". Optional parameter:\n\t\t1 - change case for all text if no selection.\n4179\tConvert text to "iNVERT cASE". Optional parameter:\n\t\t1 - change case for all text if no selection.\n4180\tCycle case. Optional parameter:\n\t\t1 - change case for all text 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.\n\t\tInsert new line without keeping left spaces, if option "Keep space" is on.\n4197\tDelete current line. Optional parameter:\n\t\t1 - 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\n4322\tClone current tab\n4323\tCopy current tab file path. Optional parameter:\n\t\t0 - copy full path (default);\n\t\t1 - copy directory;\n\t\t2 - copy file name;\n\t\t3 - copy file base name;\n\t\t4 - copy file extension.\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/NewInstance\n\t\t- форсировать создание нового экземпляра программы.\n/MainClass("MyAkelPad4")\n\t\t- задать имя класса для нового экземпляра программы. При этом имя может содержать переменную %d, которая заменяется на идентификатор процесса.\n/Reassoc\t- переустановить ранее назначенные ассоциации типов файлов.\n/Deassoc\t- снять ранее назначенные ассоциации типов файлов.\n/Quit\t- закончить обработку параметров командной строки и выйти из программы.\n/End\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СтильОкна\n\t\tСм. описание СтильГлавногоОкна метода /Show(). Замечание: программы могут игнорировать данный параметр.\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/If("выражение", "ЕслиИстина", "ЕслиЛожь")\n\t"выражение"\n\t\tВыражение может содержать:\n\t\t- математические операции: +, -, *, /, %, &, |, ^.\n\t\t- логические операции: >, <, ==, !=, >=, <=, &&, ||, x?y:z.\n\t\t- комментарии: /*комментарий*/\n\t\t- методы:\n\t\t\tSendMain(nMessage, wParam, lParam)\n\t\t\t\tnMessage\n\t\t\t\t\tСообщение, которое посылается главному окну программы.\n\t\t\t\twParam\n\t\t\t\t\tДополнительная информация.\n\t\t\t\tlParam\n\t\t\t\t\tДополнительная информация.\n\t\t\tSendEdit(nMessage, wParam, lParam)\n\t\t\t\tnMessage\n\t\t\t\t\tСообщение, которое посылается текущему окну редактирования.\n\t\t\t\twParam\n\t\t\t\t\tДополнительная информация.\n\t\t\t\tlParam\n\t\t\t\t\tДополнительная информация.\n\t\t\tCall("Плагин::Функция"[, дополнительные параметры])\n\t\t\t\t- Если вызывается плагин, то код выхода передаётся через специальный параметр &nResult. &nResult должен находится на месте, где синтаксис внешнего вызова требует указатель на число.\n\t\t\t\t/If(`Call("Coder::CodeFold", 1, &nResult)`, `/Call("Coder::CodeFold", 1)`, ``)\n\t\t\t\t\tЗакрыть окно CodeFold, если открыто.\n\t\t\t\t- Если вызывается скрипт, то необходимо использовать внешние вызовы 2 или 4, а также передавать код выхода из скрипта через AkelPad.ScriptExitCode.\n\t\t\t\t/If(`Call("Scripts::Main", 4, "EvalCmd.js", \'if (AkelPad.GetEditFile(0)) AkelPad.ScriptExitCode(1);\')`, ``, `/Quit`)\n\t\t\t\t\tВыйти, если текущий документ не имеет имени.\n\t\t\t\t- Возможно вызывать метод Scripts плагина напрямую.\n\t\t\t\t/If(`AkelPad.Constants._X64 == 1`, `/Quit`, ``)\n\t\t\t\t\tВыйти, если программа имеет битность x64.\n\t"ЕслиИстина"\n\t\tКомандная строка, если результат выражения - истина (не равен нулю).\n\t"ЕслиЛожь"\n\t\tКомандная строка, если результат выражения - ложь (равен нулю).\n\t/If(`SendMain(1222 /*AKD_GETMAININFO*/, 5 /*MI_SAVESETTINGS*/, 0) == 2 /*SS_INI*/`, `/OpenFile("%a\\AkelPad.ini")`, ``)\n\t\tметод открывает AkelPad.ini, если настройки сохраняются в ini файл.\n/Var(Флаги)\n\tФлаги использования переменных для методов следующих далее в командной строке. Задается суммой членов:\n\t\t0 не разворачивать переменные.\n\t\t1 разворачивать системные переменные (например, %windir%).\n\t\t2 разворачивать переменные программы %f,%d,%a. Если флаг задан, то символ % указывается как %%.\n\t\tПо умолчанию: 1+2=3.\n\t/Var(0) /OpenFile("1%a%2.txt")\n\t\tоткрыть файл "1%a%2.txt".\n\nПеременные в методах:\n\tОбычное использование:\n\t\t%f - активный файл\n\t\t%d - директория активного файла\n\t\t%a - директория AkelPad\'а\n\t\t%% - символ %\n\t\t%системная переменная%\n\tПакетные файлы (bat,cmd):\n\t\t%%f - активный файл\n\t\t%%d - директория активного файла\n\t\t%%a - директория AkelPad\'а\n\t\t%%%% - символ %\n\t\t%системная переменная%\n\t\t^& - символ &\n\n\n*** Внутренние команды ***\n\nМогут быть использованы в параметрах командной строки, а также в ContextMenu, ToolBar, Hotkeys, Scripts плагинах.\n\n4101\tСоздать новое окно редактирования\n4102\tСоздать новую копию программы\n4103\tДиалог открытия файлов. Необязательный параметр:\n\t\t1 - форсировать использование последней директории.\n4104\tПереоткрыть файл\n4105\tСохранить файл\n4106\tДиалог сохранения файлов. Необязательный параметр:\n\t\t1 - форсировать использование последней директории.\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Удалить табуляцию, если выделено несколько строк, в противном случае вставить табуляцию. Необязательный параметр:\n\t\t1 - удалять табуляцию при однострочном выделении.\n4167\tУдалить табуляцию, только если выделено несколько строк\n4168\tВставить пробел\n4169\tВставить пробел, только если выделено несколько строк\n4170\tУдалить пробел, если выделено несколько строк, в противном случае вставить пробел. Необязательный параметр:\n\t\t1 - удалять пробел при однострочном выделении.\n4171\tУдалить пробел, только если выделено несколько строк\n4172\tУдалить первый символ\n4173\tУдалить первый символ, только если есть выделение\n4174\tУдалить табы и пробелы в конце\n4175\tПреобразовать в "ВСЕ ПРОПИСНЫЕ". Необязательный параметр:\n\t\t1 - изменить регистр для всего текста, если нет выделения.\n4176\tПреобразовать в "все строчные". Необязательный параметр:\n\t\t1 - изменить регистр для всего текста, если нет выделения.\n4177\tПреобразовать в "Как в предложениях.". Необязательный параметр:\n\t\t1 - изменить регистр для всего текста, если нет выделения.\n4178\tПреобразовать в "Начинать С Прописных".Необязательный параметр:\n\t\t1 - изменить регистр для всего текста, если нет выделения.\n4179\tПреобразовать в "иНВЕРТИРОВАТЬ". Необязательный параметр:\n\t\t1 - изменить регистр для всего текста, если нет выделения.\n4180\tПреобразовать по кругу. Необязательный параметр:\n\t\t1 - изменить регистр для всего текста, если нет выделения.\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Вставить новую строку с сохранением отступов слева, если отключено "Сохранять отступы слева".\n\t\tВставить новую строку без сохранения отступов слева, если включено "Сохранять отступы слева".\n4197\tУдалить текущую строку. Необязательный параметр:\n\t\t1 - удалить всю перенесённую строку.\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Закрыть все неизмененные вкладки\n4322\tКлонировать вкладку\n4323\tКопировать путь файла текущей вкладки. Необязательный параметр:\n\t\t0 - копировать полный путь (по умолчанию);\n\t\t1 - копировать директорию;\n\t\t2 - копировать имя файла;\n\t\t3 - копировать имя файла без расширения;\n\t\t4 - копировать расширение файла.\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.Val);
  },

  SetVal:function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVAL].HWND, this.Val);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

var oCmdLineEnd =
{
  Val  :'',
  Def  :'',
  Wnd  :[],
  IDTXT:2001,
  IDVAL:2002,
  IDDEF:2003,
  IDED1:2004,
  IDED2:2005,

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

    this.Ini = this.Val;

    this.Wnd[this.IDTXT]={C:'STATIC',    S: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.IDVAL]={C:'COMBOBOX',  S:0x50010042, X:140, Y: 35, W:640, H: 21};
    this.Wnd[this.IDDEF]={C:'BUTTON',    S:0x50010003, X:140, Y: 66, W:640, H: 16, Txt:'By default: ""',
                                                                                   Rus:'По умолчанию: ""'};
    this.Wnd[this.IDED1]={C:'AkelEditW', S: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.IDED2]={C:'AkelEditW', S:0x50310804, X:140, Y:122, W:640, H:358, Txt:oCmdLineBegin.Wnd[oCmdLineBegin.IDED2].Txt,
                                                                                   Rus:oCmdLineBegin.Wnd[oCmdLineBegin.IDED2].Rus};
  },

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

  SetVal:function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVAL].HWND, this.Val);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

var oDateInsertFormat =
{
  Val  :'',
  Def  :'',
  Wnd  :[],
  IDTXT:2001,
  IDVAL:2002,
  IDDEF:2003,
  IDED :2004,

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

    this.Ini = this.Val;

    this.Wnd[this.IDTXT]={C:'STATIC',    S:0x50000000, X:140, Y:15, W:640, H: 13, Txt:'Defines insert date and time format:',
                                                                                  Rus:'Определяет формат вставляемой даты:'};
    this.Wnd[this.IDVAL]={C:'COMBOBOX',  S:0x50010042, X:140, Y:35, W:640, H: 21};
    this.Wnd[this.IDDEF]={C:'BUTTON',    S:0x50010003, X:140, Y:66, W:640, H: 16, Txt:'By default: "" - program defined date and time format.',
                                                                                  Rus:'По умолчанию: "" - формат определяется программой.'};
    this.Wnd[this.IDED ]={C:'AkelEditW', S: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.Val);
  },

  SetVal:function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVAL].HWND, this.Val);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

Last edited by KDJ on Tue Jul 19, 2016 4:31 pm, edited 30 times in total.

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

Post by KDJ »

GUI for manual settings - part 2.

Code: Select all

var oDateLogFormat =
{
  Val     :'',
  Def     :'',
  Wnd     :[],
  IDTXT   :2001,
  IDVAL   :2002,
  IDDEF   :2003,
  IDENABLE:2004,
  IDED    :2005,

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

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

    this.Wnd[this.IDTXT   ]={C:'STATIC',    S: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.IDVAL   ]={C:'COMBOBOX',  S:0x50010042, X:140, Y: 35, W:640, H: 21};
    this.Wnd[this.IDDEF   ]={C:'BUTTON',    S: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]={C:'BUTTON',    S: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.IDED    ]={C:'AkelEditW', S:0x50310804, X:140, Y:112, W:640, H:357, Txt:oDateInsertFormat.Wnd[oDateInsertFormat.IDED].Txt,
                                                                                      Rus:oDateInsertFormat.Wnd[oDateInsertFormat.IDED].Rus};
  },

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

  SetVal:function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVAL].HWND, this.Val);
    SendMessage(this.Wnd[this.IDDEF   ].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
    SendMessage(this.Wnd[this.IDENABLE].HWND, 241 /*BM_SETCHECK*/, this.Enable, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
    else if (nID == this.IDENABLE)
    {
      bChanged = 1;
      this.Enable = SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0);
    }
  }
};

var oEditStyle =
{
  Def   :0,
  Wnd   :[],
  IDTXT :2001,
  IDBUT1:2002,
  IDDEF :2003,
  IDSUM :2004,

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

    this.Wnd[this.IDTXT ]={C:'STATIC', S: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.IDBUT1]={C:'BUTTON', S: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 ]={C:'BUTTON', S:0x50010003, X:140, Y:93, W:640, H:16,                            Txt:'By default: 0',
                                                                                                          Rus:'По умолчанию: 0'};
    this.Wnd[this.IDSUM ]={C:'STATIC', S:0x50000000, X:150, Y:67, W: 70, H:13};
  },

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

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

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

var oFixedCharWidth =
{
  Def   :0,
  Wnd   :[],
  IDTXT :2001,
  IDVAL :2002,
  IDDEF :2003,
  IDNOTE:2004,

  Initialize:function()
  {
    this.Val = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 120 /*MI_FIXEDCHARWIDTH*/, 0);

    if ((this.Val < -1) && (this.Val != -4) && (this.Val != -6))
      this.Val = 0;

    this.Ini = this.Val;

    this.Wnd[this.IDTXT ]={C:'STATIC',   S:0x50000000, X:140, Y: 15, W:640, H:78, Txt:'Defines fixed character width. All symbols, including proportional fonts, will be paint in this width.\nSpecial values:\n-1 - font latin character average width.\n-4 - font space width.\n-6 - font latin character maximum width.\n0 - disable fixed width.',
                                                                                  Rus:'Определяет фиксированную ширину символа. Все символы, включая пропорциональные шрифты, будут рисоваться в заданной ширине. Специальные значения:\n-1 - средняя ширина латинских символов в шрифте.\n-4 - ширина пробела в шрифте.\n-6 - максимальная ширина латинских символов в шрифте.\n0 - отключить фиксацию ширины.'};
    this.Wnd[this.IDVAL ]={C:'COMBOBOX', S:0x50210003, X:140, Y:100, W: 50, H:21};
    this.Wnd[this.IDDEF ]={C:'BUTTON',   S:0x50010003, X:140, Y:131, W:640, H:16, Txt:'By default: 0',
                                                                                  Rus:'По умолчанию: 0'};
    this.Wnd[this.IDNOTE]={C:'STATIC',   S:0x50000000, X:140, Y:157, W:640, H:13, Txt:'Note: changes are applied for a new edit windows.',
                                                                                  Rus:'Замечание: изменения будут применены для новых окон редактирования.'};
  },

  Apply:function()
  {
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 120 /*MIS_FIXEDCHARWIDTH*/, this.Val);
  },

  SetVal:function()
  {
    SendMessage(this.Wnd[this.IDVAL].HWND, 0x014E /*CB_SETCURSEL*/, SendMessage(this.Wnd[this.IDVAL].HWND, 0x0158 /*CB_FINDSTRINGEXACT*/, -1, this.Val.toString()), 0);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

  InitDialog:function()
  {
    SendMessage(this.Wnd[this.IDVAL].HWND, 0x0143 /*CB_ADDSTRING*/, 0, "-6");
    SendMessage(this.Wnd[this.IDVAL].HWND, 0x0143 /*CB_ADDSTRING*/, 0, "-4");
    SendMessage(this.Wnd[this.IDVAL].HWND, 0x0143 /*CB_ADDSTRING*/, 0, "-1");
    for (var i = 0; i < 201; ++i)
      SendMessage(this.Wnd[this.IDVAL].HWND, 0x0143 /*CB_ADDSTRING*/, 0, i.toString());
    if (this.Ini > 200)
      SendMessage(this.Wnd[this.IDVAL].HWND, 0x0143 /*CB_ADDSTRING*/, 0, this.Ini.toString());
  },

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
    {
      if (nCode == 1 /*CBN_SELCHANGE*/)
      {
        bChanged = 1;
        SendMessage(hWnd, 0x0148 /*CB_GETLBTEXT*/, SendMessage(hWnd, 0x0147 /*CB_GETCURSEL*/, 0, 0), lpText);
        this.Val = parseInt(AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/));
        SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
      }
      else if (nCode == 8 /*CBN_CLOSEUP*/)
        bCloseCB = 0;
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

var oMouseOptions =
{
  Def    :7,
  Wnd    :[],
  IDTXT  :2001,
  IDBUT1 :2002,
  IDBUT2 :2003,
  IDBUT3 :2004,
  IDBUT4 :2005,
  IDBUT5 :2006,
  IDBUT6 :2007,
  IDBUT7 :2008,
  IDBUT8 :2009,
  IDBUT9 :2010,
  IDBUT10:2011,
  IDDEF  :2012,
  IDSUM  :2013,

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

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

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

    this.Wnd[this.IDTXT  ]={C:'STATIC', S:0x50000000, X:140, Y: 15, W:640, H:13,                                       Txt:'Defines mouse settings. Set by the sum of members:',
                                                                                                                       Rus:'Определяет настройки мыши. Задается суммой членов:'};
    this.Wnd[this.IDBUT1 ]={C:'BUTTON', S: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.IDBUT2 ]={C:'BUTTON', S: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.IDBUT3 ]={C:'BUTTON', S: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.IDBUT4 ]={C:'BUTTON', S: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.IDBUT5 ]={C:'BUTTON', S: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.IDBUT6 ]={C:'BUTTON', S: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.IDBUT7 ]={C:'BUTTON', S:0x50010003, X:140, Y:155, W:640, H:16, Type: 64 /*MO_SELUNWRAPLINE*/,        Txt:'64 - Line selection with mouse selects all wrapped line.',
                                                                                                                       Rus:'64 - Выделять мышью всю, разделенную переносами, строку.'};
    this.Wnd[this.IDBUT8 ]={C:'BUTTON', S: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.IDBUT9 ]={C:'BUTTON', S:0x50010003, X:140, Y:195, W:640, H:16, Type:256 /*MO_INVERTHORZWHEEL*/,      Txt:'256 - Invert mouse horizontal wheel.',
                                                                                                                       Rus:'256 - Инвертировать горизонтальную прокрутку колесиком мыши.'};
    this.Wnd[this.IDBUT10]={C:'BUTTON', S:0x50010003, X:140, Y:215, W:640, H:16, Type:512 /*MO_INVERTVERTWHEEL*/,      Txt:'512 - Invert mouse vertical wheel.',
                                                                                                                       Rus:'512 - Инвертировать вертикальную прокрутку колесиком мыши.'};
    this.Wnd[this.IDDEF  ]={C:'BUTTON', S:0x50010003, X:140, Y:261, W:640, H:16,                                       Txt:'By default: 1+2+4=7',
                                                                                                                       Rus:'По умолчанию: 1+2+4=7'};
    this.Wnd[this.IDSUM  ]={C:'STATIC', S:0x50000000, X:150, Y:235, 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.Val);

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

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

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

var oPaintOptions =
{
  Def   :0,
  Wnd   :[],
  IDTXT :2001,
  IDBUT1:2002,
  IDBUT2:2003,
  IDBUT3:2004,
  IDBUT4:2005,
  IDBUT5:2006,
  IDBUT6:2007,
  IDBUT7:2008,
  IDBUT8:2009,
  IDBUT9:2010,
  IDDEF :2011,
  IDSUM :2012,
  IDNOTE:2013,

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

    this.Wnd[this.IDTXT ]={C:'STATIC', S: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.IDBUT1]={C:'BUTTON', S: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.IDBUT2]={C:'BUTTON', S: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.IDBUT3]={C:'BUTTON', S: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.IDBUT4]={C:'BUTTON', S: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.IDBUT5]={C:'BUTTON', S: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.IDBUT6]={C:'BUTTON', S:0x50010003, X:140, Y:173, W:640, H:16, Type: 128 /*PAINT_VSCROLLBYLINE*/,         Txt:'128 - Unit of vertical scrolling is line (default is pixel).',
                                                                                                                           Rus:'128 - Высота строки как единица для вертикальной прокрутки (по умолчанию пиксел).'};
    this.Wnd[this.IDBUT7]={C:'BUTTON', S:0x50010003, X:140, Y:193, W:640, H:16, Type: 256 /*PAINT_HIDENOSCROLL*/,          Txt:'256 - Show scroll bars only when needed.',
                                                                                                                           Rus:'256 - Скрывать прокрутку текста у окна редактирования, если она не требуется.'};
    this.Wnd[this.IDBUT8]={C:'BUTTON', S:0x50010003, X:140, Y:213, W:640, H:16, Type: 512 /*PAINT_STATICEDGE*/,            Txt:'512 - Draw thin edit window border.',
                                                                                                                           Rus:'512 - Рисовать тонкую границу у окна редактирования.'};
    this.Wnd[this.IDBUT9]={C:'BUTTON', S:0x50010003, X:140, Y:233, W:640, H:16, Type:1024 /*PAINT_NOEDGE*/,                Txt:'1024 - Draw no edit window border.',
                                                                                                                           Rus:'1024 - Не рисовать границу у окна редактирования.'};
    this.Wnd[this.IDDEF ]={C:'BUTTON', S:0x50010003, X:140, Y:279, W:640, H:16,                                            Txt:'By default: 0',
                                                                                                                           Rus:'По умолчанию: 0'};
    this.Wnd[this.IDSUM ]={C:'STATIC', S:0x50000000, X:150, Y:253, W: 70, H:13};
    this.Wnd[this.IDNOTE]={C:'STATIC', S:0x50000000, X:140, Y:305, W:640, H:13,                                            Txt:oFixedCharWidth.Wnd[oFixedCharWidth.IDNOTE].Txt,
                                                                                                                           Rus:oFixedCharWidth.Wnd[oFixedCharWidth.IDNOTE].Rus};
  },

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

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

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

var oRichEditClass =
{
  Def   :0,
  Wnd   :[],
  IDTXT :2001,
  IDBUT1:2002,
  IDBUT2:2003,
  IDDEF :2004,
  IDNOTE:2005,

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

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

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

  SetVal:function()
  {
    for (var i = this.IDBUT1; i <= this.IDBUT2; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Val == i - this.IDBUT1, 0);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUT1) && (nID <= this.IDBUT2))
    {
      bChanged = 1;
      this.Val = nID - this.IDBUT1;
      this.SetVal();
      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.Val = this.Def;
      this.SetVal();
    }
    else if ((nID == IDENGB) ||(nID == IDRUSB))
      this.SetVal();
  }
};

var oShowModify =
{
  Def    :9,
  ShowAll:15,
  Wnd    :[],
  IDTXT  :2001,
  IDBUT1 :2002,
  IDBUT2 :2003,
  IDBUT3 :2004,
  IDBUT4 :2005,
  IDDEF  :2006,
  IDALL  :2007,
  IDSUM  :2008,

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

    this.Wnd[this.IDTXT ]={C:'STATIC', S: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.IDBUT1]={C:'BUTTON', S: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.IDBUT2]={C:'BUTTON', S: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.IDBUT3]={C:'BUTTON', S: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.IDBUT4]={C:'BUTTON', S: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 ]={C:'BUTTON', S:0x50010003, X:140, Y:141, W:640, H:16,                               Txt:'By default: 1+8=9',
                                                                                                              Rus:'По умолчанию: 1+8=9'};
    this.Wnd[this.IDALL ]={C:'BUTTON', S: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 ]={C:'STATIC', S:0x50000000, X:150, Y:115, W: 70, H:13};
  },

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

  SetVal:function()
  {
    for (var i = this.IDBUT1; i <= this.IDBUT4; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Val & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Val);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
    SendMessage(this.Wnd[this.IDALL].HWND, 241 /*BM_SETCHECK*/, this.Val == this.ShowAll, 0);
  },

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

var oSingleOpenProgram =
{
  Def   :1,
  Wnd   :[],
  IDTXT :2001,
  IDBUT1:2002,
  IDBUT2:2003,
  IDDEF :2004,
  IDSUM :2005,

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

    this.Wnd[this.IDTXT ]={C:'STATIC', S: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.IDBUT1]={C:'BUTTON', S: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.IDBUT2]={C:'BUTTON', S: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 ]={C:'BUTTON', S:0x50010003, X:140, Y:101, W:640, H:16,                         Txt:'By default: 1',
                                                                                                        Rus:'По умолчанию: 1'};
    this.Wnd[this.IDSUM ]={C:'STATIC', S:0x50000000, X:150, Y: 75, W: 70, H:13};
  },

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

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

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

var oStatusPosType =
{
  Def   :0,
  Wnd   :[],
  IDTXT :2001,
  IDBUT1:2002,
  IDBUT2:2003,
  IDDEF :2004,
  IDSUM :2005,

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

    this.Wnd[this.IDTXT ]={C:'STATIC', S: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.IDBUT1]={C:'BUTTON', S: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.IDBUT2]={C:'BUTTON', S: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 ]={C:'BUTTON', S:0x50010003, X:140, Y:101, W:640, H:16,                          Txt:'By default: 0',
                                                                                                         Rus:'По умолчанию: 0'};
    this.Wnd[this.IDSUM ]={C:'STATIC', S:0x50000000, X:150, Y: 75, W: 70, H:13};
  },

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

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

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

var oStatusUserFormat =
{
  Val  :'',
  Def  :'',
  Wnd  :[],
  IDTXT:2001,
  IDVAL:2002,
  IDDEF:2003,
  IDED :2004,

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

    this.Ini = this.Val;

    this.Wnd[this.IDTXT]={C:'STATIC',    S:0x50000000, X:140, Y:15, W:640, H: 13, Txt:'Defines user status bar format:',
                                                                                  Rus:'Определяет формат пользователя для строки состояния:'};
    this.Wnd[this.IDVAL]={C:'COMBOBOX',  S:0x50010042, X:140, Y:35, W:640, H: 21};
    this.Wnd[this.IDDEF]={C:'BUTTON',    S: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.IDED ]={C:'AkelEditW', S: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.Val.replace(/\\t/g, '\t'));
  },

  SetVal:function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVAL].HWND, this.Val);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

var oTabNameFind =
{
  Val   :'',
  Def   :'',
  Wnd   :[],
  IDTXT :2001,
  IDVAL :2002,
  IDDEF :2003,
  IDED  :2004,
  IDNOTE:2005,
  IDLINK:2006,

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

    this.Ini = this.Val;

    this.Wnd[this.IDTXT ]={C:'STATIC',    S: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.IDVAL ]={C:'COMBOBOX',  S:0x50010042, X:140, Y: 48, W:640, H:21};
    this.Wnd[this.IDDEF ]={C:'BUTTON',    S:0x50010003, X:140, Y: 79, W:640, H:16, Txt:'By default: ""',
                                                                                   Rus:'По умолчанию: ""'};
    this.Wnd[this.IDED  ]={C:'AkelEditW', S:0x50010800, X:140, Y:104, W:640, H:21, Txt:'Example: (.{20}).{3,}(?:\\.([^.]*))?',
                                                                                   Rus:'Пример: (.{20}).{3,}(?:\\.([^.]*))?'};
    this.Wnd[this.IDNOTE]={C:'STATIC',    S:0x50000000, X:140, Y:138, W:640, H:13, Txt:oFixedCharWidth.Wnd[oFixedCharWidth.IDNOTE].Txt,
                                                                                   Rus:oFixedCharWidth.Wnd[oFixedCharWidth.IDNOTE].Rus};
    this.Wnd[this.IDLINK]={C:'SysLink',   S:0x50000000, X:140, Y:164, W:640, H:13, Txt:'<a>TabNameRep</a>'};
  },

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

  SetVal:function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVAL].HWND, this.Val);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

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

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

var oTabNameRep =
{
  Val   :'',
  Def   :'',
  Wnd   :[],
  IDTXT :2001,
  IDVAL :2002,
  IDDEF :2003,
  IDED  :2004,
  IDNOTE:2005,
  IDLINK:2006,

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

    this.Ini = this.Val;

    this.Wnd[this.IDTXT ]={C:'STATIC',    S: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.IDVAL ]={C:'COMBOBOX',  S:0x50010042, X:140, Y: 48, W:640, H:21};
    this.Wnd[this.IDDEF ]={C:'BUTTON',    S:0x50010003, X:140, Y: 79, W:640, H:16, Txt:'By default: ""',
                                                                                   Rus:'По умолчанию: ""'};
    this.Wnd[this.IDED  ]={C:'AkelEditW', S:0x50010800, X:140, Y:104, W:640, H:21, Txt:'Example: \\1...\\2',
                                                                                   Rus:'Пример: \\1...\\2'};
    this.Wnd[this.IDNOTE]={C:'STATIC',    S:0x50000000, X:140, Y:138, W:640, H:13, Txt:oFixedCharWidth.Wnd[oFixedCharWidth.IDNOTE].Txt,
                                                                                   Rus:oFixedCharWidth.Wnd[oFixedCharWidth.IDNOTE].Rus};
    this.Wnd[this.IDLINK]={C:'SysLink',   S:0x50000000, X:140, Y:164, W:640, H:13, Txt:'<a>TabNameFind</a>'};
  },

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

  SetVal:function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVAL].HWND, this.Val);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

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

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

Last edited by KDJ on Tue Jul 19, 2016 4:32 pm, edited 21 times in total.

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

Post by KDJ »

GUI for manual settings - part 3.

Code: Select all

var oTabOptionsMDI =
{
  Def    :131330,
  Wnd    :[],
  IDTXT  :2001,
  IDBUT1 :2002,
  IDBUT2 :2003,
  IDBUT3 :2004,
  IDBUT4 :2005,
  IDBUT5 :2006,
  IDBUT6 :2007,
  IDBUT7 :2008,
  IDBUT8 :2009,
  IDBUT9 :2010,
  IDBUT10:2011,
  IDBUT11:2012,
  IDBUT12:2013,
  IDBUT13:2014,
  IDDEF  :2015,
  IDSUM  :2016,

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

    this.Wnd[this.IDTXT  ]={C:'STATIC', S: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.IDBUT1 ]={C:'BUTTON', S: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.IDBUT2 ]={C:'BUTTON', S: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.IDBUT3 ]={C:'BUTTON', S: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.IDBUT4 ]={C:'BUTTON', S: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.IDBUT5 ]={C:'BUTTON', S: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.IDBUT6 ]={C:'BUTTON', S: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.IDBUT7 ]={C:'BUTTON', S: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.IDBUT8 ]={C:'BUTTON', S: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.IDBUT9 ]={C:'BUTTON', S: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.IDBUT10]={C:'BUTTON', S: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.IDBUT11]={C:'BUTTON', S: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.IDBUT12]={C:'BUTTON', S: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.IDBUT13]={C:'BUTTON', S: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  ]={C:'BUTTON', S: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  ]={C:'STATIC', S:0x50000000, X:150, Y:295, W: 70, H:13};
  },

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

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

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

      else if (nID == this.IDBUT4)
      {
        if (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        {
          SendMessage(this.Wnd[this.IDBUT5].HWND, 241 /*BM_SETCHECK*/, 0, 0);
          SendMessage(this.Wnd[this.IDBUT6].HWND, 241 /*BM_SETCHECK*/, 0, 0);
        }
        else
          SendMessage(this.Wnd[this.IDBUT5].HWND, 241 /*BM_SETCHECK*/, 1, 0);
      }
      else if (nID == this.IDBUT5)
      {
        if (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        {
          SendMessage(this.Wnd[this.IDBUT4].HWND, 241 /*BM_SETCHECK*/, 0, 0);
          SendMessage(this.Wnd[this.IDBUT6].HWND, 241 /*BM_SETCHECK*/, 0, 0);
        }
        else
          SendMessage(this.Wnd[this.IDBUT6].HWND, 241 /*BM_SETCHECK*/, 1, 0);
      }
      else if (nID == this.IDBUT6)
      {
        if (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        {
          SendMessage(this.Wnd[this.IDBUT4].HWND, 241 /*BM_SETCHECK*/, 0, 0);
          SendMessage(this.Wnd[this.IDBUT5].HWND, 241 /*BM_SETCHECK*/, 0, 0);
        }
        else
          SendMessage(this.Wnd[this.IDBUT5].HWND, 241 /*BM_SETCHECK*/, 1, 0);
      }
      else if (nID == this.IDBUT7)
        SendMessage(this.Wnd[this.IDBUT8].HWND, 241 /*BM_SETCHECK*/, (! SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0)), 0);
      else if (nID == this.IDBUT8)
        SendMessage(this.Wnd[this.IDBUT7].HWND, 241 /*BM_SETCHECK*/, (! SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0)), 0);

      bChanged = 1;
      this.Val = 0;

      for (var i = this.IDBUT1; i <= this.IDBUT13; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Val |= this.Wnd[i].Type;
      }
      this.SetVal();
    }
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

var oUrlCommand =
{
  Val  :'',
  Def  :'',
  Wnd  :[],
  IDTXT:2001,
  IDVAL:2002,
  IDDEF:2003,
  IDED :2004,

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

    this.Ini = this.Val;

    this.Wnd[this.IDTXT]={C:'STATIC',    S: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.IDVAL]={C:'COMBOBOX',  S:0x50010042, X:140, Y:35, W:640, H:21};
    this.Wnd[this.IDDEF]={C:'BUTTON',    S:0x50010003, X:140, Y:66, W:640, H:16, Txt:'By default: "" - hyperlink opens by operating system.',
                                                                                 Rus:'По умолчанию: "" - гиперссылка открывается операционной системой.'};
    this.Wnd[this.IDED ]={C:'AkelEditW', S: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.Val);
  },

  SetVal:function()
  {
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDVAL].HWND, this.Val);
    SendMessage(this.Wnd[this.IDDEF].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if (nID == this.IDVAL)
      ProcessCB(hWnd, nCode);
    else if ((nID == this.IDDEF) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
    {
      bChanged = 1;
      this.Val = this.Def;
      this.SetVal();
    }
  }
};

var oWordBreak =
{
  Def     :9,
  DefAE   :111,
  Wnd     :[],
  IDTXT   :2001,
  IDBUT1  :2002,
  IDBUT2  :2003,
  IDBUT3  :2004,
  IDBUT4  :2005,
  IDBUT5  :2006,
  IDBUT6  :2007,
  IDBUT7  :2008,
  IDBUT8  :2009,
  IDBUT9  :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.Val       = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 117 /*MI_WORDBREAKCUSTOM*/, 0);
    this.Ini       = this.Val;
    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.IDTXT   ]={C:'STATIC', S: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.IDBUT1  ]={C:'BUTTON', S: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.IDBUT2  ]={C:'BUTTON', S: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.IDBUT3  ]={C:'BUTTON', S: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.IDBUT4  ]={C:'BUTTON', S: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.IDBUT5  ]={C:'BUTTON', S: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.IDBUT6  ]={C:'BUTTON', S: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.IDBUT7  ]={C:'BUTTON', S: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.IDBUT8  ]={C:'BUTTON', S: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.IDBUT9  ]={C:'BUTTON', S: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   ]={C:'BUTTON', S: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 ]={C:'BUTTON', S: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]={C:'BUTTON', S: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   ]={C:'STATIC', S:0x50000000, X:150, Y:215, W: 70, H:13};
    this.Wnd[this.IDNOTE  ]={C:'STATIC', S:0x50000000, X:140, Y:310, W:640, H:13,                                   Txt:oFixedCharWidth.Wnd[oFixedCharWidth.IDNOTE].Txt,
                                                                                                                    Rus:oFixedCharWidth.Wnd[oFixedCharWidth.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.Val);
    AkelPad.SetFrameInfo(0, 54 /*FIS_WORDDELIMITERSENABLE*/, this.Enable);

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

  SetVal:function()
  {
    for (var i = this.IDBUT1; i <= this.IDBUT9; ++i)
      SendMessage(this.Wnd[i].HWND, 241 /*BM_SETCHECK*/, this.Val & this.Wnd[i].Type, 0);
    oSys.Call("User32::SetWindowTextW", this.Wnd[this.IDSUM].HWND, '=' + this.Val);
    SendMessage(this.Wnd[this.IDDEF   ].HWND, 241 /*BM_SETCHECK*/, this.Val == this.Def, 0);
    SendMessage(this.Wnd[this.IDDEFAE ].HWND, 241 /*BM_SETCHECK*/, this.Val == this.DefAE, 0);
    SendMessage(this.Wnd[this.IDENABLE].HWND, 241 /*BM_SETCHECK*/, this.Enable, 0);
  },

  Command:function(nID, nCode, hWnd)
  {
    if ((nID >= this.IDBUT1) && (nID <= this.IDBUT9))
    {
      if ((nID == this.IDBUT5) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        SendMessage(this.Wnd[this.IDBUT7].HWND, 241 /*BM_SETCHECK*/, 0, 0);
      else if ((nID == this.IDBUT7) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        SendMessage(this.Wnd[this.IDBUT5].HWND, 241 /*BM_SETCHECK*/, 0, 0);
      else if ((nID == this.IDBUT6) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        SendMessage(this.Wnd[this.IDBUT8].HWND, 241 /*BM_SETCHECK*/, 0, 0);
      else if ((nID == this.IDBUT8) && SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0))
        SendMessage(this.Wnd[this.IDBUT6].HWND, 241 /*BM_SETCHECK*/, 0, 0);

      bChanged = 1;
      this.Val = 0;

      for (var i = this.IDBUT1; i <= this.IDBUT9; ++i)
      {
        if (SendMessage(this.Wnd[i].HWND, 240 /*BM_GETCHECK*/, 0, 0))
          this.Val |= this.Wnd[i].Type;
      }
      this.SetVal();
    }
    else if (((nID == this.IDDEF) || (nID == this.IDDEFAE)) && (SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0)))
    {
      bChanged = 1;
      this.Val = (nID == this.IDDEF) ? this.Def : this.DefAE;
      this.SetVal();
    }
    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],
  ["FixedCharWidth",     oFixedCharWidth],
  ["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]={C:'SysListView32', S:0x5081800D, X: 5, Y:  5, W:120, H:327};
aDlg[IDENGB  ]={C:'BUTTON',        S:0x50000009, X: 5, Y:342, W: 55, H: 16, Txt:'&English'};
aDlg[IDRUSB  ]={C:'BUTTON',        S:0x50000009, X:70, Y:342, W: 55, H: 16, Txt:'&Russian'};
aDlg[IDRESETB]={C:'BUTTON',        S:0x50000000, X: 5, Y:367, W:120, H: 23, Txt:'&Default all'};
aDlg[IDUNDOB ]={C:'BUTTON',        S:0x50000000, X: 5, Y:392, W:120, H: 23, Txt:'&Undo changes'};
aDlg[IDAPPLYB]={C:'BUTTON',        S:0x50000000, X: 5, Y:417, W:120, H: 23, Txt:'&Apply'};
aDlg[IDOKB   ]={C:'BUTTON',        S:0x50000001, X: 5, Y:442, W:120, H: 23, Txt:'OK'};
aDlg[IDCLOSEB]={C:'BUTTON',        S: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,                  //hMenu
  hInstDLL,           //hInstance
  DialogCallback);    //Script function callback. To use it class must be registered by WindowRegisterClass.

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

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

  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(_PtrAdd(lParam, _X64 ? 16 : 8), 3 /*DT_DWORD*/))
      {
        case -101: //LVN_ITEMCHANGED
          if (AkelPad.MemRead(_PtrAdd(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();
            if (aParam[nSel][1].InitDialog)
              aParam[nSel][1].InitDialog();
            aParam[nSel][1].SetVal();
          }
          break;
        case -2: //NM_CLICK
        case -3: //NM_DBLCLK
        case -5: //NM_RCLICK
        case -6: //NM_RDBLCLK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
            SetCurSelLV(GetCurFocLV());
          break;
      }
    }
  }

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

    bCloseCB = 1;

    if (nID > 2001)
    {
      if (nCode == 0x0100 /*EN_SETFOCUS*/)
        SendMessage(lParam, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00000800 /*AECO_ACTIVELINE*/);
      else if (nCode == 0x0200 /*EN_KILLFOCUS*/)
        SendMessage(lParam, 3228 /*AEM_SETOPTIONS*/, 4 /*AECOOP_XOR*/, 0x00000800 /*AECO_ACTIVELINE*/);

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

  else if (uMsg == 16 /*WM_CLOSE*/)
  {
    WriteIni();
    oSys.Call("User32::EnableWindow", hMainWnd, 1);
    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 oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
}

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

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

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

function 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(_PtrAdd(lpLVITEM, 12), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(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, 0);
}

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(_PtrAdd(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(_PtrAdd(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].IDVAL].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].Val = GetWindowText(hWndCB);
    SendMessage(aParam[nSel][1].Wnd[aParam[nSel][1].IDDEF].HWND, 241 /*BM_SETCHECK*/, aParam[nSel][1].Val == aParam[nSel][1].Def, 0);
  }
  else if (nCode == 7 /*CBN_DROPDOWN*/)
  {
    for (i = 0; i < aParam[nSel][2].length; ++i)
    {
      if (aParam[nSel][2][i] == aParam[nSel][1].Val)
      {
        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].Val != AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/)))
    {
      bChanged = 1;
      aParam[nSel][1].Val = 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].Val == aParam[nSel][1].Def, 0);
    }
  }
}

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

  return bCloseCB;
}

function DeleteFromHistory()
{
  if (aParam[nSel][2].length)
  {
    var hWndCB = aParam[nSel][1].Wnd[aParam[nSel][1].IDVAL].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].Val = "";
      oSys.Call("User32::SetWindowTextW", hWndCB, "");
      SendMessage(aParam[nSel][1].Wnd[aParam[nSel][1].IDDEF].HWND, 241 /*BM_SETCHECK*/, aParam[nSel][1].Val == aParam[nSel][1].Def, 0);
    }
  }
}

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

  AkelPad.MemCopy(_PtrAdd(lpRect,  0), 2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect,  4), 2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect,  8), 2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect, 12), 2, 3 /*DT_DWORD*/);

  for (i = nFirst; i < aWnd.length; ++i)
  {
    aWnd[i].HWND = oSys.Call("User32::CreateWindowExW",
      0,                  //dwExStyle
      aWnd[i].C,          //lpClassName
      0,                  //lpWindowName
      aWnd[i].S,          //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, 1);

    if (aWnd[i].C == "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, 3178 /*AEM_SETRECT*/, 0x02 /*AERC_MARGINS*/, lpRect);
      SendMessage(aWnd[i].HWND, 1091 /*EM_SETBKGNDCOLOR*/, 0, oSys.Call("User32::GetSysColor", 15 /*COLOR_BTNFACE*/)); 
    }
  }

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

function SetTextInWindows(aWnd, nFirst)
{
  var nPos;
  var i;

  for (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);

    if ((aWnd[i].C == "AkelEditW") && (! (aWnd[i].S & 0x4 /*ES_MULTILINE*/)))
    {
      nPos = aWnd[i].Txt.indexOf(": ");

      if (nPos > -1)
      {
        SendMessage(aWnd[i].HWND, 177 /*EM_SETSEL*/, nPos + 2, -1);
        SendMessage(aWnd[i].HWND, 8 /*WM_KILLFOCUS*/, 0, 0);
      }
    }
  }
}

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].Val = aParam[i][1].Def;

    aParam[nSel][1].SetVal();
    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].Val = aParam[i][1].Ini;
      if ("Enable" in aParam[i][1])
        aParam[i][1].Enable = aParam[i][1].EnableIni;
    }

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

function ApplyAll()
{
  hFocus = oSys.Call("User32::GetFocus");

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

  AkelPad.ScriptNoMutex(0x20 /*ULT_UNLOCKSENDMESSAGE*/);

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

  AkelPad.ScriptNoMutex(0x10 /*ULT_LOCKSENDMESSAGE*/);

  oSys.Call("User32::RedrawWindow", hMainWnd, 0, 0, 0x0485 /*RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN*/);
  oSys.Call("User32::EnableWindow", hMainWnd, 0);
  oSys.Call("User32::EnableWindow", hDlg, 1);
  oSys.Call("User32::SetFocus", hFocus);

  bChanged = 0;
  EnableButtons();
}

function EnableButtons()
{
  var bDefault = 1;
  var bInitial = 1;
  var i;

  for (i = 0; i < aParam.length; ++i)
  {
    if (aParam[i][1].Val != aParam[i][1].Def)
    {
      bDefault = 0;
      break;
    }
  }

  for (i = 0; i < aParam.length; ++i)
  {
    if ((aParam[i][1].Val != aParam[i][1].Ini) || (("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(_PtrAdd(lpRect,  0), Scale.X(130), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect,  4), Scale.Y(  5), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect,  8), Scale.X(790), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(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*/, 1));
  }
  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(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/) + ';\r\n' +
    'nDlgY=' + AkelPad.MemRead(_PtrAdd(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].Val)
      {
        for (n = aParam[i][2].length - 1; n >= 0; --n)
        {
          if (aParam[i][2][n] == aParam[i][1].Val)
            aParam[i][2].splice(n, 1);
        }

        aParam[i][2].unshift(aParam[i][1].Val);

        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*/, 1);
}

Last edited by KDJ on Tue Jul 19, 2016 4:33 pm, edited 20 times in total.

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

Post by KDJ »

Changes AkelPad main window title.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=22834#p22834
// Version: 2016-01-23
// Author: KDJ
//
// *** Changes 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      - current file name without the path
//   %%F      - full file name with the path (eg: "C:\Programs\TextEditors\AkelPad\AkelFiles\Plugs\Scripts\Include\ShowMenu.js")
//   %%F{n}   - last n elements in file path (for example: %%F{-3} shows "...\Scripts\Include\ShowMenu.js")
//   %%F{k-n} - first k elements and last n elements in file path (for example: %%F{1-3} shows "C:\...\Scripts\Include\ShowMenu.js")
//   %%d      - directory of current file (eg: "C:\Programs\TextEditors\AkelPad\AkelFiles\Plugs\Scripts\Include\")
//   %%d{n}   - last n levels of directory (for example: %%d{-3} shows "...\Plugs\Scripts\Include\")
//   %%d{k-n} - first k levels and last n levels of directory (for example: %%d{1-3} shows "C:\...\Plugs\Scripts\Include\")
//   %%D      - disk, eg. "C:"
//   %%m      - modified flag
//   %%e      - exe file base name (eg: "AkelPad", "AkelPad_test")
//   %%v      - AkelPad version (eg: "4.9.7")
//   %%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/CmdLineEnd 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,
                                               78 /*WM_NOTIFY*/,
                                             1035 /*AKDN_EDIT_ONSTART*/,
                                             1045 /*AKDN_FRAME_NOWINDOWS*/,
                                             1046 /*AKDN_FRAME_ACTIVATE*/,
                                             1047 /*AKDN_FRAME_DEACTIVATE*/,
                                             1078 /*AKDN_OPENDOCUMENT_FINISH*/,
                                             1080 /*AKDN_SAVEDOCUMENT_FINISH*/))
  {
    hSubClassFrame = AkelPad.WindowSubClass(3 /*WSC_FRAMEPROC*/, FrameCallback, 78 /*WM_NOTIFY*/, 5 /*WM_SIZE*/);

    SetMainTitle();
    AkelPad.ScriptNoMutex();
    AkelPad.WindowGetMessage();
    AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);

    if (hSubClassFrame)
      AkelPad.WindowUnsubClass(3 /*WSC_FRAMEPROC*/);

    RestoreFrameTitle();
    RestoreMainTitle();
  }
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 78 /*WM_NOTIFY*/)
  {
    if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), 3 /*DT_DWORD*/) == 2076 /*AEN_MODIFY*/)
    {
      AkelPad.WindowNextProc(hSubClassMain, hWnd, uMsg, wParam, lParam);
      SetMainTitle();
      AkelPad.WindowNoNextProc(hSubClassMain);
    }
  }
  else if ((uMsg == 1035 /*AKDN_EDIT_ONSTART*/) || (uMsg == 1047 /*AKDN_FRAME_DEACTIVATE*/))
    RestoreFrameTitle();
  else if (uMsg == 1045 /*AKDN_FRAME_NOWINDOWS*/)
    SetMainTitle(nMDI == 1 /*WMD_MDI*/);
  else if ((uMsg == 1046 /*AKDN_FRAME_ACTIVATE*/) || (uMsg == 1078 /*AKDN_OPENDOCUMENT_FINISH*/) || (uMsg == 1080 /*AKDN_SAVEDOCUMENT_FINISH*/))
    SetMainTitle();

  return 0;
}

function FrameCallback(hWnd, uMsg, wParam, lParam)
{
  if ((uMsg == 78 /*WM_NOTIFY*/) && (AkelPad.MemRead(_PtrAdd(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)
{
  var hWndFrame = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, 0 /*current frame*/);
  var bModified = AkelPad.GetEditModified(0);
  var sFile     = AkelPad.GetEditFile(0);
  var sFileBase = AkelPad.GetFilePath(sFile, 2 /*CPF_FILENAME*/);
  var sDir      = AkelPad.GetFilePath(sFile, 1 /*CPF_DIR*/);
  var sDisk     = sDir.substr(0, 2);
  var sPattern;

  if (bNoWindows)
    sPattern = sTitlePat;
  else
  {
    if ((nMDI == 1 /*WMD_MDI*/) && oSys.Call("User32::IsZoomed", hWndFrame))
      //remove frame title
      oSys.Call("User32::SetWindowTextW", hWndFrame, "");

    if (sFile)
      sPattern = sTitlePat1;
    else
      sPattern = sTitlePat0;
  }

  oSys.Call("User32::SetWindowTextW", hMainWnd, sPattern.replace(/%d\{-?(\d+)\}|%d\{(\d+)-(\d+)\}|%F\{-?(\d+)\}|%F\{(\d+)-(\d+)\}|%f|%F|%d|%D|%m|%e|%v|%b|%w|%a/g, ReplaceFunc));

  function ReplaceFunc()
  {
    var sParam = arguments[0].charAt(1);
    var aPath;
    var n1;
    var n2;

    if (arguments[1] || arguments[2] || arguments[4] || arguments[5])
    {
      if (! sFile)
        return "";

      if (arguments[1])
      {
        n1 = 0;
        n2 = parseInt(arguments[1]);
      }
      else if (arguments[2])
      {
        n1 = parseInt(arguments[2]);
        n2 = parseInt(arguments[3]);
      }
      else if (arguments[4])
      {
        n1 = 0;
        n2 = parseInt(arguments[4]);
      }
      else
      {
        n1 = parseInt(arguments[5]);
        n2 = parseInt(arguments[6]);
      }

      if ((n1 == 0) && (n2 == 0))
        return "";

      aPath = (sParam == "d") ? sDir.split("\\") : sFile.split("\\");

      if ((n1 + n2) >= aPath.length)
        return (sParam == "d") ? (sDir + "\\") : sFile;
      if (n1 == 0)
        return "...\\" + aPath.slice(aPath.length - n2).join("\\") + ((sParam == "d") ? "\\" : "");
      if (n2 == 0)
        return aPath.slice(0, n1).join("\\") + "\\...";

      return aPath.slice(0, n1).join("\\") + "\\...\\" + aPath.slice(aPath.length - n2).join("\\") + ((sParam == "d") ? "\\" : "");
    }

    if (sParam == "f")
      return sFileBase;
    if (sParam == "F")
      return sFile;
    if (sParam == "d")
      return sDir + "\\";
    if (sParam == "D")
      return sDisk;
    if (sParam == "m")
      return bModified ? sModified : "";
    if (sParam == "e")
      return sExeName;
    if (sParam == "v")
      return sAPVersion;
    if (sParam == "b")
      return sBitVersion;
    if (sParam == "w")
      return sWinMode;
    if (sParam == "a")
      return 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*/)
  {
    bShowModify = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 110 /*MI_SHOWMODIFY*/, 0) & 2 /*SM_MAINTITLE_SDI*/;

    if (sFile)
      sTitle = ((bModified && bShowModify) ? "*" : "") + AkelPad.GetFilePath(sFile, 2 /*CPF_FILENAME*/) + " - " + 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 bAsAdmin = 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*/))
        bAsAdmin = true;

      oSys.Call("Kernel32::CloseHandle", hToken);
    }

    AkelPad.MemFree(lpToken);
    AkelPad.MemFree(lpInfo);
    AkelPad.MemFree(lpSize);
  }

  return bAsAdmin;
}

Last edited by KDJ on Sat Jan 23, 2016 7:24 pm, edited 6 times in total.

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

Post by KDJ »

Removes/restores file icons on the tabs (MDI/PMDI).

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=23098#p23098
// Version: 2015-03-19
// Author: KDJ
// 
// *** 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/CmdLineEnd 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)
  {
  }
}

Last edited by KDJ on Thu Mar 19, 2015 6:00 pm, edited 2 times in total.

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

Post by KDJ »

A few operations on the bookmarks.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=23439#p23439
// Version: 2016-05-08
// Author: KDJ
// 
// *** 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, 18 /*go to next bookmark*/);
    else if (sAction1 == "P")
      AkelPad.Call(sPluginFunc, 19 /*go to previous bookmark*/);
    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(_PtrAdd(lpPoint, 0), 3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(_PtrAdd(lpPoint, 4), 3 /*DT_DWORD*/);
  }
  else
  {
    AkelPad.SendMessage(hEditWnd, 3190 /*AEM_GETCARETPOS*/, lpPoint, 0);
    oSys.Call("User32::ClientToScreen", hEditWnd, lpPoint);
    nX = AkelPad.MemRead(_PtrAdd(lpPoint, 0), 3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(_PtrAdd(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*/)
  {
    //translated by Skif_off
    sTxtInvalidArg    = "Неверный параметр: ";
    sTxtCut           = "Вырезать строки";
    sTxtCopy          = "Копировать строки";
    sTxtOpenInTab     = "Открыть в новой вкладке";
    sTxtPasteTo       = "Вставить в (переписать) строки";
    sTxtReplace       = "Заменить строки";
    sTxtDelete        = "Удалить строки";
    sTxtSelection     = "Выделенные строки";
    sTxtBookmarkLines = "Снабдить строки закладками";
    sTxtUnmarkLines   = "Убрать закладки";
    sTxtInverseBooks  = "Инвертировать закладки";
    sTxtGoTo          = "Перейти к";
    sTxtNext          = "Следующая";
    sTxtPrevious      = "Предыдущая";
    sTxtShowPanel     = "Показать панель";
    sTxtShowRuler     = "Показать линейку";
    sTxtLBSettings    = "Настройки плагина LineBoard...";
    sTxtBookLinesAll  = "С закладками";
    sTxtUnLinesAll    = "Без закладок";
    sTxtBookLinesSel  = "С закладками в выделенном";
    sTxtUnLinesSel    = "Без закладок в выделенном";
    sTxtExpand        = "Расширить к ближайшей закладке";
    sTxtExpandTop     = "Расширить вверх к предыдущей закладке";
    sTxtExpandBottom  = "Расширить вниз к следующей закладке";
    sTxtReduce        = "Уменьшить к ближайшей закладке";
    sTxtReduceTop     = "Уменьшить сверху к следующей закладке";
    sTxtReduceBottom  = "Уменьшить снизу к предыдущей закладке";
    sTxtAll           = "Все";
    sTxtInSel         = "В выделенном";
    sTxtReplaceWith   = "заменить на:";
  }
  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 Sun May 08, 2016 5:26 pm, edited 7 times in total.

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

Post by KDJ »

Turn on/off LineBoard ruler.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=23454#p23454
// Version: 2015-01-06
// Author: KDJ
// 
// *** 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 Tue Jan 06, 2015 7:44 pm, edited 3 times in total.
Post Reply