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

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



Joined: 06 Mar 2010
Posts: 1081
Location: Poland

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

"Go to" dialog with argument.

GoToEx.js

Code:
// GoToEx.js - ver. 2012-12-26
//
// "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)
    {
      AkelPad.SendMessage(hWndLine,   241 /*BM_SETCHECK*/, nLineArg,   0);
      AkelPad.SendMessage(hWndOffset, 241 /*BM_SETCHECK*/, ! nLineArg, 0);

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

function GetGoToDialog()
{
  var lpMLT = AkelPad.MemAlloc(4);
  var hWnd  = AkelPad.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;
}
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1081
Location: Poland

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

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

FindReplaceEx.js

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

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

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

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

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

var IDNAMELV   = 9900;
var IDWHATS    = 9901;
var IDWITHS    = 9902;
var IDWHATE    = 9903;
var IDWITHE    = 9904;
var IDMATCHC   = 9905;
var IDWHOLEW   = 9906;
var IDREGEXP   = 9907;
var IDESCSEQ   = 9908;
var IDNEWB     = 9909;
var IDADDB     = 9910;
var IDEDITB    = 9911;
var IDDELB     = 9912;
var IDOKB      = 9913;
var IDCLOSEB   = 9914;
var IDHELP1L   = 9915;
var IDHELP2L   = 9916;
var IDFRTL     = 9917;
var IDFINDL    = 9918;
var IDREPLACEL = 9919;
var IDGOTOL    = 9920;

var oFSO         = new ActiveXObject("Scripting.FileSystemObject");
var oSys         = AkelPad.SystemFunction();
var hInstanceDLL = AkelPad.GetInstanceDll();
var hMainWnd     = AkelPad.GetMainWnd();
var hGuiFont     = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var sClassName   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("kernel32::GetCurrentProcessId");
var nBufSize     = 1024;
var lpBuffer     = AkelPad.MemAlloc(nBufSize);
var lpLVITEM     = AkelPad.MemAlloc(15 * 4); //sizeof(LVITEM)
var aWnd         = [];
var aLink        = [];
var aSubClassFRT = [];
var bContinue    = true;
var bFirstTimeFR = true;
var bFirstTimeGT = true;
var bChangeFRT   = false;
var nWhatSel1    = 0;
var nWhatSel2    = -1;
var nWithSel1    = 0;
var nWithSel2    = -1;
var nDlgType;
var nMatchCase;
var nWholeWord;
var nRegExp;
var nEscSeq;
var nDirection;
var nGoTo;
var sDefButton;
var hDlgWnd;
var hDlgSubClass;
var hDlgWhatE;
var hDlgWithE;
var hDlgCancel;
var hWndFRT;
var hWndFocus;
var sWhatText;
var sWithText;
var i;

//ini settings
var bGoToDlg = 1;
var nFRTW    = 340;
var nFRTH    = 250;
var nFRTSel  = 0;
var nDlgX;
var nDlgY;

ReadIni();

AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, DT_DWORD);
AkelPad.MemCopy(lpLVITEM + 20, lpBuffer, DT_DWORD);
AkelPad.MemCopy(lpLVITEM + 24, nBufSize, DT_DWORD);

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

aLink[IDHELP1L]   = {Text: "?"};
aLink[IDHELP2L]   = {Text: "?"};
aLink[IDFRTL]     = {Text: sTxtTemplates + " (F2)"};
aLink[IDFINDL]    = {Text: "(Ctrl+F)", DlgID: 2004 /*IDD_FIND*/};
aLink[IDREPLACEL] = {Text: "(Ctrl+R)", DlgID: 2005 /*IDD_REPLACE*/};
aLink[IDGOTOL]    = {Text: "(Ctrl+G)", DlgID: 2006 /*IDD_GOTO*/};

GetDialogWnd();
if (hDlgWnd && hDlgCancel)
  AkelPad.SendMessage(hDlgWnd, 273 /*WM_COMMAND*/, IDCANCEL, hDlgCancel);

GetArguments();
GetLinkText();

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

while (bContinue)
{
  bContinue = false;

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

  GetDialogWnd();

  if (! (hDlgWnd && hDlgCancel))
    break;

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

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

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

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

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

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

  GetLinkWidth();
  GetLinkPos();

  for (i = IDHELP1L; i <= IDGOTOL; ++i)
  {
    if (aLink[i].Create)
      AkelPad.SendMessage(
        oSys.Call("User32::CreateWindowExW",
                  0,               //dwExStyle
                  "SysLink",       //lpClassName
                  "<a>" + aLink[i].Text + "</a>", //lpWindowName
                  0x50000000,      //dwStyle=WS_VISIBLE|WS_CHILD
                  aLink[i].X,      //x
                  aLink[i].Y,      //y
                  aLink[i].W,      //nWidth
                  13,              //nHeight
                  hDlgWnd,         //hWndParent
                  i,               //ID
                  hInstanceDLL,    //hInstance
                  0),              //lpParam
        48 /*WM_SETFONT*/, hGuiFont, true);
  }

  if (nDlgType != MLT_GOTO)
    ShowHelpLinksFR();

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

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

  AkelPad.WindowGetMessage();
  AkelPad.WindowUnsubClass(hDlgWnd);
}

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

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

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

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

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

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

  return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

function GetLinkText()
{
  var nLangID = AkelPad.GetLangId();
  var hLangLib;
  var hRes;
  var hResData;
  var lpPointer;
  var nSize;
  var i;

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

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

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

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

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

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

function GetLinkWidth()
{
  var hDC = oSys.Call("User32::GetDC", hDlgCancel);
  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, aLink[i].Text, aLink[i].Text.length, lpBuffer);
    aLink[i].W = AkelPad.MemRead(lpBuffer, DT_DWORD);
  }

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

function GetLinkPos()
{
  var nDlgW, nDlgH;
  var nCancelX, nCancelW;

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

  oSys.Call("User32::GetWindowRect", hDlgCancel, lpBuffer);
  oSys.Call("User32::ScreenToClient", hDlgWnd, lpBuffer);
  oSys.Call("User32::ScreenToClient", hDlgWnd, lpBuffer + 8);
  nCancelX = AkelPad.MemRead(lpBuffer,     DT_DWORD);
  nCancelW = AkelPad.MemRead(lpBuffer + 8, DT_DWORD) - nCancelX;

  if (nDlgType == MLT_GOTO)
  {
    aLink[IDFINDL].X    = 10;
    aLink[IDFINDL].Y    = nDlgH - 23;
    aLink[IDREPLACEL].X = nDlgW - aLink[IDREPLACEL].W - 10;
    aLink[IDREPLACEL].Y = nDlgH - 23;
    aLink[IDHELP1L].Create   = 0;
    aLink[IDHELP1L].Show     = 0;
    aLink[IDHELP2L].Create   = 0;
    aLink[IDHELP2L].Show     = 0;
    aLink[IDFRTL].Create     = 0;
    aLink[IDFINDL].Create    = bGoToDlg;
    aLink[IDREPLACEL].Create = bGoToDlg;
    aLink[IDGOTOL].Create    = 0;
  }
  else
  {
    aLink[IDHELP1L].X = nCancelX - 12;
    aLink[IDHELP1L].Y = 18;
    aLink[IDFRTL].X   = 30;
    aLink[IDFRTL].Y   = nDlgH - 23;
    aLink[IDGOTOL].X  = nCancelX + (nCancelW - aLink[IDGOTOL].W) / 2;
    aLink[IDGOTOL].Y  = nDlgH - 43;
    aLink[IDHELP1L].Create = 1;
    aLink[IDHELP2L].Create = 1;
    aLink[IDFRTL].Create   = 1;
    aLink[IDGOTOL].Create  = bGoToDlg;

    if (nDlgType == MLT_FIND)
    {
      aLink[IDREPLACEL].X = nCancelX + (nCancelW - aLink[IDREPLACEL].W) / 2;
      aLink[IDREPLACEL].Y = nDlgH - 23;
      aLink[IDFINDL].Create    = 0;
      aLink[IDREPLACEL].Create = 1;
    }
    else
    {
      aLink[IDHELP2L].X = nCancelX - 12;
      aLink[IDHELP2L].Y = 40;
      aLink[IDFINDL].X  = nCancelX + (nCancelW - aLink[IDFINDL].W) / 2;
      aLink[IDFINDL].Y  = nDlgH - 23;
      aLink[IDFINDL].Create    = 1;
      aLink[IDREPLACEL].Create = 0;
    }
  }
}

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

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

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

  hDlgWhatE = 0;
  hDlgWithE = 0;

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

    if (nMLT != MLT_GOTO)
    {
      AkelPad.MemCopy(lpBuffer, 52 /*sizeof(COMBOBOXINFO)*/, DT_DWORD);
      oSys.Call("User32::GetComboBoxInfo", oSys.Call("User32::GetDlgItem", hDlgWnd, IDC_SEARCH_FIND), lpBuffer);
      hDlgWhatE = AkelPad.MemRead(lpBuffer + 44 /*hwndItem*/, DT_DWORD);

      if (nMLT == MLT_REPLACE)
      {
        oSys.Call("User32::GetComboBoxInfo", oSys.Call("User32::GetDlgItem", hDlgWnd, IDC_SEARCH_REPLACE), lpBuffer);
        hDlgWithE = AkelPad.MemRead(lpBuffer + 44 /*hwndItem*/, DT_DWORD);
      }
    }
  }
  else
    hDlgWnd = 0;
}

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

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

function SwitchDialog(nMLT)
{
  bContinue = true;
  nDlgType  = nMLT;
  AkelPad.SendMessage(hDlgWnd, 273 /*WM_COMMAND*/, IDCANCEL, hDlgCancel);
}

function ResizeDialogGT()
{
  var nW, nH;

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

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

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

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

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

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

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

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

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

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

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

  oSys.Call("User32::PostMessageW", hWndFRT, 16 /*WM_CLOSE*/, 0, 0);
}

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

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

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

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

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

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

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

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

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

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

    hWndFocus = aWnd[IDNAMELV].Handle;
  }

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

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

  else if (uMsg == 36) //WM_GETMINMAXINFO
  {
    AkelPad.MemCopy(lParam + 24,  340, DT_DWORD); //ptMinTrackSize_x
    AkelPad.MemCopy(lParam + 28,  250, DT_DWORD); //ptMinTrackSize_y
    AkelPad.MemCopy(lParam + 32, 1200, DT_DWORD); //ptMaxTrackSize_x
    AkelPad.MemCopy(lParam + 36,  800, DT_DWORD); //ptMaxTrackSize_y
  }

  else if (uMsg == 5) //WM_SIZE
    ResizeFRT(hWnd);

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

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

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

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

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

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

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

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

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

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

  return 0;
}

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

  return 0;
}

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

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

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

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

  AkelPad.MemFree(lpPaint);
}

function ResizeFRT(hWnd)
{
  var nSBW = 0;
  var nW, nH, nEW, nEH, nBW;
  var i;

  oSys.Call("User32::GetClientRect", hWnd, lpBuffer);
  nW  = AkelPad.MemRead(lpBuffer +  8, DT_DWORD);
  nH  = AkelPad.MemRead(lpBuffer + 12, DT_DWORD);
  nEW = Math.round((nW - 30) / 2);
  nEH = Math.round((nH - 160 - 21) / 2);
  nBW = (nW - (IDCLOSEB - IDNEWB) * 5 - 2 * 10) / (IDCLOSEB - IDNEWB + 1);

  oSys.Call("User32::SetWindowPos",
            aWnd[IDNAMELV].Handle, 0,
            10,
            10,
            nEW,
            nH - 30 - 21,
            0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  oSys.Call("User32::SetWindowPos",
            aWnd[IDWHATS].Handle, 0,
            nW - nEW - 10,
            10,
            nEW,
            13,
            0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  oSys.Call("User32::SetWindowPos",
            aWnd[IDWITHS].Handle, 0,
            nW - nEW - 10,
            nH - 125 - 21 - nEH,
            nEW,
            13,
            0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  oSys.Call("User32::SetWindowPos",
            aWnd[IDHELP1L].Handle, 0,
            nW - aLink[IDHELP1L].W - 10,
            10,
            aLink[IDHELP1L].W,
            13,
            0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  oSys.Call("User32::SetWindowPos",
            aWnd[IDHELP2L].Handle, 0,
            nW - aLink[IDHELP2L].W - 10,
            nH - 125 - 21 - nEH,
            aLink[IDHELP2L].W,
            13,
            0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  oSys.Call("User32::SetWindowPos",
            aWnd[IDWHATE].Handle, 0,
            nW - nEW - 10,
            25,
            nEW,
            nEH,
            0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  oSys.Call("User32::SetWindowPos",
            aWnd[IDWITHE].Handle, 0,
            nW - nEW - 10,
            nH - 110 - 21 - nEH,
            nEW,
            nEH,
            0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  for (i = IDMATCHC; i <= IDESCSEQ; ++i)
  {
    oSys.Call("User32::SetWindowPos",
              aWnd[i].Handle, 0,
              nW - nEW - 10,
              nH - 100 - 21 + 20 * (i - IDMATCHC),
              nEW,
              16,
              0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  }
  for (i = IDNEWB; i <= IDCLOSEB; ++i)
  {
    oSys.Call("User32::SetWindowPos",
              aWnd[i].Handle, 0,
              10 + (i - IDNEWB) * (nBW + 5),
              nH - 21 - 10,
              nBW,
              21,
              0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  }

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

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

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

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

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

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

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

  ShowHelpLinksFRT();
}

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

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

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

  ShowHelpLinksFRT();

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

  SetTextLV(GetCurSelLV(), 3, sParams);

  bChangeFRT = true;
}

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

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

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

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

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

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

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

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

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

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

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

  return nItem;
}

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

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

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

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

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

function FillLV()
{
  var sFRTName = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_templates.tsv";
  var aRecord;
  var aField;
  var i;

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

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

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

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

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

      InsertItemLV(aField);
    }
  }

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

  SetCurSelLV(nFRTSel);
}

function WriteFRT()
{
  if (bChangeFRT)
  {
    var oFile  = oFSO.OpenTextFile(WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_templates.tsv", 2, true, -1);
    var nItems = GetItemCountLV();
    var sText  = "";
    var i;

    bChangeFRT = false;

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

    oFile.Write(sText);
    oFile.Close();
  }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    AkelPad.MemFree(lpLVFINDINFO);

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

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

  return -1;
}

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

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

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

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

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

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

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


Last edited by KDJ on Sun Mar 24, 2013 3:53 pm; edited 4 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1081
Location: Poland

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

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

FindReplaceEx_part2.js

Code:
function RegExpHelp(nHelpID, bFRT)
{
  var hMenu    = oSys.Call("User32::CreatePopupMenu");
  var nString  = 0x0000; //MF_STRING
  var nDisable = 0x0002; //MF_DISABLED
  var nBreak   = 0x0060; //MF_MENUBREAK|MF_MENUBARBREAK
  var nSepar   = 0x0800; //MF_SEPARATOR
  var hFromPos;
  var hEdit;
  var hWndOwn;
  var aMenu;
  var nMenuX;
  var nMenuY;
  var nCmd;
  var i;

  if (nHelpID == IDHELP1L)
  {
    if (bFRT)
    {
      hFromPos = aWnd[IDWHATE].Handle;
      hEdit    = aWnd[IDWHATE].Handle;
    }
    else
    {
      hFromPos = oSys.Call("User32::GetDlgItem", hDlgWnd, IDC_SEARCH_FIND);
      hEdit    = hDlgWhatE;
    }

    aMenu = [
      [nString,  ".",       sHlpAnyChar],
      [nString,  "\\(",     sHlpSpecChars],
      [nString,  "\\f",     sHlpFF],
      [nString,  "\\n",     sHlpAnyNL],
      [nString,  "\\r",     sHlpAnyNL],
      [nString,  "\\t",     sHlpTab],
      [nString,  "\\v",     sHlpVTab],
      [nString,  "\\d",     sHlpDigit],
      [nString,  "\\D",     sHlpNonDigit],
      [nString,  "\\s",     sHlpWhiteSp],
      [nString,  "\\S",     sHlpNonWhiteSp],
      [nString,  "\\w",     sHlpWordChar],
      [nString,  "\\W",     sHlpNonWordChar],
      [nString,  "\\x{F}",  sHlpCharHex],
      [nString,  "\\xFF",   sHlpCharHex2],
      [nString,  "\\uFFFF", sHlpCharHex4],
      [nSepar,   0, 0],
      [nString,  "^",       sHlpBeginLine],
      [nString,  "$",       sHlpEndLine],
      [nString,  "\\A",     sHlpBeginText],
      [nString,  "\\Z",     sHlpEndText],
      [nString,  "\\a",     sHlpBeginRange],
      [nString,  "\\z",     sHlpEndRange],
      [nString,  "\\b",     sHlpWordBoun],
      [nString,  "\\B",     sHlpNonWordBoun],
      [nBreak,   "ab|xy",   sHlpAlternative],
      [nString,  "[abc]",   sHlpCharSet],
      [nString,  "[^abc]",  sHlpNegCharSet],
      [nString,  "[a-z]",   sHlpRange],
      [nString,  "[^a-z]",  sHlpNegRange],
      [nSepar,   0, 0],
      [nString,  "(ab)",    sHlpCapture],
      [nString,  "(?:ab)",  sHlpNotCapture],
      [nString,  "(?<=ab)", sHlpPreceded],
      [nString,  "(?<!ab)", sHlpNotPreceded],
      [nString,  "(?=ab)",  sHlpFollowed],
      [nString,  "(?!ab)",  sHlpNotFollowed],
      [nString,  "\\9",     sHlpBackrefer9],
      [nString,  "\\99",    sHlpBackrefer99],
      [nSepar,   0, 0],
      [nString,  "?",       sHlpZeroOrOne],
      [nString,  "*",       sHlpZeroOrMore],
      [nString,  "+",       sHlpOneOrMore],
      [nString,  "{3}",     sHlpExactly],
      [nString,  "{3,}",    sHlpAtLeast],
      [nString,  "{3,7}",   sHlpFromTo],
      [nDisable, "",        sHlpNonGreedy]];
  }
  else
  {
    if (bFRT)
    {
      hFromPos = aWnd[IDWITHE].Handle;
      hEdit    = aWnd[IDWITHE].Handle;
    }
    else
    {
      hFromPos = oSys.Call("User32::GetDlgItem", hDlgWnd, IDC_SEARCH_REPLACE);
      hEdit    = hDlgWithE;
    }

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

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

  if (bFRT)
  {
    hWndOwn = hWndFRT;
    oSys.Call("User32::SetFocus", hEdit);
  }
  else
    hWndOwn = oSys.Call("User32::CreateWindowExW", 0, "STATIC", 0, 0x90000000 /*WS_POPUP|WS_VISIBLE*/, 0, 0, 0, 0, hDlgWnd, 0, hInstanceDLL, 0);

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

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

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

  if (! bFRT)
    oSys.Call("User32::DestroyWindow", hWndOwn);

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

  if (nCmd)
    oSys.Call("User32::SendMessageW", hEdit, 0x00C2 /*EM_REPLACESEL*/, 1, aMenu[nCmd - 1][1]);
}

function ReadIni()
{
  var sIniFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var sLngFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_" + AkelPad.GetLangId(0 /*LANGID_FULL*/).toString() + ".lng";
  var oError;

  if (oFSO.FileExists(sLngFile))
  {
    try
    {
      eval(AkelPad.ReadFile(sLngFile));
    }
    catch (oError)
    {
    }
  }
  else
  {
    sTxtFRTempl     = 'Find/Replace templates';
    sTxtTemplates   = 'Templates';
    sTxtName        = 'Name';
    sTxtFindWhat    = 'Find - What';
    sTxtReplaceWith = 'Replace - With';
    sTxtMatchCase   = 'Match case';
    sTxtWholeWord   = 'Whole word';
    sTxtRegExp      = 'Regular expressions';
    sTxtEscSeq      = 'Esc sequences';
    sTxt1Yes0No     = '(1 = Yes, 0 = No)';
    sTxtNew         = 'New';
    sTxtAdd         = 'Add';
    sTxtEdit        = 'Edit';
    sTxtDelete      = 'Delete';
    sTxtOK          = 'OK';
    sTxtClose       = 'Close';
    sTxtNameExists  = 'This name already exists.';
    sTxtNoName      = 'Field "Name" is required.';
    sTxtNoFindWhat  = 'Field "Find - What" is required.';
    sTxtWantRemove  = 'Do you want to remove it?';
    sHlpAnyChar     = 'any character (dot)';
    sHlpSpecChars   = '()[]{}^$.?+*|\\ special chars';
    sHlpFF          = 'form feed \\x0C';
    sHlpAnyNL       = 'any new line';
    sHlpTab         = 'tab \\x09';
    sHlpVTab        = 'vertical tab \\x0B';
    sHlpDigit       = 'digit [0-9]';
    sHlpNonDigit    = 'non-digit [^0-9]';
    sHlpWhiteSp     = 'whitespace [ \\f\\n\\t\\v]';
    sHlpNonWhiteSp  = 'non-whitespace';
    sHlpWordChar    = 'word character [A-Za-z0-9_]';
    sHlpNonWordChar = 'non-word character';
    sHlpCharHex     = 'char - hex code, range 0-10FFFF';
    sHlpCharHex2    = 'char - 2-digit hex code';
    sHlpCharHex4    = 'char - 4-digit hex code';
    sHlpBeginLine   = 'beginning of line';
    sHlpEndLine     = 'end of line';
    sHlpBeginText   = 'beginning of text';
    sHlpEndText     = 'end of text';
    sHlpBeginRange  = 'beginning of search range';
    sHlpEndRange    = 'end of search range';
    sHlpWordBoun    = 'word boundary';
    sHlpNonWordBoun = 'non-word boundary';
    sHlpAlternative = 'alternative ab or xy';
    sHlpCharSet     = 'character set, any specified';
    sHlpNegCharSet  = 'negative character set';
    sHlpRange       = 'range of chars from a to z';
    sHlpNegRange    = 'negative range of chars';
    sHlpCapture     = 'capture';
    sHlpNotCapture  = 'not capture';
    sHlpPreceded    = 'preceded by ab';
    sHlpNotPreceded = 'not preceded by ab';
    sHlpFollowed    = 'followed by ab';
    sHlpNotFollowed = 'not followed by ab';
    sHlpBackrefer9  = 'backreference, range 1-9';
    sHlpBackrefer99 = 'backreference, range 01-99';
    sHlpZeroOrOne   = 'zero or one times';
    sHlpZeroOrMore  = 'zero or more times';
    sHlpOneOrMore   = 'one or more times';
    sHlpExactly     = 'exactly 3 times';
    sHlpAtLeast     = 'at least 3 times';
    sHlpFromTo      = 'from 3 to 7 times';
    sHlpBackslash   = 'backslash';
    sHlpNL          = 'new line';
    sHlpEntireStr   = 'entire string matched';
    sHlpSubmatch9   = '9th captured submatch, range 1-9';
    sHlpSubmatch99  = '99th captured submatch, range 01-99';
    sHlpNonGreedy   = 'Quantifiers ?*+{} are lazy';
  }

  if (oFSO.FileExists(sIniFile))
  {
    try
    {
      eval(AkelPad.ReadFile(sIniFile));
    }
    catch (oError)
    {
    }
  }
}

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

  oFile.Write(
    'bGoToDlg=' + bGoToDlg + ';\r\n' +
    'nDlgX='    + nDlgX    + ';\r\n' +
    'nDlgY='    + nDlgY    + ';\r\n' +
    'nFRTW='    + nFRTW    + ';\r\n' +
    'nFRTH='    + nFRTH    + ';\r\n' +
    'nFRTSel='  + nFRTSel  + ';');
  oFile.Close();
}


Interface language files for FindReplaceEx.js.
FindReplaceEx_1033.lng

Code:
/**************************************
FindReplaceEx.js - ver. 2013-03-24
Interface language
Language:      English (1033)
Translated by: KDJ
**************************************/
sTxtFRTempl     = 'Find/Replace templates';
sTxtTemplates   = 'Templates';
sTxtName        = 'Name';
sTxtFindWhat    = 'Find - What';
sTxtReplaceWith = 'Replace - With';
sTxtMatchCase   = 'Match case';
sTxtWholeWord   = 'Whole word';
sTxtRegExp      = 'Regular expressions';
sTxtEscSeq      = 'Esc sequences';
sTxt1Yes0No     = '(1 = Yes, 0 = No)';
sTxtNew         = 'New';
sTxtAdd         = 'Add';
sTxtEdit        = 'Edit';
sTxtDelete      = 'Delete';
sTxtOK          = 'OK';
sTxtClose       = 'Close';
sTxtNameExists  = 'This name already exists.';
sTxtNoName      = 'Field "Name" is required.';
sTxtNoFindWhat  = 'Field "Find - What" is required.';
sTxtWantRemove  = 'Do you want to remove it?';
sHlpAnyChar     = 'any character (dot)';
sHlpSpecChars   = '()[]{}^$.?+*|\\ special chars';
sHlpFF          = 'form feed \\x0C';
sHlpAnyNL       = 'any new line';
sHlpTab         = 'tab \\x09';
sHlpVTab        = 'vertical tab \\x0B';
sHlpDigit       = 'digit [0-9]';
sHlpNonDigit    = 'non-digit [^0-9]';
sHlpWhiteSp     = 'whitespace [ \\f\\n\\t\\v]';
sHlpNonWhiteSp  = 'non-whitespace';
sHlpWordChar    = 'word character [A-Za-z0-9_]';
sHlpNonWordChar = 'non-word character';
sHlpCharHex     = 'char - hex code, range 0-10FFFF';
sHlpCharHex2    = 'char - 2-digit hex code';
sHlpCharHex4    = 'char - 4-digit hex code';
sHlpBeginLine   = 'beginning of line';
sHlpEndLine     = 'end of line';
sHlpBeginText   = 'beginning of text';
sHlpEndText     = 'end of text';
sHlpBeginRange  = 'beginning of search range';
sHlpEndRange    = 'end of search range';
sHlpWordBoun    = 'word boundary';
sHlpNonWordBoun = 'non-word boundary';
sHlpAlternative = 'alternative ab or xy';
sHlpCharSet     = 'character set, any specified';
sHlpNegCharSet  = 'negative character set';
sHlpRange       = 'range of chars from a to z';
sHlpNegRange    = 'negative range of chars';
sHlpCapture     = 'capture';
sHlpNotCapture  = 'not capture';
sHlpPreceded    = 'preceded by ab';
sHlpNotPreceded = 'not preceded by ab';
sHlpFollowed    = 'followed by ab';
sHlpNotFollowed = 'not followed by ab';
sHlpBackrefer9  = 'backreference, range 1-9';
sHlpBackrefer99 = 'backreference, range 01-99';
sHlpZeroOrOne   = 'zero or one times';
sHlpZeroOrMore  = 'zero or more times';
sHlpOneOrMore   = 'one or more times';
sHlpExactly     = 'exactly 3 times';
sHlpAtLeast     = 'at least 3 times';
sHlpFromTo      = 'from 3 to 7 times';
sHlpBackslash   = 'backslash';
sHlpNL          = 'new line';
sHlpEntireStr   = 'entire string matched';
sHlpSubmatch9   = '9th captured submatch, range 1-9';
sHlpSubmatch99  = '99th captured submatch, range 01-99';
sHlpNonGreedy   = 'Quantifiers ?*+{} are lazy';
- English template for translation
FindReplaceEx_1045.lng

Code:
/**************************************
FindReplaceEx.js - ver. 2013-03-24
Interface language
Language:      Polish (1045)
Translated by: KDJ
**************************************/
sTxtFRTempl     = 'Szablony Znajdź/Zamień';
sTxtTemplates   = 'Szablony';
sTxtName        = 'Nazwa';
sTxtFindWhat    = 'Znajdź - Co';
sTxtReplaceWith = 'Zamień - Czym';
sTxtMatchCase   = 'Uwzględnij wielkość liter';
sTxtWholeWord   = 'Całe wyrazy';
sTxtRegExp      = 'Wyrażenia regularne';
sTxtEscSeq      = 'Sekwencje Esc';
sTxt1Yes0No     = '(1 = Tak, 0 = Nie)';
sTxtNew         = 'Nowy';
sTxtAdd         = 'Dodaj';
sTxtEdit        = 'Edytuj';
sTxtDelete      = 'Usuń';
sTxtOK          = 'OK';
sTxtClose       = 'Zamknij';
sTxtNameExists  = 'Ta nazwa już istnieje.';
sTxtNoName      = 'Pole "Nazwa" jest wymagane.';
sTxtNoFindWhat  = 'Pole "Znajdź - Co" jest wymagane.';
sTxtWantRemove  = 'Czy chcesz to usunąć?';
sHlpAnyChar     = 'dowolny znak (kropka)';
sHlpSpecChars   = '()[]{}^$.?+*|\\ znaki specjalne';
sHlpFF          = 'wysuw strony \\x0C';
sHlpAnyNL       = 'nowy wiersz dowolnego formatu';
sHlpTab         = 'tab \\x09';
sHlpVTab        = 'pionowy tab \\x0B';
sHlpDigit       = 'cyfra [0-9]';
sHlpNonDigit    = 'inny niż cyfra [^0-9]';
sHlpWhiteSp     = 'biały znak [ \\f\\n\\t\\v]';
sHlpNonWhiteSp  = 'inny niż biały znak';
sHlpWordChar    = 'znak słowa [A-Za-z0-9_]';
sHlpNonWordChar = 'inny niż znak słowa';
sHlpCharHex     = 'znak - kod hex, zakres 0-10FFFF';
sHlpCharHex2    = 'znak - 2-cyfrowy kod hex';
sHlpCharHex4    = 'znak - 4-cyfrowy kod hex';
sHlpBeginLine   = 'początek wiersza';
sHlpEndLine     = 'koniec wiersza';
sHlpBeginText   = 'początek tekstu';
sHlpEndText     = 'koniec tekstu';
sHlpBeginRange  = 'początek zakresu wyszukiwania';
sHlpEndRange    = 'koniec zakresu wyszukiwania';
sHlpWordBoun    = 'granica słowa';
sHlpNonWordBoun = 'brak granicy słowa';
sHlpAlternative = 'alternatywa ab lub xy';
sHlpCharSet     = 'zestaw znaków, dowolny z abc';
sHlpNegCharSet  = 'zaprzeczenie zestawu znaków';
sHlpRange       = 'zakres znaków od a do z';
sHlpNegRange    = 'zaprzeczenie zakresu znaków';
sHlpCapture     = 'przechwytuje';
sHlpNotCapture  = 'nie przechwytuje';
sHlpPreceded    = 'przed ciągiem jest ab';
sHlpNotPreceded = 'przed ciągiem nie ma ab';
sHlpFollowed    = 'za ciągiem jest ab';
sHlpNotFollowed = 'za ciągiem nie ma ab';
sHlpBackrefer9  = 'odwołanie wsteczne, zakres 1-9';
sHlpBackrefer99 = 'odwołanie wsteczne, zakres 01-99';
sHlpZeroOrOne   = 'zero lub jeden raz';
sHlpZeroOrMore  = 'zero lub więcej razy';
sHlpOneOrMore   = 'jeden lub więcej razy';
sHlpExactly     = 'dokładnie 3 razy';
sHlpAtLeast     = 'co najmniej 3 razy';
sHlpFromTo      = 'od 3 do 7 razy';
sHlpBackslash   = 'backslash';
sHlpNL          = 'nowy wiersz';
sHlpEntireStr   = 'cały dopasowany ciąg';
sHlpSubmatch9   = '9-ty dopasowany podciąg, zakres 1-9';
sHlpSubmatch99  = '99-ty dopasowany podciąg, zakres 01-99';
sHlpNonGreedy   = 'Kwantyfikatory ?*+{} są leniwe';
- Polish
FindReplaceEx_1049.lng

Code:
/**************************************
FindReplaceEx.js - ver. 2013-03-24
Interface language
Language:      Russian (1049)
Translated by: F.Phoenix
**************************************/
sTxtFRTempl     = 'Øàáëîíû ïîèñêà è çàìåíû';
sTxtTemplates   = 'Øàáëîíû';
sTxtName        = 'Íàèìåíîâàíèå';
sTxtFindWhat    = '×òî íàéòè';
sTxtReplaceWith = '×åì çàìåíèòü';
sTxtMatchCase   = 'Ó÷èòûâàòü ðåãèñòð';
sTxtWholeWord   = 'Ñëîâî öåëèêîì';
sTxtRegExp      = 'Ðåãóëÿðíûå âûðàæåíèÿ';
sTxtEscSeq      = 'Esc-ïîñëåäîâàòåëüíîñòè';
sTxt1Yes0No     = '(1 = äà, 0 = íåò)';
sTxtNew         = 'Ñîçäàòü';
sTxtAdd         = 'Äîáàâèòü';
sTxtEdit        = 'Èçìåíèòü';
sTxtDelete      = 'Óäàëèòü';
sTxtOK          = 'OK';
sTxtClose       = 'Çàêðûòü';
sTxtNameExists  = 'Òàêîå íàèìåíîâàíèå øàáëîíà óæå èñïîëüçóåòñÿ.';
sTxtNoName      = 'Íåîáõîäèìî çàïîëíèòü ïîëå "Íàèìåíîâàíèå".';
sTxtNoFindWhat  = 'Íåîáõîäèìî çàïîëíèòü ïîëå "×òî íàéòè".';
sTxtWantRemove  = 'Âû äåéñòèòåëüíî õîòèòå óäàëèòü ýòîò øàáëîí?';
sHlpAnyChar     = 'ëþáîé ñèìâîë (òî÷êà)';
sHlpSpecChars   = '()[]{}^$.?+*|\\ ñïåöèàëüíûå ñèìâîëû';
sHlpFF          = 'ïåðåâîä ñòðàíèöû \\x0C';
sHlpAnyNL       = 'ïåðåâîä ñòðîêè';
sHlpTab         = 'òàáóëÿöèÿ \\x09';
sHlpVTab        = 'âåðòèêàëüíàÿ òàáóëÿöèÿ \\x0B';
sHlpDigit       = 'öèôðà [0-9]';
sHlpNonDigit    = 'íå öèôðà [^0-9]';
sHlpWhiteSp     = 'ïðîáåëüíûé ñèìâîë [ \\f\\n\\t\\v]';
sHlpNonWhiteSp  = 'íåïðîáåëüíûé ñèìâîë';
sHlpWordChar    = 'ñëîâåñíûé ñèìâîë [A-Za-z0-9_]';
sHlpNonWordChar = 'íåñëîâåñåûé ñèìâîë';
sHlpCharHex     = 'char - hex code, range 0-10FFFF';            //new
sHlpCharHex2    = 'char - 2-digit hex code';                    //new, instead of sHlpCharHex='character hex code FF'; sHlpCharHex='ñèìâîë ñ êîäîì FF';
sHlpCharHex4    = 'char - 4-digit hex code';                    //new, instead of sHlpUniCharHex='Unicode char hex code FFFF'; sHlpUniCharHex='ñèìâîë þíèêîäà FFFF';
sHlpBeginLine   = 'íà÷àëî ñòðîêè';
sHlpEndLine     = 'êîíåö ñòðîêè';
sHlpBeginText   = 'beginning of text';                          //new
sHlpEndText     = 'end of text';                                //new
sHlpBeginRange  = 'beginning of search range';                  //new
sHlpEndRange    = 'end of search range';                        //new
sHlpWordBoun    = 'ãðàíèöà ñëîâà';
sHlpNonWordBoun = 'íå ãðàíèöà ñëîâà';
sHlpAlternative = 'îäíà èç àëüòåðíàòèâ: ab ëèáî xy';
sHlpCharSet     = 'íàáîð ñèìâîëîâ, íóæåí ëþáîé èç íèõ';
sHlpNegCharSet  = 'èñêëþ÷àþùèé íàáîð ñèìâîëîâ';
sHlpRange       = 'äèàïàçîí ñèìâîëîâ îò a äî z';
sHlpNegRange    = 'èñêëþ÷àþùèé äèàïàçîí';
sHlpCapture     = 'çàïîìèíàþùàÿ ñêîáêà';
sHlpNotCapture  = 'íåçàïîìèíàþùàÿ ñêîáêà';
sHlpPreceded    = 'preceded by ab';                             //new
sHlpNotPreceded = 'not preceded by ab';                         //new
sHlpFollowed    = 'äàëåå ñëåäóåò ab';
sHlpNotFollowed = 'äàëåå íå ñëåäóåò ab';
sHlpBackrefer9  = 'îáðàòíàÿ ññûëêà, äèàïàçîí 1-9';
sHlpBackrefer99 = 'îáðàòíàÿ ññûëêà, äèàïàçîí 01-99';
sHlpZeroOrOne   = '0 èëè 1 ðàç';
sHlpZeroOrMore  = '0 èëè áîëåå ðàç';
sHlpOneOrMore   = '1 èëè áîëåå ðàç';
sHlpExactly     = 'ðîâíî 3 ðàçà';
sHlpAtLeast     = 'íå ìåíåå 3 ðàç';
sHlpFromTo      = 'îò 3 äî 7 ðàç';
sHlpBackslash   = 'îáðàòíûé ñëåø';
sHlpNL          = 'ïåðåâîä ñòðîêè';
sHlpEntireStr   = 'âñÿ çàõâà÷åííàÿ ñòðîêà';
sHlpSubmatch9   = '9ÿ ïîäñòðîêà (äèàïàçîí 1-9)';
sHlpSubmatch99  = '99ÿ ïîäñòðîêà (äèàïàçîí 01-99)';
sHlpNonGreedy   = 'âñå êâàíòèôèêàòîðû ëåíèâû';
- Russian by F. Phoenix
FindReplaceEx_2052.lng

Code:
/**************************************
FindReplaceEx.js - ver. 2013-03-24
Interface language
Language:      ChineseSimplified (2052)
Translated by: cnnnc
**************************************/
sTxtFRTempl     = '查找/替换 模板';
sTxtTemplates   = '模板';
sTxtName        = '名称';
sTxtFindWhat    = '查找';
sTxtReplaceWith = '替换';
sTxtMatchCase   = '区分大小写';
sTxtWholeWord   = '整字匹配';
sTxtRegExp      = '正则表达式';
sTxtEscSeq      = '转义符序列';
sTxt1Yes0No     = '(1 = 是, 0 = 否)';
sTxtNew         = '新建';
sTxtAdd         = '添加';
sTxtEdit        = '编辑';
sTxtDelete      = '删除';
sTxtOK          = '确定';
sTxtClose       = '关闭';
sTxtNameExists  = '名称已经存在。';
sTxtNoName      = '需要名称。';
sTxtNoFindWhat  = '“查找”内容不能为空。';
sTxtWantRemove  = '是否想要删除?';
sHlpAnyChar     = '任意单一字符';
sHlpSpecChars   = '()[]{}^$.?+*|\\ 特殊符号';
sHlpFF          = '换页符 \\x0C';
sHlpAnyNL       = '任何换行符';
sHlpTab         = '制表符 \\x09';
sHlpVTab        = '垂直制表符 \\x0B';
sHlpDigit       = '数字 [0-9]';
sHlpNonDigit    = '非数字 [^0-9]';
sHlpWhiteSp     = '空白字符 [ \\f\\n\\t\\v]';
sHlpNonWhiteSp  = '非空白字符';
sHlpWordChar    = '单词字符 [A-Za-z0-9_]';
sHlpNonWordChar = '非单词字符';
sHlpCharHex     = '字符 - 16 进制编码, 范围 0-10FFFF';
sHlpCharHex2    = '字符 - 2 位 16 进制编码';
sHlpCharHex4    = '字符 - 4 位 16 进制编码';
sHlpBeginLine   = '行开头';
sHlpEndLine     = '行末尾';
sHlpBeginText   = '文本开头';
sHlpEndText     = '文本末尾';
sHlpBeginRange  = '搜索范围的开头';
sHlpEndRange    = '搜索范围的末尾';
sHlpWordBoun    = '单词边界';
sHlpNonWordBoun = '非单词边界';
sHlpAlternative = '匹配 ab 或 xy';
sHlpCharSet     = '字符集合, 匹配所包含的任意一个字符';
sHlpNegCharSet  = '负值字符集合,匹配未包含的任意字符';
sHlpRange       = '匹配 a 到 z 范围内的任意小写字母字符';
sHlpNegRange    = '匹配任何不在 a 到 z 范围内的任意字符';
sHlpCapture     = '匹配 ab 并获取这一匹配';
sHlpNotCapture  = '匹配 ab 但不获取匹配';
sHlpPreceded    = '前面带有 ab';
sHlpNotPreceded = '前面不带有 ab';
sHlpFollowed    = '在任何匹配 ab 的字符串开始处匹配查找字符串';
sHlpNotFollowed = '在任何不匹配 ab 的字符串开始处匹配查找字符串';
sHlpBackrefer9  = '向后引用, 范围 1-9';
sHlpBackrefer99 = '向后引用, 范围 01-99';
sHlpZeroOrOne   = '匹配前面的子表达式零次或一次';
sHlpZeroOrMore  = '匹配前面的子表达式零次或多次';
sHlpOneOrMore   = '匹配前面的子表达式一次或多次';
sHlpExactly     = '精确匹配 3 次';
sHlpAtLeast     = '最少匹配 3 次';
sHlpFromTo      = '匹配 3 到 7 次的';
sHlpBackslash   = '反斜线';
sHlpNL          = '换行符';
sHlpEntireStr   = '匹配整个字符串';
sHlpSubmatch9   = '第 9 个捕捉子匹配, 范围 1-9';
sHlpSubmatch99  = '第 99 个捕捉子匹配, 范围 01-99';
sHlpNonGreedy   = '限定符 ?*+{} 懒惰模式';
- Chinese-Simplified by cnnnc


Last edited by KDJ on Mon Mar 25, 2013 7:22 pm; edited 7 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1081
Location: Poland

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

Minimize, maximize or restore tab in MDI mode.

TabMinMax.js

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

if (AkelPad.GetEditWnd() && (AkelPad.IsMDI() == 1 /*WMD_MDI*/))
{
  var oSys     = AkelPad.SystemFunction();
  var hMainWnd = AkelPad.GetMainWnd();
  var lpFrame  = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
  var hWndMdi  = AkelPad.SendMessage(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);
}
Back to top
View user's profile Send private message
akkorn



Joined: 08 Feb 2013
Posts: 32

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

Comparison checksum of selected texts (CRC32txt)
Ôóíêöèÿ îòîáðàæåíèÿ êîíòðîëüíîé ñóììû âûäåëåííîãî òåêñòà+ ñðàâíåíèå ñ ïðåäûäóùèìè ðåçóëüòàòàìè (îòîáðàæàþòñÿ â íîâîé âêëàäêå ïðè ñîãëàñèè ïîëüçîâàòåëÿ).

Óñëîâèÿ ðàáîòû:
1) Íóæåí óñòàíîâëåííûé ïëàãèí Scripts
2) Â ïàïêå (...\AkelFiles\Plugs\Scripts\) ñîçäàåì Íîâûé òåêñòîâûé äîêóìåíò è êîïèðóåì â íåãî êîä, ðàñïîëîæåííûé íèæå
3) Èçìåíÿåì èìÿ ñîçäàííîãî ôàéëà íà "CRC32txt.vbs"
4) Âûçûâàåì ñêðèïò ñëåäóþùåé êîìàíäîé:
Code:
Call("Scripts::Main", 1, "CRC32txt.vbs")

Èç ïàíåëè ïëàãèíà Toolbar êîä âûçîâà ïëàãèíà áóäåò ñëåäóþùèì (îáðàòèòå âíèìàíèå íà ëèäèðóþùèé ìèíóñ, èíà÷å êíîïêà áóäåò "çàëèïàòü"):
Code:
-"Check CRC selected text" Call("Scripts::Main", 1, "CRC32txt.vbs") Icon(38)


CRC32txt.vbs
Code:

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

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

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

' Declarations
Option Explicit

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

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

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

Sub Main()
'vTimer = Timer
'msgbox fTimer

Call PreparingData()

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

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

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

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

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

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

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

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

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

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

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

Function PreviewText(sText, sLenght)
Dim StatText

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

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

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

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

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

FindLogTab = False

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

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

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

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

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

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

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

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

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

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

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

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

Call CRC32Setup
iCRC = &HFFFFFFFF

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

CRC32 = iCRC Xor &HFFFFFFFF
End Function

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

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

If CRC32SetupExit Then
    Exit Function
End If

iOffset = 0
nLen = 32

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Îáñóæäåíèå ñêðèïòà, âîïðîñû- âñå çäåñü:
http://akelpad.sourceforge.net/forum/viewtopic.php?t=1504


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



Joined: 06 Aug 2007
Posts: 1440

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

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

// (c) Infocatcher 2013
// version 0.1.1 - 2013-05-06

// Compare contents of current and next selected tab using WinMerge (http://winmerge.org/)
// or any other compare tool

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

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

function _localize(s) {
   var strings = {
      "No tabs!": {
         ru: "Îòñóòñòâóþò âêëàäêè!"
      },
      "MDI or PMDI window mode required!": {
         ru: "Òðåáóåòñÿ îêîííûé ðåæèì MDI èëè PMDI!"
      },
      "WinMerge not found!": {
         ru: "Íå óäàëîñü íàéòè WinMerge!"
      },
      "Select tab!": {
         ru: "Âûáåðèòå âêëàäêó!"
      },
      "Not found file from first tab:\n": {
         ru: "Íå íàéäåí ôàéë èç ïåðâîé âêëàäêè:\n"
      },
      "Not found file from second tab:\n": {
         ru: "Íå íàéäåí ôàéë èç âòîðîé âêëàäêè:\n"
      }
   };
   var lng;
   switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
      case 0x19: lng = "ru"; break;
      default:   lng = "en";
   }
   _localize = function(s) {
      return strings[s] && strings[s][lng] || s;
   };
   return _localize(s);
}

var 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("|")
   : [
      "<HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\WinMergeU.exe\\>",
      "<HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\WinMerge.exe\\>",
      "%ProgramFiles%\\WinMerge\\WinMergeU.exe",
      "%ProgramFiles (x86)%\\WinMerge\\WinMergeU.exe",
      "%AkelDir%\\..\\WinMergePortable\\WinMergePortable.exe",
      "%COMMANDER_PATH%\\..\\WinMergePortable\\WinMergePortable.exe"
   ];

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

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

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

      var showDelay = 600;
      var hideDelay = 150;
      try {
         var window = new ActiveXObject("htmlfile").parentWindow;
         var shown = true;
         var timer = window.setTimeout(function blink() {
            statusbar.set(shown ? "" : statusMsg);
            timer = window.setTimeout(blink, (shown = !shown) ? showDelay : hideDelay);
         }, showDelay);
      }
      catch(e) {
      }
   }

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

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

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

   setRedraw(hMainWnd, false);

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

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

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

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

   var cmdLine = cmdLineTemplate
      .replace("<exe>", '"' + winMerge + '"')
      .replace("<f1>", '"' + file + '"')
      .replace("<f2>", '"' + file2 + '"');
   var wm = wsh.Exec(cmdLine);
   if(file.isTemp || file2.isTemp) {
      // If WinMerge are already opened, new process will be immediately closed,
      // so don't delete files too early
      WScript.Sleep(4000);
      for(;;) {
         if(wm.Status != 0) {
            if(file.isTemp)
               fso.DeleteFile(file);
            if(file2.isTemp)
               fso.DeleteFile(file2);
            break;
         }
         WScript.Sleep(1500);
      }
   }
}
function getFile(lpFrame) {
   AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame);
   var hWndEdit = AkelPad.GetEditWnd();
   var origFile = AkelPad.GetEditFile(hWndEdit);
   var file = origFile;
   if(!origFile || AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0)) {
      if(origFile && save)
         AkelPad.Command(4105); // IDM_FILE_SAVE
      else {
         var tempFile = file = getTempFile(hWndEdit, origFile);
         if(origFile) {
            var codePage = AkelPad.GetEditCodePage(hWndEdit);
            var hasBOM = AkelPad.GetEditBOM(hWndEdit);
         }
         else {
            // Will use UTF-8 with BOM to correctly save all (most?) new documents
            var codePage = 65001;
            var hasBOM = 1;
         }
         var text = AkelPad.GetTextRange(0, -1);

         AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 0);
         AkelPad.SetSel(0, -1);
         AkelPad.ReplaceSel(text);
         var err = AkelPad.SaveFile(AkelPad.GetEditWnd(), tempFile, codePage, hasBOM);
         if(err) // Allow silently close tab
            AkelPad.SendMessage(AkelPad.GetEditWnd(), 3087 /*AEM_SETMODIFY*/, 0, 0);
         AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
      }
   }
   return file;
}
function getWinMerge() {
   for(var i = 0, l = winMergePaths.length; i < l; ++i) {
      var path = expandVariables(winMergePaths[i]);
      if(fso.FileExists(path))
         return path;
   }
   return "";
}
function getWinMergePaths() {
   var out = [];
   for(var i = 0, l = winMergePaths.length; i < l; ++i) {
      var rawPath = winMergePaths[i];
      var path = expandVariables(rawPath);
      out[out.length] = path == rawPath
         ? path
         : rawPath + " => " + path
   }
   return out.join("\n");
}
function getTempFile(hWndEdit, file) {
   var fileName, fileExt;
   var tmp = file && /[^\/\\]+$/.test(file) && RegExp.lastMatch;
   if(tmp) {
      fileExt = /\.[^.]+$/.test(tmp) && RegExp.lastMatch || "";
      fileName = tmp.slice(0, -fileExt.length);
   }
   else {
      fileExt = getCurrentExtension();
      fileName = "akelpad-temp";
   }
   var tmpDir = expandVariables(tempDir);
   if(!fso.FolderExists(tmpDir))
      fso.CreateFolder(tmpDir);
   var i = -1;
   do tmp = tmpDir + "\\" + fileName + (++i ? "-" + i : "") + fileExt;
   while(fso.FileExists(tmp));
   var out = new String(tmp);
   out.isTemp = true;
   return out;
}
function getCurrentExtension() {
   var alias = getCoderAlias();
   if(/\.[^.]+$/.test(alias))
      return RegExp.lastMatch;
   return ".txt";
}
function getCoderAlias() {
   // http://akelpad.sourceforge.net/forum/viewtopic.php?p=19363#19363
   var hWndEdit = AkelPad.GetEditWnd();
   var hDocEdit = AkelPad.GetEditDoc();
   var pAlias = "";
   if(hWndEdit && hDocEdit) {
      var lpAlias = AkelPad.MemAlloc(256 * 2 /*sizeof(wchar_t)*/);
      if(lpAlias) {
         AkelPad.CallW("Coder::Settings", 18 /*DLLA_CODER_GETALIAS*/, hWndEdit, hDocEdit, lpAlias, 0);
         pAlias = AkelPad.MemRead(lpAlias, 1 /*DT_UNICODE*/);
         AkelPad.MemFree(lpAlias);
      }
   }
   return pAlias;
}

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

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

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

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



Joined: 06 Mar 2010
Posts: 1081
Location: Poland

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

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

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

AkelPadMethodsView.js

Code:
// AkelPadMethodsView.js - ver. 2013-06-15
//
// List of AkelPad methods from Scripts-*.txt files
//
// Usage:
// Call("Scripts::Main", 1, "AkelPadMethodsView.js")
// Required to include: InputBox_function.js
//
// F1 hotkey - menu

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

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

  oSys.Call("User32::SetForegroundWindow", hWndDlg);
}
else
{
  if (! AkelPad.Include("InputBox_function.js"))
    WScript.Quit();

  var sScriptName = "AkelPad methods view";
  var hMainWnd    = AkelPad.GetMainWnd();
  var hGuiFont    = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
  var oFSO        = new ActiveXObject("Scripting.FileSystemObject");
  var nDlgX       = 230;
  var nDlgY       = 200;
  var nDlgW       = 610;
  var nDlgH       = 300;
  var nDlgMinW    = nDlgW;
  var nDlgMinH    = nDlgH;
  var nAPMSel     = 0;
  var bAPMSort    = true;
  var nAPMLang    = 0;
  var bWordWrap   = false;
  var sFindName   = "";
  var sFindText   = "";
  var aAPM        = [];
  var aIsLang     = [false, false];
  var sHeader;
  var hSubClass;
  var hFocus;

  ReadIni();
  GetArrayAPM();
  if (! aAPM.length)
    WScript.Quit();

  var lpTextLV = AkelPad.MemAlloc(512 * 2);
  var lpLVITEM = AkelPad.MemAlloc(15 * 4); //sizeof(LVITEM)
  AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpLVITEM + 20, lpTextLV, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpLVITEM + 24, 512, 3 /*DT_DWORD*/);

  var aDlg      = [];
  var IDHEADERS = 1000;
  var IDNAMELV  = 1001;
  var IDTEXTAE  = 1002;
  var IDSORTB   = 1003;
  var IDLANG1B  = 1004;
  var IDLANG2B  = 1005;
  var IDMENUB   = 1006;
  var IDOKB     = 1007;
  var IDCLOSEB  = 1008;
  aDlg[IDHEADERS] = {Txt: sHeader,         Class: "STATIC",        Style: 0x50000001 /*WS_VISIBLE|WS_CHILD|SS_CENTER*/};
  aDlg[IDNAMELV ] = {Txt: "",              Class: "SysListView32", Style: 0x5081800D /*WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_REPORT*/};
  aDlg[IDTEXTAE ] = {Txt: "",              Class: "AkelEditW",     Style: 0x50B10804 /*WS_VISIBLE|WS_CHILD|WS_BORDER|WS_VSCROLL|WS_HSCROLL|ES_READONLY|ES_MULTILINE*/};
  aDlg[IDSORTB  ] = {Txt: "&Sort methods", Class: "BUTTON",        Style: 0x50000003 /*WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX*/};
  aDlg[IDLANG1B ] = {Txt: "&English",      Class: "BUTTON",        Style: 0x50000009 /*WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON*/};
  aDlg[IDLANG2B ] = {Txt: "&Russian",      Class: "BUTTON",        Style: 0x50000009 /*WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON*/};
  aDlg[IDMENUB  ] = {Txt: "&Menu",         Class: "BUTTON",        Style: 0x50000000 /*WS_VISIBLE|WS_CHILD*/};
  aDlg[IDOKB    ] = {Txt: "OK",            Class: "BUTTON",        Style: 0x50000001 /*WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON*/};
  aDlg[IDCLOSEB ] = {Txt: "Close",         Class: "BUTTON",        Style: 0x50000000 /*WS_VISIBLE|WS_CHILD*/};

  AkelPad.WindowRegisterClass(sClassName);

  hWndDlg = oSys.Call("User32::CreateWindowExW",
    0,              //dwExStyle
    sClassName,     //lpClassName
    sScriptName,    //lpWindowName
    0x90CE0000,     //dwStyle=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX
    nDlgX,          //x
    nDlgY,          //y
    nDlgW,          //nWidth
    nDlgH,          //nHeight
    hMainWnd,       //hWndParent
    0,              //ID
    hInstance,      //hInstance
    DialogCallback);//Script function callback. To use it class must be registered by WindowRegisterClass.

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

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

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

    for (i = IDHEADERS; 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
        0, 0, 0, 0,   //x, y, nWidth, nHeight
        hWnd,         //hWndParent
        i,            //ID
        hInstance,    //hInstance
        0);           //lpParam
      SetWindowFont(aDlg[i].Handle, hGuiFont);
    }

    CheckButtons();

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

    InsertColumnLV();
    FillLV(nAPMSel, AkelPad.GetSelText(), true);
    hFocus = aDlg[IDNAMELV].Handle;
  }

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

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

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

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

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

    if ((wParam == 9 /*VK_TAB*/) && ((nID == IDLANG1B) || (nID == IDLANG2B)))
      oSys.Call("User32::SetFocus", oSys.Call("User32::GetNextDlgTabItem", hWnd, aDlg[nID].Handle, Shift()));
    else if ((wParam >= 0x21 /*VK_PRIOR*/) && (wParam <= 0x28 /*VK_DOWN*/) && Ctrl() && (!Shift()) && Alt())
      MoveDlg(wParam);
    else if ((wParam == 0x46 /*F key*/) && Ctrl() && (! Alt()))
    {
      if (nID == IDNAMELV)
        FindName(Shift() ? 2 : 0);
      else if (nID == IDTEXTAE)
        FindText(Shift() ? 2 : 0);
    }
    else if ((wParam == 0x70 /*VK_F1*/) && (! Ctrl()) && (! Shift()) && (! Alt()))
      Menu();
    else if ((wParam == 0x72 /*VK_F3*/) && (! Ctrl()) && (! Alt()))
    {
      if (nID == IDNAMELV)
        FindNameNext(Shift() ? 3 : 1);
      else if (nID == IDTEXTAE)
        FindTextNext(Shift() ? 3 : 1);
    }
    else if ((wParam == 0x55 /*U key*/) && Ctrl() && (! Shift()) && (! Alt()))
    {
      bWordWrap = ! bWordWrap;
      SetWordWrapAE();
    }
    else if ((wParam == 13 /*VK_RETURN*/) && (nID < IDMENUB))
      oSys.Call("User32::PostMessageW", hWnd, 273 /*WM_COMMAND*/, IDOKB, 0);
    else if (wParam == 27 /*VK_ESCAPE*/)
      oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

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

    if (wParam == 0x46 /*F key*/)
    {
      if (nID == IDNAMELV)
        FindName(Shift() ? 3 : 1);
      else if (nID == IDTEXTAE)
        FindText(Shift() ? 3 : 1);
    }
  }

  else if ((uMsg == 0x004E /*WM_NOTIFY*/) && (wParam == IDNAMELV))
  {
    switch (AkelPad.MemRead(lParam + 8, 3 /*DT_DWORD*/))
    {
      case -101 : //LVN_ITEMCHANGED
        if (AkelPad.MemRead(lParam + 20 /*NMLISTVIEW.uNewState*/, 3 /*DT_DWORD*/) & 0x2 /*LVIS_SELECTED*/)
          SetWindowText(aDlg[IDTEXTAE].Handle, aAPM[GetCurSelLV()][1]);
        break;
      case -3 : //NM_DBLCLK
        if (AkelPad.MemRead(lParam + 12 /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
          SetCurSelLV(GetCurFocLV());
        else
          oSys.Call("User32::PostMessageW", hWnd, 273 /*WM_COMMAND*/, IDOKB, 0);
        break;
      case -2 : //NM_CLICK
      case -5 : //NM_RCLICK
      case -6 : //NM_RDBLCLK
        if (AkelPad.MemRead(lParam + 12 /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
          SetCurSelLV(GetCurFocLV());
        break;
      case -7 : //NM_SETFOCUS
        hFocus = aDlg[IDNAMELV].Handle;
        break;
    }
  }

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

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

      CheckButtons(nLowParam);
      GetArrayAPM();

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

  else if (uMsg == 16) //WM_CLOSE
  {
    nAPMSel = GetCurSelLV();

    if (wParam && (nAPMSel >= 0) && (aAPM[nAPMSel][0].charAt(0) != "*") && AkelPad.GetEditWnd())
      MethodToEditText();

    WriteIni();
    AkelPad.WindowUnsubClass(aDlg[IDTEXTAE].Handle);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

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

  return 0;
}

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

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

  return 0;
}

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

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

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

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

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

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

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

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

  AkelPad.MemFree(lpRect);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

function GetItemCountLV()
{
  return AkelPad.SendMessage(aDlg[IDNAMELV].Handle, 0x1004 /*LVM_GETITEMCOUNT*/, 0, 0);
}

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

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

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

function InsertColumnLV()
{
  var lpLVCOLUMN = AkelPad.MemAlloc(40) //sizeof(LVCOLUMN)

  AkelPad.MemCopy(lpLVCOLUMN, 4 /*mask=LVCF_TEXT*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpLVCOLUMN + 12, lpTextLV, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpTextLV, "Name", 1 /*DT_UNICODE*/);

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

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

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

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

    if (sFind)
    {
      if ((bFindOnStart && (aAPM[i][0].indexOf(sFind) > -1)) || ((! bFindOnStart) && (aAPM[i][0] == sFind)))
      {
        if (bFindOnStart)
          sFindName = sFind;

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

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

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

function GetArrayAPM()
{
  var sDocsDir = AkelPad.GetAkelDir(2 /*ADTYPE_DOCS*/) + "\\";
  var aLang    = ["Eng", "Rus"];
  var aDocFile = [];
  var sText;
  var lpTextA;
  var lpTextW;
  var nTextWLen;
  var aExec;
  var oRE;
  var i;

  sHeader     = "";
  aAPM.length = 0;

  for (i = 0; i < 2; ++i)
  {
    aDocFile[i] = "Scripts-" + aLang[i] + ".txt";
    aIsLang[i]  = oFSO.FileExists(sDocsDir + aDocFile[i]);
  }

  if (! (aIsLang[0] || aIsLang[1]))
  {
    AkelPad.MessageBox(hMainWnd, "Files not found:\n" + sDocsDir + aDocFile[0] + "\n" + sDocsDir + aDocFile[1], sScriptName, 0x30 /*MB_ICONWARNING*/);
    return;
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

function ResizeDlg(nW, nH)
{
  var nFlags = 0x14; //SWP_NOACTIVATE|SWP_NOZORDER
  var nLVW   = 200;
  var nAEW   = nW - nLVW - 30;
  var i;

  oSys.Call("User32::SetWindowPos",
    aDlg[IDHEADERS].Handle, 0,
    nW - nAEW - 10,
    13,
    nAEW,
    13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDNAMELV].Handle, 0,
    10,
    10,
    nLVW,
    nH - 53,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDTEXTAE].Handle, 0,
    nW - nAEW - 10,
    30,
    nAEW,
    nH - 73,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDSORTB].Handle, 0,
    10,
    nH - 30,
    85,
    16,
    nFlags);
  for (i = IDLANG1B; i <= IDLANG2B; ++i)
  {
    oSys.Call("User32::SetWindowPos",
      aDlg[i].Handle, 0,
      20 + nLVW + 60 * (i - IDLANG1B),
      nH - 30,
      55,
      16,
      nFlags);
  }
  for (i = IDMENUB; i <= IDCLOSEB; ++i)
  {
    oSys.Call("User32::SetWindowPos",
      aDlg[i].Handle, 0,
      nW - (70 + 10) * (IDCLOSEB - i + 1),
      nH - 33,
      70,
      23,
      nFlags);
  }

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

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

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

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

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

function FindName(nDirection)
{
  InputBox(aDlg[IDNAMELV].Handle, "Find name " + ["down from beginning", "down from current position", "up from end", "up from current position"][nDirection], "Name:", sFindName, 0, CheckFindName, nDirection);
}

function CheckFindName(hWnd, aName, nDirection)
{
  if (aName[0])
  {
    sFindName = aName[0];
    if (! FindNameNext(nDirection))
    {
      AkelPad.MessageBox(hWnd, "Not found.", sScriptName, 0x30 /*MB_ICONWARNING*/);
      return 0;
    }
    }

  return -1;
}

function FindNameNext(nDirection)
{
  var bFound = false;
  var nStart;
  var i;

  if (nDirection < 2)
  {
    if (nDirection == 0)
      nStart = 0;
    else
      nStart = GetCurSelLV() + 1;

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

    for (i = nStart; i >= 0; --i)
    {
      if (aAPM[i][0].indexOf(sFindName) > -1)
      {
        SetCurSelLV(i);
        bFound = true;
        break;
      }
    }
  }

  return bFound;
}

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

  if (! sText)
    sText = sFindText;

  InputBox(aDlg[IDTEXTAE].Handle, "Find text " + ["down from beginning", "down from current position", "up from end", "up from current position"][nDirection], "Text:", sText, 0, CheckFindText, nDirection);
}

function CheckFindText(hWnd, aText, nDirection)
{
  if (aText[0])
  {
    sFindText = aText[0];
    if (! FindTextNext(nDirection))
    {
      AkelPad.MessageBox(hWnd, "Not found.", sScriptName, 0x30 /*MB_ICONWARNING*/);
      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)
    {
      nSel = aAPM[i][1].indexOf(sFindText, (i == nNameStart) ? nTextStart : 0);

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

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

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

  return bFound;
}

function MethodToEditText()
{
  if (aAPM[nAPMSel][0].charAt(0) == "A")
  {
    var sSelText = AkelPad.GetSelText(0);
    AkelPad.ReplaceSel(aAPM[nAPMSel][0] + "(" + sSelText + ")");
    AkelPad.SetSel(AkelPad.GetSelEnd() - sSelText.length - 1, AkelPad.GetSelEnd() - 1);
  }
  else
    AkelPad.ReplaceSel(aAPM[nAPMSel][0], true);
}

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

  for (i = 1; i <= 2; ++i)
  {
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0000 | i, "Down form beginning\tCtrl+F");
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0200 | i, "Up from end\tCtrl+Shift+F");
    oSys.Call("user32::AppendMenuW", aMenu[i - 1], MF_SEPARATOR, 0);
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0100 | i, "Down from current position\tAlt+F");
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0300 | i, "Up from current position\tShift+Alt+F");
    oSys.Call("user32::AppendMenuW", aMenu[i - 1], MF_SEPARATOR, 0);
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0400 | i, "Next\tF3");
    oSys.Call("User32::AppendMenuW", aMenu[i - 1], MF_STRING, 0x0500 | i, "Previous\tShift+F3");
  }

  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2503 /*VK_LEFT*/,  "Move left\tCtrl+Alt+Left");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2703 /*VK_RIGHT*/, "Move right\tCtrl+Alt+Right");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2603 /*VK_UP*/,    "Move up\tCtrl+Alt+Up");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2803 /*VK_DOWN*/,  "Move down\tCtrl+Alt+Down");
  oSys.Call("user32::AppendMenuW", hMenu3, MF_SEPARATOR, 0);
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2403 /*VK_HOME*/,  "To left edge\tCtrl+Alt+Home");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2303 /*VK_END*/,   "To right edge\tCtrl+Alt+End");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2103 /*VK_PRIOR*/, "To top edge\tCtrl+Alt+PgUp");
  oSys.Call("User32::AppendMenuW", hMenu3, MF_STRING, 0x2203 /*VK_NEXT*/,  "To bottom edge\tCtrl+Alt+PgDn");

  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP,  hMenu1, "Find name");
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP,  hMenu2, "Find text");
  oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP,  hMenu3, "Window");
  oSys.Call("User32::AppendMenuW", hMenu, (bWordWrap ? MF_CHECKED : MF_STRING), 0x0004, "Wrap lines\tCtrl+U");

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

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x01A8 /*TPM_NONOTIFY|TPM_RETURNCMD|TPM_BOTTOMALIGN|TPM_RIGHTALIGN*/, oRect.X + oRect.W, oRect.Y, 0, hWndDlg, 0);

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

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

  if (nCmd == 1)
  {
    oSys.Call("User32::SetFocus", aDlg[IDNAMELV].Handle);
    if (nCmd1 < 4)
      FindName(nCmd1);
    else if (nCmd1 == 4)
      FindNameNext(1);
    else if (nCmd1 == 5)
      FindNameNext(3);
  }
  if (nCmd == 2)
  {
    oSys.Call("User32::SetFocus", aDlg[IDTEXTAE].Handle);
    if (nCmd1 < 4)
      FindText(nCmd1);
    else if (nCmd1 == 4)
      FindTextNext(1);
    else if (nCmd1 == 5)
      FindTextNext(3);
  }
  if (nCmd == 3)
    MoveDlg(nCmd1);
  else if (nCmd == 4)
  {
    bWordWrap = ! bWordWrap;
    SetWordWrapAE();
  }
}

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

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

  if (nDlgW < nDlgMinW) nDlgW = nDlgMinW;
  if (nDlgH < nDlgMinH) nDlgH = nDlgMinH;
}

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

  GetWindowPos(hWndDlg, oRect);

  sIniTxt =
    'nDlgX='      + oRect.X + ';\r\n' +
    'nDlgY='      + oRect.Y + ';\r\n' +
    'nDlgW='      + oRect.W + ';\r\n' +
    'nDlgH='      + oRect.H + ';\r\n' +
    'nAPMSel='    + nAPMSel + ';\r\n' +
    'bAPMSort='   + bAPMSort + ';\r\n' +
    'nAPMLang='   + nAPMLang + ';\r\n' +
    'bWordWrap='  + bWordWrap + ';\r\n' +
    'sFindName="' + EscapeStr(sFindName) + '";\r\n' +
    'sFindText="' + EscapeStr(sFindText) + '";'
   
  oFile.Write(sIniTxt);
  oFile.Close();
}

function EscapeStr(sText)
{
  return sText.replace(/[\\"]/g, '\\$&').replace(/\n/g, '\\n').replace(/\r/g, '\\r');
}
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3 ... 15, 16, 17
Page 17 of 17

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


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