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 ... 18, 19, 20, 21, 22  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
KDJ



Joined: 06 Mar 2010
Posts: 1915
Location: Poland

PostPosted: Mon Sep 01, 2014 8:19 pm    Post subject: Reply with quote

GUI for marking specified text via Coder plugin - part 1. Part 2 in the next post.

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

TextMarker.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=25700#25700
// Version: 2015-12-15
// Author: KDJ
//
// *** GUI for marking specified text via Coder plugin ***
//
// Required to include: CreateDialog_functions.js and InputBox_function.js
//
// Usage:
//   Call("Scripts::Main", 1, "TextMarker.js")
//
// Keyboard and mouse:
//   F1         - help for regular expressions (if "Regular expressions" is checked)
//   Ctrl+F1    - AkelHelp-*.htm in default browser (if "Regular expressions" is checked)
//   Shift+F1   - AkelHelp-*.htm in HtmlView.js (if "Regular expressions" is checked)
//   Ins        - new marker
//   F2         - rename marker
//   Del        - delete marker with the prompt (Ctrl+Del, Shift+Del - delete marker immediately)
//   F3         - find down
//   Shift+F3   - find up
//   Alt+,      - previous item in list
//   Alt+.      - next item in list
//   Ctrl+Enter - mark/unmark (also Shitf+Enter)
//   double click on list item - mark/unmark
//
// Remark:
//   The script should be saved in Unicode format.

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

if (IsScriptRunning() || (! AkelPad.Include("CreateDialog_functions.js")) || (! AkelPad.Include("InputBox_function.js")) || ((! AkelPad.IsPluginRunning("Coder::HighLight")) && (AkelPad.Call("Coder::HighLight") == -1 /*UD_FAILED*/)))
  WScript.Quit();

GetLangStrings();

var nDlgX = 200;
var nDlgY = 150;
var nTab  = 0;
var nMark = 0;
var aMark;

ReadIni();

var nCur = 0;
var aCur = [];
var aColor;
var hFocus;

var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
var lpTextLV = AkelPad.MemAlloc(1024 * 2);
var lpLVITEM = AkelPad.MemAlloc(_X64 ? 72 : 60 /*sizeof(LVITEM)*/);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 0),                0x0001, 3 /*DT_DWORD*/); //mask=LVIF_TEXT
AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 24 : 20), lpTextLV, 2 /*DT_QWORD*/); //pszText
AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 32 : 24),     1024, 3 /*DT_DWORD*/); //cchTextMax

var IDTABTC     = 2000;
var IDMARKLV    = 2001;
var IDTCOLORS   = 2002;
var IDTCOLORB   = 2003;
var IDTCOLORE   = 2004;
var IDTCOLORCB  = 2005;
var IDBCOLORS   = 2006;
var IDBCOLORB   = 2007;
var IDBCOLORE   = 2008;
var IDBCOLORCB  = 2009;
var IDFONTS     = 2010;
var IDFONTCB    = 2011;
var IDTEXTS     = 2012;
var IDTEXTE     = 2013;
var IDMATCHCASE = 2014;
var IDWHOLEWORD = 2015;
var IDREGEXP    = 2016;
var IDHELP      = 2017;
var IDNEW       = 2018;
var IDRENAME    = 2019;
var IDDELETE    = 2020;
var IDMARK      = 2021;
var IDUNMARK    = 2022;
var IDUNMARKALL = 2023;
var IDFINDDOWN  = 2024;
var IDFINDUP    = 2025;
var aDlg        = [];

aDlg.Class    = sClass;
aDlg.Title    = sTxtDlgTitle;
aDlg.Style    = WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX;
aDlg.X        = nDlgX;
aDlg.Y        = nDlgY;
aDlg.W        = 608;
aDlg.H        = 338;
aDlg.Parent   = AkelPad.GetMainWnd();
aDlg.Callback = DialogCallback;
aDlg.CtlFirst = 2000;
aDlg.CtlStyle = WS_VISIBLE;
aDlg.CtlFont  = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
aDlg.SizeClt  = true;

aDlg[IDTABTC]     = {X:   5, Y:   5, W: 574, H:  20, Class: "SysTabControl32",              Style: TCS_FIXEDWIDTH|TCS_FOCUSNEVER};
aDlg[IDMARKLV]    = {X:   5, Y:  25, W: 598, H: 150, Class: "SysListView32",                Style: WS_TABSTOP|WS_BORDER|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_REPORT};
aDlg[IDTCOLORS]   = {X:   5, Y: 185, W:  90, H:  13, Class: "STATIC", Title: sTxtTextColor};
aDlg[IDTCOLORB]   = {X:   5, Y: 200, W:  21, H:  21, Class: "BUTTON",                       Style: WS_TABSTOP|WS_BORDER|BS_OWNERDRAW};
aDlg[IDTCOLORE]   = {X:  27, Y: 200, W:  67, H:  21, Class: "AkelEditW",                    Style: WS_TABSTOP|WS_BORDER};
aDlg[IDTCOLORCB]  = {X:  95, Y: 200, W: 130, H: 300, Class: "COMBOBOX",                     Style: WS_TABSTOP|WS_VSCROLL|CBS_DROPDOWNLIST};
aDlg[IDBCOLORS]   = {X: 235, Y: 185, W:  90, H:  13, Class: "STATIC", Title: sTxtBkColor};
aDlg[IDBCOLORB]   = {X: 235, Y: 200, W:  21, H:  21, Class: "BUTTON",                       Style: WS_TABSTOP|WS_BORDER|BS_OWNERDRAW};
aDlg[IDBCOLORE]   = {X: 257, Y: 200, W:  67, H:  21, Class: "AkelEditW",                    Style: WS_TABSTOP|WS_BORDER};
aDlg[IDBCOLORCB]  = {X: 325, Y: 200, W: 130, H: 300, Class: "COMBOBOX",                     Style: WS_TABSTOP|WS_VSCROLL|CBS_DROPDOWNLIST};
aDlg[IDFONTS]     = {X: 465, Y: 185, W: 138, H:  13, Class: "STATIC", Title: sTxtFontStyle};
aDlg[IDFONTCB]    = {X: 465, Y: 200, W: 138, H: 100, Class: "COMBOBOX",                     Style: WS_TABSTOP|CBS_DROPDOWNLIST};
aDlg[IDTEXTS]     = {X:   5, Y: 230, W:  60, H:  13, Class: "STATIC", Title: sTxtText};
aDlg[IDTEXTE]     = {X:   5, Y: 245, W: 596, H:  35, Class: "AkelEditW",                    Style: WS_TABSTOP|WS_BORDER|WS_VSCROLL|ES_MULTILINE};
aDlg[IDMATCHCASE] = {X:   5, Y: 285, W: 115, H:  16, Class: "BUTTON", Title: sTxtCaseSens,  Style: WS_TABSTOP|BS_AUTOCHECKBOX};
aDlg[IDWHOLEWORD] = {X: 150, Y: 285, W: 115, H:  16, Class: "BUTTON", Title: sTxtWholeWord, Style: WS_TABSTOP|BS_AUTOCHECKBOX};
aDlg[IDREGEXP]    = {X: 295, Y: 285, W: 140, H:  16, Class: "BUTTON", Title: sTxtRegExp,    Style: WS_TABSTOP|BS_AUTOCHECKBOX};
aDlg[IDHELP]      = {X: 587, Y: 285, W:  16, H:  16, Class: "BUTTON", Title: "?",           Style: BS_PUSHBUTTON};
aDlg[IDNEW]       = {X:   5, Y: 310, W:  73, H:  23, Class: "BUTTON", Title: sTxtNew,       Style: BS_PUSHBUTTON};
aDlg[IDRENAME]    = {X:  80, Y: 310, W:  73, H:  23, Class: "BUTTON", Title: sTxtRename,    Style: BS_PUSHBUTTON};
aDlg[IDDELETE]    = {X: 155, Y: 310, W:  73, H:  23, Class: "BUTTON", Title: sTxtDelete,    Style: BS_PUSHBUTTON};
aDlg[IDMARK]      = {X: 230, Y: 310, W:  73, H:  23, Class: "BUTTON", Title: sTxtMark,      Style: BS_PUSHBUTTON};
aDlg[IDUNMARK]    = {X: 305, Y: 310, W:  73, H:  23, Class: "BUTTON", Title: sTxtUnmark,    Style: BS_PUSHBUTTON};
aDlg[IDUNMARKALL] = {X: 380, Y: 310, W:  73, H:  23, Class: "BUTTON", Title: sTxtUnmarkAll, Style: BS_PUSHBUTTON};
aDlg[IDFINDDOWN]  = {X: 455, Y: 310, W:  73, H:  23, Class: "BUTTON", Title: sTxtFindDown,  Style: BS_PUSHBUTTON};
aDlg[IDFINDUP]    = {X: 530, Y: 310, W:  73, H:  23, Class: "BUTTON", Title: sTxtFindUp,    Style: BS_PUSHBUTTON};

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

CreateDialogWindow(aDlg, 1);

AkelPad.WindowGetMessage();
AkelPad.WindowUnregisterClass(sClass);

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

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

  if (uMsg == 1 /*WM_CREATE*/)
  {
    CreateDialogWindow(aDlg, 2, hWnd);
    InitDialog();
  }

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

  else if (uMsg == 7 /*WM_SETFOCUS*/)
  {
    oSys.Call("User32::SetFocus", hFocus);
    GetCurMarksArray();
    if (nTab == 0)
      SetCurMarksID();
    else
    {
      FillLV();
      GetCurSelLV();
    }
    EnableWindows();
  }

  else if (uMsg == 43 /*WM_DRAWITEM*/)
  {
    if ((wParam == IDTCOLORB) || (wParam == IDBCOLORB))
    {
      DrawColorButton(wParam, lParam);
      return 1;
    }
  }

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

    if ((wParam == 0x09 /*VK_TAB*/) && Ctrl())
      PostMessage(aDlg[IDTABTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nTab ? 0 : 1, 0);
    else if (wParam == 0x0D /*VK_RETURN*/)
    {
      if (Ctrl() || Shift())
      {
        if (oSys.Call("User32::IsWindowEnabled", aDlg[IDMARK].HWND))
          Mark();
        else if (oSys.Call("User32::IsWindowEnabled", aDlg[IDUNMARK].HWND))
          UnMark();
      }
      else
      {
        if (hFocus == aDlg[IDTCOLORB].HWND)
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDTCOLORB, aDlg[IDTCOLORB].HWND);
        else if (hFocus == aDlg[IDBCOLORB].HWND)
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDBCOLORB, aDlg[IDBCOLORB].HWND);
      }
    }
    else if ((wParam == 0x70 /*VK_F1*/) && oSys.Call("User32::IsWindowVisible", aDlg[IDHELP].HWND))
    {
      if (Ctrl() || Shift())
        AkelHelp(GetAkelHelpFile());
      else
        RegExpHelp();
    }
    else if ((wParam == 0x71 /*VK_F2*/) && oSys.Call("User32::IsWindowEnabled", aDlg[IDRENAME].HWND))
      NewOrRenameMarker(1);
    else if ((wParam == 0x72 /*VK_F3*/) && oSys.Call("User32::IsWindowEnabled", aDlg[IDFINDDOWN].HWND))
      FindMark(Shift());
    else if ((hFocus != aDlg[IDTCOLORE].HWND) && (hFocus != aDlg[IDBCOLORE].HWND) && (hFocus != aDlg[IDTEXTE].HWND))
    {
      if ((wParam == 0x2D /*VK_INS*/) && oSys.Call("User32::IsWindowEnabled", aDlg[IDNEW].HWND))
        NewOrRenameMarker(0);
      else if ((wParam == 0x02E /*VK_DELETE*/) && oSys.Call("User32::IsWindowEnabled", aDlg[IDDELETE].HWND))
        DeleteMarker(! (Ctrl() || Shift()));
    }
  }

  else if (uMsg == 260 /*WM_SYSKEYDOWN*/)
  {
    if (wParam == 0xBC /*VK_OEM_COMMA*/)
    {
      if ((nTab == 0) && aMark.length && (nMark > 0))
        SetCurSelLV(--nMark);
      else if ((nTab == 1) && aCur.length && (nCur > 0))
        SetCurSelLV(--nCur);
    }
    else if (wParam == 0xBE /*VK_OEM_PERIOD*/)
    {
      if ((nTab == 0) && aMark.length && (nMark < aMark.length - 1))
        SetCurSelLV(++nMark);
      else if ((nTab == 1) && aCur.length && (nCur < aCur.length - 1))
        SetCurSelLV(++nCur);
    }
  }

  else if (uMsg == 123 /*WM_CONTEXTMENU*/)
  {
    if ((wParam == aDlg[IDTCOLORE].HWND) || (wParam == aDlg[IDBCOLORE].HWND) || (wParam == aDlg[IDTEXTE].HWND))
      EditMenu(wParam, LoWord(lParam), HiWord(lParam));
  }

  else if (uMsg == 0x004E /*WM_NOTIFY*/)
  {
    if (wParam == IDTABTC)
    {
      if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), 3 /*DT_DWORD*/) == -551 /*TCN_SELCHANGE*/)
      {
        nTab = SendMessage(aDlg[IDTABTC].HWND, 4875 /*TCM_GETCURSEL*/, 0, 0);
        oSys.Call("User32::SetFocus", aDlg[IDMARKLV].HWND);
        FillLV();
        GetCurSelLV();
        EnableWindows();
      }
    }
    else if (wParam == IDMARKLV)
    {
      switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), 3 /*DT_DWORD*/))
      {
        case -101 : //LVN_ITEMCHANGED
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, 3 /*DT_DWORD*/) & 0x2 /*LVIS_SELECTED*/)
          {
            GetCurSelLV();
            EnableWindows();
          }
          break;
        case -3 : //NM_DBLCLK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
            SetCurSelLV(SendMessage(aDlg[IDMARKLV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x1 /*LVNI_FOCUSED*/));
          else
          {
            if (oSys.Call("User32::IsWindowEnabled", aDlg[IDMARK].HWND))
              Mark();
            else if (oSys.Call("User32::IsWindowEnabled", aDlg[IDUNMARK].HWND))
              UnMark();
          }
          break;
        case -2 : //NM_CLICK
        case -5 : //NM_RCLICK
        case -6 : //NM_RDBLCLK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
            SetCurSelLV(SendMessage(aDlg[IDMARKLV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x1 /*LVNI_FOCUSED*/));
          break;
      }
    }
  }

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

    if ((nID == IDTCOLORB))
      ChooseColor(aDlg[IDTCOLORE].HWND, aMark[nMark][1]);

    else if (nID == IDTCOLORE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
        SetColorbyHex(1);
    }

    else if (nID == IDTCOLORCB)
    {
      if ((nCode == 1 /*CBN_SELCHANGE*/) || (nCode == 8 /*CBN_CLOSEUP*/))
        SetColorbyName(lParam, aDlg[IDTCOLORE].HWND);
    }

    else if (nID == IDBCOLORB)
      ChooseColor(aDlg[IDBCOLORE].HWND, aMark[nMark][2]);

    else if (nID == IDBCOLORE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
        SetColorbyHex(0);
    }

    else if (nID == IDBCOLORCB)
    {
      if ((nCode == 1 /*CBN_SELCHANGE*/) || (nCode == 8 /*CBN_CLOSEUP*/))
        SetColorbyName(lParam, aDlg[IDBCOLORE].HWND);
    }

    else if (nID == IDFONTCB)
    {
      if ((nCode == 1 /*CBN_SELCHANGE*/) || (nCode == 8 /*CBN_CLOSEUP*/))
      {
        aMark[nMark][3] = SendMessage(aDlg[IDFONTCB].HWND, 327 /*CB_GETCURSEL*/, 0, 0);
        GetCurMarkID(nMark);
        SetItemTextLV(nMark, 3, aMark[nMark][3].toString());
        SetItemTextLV(nMark, 8, aMark[nMark][8]);
        EnableWindows();
      }
    }

    else if (nID == IDTEXTE)
    {
      if ((nCode == 0x0300 /*EN_CHANGE*/) && (nTab == 0) && aMark.length)
      {
        aMark[nMark][4] = GetTextAE(lParam);
        GetCurMarkID(nMark);
        SetItemTextLV(nMark, 4, aMark[nMark][4]);
        SetItemTextLV(nMark, 8, aMark[nMark][8]);
        EnableWindows();
      }
    }

    else if ((nID >= IDMATCHCASE) && (nID <= IDREGEXP))
    {
      aMark[nMark][nID - IDMATCHCASE + 5] = SendMessage(aDlg[nID].HWND, 240 /*BM_GETCHECK*/, 0, 0);
      GetCurMarkID(nMark);
      SetItemTextLV(nMark, nID - IDMATCHCASE + 5, aMark[nMark][nID - IDMATCHCASE + 5].toString());
      SetItemTextLV(nMark, 8, aMark[nMark][8]);
      EnableWindows();
    }

    else if (nID == IDHELP)
      RegExpHelp();

    else if ((nID == IDNEW) || (nID == IDRENAME))
      NewOrRenameMarker(nID == IDRENAME);

    else if (nID == IDDELETE)
      DeleteMarker();

    else if (nID == IDMARK)
      Mark();

    else if ((nID == IDUNMARK) || (nID == IDUNMARKALL))
      UnMark(nID == IDUNMARKALL);

    else if ((nID == IDFINDDOWN) || (nID == IDFINDUP))
      FindMark(nID == IDFINDUP);

    else if (nID == 2 /*IDCANCEL*/)
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16 /*WM_CLOSE*/)
  {
    WriteIni();
    AkelPad.WindowUnsubClass(aDlg[IDTCOLORE].HWND);
    AkelPad.WindowUnsubClass(aDlg[IDBCOLORE].HWND);
    AkelPad.WindowUnsubClass(aDlg[IDTEXTE].HWND);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

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

  return 0;
}

function InitDialog()
{
  var lpRect   = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
  var lpText   = AkelPad.MemAlloc(48);
  var lpTCITEM = AkelPad.MemAlloc(_X64 ? 40 : 28 /*sizeof(TCITEM)*/);
  var i;

  //AkelEdit
  AkelPad.MemCopy(_PtrAdd(lpRect, 0), 3, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect, 4), 3, 3 /*DT_DWORD*/);

  SendMessage(aDlg[IDTCOLORE].HWND, 8 /*WM_KILLFOCUS*/, 0, 0);
  SendMessage(aDlg[IDBCOLORE].HWND, 8 /*WM_KILLFOCUS*/, 0, 0);
  SendMessage(aDlg[IDTEXTE].HWND,   8 /*WM_KILLFOCUS*/, 0, 0);

  SendMessage(aDlg[IDTCOLORE].HWND, 1093 /*EM_SETEVENTMASK*/, 0, 0x1 /*ENM_CHANGE*/);
  SendMessage(aDlg[IDBCOLORE].HWND, 1093 /*EM_SETEVENTMASK*/, 0, 0x1 /*ENM_CHANGE*/);
  SendMessage(aDlg[IDTEXTE].HWND,   1093 /*EM_SETEVENTMASK*/, 0, 0x1 /*ENM_CHANGE*/);

  SendMessage(aDlg[IDTCOLORE].HWND, 197 /*EM_SETLIMITTEXT*/, 7, 0);
  SendMessage(aDlg[IDBCOLORE].HWND, 197 /*EM_SETLIMITTEXT*/, 7, 0);
  SendMessage(aDlg[IDTEXTE].HWND,   197 /*EM_SETLIMITTEXT*/, 1023, 0);

  SendMessage(aDlg[IDTCOLORE].HWND, 3178 /*AEM_SETRECT*/, 0x03 /*AERC_MARGINS|AERC_UPDATE*/, lpRect);
  SendMessage(aDlg[IDBCOLORE].HWND, 3178 /*AEM_SETRECT*/, 0x03 /*AERC_MARGINS|AERC_UPDATE*/, lpRect);
  SendMessage(aDlg[IDTEXTE].HWND,   3178 /*AEM_SETRECT*/, 0x03 /*AERC_MARGINS|AERC_UPDATE*/, lpRect);

  SendMessage(aDlg[IDTEXTE].HWND, 3242 /*AEM_SETWORDWRAP*/, 2 /*AEWW_SYMBOL*/, 0);

  aDlg[IDTCOLORE].SubClass = AkelPad.WindowSubClass(aDlg[IDTCOLORE].HWND, EditCallback, 135 /*WM_GETDLGCODE*/, 256 /*WM_KEYDOWN*/);
  aDlg[IDBCOLORE].SubClass = AkelPad.WindowSubClass(aDlg[IDBCOLORE].HWND, EditCallback, 135 /*WM_GETDLGCODE*/, 256 /*WM_KEYDOWN*/);
  aDlg[IDTEXTE].SubClass   = AkelPad.WindowSubClass(aDlg[IDTEXTE].HWND,   EditCallback, 135 /*WM_GETDLGCODE*/, 256 /*WM_KEYDOWN*/);

  //Combobox Color
  for (i = 0; i < aColor.length; ++i)
  {
    SendMessage(aDlg[IDTCOLORCB].HWND, 323 /*CB_ADDSTRING*/, 0, aColor[i][0]);
    SendMessage(aDlg[IDBCOLORCB].HWND, 323 /*CB_ADDSTRING*/, 0, aColor[i][0]);
  }

  //Combobox Font
  SendMessage(aDlg[IDFONTCB].HWND, 323 /*CB_ADDSTRING*/, 0, "0 - " + sTxtIgnored);
  SendMessage(aDlg[IDFONTCB].HWND, 323 /*CB_ADDSTRING*/, 0, "1 - " + sTxtNormal);
  SendMessage(aDlg[IDFONTCB].HWND, 323 /*CB_ADDSTRING*/, 0, "2 - " + sTxtBold);
  SendMessage(aDlg[IDFONTCB].HWND, 323 /*CB_ADDSTRING*/, 0, "3 - " + sTxtItalic);
  SendMessage(aDlg[IDFONTCB].HWND, 323 /*CB_ADDSTRING*/, 0, "4 - " + sTxtBoldItalic);

  //Tab
  AkelPad.MemCopy(_PtrAdd(lpTCITEM, 0),     1 /*TCIF_TEXT*/, 3 /*DT_DWORD*/); //mask
  AkelPad.MemCopy(_PtrAdd(lpTCITEM, _X64 ? 16 : 12), lpText, 2 /*DT_QWORD*/); //pszText

  AkelPad.MemCopy(lpText, sTxtMarkers, 1 /*DT_UNICODE*/);
  SendMessage(aDlg[IDTABTC].HWND, 4926 /*TCM_INSERTITEMW*/, 0, lpTCITEM);
  AkelPad.MemCopy(lpText, sTxtCurMarks, 1 /*DT_UNICODE*/);
  SendMessage(aDlg[IDTABTC].HWND, 4926 /*TCM_INSERTITEMW*/, 1, lpTCITEM);

  SendMessage(aDlg[IDTABTC].HWND, 4905 /*TCM_SETITEMSIZE*/, 0, MkLong(Scale.X(90), Scale.Y(20)));
  SendMessage(aDlg[IDTABTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nTab, 0);

  //ListView
  SendMessage(aDlg[IDMARKLV].HWND, 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0 , 0x0021 /*LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES*/);
  if (nTab == 0)
    FillLV();

  hFocus = aDlg[IDMARKLV].HWND;

  AkelPad.MemFree(lpRect);
  AkelPad.MemFree(lpText);
  AkelPad.MemFree(lpTCITEM);
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 135 /*WM_GETDLGCODE*/)
    return 0x2; //DLGC_WANTTAB

  if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if (wParam == 0x09 /*VK_TAB*/)
      AkelPad.WindowNoNextProc(aDlg[oSys.Call("User32::GetDlgCtrlID", hWnd)].SubClass);
    else if ((wParam == 0x43 /*C key*/) && Ctrl() && Shift())
    {
      InsertToAP(hWnd);
      AkelPad.WindowNoNextProc(aDlg[oSys.Call("User32::GetDlgCtrlID", hWnd)].SubClass);
    }
    else if ((wParam == 0x56 /*V key*/) && Ctrl() && Shift())
    {
      PasteFromAP(hWnd);
      AkelPad.WindowNoNextProc(aDlg[oSys.Call("User32::GetDlgCtrlID", hWnd)].SubClass);
    }
  }

  return 0;
}

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

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

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

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

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

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

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

function MessageBox(hWndOwn, sText)
{
  AkelPad.MessageBox(hWndOwn, sText, aDlg.Title, 0x30 /*MB_ICONWARNING*/);
}

function EnableWindows()
{
  var hEditWnd = AkelPad.GetEditWnd();
  var i;

  oSys.Call("User32::EnableWindow", aDlg[IDTCOLORB].HWND,   (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDTCOLORE].HWND,   ((nTab == 0) && aMark.length) || ((nTab == 1) && aCur.length));
  oSys.Call("User32::EnableWindow", aDlg[IDTCOLORCB].HWND,  (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDBCOLORB].HWND,   (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDBCOLORE].HWND,   ((nTab == 0) && aMark.length) || ((nTab == 1) && aCur.length));
  oSys.Call("User32::EnableWindow", aDlg[IDBCOLORCB].HWND,  (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDFONTS].HWND,     (nTab == 0));
  oSys.Call("User32::EnableWindow", aDlg[IDFONTCB].HWND,    (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDTEXTE].HWND,     ((nTab == 0) && aMark.length) || ((nTab == 1) && aCur.length));
  oSys.Call("User32::EnableWindow", aDlg[IDMATCHCASE].HWND, (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDWHOLEWORD].HWND, (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDREGEXP].HWND,    (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDNEW].HWND,       (nTab == 0));
  oSys.Call("User32::EnableWindow", aDlg[IDRENAME].HWND,    (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDDELETE].HWND,    (nTab == 0) && aMark.length);
  oSys.Call("User32::EnableWindow", aDlg[IDMARK].HWND,      hEditWnd && (nTab == 0) && aMark.length && aMark[nMark][1].length && aMark[nMark][2].length && aMark[nMark][4].length && (! aMark[nMark][8]));
  oSys.Call("User32::EnableWindow", aDlg[IDUNMARK].HWND,    hEditWnd && (((nTab == 0) && aMark.length && aMark[nMark][8]) || ((nTab == 1) && aCur.length)));
  oSys.Call("User32::EnableWindow", aDlg[IDUNMARKALL].HWND, hEditWnd && aCur.length);
  oSys.Call("User32::EnableWindow", aDlg[IDFINDDOWN].HWND,  hEditWnd && (((nTab == 0) && aMark.length && aMark[nMark][8]) || ((nTab == 1) && aCur.length && (aCur[nCur][0] != "-2"))));
  oSys.Call("User32::EnableWindow", aDlg[IDFINDUP].HWND,    hEditWnd && (((nTab == 0) && aMark.length && aMark[nMark][8]) || ((nTab == 1) && aCur.length && (aCur[nCur][0] != "-2"))));

  oSys.Call("User32::ShowWindow", aDlg[IDHELP].HWND,   (nTab == 0) && aMark.length && aMark[nMark][7]);
  oSys.Call("User32::ShowWindow", aDlg[IDNEW].HWND,    (nTab == 0));
  oSys.Call("User32::ShowWindow", aDlg[IDRENAME].HWND, (nTab == 0));
  oSys.Call("User32::ShowWindow", aDlg[IDDELETE].HWND, (nTab == 0));
  oSys.Call("User32::ShowWindow", aDlg[IDMARK].HWND,   (nTab == 0));

  SendMessage(aDlg[IDTCOLORE].HWND, 207 /*EM_SETREADONLY*/, nTab, 0);
  SendMessage(aDlg[IDBCOLORE].HWND, 207 /*EM_SETREADONLY*/, nTab, 0);
  SendMessage(aDlg[IDTEXTE].HWND,   207 /*EM_SETREADONLY*/, nTab, 0);
  SendMessage(aDlg[IDTCOLORE].HWND, 1091 /*EM_SETBKGNDCOLOR*/, ! nTab, oSys.Call("User32::GetSysColor", 15 /*COLOR_BTNFACE*/));
  SendMessage(aDlg[IDBCOLORE].HWND, 1091 /*EM_SETBKGNDCOLOR*/, ! nTab, oSys.Call("User32::GetSysColor", 15 /*COLOR_BTNFACE*/));
  SendMessage(aDlg[IDTEXTE].HWND,   1091 /*EM_SETBKGNDCOLOR*/, ! nTab, oSys.Call("User32::GetSysColor", 15 /*COLOR_BTNFACE*/));

  if (! oSys.Call("User32::IsWindowEnabled", oSys.Call("User32::GetFocus")))
    oSys.Call("User32::SetFocus", aDlg[IDMARKLV].HWND);

  for (i = IDHELP; i <= IDFINDUP; ++i)
  {
    if (oSys.Call("User32::GetFocus") != aDlg[i].HWND)
      SendMessage(aDlg[i].HWND, 0xF4 /*BM_SETSTYLE*/, BS_PUSHBUTTON, 1);
  }
}

function DrawColorButton(nID, lpDRAWITEMSTRUCT)
{
  var hDC    = AkelPad.MemRead(_PtrAdd(lpDRAWITEMSTRUCT, _X64 ? 32 : 24) /*offsetof(DRAWITEMSTRUCT, hDC)*/, 2 /*DT_QWORD*/);
  var lpRect = _PtrAdd(lpDRAWITEMSTRUCT, _X64 ? 40 : 28) /*offsetof(DRAWITEMSTRUCT, rcItem)*/;
  var sHex   = "";
  var hBrush;

  if ((nTab == 0) && aMark.length)
    sHex = (nID == IDTCOLORB) ? aMark[nMark][1] : aMark[nMark][2];
  else if ((nTab == 1) && aCur.length)
    sHex = (nID == IDTCOLORB) ? aCur[nCur][1] : aCur[nCur][2];

  hBrush = oSys.Call("Gdi32::CreateSolidBrush", HexToRGB(sHex));

  oSys.Call("User32::FillRect", hDC, lpRect, hBrush);

  if (oSys.Call("User32::GetFocus") == aDlg[nID].HWND)
    oSys.Call("User32::DrawFocusRect", hDC, lpRect);

  oSys.Call("Gdi32::DeleteObject", hBrush);
}

function GetTextAE(hWnd, bSel)
{
  AkelPad.SetEditWnd(hWnd);
  var sText = bSel ? AkelPad.GetSelText(): AkelPad.GetTextRange(0, -1);
  AkelPad.SetEditWnd(0);
  return sText;
}

function GetCurSelLV()
{
  var nItem = SendMessage(aDlg[IDMARKLV].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x2 /*LVNI_SELECTED*/);

  if (nItem < 0)
  {
    oSys.Call("User32::SetWindowTextW", aDlg[IDTCOLORE].HWND, "");
    oSys.Call("User32::SetWindowTextW", aDlg[IDBCOLORE].HWND, "");
    oSys.Call("User32::SetWindowTextW", aDlg[IDTEXTE].HWND,   "");
    SendMessage(aDlg[IDMATCHCASE].HWND, 241 /*BM_SETCHECK*/, 0, 0);
    SendMessage(aDlg[IDREGEXP].HWND,    241 /*BM_SETCHECK*/, 0, 0);
    SendMessage(aDlg[IDFONTCB].HWND, 334 /*CB_SETCURSEL*/, -1, 0);
  }
  else if (nTab == 0)
  {
    nMark = nItem;
    oSys.Call("User32::SetWindowTextW", aDlg[IDTCOLORE].HWND, aMark[nMark][1]);
    oSys.Call("User32::SetWindowTextW", aDlg[IDBCOLORE].HWND, aMark[nMark][2]);
    oSys.Call("User32::SetWindowTextW", aDlg[IDTEXTE].HWND,   aMark[nMark][4]);
    SendMessage(aDlg[IDMATCHCASE].HWND, 241 /*BM_SETCHECK*/, aMark[nMark][5], 0);
    SendMessage(aDlg[IDWHOLEWORD].HWND, 241 /*BM_SETCHECK*/, aMark[nMark][6], 0);
    SendMessage(aDlg[IDREGEXP].HWND,    241 /*BM_SETCHECK*/, aMark[nMark][7], 0);
    SendMessage(aDlg[IDFONTCB].HWND, 334 /*CB_SETCURSEL*/, aMark[nMark][3], 0);
  }
  else
  {
    nCur = nItem;
    oSys.Call("User32::SetWindowTextW", aDlg[IDTCOLORE].HWND, aCur[nCur][1]);
    oSys.Call("User32::SetWindowTextW", aDlg[IDBCOLORE].HWND, aCur[nCur][2]);
    oSys.Call("User32::SetWindowTextW", aDlg[IDTEXTE].HWND,   aCur[nCur][4]);
    SendMessage(aDlg[IDMATCHCASE].HWND, 241 /*BM_SETCHECK*/, aCur[nCur][5], 0);
    SendMessage(aDlg[IDWHOLEWORD].HWND, 241 /*BM_SETCHECK*/, aCur[nCur][6], 0);
    SendMessage(aDlg[IDREGEXP].HWND,    241 /*BM_SETCHECK*/, aCur[nCur][7], 0);
    SendMessage(aDlg[IDFONTCB].HWND, 334 /*CB_SETCURSEL*/, aCur[nCur][3], 0);
  }

  SendMessage(aDlg[IDTCOLORE].HWND, 177 /*EM_SETSEL*/, 0, -1);
  SendMessage(aDlg[IDBCOLORE].HWND, 177 /*EM_SETSEL*/, 0, -1);
  SendMessage(aDlg[IDTEXTE].HWND,   177 /*EM_SETSEL*/, 0, -1);
}

function SetCurSelLV(nItem)
{
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x3, 3 /*DT_DWORD*/); //state=LVIS_SELECTED|LVIS_FOCUSED
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x3, 3 /*DT_DWORD*/); //stateMask
  SendMessage(aDlg[IDMARKLV].HWND, 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
  SendMessage(aDlg[IDMARKLV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, false);
}

function SetItemTextLV(nItem, nSubItem, sText)
{
  AkelPad.MemCopy(lpTextLV, sText + "", 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), nSubItem, 3 /*DT_DWORD*/); //iSubItem
  SendMessage(aDlg[IDMARKLV].HWND, 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);
}

function InsertItemLV(nItem, aItem)
{
  var i;

  AkelPad.MemCopy(_PtrAdd(lpTextLV, 0), aItem[0], 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 4),    nItem, 3 /*DT_DWORD*/); //iItem
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8),        0, 3 /*DT_DWORD*/); //iSubItem

  SendMessage(aDlg[IDMARKLV].HWND, 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);

  for (i = 1; i < 9; ++i)
  {
    AkelPad.MemCopy(lpTextLV, aItem[i] + "", 1 /*DT_UNICODE*/);
    AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), i, 3 /*DT_DWORD*/); //iSubItem
    SendMessage(aDlg[IDMARKLV].HWND, 0x1074 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);
  }
}

function FillLV()
{
  var lpText     = AkelPad.MemAlloc(48);
  var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44 /*sizeof(LVCOLUMN)*/);
  var aFmt       = [0 /*LVCFMT_LEFT*/, 0, 0, 2 /*LVCFMT_CENTER*/, 0, 2, 2, 2, 0]; //Alignment of the column header
  var aText;
  var aWidth;
  var i, n;

  AkelPad.MemCopy(lpLVCOLUMN, 7 /*mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT*/, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, _X64 ? 16 : 12), lpText, 2 /*DT_QWORD*/);

  if (nTab == 0)
  {
    aText  = [sTxtNameH, sTxtTextColorH, sTxtBkColorH, sTxtFontStyleH, sTxtTextH, sTxtCaseSensH, sTxtWholeWordH, sTxtRegExpH, sTxtMarkIDH];
    aWidth = [Scale.X(97), Scale.X(70), Scale.X(67), Scale.X(49), Scale.X(72), Scale.X(63), Scale.X(46), Scale.X(54), 0];
  }
  else
  {
    aText  = [sTxtMarkIDH, sTxtTextColorH, sTxtBkColorH, sTxtFontStyleH, sTxtTextH, sTxtCaseSensH, sTxtWholeWordH, sTxtRegExpH, sTxtMarkerNameH];
    aWidth = [Scale.X(61), Scale.X(70), Scale.X(67), Scale.X(49), Scale.X(72), Scale.X(63), Scale.X(43), Scale.X(54), 0];
  }

  for (i = 8; i >= 0; --i)
    SendMessage(aDlg[IDMARKLV].HWND, 0x101C /*LVM_DELETECOLUMN*/, i, 0);

  for (i = 0; i < 9; ++i)
  {
    AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, 4), aFmt[i], 3 /*DT_DWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, 8), aWidth[i], 3 /*DT_DWORD*/);
    AkelPad.MemCopy(lpText, aText[i], 1 /*DT_UNICODE*/);
    SendMessage(aDlg[IDMARKLV].HWND, 0x1061 /*LVM_INSERTCOLUMNW*/, i, lpLVCOLUMN);
  }
  AkelPad.MemFree(lpText);
  AkelPad.MemFree(lpLVCOLUMN);

  SendMessage(aDlg[IDMARKLV].HWND, 0x1009 /*LVM_DELETEALLITEMS*/, 0, 0);

  if (nTab == 0)
  {
    for (i = 0; i < aMark.length; ++i)
    {
      GetCurMarkID(i);
      InsertItemLV(i, aMark[i]);
    }

    if (nMark >= aMark.length)
      nMark == aMark.length - 1;
    else if ((nMark < 0) && aMark.length)
      nMark = 0;

    SetCurSelLV(nMark);
  }
  else
  {
    for (n = 0; n < aCur.length; ++n)
    {
      aCur[n][8] = "";

      if (aCur[n][0] == "-2" /*MARKID_SELECTION.toString()*/)
        aCur[n][8] = "<selection>";
      else if (parseInt(aCur[n][0]) >= 1000001 /*MARKID_AUTOMIN*/)
      {
        for (i = 0; i < aMark.length; ++i)
        {
          if ((aMark[i][1] == aCur[n][1]) && (aMark[i][2] == aCur[n][2]) && (aMark[i][3] == aCur[n][3]) && (aMark[i][4] == aCur[n][4]) && (aMark[i][5] == aCur[n][5]) && (aMark[i][6] == aCur[n][6]) && (aMark[i][7] == aCur[n][7]))
          {
            aCur[n][8] = aMark[i][0];
            break;
          }
        }
      }

      InsertItemLV(n, aCur[n]);
    }

    if (nCur >= aCur.length)
      nCur = aCur.length - 1;
    else if ((nCur < 0) && aCur.length)
      nCur = 0;

    SetCurSelLV(nCur);
  }

  SendMessage(aDlg[IDMARKLV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 8, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
}

function HexToRGB(sHex)
{
  if (/^#[\da-f]{6}$/i.test(sHex))
    return parseInt(sHex.substr(5, 2) + sHex.substr(3, 2) + sHex.substr(1, 2), 16);

  return oSys.Call("User32::GetSysColor", 15 /*COLOR_BTNFACE*/);
}

function RGBToHex(lpRGB)
{
  var sHex = "0";
  var sByte;

  if (AkelPad.MemRead(lpRGB, 3 /*DT_DWORD*/) != -1)
  {
    sHex = "#";

    for (var i = 0; i < 3; ++i)
    {
      sByte = AkelPad.MemRead(_PtrAdd(lpRGB, i), 5 /*DT_BYTE*/).toString(16).toUpperCase();

      if (sByte.length == 1)
        sByte = "0" + sByte;

      sHex += sByte;
    }
  }

  return sHex;
}

function ChooseColor(hWndHex, sHex)
{
  var nChoCoSize = _X64 ? 72 : 36 /*sizeof(CHOOSECOLOR)*/;
  var lpChoCo    = AkelPad.MemAlloc(nChoCoSize); //CHOOSECOLOR
  var lpCusCo    = AkelPad.MemAlloc(16 * 4 /*sizeof(COLORREF)*/);
  var i;

  AkelPad.MemCopy(_PtrAdd(lpChoCo, 0),              nChoCoSize,     3 /*DT_DWORD*/); //lStructSize
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ?  8 :  4), aDlg.HWND,      2 /*DT_QWORD*/); //hWndOwner
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ? 24 : 12), HexToRGB(sHex), 3 /*DT_DWORD*/); //rgbResult
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ? 32 : 16), lpCusCo,        2 /*DT_QWORD*/); //lpCustColors
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ? 40 : 20), 0x103,          3 /*DT_DWORD*/); //Flags - CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT

  if (oSys.Call("Comdlg32::ChooseColorW", lpChoCo))
  {
    oSys.Call("User32::SetWindowTextW", hWndHex, RGBToHex(_PtrAdd(lpChoCo, _X64 ? 24 : 12) /*offsetof(CHOOSECOLOR, rgbResult)*/));
    SendMessage(hWndHex, 177 /*EM_SETSEL*/, 0, -1);
  }

  AkelPad.MemFree(lpChoCo);
  AkelPad.MemFree(lpCusCo);
}

function SetColorbyHex(bTextColor)
{
  var nPos = -1;
  var sHex = "";
  var hWndColor;
  var hWndName;
  var i;

  if (bTextColor)
  {
    if ((nTab == 0) && aMark.length)
    {
      sHex = GetTextAE(aDlg[IDTCOLORE].HWND).toUpperCase();
      aMark[nMark][1] = sHex;
      GetCurMarkID(nMark);
      SetItemTextLV(nMark, 1, sHex);
      SetItemTextLV(nMark, 8, aMark[nMark][8]);
    }
    else if ((nTab == 1) && aCur.length)
      sHex = aCur[nCur][1];

    hWndColor = aDlg[IDTCOLORB].HWND;
    hWndName  = aDlg[IDTCOLORCB].HWND;
  }
  else
  {
    if ((nTab == 0) && aMark.length)
    {
      sHex = GetTextAE(aDlg[IDBCOLORE].HWND).toUpperCase();
      aMark[nMark][2] = sHex;
      GetCurMarkID(nMark);
      SetItemTextLV(nMark, 2, sHex);
      SetItemTextLV(nMark, 8, aMark[nMark][8]);
    }
    else if ((nTab == 1) && aCur.length)
      sHex = aCur[nCur][2];

    hWndColor = aDlg[IDBCOLORB].HWND;
    hWndName  = aDlg[IDBCOLORCB].HWND;
  }

  for (i = 0; i < aColor.length; ++i)
  {
    if (sHex == aColor[i][1])
    {
      nPos = i;
      break;
    }
  }

  if (oSys.Call("User32::GetFocus") != hWndName)
    SendMessage(hWndName, 334 /*CB_SETCURSEL*/, nPos, 0);

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

function SetColorbyName(hWndName, hWndHex)
{
  if (SendMessage(hWndName, 327 /*CB_GETCURSEL*/, 0, 0) > -1)
  {
    oSys.Call("User32::SetWindowTextW", hWndHex, aColor[SendMessage(hWndName, 327 /*CB_GETCURSEL*/, 0, 0)][1]);
    SendMessage(hWndHex, 177 /*EM_SETSEL*/, 0, -1);
  }
}

function CheckRegExpPat(sPat)
{
  //based on Instructor's code CheckPat.js: http://akelpad.sourceforge.net/forum/viewtopic.php?p=25621&highlight=#25621
  var lpPat     = AkelPad.MemAlloc((sPat.length + 1) * 2 /*sizeof(wchat_t)*/);
  var lpPatExec = AkelPad.MemAlloc(_X64? 216 : 108 /*sizeof(PATEXEC)*/);
  var lpStr     = AkelPad.MemAlloc(2 /*sizeof(wchat_t)*/);
  var nErrOffset;

  AkelPad.MemCopy(lpPat, sPat, 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ?  24 : 12) /*PATEXEC.wpText*/,      lpStr, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ?  32 : 16) /*PATEXEC.wpMaxText*/,   lpStr, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ?  40 : 20) /*PATEXEC.wpRange*/,     lpStr, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ?  48 : 24) /*PATEXEC.wwpMaxRange*/, lpStr, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 112 : 56) /*PATEXEC.wpPat*/,       lpPat, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 120 : 60) /*PATEXEC.wpMaxPat*/,    _PtrAdd(lpPat, sPat.length * 2 /*sizeof(wchar_t)*/), 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 128 : 64) /*PATEXEC.wpStr*/,       lpStr, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 136 : 68) /*PATEXEC.wpMaxStr*/,    lpStr, 2 /*DT_QWORD*/);

  SendMessage(AkelPad.GetMainWnd(), 1415 /*AKD_PATEXEC*/, 0, lpPatExec);
  nErrOffset = AkelPad.MemRead(_PtrAdd(lpPatExec, _X64 ? 192 : 96) /*PATEXEC.nErrorOffset*/, 2 /*DT_QWORD*/);

  AkelPad.MemFree(lpPat);
  AkelPad.MemFree(lpPatExec);
  AkelPad.MemFree(lpStr);

  return nErrOffset;
}

function GetCurMarksArray()
{
  //based on Instructor's code GetMarks.js: http://akelpad.sourceforge.net/forum/viewtopic.php?p=25591&highlight=#25591
  var lpMarkStack = AkelPad.MemAlloc(_X64 ? 16 : 8 /*sizeof(STACKMARKTEXT)*/);
  var lpMarkText;
  var lpMarkItem;
  var nMarkID;
  var sText;
  var nFlags;
  var nMatchCase;
  var nWholeWord;
  var nRegExp;
  var nFontStyle;
  var sTextColor;
  var sBkColor;

  aCur.length = 0;

  AkelPad.Call("Coder::HighLight", 12 /*DLLA_HIGHLIGHT_GETMARKSTACK*/, AkelPad.GetEditWnd(), AkelPad.GetEditDoc(), lpMarkStack);

  lpMarkText = AkelPad.MemRead(lpMarkStack /*offsetof(STACKMARKTEXT,first)*/, 2 /*DT_QWORD*/);

  while (lpMarkText)
  {
    nMarkID    = AkelPad.MemRead(_PtrAdd(lpMarkText, _X64 ? 24 : 12) /*offsetof(MARKTEXT,dwMarkID)*/, 3 /*DT_DWORD*/);
    lpMarkItem = AkelPad.MemRead(_PtrAdd(lpMarkText, _X64 ? 16 : 8) /*offsetof(MARKTEXT,hMarkTextHandle)*/, 2 /*DT_QWORD*/);
    lpText     = AkelPad.MemRead(_PtrAdd(lpMarkItem, _X64 ? 24 : 12) /*offsetof(AEMARKTEXTITEMW,pMarkText)*/, 2 /*DT_QWORD*/);
    sText      = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
    nFlags     = AkelPad.MemRead(_PtrAdd(lpMarkItem, _X64 ? 36 : 20) /*offsetof(AEMARKTEXTITEMW,dwFlags)*/, 3 /*DT_DWORD*/);
    nMatchCase = (nFlags & 0x00000001/*AEHLF_MATCHCASE*/) ? 1 : 0;
    nWholeWord = (nFlags & 0x00000002/*AEHLF_WHOLEWORD*/) ? 1 : 0;
    nRegExp    = (nFlags & 0x10000000/*AEHLF_REGEXP*/) ? 1 : 0;
    nFontStyle = AkelPad.MemRead(_PtrAdd(lpMarkItem, _X64 ? 40 : 24) /*offsetof(AEMARKTEXTITEMW,dwFontStyle)*/, 3 /*DT_DWORD*/);
    sTextColor = RGBToHex(_PtrAdd(lpMarkItem, _X64 ? 44 : 28) /*offsetof(AEMARKTEXTITEMW,crText)*/);
    sBkColor   = RGBToHex(_PtrAdd(lpMarkItem, _X64 ? 48 : 32) /*offsetof(AEMARKTEXTITEMW,crBk)*/);

    aCur.push([nMarkID.toString(), sTextColor, sBkColor, nFontStyle, sText, nMatchCase, nWholeWord, nRegExp, ""]);

    lpMarkText = AkelPad.MemRead(lpMarkText /*offsetof(MARKTEXT,next)*/, 2 /*DT_QWORD*/);
  }

  AkelPad.MemFree(lpMarkStack);

  aCur.sort(function(a, b) {
    if      (a[0] < b[0]) return -1;
    else if (a[0] > b[0]) return 1;
    return 0; });
}

function GetCurMarkID(i)
{
  var n;

  aMark[i][8] = "";

  for (n = aCur.length - 1; n >= 0; --n)
  {
    if ((parseInt(aCur[n][0]) >= 1000001 /*MARKID_AUTOMIN*/) && (aMark[i][1] == aCur[n][1]) && (aMark[i][2] == aCur[n][2]) && (aMark[i][3] == aCur[n][3]) && (aMark[i][4] == aCur[n][4]) && (aMark[i][5] == aCur[n][5]) && (aMark[i][6] == aCur[n][6]) && (aMark[i][7] == aCur[n][7]))
    {
      aMark[i][8] = aCur[n][0];
      break;
    }
  }
}

function SetCurMarksID()
{
  for (var i = 0; i < aMark.length; ++i)
  {
    GetCurMarkID(i);
    SetItemTextLV(i, 8, aMark[i][8])
  }
}

function NewOrRenameMarker(bRename)
{
  var hFocus     = oSys.Call("User32::GetFocus");
  var sName      = "";
  var sTextColor = "#A52A2A";
  var sBkColor   = "#FFFF00";
  var nFontStyle = 0;
  var sText      = "";
  var nMatchCase = 1;
  var nWholeWord = 0;
  var nRegExp    = 0;
  var sCaption;
  var sLabel;

  if (aMark.length)
  {
    sName      = aMark[nMark][0];
    sTextColor = aMark[nMark][1];
    sBkColor   = aMark[nMark][2];
    nFontStyle = aMark[nMark][3];
    sText      = aMark[nMark][4];
    nMatchCase = aMark[nMark][5];
    nWholeWord = aMark[nMark][6];
    nRegExp    = aMark[nMark][7];
  }

  if (bRename)
  {
    sCaption = sTxtRenMarker;
    sLabel   = sTxtNewName;
  }
  else
  {
    sCaption = sTxtNewMarker;
    sLabel   = sTxtName;
  }

  sName = InputBox(aDlg.HWND, sCaption, sLabel, sName, 0, CheckMarkerName, bRename);

  if (sName)
    sName = sName.replace(/\s+$/, "");

  if (sName && ((! bRename) || (sName != aMark[nMark][0])))
  {
    if (bRename)
    {
      SendMessage(aDlg[IDMARKLV].HWND, 0x1008 /*LVM_DELETEITEM*/, nMark, 0);
      aMark.splice(nMark, 1);
    }

    for (nMark = 0; nMark < aMark.length; ++nMark)
    {
      if (oSys.Call("Kernel32::lstrcmpW", sName, aMark[nMark][0]) < 0)
        break;
    }

    aMark.splice(nMark, 0, [sName, sTextColor, sBkColor, nFontStyle, sText, nMatchCase, nWholeWord, nRegExp, ""]);
    GetCurMarkID(nMark)
    InsertItemLV(nMark, aMark[nMark]);
    SetCurSelLV(nMark);
    EnableWindows();
  }

  oSys.Call("User32::SetFocus", hFocus);
}

function CheckMarkerName(hWnd, aName, bRename)
{
  var i;

  aName[0] = aName[0].replace(/\s+$/, "");

  if (aName[0] == "<selection>")
  {
    MessageBox(hWnd, '"' + aName[0] + '"\n\n' + sTxtReserved);
    return 0;
  }
  else
  {
    for (i = 0; i < aMark.length; ++i)
    {
      if ((aName[0] == aMark[i][0]) && ((! bRename) || (i != nMark)))
      {
        MessageBox(hWnd, '"' + aName[0] + '"\n\n' + sTxtExists);
        return 0;
      }
    }
  }

  return -1;
}

function DeleteMarker(bPrompt)
{
  if (bPrompt && (AkelPad.MessageBox(aDlg.HWND, '"' + aMark[nMark][0] + '"\n\n' + sTxtWantDelete, sTxtDelMarker, 0x21 /*MB_DEFBUTTON1|MB_ICONQUESTION|MB_OKCANCEL*/) != 1 /*IDOK*/))
    return;

  SendMessage(aDlg[IDMARKLV].HWND, 0x1008 /*LVM_DELETEITEM*/, nMark, 0);
  aMark.splice(nMark, 1);

  if (nMark >= aMark.length)
    nMark = aMark.length - 1;

  SetCurSelLV(nMark);
  GetCurSelLV();
  EnableWindows();
}

function Mark()
{
  var nErrOffset;

  if ((aMark[nMark][1] != "0") && (! /^#[\da-f]{6}$/i.test(aMark[nMark][1])))
  {
    MessageBox(aDlg.HWND, sErrTextColor);
    oSys.Call("User32::SetFocus", aDlg[IDTCOLORE].HWND);
  }
  else if ((aMark[nMark][2] != "0") && (! /^#[\da-f]{6}$/i.test(aMark[nMark][2])))
  {
    MessageBox(aDlg.HWND, sErrBkColor);
    oSys.Call("User32::SetFocus", aDlg[IDBCOLORE].HWND);
  }
  else if (aMark[nMark][7] && (nErrOffset = CheckRegExpPat(aMark[nMark][4])))
  {
    MessageBox(aDlg.HWND, sErrRegExp + " (" + nErrOffset + ").");
    oSys.Call("User32::SetFocus", aDlg[IDTEXTE].HWND);
    SendMessage(aDlg[IDTEXTE].HWND, 177 /*EM_SETSEL*/, nErrOffset - 1, -1);
  }
  else
  {
    AkelPad.Call("Coder::HighLight", 2, aMark[nMark][1], aMark[nMark][2], aMark[nMark][5] | 4 * aMark[nMark][6] | 2 * aMark[nMark][7], aMark[nMark][3], -1, aMark[nMark][4]);
    GetCurMarksArray();
    SetCurMarksID();
  }

  EnableWindows();
}

function UnMark(bAll)
{
  if (bAll)
    AkelPad.Call("Coder::HighLight", 3, 0);
  else
  {
    if (nTab == 0)
      AkelPad.Call("Coder::HighLight", 3, parseInt(aMark[nMark][8]));
    else
      AkelPad.Call("Coder::HighLight", 3, parseInt(aCur[nCur][0]));
  }

  GetCurMarksArray();

  if (nTab == 0)
    SetCurMarksID();
  else
  {
    FillLV();
    GetCurSelLV();
  }

  EnableWindows();
}

function FindMark(bUp)
{
  var nMarkID = parseInt((nTab == 0) ? aMark[nMark][8] : aCur[nCur][0]);

  AkelPad.Call("Coder::HighLight", 4, nMarkID, 0, 0, bUp);

  if (aCur[0][0] == "-2" /*MARKID_SELECTION.toString()*/)
  {
    GetCurMarksArray();
    if ((! aCur.length) || (aCur[0][0] != "-2" /*MARKID_SELECTION.toString()*/))
    {
      if (nCur > 0) --nCur;

      if (nTab == 1)
      {
        FillLV();
        GetCurSelLV();
        EnableWindows();
      }
    }
  }
}



Last edited by KDJ on Tue Dec 15, 2015 7:33 pm; edited 19 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1915
Location: Poland

PostPosted: Mon Sep 01, 2014 8:21 pm    Post subject: Reply with quote

TextMarker_part2.js

Code:
function EditMenu(hWnd, nX, nY)
{
  var MF_STRING    = 0x0000;
  var MF_GRAYED    = 0x0001;
  var MF_SEPARATOR = 0x0800;
  var hEditWnd = AkelPad.GetEditWnd();
  var hMenu    = oSys.Call("User32::CreatePopupMenu");
  var lpPoint;
  var nCmd;

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

  oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd,  198 /*EM_CANUNDO*/, 0, 0) ? MF_STRING : MF_GRAYED, 1, sMnuUndo + "\tCtrl+Z");
  oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 1109 /*EM_CANREDO*/, 0, 0) ? MF_STRING : MF_GRAYED, 2, sMnuRedo + "\tCtrl+Shift+Z");
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu, (nTab == 0) && SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED, 3, sMnuCut + "\tCtrl+X");
  oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED, 4, sMnuCopy + "\tCtrl+C");
  oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 1074 /*EM_CANPASTE*/, 0, 0) ? MF_STRING : MF_GRAYED, 5, sMnuPaste + "\tCtrl+V");
  oSys.Call("User32::AppendMenuW", hMenu, (nTab == 0) && SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED, 6, sMnuDelete + "\tDel");
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu, oSys.Call("User32::GetWindowTextLengthW", hWnd) ? MF_STRING : MF_GRAYED, 7, sMnuSelectAll + "\tCtrl+A");
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu, hEditWnd && !AkelPad.GetEditReadOnly(hEditWnd) && SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED, 8, sMnuInsertToAP + "\tCtrl+Shift+C");
  oSys.Call("User32::AppendMenuW", hMenu, (nTab == 0) && hEditWnd && SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED, 9, sMnuPasteFromAP + "\tCtrl+Shift+V");

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

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

  if (nCmd == 1)
    SendMessage(hWnd, 199 /*EM_UNDO*/, 0, 0);
  else if (nCmd == 2)
    SendMessage(hWnd, 1108 /*EM_REDO*/, 0, 0);
  else if (nCmd == 3)
    SendMessage(hWnd, 768 /*WM_CUT*/, 0, 0);
  else if (nCmd == 4)
    SendMessage(hWnd, 769 /*WM_COPY*/, 0, 0);
  else if (nCmd == 5)
    SendMessage(hWnd, 770 /*WM_PASTE*/, 0, 0);
  else if (nCmd == 6)
    SendMessage(hWnd, 771 /*WM_CLEAR*/, 0, 0);
  else if (nCmd == 7)
    SendMessage(hWnd, 177 /*EM_SETSEL*/, 0, -1);
  else if (nCmd == 8)
    InsertToAP(hWnd);
  else if (nCmd == 9)
    PasteFromAP(hWnd);
}

function InsertToAP(hWnd)
{
  var sText;

  if (AkelPad.GetEditWnd() && (sText = GetTextAE(hWnd, 1)))
    AkelPad.ReplaceSel(sText, -1);
}

function PasteFromAP(hWnd)
{
  if ((nTab == 0) && AkelPad.GetEditWnd() && (AkelPad.GetSelStart() != AkelPad.GetSelEnd()))
    SendMessage(hWnd, 194 /*EM_REPLACESEL*/, 1, AkelPad.GetSelText());
}

function RegExpHelp()
{
  var lpRect    = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
  var sHelpFile = GetAkelHelpFile();
  var hMenu     = oSys.Call("User32::CreatePopupMenu");
  var nString   = 0x0000; //MF_STRING
  var nGrayed   = 0x0001; //MF_GRAYED
  var nBreak    = 0x0060; //MF_MENUBREAK|MF_MENUBARBREAK
  var nSepar    = 0x0800; //MF_SEPARATOR
  var nX;
  var nY;
  var aMenu;
  var nCmd;
  var i;

  oSys.Call("User32::GetWindowRect", aDlg[IDTEXTE].HWND, lpRect);
  nX = AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/);
  nY = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpRect);

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

    [nBreak,  "?",         sHlpZeroOrOne],
    [nString, "*",         sHlpZeroOrMore],
    [nString, "+",         sHlpOneOrMore],
    [nString, "{3}",       sHlpExactly],
    [nString, "{3,}",      sHlpAtLeast],
    [nString, "{3,7}",     sHlpFromTo],
    [nGrayed, "\xA0",      sHlpGreedy],
    [nString, "?",         sHlpLazy],
    [nString, "+",         sHlpPossesive],
    [nSepar],
    [nString, "(ab)",      sHlpCapture1],
    [nString, "(?^ab)",    sHlpCapture2],
    [nString, "(?:ab)",    sHlpNotCapture],
    [nString, "(?>bc|b)",  sHlpAtomicGrouping],
    [nString, "(?<=ab)",   sHlpPreceded],
    [nString, "(?<!ab)",   sHlpNotPreceded],
    [nString, "(?=ab)",    sHlpFollowed],
    [nString, "(?!ab)",    sHlpNotFollowed],
    [nString, "(?(1)x|y)", sHlpCondition],
    [nString, "\\9",       sHlpBackrefer9],
    [nString, "\\99",      sHlpBackrefer99],
    [nSepar],
    [nString, "(?i)",      sHlpIgnoreCase],
    [nString, "(?m)",      sHlpMultiline],
    [nString, "(?s)",      sHlpDotDefault],
    [nString, "(?U)",      sHlpInvertGreed],
    [nString, "(?-i)",     sHlpMatchCase],
    [nString, "(?-m)",     sHlpMultilineOff],
    [nString, "(?-s)",     sHlpDotDefaultOff],
    [nString, "(?-U)",     sHlpInvertGreedOff]];

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

  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, 0x0188 /*TPM_RETURNCMD|TPM_NONOTIFY|TPM_RIGHTALIGN*/, nX, nY, 0, aDlg.HWND, 0);

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

  if (nCmd--)
  {
    oSys.Call("User32::SetFocus", aDlg[IDTEXTE].HWND);

    if (aMenu[nCmd][1] != "\xA0")
      SendMessage(aDlg[IDTEXTE].HWND, 194 /*EM_REPLACESEL*/, 1, aMenu[nCmd][1]);
    else if (aMenu[nCmd][2] == sHelpFile)
      AkelHelp(sHelpFile);
  }
}

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

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

  return sFile;
}

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

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

function IsScriptRunning()
{
  var hDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0);

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

    oSys.Call("User32::SetForegroundWindow", hDlg);
    return true;
  }

  return false;
}

function ReadIni()
{
  var i;

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

  if (! aMark)
    aMark = [["Example", "#A52A2A", "#FFFF00", 0, "Text", 1, 0, 0, ""]];
  if (nMark >= aMark.length)
    nMark = aMark.length - 1;

  //insert WholeWord if script version <= 2014-10-28
  for (i = 0; i < aMark.length; ++i)
  {
    if (aMark[i].length == 8)
      aMark[i].splice(6, 0, 0);
  }

  aMark.sort(function(a, b) {return oSys.Call("Kernel32::lstrcmpW", a[0], b[0]);});

  //css colors: http://www.w3schools.com/cssref/css_colornames.asp
  aColor = [
    ["<" + sTxtIgnored + ">",      "0"],
    ["AliceBlue",            "#F0F8FF"],
    ["AntiqueWhite",         "#FAEBD7"],
    ["Aqua",                 "#00FFFF"],
    ["Aquamarine",           "#7FFFD4"],
    ["Azure",                "#F0FFFF"],
    ["Beige",                "#F5F5DC"],
    ["Bisque",               "#FFE4C4"],
    ["Black",                "#000000"],
    ["BlanchedAlmond",       "#FFEBCD"],
    ["Blue",                 "#0000FF"],
    ["BlueViolet",           "#8A2BE2"],
    ["Brown",                "#A52A2A"],
    ["BurlyWood",            "#DEB887"],
    ["CadetBlue",            "#5F9EA0"],
    ["Chartreuse",           "#7FFF00"],
    ["Chocolate",            "#D2691E"],
    ["Coral",                "#FF7F50"],
    ["CornflowerBlue",       "#6495ED"],
    ["Cornsilk",             "#FFF8DC"],
    ["Crimson",              "#DC143C"],
    ["Cyan",                 "#00FFFF"],
    ["DarkBlue",             "#00008B"],
    ["DarkCyan",             "#008B8B"],
    ["DarkGoldenrod",        "#B8860B"],
    ["DarkGray",             "#A9A9A9"],
    ["DarkGreen",            "#006400"],
    ["DarkKhaki",            "#BDB76B"],
    ["DarkMagenta",          "#8B008B"],
    ["DarkOliveGreen",       "#556B2F"],
    ["DarkOrange",           "#FF8C00"],
    ["DarkOrchid",           "#9932CC"],
    ["DarkRed",              "#8B0000"],
    ["DarkSalmon",           "#E9967A"],
    ["DarkSeaGreen",         "#8FBC8F"],
    ["DarkSlateBlue",        "#483D8B"],
    ["DarkSlateGray",        "#2F4F4F"],
    ["DarkTurquoise",        "#00CED1"],
    ["DarkViolet",           "#9400D3"],
    ["DeepPink",             "#FF1493"],
    ["DeepSkyBlue",          "#00BFFF"],
    ["DimGray",              "#696969"],
    ["DodgerBlue",           "#1E90FF"],
    ["FireBrick",            "#B22222"],
    ["FloralWhite",          "#FFFAF0"],
    ["ForestGreen",          "#228B22"],
    ["Fuchsia",              "#FF00FF"],
    ["Gainsboro",            "#DCDCDC"],
    ["GhostWhite",           "#F8F8FF"],
    ["Gold",                 "#FFD700"],
    ["Goldenrod",            "#DAA520"],
    ["Gray",                 "#808080"],
    ["Green",                "#008000"],
    ["GreenYellow",          "#ADFF2F"],
    ["HoneyDew",             "#F0FFF0"],
    ["HotPink",              "#FF69B4"],
    ["IndianRed",            "#CD5C5C"],
    ["Indigo",               "#4B0082"],
    ["Ivory",                "#FFFFF0"],
    ["Khaki",                "#F0E68C"],
    ["Lavender",             "#E6E6FA"],
    ["LavenderBlush",        "#FFF0F5"],
    ["LawnGreen",            "#7CFC00"],
    ["LemonChiffon",         "#FFFACD"],
    ["LightBlue",            "#ADD8E6"],
    ["LightCoral",           "#F08080"],
    ["LightCyan",            "#E0FFFF"],
    ["LightGoldenrodYellow", "#FAFAD2"],
    ["LightGray",            "#D3D3D3"],
    ["LightGreen",           "#90EE90"],
    ["LightPink",            "#FFB6C1"],
    ["LightSalmon",          "#FFA07A"],
    ["LightSeaGreen",        "#20B2AA"],
    ["LightSkyBlue",         "#87CEFA"],
    ["LightSlateGray",       "#778899"],
    ["LightSteelBlue",       "#B0C4DE"],
    ["LightYellow",          "#FFFFE0"],
    ["Lime",                 "#00FF00"],
    ["LimeGreen",            "#32CD32"],
    ["Linen",                "#FAF0E6"],
    ["Magenta",              "#FF00FF"],
    ["Maroon",               "#800000"],
    ["MediumAquaMarine",     "#66CDAA"],
    ["MediumBlue",           "#0000CD"],
    ["MediumOrchid",         "#BA55D3"],
    ["MediumPurple",         "#9370DB"],
    ["MediumSeaGreen",       "#3CB371"],
    ["MediumSlateBlue",      "#7B68EE"],
    ["MediumSpringGreen",    "#00FA9A"],
    ["MediumTurquoise",      "#48D1CC"],
    ["MediumVioletRed",      "#C71585"],
    ["MidnightBlue",         "#191970"],
    ["MintCream",            "#F5FFFA"],
    ["MistyRose",            "#FFE4E1"],
    ["Moccasin",             "#FFE4B5"],
    ["NavajoWhite",          "#FFDEAD"],
    ["Navy",                 "#000080"],
    ["OldLace",              "#FDF5E6"],
    ["Olive",                "#808000"],
    ["OliveDrab",            "#6B8E23"],
    ["Orange",               "#FFA500"],
    ["OrangeRed",            "#FF4500"],
    ["Orchid",               "#DA70D6"],
    ["PaleGoldenrod",        "#EEE8AA"],
    ["PaleGreen",            "#98FB98"],
    ["PaleTurquoise",        "#AFEEEE"],
    ["PaleVioletRed",        "#DB7093"],
    ["PapayaWhip",           "#FFEFD5"],
    ["PeachPuff",            "#FFDAB9"],
    ["Peru",                 "#CD853F"],
    ["Pink",                 "#FFC0CB"],
    ["Plum",                 "#DDA0DD"],
    ["PowderBlue",           "#B0E0E6"],
    ["Purple",               "#800080"],
    ["Red",                  "#FF0000"],
    ["RosyBrown",            "#BC8F8F"],
    ["RoyalBlue",            "#4169E1"],
    ["SaddleBrown",          "#8B4513"],
    ["Salmon",               "#FA8072"],
    ["SandyBrown",           "#F4A460"],
    ["SeaGreen",             "#2E8B57"],
    ["SeaShell",             "#FFF5EE"],
    ["Sienna",               "#A0522D"],
    ["Silver",               "#C0C0C0"],
    ["SkyBlue",              "#87CEEB"],
    ["SlateBlue",            "#6A5ACD"],
    ["SlateGray",            "#708090"],
    ["Snow",                 "#FFFAFA"],
    ["SpringGreen",          "#00FF7F"],
    ["SteelBlue",            "#4682B4"],
    ["Tan",                  "#D2B48C"],
    ["Teal",                 "#008080"],
    ["Thistle",              "#D8BFD8"],
    ["Tomato",               "#FF6347"],
    ["Turquoise",            "#40E0D0"],
    ["Violet",               "#EE82EE"],
    ["Wheat",                "#F5DEB3"],
    ["White",                "#FFFFFF"],
    ["WhiteSmoke",           "#F5F5F5"],
    ["Yellow",               "#FFFF00"],
    ["YellowGreen",          "#9ACD32"]];
}

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

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

  sIniTxt =
    'nDlgX=' + Scale.UX(AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/)) + ';\r\n' +
    'nDlgY=' + Scale.UY(AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/)) + ';\r\n' +
    'nTab='  + nTab + ';\r\n' +
    'nMark=' + nMark + ';\r\n' +
    'aMark=[';

  for (i = 0; i < aMark.length; ++i)
    sIniTxt += '["' + EscapeStr(aMark[i][0]) + '","' + EscapeStr(aMark[i][1]) + '","' + EscapeStr(aMark[i][2]) + '",' + aMark[i][3] + ',"' + EscapeStr(aMark[i][4]) + '",' + aMark[i][5] + ',' + aMark[i][6] + ',' + aMark[i][7] + ',"' + aMark[i][8] + '"],';

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

  sIniTxt += '];';

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

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

function GetLangStrings()
{
  if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/)
  {
    //translated by Andrey_A_A and YuS
    sTxtDlgTitle = 'TextMarker';
    //tabs
    sTxtMarkers  = 'Маркеры';
    sTxtCurMarks = 'Текущие';
    //header of list
    sTxtNameH       = 'Имя';
    sTxtTextColorH  = 'ЦветTекст';
    sTxtBkColorH    = 'ЦветФон';
    sTxtFontStyleH  = 'Шрифт';
    sTxtTextH       = 'Текст';
    sTxtCaseSensH   = 'Регистр';
    sTxtWholeWordH  = 'Слово';
    sTxtRegExpH     = 'РегВыр';
    sTxtMarkIDH     = 'ID Метки';
    sTxtMarkerNameH = 'Имя маркера';
    //static controls and buttons
    sTxtTextColor = 'Цвет &текста:';
    sTxtBkColor   = 'Цвет &фона:';
    sTxtFontStyle = '&Стиль шрифта:';
    sTxtText      = 'Т&екст:';
    sTxtCaseSens  = '&Учитывать регистр';
    sTxtWholeWord = 'Слово целиком';
    sTxtRegExp    = 'Регулярные выражения';
    sTxtNew       = '&Новый';
    sTxtRename    = '&Переимен.';
    sTxtDelete    = '&Удалить';
    sTxtMark      = '&Отметить';
    sTxtUnmark    = '&Снять метку';
    sTxtUnmarkAll = 'Снять &все';
    sTxtFindDown  = 'Поиск вниз';
    sTxtFindUp    = 'Поиск вверх';
    //font styles combobox
    sTxtIgnored    = 'игнорировать';
    sTxtNormal     = 'обычный';
    sTxtBold       = 'полужирный';
    sTxtItalic     = 'наклонный';
    sTxtBoldItalic = 'полуж.наклонный';
    //dialog New, Rename, Delete
    sTxtNewMarker  = 'Новый маркер';
    sTxtRenMarker  = 'Переименовать маркер';
    sTxtDelMarker  = 'Удалить маркер';
    sTxtName       = 'Имя:';
    sTxtNewName    = 'Новое имя:';
    sTxtReserved   = 'Это имя зарезервировано для выбранных текстовых меток.';
    sTxtExists     = 'Такое имя маркера уже существует.';
    sTxtWantDelete = 'Вы действительно хотите удалить этот маркер?';
    //error messages
    sErrTextColor = 'Неправильный код цвета текста.';
    sErrBkColor   = 'Неправильный код цвета фона.';
    sErrRegExp    = 'Ошибка в регулярном выражении';
    //edit context menu
    sMnuUndo        = '&Отменить';
    sMnuRedo        = '&Повторить';
    sMnuCut         = 'Вырезать';
    sMnuCopy        = '&Копировать';
    sMnuPaste       = '&Вставить';
    sMnuDelete      = '&Удалить';
    sMnuSelectAll   = 'Выделить всё';
    sMnuInsertToAP  = 'Вставить в AkelPad';
    sMnuPasteFromAP = 'Вставить из AkelPad';
    //RegExp help
    sHlpAnyChar        = 'любой символ (точка)';
    sHlpSpecChars      = '()[]{}^$.?+*|\\ специальные символы';
    sHlpFF             = 'перевод страницы \\x0C';
    sHlpAnyNL          = 'перевод строки';
    sHlpTab            = 'табуляция \\x09';
    sHlpVTab           = 'вертикальная табуляция \\x0B';
    sHlpDigit          = 'цифра [0-9]';
    sHlpNonDigit       = 'не цифра [^0-9]';
    sHlpWhiteSp        = 'пробельный символ [ \\f\\n\\t\\v]';
    sHlpNonWhiteSp     = 'непробельный символ';
    sHlpWordChar       = 'словесный символ  (non-delimiter)';
    sHlpNonWordChar    = 'несловесный символ (delimiter)';
    sHlpCharHex        = 'символ - код в диапазоне 0-10FFFF';
    sHlpCharHex2       = 'символ - 2-значный код';
    sHlpCharHex4       = 'символ - 4-значный код';
    sHlpAlternative    = 'одна из альтернатив: ab либо xy';
    sHlpCharSet        = 'набор символов, нужен любой из них';
    sHlpNegCharSet     = 'исключающий набор символов';
    sHlpRange          = 'диапазон символов от a до z';
    sHlpNegRange       = 'исключающий диапазон';
    sHlpBeginLine      = 'начало строки';
    sHlpEndLine        = 'конец строки';
    sHlpBeginText      = 'начало документа';
    sHlpEndText        = 'конец документа';
    sHlpBeginRange     = 'начало диапазона поиска';
    sHlpEndRange       = 'конец диапазона поиска';
    sHlpWordBoun       = 'граница слова';
    sHlpNonWordBoun    = 'не граница слова';
    sHlpExcludePrev    = 'исключить предыдущее из результата';
    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)';
    sHlpGreedy         = '- выше жадные квантификаторы ';
    sHlpLazy           = 'добавить для ленивого квантификатора';
    sHlpPossesive      = 'добавить для сверхжадного квантификатора';
    sHlpCapture1       = 'запоминающая скобка';
    sHlpCapture2       = 'соответствует негативному ab, захвату';
    sHlpNotCapture     = 'незапоминающая скобка';
    sHlpAtomicGrouping = 'атомарная группа (незапоминающая)';
    sHlpPreceded       = 'строка следует за ab';
    sHlpNotPreceded    = 'строка не следует за ab';
    sHlpFollowed       = 'строка предшествует ab';
    sHlpNotFollowed    = 'строка не предшествует ab';
    sHlpCondition      = 'если (1) то x, иначе y';
    sHlpBackrefer9     = 'обратная ссылка, диапазон 1-9';
    sHlpBackrefer99    = 'обратная ссылка, диапазон 01-99';
    sHlpIgnoreCase     = 'не учитывать регистр символов';
    sHlpMultiline      = 'многострочный поиск (по умолчанию)';
    sHlpDotDefault     = 'точке соответствует любой символ (по умолчанию)';
    sHlpInvertGreed    = 'инвертировать жадность квантификаторов';
    sHlpMatchCase      = 'учитывать регистр символов';
    sHlpMultilineOff   = 'выключить многострочный поиск';
    sHlpDotDefaultOff  = 'точке соответствует любой символ, кроме \\n';
    sHlpInvertGreedOff = 'отменить инвертирование жадности';
  }
  else
  {
    sTxtDlgTitle = 'TextMarker';
    //tabs
    sTxtMarkers  = 'Markers';
    sTxtCurMarks = 'Current marks';
    //header of list
    sTxtNameH       = 'Name';
    sTxtTextColorH  = 'TextColor';
    sTxtBkColorH    = 'BkColor';
    sTxtFontStyleH  = 'Font';
    sTxtTextH       = 'Text';
    sTxtCaseSensH   = 'CaseSens';
    sTxtWholeWordH  = 'Word';
    sTxtRegExpH     = 'RegExp';
    sTxtMarkIDH     = 'MarkID';
    sTxtMarkerNameH = 'Marker name';
    //static controls and buttons
    sTxtTextColor = '&Text color:';
    sTxtBkColor   = '&Background color:';
    sTxtFontStyle = '&Font style:';
    sTxtText      = 'T&ext:';
    sTxtCaseSens  = '&Case sensitive';
    sTxtWholeWord = '&Whole word';
    sTxtRegExp    = 'Regular e&xpressions';
    sTxtNew       = '&New';
    sTxtRename    = '&Rename';
    sTxtDelete    = '&Delete';
    sTxtMark      = '&Mark';
    sTxtUnmark    = '&Unmark';
    sTxtUnmarkAll = 'Unmark &all';
    sTxtFindDown  = 'Find down';
    sTxtFindUp    = 'Find up';
    //font styles combobox
    sTxtIgnored    = 'ignored';
    sTxtNormal     = 'normal';
    sTxtBold       = 'bold';
    sTxtItalic     = 'italic';
    sTxtBoldItalic = 'bold italic';
    //dialog New, Rename, Delete
    sTxtNewMarker  = 'New marker';
    sTxtRenMarker  = 'Rename marker';
    sTxtDelMarker  = 'Delete marker';
    sTxtName       = 'Name:';
    sTxtNewName    = 'New name:';
    sTxtReserved   = 'This name is reserved for selected text marks.';
    sTxtExists     = 'This marker already exists.';
    sTxtWantDelete = 'Do you want to delete this marker?';
    //error messages
    sErrTextColor = 'Incorrect text color code.';
    sErrBkColor   = 'Incorrect background color code.';
    sErrRegExp    = 'Error in regular expression';
    //edit context menu
    sMnuUndo        = '&Undo';
    sMnuRedo        = '&Redo';
    sMnuCut         = 'C&ut';
    sMnuCopy        = '&Copy';
    sMnuPaste       = '&Paste';
    sMnuDelete      = '&Delete';
    sMnuSelectAll   = 'Select &all';
    sMnuInsertToAP  = 'Insert to AkelPad';
    sMnuPasteFromAP = 'Paste from AkelPad';
    //RegExp help
    sHlpAnyChar        = 'any character (dot)';
    sHlpSpecChars      = '()[]{}^$.?+*|\\ special chars';
    sHlpFF             = 'form feed \\x0C';
    sHlpAnyNL          = 'any new line';
    sHlpTab            = 'tab \\x09';
    sHlpVTab           = 'vertical tab \\x0B';
    sHlpDigit          = 'digit [0-9]';
    sHlpNonDigit       = 'non-digit [^0-9]';
    sHlpWhiteSp        = 'whitespace [ \\f\\n\\t\\v]';
    sHlpNonWhiteSp     = 'non-whitespace';
    sHlpWordChar       = 'word character (non-delimiter)';
    sHlpNonWordChar    = 'non-word character (delimiter)';
    sHlpCharHex        = 'char - hex code, range 0-10FFFF';
    sHlpCharHex2       = 'char - 2-digit hex code';
    sHlpCharHex4       = 'char - 4-digit hex code';
    sHlpAlternative    = 'alternative ab or xy';
    sHlpCharSet        = 'character set, any specified';
    sHlpNegCharSet     = 'negative character set';
    sHlpRange          = 'range of chars from a to z';
    sHlpNegRange       = 'negative range of chars';
    sHlpBeginLine      = 'beginning of line';
    sHlpEndLine        = 'end of line';
    sHlpBeginText      = 'beginning of text';
    sHlpEndText        = 'end of text';
    sHlpBeginRange     = 'beginning of search range';
    sHlpEndRange       = 'end of search range';
    sHlpWordBoun       = 'word boundary';
    sHlpNonWordBoun    = 'non-word boundary';
    sHlpExcludePrev    = 'excludes previous chars from result';
    sHlpZeroOrOne      = 'zero or one time';
    sHlpZeroOrMore     = 'zero or more times';
    sHlpOneOrMore      = 'one or more times';
    sHlpExactly        = 'exactly 3 times';
    sHlpAtLeast        = 'at least 3 times';
    sHlpFromTo         = 'from 3 to 7 times';
    sHlpBackslash      = 'backslash';
    sHlpNL             = 'new line';
    sHlpEntireStr      = 'entire string matched';
    sHlpSubmatch9      = '9th captured submatch, range 1-9';
    sHlpSubmatch99     = '99th captured submatch, range 01-99';
    sHlpGreedy         = '- above quantifiers are greedy';
    sHlpLazy           = 'add at end for lazy quantifier';
    sHlpPossesive      = 'add at end for possesive quantifier';
    sHlpCapture1       = 'matches ab, captures';
    sHlpCapture2       = 'matches negative ab, captures';
    sHlpNotCapture     = 'matches ab, not captures';
    sHlpAtomicGrouping = 'atomic grouping, not captures';
    sHlpPreceded       = 'preceded by ab';
    sHlpNotPreceded    = 'not preceded by ab';
    sHlpFollowed       = 'followed by ab';
    sHlpNotFollowed    = 'not followed by ab';
    sHlpCondition      = 'if (1) then x, else y';
    sHlpBackrefer9     = 'backreference, range 1-9';
    sHlpBackrefer99    = 'backreference, range 01-99';
    sHlpIgnoreCase     = 'case insensitive';
    sHlpMultiline      = 'multiline search (default)';
    sHlpDotDefault     = 'dot matches any char (default)';
    sHlpInvertGreed    = 'invert greediness';
    sHlpMatchCase      = 'match case';
    sHlpMultilineOff   = 'turn off multiline search';
    sHlpDotDefaultOff  = 'dot matches any char, except \\n';
    sHlpInvertGreedOff = 'turn off greediness inversion';
  }
}



Last edited by KDJ on Tue Dec 15, 2015 7:33 pm; edited 12 times in total
Back to top
View user's profile Send private message
Cuprum



Joined: 28 Sep 2011
Posts: 370

PostPosted: Wed Oct 22, 2014 5:30 pm    Post subject: Reply with quote

Автоматическая вставка табуляции после нажатия Enter. Для своей работы требует CoderFunctions.js

Как работает в html




Как работает в css, less, js




Бонус: Дополнительная вставка табуляции, если перевод строки выполнен сразу после "{"


.

Спасибо Instructor-у за разъяснения!

autoInsertTab.js

Code:
// === autoInsertTab.js === http://akelpad.sourceforge.net/forum/viewtopic.php?p=26347#26347
// (с) Cuprum
//
// Если каретка непосредственно расположена:
// a) между открывающим и закрывающим тегом в html-файлах
// б) между открывающей и закрывающей фигурными скобками ({}) в css-, less-, js-файлах,
// то при нажатии клавиши Enter вместе с переводом на новую строку вставляется символ табуляции.
//
// 1.0 (22.10.2014)
//
// Пример:
//    Call("Scripts::Main", 1, "autoInsertTab.js")
// Горячая клавиша для скрипта - Enter
//
// Зависимости:
//    Используется библиотека CoderFunctions.js http://akelpad.sourceforge.net/forum/viewtopic.php?p=19641#19641


var hMainWnd = AkelPad.GetMainWnd(),
   hWndEdit = AkelPad.GetEditWnd(),
   hWndFocus = AkelPad.SendMessage(hMainWnd, 1317 /*AKD_GETFOCUS*/, 0, 0),
   oSys = AkelPad.SystemFunction(),
   flieExts1 = "css|js|less",
   flieExts2 = "html|htm|xml",
   TextAroundCarriage,
   TextBeforeCarriage,
   TextAfterCarriage,
   ext;

function SetRedraw(hWnd, bRedraw) {
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);

   if (bRedraw) {
      oSys.Call("user32::InvalidateRect", hWnd, 0, true);
   }
}

function getTextAroundCarriage(beforeCarriage, afterCarriage) {
   var carriage = AkelPad.GetSelStart(),
      textRange;

   beforeCarriage = carriage - beforeCarriage;
   afterCarriage = carriage + afterCarriage;
   textRange = AkelPad.GetTextRange(beforeCarriage, afterCarriage);

   return textRange;
}

// Перевод каретки на новую строку с последующей вставкой табуляции. Следит за сохранением отступов слева.
// При вызове с аргументом 1, делает два перевода на новую строку, возвращает каретку на строку вверх и вставляет табуляцию.
function insertTab(arg) {
   var bKeepSpace = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 146 /*MI_KEEPSPACE*/, 0),
   carriage;

   SetRedraw(hWndEdit, false);
   if (!bKeepSpace) {
      AkelPad.Command(4254 /*IDM_OPTIONS_KEEPSPACE*/);
   }
   AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);
   if (arguments[0] === 1) {
      carriage = AkelPad.GetSelStart();
      AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);
      AkelPad.SetSel(carriage, carriage);
   }
   AkelPad.Command(4164 /*IDM_EDIT_INSERT_TAB*/);
   if (!bKeepSpace) {
      AkelPad.Command(4254 /*IDM_OPTIONS_KEEPSPACE*/);
   }
   SetRedraw(hWndEdit, true);
   WScript.Quit();
}

if (AkelPad.Include("CoderFunctions.js")) {
   ext = GetSyntaxAliasExtension(hWndEdit);

   if (hWndEdit == hWndFocus) {
      if (flieExts1.indexOf(ext) >= 0) { // js, css, less
         TextBeforeCarriage = getTextAroundCarriage(1, 0);
         TextAfterCarriage = getTextAroundCarriage(0, 1);
      } else if (flieExts2.indexOf(ext) >= 0) { // html, htm, xml
         TextAroundCarriage = getTextAroundCarriage(1, 2);
      }

      if ((TextBeforeCarriage === "{" && TextAfterCarriage === "}") || TextAroundCarriage === "></") {
         insertTab(1);
      } else if (TextBeforeCarriage === "{" && TextAfterCarriage !== "}") {
         insertTab();
      }
   }
}

if (hWndFocus) {
   AkelPad.SendMessage(hWndFocus, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);
}

Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 6223

PostPosted: Sat Oct 25, 2014 10:21 am    Post subject: Reply with quote

Paste text preserving leading spaces.

SmartPaste.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=26373#26373
// Version: 1.2
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Paste text preserving leading spaces.
// Description(1049): Вставить текст сохраняя пробелы в начале.
//
// Arguments:
// -NormalPaste=1            -Normal paste condition (one of the following):
//                              1  if caret not on line start.
//                              0  disabled (default).
// -ClipboardUnindent=0      -Remove leading spaces from clipboard text before paste (one of the following):
//                              2  remove all.
//                              1  smart remove (default).
//                              0  don't remove.
// -ClipboardEmpty=true      -If clipboard is empty then paste new line (default is false).
// -NewLineToStart=1         -Insert new line to the beginning of clipboard text if nessesary (one of the following):
//                              2  insert when nessesary, but only for multiline clipboard (default).
//                              1  insert when nessesary.
//                              0  don't insert.
// -NewLineToEnd=1           -Insert new line to the end of clipboard text if nessesary (one of the following):
//                              2  insert when nessesary, but only for multiline clipboard (default).
//                              1  insert when nessesary.
//                              0  don't insert.
// -Select=2                 -Select pasted text (one of the following):
//                              2  select only clipboard part.
//                              1  select all pasted.
//                              0  don't select (default).
// Usage:
// Call("Scripts::Main", 1, "SmartPaste.js", `-NormalPaste=1 -Select=2`)

//Arguments
var nNormalPaste=AkelPad.GetArgValue("NormalPaste", 0);
var nClipboardUnindent=AkelPad.GetArgValue("ClipboardUnindent", 1);
var bClipboardEmpty=AkelPad.GetArgValue("ClipboardEmpty", false);
var nNewLineToStart=AkelPad.GetArgValue("NewLineToStart", 2);
var nNewLineToEnd=AkelPad.GetArgValue("NewLineToEnd", 2);
var nSelect=AkelPad.GetArgValue("Select", 0);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit;
var hWndFocus;
var oSys=AkelPad.SystemFunction();
var oPattern;
var pSpaces;
var pLine;
var pText;
var lpLinesArray;
var nIndex;
var nSelStartMove=0;
var nSelEndMove=0;

//Allow script for plugins AkelEdit windows
hWndFocus=AkelPad.SendMessage(hMainWnd, 1317 /*AKD_GETFOCUS*/, 0, 0);
if (!AkelPad.SetEditWnd(hWndFocus))
{
  AkelPad.SendMessage(hWndFocus, 0x302 /*WM_PASTE*/, 0, 0);
  WScript.Quit();
}
hWndEdit=AkelPad.GetEditWnd();

//Get clipboard text
if (!(pText=AkelPad.GetClipboardText()))
{
  if (bClipboardEmpty)
    pText="\r";
  else
    WScript.Quit();
}

if (pText)
{
  //Get line spaces
  var nSelStart=AkelPad.GetSelStart();
  var nMinLineStart=AkelPad.SendMessage(hWndEdit, 3138 /*AEM_GETRICHOFFSET*/, 18 /*AEGI_WRAPLINEBEGIN*/, nSelStart);
  var nMinLineEnd=AkelPad.SendMessage(hWndEdit, 3138 /*AEM_GETRICHOFFSET*/, 19 /*AEGI_WRAPLINEEND*/, nSelStart);
  var nSelEnd=AkelPad.GetSelEnd();
  //var nMaxLineStart=AkelPad.SendMessage(hWndEdit, 3138 /*AEM_GETRICHOFFSET*/, 18 /*AEGI_WRAPLINEBEGIN*/, nSelEnd);
  var nMaxLineEnd=AkelPad.SendMessage(hWndEdit, 3138 /*AEM_GETRICHOFFSET*/, 19 /*AEGI_WRAPLINEEND*/, nSelEnd);
  var bCaretAtEnd;
  var bMultilineClipboard;

  if (nSelEnd < nMaxLineEnd)
    bCaretAtEnd=false;
  else
    bCaretAtEnd=true;
  pLine=AkelPad.GetTextRange(nMinLineStart, nMinLineEnd);
  pSpaces=pLine.replace(/^([ \t]*).*/g, "$1");
  if (nSelStart - nMinLineStart <= pSpaces.length)
    pSpaces=pSpaces.substr(0, nSelStart - nMinLineStart);
  else if (nNormalPaste)
  {
    AkelPad.Command(4155 /*IDM_EDIT_PASTE*/);
    WScript.Quit();
  }

  //Correct clipboard text
  pText=pText.replace(/\r\r\n|\r\n/g, "\r");
  if (nClipboardUnindent == 1)
  {
    if (pText.match(/^([ \t]*)/) && RegExp.$1.length)
    {
      oPattern=new RegExp("^[ \t]{1," + RegExp.$1.length + "}", "gm");
      pText=pText.replace(oPattern, "");
    }
  }
  else if (nClipboardUnindent == 2)
  {
    pText=pText.replace(/^[ \t]*/gm, "");
  }

  if (nNewLineToStart == 2 || nNewLineToEnd == 2)
  {
    if (/\r/.test(pText))
      bMultilineClipboard=true;
    else
      bMultilineClipboard=false;
  }
  if (nNewLineToStart == 1 || (nNewLineToStart == 2 && bMultilineClipboard))
  {
    if (nSelStart - nMinLineStart > pSpaces.length)
    {
      pText="\r" + pText;
      nSelStartMove+=1;
    }
  }
  if (nNewLineToEnd == 1 || (nNewLineToEnd == 2 && bMultilineClipboard))
  {
    if (pText.charAt(pText.length - 1) == "\r")
    {
      if (bCaretAtEnd)
      {
        //Remove new line from end
        pText=pText.substr(0, pText.length - 1);
      }
    }
    else if (!bCaretAtEnd)
    {
      //Add new line to end
      pText=pText + "\r";
      nSelEndMove-=1;
    }
    if (!bCaretAtEnd)
      nSelEndMove-=pSpaces.length;
  }
}

//Indent text
if (pSpaces)
{
  if ((lpLinesArray=pText.split("\r")) && lpLinesArray.length > 1)
  {
    for (nIndex=1; nIndex < lpLinesArray.length; ++nIndex)
    {
      if (lpLinesArray[nIndex] || nIndex == lpLinesArray.length - 1 ||
          (lpLinesArray.length == 3 && pText.length == 2))
      {
        lpLinesArray[nIndex]=pSpaces + lpLinesArray[nIndex];
      }
    }
    pText=lpLinesArray.join("\r");
  }
}

//Insert text
if (nSelect == 2 && (nSelStartMove || nSelEndMove))
  SetRedraw(hWndEdit, false);
AkelPad.ReplaceSel(pText, nSelect?-1:0);
if (nSelect == 2 && (nSelStartMove || nSelEndMove))
{
  AkelPad.SetSel(AkelPad.GetSelStart() + nSelStartMove, AkelPad.GetSelEnd() + nSelEndMove);
  SetRedraw(hWndEdit, true);
}

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



Last edited by Instructor on Tue Feb 24, 2015 11:11 am; edited 2 times in total
Back to top
View user's profile Send private message Send e-mail
Cuprum



Joined: 28 Sep 2011
Posts: 370

PostPosted: Sat Nov 01, 2014 1:39 pm    Post subject: Reply with quote

autoInsertQuotes.js

Code:
// === [autoInsertQuotes.js] ===
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=26484#26484
// https://github.com/cuprum/AkelPad_scripts/blob/master/autoInsertQuotes.js
//
// (c) Cuprum  2014
//
// Автоматически добавляет кавычки после печати знака равенства внутри HTML-тега.
// Горячая клавиша для скрипта '='.
//
// Adding qoutes for attribute value on typing equals sign(=) inside HTML tag.
// Hotkey for script is '='
//
// Arguments:
//    -singleQuotes                     - Set single quotes after typing =.
//    -fileExts="htm, html, php"        - Allows to set custom file extensions. Default is "html, xml".
//
// Usage:
//    Call("Scripts::Main", 1, "autoInsertQuotes.js")
//    Call("Scripts::Main", 1, "autoInsertQuotes.js",'-singleQuotes')
//    Call("Scripts::Main", 1, "autoInsertQuotes.js",'-fileExts="htm, html, php" -singleQuotes')
//
// Versions:
//    1.2 (23.11.2014)
//      Support xml notation in attribute names.
//
//    1.1 (5.11.2014)
//      Typing '=' without quotes inside attribute value.
//
//    1.0 (1.11.2014)
//      Initial release.


var hMainWnd = AkelPad.GetMainWnd(),
   hWndEdit = AkelPad.GetEditWnd(),
   hWndFocus = AkelPad.SendMessage(hMainWnd, 1317 /*AKD_GETFOCUS*/, 0, 0),
   fileExts = AkelPad.GetArgValue("fileExts", "html, xml"),
   quotes = "\"\"",
   LastTagPattern = /<[^\s>\/]+(?:[^>"']|"[^"]*"|'[^']*')*$/i,
   attrPattern = /\s[a-z_:][\w\-.:]*$/i,
   currentExt,
   args,
   textStr;

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11382#11382
function GetOffset(hWndEdit, nType /*AEGI_*/, nOffset) {
   var lpIndex;

   if (lpIndex = AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/)) {
      if (nOffset != -1) {
         AkelPad.SendMessage(hWndEdit, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset, lpIndex);
      }
      AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, nType, lpIndex);
      nOffset = AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);
      AkelPad.MemFree(lpIndex);
   }
   return nOffset;
}

function GetTextLineStartToCaret() {
   var nCaretPos,
      nCaretLineStartPos;

   nCaretPos = GetOffset(hWndEdit, 5 /*AEGI_CARETCHAR*/, -1);
   nCaretLineStartPos = GetOffset(hWndEdit, 18 /*AEGI_WRAPLINEBEGIN*/, nCaretPos);

   return AkelPad.GetTextRange(nCaretLineStartPos, nCaretPos);
}

// Compiling based on http://akelpad.sourceforge.net/forum/viewtopic.php?p=19641#19641
function GetFileExt() {
   var hWndEdit = AkelPad.GetEditWnd(),
      hDocEdit = AkelPad.GetEditDoc(),
      pAlias="",
      lpAlias,
      fileExt;

   if (!hWndEdit || !hDocEdit) {
      return "";
   }
   if (lpAlias = AkelPad.MemAlloc(256 * 2 /*sizeof(wchar_t)*/)) {
      AkelPad.CallW("Coder::Settings", 18 /*DLLA_CODER_GETALIAS*/, hWndEdit, hDocEdit, lpAlias, 0);
      pAlias = AkelPad.MemRead(lpAlias, 1 /*DT_UNICODE*/);
      AkelPad.MemFree(lpAlias);
   }
   if (pAlias) {
      fileExt = pAlias.split('.');
      fileExt = fileExt[fileExt.length - 1];
   }

   return fileExt;
}

function insertQuotes(quotes) {
   var nCaretPos;

   AkelPad.ReplaceSel("=" + quotes);
   nCaretPos = AkelPad.GetSelStart() - 1;
   AkelPad.SetSel(nCaretPos, nCaretPos);
   WScript.Quit();
}

currentExt = GetFileExt();

if (args = AkelPad.GetArgLine()) {
   if (args.indexOf("singleQuotes") >= 0) {
      quotes = "''";
   }
}

if (fileExts.indexOf(currentExt) >= 0) {
   textStr = GetTextLineStartToCaret();

   if (LastTagPattern.test(textStr) && attrPattern.test(textStr)) {
      insertQuotes(quotes);
   }
}

if (hWndFocus) {
   AkelPad.SendMessage(hWndFocus, 258 /*WM_CHAR*/, 61 /*=*/, 0);
}






Download | GitHub


Last edited by Cuprum on Wed Dec 10, 2014 10:24 pm; edited 1 time in total
Back to top
View user's profile Send private message
Skif_off



Joined: 20 Oct 2013
Posts: 1094

PostPosted: Tue Dec 09, 2014 9:11 pm    Post subject: Reply with quote

Insert Unicode characters.
Вставка символов Unicode.

Required to include: CreateDialog_functions.js
Для работы необходим: CreateDialog_functions.js.

InsertUnicodeChar.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=26918#26918
// Version: 2015-05-11
// Authors: Skif_off;
//  helped: KDJ, VladSh, Instructor
//
// Description(1033): Insert Unicode characters.
// Description(1049): Вставка символов Unicode.
//
// Required to include (Для работы необходим): CreateDialog_functions.js.
// The script should be saved in Unicode format (Скрипт должен быть сохранен в UTF-16LE).
//
// Templates: InsertUnicodeChar_templates.csv in UTF-16LE, format:
//"00AB", "« (left quote)"
//"00BB", "» (right quote)"
// without tabulation(s) and empty line(s)! (без табуляции и пустых строк!).
//
// Keyboard and mouse:
//   F1 - templates menu
//
// Argumens:
//   -add=0        - (default) replace characters in ComboBox
//       =1        - add characters to ComboBox
//   -RW=0         - (default) don't store inserted strings
//      =1         - store inserted strings
//   -history=20   - (default) set history length (with -RW=1 only)
// Ru:
//   -add=0        - (по умолчанию) вставлять символы в ComboBox
//       =1        - добавлять символы в ComboBox
//   -RW=0         - (по умолчанию) не сохранять введенные строки
//      =1         - сохранять введенные строки
//   -history=20   - размер истории, по умолчанию 20, только вместе с -RW=1
//
// Usage:
// Call("Scripts::Main", 1, "InsertUnicodeChar.js")
// Call("Scripts::Main", 1, "InsertUnicodeChar.js", '-add=0')
// Call("Scripts::Main", 1, "InsertUnicodeChar.js", '-RW=1')
// Call("Scripts::Main", 1, "InsertUnicodeChar.js", '-add=1 -RW=1 -history=10')

if (! AkelPad.Include("CreateDialog_functions.js")) WScript.Quit();

GetLangStrings();

var oSys  = AkelPad.SystemFunction();
var nArg1 = AkelPad.GetArgValue("add", 0);
var nArg2 = AkelPad.GetArgValue("RW", 0);
var nArg3 = AkelPad.GetArgValue("history", 20);
var fso   = new ActiveXObject("Scripting.FileSystemObject");
var aHex  = [];

//read parameters from ini file
if (nArg2 == 1)
{
  var sIniFile = WScript.ScriptFullName.replace(/\.js$/i, ".ini");

  if (fso.FileExists(sIniFile))
    aHex = AkelPad.ReadFile(sIniFile, 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, true).split(/[,]/);
  else
    aHex = ["002F"];
}
else
  aHex = ["002F"];

//find file with templates
var sTemplatesFile = WScript.ScriptFullName.replace(/\.js$/i, "_templates.csv");

//GUI. Thanks KDJ
var IDLABELS   = 1000;
var IDTEXTCB   = 1001;
var IDOKB      = 1002;
var IDCANCELB  = 1004;
var IDTEMPLATE = 1005;
var aDlg       = [];

aDlg.Title    = sTxtTitle;
aDlg.Style    = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER;
aDlg.Parent   = AkelPad.GetMainWnd();
aDlg.Callback = DialogCallback;
aDlg.W        = 216;
aDlg.H        = 62;
aDlg.CtlStyle = WS_VISIBLE;
aDlg.CtlFontN = "MS Shell Dlg";
aDlg.CtlFirst = IDLABELS;
aDlg.Icon     = oSys.Call("User32::LoadImageW",
                  AkelPad.GetInstanceDll(), //hinst
                  101,   //lpszName
                  1,     //uType=IMAGE_ICON
                  16,     //cxDesired
                  16,     //cyDesired
                  0x40); //fuLoad=LR_DEFAULTSIZE

aDlg[IDLABELS]   = {X:   8, Y:   8, W: 200, H:  10, Title: sTxtLabel, Class: "STATIC"};
aDlg[IDTEXTCB]   = {X:   8, Y:  20, W: 200, H: 100,                   Class: "COMBOBOX", Style: WS_TABSTOP | CBS_DROPDOWN};
aDlg[IDOKB]      = {X: 100, Y:  40, W:  50, H:  15, Title: sTxtOK,                       Style: WS_TABSTOP | BS_DEFPUSHBUTTON};
aDlg[IDCANCELB]  = {X: 158, Y:  40, W:  50, H:  15, Title: sTxtCancel,                   Style: WS_TABSTOP};
aDlg[IDTEMPLATE] = {X:   8, Y:  40, W:  15, H:  15, Title: ">",       Class: "BUTTON",   Style: BS_PUSHBUTTON};

CreateDialogBox(aDlg);
oSys.Call("User32::DestroyIcon", aDlg.Icon);

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

  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    aDlg[IDTEXTCB].HWNDE = GetComboBoxEditWnd(aDlg[IDTEXTCB].HWND);
    //fill ComboBox
    for (i = 0; i < aHex.length; ++i)
      AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 323 /*CB_ADDSTRING*/, 0, aHex[i]);

    AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 334 /*CB_SETCURSEL*/, 0, 0);

    if (! fso.FileExists(sTemplatesFile))
      oSys.Call("User32::ShowWindow", aDlg[IDTEMPLATE].HWND, 0 /*SW_HIDE*/);
  }

  else if (uMsg == 6 /*WM_ACTIVATE*/)
  {
    if (wParam)
      oSys.Call("User32::RegisterHotKey", hWnd, 1, 0, 0x70 /*VK_F1*/);
    else
      oSys.Call("User32::UnregisterHotKey", hWnd, 1);
  }

  else if (uMsg == 786 /*WM_HOTKEY*/)
  {
    if ((wParam == 1) && oSys.Call("User32::IsWindowVisible", aDlg[IDTEMPLATE].HWND))
      Templates();
  }

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    nLowParam = wParam & 0xFFFF;
    if (nLowParam == IDOKB)
    {
      if (Action(hWnd))
        oSys.Call("User32::EndDialog", hWnd, 0);
    }
    else if (nLowParam == IDTEMPLATE)
      Templates();
    else if ((nLowParam == IDCANCELB) || (nLowParam == 2 /*IDCANCEL*/))
      oSys.Call("User32::EndDialog", hWnd, 0);
  }
}

function Action(hWnd)
{
  var nTextLen   = AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 14 /*WM_GETTEXTLENGTH*/, 0, 0) + 1;
  var lpText     = AkelPad.MemAlloc(nTextLen * 2);
  var sIniString = "";
  var sChar      = "";
  var sHex       = "";
  var oPattern;
  var i;

  AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 13 /*WM_GETTEXT*/, nTextLen, lpText);
  sHex = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
  AkelPad.MemFree(lpText);

  if (/[^a-f\d]+/i.test(sHex))
  {
    AkelPad.MessageBox(hWnd, sTxtTextError, sTxtError, 0x10 /*MB_ICONERROR*/);
    return false;
  }
  else
  {
    if (AkelPad.GetEditWnd())
    {
      if (fso.FileExists(AkelPad.GetAkelDir(4) + "\\HexSel.dll"))
        AkelPad.Call("HexSel::Main", 2, 10, "", "", -1, 1200, sHex);
      else
      {
        if (sHex = sHex.substr(0, Math.floor(sHex.length / 4) * 4))
        {
          for (i = 0; i < sHex.length; i += 4)
            sChar += String.fromCharCode(parseInt(sHex.substr(i, 4), 16));

          AkelPad.ReplaceSel(sChar);
        }
      }
    }
    //add sHex to aHex & write parameters (aHex and other) to ini file
    if (nArg2 == 1)
    {
      if (sHex != aHex[0])
        aHex.unshift(sHex);
      if (aHex.length > nArg3)
        aHex.splice(nArg3, aHex.length);

      sIniString = aHex.join(",");
      oPattern = new RegExp(","+ sHex + ",", "gi");
      sIniString = sIniString.replace(oPattern, ",");
      oPattern = new RegExp(","+ sHex + "$", "gi");
      sIniString = sIniString.replace(oPattern, "");
      sIniString = sIniString.toUpperCase()

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

function Templates()
{
  var lpRect  = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
  var hMenu   = oSys.Call("User32::CreatePopupMenu");
  var nString = 0x0000; //MF_STRING
  var nSepar  = 0x0800; //MF_SEPARATOR
  var nX;
  var nY;
  var sTemplates;
  var aMenu;
  var nCmd;
  var i;

  oSys.Call("User32::GetWindowRect", aDlg[IDTEXTCB].HWND, lpRect);
  nX = AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/);
  nY = AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpRect);

  sTemplates = 'aMenu = [[nString, ' + AkelPad.ReadFile(sTemplatesFile, 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, true)

// only MDI/PMDI
//  if (! AkelPad.IsMDI())
//    sTemplates = sTemplates.replace(/(\r\n)|\n/g, '],[nString, ') + '],[nSepar],[nString, sTxtEmpty, ""]];'
//  else
    sTemplates = sTemplates.replace(/(\r\n)|\n/g, '],[nString, ') + '],[nSepar],[nString, sTxtEmpty, ""],[nString, sTxtEdit, ""]];'

  eval(sTemplates)

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

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0188 /*TPM_RETURNCMD|TPM_NONOTIFY|TPM_RIGHTALIGN*/, nX, nY, 0, aDlg.HWND, 0);
  oSys.Call("User32::DestroyMenu", hMenu);

  if (nCmd--)
  {
    oSys.Call("User32::SetFocus", aDlg[IDTEXTCB].HWND);

    if (aMenu[nCmd][1] == sTxtEmpty)
      oSys.Call("User32::SendMessageW", aDlg[IDTEXTCB].HWND, 12 /*WM_SETTEXT*/, 0, "");
    else if (aMenu[nCmd][1] == sTxtEdit)
    {
      AkelPad.OpenFile(sTemplatesFile);
      oSys.Call("User32::EndDialog", aDlg.HWND, 0);
    }
    else
    {
      if (nArg1 == 0)
        oSys.Call("user32::SetWindowTextW", aDlg[IDTEXTCB].HWNDE, aMenu[nCmd][1]);
      else
      {
        var nGetTextLength = oSys.Call("User32::SendMessageW", aDlg[IDTEXTCB].HWNDE, 14 /*WM_GETTEXTLENGTH*/, 0, 0);
        oSys.Call("User32::SendMessageW", aDlg[IDTEXTCB].HWNDE, 0xB1 /*EM_SETSEL*/, nGetTextLength, nGetTextLength);
        oSys.Call("User32::SendMessageW", aDlg[IDTEXTCB].HWNDE, 194 /*EM_REPLACESEL*/, 1, aMenu[nCmd][1]);
      }
    }
  }
}

function GetComboBoxEditWnd(hWndCB)
{
  var lpCOMBOBOXINFO = AkelPad.MemAlloc(_X64 ? 64 : 52 /*sizeof(COMBOBOXINFO)*/);
  var hWndCBE = 0;

  AkelPad.MemCopy(lpCOMBOBOXINFO, _X64 ? 64 : 52, 3 /*DT_DWORD*/); //cbSize
  AkelPad.SendMessage(hWndCB, 0x0164 /*CB_GETCOMBOBOXINFO*/, 0, lpCOMBOBOXINFO);
  hWndCBE = AkelPad.MemRead(_PtrAdd(lpCOMBOBOXINFO, _X64 ? 48 : 44) /*hwndItem*/, 2 /*DT_QWORD*/);
  AkelPad.MemFree(lpCOMBOBOXINFO);

  return hWndCBE;
}

function GetLangStrings()
{
  if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/)
  {
    sTxtTitle     = "Вставить символы Unicode";
    sTxtLabel     = "Четырехсимвольные шестнадцатеричные коды:";
    sTxtOK        = "OK";
    sTxtCancel    = "Отмена";
    sTxtTextError = "Только цифры в шестнадцатеричной системе (0-9, A-F).";
    sTxtError     = "Ошибка";
    sTxtEmpty     = "Очистить";
    sTxtEdit      = "Редактировать";
  }
  else
  {
    sTxtTitle     = "Insert Unicode characters";
    sTxtLabel     = "Four digits hex codes:";
    sTxtOK        = "OK";
    sTxtCancel    = "Cancel";
    sTxtTextError = "Hex digits only (0-9, A-F).";
    sTxtError     = "Error";
    sTxtEmpty     = "Clean";
    sTxtEdit      = "Edit";
  }
}


InsertUnicodeChar_templates.csv

Code:
"00AB", "« (left quote)"
"00BB", "» (right quote)"
: without tabulation(s) and empty line(s) (без табулиции и пустых строк)!

The script and templates-file should be saved in Unicode format (UTF-16LE).
Скрипт и файл с шаблонами должны быть сохранены в Unicode (UTF-16LE).


Last edited by Skif_off on Mon May 11, 2015 2:06 pm; edited 9 times in total
Back to top
View user's profile Send private message
Cuprum



Joined: 28 Sep 2011
Posts: 370

PostPosted: Wed Dec 10, 2014 10:08 pm    Post subject: Reply with quote

Скрипт может пригодиться веб-разработчикам.
Создает файл на основе выделенного текста





createSelectedFile.js

Code:
// [createSelectedFile.js]
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=26939#26939
// https://github.com/cuprum/AkelPad_scripts/blob/master/createSelectedFile.js
//
// Author: Cuprum
//...............................................................................
//
// Создание файла на основе выделения.
// Файл создается, когда выделенный текст является названием файла (имя + расширение) или относительным путем, оканчивающимся файлом;
// расширение файла внутри выделенного фрагмента должно соответствовать определенному значению (см. -exts в описании аргументов).
// Если файл уже существует, то он будет открыт.
// При использовании ключа -forceQuotes проверяется наличие выделенного текста, и если его нет, для анализа берется текст
// между ближайшими парными кавычками, окружающими курсор.
//
// Allow to create file from selection. Selection must be file (name + extension) or relative path with file.
// File extension must matched with list (see -exts in 'Arguments' section).
// If a selected file exists, it will be opened.
//
// Arguments:
//    -path="%f"                     Required argument.
//    -msg                           Show dialog box before creating file.
//    -exts="ext1|ext2|ext3|ext4"    Set custom file extensions. Default is "js|css|less".
//    -forceQuotes                   Get file path from nearest quoted text relative to the cursor if no selection (or selection is wrong).
//
// Usage:
//    Call("Scripts::Main", 1, "createSelectedFile.js", `-path="%f"`)
//    Call("Scripts::Main", 1, "createSelectedFile.js", `-path="%f" -exts="css|js|less|htm|html"`)
//    Call("Scripts::Main", 1, "createSelectedFile.js", `-path="%f" -msg -exts="css|js|less|htm|html"`)
//    Call("Scripts::Main", 1, "createSelectedFile.js", `-path="%f" -msg -forceQuotes -exts="css|js|less|htm|html"`)
//
// Versions:
//    1.1.0 (29.11.2015)
//      Add the ability to work without selected text (argument -forceQuotes).
//    1.0.1 (28.11.2015)
//      Fix regexp for file path.
//    1.0.0 (11.12.2014)
//      Initial release.


var FileMaker;
var aCurrentLineWithCaretPos;
var hWndMain = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var hWndFocus = AkelPad.SendMessage(hWndMain, 1317 /*AKD_GETFOCUS*/, 0, 0);
var pSelText = AkelPad.GetSelText();
var localize = function(o) {
   var lng = AkelPad.GetLangId(0 /*LANGID_FULL*/);

   switch (lng) {
      case 1049: /*RU*/
         o.sLngFile = "Файл\n";
         o.sLngCreate = "\nне существует. Создать?";
         break;
      default: /*EN*/
         o.sLngFile = "File\n";
         o.sLngCreate = "\ndoesn't exist. Create?";
         break;
   }
};
var oScrArgs = {
      sCurPath: AkelPad.GetArgValue("path", ""),
      nIsConfirmMsg: AkelPad.GetArgValue("msg", 0),
      sExts: AkelPad.GetArgValue("exts", "js|css|less"),
      nIsForceQuotes: AkelPad.GetArgValue("forceQuotes", 0)
   };

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11382#11382
function GetOffset (hWndEdit, nType /*AEGI_*/, nOffset) {
   var lpIndex;

   if ( lpIndex = AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/) ) {
      if (nOffset != -1) {
         AkelPad.SendMessage(hWndEdit, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset, lpIndex);
      }
      AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, nType, lpIndex);
      nOffset = AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);
      AkelPad.MemFree(lpIndex);
   }
   return nOffset;
}

// Получение текущей строки и внутренней позиции курсора
function getCurrentLine () {
   var nCaretPos;
   var nLineStart;
   var nLineEnd;
   var sCurrentLine;

   nCaretPos = GetOffset(hWndEdit, 5 /*AEGI_CARETCHAR*/, -1);
   nLineStart = GetOffset(hWndEdit, 18 /*AEGI_WRAPLINEBEGIN*/, nCaretPos);
   nLineEnd = GetOffset(hWndEdit, 19 /*AEGI_WRAPLINEEND*/, nCaretPos);
   sCurrentLine = AkelPad.GetTextRange(nLineStart, nLineEnd);

   return [sCurrentLine, nCaretPos - nLineStart - 1];
}

if (hWndEdit !== hWndFocus) {
   WScript.Quit();
}

localize(oScrArgs);

aCurrentLineWithCaretPos = getCurrentLine();

FileMaker = function (sSelText, oParams) {
   this.sSelText = sSelText;
   this.sExts = oParams.sExts;
   this.rSel = new RegExp("^([^\\\\:\"*?<>|\\r\\n]*/)?([^\\\\/:\"*?<>|\\r\\n]+?\\.(?:" + this.sExts + ")$)", "i");
   this.rCurPath = /^.*\\/;
   this.sCurPath = (oParams.sCurPath || WScript.Quit()).match(this.rCurPath)[0];
   this.oFso = new ActiveXObject("Scripting.FileSystemObject");
   this.sNewFilePath = "";
   this.sLngFile = oParams.sLngFile;
   this.sLngCreate = oParams.sLngCreate;
   this.nIsConfirmMsg = oParams.nIsConfirmMsg;
   this.nIsForceQuotes = oParams.nIsForceQuotes;
   this.bCallConfirmMsg = false;

   this.init();
};

FileMaker.prototype = {
   constructor: FileMaker,
   checkSelText: function (selText, rPattern) {
      var aMatched;

      if (!this.nIsForceQuotes) {
         if ( !(aMatched = selText.match(rPattern)) ) WScript.Quit();
      }
      else {
         if ( !(aMatched = selText.match(rPattern)) ) { // нет выделения или оно "неправильное"
            if ( !(aMatched = this.getStrBetweenQuotes(aCurrentLineWithCaretPos).match(rPattern)) ) WScript.Quit();
         }
      }

      return aMatched;
   },
   analyzeMatch: function () {
      var oResult;
      
      this.aSelMatched = this.checkSelText(this.sSelText, this.rSel);
      oResult = {
         sFileName: this.aSelMatched[2]
      };
      if (this.aSelMatched[1] !== "") {
         oResult.aSubFolders = this.aSelMatched[1].split(/\//);
      }
      this.sNewFilePath = this.sCurPath + this.aSelMatched[0].replace(/\//g, "\\");

      return oResult;
   },
   getStrBetweenQuotes: function (aParams) {
      var sCurStr = aParams[0];
      var nCaretPos = aParams[1];
      var nleftSingleQoute = sCurStr.lastIndexOf("'", nCaretPos);
      var nleftDoubleQoute = sCurStr.lastIndexOf('"', nCaretPos);
      var rBetweenQuotes;
      var sNearestQuote;
      var sSubStr;
      var sMatchedStr;

      if ( (nleftDoubleQoute === -1) && (nleftSingleQoute === -1) ) WScript.Quit(); // слева от курсора нет кавычек
      if ( (nleftDoubleQoute > -1) && (nleftSingleQoute === -1) ) {
         sNearestQuote = '"';
         sSubStr = sCurStr.slice(nleftDoubleQoute);
      }
      if ( (nleftDoubleQoute === -1) && (nleftSingleQoute > -1) ) {
         sNearestQuote = "'";
         sSubStr = sCurStr.slice(nleftSingleQoute);
      }
      if ( (nleftDoubleQoute > -1) && (nleftSingleQoute > -1) ) {
         if (nleftDoubleQoute > nleftSingleQoute) {
            sNearestQuote = '"';
            sSubStr = sCurStr.slice(nleftDoubleQoute);
         }
         else {
            sNearestQuote = "'";
            sSubStr = sCurStr.slice(nleftSingleQoute);
         }
      }
      rBetweenQuotes = new RegExp(sNearestQuote + "([^\'\"]+)" + sNearestQuote);
      if ( sMatchedStr = sSubStr.match(rBetweenQuotes) ) {
         sMatchedStr = sMatchedStr[1];
      }
      else { // справа от курсора нет подходящей кавычки
         WScript.Quit();
      }

      return sMatchedStr;
   },
   showConfirmMsg: function() {
      if (!this.nIsConfirmMsg) return;
      if (this.bCallConfirmMsg) return;
      this.bCallConfirmMsg = true;
      if ( AkelPad.MessageBox(hWndMain, this.sLngFile + this.sNewFilePath + this.sLngCreate, WScript.ScriptName, 4 /*MB_YESNO*/ + 32 /*MB_ICONQUESTION*/) === 7 /*IDNO*/ ) {
         WScript.Quit();
      }
   },
   createFile: function() {
      if ( this.oFso.FileExists(this.sNewFilePath) ) {
         AkelPad.OpenFile(this.sNewFilePath);
      } else {
         this.showConfirmMsg();
         AkelPad.Command(4101, 1); /*IDM_FILE_NEW*/
         AkelPad.SaveFile(0, this.sNewFilePath, -1, -1, 0x1 /*SD_UPDATE*/);
      }
   },
   createSubFolders: function(sCurPath, aSubFolders) {
      var i;
      var length = aSubFolders.length;
      var pExplorer = "Explorer::Main";

      for (i = 0; i < length; i++) {
         sCurPath = sCurPath + aSubFolders[i] + "\\";
         if ( this.oFso.FolderExists(sCurPath) ) {
            continue;
         } else {
            this.showConfirmMsg();
            this.oFso.CreateFolder(sCurPath);
         }
      }
      if ( AkelPad.IsPluginRunning(pExplorer) ) {
         AkelPad.Call(pExplorer, 2);
      }
   },
   processing: function(oMatch) {
      if (oMatch.sFileName && oMatch.aSubFolders) {
         this.createSubFolders(this.sCurPath, oMatch.aSubFolders);
         this.createFile();
      } else {
         this.createFile();
      }
   },
   init: function () {
      var oMatch = this.analyzeMatch();
      this.processing(oMatch);
   }
};

new FileMaker(pSelText, oScrArgs);



Download | GitHub


Last edited by Cuprum on Sun Nov 29, 2015 3:38 pm; edited 2 times in total
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 6223

PostPosted: Thu Dec 18, 2014 6:22 pm    Post subject: Reply with quote

Show sessions menu for open.

SessionsOpenMenu.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27098#27098
// Version: 1.3
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Show sessions menu for open.
// Description(1049): Показать меню сессий для открытия.
//
// Arguments:
// -ForceNewInstance=true   -Open session in new instance (required script ForceNewInstance.js). Default is false.
//
// Usage:
// Call("Scripts::Main", 1, "SessionsOpenMenu.js", `-ForceNewInstance=true`)

//Include
if (!AkelPad.Include("ShowMenu.js")) WScript.Quit();

//Arguments
var bForceNewInstance=AkelPad.GetArgValue("ForceNewInstance", false);

//Variables
var fso=new ActiveXObject("Scripting.FileSystemObject");
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var oFolder;
var oFiles;
var aFiles=[];
var aItems=[];
var nItem=0;
var pSessionsDir=GetSessionsDir();

if (pSessionsDir)
{
  //Find files
  oFolder=fso.GetFolder(pSessionsDir);

  for (oFiles=new Enumerator(oFolder.files); !oFiles.atEnd(); oFiles.moveNext())
  {
    if (fso.GetExtensionName(oFiles.item().Name).toLowerCase() == "session")
      aFiles.push(fso.GetBaseName(oFiles.item().Name));
  }

  if (aFiles.length)
  {
    //Sort array
    aFiles=aFiles.sort(function(a, b)
    {
      return oSys.Call("kernel32::lstrcmpi" + _TCHAR, a, b);
    });

    //Show menu
    for (; nItem < aFiles.length; ++nItem)
      aItems[nItem]=[aFiles[nItem], MF_NORMAL, nItem];

    if ((nItem=ShowMenu(aItems, POS_CURSOR, POS_CURSOR)) != -1)
    {
      if (bForceNewInstance)
        AkelPad.Call("Scripts::Main", 1, "ForceNewInstance.js", '-CmdLine=`/Call("Sessions::Main", 1, "' + aItems[nItem][0] + '")`');
      else
        AkelPad.Call("Sessions::Main", 1, aItems[nItem][0]);
    }
  }
}

function GetSessionsDir()
{
  var oSys=AkelPad.SystemFunction();
  var oSet=AkelPad.ScriptSettings();
  var nSaveSessions=1 /*SDIR_PROGRAM*/;
  var lpBuffer;
  var pSessionsDir="";

  if (oSet.Begin("Sessions", 0x21 /*POB_READ|POB_PLUGS*/))
  {
    nSaveSessions=oSet.Read("SaveSessions", 1 /*PO_DWORD*/);
    oSet.End();
  }
  if (nSaveSessions == 1 /*SDIR_PROGRAM*/)
    pSessionsDir=AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\Sessions";
  else if (nSaveSessions == 2 /*SDIR_APPDATA*/)
  {
    if (lpBuffer=AkelPad.MemAlloc(256 * _TSIZE))
    {
      oSys.Call("shell32::SHGetSpecialFolderPath" + _TCHAR, hMainWnd, lpBuffer, 0x1a /*CSIDL_APPDATA*/, 0);
      pSessionsDir=AkelPad.MemRead(lpBuffer, _TSTR) + "\\AkelPad\\Sessions";
      AkelPad.MemFree(lpBuffer);
    }
  }
  return pSessionsDir;
}



Last edited by Instructor on Mon Sep 14, 2015 4:52 am; edited 3 times in total
Back to top
View user's profile Send private message Send e-mail
KDJ



Joined: 06 Mar 2010
Posts: 1915
Location: Poland

PostPosted: Tue Dec 23, 2014 11:24 pm    Post subject: Reply with quote

Run command and capture output - part 1. Part 2 in the next post.

The script should be saved in Unicode format.
All in one: KDJ.zip

RunCommand.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27171#27171
// Version: 2016-08-05
// Author: KDJ
//
// *** Run command and capture output ***
//
// Run in AkelPad window:
//   Call("Scripts::Main", 1, "RunCommand.js")
// Run from command line (required AkelEdit.dll and registration: regsvr32.exe Scripts.dll):
//   wscript.exe RunCommand.js
//
// Keyboard:
//   F1 - Windows command line list ("CMD ?")
//   F4 - maximize/restore window (also Alt+Enter)
//
// Remark:
//   The script should be saved in Unicode format.

if (typeof AkelPad == "undefined")
{
  try
  {
    AkelPad = new ActiveXObject("AkelPad.Document");
    _PtrAdd = function(n1, n2) {return AkelPad.Global._PtrAdd(n1, n2);};
    _X64    = AkelPad.Constants._X64;
  }
  catch (oError)
  {
    WScript.Echo("You need to register Scripts.dll");
    WScript.Quit();
  }
}

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

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

  oSys.Call("User32::SetForegroundWindow", hDlg);
  WScript.Quit();
}

var hMainWnd = AkelPad.GetMainWnd();
var hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var hIconSmall = oSys.Call("User32::LoadImageW",
                   hInstDLL, //hinst
                   101,      //lpszName
                   1,        //uType=IMAGE_ICON
                   16,       //cxDesired
                   16,       //cyDesired
                   0);       //fuLoad
var hIconBig = oSys.Call("User32::LoadImageW",
                 hInstDLL, //hinst
                 101,      //lpszName
                 1,        //uType=IMAGE_ICON
                 32,       //cxDesired
                 32,       //cyDesired
                 0);       //fuLoad
var sAELib;
var hAELib;

if (! hMainWnd)
{
  sAELib = "AkelEdit.dll";
  if (! (hAELib = oSys.Call("Kernel32::LoadLibraryW", AkelPad.GetFilePath(WScript.ScriptFullName, 1 /*CPF_DIR*/) + "\\AkelEdit_" + (_X64 ? "x64\\" : "x86\\") + sAELib)))
  {
    if (! (hAELib = oSys.Call("Kernel32::LoadLibraryW", sAELib)))
    {
      WScript.Echo("Can not load library: " + sAELib);
      WScript.Quit();
    }
  }
}

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

var oFSO      = new ActiveXObject("Scripting.FileSystemObject");
var sCmd      = "";
var sDir      = "";
var sLastFile = "";
var bShowWnd  = 0;
var bFontDef  = 1;
var bColorDef = 1;
var aColor    = [];
var aColorDef = [];
var nHistMax  = 10;
var aHist     = [];
var oRun      = {"hProc": 0, "hThread": 0, "PID": 0, "Stop": 0, EndText: ""};
var aFont;

GetLangStrings();

var IDCMDS = 1000;
var IDDIRS = 1001;
var IDOUTS = 1002;
var IDCMDE = 1003;
var IDDIRE = 1004;
var IDOUTE = 1005;
var IDRUNB = 1006;
var IDCMDB = 1007;
var IDFILB = 1008;
var IDDIRB = 1009;
var IDHISB = 1010;
var IDSETB = 1011;
var aDlg   = [];

aDlg.MinW = Scale.X(475);
aDlg.MinH = Scale.Y(320);
aDlg.X    = 200;
aDlg.Y    = 200;
aDlg.W    = aDlg.MinW;
aDlg.H    = aDlg.MinH;
aDlg.Max  = 0;

aDlg[IDCMDS] = {T: sTxtCommand,  C: "STATIC",    S: 0x50000000 /*WS_CHILD|WS_VISIBLE*/};
aDlg[IDDIRS] = {T: sTxtWorkDir,  C: "STATIC",    S: 0x50000000 /*WS_CHILD|WS_VISIBLE*/};
aDlg[IDOUTS] = {T: sTxtOutput,   C: "STATIC",    S: 0x50000000 /*WS_CHILD|WS_VISIBLE*/};
aDlg[IDCMDE] = {                 C: "AkelEditW", S: 0x50A10000 /*WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_TABSTOP*/};
aDlg[IDDIRE] = {                 C: "AkelEditW", S: 0x50810000 /*WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP*/};
aDlg[IDOUTE] = {                 C: "AkelEditW", S: 0x50B10004 /*WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_TABSTOP|ES_MULTILINE*/};
aDlg[IDRUNB] = {T: sTxtRun,      C: "BUTTON",    S: 0x50000001 /*WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON*/};
aDlg[IDCMDB] = {T: "&CMD ?",     C: "BUTTON",    S: 0x50000000 /*WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON*/};
aDlg[IDFILB] = {T: sTxtFiles,    C: "BUTTON",    S: 0x50000000 /*WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON*/};
aDlg[IDDIRB] = {T: sTxtDirs,     C: "BUTTON",    S: 0x50000000 /*WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON*/};
aDlg[IDHISB] = {T: sTxtHistory,  C: "BUTTON",    S: 0x50000000 /*WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON*/};
aDlg[IDSETB] = {T: sTxtSettings, C: "BUTTON",    S: 0x50000000 /*WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON*/};

ReadIni();

AkelPad.ScriptNoMutex(0x11 /*ULT_LOCKSENDMESSAGE|ULT_UNLOCKSCRIPTSQUEUE*/);
AkelPad.WindowRegisterClass(sClass);

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

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

AkelPad.WindowGetMessage();
AkelPad.WindowUnregisterClass(sClass);
oSys.Call("Kernel32::FreeLibrary", hAELib);
oSys.Call("User32::DestroyIcon", hIconSmall);
oSys.Call("User32::DestroyIcon", hIconBig);

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

  if (uMsg == 1 /*WM_CREATE*/)
  {
    hDlg = hWnd;
    InitDlg();
  }

  else if (uMsg == 7 /*WM_SETFOCUS*/)
    oSys.Call("User32::SetFocus", oRun.hProc ? aDlg[IDRUNB].HWND : aDlg.Focus);

  else if (uMsg == 36 /*WM_GETMINMAXINFO*/)
  {
    AkelPad.MemCopy(_PtrAdd(lParam, 24), aDlg.MinW, 3 /*DT_DWORD*/); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(lParam, 28), aDlg.MinH, 3 /*DT_DWORD*/); //ptMinTrackSize_y
  }

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

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

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

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

  else if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if (wParam == 0x70 /*VK_F1*/)
      CommandList();
    else if (wParam == 0x73 /*VK_F4*/)
      oSys.Call("User32::ShowWindow", hDlg, oSys.Call("User32::IsZoomed", hDlg) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
    else if (wParam == 13 /*VK_RETURN*/)
    {
      nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
      if (sCmd && (nID >= IDCMDE) && (nID <= IDOUTE))
        PostMessage(hDlg, 273 /*WM_COMMAND*/, IDRUNB, aDlg[IDRUNB].HWND);
    }
  }

  else if (uMsg == 260 /*WM_SYSKEYDOWN*/)
  {
    if (wParam == 13 /*VK_RETURN*/)
      oSys.Call("User32::ShowWindow", hDlg, oSys.Call("User32::IsZoomed", hDlg) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
  }

  else if (uMsg == 123 /*WM_CONTEXTMENU*/)
  {
    if ((wParam == aDlg[IDCMDE].HWND) || (wParam == aDlg[IDDIRE].HWND) || (wParam == aDlg[IDOUTE].HWND))
      MenuEdit(wParam, LoWord(lParam), HiWord(lParam));
  }

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

    if ((nID >= IDCMDE) && (nID <= IDOUTE))
    {
      if (nCode == 0x0100 /*EN_SETFOCUS*/)
      {
        aDlg.Focus = lParam;
        PostMessage(lParam, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00000800 /*AECO_ACTIVELINE*/);
        PostMessage(aDlg[IDRUNB].HWND, 0xF4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
        for (i = IDCMDB; i <= IDSETB; ++i)
          PostMessage(aDlg[i].HWND, 0xF4 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
      }
      else if (nCode == 0x0200 /*EN_KILLFOCUS*/)
        PostMessage(lParam, 3228 /*AEM_SETOPTIONS*/, 3 /*AECOOP_AND*/, ~0x00000800 /*AECO_ACTIVELINE*/);
      else if (nCode == 0x0300 /*EN_CHANGE*/)
      {
        if (nID == IDCMDE)
        {
          sCmd = GetTextAE(lParam);
          EnableWindows();
        }
        else if (nID == IDDIRE)
          sDir = GetTextAE(lParam);
      }
    }

    else if (nID == IDRUNB)
    {
      if (oRun.hProc)
        StopCmd();
      else
        RunCmd();
    }

    else if (nID == IDCMDB)
      CommandList();

    else if (nID == IDFILB)
      Files();

    else if (nID == IDDIRB)
    {
      if (hMainWnd)
        MenuDirs();
      else
        BrowseDirs();
    }

    else if (nID == IDHISB)
      History();

    else if (nID == IDSETB)
      Settings();

    else if (nID == 2 /*IDCANCEL*/)
      PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16 /*WM_CLOSE*/)
  {
    if (oRun.hProc)
      return 1;
    else
    {
      WriteIni();
      oSys.Call("User32::DestroyWindow", hDlg);
    }
  }

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

  return 0;
}

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

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

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

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

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

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

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

  SetEditFont();
  EditColors(0, aColorDef);

  if (aColor.length < 7)
  {
    for (i = 0; i < 7; ++i)
      aColor[i] = aColorDef[i];
  }

  if (! bColorDef)
    EditColors(1, aColor);

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

  for (i = IDCMDE; i <= IDOUTE; ++i)
    SendMessage(aDlg[i].HWND, 3178 /*AEM_SETRECT*/, 0x03 /*AERC_MARGINS|AERC_UPDATE*/, lpRect);

  AkelPad.MemFree(lpRect);

  SendMessage(aDlg[IDCMDE].HWND, 1093 /*EM_SETEVENTMASK*/, 0, 0x1 /*ENM_CHANGE*/);
  SendMessage(aDlg[IDDIRE].HWND, 1093 /*EM_SETEVENTMASK*/, 0, 0x1 /*ENM_CHANGE*/);

  SendMessage(aDlg[IDCMDE].HWND, 197 /*EM_SETLIMITTEXT*/, 32767 /*command line string max length*/, 0);
  SendMessage(aDlg[IDDIRE].HWND, 197 /*EM_SETLIMITTEXT*/, 259 /*MAX_PATH - 1*/, 0);

  SendMessage(aDlg[IDCMDE].HWND, 3242 /*AEM_SETWORDWRAP*/, 2 /*AEWW_SYMBOL*/, 0);

  oSys.Call("User32::SetWindowTextW", aDlg[IDCMDE].HWND, sCmd);
  oSys.Call("User32::SetWindowTextW", aDlg[IDDIRE].HWND, sDir);

  if (AkelPad.GetSelStart() != AkelPad.GetSelEnd())
  {
    if (sText = AkelPad.GetSelText().replace(/^\s+|\s+$/g, ""))
      ReplaceTextAE(aDlg[IDCMDE].HWND, sText);
  }

  if (! hMainWnd)
  {
    SendMessage(hDlg, 0x0080 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);
    SendMessage(hDlg, 0x0080 /*WM_SETICON*/, 1 /*ICON_BIG*/,   hIconBig);
  }

  EnableWindows();
  aDlg.Focus = aDlg[IDCMDE].HWND;
}

function EnableWindows()
{
  var i;

  for (i = IDCMDE; i <= IDOUTE; ++i)
    oSys.Call("User32::EnableWindow", aDlg[i].HWND, (! oRun.hProc));

  oSys.Call("User32::EnableWindow", aDlg[IDRUNB].HWND, sCmd.length);
  oSys.Call("User32::EnableWindow", aDlg[IDCMDB].HWND, (! oRun.hProc));
  oSys.Call("User32::EnableWindow", aDlg[IDFILB].HWND, (! oRun.hProc));
  oSys.Call("User32::EnableWindow", aDlg[IDDIRB].HWND, (! oRun.hProc));
  oSys.Call("User32::EnableWindow", aDlg[IDHISB].HWND, (! oRun.hProc) && aHist.length);
  oSys.Call("User32::EnableWindow", aDlg[IDSETB].HWND, (! oRun.hProc));

  EditColors(1, bColorDef ? aColorDef : aColor);
}

function SetEditFont()
{
  var hFont = bFontDef ? hGuiFont : ConvertFontFormat(aFont, 3, 2);
  var i;

  for (i = IDCMDE; i <= IDOUTE; ++i)
  {
    SendMessage(aDlg[i].HWND, 48 /*WM_SETFONT*/, hFont, 1);
    oSys.Call("User32::InvalidateRect", aDlg[i].HWND, 0, true);
  }
}

function EditColors(bSet, aColor)
{
  var lpAECOLORS = AkelPad.MemAlloc(17 * 4);
  var i;

  AkelPad.MemCopy(lpAECOLORS, 0x000000FE /*AECLR_CARET|AECLR_BASICTEXT|AECLR_BASICBK|AECLR_SELTEXT|AECLR_SELBK|AECLR_ACTIVELINETEXT|AECLR_ACTIVELINEBK*/, 3 /*DT_DWORD*/);

  if (bSet)
  {
    for (i = 0; i < 7; ++i)
      AkelPad.MemCopy(_PtrAdd(lpAECOLORS, 4 + i * 4), aColor[i], 3 /*DT_DWORD*/);

    for (i = IDCMDE; i <= IDOUTE; ++i)
      SendMessage(aDlg[i].HWND, 3232 /*AEM_SETCOLORS*/, 0, lpAECOLORS);
  }
  else //get
  {
    SendMessage(aDlg[IDCMDE].HWND, 3231 /*AEM_GETCOLORS*/, 0, lpAECOLORS);

    for (i = 0; i < 7; ++i)
      aColor[i] = AkelPad.MemRead(_PtrAdd(lpAECOLORS, 4 + i * 4), 3 /*DT_DWORD*/);
  }

  AkelPad.MemFree(lpAECOLORS);
}

function GetTextAE(hWnd, bSel)
{
  AkelPad.SetEditWnd(hWnd);
  var sText = bSel ? AkelPad.GetSelText(): AkelPad.GetTextRange(0, -1);
  AkelPad.SetEditWnd(0);
  return sText;
}

function ReplaceTextAE(hWnd, sText)
{
  AkelPad.SetEditWnd(hWnd);
  AkelPad.SetSel(0, -1);
  AkelPad.ReplaceSel(sText);
  AkelPad.SetEditWnd(0);
}

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

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

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

  AkelPad.MemFree(lpRect);
}

function ResizeDlg(nW, nH)
{
  var nFlags = 0x14; //SWP_NOACTIVATE|SWP_NOZORDER
  var nW70   = Scale.X(70);
  var nW100  = Scale.X(100);
  var nH13   = Scale.Y(13);
  var nH16   = Scale.Y(16);
  var nH23   = Scale.Y(23);
  var nH60   = Scale.Y(60);
  var nY     = 10;
  var nBX    = Math.round((nW - (IDSETB - IDRUNB + 1) * nW70 - (IDSETB - IDRUNB) * 5) / 2);
  var i;

  oSys.Call("User32::SetWindowPos",
    aDlg[IDCMDS].HWND, 0,
    10,
    nY,
    nW100,
    nH13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDCMDE].HWND, 0,
    10,
    nY += nH13 + 2,
    nW - 20,
    nH60,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDDIRS].HWND, 0,
    10,
    nY += nH60 + 10,
    nW100,
    nH13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDDIRE].HWND, 0,
    10,
    nY += nH13 + 2,
    nW - 20,
    nH23,
    nFlags);
  nY += nH23 + 10;
  for (i = IDRUNB; i <= IDSETB; ++i)
    oSys.Call("User32::SetWindowPos",
      aDlg[i].HWND, 0,
      nBX + (i - IDRUNB) * (nW70 + 5),
      nY,
      nW70,
      nH23,
      nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDOUTS].HWND, 0,
    10,
    nY += nH23 + 5,
    nW100,
    nH13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDOUTE].HWND, 0,
    10,
    nY += nH13 + 2,
    nW - 20,
    nH - (nY + 2) - 10,
    nFlags);
  oSys.Call("user32::InvalidateRect", hDlg, 0, true);
}

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

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

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

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

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

function MenuEdit(hWnd, nX, nY)
{
  var MF_STRING    = 0x0000;
  var MF_GRAYED    = 0x0001;
  var MF_SEPARATOR = 0x0800;
  var bRO   = oSys.Call("User32::GetWindowLongW", hWnd, -16 /*GWL_STYLE*/) & 0x0800 /*ES_READONLY*/;
  var hMenu = oSys.Call("User32::CreatePopupMenu");
  var lpPoint;
  var nCmd;

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

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

  oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd,  198 /*EM_CANUNDO*/, 0, 0) ? MF_STRING : MF_GRAYED, 1, sMnuUndo + "\tCtrl+Z");
  oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 1109 /*EM_CANREDO*/, 0, 0) ? MF_STRING : MF_GRAYED, 2, sMnuRedo + "\tCtrl+Shift+Z");
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu, (! bRO) && SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED, 3, sMnuCut + "\tCtrl+X");
  oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED, 4, sMnuCopy + "\tCtrl+C");
  oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 1074 /*EM_CANPASTE*/, 0, 0) ? MF_STRING : MF_GRAYED, 5, sMnuPaste + "\tCtrl+V");
  oSys.Call("User32::AppendMenuW", hMenu, (! bRO) && SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED, 6, sMnuDelete + "\tDel");
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu, oSys.Call("User32::GetWindowTextLengthW", hWnd) ? MF_STRING : MF_GRAYED, 7, sMnuSelectAll + "\tCtrl+A");

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

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

  if (nCmd == 1)
    SendMessage(hWnd, 199 /*EM_UNDO*/, 0, 0);
  else if (nCmd == 2)
    SendMessage(hWnd, 1108 /*EM_REDO*/, 0, 0);
  else if (nCmd == 3)
    SendMessage(hWnd, 768 /*WM_CUT*/, 0, 0);
  else if (nCmd == 4)
    SendMessage(hWnd, 769 /*WM_COPY*/, 0, 0);
  else if (nCmd == 5)
    SendMessage(hWnd, 770 /*WM_PASTE*/, 0, 0);
  else if (nCmd == 6)
    SendMessage(hWnd, 771 /*WM_CLEAR*/, 0, 0);
  else if (nCmd == 7)
    SendMessage(hWnd, 177 /*EM_SETSEL*/, 0, -1);
}

function RunCmd()
{
  if (sDir && (! oFSO.FolderExists(sDir)))
  {
    oSys.Call("User32::SetWindowTextW", aDlg[IDOUTE].HWND, sTxtCantExec + "\n" + sTxtNoDir);
    return;
  }

  var hFocus        = oSys.Call("User32::GetFocus");
  var hCurProcess   = oSys.Call("Kernel32::GetCurrentProcess");
  var nBufSize      = 65536;
  var lpSA          = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(SECURITY_ATTRIBUTES)*/);
  var lpSI          = AkelPad.MemAlloc(_X64 ? 104 : 68 /*sizeof(STARTUPINFO)*/);
  var lpPI          = AkelPad.MemAlloc(_X64 ? 24 : 16 /*sizeof(PROCESS_INFORMATION)*/);
  var lpInpRead     = AkelPad.MemAlloc(_X64 ? 8 : 4);
  var lpInpWriteTmp = AkelPad.MemAlloc(_X64 ? 8 : 4);
  var lpInpWrite    = AkelPad.MemAlloc(_X64 ? 8 : 4);
  var lpOutReadTmp  = AkelPad.MemAlloc(_X64 ? 8 : 4);
  var lpOutRead     = AkelPad.MemAlloc(_X64 ? 8 : 4);
  var lpOutWrite    = AkelPad.MemAlloc(_X64 ? 8 : 4);
  var lpErrWrite    = AkelPad.MemAlloc(_X64 ? 8 : 4);
  var hInpRead;
  var hInpWriteTmp;
  var hInpWrite;
  var hOutReadTmp;
  var hOutRead;
  var hOutWrite;
  var hErrWrite;
  var lpDir;
  var lpBuffer;
  var lpBytesAvail;
  var lpBytesRead;
  var lpExitCode;
  var nBytesAvail;
  var lpMsg;

  AkelPad.MemCopy(_PtrAdd(lpSA, 0), _X64 ? 24 : 12, 3 /*DT_DWORD*/); //nLength
  AkelPad.MemCopy(_PtrAdd(lpSA, _X64 ? 16 : 8),  1, 3 /*DT_DWORD*/); //bInheritHandle

  oSys.Call("Kernel32::CreatePipe", lpInpRead,    lpInpWriteTmp, lpSA, nBufSize);
  oSys.Call("Kernel32::CreatePipe", lpOutReadTmp, lpOutWrite,    lpSA, nBufSize);
  hInpRead     = AkelPad.MemRead(lpInpRead,     2 /*DT_QWORD*/);
  hInpWriteTmp = AkelPad.MemRead(lpInpWriteTmp, 2 /*DT_QWORD*/);
  hOutReadTmp  = AkelPad.MemRead(lpOutReadTmp,  2 /*DT_QWORD*/);
  hOutWrite    = AkelPad.MemRead(lpOutWrite,    2 /*DT_QWORD*/);

  oSys.Call("Kernel32::DuplicateHandle", hCurProcess, hInpWriteTmp, hCurProcess, lpInpWrite, 0, 0 /*bInheritHandle*/, 2 /*DUPLICATE_SAME_ACCESS*/);
  oSys.Call("Kernel32::DuplicateHandle", hCurProcess, hOutReadTmp,  hCurProcess, lpOutRead,  0, 0 /*bInheritHandle*/, 2 /*DUPLICATE_SAME_ACCESS*/);
  oSys.Call("Kernel32::DuplicateHandle", hCurProcess, hOutWrite,    hCurProcess, lpErrWrite, 0, 1 /*bInheritHandle*/, 2 /*DUPLICATE_SAME_ACCESS*/);
  hInpWrite = AkelPad.MemRead(lpInpWrite, 2 /*DT_QWORD*/);
  hOutRead  = AkelPad.MemRead(lpOutRead,  2 /*DT_QWORD*/);
  hErrWrite = AkelPad.MemRead(lpErrWrite, 2 /*DT_QWORD*/);

  if (sDir)
  {
    lpDir = AkelPad.MemAlloc(260 * 2 /*sizeof(MAX_PATH)*/);
    AkelPad.MemCopy(lpDir, sDir, 1 /*DT_UNICODE*/);
  }

  AkelPad.MemCopy(_PtrAdd(lpSI, 0),         _X64 ? 104 : 68, 3 /*DT_DWORD*/); //cb=sizeof(STARTUPINFO)
  AkelPad.MemCopy(_PtrAdd(lpSI, _X64 ? 60 : 44), 0x00000101, 3 /*DT_DWORD*/); //dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW
  AkelPad.MemCopy(_PtrAdd(lpSI, _X64 ? 64 : 48),   bShowWnd, 4 /*DT_WORD*/ ); //wShowWindow
  AkelPad.MemCopy(_PtrAdd(lpSI, _X64 ? 80 : 56),   hInpRead, 2 /*DT_QWORD*/); //hStdInput
  AkelPad.MemCopy(_PtrAdd(lpSI, _X64 ? 88 : 60),  hOutWrite, 2 /*DT_QWORD*/); //hStdOutput
  AkelPad.MemCopy(_PtrAdd(lpSI, _X64 ? 96 : 64),  hErrWrite, 2 /*DT_QWORD*/); //hStdError

  if (oSys.Call("Kernel32::CreateProcessW", 0, sCmd, 0, 0, 1 /*bInheritHandles*/, 0x10 /*CREATE_NEW_CONSOLE*/, 0, lpDir, lpSI, lpPI) || oSys.Call("Kernel32::CreateProcessW", 0, "cmd /c " + sCmd, 0, 0, 1 /*bInheritHandles*/, 0x10 /*CREATE_NEW_CONSOLE*/, 0, lpDir, lpSI, lpPI))
  {
    oRun.hProc   = AkelPad.MemRead(_PtrAdd(lpPI, 0),             2 /*DT_QWORD*/);
    oRun.hThread = AkelPad.MemRead(_PtrAdd(lpPI, _X64 ?  8 : 4), 2 /*DT_QWORD*/);
    oRun.PID     = AkelPad.MemRead(_PtrAdd(lpPI, _X64 ? 16 : 8), 3 /*DT_DWORD*/);
    lpBuffer     = AkelPad.MemAlloc(nBufSize);
    lpBytesAvail = AkelPad.MemAlloc(4);
    lpBytesRead  = AkelPad.MemAlloc(4);
    lpExitCode   = AkelPad.MemAlloc(4);
    lpMsg        = AkelPad.MemAlloc(_X64 ? 48 : 28 /*sizeof(MSG)*/);

    oSys.Call("User32::SetWindowTextW", aDlg[IDRUNB].HWND, sTxtStop);
    oSys.Call("User32::SetWindowTextW", aDlg[IDOUTE].HWND, "");
    oSys.Call("User32::SetFocus", aDlg[IDRUNB].HWND);
    SendMessage(aDlg[IDRUNB].HWND, 0xF4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
    EnableWindows();

    oSys.Call("User32::WaitForInputIdle", oRun.hProc, 1000);
    oSys.Call("User32::SetForegroundWindow", hDlg);

    while (oSys.Call("Kernel32::PeekNamedPipe", hOutRead, 0, 0, 0, lpBytesAvail, 0) && oSys.Call("Kernel32::GetExitCodeProcess", oRun.hProc, lpExitCode))
    {
      while (oSys.Call("User32::PeekMessageW", lpMsg, hDlg, 0, 0, 0x1 /*PM_REMOVE*/))
      {
        if ((AkelPad.MemRead(_PtrAdd(lpMsg, _X64 ? 8 : 4) /*uMsg*/, 3 /*DT_DWORD*/) == 256 /*WM_KEYDOWN*/) && (AkelPad.MemRead(_PtrAdd(lpMsg, _X64 ? 16 : 8) /*wParam*/, 2 /*DT_QWORD*/) == 13 /*VK_RETURN*/))
          SendMessage(hDlg, 273 /*WM_COMMAND*/, IDRUNB, aDlg[IDRUNB].HWND);

        oSys.Call("User32::TranslateMessage", lpMsg);
        oSys.Call("User32::DispatchMessageW", lpMsg);
      }

      if (oRun.Stop)
      {
        SendMessage(aDlg[IDOUTE].HWND, 177 /*EM_SETSEL*/, -1, -1);
        SendMessage(aDlg[IDOUTE].HWND, 194 /*EM_REPLACESEL*/, 0, "...\n" + oRun.EndText);
        break;
      }
      else if (nBytesAvail = AkelPad.MemRead(lpBytesAvail, 3 /*DT_DWORD*/))
      {
        if (nBytesAvail >= nBufSize)
          nBytesAvail = nBufSize - 1;

        oSys.Call("Kernel32::ReadFile", hOutRead, lpBuffer, nBytesAvail, lpBytesRead, 0);
        AkelPad.MemCopy(_PtrAdd(lpBuffer, AkelPad.MemRead(lpBytesRead, 3 /*DT_DWORD*/)), 0, 5 /*DT_BYTE*/);
        oSys.Call("User32::OemToCharA", lpBuffer, lpBuffer);
        SendMessage(aDlg[IDOUTE].HWND, 177 /*EM_SETSEL*/, -1, -1);
        SendMessage(aDlg[IDOUTE].HWND, 2925 /*EM_REPLACESELA*/, 0, lpBuffer);
      }
      else if (AkelPad.MemRead(lpExitCode, 3 /*DT_DWORD*/) == 259 /*STILL_ACTIVE*/)
        WScript.Sleep(10);
      else
        break;
    }

    AkelPad.MemFree(lpBuffer);
    AkelPad.MemFree(lpBytesAvail);
    AkelPad.MemFree(lpBytesRead);
    AkelPad.MemFree(lpExitCode);
    AkelPad.MemFree(lpMsg);

    oSys.Call("Kernel32::CloseHandle", oRun.hProc);
    oSys.Call("Kernel32::CloseHandle", oRun.hThread);
    oRun.hProc   = 0;
    oRun.hThread = 0;
    oRun.PID     = 0;
    oRun.EndText = "";

    AddToHistory();
    EnableWindows();
    oSys.Call("User32::SetWindowTextW", aDlg[IDRUNB].HWND, sTxtRun);
    oSys.Call("User32::SetFocus", oRun.Stop ? hFocus : aDlg[IDOUTE].HWND);
    oRun.Stop = 0;
  }
  else
    oSys.Call("User32::SetWindowTextW", aDlg[IDOUTE].HWND, sTxtCantExec);

  AkelPad.MemFree(lpSA);
  AkelPad.MemFree(lpPI);
  AkelPad.MemFree(lpSI);
  AkelPad.MemFree(lpInpRead);
  AkelPad.MemFree(lpInpWriteTmp);
  AkelPad.MemFree(lpInpWrite);
  AkelPad.MemFree(lpOutReadTmp);
  AkelPad.MemFree(lpOutRead);
  AkelPad.MemFree(lpOutWrite);
  AkelPad.MemFree(lpErrWrite);
  AkelPad.MemFree(lpDir);

  oSys.Call("Kernel32::CloseHandle", hInpRead);
  oSys.Call("Kernel32::CloseHandle", hInpWriteTmp);
  oSys.Call("Kernel32::CloseHandle", hInpWrite);
  oSys.Call("Kernel32::CloseHandle", hOutReadTmp);
  oSys.Call("Kernel32::CloseHandle", hOutRead);
  oSys.Call("Kernel32::CloseHandle", hOutWrite);
  oSys.Call("Kernel32::CloseHandle", hErrWrite);
}

function StopCmd()
{
  var lpCallback;
  var lpPID;
  var lpExitCode;

  try
  {
    lpCallback = oSys.RegisterCallback(EnumWindowsProc);
  }
  catch (oError)
  {}

  //try to stop by send WM_CLOSE into process windows
  if (lpCallback)
  {
    lpPID = AkelPad.MemAlloc(4);
    oSys.Call("User32::EnumWindows", lpCallback, lpPID);
    oSys.UnregisterCallback(lpCallback);
    AkelPad.MemFree(lpPID);
  }

  //if process is still active, terminate it
  lpExitCode = AkelPad.MemAlloc(4);
  oSys.Call("Kernel32::GetExitCodeProcess", oRun.hProc, lpExitCode);

  if (AkelPad.MemRead(lpExitCode, 3 /*DT_DWORD*/) == 259 /*STILL_ACTIVE*/)
  {
    oSys.Call("Kernel32::TerminateProcess", oRun.hProc, 1);
    oRun.EndText = sTxtStopTermin;
  }
  else
    oRun.EndText = sTxtStopClose;

  AkelPad.MemFree(lpExitCode);

  oRun.Stop = 1;
}

function EnumWindowsProc(hWnd, lpPID)
{
  oSys.Call("User32::GetWindowThreadProcessId", hWnd, lpPID);

  if (AkelPad.MemRead(lpPID, 3 /*DT_DWORD*/) == oRun.PID)
  {
    SendMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
    WScript.Sleep(50);
  }

  return 1;
}

function AddToHistory()
{
  for (var i = 0; i < aHist.length; ++i)
  {
    if ((aHist[i][0].toUpperCase() == sCmd.toUpperCase()) && (aHist[i][1].toUpperCase() == sDir.toUpperCase()))
    {
      aHist.splice(i, 1);
      break;
    }
  }

  aHist.unshift([sCmd, sDir]);

  if (aHist.length > nHistMax)
    aHist.length = nHistMax;
}

function CommandList()
{
  // http://technet.microsoft.com/en-us/library/bb490890.aspx
  // http://ss64.com/nt/

  var oRect = {};
  var nStr  = 0x0000; //MF_STRING
  var nSep  = 0x0800; //MF_SEPARATOR
  var hMenu = oSys.Call("User32::CreatePopupMenu");
  var aMenu;
  var nCmd;
  var i;

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

  aMenu = [
    [nStr, "ARP",           "Address Resolution Protocol"],
    [nStr, "ASSOC",         "Change file extension associations *"],
    [nStr, "AT",            "Schedule a command to run at a specific time"],
    [nStr, "ATTRIB",        "Change file attributes"],
    [nSep],
    [nStr, "BCDBOOT",       "Create or repair a system partition (Win7)"],
    [nStr, "BCDEDIT",       "Manage Boot Configuration Data (Win7)"],
    [nStr, "BOOTCFG",       "Edit Windows boot settings"],
    [nSep],
    [nStr, "CACLS",         "Change file permissions"],
    [nStr, "CALL",          "Call one batch program from another *"],
    [nStr, "CD",            "Change Directory (CHDIR) *"],
    [nStr, "CHKDSK",        "Check Disk - check and repair disk problems"],
    [nStr, "CHKNTFS",       "Check the NTFS file system"],
    [nStr, "CIPHER",        "Encrypt or Decrypt files/folders"],
    [nStr, "CLIP",          "Copy STDIN to the Windows clipboard (Win7)"],
    [nStr, "CMD",           "Start a new CMD shell"],
    [nStr, "CMDKEY",        "Manage stored usernames/passwords (Win7)"],
    [nStr, "COLOR",         "Change colors of the CMD window *"],
    [nStr, "COMP",          "Compare the contents of two files or sets of files"],
    [nStr, "COMPACT",       "Compress files or folders on an NTFS partition"],
    [nStr, "CONVERT",       "Convert a FAT drive to NTFS"],
    [nStr, "COPY",          "Copy one or more files to another location *"],
    [nSep],
    [nStr, "DATE",          "Display or set the date *"],
    [nStr, "DEFRAG",        "Defragment hard drive"],
    [nStr, "DEL",           "Delete one or more files (ERASE) *"],
    [nStr, "DIR",           "Display a list of files and folders *"],
    [nStr, "DISKPART",      "Disk Administration"],
    [nStr, "DRIVERQUERY",   "Display installed device drivers"],
    [nSep],
    [nStr, "ECHO",          "Display message on screen *"],
    [nStr, "ENDLOCAL",      "End localisation of environment changes in a batch file *"],
    [nStr, "ERASE",         "Delete one or more files (DEL) *"],
    [nStr, "EVENTCREATE",   "Add a message to the Windows event log"],
    [nStr, "EVENTTRIGGERS", "Displays and configures event triggers on local or remote machines"],
    [nStr, "EXIT",          "Quit the current script/routine and set an errorlevel *"],
    [nStr, "EXPAND",        "Uncompress CAB files"],
    [nSep],
    [nStr, "FC",            "Compare two files"],
    [nStr, "FIND",          "Search for a text string in a file"],
    [nStr, "FINDSTR",       "Search for strings in files"],
    [nStr, "FOR",           "Loop command: all options Files, Directory, List *"],
    [nStr, "FORFILES",      "Batch process multiple files (Win7)"],
    [nStr, "FORMAT",        "Format a disk"],
    [nStr, "FSUTIL",        "File and Volume utilities"],
    [nStr, "FTYPE",         "File extension file type associations *"],
    [nSep],
    [nStr, "GETMAC",        "Display the Media Access Control (MAC) address"],
    [nStr, "GOTO",          "Direct a batch program to jump to a labelled line *"],
    [nStr, "GPRESULT",      "Display Resultant Set of Policy information"],
    [nStr, "GPUPDATE",      "Update Group Policy settings"],
    [nStr, "GRAFTABL",      "Enables the ability to display an extended character set in graphics mode"],
    [nSep],
    [nStr, "HELP",          "Online Help"],
    [nStr, "HOSTNAME",      "Display the host name of the computer"],
    [nSep],
    [nStr, "ICACLS",        "Change file and folder permissions (Win7)"],
    [nStr, "IF",            "Conditionally perform a command *"],
    [nStr, "IPCONFIG",      "Configure IP"],
    [nSep],
    [nStr, "LABEL",         "Edit a disk label"],
    [nStr, "LOGMAN",        "Manage Performance Monitor logs"],
    [nStr, "LOGOFF",        "Log a user off"],
    [nSep],
    [nStr, "MAKECAB",       "Create .CAB files"],
    [nStr, "MD",            "Create new folders (MKDIR) *"],
    [nStr, "MKLINK",        "Create a symbolic link (linkd, Win7) *"],
    [nStr, "MODE",          "Configure a system device COM/LPT/CON"],
    [nStr, "MORE",          "Display output, one screen at a time"],
    [nStr, "MOUNTVOL",      "Manage a volume mount point"],
    [nStr, "MOVE",          "Move files from one folder to another *"],
    [nStr, "MSG",           "Send a message"],
    [nSep],
    [nStr, "NET",           "Manage network resources"],
    [nStr, "NETSH",         "Configure Network Interfaces, Windows Firewall and Remote access"],
    [nStr, "NETSTAT",       "Display networking statistics TCP/IP"],
    [nStr, "NLTEST",        "Network Location Test (Win7)"],
    [nStr, "NSLOOKUP",      "Name server lookup"],
    [nSep],
    [nStr, "OPENFILES",     "Query or display open files"],
    [nSep],
    [nStr, "PATH",          "Display or set a search path for executable files *"],
    [nStr, "PATHPING",      "Trace route plus network latency and packet loss"],
    [nStr, "PAUSE",         "Suspend processing of a batch file and display a message *"],
    [nStr, "PING",          "Test a network connection"],
    [nStr, "POPD",          "Return to a previous directory saved by PUSHD *"],
    [nStr, "POWERCFG",      "Configure power settings (Win7)"],
    [nStr, "PRINT",         "Print a text file"],
    [nStr, "PROMPT",        "Change the command prompt *"],
    [nStr, "PUSHD",         "Save and then change the current directory *"],
    [nSep],
    [nStr, "QPROCESS",      "Display processes (QUERY PROCESS)"],
    [nStr, "QWINSTA",       "Display all sessions (QUERY SESSION)"],
    [nStr, "QAPPSRV",       "List all servers (QUERY TERMSERVER)"],
    [nSep],
    [nStr, "RECOVER",       "Recover a damaged file from a defective disk"],
    [nStr, "REG",           "Registry: Read, Set, Export, Delete keys and values"],
    [nStr, "REGINI",        "Change Registry Permissions (Win7)"],
    [nStr, "REM",           "Record comments (remarks) in a batch file *"],
    [nStr, "REN",           "Rename a file or files (RENAME) *"],
    [nStr, "REPLACE",       "Replace or update one file with another"],
    [nStr, "RWINSTA",       "Delete a Remote Desktop Session (RESET SESSION)"],
    [nStr, "RD",            "Delete folders (RMDIR) *"],
    [nStr, "ROBOCOPY",      "Robust File and Folder Copy (Win7)"],
    [nStr, "ROUTE",         "Manipulate network routing tables"],
    [nSep],
    [nStr, "SET",           "Display, set, or remove session environment variables *"],
    [nStr, "SETLOCAL",      "Control the visibility of environment variables *"],
    [nStr, "SFC",           "System File Checker"],
    [nStr, "SHIFT",         "Shift the position of batch file parameters *"],
    [nStr, "SHUTDOWN",      "Shutdown the computer"],
    [nStr, "SORT",          "Sort input"],
    [nStr, "START",         "Start a program, command or batch file *"],
    [nStr, "SUBST",         "Associate a path with a drive letter"],
    [nStr, "SYSTEMINFO",    "List system configuration"],
    [nSep],
    [nStr, "TAKEOWN",       "Take ownership of a file (Win7)"],
    [nStr, "TASKLIST",      "List running applications and services"],
    [nStr, "TASKKILL",      "End a running process"],
    [nStr, "TIME",          "Display or set the system time *"],
    [nStr, "TIMEOUT",       "Delay processing of a batch file (Win7)"],
    [nStr, "TITLE",         "Set the window title for a CMD.EXE session *"],
    [nStr, "TRACERT",       "Trace route to a remote host"],
    [nStr, "TREE",          "Graphical display of folder structure"],
    [nStr, "TSDISCON",      "Disconnect a Remote Desktop Session"],
    [nStr, "TSKILL",        "End a running process"],
    [nStr, "TSSHUTDN",      "Remotely shut down or reboot a terminal server"],
    [nStr, "TYPE",          "Display the contents of a text file *"],
    [nSep],
    [nStr, "VER",           "Display version information *"],
    [nStr, "VERIFY",        "Verify that files have been saved *"],
    [nStr, "VOL",           "Display a disk label *"],
    [nSep],
    [nStr, "WAITFOR",       "Wait for or send a signal (Win7)"],
    [nStr, "WEVTUTIL",      "Clear event logs, enable/disable/query logs (Win7)"],
    [nStr, "WHOAMI",        "Output the current UserName and domain (Win7)"],
    [nStr, "WMIC",          "Windows Management Instrumentation Commands"],
    [nSep],
    [nStr, "XCOPY",         "Copy files and folders"]];

  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, 0x0188 /*TPM_NONOTIFY|TPM_RETURNCMD|TPM_TOPALIGN|TPM_RIGHTALIGN*/, oRect.X + oRect.W, oRect.Y + oRect.H, 0, hDlg, 0);

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

  if (nCmd)
  {
    ReplaceTextAE(aDlg[IDCMDE].HWND, aMenu[nCmd - 1][1] + " /?");
    aDlg.Focus = aDlg[IDCMDE].HWND;
  }

  PostMessage(hDlg, 7 /*WM_SETFOCUS*/, 0, 0);
}

function Files()
{
  var oRect    = {};
  var sFilter  = sTxtExeFiles + " (*.exe)\0*.exe\0" + sTxtAllFiles + " (*.*)\0*.*\0\0";
  var sTitle   = sTxtFiles.replace("&", "");
  var lpFilter = AkelPad.MemAlloc(sFilter.length * 2 + 2);
  var lpFile   = AkelPad.MemAlloc(260 * 2);
  var lpTitle  = AkelPad.MemAlloc(sTitle.length * 2 + 2);
  var lpOFN    = AkelPad.MemAlloc(_X64 ? 152 : 88 /*sizeof(OPENFILENAME)*/);
  var nFlags   = 0x02080824 /*OFN_DONTADDTORECENT|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_ENABLEHOOK|OFN_HIDEREADONLY*/;
  var hWndOwn;

  //to set position OpenFile dialog box
  GetWindowPos(aDlg[IDCMDE].HWND, oRect);
  hWndOwn = oSys.Call("User32::CreateWindowExW", 0, "STATIC", 0, 0x80000000 /*WS_POPUP*/, oRect.X, oRect.Y + oRect.H + 3, 0, 0, hDlg, 0, hInstDLL, 0);

  AkelPad.MemCopy(lpFilter, sFilter,   1 /*DT_UNICODE*/);
  AkelPad.MemCopy(lpFile,   sLastFile, 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(lpTitle,  sTitle,    1 /*DT_UNICODE*/);

  AkelPad.MemCopy(_PtrAdd(lpOFN, 0),        _X64 ? 152 : 88, 3 /*DT_DWORD*/); //lStructSize
  AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?   8 :  4),  hWndOwn, 2 /*DT_QWORD*/); //hwndOwner
  AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  24 : 12), lpFilter, 2 /*DT_QWORD*/); //lpstrFilter
  AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  44 : 24),        1, 3 /*DT_DWORD*/); //nFilterIndex
  AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  48 : 28),   lpFile, 2 /*DT_QWORD*/); //lpstrFile
  AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  56 : 32),      260, 3 /*DT_DWORD*/); //nMaxFile
  AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  88 : 48),  lpTitle, 2 /*DT_QWORD*/); //lpstrTitle
  AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  96 : 52),   nFlags, 3 /*DT_DWORD*/); //Flags
  AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ? 148 : 84),        1, 3 /*DT_DWORD*/); //FlagsEx=OFN_EX_NOPLACESBAR

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

  if (oSys.Call("Comdlg32::GetOpenFileNameW", lpOFN))
  {
    sLastFile = AkelPad.MemRead(lpFile, 1 /*DT_UNICODE*/);
    ReplaceTextAE(aDlg[IDCMDE].HWND, sLastFile);
    aDlg.Focus = aDlg[IDCMDE].HWND;
  }

  AkelPad.MemFree(lpFilter);
  AkelPad.MemFree(lpFile);
  AkelPad.MemFree(lpTitle);
  AkelPad.MemFree(lpOFN);

  oSys.Call("User32::EnableWindow", hMainWnd, 1);
  oSys.Call("User32::EnableWindow", hDlg, 1);
  oSys.Call("User32::DestroyWindow", hWndOwn);
  oSys.Call("User32::SetFocus", aDlg[IDDIRB].HWND);
  PostMessage(hDlg, 7 /*WM_SETFOCUS*/, 0, 0);
}

function MenuDirs()
{
  var MF_STRING = 0x0000;
  var MF_GRAYED = 0x0001;
  var MF_POPUP  = 0x0010;
  var aDir   = [];
  var oRect  = {};
  var hMenu  = oSys.Call("User32::CreatePopupMenu");
  var hMenu1 = oSys.Call("User32::CreatePopupMenu");
  var nTabs;
  var lpFile;
  var sFile;
  var nCmd;
  var i;

  if (AkelPad.IsMDI())
  {
    nTabs = AkelPad.SendMessage(hMainWnd, 1291 /*AKD_FRAMESTATS*/, 0 /*FWS_COUNTALL*/, 0);

    for (i = 0; i < nTabs; ++i)
    {
      lpFile = SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 32 /*FI_FILEW*/, SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 8 /*FWF_BYTABINDEX*/, i));

      if (sFile = AkelPad.MemRead(lpFile, 1 /*DT_UNICODE*/))
        aDir.push([AkelPad.GetFilePath(sFile, 2 /*CPF_FILENAME*/), AkelPad.GetFilePath(sFile, 1 /*CPF_DIR*/)]);
    }
  }
  else
  {
    if (sFile = AkelPad.GetEditFile(0))
      aDir.push([AkelPad.GetFilePath(sFile, 2 /*CPF_FILENAME*/), AkelPad.GetFilePath(sFile, 1 /*CPF_DIR*/)]);
  }

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

  oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, 1, sTxtBrowse);
  oSys.Call("User32::AppendMenuW", hMenu, aDir.length ? MF_POPUP : MF_GRAYED, hMenu1, "&AkelPad");

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

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

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

  if (nCmd == 0)
    PostMessage(hDlg, 7 /*WM_SETFOCUS*/, 0, 0);
  else if (nCmd == 1)
    BrowseDirs();
  else
  {
    ReplaceTextAE(aDlg[IDDIRE].HWND, aDir[nCmd - 2][1]);
    aDlg.Focus = aDlg[IDDIRE].HWND;
    PostMessage(hDlg, 7 /*WM_SETFOCUS*/, 0, 0);
  }
}

function BrowseDirs()
{
  try
  {
    oSys.RegisterCallback(BFFCallback);
  }
  catch (oError)
  {
    AkelPad.MessageBox(hDlg, sTxtNoCallback, sTxtDlgTitle, 0x10 /*MB_ICONERROR*/);
    return;
  }

  var lpDir    = AkelPad.MemAlloc(260 * 2 /*sizeof(MAX_PATH)*/);
  var lpBrowse = AkelPad.MemAlloc(_X64 ? 64 : 32 /*sizeof(BROWSEINFO)*/);
  var lpIDL;

  if (sDir)
    AkelPad.MemCopy(lpDir, sDir, 1 /*DT_UNICODE*/);
  else
    oSys.Call("Kernel32::GetCurrentDirectoryW", 260, lpDir);

  AkelPad.MemCopy(_PtrAdd(lpBrowse, 0),                     hDlg, 2 /*DT_QWORD*/); //hWndOwner
  AkelPad.MemCopy(_PtrAdd(lpBrowse, _X64 ? 16 :  8),       lpDir, 2 /*DT_QWORD*/); //pszDisplayName
  AkelPad.MemCopy(_PtrAdd(lpBrowse, _X64 ? 32 : 16),  0x00000041, 3 /*DT_DWORD*/); //ulFlags=BIF_NEWDIALOGSTYLE|BIF_RETURNONLYFSDIRS
  AkelPad.MemCopy(_PtrAdd(lpBrowse, _X64 ? 40 : 20), BFFCallback, 2 /*DT_QWORD*/); //lpfn
  AkelPad.MemCopy(_PtrAdd(lpBrowse, _X64 ? 48 : 24),       lpDir, 2 /*DT_QWORD*/); //lParam

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

  if (lpIDL = oSys.Call("Shell32::SHBrowseForFolderW", lpBrowse))
  {
    oSys.Call("Shell32::SHGetPathFromIDListW", lpIDL, lpDir);
    oSys.Call("Ole32::CoTaskMemFree", lpIDL);

    ReplaceTextAE(aDlg[IDDIRE].HWND, AkelPad.MemRead(lpDir, 1 /*DT_UNICODE*/));
    aDlg.Focus = aDlg[IDDIRE].HWND;
  }

  AkelPad.MemFree(lpDir);
  AkelPad.MemFree(lpBrowse);

  oSys.UnregisterCallback(BFFCallback);
  oSys.Call("User32::EnableWindow", hMainWnd, 1);
  oSys.Call("User32::SetFocus", aDlg[IDDIRB].HWND);
  PostMessage(hDlg, 7 /*WM_SETFOCUS*/, 0, 0);
}

function BFFCallback(hWnd, uMsg, lParam, lpData)
{
  if (uMsg == 1 /*BFFM_INITIALIZED*/)
  {
    var oRect = {};
    var hWndNS;
    var hWndTV;

    oSys.Call("User32::SetWindowTextW", hWnd, sTxtDirs.replace("&", ""));
    SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);
    SendMessage(hWnd, 0x0467 /*BFFM_SETSELECTIONW*/, 1, lpData);

    //set focus to TreeView
    if (hWndNS = oSys.Call("User32::FindWindowExW", hWnd, 0, "SHBrowseForFolder ShellNameSpace Control", 0))
    {
      if (hWndTV = oSys.Call("User32::FindWindowExW", hWndNS, 0, "SysTreeView32", 0))
      {
        WScript.Sleep(50);
        PostMessage(hWnd, 0x0028 /*WM_NEXTDLGCTL*/, hWndTV, 1);
        PostMessage(hWndTV, 0x1114 /*TVM_ENSUREVISIBLE*/, 0, SendMessage(hWndTV, 0x110A /*TVM_GETNEXTITEM*/, 0x0009 /*TVGN_CARET*/, 0));
      }
    }

    GetWindowPos(aDlg[IDDIRE].HWND, oRect);
    oSys.Call("User32::SetWindowPos", hWnd, 0, oRect.X, oRect.Y + oRect.H + 3, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
  }

  return 0;
}



Last edited by KDJ on Sat Aug 06, 2016 12:10 pm; edited 11 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1915
Location: Poland

PostPosted: Tue Dec 23, 2014 11:28 pm    Post subject: Reply with quote

RunCommand_part2.js

Code:
function History()
{
  var sCurCmd = sCmd;
  var sCurDir = sDir;
  var oRect   = {};
  var nBW     = Scale.X(70);
  var nBH     = Scale.Y(23);
  var nW, nH;

  var IDHISTLB  = 2000;
  var IDDELETEB = 2001;
  var IDCLEARB  = 2002;
  var IDOKB     = 2003;
  var IDCANCELB = 2004;
  var aWnd      = [];

  GetWindowPos(aDlg[IDDIRE].HWND, oRect);
  aWnd.T = sTxtHistory.replace("&", "");
  aWnd.X = oRect.X;
  aWnd.Y = oRect.Y + oRect.H + 3;
  aWnd.W = oRect.W;
  aWnd.H = Scale.Y(300);
  nW     = aWnd.W - oSys.Call("User32::GetSystemMetrics", 7 /*SM_CXFIXEDFRAME*/) * 2;
  nH     = aWnd.H - oSys.Call("User32::GetSystemMetrics", 4 /*SM_CYCAPTION*/) - oSys.Call("User32::GetSystemMetrics", 8 /*SM_CYFIXEDFRAME*/);

  aWnd[IDHISTLB]  = {X: 5, Y: 5, W: nW - 10, H: nH - nBH - 15, C: "LISTBOX", S: 0x50A10101 /*WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_BORDER|WS_TABSTOP|LBS_NOINTEGRALHEIGHT|LBS_NOTIFY*/};
  aWnd[IDDELETEB] = {X: Math.round((nW - nBW * 4 - 15) / 2), Y: nH - nBH - 5, W: nBW, H: nBH, T: sTxtDelete, C: "BUTTON", S: 0x50000000 /*WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON*/};
  aWnd[IDCLEARB]  = {X: aWnd[IDDELETEB].X + nBW + 5, Y: aWnd[IDDELETEB].Y, W: nBW, H: nBH, T: sTxtClear, C: "BUTTON", S: 0x50000000 /*WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON*/};
  aWnd[IDOKB]     = {X: aWnd[IDCLEARB].X + nBW + 5, Y: aWnd[IDDELETEB].Y, W: nBW, H: nBH, T: sTxtOK, C: "BUTTON", S: 0x50000001 /*WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON*/};
  aWnd[IDCANCELB] = {X: aWnd[IDOKB].X + nBW + 5, Y: aWnd[IDDELETEB].Y, W: nBW, H: nBH, T: sTxtCancel, C: "BUTTON", S: 0x50000000 /*WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON*/};

  oSys.Call("User32::CreateWindowExW",
    0,             //dwExStyle
    sClass,        //lpClassName
    aWnd.T,        //lpWindowName
    0x90C80000,    //dwStyle=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU
    aWnd.X,        //x
    aWnd.Y,        //y
    aWnd.W,        //nWidth
    aWnd.H,        //nHeight
    hDlg,          //hWndParent
    0,             //hMenu
    hInstDLL,      //hInstance
    HistCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.

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

  function HistCallback(hWnd, uMsg, wParam, lParam)
  {
    var nID, nCode, nPos, i;

    if (uMsg == 1 /*WM_CREATE*/)
    {
      for (i = IDHISTLB; i < aWnd.length; ++i)
      {
        aWnd[i].HWND = oSys.Call("User32::CreateWindowExW",
          0,         //dwExStyle
          aWnd[i].C, //lpClassName
          aWnd[i].T, //lpWindowName
          aWnd[i].S, //dwStyle
          aWnd[i].X, //x
          aWnd[i].Y, //y
          aWnd[i].W, //nWidth
          aWnd[i].H, //nHeight
          hWnd,      //hWndParent
          i,         //ID
          hInstDLL,  //hInstance
          0);        //lpParam
        SendMessage(aWnd[i].HWND, 48 /*WM_SETFONT*/, hGuiFont, 1);
      }

      if (! hMainWnd)
        SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);

      SendMessage(aWnd[IDHISTLB].HWND, 0x0180 /*LB_ADDSTRING*/, 0, "");
      for (i = 0; i < aHist.length; ++i)
        SendMessage(aWnd[IDHISTLB].HWND, 0x0180 /*LB_ADDSTRING*/, 0, aHist[i][0].substr(0, 1024));
      SendMessage(aWnd[IDHISTLB].HWND, 0x0186 /*LB_SETCURSEL*/, 0, 0);
      PostMessage(hWnd, 273 /*WM_COMMAND*/, MkLong(IDHISTLB, 1 /*LBN_SELCHANGE*/), aWnd[IDHISTLB].HWND);

      aWnd.Focus = aWnd[IDHISTLB].HWND;
    }

    else if (uMsg == 6 /*WM_ACTIVATE*/)
    {
      if (wParam == 0 /*WA_INACTIVE*/)
        aWnd.Focus = oSys.Call("User32::GetFocus");
    }

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

    else if (uMsg == 256 /*WM_KEYDOWN*/)
    {
      if (wParam == 0x02E /*VK_DELETE*/)
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDDELETEB, aWnd[IDDELETEB].HWND);
      else if (wParam == 13 /*VK_RETURN*/)
      {
        if (oSys.Call("User32::GetFocus") == aWnd[IDHISTLB].HWND)
          PostMessage(hWnd, 16 /*WM_CLOSE*/, 1, 0);
      }
    }

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

      if (nID == IDHISTLB)
      {
        if (nCode == 1 /*LBN_SELCHANGE*/)
        {
          nPos = SendMessage(aWnd[IDHISTLB].HWND, 0x0188 /*LB_GETCURSEL*/, 0, 0);
          if (nPos == 0)
          {
            if (aHist.length)
            {
              ReplaceTextAE(aDlg[IDCMDE].HWND, sCurCmd);
              ReplaceTextAE(aDlg[IDDIRE].HWND, sCurDir);
            }
            else
              PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
          }
          else if (nPos > 0)
          {
            ReplaceTextAE(aDlg[IDCMDE].HWND, aHist[nPos - 1][0]);
            ReplaceTextAE(aDlg[IDDIRE].HWND, aHist[nPos - 1][1]);
          }
          oSys.Call("User32::EnableWindow", aWnd[IDDELETEB].HWND, (nPos > 0));
        }
        else if (nCode == 2 /*LBN_DBLCLK*/)
          PostMessage(hWnd, 16 /*WM_CLOSE*/, 1, 0);
        else if (nCode == 4 /*LBN_SETFOCUS*/)
          PostMessage(aWnd[IDOKB].HWND, 0xF4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
      }

      else if (nID == IDDELETEB)
      {
        oSys.Call("User32::SetFocus", aWnd[IDHISTLB].HWND);

        nPos = SendMessage(aWnd[IDHISTLB].HWND, 0x0188 /*LB_GETCURSEL*/, 0, 0);

        if (nPos > 0)
        {
          aHist.splice(nPos - 1, 1);
          SendMessage(aWnd[IDHISTLB].HWND, 0x0182 /*LB_DELETESTRING*/, nPos, 0);

          if (nPos > aHist.length) --nPos;
          SendMessage(aWnd[IDHISTLB].HWND, 0x0186 /*LB_SETCURSEL*/, nPos, 0);
          PostMessage(hWnd, 273 /*WM_COMMAND*/, MkLong(IDHISTLB, 1 /*LBN_SELCHANGE*/), aWnd[IDHISTLB].HWND);
        }
      }

      else if (nID == IDCLEARB)
      {
        aHist.length = 0;
        PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
      }

      else if (nID == IDOKB)
        PostMessage(hWnd, 16 /*WM_CLOSE*/, 1, 0);

      else if ((nID == IDCANCELB) || (nID == 2 /*IDCANCEL*/))
        PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }

    else if (uMsg == 16 /*WM_CLOSE*/)
    {
      if (wParam)
        aDlg.Focus = aDlg[IDCMDE].HWND;
      else
      {
        ReplaceTextAE(aDlg[IDCMDE].HWND, sCurCmd);
        ReplaceTextAE(aDlg[IDDIRE].HWND, sCurDir);
      }

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

    return 0;
  }
}

function Settings()
{
  var bFontDef1  = bFontDef;
  var bColorDef1 = bColorDef;
  var aFont1     = [aFont[0], aFont[1], aFont[2]];
  var aColor1    = [aColor[0], aColor[1], aColor[2], aColor[3], aColor[4], aColor[5], aColor[6]];

  var oRect = {};
  var nW21  = Scale.X(21);
  var nW50  = Scale.X(50);
  var nW70  = Scale.X(70);
  var nW100 = Scale.X(100);
  var nW220 = Scale.X(220);
  var nH13  = Scale.Y(13);
  var nH16  = Scale.Y(16);
  var nH21  = Scale.Y(21);
  var nH23  = Scale.Y(23);

  var IDSHOWB     = 2000;
  var IDHISTE     = 2001;
  var IDHISTUD    = 2002;
  var IDHISTS     = 2003;
  var IDEDITGB    = 2004;
  var IDFONTGB    = 2005;
  var IDFONTDEFB  = 2006;
  var IDFONTB     = 2007;
  var IDCOLORGB   = 2008;
  var IDCOLORDEFB = 2009;
  var IDTCOLOR1B  = 2010;
  var IDBCOLOR1B  = 2011;
  var IDCOLOR1S   = 2012;
  var IDTCOLOR2B  = 2013;
  var IDBCOLOR2B  = 2014;
  var IDCOLOR2S   = 2015;
  var IDTCOLOR3B  = 2016;
  var IDBCOLOR3B  = 2017;
  var IDCOLOR3S   = 2018;
  var IDCOLOR4B   = 2019;
  var IDCOLOR4S   = 2020;
  var IDOKB       = 2021;
  var IDCANCELB   = 2022;
  var aWnd        = [];

  aWnd[IDSHOWB]     = {X: 10, Y: 10, W: nW220, H: nH16, T: sTxtShowWnd, C: "BUTTON", S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
  aWnd[IDHISTE]     = {X: 10, Y: aWnd[IDSHOWB].Y + aWnd[IDSHOWB].H + 10, W: nW50, H: nH21, C: "EDIT", S: 0x50012000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_NUMBER*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
  aWnd[IDHISTUD]    = {C: "msctls_updown32", S: 0x50000026 /*WS_CHILD|WS_VISIBLE|UDS_ALIGNRIGHT|UDS_ARROWKEYS|UDS_SETBUDDYINT*/};
  aWnd[IDHISTS]     = {X: aWnd[IDHISTE].X + aWnd[IDHISTE].W + 5, Y: aWnd[IDHISTE].Y + 4, W: nW100, H: nH13, T: sTxtHistLen, C: "STATIC", S: 0x50000000 /*WS_CHILD|WS_VISIBLE*/};
  aWnd[IDEDITGB]    = {X: 10, Y: aWnd[IDHISTE].Y + aWnd[IDHISTE].H + 10, W: nW220, H: nH16 * 2 + nH23 + nH21 * 4 + 115, T: sTxtEditWnds, C: "BUTTON", S: 0x50000007 /*WS_CHILD|WS_VISIBLE|BS_GROUPBOX*/};
  aWnd[IDFONTGB]    = {X: 20, Y: aWnd[IDEDITGB].Y + 20, W: nW220 - 20, H: nH16 + nH23 + 30, T: sTxtFont, C: "BUTTON", S: 0x50000307 /*WS_CHILD|WS_VISIBLE|BS_CENTER|BS_GROUPBOX*/};
  aWnd[IDFONTDEFB]  = {X: 30, Y: aWnd[IDFONTGB].Y + 15, W: nW100, H: nH16, T: sTxtDefFont, C: "BUTTON", S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
  aWnd[IDFONTB]     = {X: 30, Y: aWnd[IDFONTDEFB].Y + aWnd[IDFONTDEFB].H + 5, W: nW220 - 40, H: nH23, C: "BUTTON", S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON*/};
  aWnd[IDCOLORGB]   = {X: 20, Y: aWnd[IDFONTGB].Y + aWnd[IDFONTGB].H + 10, W: nW220 - 20, H: nH16 + nH21 * 4 + 45, T: sTxtColors, C: "BUTTON", S: 0x50000307 /*WS_CHILD|WS_VISIBLE|BS_CENTER|BS_GROUPBOX*/};
  aWnd[IDCOLORDEFB] = {X: 30, Y: aWnd[IDCOLORGB].Y + 15, W: nW100, H: nH16, T: sTxtDefColors, C: "BUTTON", S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
  aWnd[IDTCOLOR1B]  = {X: 60, Y: aWnd[IDCOLORDEFB].Y + aWnd[IDCOLORDEFB].H + 5, W: nW21, H: nH21, C: "BUTTON", S: 0x5081000B /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|BS_OWNERDRAW*/};
  aWnd[IDBCOLOR1B]  = {X: aWnd[IDTCOLOR1B].X + aWnd[IDTCOLOR1B].W + 5, Y: aWnd[IDTCOLOR1B].Y, W: nW21, H: nH21, C: "BUTTON", S: 0x5081000B /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|BS_OWNERDRAW*/};
  aWnd[IDCOLOR1S]   = {X: aWnd[IDBCOLOR1B].X + aWnd[IDBCOLOR1B].W + 5, Y: aWnd[IDBCOLOR1B].Y + 4, W: nW100, H: nH13, T: sTxtBasic, C: "STATIC", S: 0x50000000 /*WS_CHILD|WS_VISIBLE*/};
  aWnd[IDTCOLOR2B]  = {X: aWnd[IDTCOLOR1B].X, Y: aWnd[IDTCOLOR1B].Y + aWnd[IDTCOLOR1B].H + 5, W: nW21, H: nH21, C: "BUTTON", S: 0x5081000B /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|BS_OWNERDRAW*/};
  aWnd[IDBCOLOR2B]  = {X: aWnd[IDBCOLOR1B].X, Y: aWnd[IDTCOLOR2B].Y, W: nW21, H: nH21, C: "BUTTON", S: 0x5081000B /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|BS_OWNERDRAW*/};
  aWnd[IDCOLOR2S]   = {X: aWnd[IDCOLOR1S].X, Y: aWnd[IDBCOLOR2B].Y + 4, W: nW100, H: nH13, T: sTxtSelection, C: "STATIC", S: 0x50000000 /*WS_CHILD|WS_VISIBLE*/};
  aWnd[IDTCOLOR3B]  = {X: aWnd[IDTCOLOR1B].X, Y: aWnd[IDTCOLOR2B].Y + aWnd[IDTCOLOR2B].H + 5, W: nW21, H: nH21, C: "BUTTON", S: 0x5081000B /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|BS_OWNERDRAW*/};
  aWnd[IDBCOLOR3B]  = {X: aWnd[IDBCOLOR2B].X, Y: aWnd[IDTCOLOR3B].Y, W: nW21, H: nH21, C: "BUTTON", S: 0x5081000B /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|BS_OWNERDRAW*/};
  aWnd[IDCOLOR3S]   = {X: aWnd[IDCOLOR2S].X, Y: aWnd[IDBCOLOR3B].Y + 4, W: nW100, H: nH13, T: sTxtCurLine, C: "STATIC", S: 0x50000000 /*WS_CHILD|WS_VISIBLE*/};
  aWnd[IDCOLOR4B]   = {X: aWnd[IDTCOLOR1B].X, Y: aWnd[IDTCOLOR3B].Y + aWnd[IDTCOLOR3B].H + 5, W: nW21, H: nH21, C: "BUTTON", S: 0x5081000B /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|BS_OWNERDRAW*/};
  aWnd[IDCOLOR4S]   = {X: aWnd[IDCOLOR3S].X, Y: aWnd[IDCOLOR4B].Y + 4, W: nW100, H: nH13, T: sTxtCaret, C: "STATIC", S: 0x50000000 /*WS_CHILD|WS_VISIBLE*/};
  aWnd[IDOKB]       = {X: 10 + nW220 - nW70 * 2 - 5, Y: aWnd[IDEDITGB].Y + aWnd[IDEDITGB].H + 10, W: nW70, H: nH23, T: sTxtOK, C: "BUTTON", S: 0x50010001 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_DEFPUSHBUTTON*/};
  aWnd[IDCANCELB]   = {X: aWnd[IDOKB].X + aWnd[IDOKB].W + 5, Y: aWnd[IDOKB].Y, W: nW70, H: nH23, T: sTxtCancel, C: "BUTTON", S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON*/};

  GetWindowPos(hDlg, oRect);
  aWnd.W = nW220 + 20 + oSys.Call("User32::GetSystemMetrics", 7 /*SM_CXFIXEDFRAME*/) * 2;
  aWnd.H = aWnd[IDOKB].Y + aWnd[IDOKB].H + 10 + oSys.Call("User32::GetSystemMetrics", 4 /*SM_CYCAPTION*/) + oSys.Call("User32::GetSystemMetrics", 8 /*SM_CYFIXEDFRAME*/);
  aWnd.X = oRect.X + (oRect.W - aWnd.W) / 2;
  aWnd.Y = oRect.Y + (oRect.H - aWnd.H) / 2;
  aWnd.T = sTxtSettings.replace("&", "");

  oSys.Call("User32::CreateWindowExW",
    0,            //dwExStyle
    sClass,       //lpClassName
    aWnd.T,       //lpWindowName
    0x90C80000,   //dwStyle=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU
    aWnd.X,       //x
    aWnd.Y,       //y
    aWnd.W,       //nWidth
    aWnd.H,       //nHeight
    hDlg,         //hWndParent
    0,            //hMenu
    hInstDLL,     //hInstance
    SetCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.

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

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

    if (uMsg == 1 /*WM_CREATE*/)
    {
      for (i = IDSHOWB; i < aWnd.length; ++i)
      {
        aWnd[i].HWND = oSys.Call("User32::CreateWindowExW",
          aWnd[i].ES, //dwExStyle
          aWnd[i].C,  //lpClassName
          aWnd[i].T,  //lpWindowName
          aWnd[i].S,  //dwStyle
          aWnd[i].X,  //x
          aWnd[i].Y,  //y
          aWnd[i].W,  //nWidth
          aWnd[i].H,  //nHeight
          hWnd,       //hWndParent
          i,          //ID
          hInstDLL,   //hInstance
          0);         //lpParam
        SendMessage(aWnd[i].HWND, 48 /*WM_SETFONT*/, hGuiFont, 1);
      }

      if (! hMainWnd)
        SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);

      SendMessage(aWnd[IDHISTUD].HWND, 1129 /*UDM_SETBUDDY*/, aWnd[IDHISTE].HWND, 0);
      SendMessage(aWnd[IDHISTUD].HWND, 1135 /*UDM_SETRANGE32*/, 0, 100);
      SendMessage(aWnd[IDHISTUD].HWND, 1137 /*UDM_SETPOS32*/, 0, nHistMax);
      SendMessage(aWnd[IDSHOWB].HWND,     241 /*BM_SETCHECK*/, bShowWnd, 0);
      SendMessage(aWnd[IDFONTDEFB].HWND,  241 /*BM_SETCHECK*/, bFontDef, 0);
      SendMessage(aWnd[IDCOLORDEFB].HWND, 241 /*BM_SETCHECK*/, bColorDef, 0);

      PostMessage(hWnd, 273 /*WM_COMMAND*/, IDFONTDEFB, aWnd[IDFONTDEFB].HWND);
      PostMessage(hWnd, 273 /*WM_COMMAND*/, IDCOLORDEFB, aWnd[IDCOLORDEFB].HWND);

      aWnd.Focus = aWnd[IDSHOWB].HWND;
    }

    else if (uMsg == 6 /*WM_ACTIVATE*/)
    {
      if (wParam == 0 /*WA_INACTIVE*/)
        aWnd.Focus = oSys.Call("User32::GetFocus");
    }

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

    else if (uMsg == 43 /*WM_DRAWITEM*/)
    {
      if ((wParam == IDTCOLOR1B) || (wParam == IDBCOLOR1B) || (wParam == IDTCOLOR2B) || (wParam == IDBCOLOR2B) || (wParam == IDTCOLOR3B) || (wParam == IDBCOLOR3B) || (wParam == IDCOLOR4B))
      {
        DrawColorButton(wParam, lParam);
        return 1;
      }
    }

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

      if (wParam == 9 /*VK_TAB*/)
      {
        if ((nID != IDFONTB) && (nID != IDCANCELB))
          SendMessage(aWnd[IDOKB].HWND, 0xF4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
      }
      else if (wParam == 13 /*VK_RETURN*/)
      {
        if ((nID != IDFONTB) && (nID != IDOKB) && (nID != IDCANCELB))
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDOKB, aWnd[IDOKB].HWND);
      }
    }

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

      if ((nID == IDSHOWB) || (nID == IDHISTE))
        SendMessage(aWnd[IDOKB].HWND, 0xF4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);

      else if (nID == IDFONTDEFB)
      {
        bFontDef = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
        SetEditFont();
        oSys.Call("User32::SetWindowTextW", aWnd[IDFONTB].HWND, bFontDef ? ConvertFontFormat(hGuiFont, 2, 3).toString() : aFont.toString());
        oSys.Call("User32::EnableWindow", aWnd[IDFONTB].HWND, ! bFontDef);
        SendMessage(aWnd[IDOKB].HWND, 0xF4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
      }

      else if (nID == IDFONTB)
      {
        ChooseFont(hWnd, aWnd[IDFONTB].HWND);
        SetEditFont();
        oSys.Call("User32::SetWindowTextW", aWnd[IDFONTB].HWND, aFont.toString());
      }

      else if (nID == IDCOLORDEFB)
      {
        bColorDef = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
        EditColors(1, bColorDef ? aColorDef : aColor);
        oSys.Call("User32::EnableWindow", aWnd[IDTCOLOR1B].HWND, ! bColorDef);
        oSys.Call("User32::EnableWindow", aWnd[IDBCOLOR1B].HWND, ! bColorDef);
        oSys.Call("User32::EnableWindow", aWnd[IDTCOLOR2B].HWND, ! bColorDef);
        oSys.Call("User32::EnableWindow", aWnd[IDBCOLOR2B].HWND, ! bColorDef);
        oSys.Call("User32::EnableWindow", aWnd[IDTCOLOR3B].HWND, ! bColorDef);
        oSys.Call("User32::EnableWindow", aWnd[IDBCOLOR3B].HWND, ! bColorDef);
        oSys.Call("User32::EnableWindow", aWnd[IDCOLOR4B].HWND,  ! bColorDef);
        SendMessage(aWnd[IDOKB].HWND, 0xF4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
      }

      else if ((nID == IDTCOLOR1B) || (nID == IDBCOLOR1B) || (nID == IDTCOLOR2B) || (nID == IDBCOLOR2B) || (nID == IDTCOLOR3B) || (nID == IDBCOLOR3B) || (nID == IDCOLOR4B))
      {
        ChooseColor(hWnd, nID);
        EditColors(1, bColorDef ? aColorDef : aColor);
        SendMessage(aWnd[IDOKB].HWND, 0xF4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
      }

      else if (nID == IDOKB)
      {
        bShowWnd = SendMessage(aWnd[IDSHOWB].HWND, 240 /*BM_GETCHECK*/, 0, 0);

        if (! HiWord(SendMessage(aWnd[IDHISTUD].HWND, 1128 /*UDM_GETPOS*/, 0, 0)))
        {
          nHistMax = LoWord(SendMessage(aWnd[IDHISTUD].HWND, 1128 /*UDM_GETPOS*/, 0, 0));
          if (aHist.length > nHistMax)
            aHist.length = nHistMax;
        }

        PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 1);
      }

      else if ((nID == IDCANCELB) || (nID == 2 /*IDCANCEL*/))
        PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }

    else if (uMsg == 16 /*WM_CLOSE*/)
    {
      if (! lParam)
      {
        bFontDef  = bFontDef1;
        bColorDef = bColorDef1;

        for (i = 0; i < aFont.length; ++i)
          aFont[i] = aFont1[i];
        for (i = 0; i < aColor.length; ++i)
          aColor[i] = aColor1[i];
      }

      SetEditFont();
      EnableWindows();

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

    return 0;
  }

  function DrawColorButton(nID, lpDRAWITEMSTRUCT)
  {
    var hDC    = AkelPad.MemRead(_PtrAdd(lpDRAWITEMSTRUCT, _X64 ? 32 : 24), 2 /*DT_QWORD*/);
    var lpRect = _PtrAdd(lpDRAWITEMSTRUCT, _X64 ? 40 : 28);
    var nCI    = GetColorIndex(nID);
    var nRGB   = SendMessage(aWnd[IDCOLORDEFB].HWND, 240 /*BM_GETCHECK*/, 0, 0) ? aColorDef[nCI] : aColor[nCI];
    var hBrush = oSys.Call("Gdi32::CreateSolidBrush", nRGB);

    oSys.Call("User32::FillRect", hDC, lpRect, hBrush);
    if (oSys.Call("User32::GetFocus") == aWnd[nID].HWND)
      oSys.Call("User32::DrawFocusRect", hDC, lpRect);

    oSys.Call("Gdi32::DeleteObject", hBrush);
  }

  function GetColorIndex(nID)
  {
    var i;

    if (nID == IDTCOLOR1B)
      i = 1;
    else if (nID == IDBCOLOR1B)
      i = 2;
    else if (nID == IDTCOLOR2B)
      i = 3;
    else if (nID == IDBCOLOR2B)
      i = 4;
    else if (nID == IDTCOLOR3B)
      i = 5;
    else if (nID == IDBCOLOR3B)
      i = 6;
    else if (nID == IDCOLOR4B)
      i = 0;

    return i;
  }

  function ChooseColor(hWndOwn, nID)
  {
    var nChoCoSize = _X64 ? 72 : 36 /*sizeof(CHOOSECOLOR)*/;
    var lpChoCo    = AkelPad.MemAlloc(nChoCoSize);
    var lpCusCo    = AkelPad.MemAlloc(16 * 4 /*sizeof(COLORREF)*/);
    var nCI        = GetColorIndex(nID);

    AkelPad.MemCopy(_PtrAdd(lpChoCo, 0),              nChoCoSize,  3 /*DT_DWORD*/); //lStructSize
    AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ?  8 :  4), hWndOwn,     2 /*DT_QWORD*/); //hWndOwner
    AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ? 24 : 12), aColor[nCI], 3 /*DT_DWORD*/); //rgbResult
    AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ? 32 : 16), lpCusCo,     2 /*DT_QWORD*/); //lpCustColors
    AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ? 40 : 20), 0x103,       3 /*DT_DWORD*/); //Flags=CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT

    if (oSys.Call("Comdlg32::ChooseColorW", lpChoCo))
    {
      aColor[nCI] = AkelPad.MemRead(_PtrAdd(lpChoCo, _X64 ? 24 : 12), 3 /*DT_DWORD*/);
      oSys.Call("User32::InvalidateRect", aWnd[nID].HWND, 0, true);
    }

    AkelPad.MemFree(lpChoCo);
    AkelPad.MemFree(lpCusCo);
  }
}

function ChooseFont(hWndOwn, hWndPos)
{
  var hMenu = oSys.Call("User32::CreatePopupMenu");
  var oRect = {};
  var nCmd;

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

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

  if (! nCmd)
    return;

  try
  {
    oSys.RegisterCallback(CFCallback);
  }
  catch (oError)
  {
    AkelPad.MessageBox(hWndOwn, sTxtNoCallback, sTxtDlgTitle, 0x10 /*MB_ICONERROR*/);
    return;
  }

  var nCFSize = _X64 ? 104 : 60 /*sizeof(CHOOSEFONTW)*/;
  var lpCF    = AkelPad.MemAlloc(nCFSize);
  var lpLF    = ConvertFontFormat(aFont, 3, 1);
  var nFlags  = 0x00010049 /*CF_ENABLEHOOK|CF_FORCEFONTEXIST|CF_INITTOLOGFONTSTRUCT|CF_SCREENFONTS*/ | ((nCmd == 1) ? 0x00004000 /*CF_FIXEDPITCHONLY*/ : 0);

  AkelPad.MemCopy(_PtrAdd(lpCF, 0),                 nCFSize, 3 /*DT_DWORD*/); //lStructSize
  AkelPad.MemCopy(_PtrAdd(lpCF, _X64 ?  8 :  4),    hWndOwn, 2 /*DT_QWORD*/); //hwndOwner
  AkelPad.MemCopy(_PtrAdd(lpCF, _X64 ? 24 : 12),       lpLF, 2 /*DT_QWORD*/); //lpLogFont
  AkelPad.MemCopy(_PtrAdd(lpCF, _X64 ? 36 : 20),     nFlags, 3 /*DT_DWORD*/); //Flags
  AkelPad.MemCopy(_PtrAdd(lpCF, _X64 ? 48 : 28),    hWndPos, 2 /*DT_QWORD*/); //lCustData
  AkelPad.MemCopy(_PtrAdd(lpCF, _X64 ? 56 : 32), CFCallback, 2 /*DT_QWORD*/); //lpfnHook

  if (oSys.Call("Comdlg32::ChooseFontW", lpCF))
    aFont = ConvertFontFormat(lpLF, 1, 3);

  oSys.UnregisterCallback(CFCallback);
  AkelPad.MemFree(lpCF);
  AkelPad.MemFree(lpLF);
}

function CFCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    var oRectWnd = {};
    var oRectPos = {};

    SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);
    SendMessage(hWnd, 12 /*WM_SETTEXT*/, 0, (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 36 : 20), 3 /*DT_DWORD*/) & 0x00004000 /*CF_FIXEDPITCHONLY*/) ? sTxtMonoFonts : sTxtAllFonts);

    GetWindowPos(hWnd, oRectWnd);
    GetWindowPos(AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 48 : 28), 2 /*DT_QWORD*/), oRectPos);
    oRectWnd.X = oRectPos.X + (oRectPos.W - oRectWnd.W) / 2;
    oRectWnd.Y = oRectPos.Y + oRectPos.H;

    oSys.Call("User32::MoveWindow", hWnd, oRectWnd.X, oRectWnd.Y, oRectWnd.W, oRectWnd.H, 0);
  }

  return 0;
}

function ConvertFontFormat(vFont, nInType, nRetType)
{
  var nLFSize = 28 + 32 * 2 /*sizeof(LOGFONTW)*/;
  var lpLF    = AkelPad.MemAlloc(nLFSize);
  var hFont;
  var hDC;
  var nHeight;
  var nWeight;
  var bItalic;
  var vRetVal;
  var i;

  if (nInType == 1)
  {
    for (i = 0; i < nLFSize; ++i)
      AkelPad.MemCopy(_PtrAdd(lpLF, i), AkelPad.MemRead(_PtrAdd(vFont, i), 5 /*DT_BYTE*/), 5 /*DT_BYTE*/);
  }
  else if (nInType == 2)
  {
    if (! vFont)
      vFont = oSys.Call("Gdi32::GetStockObject", 13 /*SYSTEM_FONT*/);

    oSys.Call("Gdi32::GetObjectW", vFont, nLFSize, lpLF);
  }
  else if (nInType == 3)
  {
    hDC     = oSys.Call("User32::GetDC", hMainWnd);
    nHeight = -oSys.Call("Kernel32::MulDiv", vFont[2], oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/), 72);
    oSys.Call("User32::ReleaseDC", hMainWnd, hDC);

    nWeight = 400;
    bItalic = 0;
    if ((vFont[1] == 2) || (vFont[1] == 4))
      nWeight = 700;
    if (vFont[1] > 2)
      bItalic = 1;

    AkelPad.MemCopy(_PtrAdd(lpLF,  0), nHeight,  3 /*DT_DWORD*/);   //lfHeight
    AkelPad.MemCopy(_PtrAdd(lpLF, 16), nWeight,  3 /*DT_DWORD*/);   //lfWeight
    AkelPad.MemCopy(_PtrAdd(lpLF, 20), bItalic,  5 /*DT_BYTE*/);    //lfItalic
    AkelPad.MemCopy(_PtrAdd(lpLF, 28), vFont[0], 1 /*DT_UNICODE*/); //lfFaceName
  }

  if (nRetType == 1)
    vRetVal = lpLF;
  else if (nRetType == 2)
  {
    vRetVal = oSys.Call("Gdi32::CreateFontIndirectW", lpLF);
    AkelPad.MemFree(lpLF);
  }
  else if (nRetType == 3)
  {
    vRetVal    = [];
    vRetVal[0] = AkelPad.MemRead(_PtrAdd(lpLF, 28), 1 /*DT_UNICODE*/);

    if (AkelPad.MemRead(_PtrAdd(lpLF, 16), 3 /*DT_DWORD*/) < 600)
      vRetVal[1] = 1;
    else
      vRetVal[1] = 2;

    if (AkelPad.MemRead(_PtrAdd(lpLF, 20), 5 /*DT_BYTE*/))
      vRetVal[1] += 2;

    hDC        = oSys.Call("User32::GetDC", hMainWnd);
    vRetVal[2] = -oSys.Call("Kernel32::MulDiv", AkelPad.MemRead(lpLF, 3 /*DT_DWORD*/), 72, oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/));
    oSys.Call("User32::ReleaseDC", hMainWnd, hDC);
    AkelPad.MemFree(lpLF);
  }

  return vRetVal;
}

function ReadIni()
{
  var sFile = WScript.ScriptFullName.replace(/js$/i, "ini");
  var oFile;

  if (oFSO.FileExists(sFile))
  {
    oFile = oFSO.OpenTextFile(sFile, 1, false, -1);

    try
    {
      eval(oFile.ReadAll());
    }
    catch (oError)
    {}

    oFile.Close();
  }

  aDlg.W = Math.max(Scale.X(aDlg.W), aDlg.MinW);
  aDlg.H = Math.max(Scale.Y(aDlg.H), aDlg.MinH);

  if (! aFont)
    aFont = ConvertFontFormat(hGuiFont, 2, 3);
}

function WriteIni()
{
  var oFile = oFSO.OpenTextFile(WScript.ScriptFullName.replace(/js$/i, "ini"), 2, true, -1);
  var sText = "";
  var i;

  sText +=
    'aDlg.X='     + aDlg.X + ';\r\n' +
    'aDlg.Y='     + aDlg.Y + ';\r\n' +
    'aDlg.W='     + Scale.UX(aDlg.W) + ';\r\n' +
    'aDlg.H='     + Scale.UY(aDlg.H) + ';\r\n' +
    'aDlg.Max='   + oSys.Call("User32::IsZoomed", hDlg) + ';\r\n' +
    'sCmd="'      + EscapeStr(sCmd) + '";\r\n' +
    'sDir="'      + EscapeStr(sDir) + '";\r\n' +
    'sLastFile="' + EscapeStr(sLastFile) + '";\r\n' +
    'bShowWnd='   + bShowWnd + ';\r\n' +
    'bFontDef='   + bFontDef + ';\r\n' +
    'aFont=["'    + EscapeStr(aFont[0]) + '",' + aFont[1] + ',' + aFont[2] + '];\r\n' +
    'bColorDef='  + bColorDef + ';\r\n' +
    'aColor=['    + aColor.toString() + '];\r\n' +
    'nHistMax='   + nHistMax + ';\r\n' +
    'aHist=[';

  for (i = 0; i < aHist.length; ++i)
    sText +=
      '["' +
      EscapeStr(aHist[i][0]) + '","' +
      EscapeStr(aHist[i][1]) + '"]' +
      ((i == aHist.length - 1) ? '' : ',');

  sText += '];';

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

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

function GetLangStrings()
{
  if ((hMainWnd && (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1045)) || ((! hMainWnd) && (oSys.Call("Kernel32::GetUserDefaultLangID") == 1045))) //Polish
  {
    sTxtDlgTitle   = "Uruchom polecenie";
    sTxtCommand    = "Polecenie:";
    sTxtWorkDir    = "Katalog roboczy:";
    sTxtOutput     = "Wyjście:";
    sTxtRun        = "Uruchom";
    sTxtStop       = "Zatrzymaj";
    sTxtFiles      = "&Pliki";
    sTxtDirs       = "&Katalogi";
    sTxtBrowse     = "&Przeglądaj";
    sTxtHistory    = "&Historia";
    sTxtSettings   = "U&stawienia";
    sTxtCantExec   = "Nie można uruchomić polecenia.";
    sTxtNoDir      = "Katalog nie istnieje.";
    sTxtStopClose  = "Zatrzymano przez zamknięcie okna procesu.";
    sTxtStopTermin = "Zatrzymano przez przerwanie procesu.";
    sTxtNoCallback = "Nie można zarejestrować funkcji zwrotnej.";
    sTxtExeFiles   = "Pliki wykonywalne";
    sTxtAllFiles   = "Wszystkie pliki";
    sTxtDelete     = "&Usuń";
    sTxtClear      = "&Wyczyść";
    sTxtShowWnd    = "Pokaż okno uruchomionego polecenia";
    sTxtHistLen    = "Długość historii";
    sTxtEditWnds   = "Okna edycyjne";
    sTxtFont       = "Czcionka";
    sTxtDefFont    = "Domyślna";
    sTxtMonoFonts  = "Czcionki o stałej szerokości";
    sTxtAllFonts   = "Wszystkie czcionki";
    sTxtColors     = "Kolory";
    sTxtDefColors  = "Domyślne";
    sTxtBasic      = "Podstawowy";
    sTxtSelection  = "Zaznaczenie";
    sTxtCurLine    = "Bieżący wiersz";
    sTxtCaret      = "Kursor";
    sTxtOK         = "OK";
    sTxtCancel     = "Anuluj";
    //edit context menu
    sMnuUndo      = '&Cofnij';
    sMnuRedo      = '&Powtórz';
    sMnuCut       = '&Wytnij';
    sMnuCopy      = '&Kopiuj';
    sMnuPaste     = 'Wkl&ej';
    sMnuDelete    = '&Usuń';
    sMnuSelectAll = 'Zaznacz w&szystko';
  }
//  else if ((hMainWnd && (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049)) || ((! hMainWnd) && (oSys.Call("Kernel32::GetUserDefaultLangID") == 1049))) //Russian
//  {
//  }
  else
  {
    sTxtDlgTitle   = "Run command";
    sTxtCommand    = "Command:";
    sTxtWorkDir    = "Working directory:";
    sTxtOutput     = "Output:";
    sTxtRun        = "Run";
    sTxtStop       = "Stop";
    sTxtFiles      = "&Files";
    sTxtDirs       = "&Directories";
    sTxtBrowse     = "&Browse";
    sTxtHistory    = "&History";
    sTxtSettings   = "&Settings";
    sTxtCantExec   = "Can not execute command.";
    sTxtNoDir      = "Directory does not exists.";
    sTxtStopClose  = "Stopped by closing the window of process.";
    sTxtStopTermin = "Stopped by process termination.";
    sTxtNoCallback = "Unable to register callback function.";
    sTxtExeFiles   = "Executable files";
    sTxtAllFiles   = "All files";
    sTxtDelete     = "&Delete";
    sTxtClear      = "&Clear";
    sTxtShowWnd    = "Show window of running command";
    sTxtHistLen    = "History length";
    sTxtEditWnds   = "Edit windows";
    sTxtFont       = "Font";
    sTxtDefFont    = "Default";
    sTxtMonoFonts  = "Monospace fonts";
    sTxtAllFonts   = "All fonts";
    sTxtColors     = "Colors";
    sTxtDefColors  = "Default";
    sTxtBasic      = "Basic";
    sTxtSelection  = "Selection";
    sTxtCurLine    = "Current line";
    sTxtCaret      = "Caret";
    sTxtOK         = "OK";
    sTxtCancel     = "Cancel";
    //edit context menu
    sMnuUndo      = '&Undo';
    sMnuRedo      = '&Redo';
    sMnuCut       = 'C&ut';
    sMnuCopy      = '&Copy';
    sMnuPaste     = '&Paste';
    sMnuDelete    = '&Delete';
    sMnuSelectAll = 'Select &all';
  }
}



Last edited by KDJ on Mon Jul 06, 2015 6:32 pm; edited 7 times in total
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 6223

PostPosted: Sun Dec 28, 2014 7:59 pm    Post subject: Reply with quote

Align text in one line or column selection.

ColumnAlign.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27218#27218
// Version: 1.0
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Align text in one line or column selection.
// Description(1049): Выравнивание текста в однострочном или вертикальном выделении.
//
// Arguments:
// C    -Center align.
// L    -Left align.
// R    -Right align.
//
// Usage:
// Call("Scripts::Main", 1, "ColumnAlign.js", "R")

//Arguments
var pAlign="";
if (WScript.Arguments.length >= 1)
  pAlign=WScript.Arguments(0).toUpperCase();

var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oFunction=AkelPad.SystemFunction();
var pSelText;
var pLinesArray;
var nIndex;
var pLineText;
var pLineSpaces;
var nHalfSpaces;

if (hWndEdit)
{
  if (AkelPad.SendMessage(hWndEdit, 3125 /*AEM_GETSEL*/, 0, 0))
  {
    if ((AkelPad.SendMessage(hWndEdit, 3129 /*AEM_GETLINENUMBER*/, 1 /*AEGL_FIRSTSELLINE*/, 0) ==
         AkelPad.SendMessage(hWndEdit, 3129 /*AEM_GETLINENUMBER*/, 2 /*AEGL_LASTSELLINE*/, 0)) ||
         AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0))
    {
      if (!pAlign)
      {
        var aItems=[];

        //Include
        if (!AkelPad.Include("ShowMenu.js")) WScript.Quit();

        //Show menu
        for (nItem=0; nItem <= 2; ++nItem)
          aItems[nItem]=[GetLangString(nItem), MF_NORMAL, nItem];

        if ((nItem=ShowMenu(aItems, POS_CURSOR, POS_CURSOR)) != -1)
        {
          if (nItem == 0)
            pAlign="C";
          else if (nItem == 1)
            pAlign="L";
          else if (nItem == 2)
            pAlign="R";
        }
        if (!pAlign) WScript.Quit();
      }
      pSelText=AkelPad.GetSelText();

      if (pLinesArray=pSelText.split("\r"))
      {
        for (nIndex=0; nIndex < pLinesArray.length; ++nIndex)
        {
          pLinesArray[nIndex].match(/^([ \t]*)(.*?)([ \t]*)$/);
          pLineText=RegExp.$2;
          pLineSpaces=RegExp.$1 + RegExp.$3;

          if (pLineText.length)
          {
            nHalfSpaces=parseInt(pLineSpaces.length / 2);

            if (pAlign == "L")
              pLinesArray[nIndex]=pLineText + pLineSpaces;
            else if (pAlign == "R")
              pLinesArray[nIndex]=pLineSpaces + pLineText;
            else if (pAlign == "C")
              pLinesArray[nIndex]=pLineSpaces.substr(0, nHalfSpaces) + pLineText + pLineSpaces.substr(nHalfSpaces, pLineSpaces.length - nHalfSpaces);
          }
        }
        pSelText=pLinesArray.join("\r");

        AkelPad.ReplaceSel(pSelText, true);
      }
    }
    else AkelPad.MessageBox(hMainWnd, GetLangString(4), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
  }
  else AkelPad.MessageBox(hMainWnd, GetLangString(3), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}


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

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u041F\u043E\u0020\u0446\u0435\u043D\u0442\u0440\u0443";
    if (nStringID == 1)
      return "\u041F\u043E\u0020\u043B\u0435\u0432\u043E\u043C\u0443\u0020\u043A\u0440\u0430\u044E";
    if (nStringID == 2)
      return "\u041F\u043E\u0020\u043F\u0440\u0430\u0432\u043E\u043C\u0443\u0020\u043A\u0440\u0430\u044E";
    if (nStringID == 3)
      return "\u041E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0020\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439\u0020\u0442\u0435\u043A\u0441\u0442\u002E";
    if (nStringID == 4)
      return "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F\u0020\u043E\u0434\u043D\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u043E\u0435\u0020\u0438\u043B\u0438\u0020\u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435\u0020\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u002E";
  }
  else
  {
    if (nStringID == 0)
      return "Center align";
    if (nStringID == 1)
      return "Left align";
    if (nStringID == 2)
      return "Right align";
    if (nStringID == 3)
      return "No text selected.";
    if (nStringID == 4)
      return "Required one line or column selection.";
  }
  return "";
}

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



Joined: 06 Mar 2010
Posts: 1915
Location: Poland

PostPosted: Wed Jan 21, 2015 7:10 pm    Post subject: Reply with quote

Interface language files for FindReplaceFiles.js

FindReplaceFiles_1033.lng

Code:
/************************************
FindReplaceFiles.js - ver. 2016-02-13
Interface language
Language:      English (1033)
Translated by: KDJ
*************************************/
sTxtDlgTitle    = "Find/Replace files";
sTxtDir         = "&Directory";
sTxtCurrent     = "C&urrent";
sTxtBrowse      = "&Browse...";
sTxtSubDirs     = "Subdirectories &level:";
sTxtAll         = "All";
sTxtFileName    = "File:Stream &names";
sTxtRegExp      = "Regular e&xpressions";
sTxtNotName     = "Not matching names";
sTxtFiles       = "Files (main streams)";
sTxtStreams     = "Alternate NTFS streams";
sTxtTextInFile  = "&Text in file/stream";
sTxtMatchCase   = "Match &case";
sTxtMultiline   = "&Multiline";
sTxtNotContain  = "Not contain text";
sTxtSkipBinary  = "Skip binary files";
sTxtSkipLarger  = "Skip larger [B]:";
sTxtReplaceWith = "Replace &with:";
sTxtSkipFiles   = "Skip files";
sTxtReadOnly    = "Read-only";
sTxtHidden      = "Hidden";
sTxtSystem      = "System";
sTxtInResults   = "In results";
sTxtSearch      = "&Search";
sTxtReplace     = "&Replace";
sTxtHistory     = "&History";
sTxtEdit        = "&Edit";
sTxtCopyList    = "Copy list";
sTxtClearList   = "Clear list";
sTxtSettings    = "Settings";
sTxtClose       = "Close";
sTxtFilesFound  = "Files found";
sTxtFilesRepl   = "Files replaced";
sTxtNoFiles     = "<no files>";
sTxtByteSymbol  = "B";
sTxtNTFSStream  = "NTFS stream";
sTxtWait        = "Wait...";
sTxtChooseDir   = "Choose directory:";
sTxtPathShow    = "Show full path in file list";
sTxtSeparateWnd = "Run in separate window";
sTxtKeepHist    = "Keep history on exit";
sTxtKeepFiles   = "Keep file list";
sTxtDirNoExist  = "Directory does not exists.";
sTxtFileNoExist = "Files does not exists.";
sTxtErrorRE     = "Error in regular expression.";
sTxtWantReplace = "Do you want to replace contents of files?\n\nWarning: this operation can not be undone.";
sTxtDocModified = "Document was modified. Do you want to save it?";
sHlpAnyChar     = "any single character";
sHlpAnyString   = "any string of characters";
sHlpSemicolQuot = "semicolon must be in double quotes";
sHlpListSepar   = "list separator (semicolon)";
sHlpStreamSepar = "File:Stream separator (colon)";
sHlpAnyChar_NL  = "any character, except \\n";
sHlpDigit       = "digit [0-9]";
sHlpNonDigit    = "non-digit [^0-9]";
sHlpWhiteSp     = "whitespace [ \\f\\n\\r\\t\\v]";
sHlpNonWhiteSp  = "non-whitespace";
sHlpWordChar    = "word character [A-Za-z0-9_]";
sHlpNonWordChar = "non-word character";
sHlpNULL        = "NULL character";
sHlpFF          = "form feed \\x0C";
sHlpNL          = "new line \\x0A";
sHlpCR          = "carriage return \\x0D";
sHlpTab         = "tab \\x09";
sHlpVTab        = "vertical tab \\x0B";
sHlpCharHex     = "character hex code FF";
sHlpUniCharHex  = "Unicode char hex code 00FF";
sHlpBegin       = "beginning of string/line";
sHlpEnd         = "end of string/line";
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";
sHlpFollow      = "followed by ab";
sHlpNotFollow   = "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";
sHlpSpecChars   = "()[]{}^$.?+*|\\ special chars";
sHlpDollar      = "dollar character";
sHlpEntireStr   = "entire string matched";
sHlpPrecedeStr  = "substring that precedes matched string";
sHlpFollowStr   = "substring that follows after matched string";
sHlpSubmatch9   = "9th captured submatch, range 1-9";
sHlpSubmatch99  = "99th captured submatch, range 01-99";
sHlpBackslash   = "backslash";
- English template for translation
FindReplaceFiles_1034.lng

Code:
/************************************
FindReplaceFiles.js - ver. 2016-02-13
Interface language
Language:      Spanish (1034)
Translated by: c-sanchez
*************************************/
sTxtDlgTitle    = "Buscar/Reemplazar archivos";
sTxtDir         = "&Directorio";
sTxtCurrent     = "&Actual";
sTxtBrowse      = "&Buscar...";
sTxtSubDirs     = "Nivel de &subdirectorios:";
sTxtAll         = "Todo";
sTxtFileName    = "Archivo:Cadena de &nombres";
sTxtRegExp      = "Expresiones regulares";
sTxtNotName     = "Nombres sin coincidencia";
sTxtFiles       = "Archivos (cadenas principales)";
sTxtStreams     = "Alternar cadenas NTFS";
sTxtTextInFile  = "&Texto en archivo/cadena";
sTxtMatchCase   = "Coincidir MAY/min";
sTxtMultiline   = "&Múltiples líneas";
sTxtNotContain  = "No contienen texto";
sTxtSkipBinary  = "Saltar archivos binarios";
sTxtSkipLarger  = "Saltar mayor a [B]:";
sTxtReplaceWith = "&Remplazar con:";
sTxtSkipFiles   = "Saltar archivos";
sTxtReadOnly    = "Solo &lectura";
sTxtHidden      = "&Oculto";
sTxtSystem      = "&Sistema";
sTxtInResults   = "En resultados";
sTxtSearch      = "&Buscar";
sTxtReplace     = "&Reemplazar";
sTxtHistory     = "&Historial";
sTxtEdit        = "&Editar";
sTxtCopyList    = "Copiar lista";
sTxtClearList   = "Limpiar lista";
sTxtSettings    = "Ajustes";
sTxtClose       = "&Cerrar";
sTxtFilesFound  = "Archivos encontrados";
sTxtFilesRepl   = "Archivos reemplazados";
sTxtNoFiles     = "<no hay archivos>";
sTxtByteSymbol  = "B";
sTxtNTFSStream  = "Cadena NTFS";
sTxtWait        = "Espere...";
sTxtChooseDir   = "Elegir directorio:";
sTxtPathShow    = "&Mostrar ruta completa en la lista de archivos";
sTxtSeparateWnd = "&Ejecutar en ventana separada";
sTxtKeepHist    = "Mantener &historial al salir";
sTxtKeepFiles   = "Mantener &lista de archivos";
sTxtDirNoExist  = "El directorio no existe.";
sTxtFileNoExist = "Los archivos no existen.";
sTxtErrorRE     = "Error en expresión regular.";
sTxtWantReplace = "żQuiere reemplazar el contenido de los archivos?\n\nAdvertencia: esta operación no se puede deshacer.";
sTxtDocModified = "El documento fue modificado. żDesea guardarlo?";
sHlpAnyChar     = "cualquier carácter individual";
sHlpAnyString   = "cualquier cadena de caracteres";
sHlpSemicolQuot = "punto y coma debe ir entre comillas dobles";
sHlpListSepar   = "separador de lista (punto y coma)";
sHlpStreamSepar = "Archivo:Separador de cadena (coma)";
sHlpAnyChar_NL  = "cualquier carácter, excepto \\n";
sHlpDigit       = "dígito [0-9]";
sHlpNonDigit    = "no dígito [^0-9]";
sHlpWhiteSp     = "espacio en blanco [ \\f\\n\\r\\t\\v]";
sHlpNonWhiteSp  = "no espacio en blanco";
sHlpWordChar    = "carácter palabra [A-Za-z0-9_]";
sHlpNonWordChar = "carácter no-palabra";
sHlpNULL        = "Carácter nulo";
sHlpFF          = "salto de página \\x0C";
sHlpNL          = "nueva línea \\x0A";
sHlpCR          = "retorno de carro \\x0D";
sHlpTab         = "tab \\x09";
sHlpVTab        = "pestańa vertical \\x0B";
sHlpCharHex     = "código hexadecimal de caracteres FF";
sHlpUniCharHex  = "Código hexadecimal de caracteres Unicode 00FF";
sHlpBegin       = "principio de cadena/línea";
sHlpEnd         = "final de cadena/línea";
sHlpWordBoun    = "límite de palabra";
sHlpNonWordBoun = "sin límite de palabra";
sHlpAlternative = "alternativa ab ó xy";
sHlpCharSet     = "conjunto de caracteres, cualquiera especificado";
sHlpNegCharSet  = "conjunto de caracteres negativos";
sHlpRange       = "rango de caracteres de la a la z";
sHlpNegRange    = "rango negativo de caracteres";
sHlpCapture     = "capturar";
sHlpNotCapture  = "no capturar";
sHlpFollow      = "seguido por ab";
sHlpNotFollow   = "no seguido por ab";
sHlpBackrefer9  = "retrorreferencia, rango 1-9";
sHlpBackrefer99 = "retrorreferencia, rango 01-99";
sHlpZeroOrOne   = "cero o una vez";
sHlpZeroOrMore  = "cero o más veces";
sHlpOneOrMore   = "una o más veces";
sHlpexactly     = "exactamente 3 veces";
sHlpAtLeast     = "al menos 3 veces";
sHlpFromTo      = "de 3 a 7 veces";
sHlpSpecChars   = "Caracteres especiales ()[]{}^$.?+*|\\";
sHlpDollar      = "carácter del dólar";
sHlpEntireStr   = "cadena coincidiente completa";
sHlpPrecedeStr  = "subcadena que precede la cadena coincidente";
sHlpFollowStr   = "subcadena que sigue después de cadena coincidente";
sHlpSubmatch9   = "9na subcoincidencia capturada, rango 1-9";
sHlpSubmatch99  = "99a subcoincidencia capturada, rango 01-99";
sHlpBackslash   = "barra invertida";
- Spanish by c-sanchez
FindReplaceFiles_1045.lng

Code:
/************************************
FindReplaceFiles.js - ver. 2016-02-13
Interface language
Language:      Polish (1045)
Translated by: KDJ
*************************************/
sTxtDlgTitle    = "Znajdź/Zamień pliki";
sTxtDir         = "&Katalog";
sTxtCurrent     = "&Bieżący";
sTxtBrowse      = "&Przeglądaj...";
sTxtSubDirs     = "Poziom podkata&logów:";
sTxtAll         = "Wszystkie";
sTxtFileName    = "&Nazwy Plik:Strumień";
sTxtRegExp      = "Wyrażenia &regularne";
sTxtNotName     = "Nie pasujące nazwy";
sTxtFiles       = "Pliki (główne strumienie)";
sTxtStreams     = "Alternatywne strumienie NTFS";
sTxtTextInFile  = "&Tekst w pliku/strumieniu";
sTxtMatchCase   = "Uwzględnij wielkość liter";
sTxtMultiline   = "&Multiline";
sTxtNotContain  = "Nie zawiera tekstu";
sTxtSkipBinary  = "Pomiń pliki binarne";
sTxtSkipLarger  = "Pomiń większe [B]:";
sTxtReplaceWith = "Zamień na:";
sTxtSkipFiles   = "Pomiń pliki";
sTxtReadOnly    = "Do odczytu";
sTxtHidden      = "Ukryty";
sTxtSystem      = "Systemowy";
sTxtInResults   = "W wynikach";
sTxtSearch      = "&Szukaj";
sTxtReplace     = "&Zamień";
sTxtHistory     = "&Historia";
sTxtEdit        = "&Edytuj";
sTxtCopyList    = "Kopiuj listę";
sTxtClearList   = "Wyczyść listę";
sTxtSettings    = "&Ustawienia";
sTxtClose       = "Zamknij";
sTxtFilesFound  = "Pliki znalezione";
sTxtFilesRepl   = "Pliki zamienione";
sTxtNoFiles     = "<brak plików>";
sTxtByteSymbol  = "B";
sTxtNTFSStream  = "Strumień NTFS";
sTxtWait        = "Czekaj...";
sTxtChooseDir   = "Wybierz katalog:";
sTxtPathShow    = "Pokazuj pełną ścieżkę na liście plików";
sTxtSeparateWnd = "Uruchom w oddzielnym oknie";
sTxtKeepHist    = "Zachowaj historię przy wyjściu";
sTxtKeepFiles   = "Zachowaj listę plików";
sTxtDirNoExist  = "Katalog nie istnieje.";
sTxtFileNoExist = "Pliki nie istnieją.";
sTxtErrorRE     = "Błąd w wyrażeniu regularnym.";
sTxtWantReplace = "Czy chcesz zamienić zawartość plików?\n\nOstrzeżenie: tej operacji nie można cofnąć.";
sTxtDocModified = "Dokument został zmodyfikowany. Czy zapisać zmiany?";
sHlpAnyChar     = "dowolny pojedynczy znak";
sHlpAnyString   = "dowolny ciąg znaków";
sHlpSemicolQuot = "średnik musi być w podwójnych cudzysłowach";
sHlpListSepar   = "separator listy (średnik)";
sHlpStreamSepar = "separator Plik:Strumień (dwukropek)";
sHlpAnyChar_NL  = "dowolny znak, oprócz \\n";
sHlpDigit       = "cyfra [0-9]";
sHlpNonDigit    = "nie cyfra [^0-9]";
sHlpWhiteSp     = "biały znak [ \\f\\n\\r\\t\\v]";
sHlpNonWhiteSp  = "nie biały znak";
sHlpWordChar    = "znak słowa [A-Za-z0-9_]";
sHlpNonWordChar = "inny niż znak słowa";
sHlpNULL        = "znak NULL";
sHlpFF          = "wysuw strony \\x0C";
sHlpNL          = "nowy wiersz \\x0A";
sHlpCR          = "powrót karetki \\x0D";
sHlpTab         = "tab \\x09";
sHlpVTab        = "pionowy tab \\x0B";
sHlpCharHex     = "znak o kodzie hex FF";
sHlpUniCharHex  = "znak Unicode o kodzie 00FF";
sHlpBegin       = "początek tekstu/wiersza";
sHlpEnd         = "koniec tekstu/wiersza";
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";
sHlpFollow      = "za ciągiem jest ab";
sHlpNotFollow   = "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";
sHlpSpecChars   = "()[]{}^$.?+*|\\ znaki specjalne";
sHlpDollar      = "znak dolara";
sHlpEntireStr   = "cały dopasowany ciąg";
sHlpPrecedeStr  = "tekst poprzedzający dopasowany ciąg";
sHlpFollowStr   = "tekst za dopasowanym ciągiem";
sHlpSubmatch9   = "9-ty dopasowany podciąg, zakres 1-9";
sHlpSubmatch99  = "99-ty dopasowany podciąg, zakres 01-99";
sHlpBackslash   = "backslash";
- Polish
FindReplaceFiles_1049.lng

Code:
/*******************************************************
FindReplaceFiles.js - ver. 2016-02-13
Interface language
Language:      Russian (1049)
Translated by: Averin Andrey, F.Phoenix, Nizaury, VladSh
********************************************************/
sTxtDlgTitle    = "Поиск/Замена в файлах";
sTxtDir         = "&Папка:";
sTxtCurrent     = "&Текущая";
sTxtBrowse      = "&Выбрать...";
sTxtSubDirs     = "&Уровень подпапок:";
sTxtAll         = "Все";
sTxtFileName    = "&Имя файла:потока";
sTxtRegExp      = "Регулярные выражения";
sTxtNotName     = "Кроме этих имён";
sTxtFiles       = "Файлы (основные потоки)";
sTxtStreams     = "Альтернативные NTFS потоки";
sTxtTextInFile  = "&Текст в файле/потоке";
sTxtMatchCase   = "С учетом регистра";
sTxtMultiline   = "Многострочно";
sTxtNotContain  = "Не содержащие текст";
sTxtSkipBinary  = "Не искать в бинарных файлах";
sTxtSkipLarger  = "Не более [Б]:";
sTxtReplaceWith = "Заменить этим:";
sTxtSkipFiles   = "Пропустить";
sTxtReadOnly    = "Для чтения";
sTxtHidden      = "Скрытые";
sTxtSystem      = "Системные";
sTxtInResults   = "В результатах";
sTxtSearch      = "Искать";
sTxtReplace     = "Заменить";
sTxtHistory     = "История";
sTxtEdit        = "Правка";
sTxtCopyList    = "Копировать";
sTxtClearList   = "Очистить";
sTxtSettings    = "Настройки";
sTxtClose       = "Закрыть";
sTxtFilesFound  = "Найдено в файлах";
sTxtFilesRepl   = "Заменено в файлах";
sTxtNoFiles     = "<нет файлов>";
sTxtByteSymbol  = "Б";
sTxtNTFSStream  = "Поток NTFS";
sTxtWait        = "Подождите...";
sTxtChooseDir   = "Выберите папку:";
sTxtPathShow    = "Отображать полный путь в списке файлов";
sTxtSeparateWnd = "Запускать в отдельном окне";
sTxtKeepHist    = "Сохранять историю поисков при выходе";
sTxtKeepFiles   = "Запоминать найденный список файлов";
sTxtDirNoExist  = "Папка не существует.";
sTxtFileNoExist = "Файлы не существуют.";
sTxtErrorRE     = "Ошибка в регулярном выражении.";
sTxtWantReplace = "Вы хотите заменить содержимое файлов?\n\nВнимание: эта операция не может быть отменена.";
sTxtDocModified = "Документ был изменён. Сохранить?";
sHlpAnyChar     = "любой одиночный символ";
sHlpAnyString   = "любая подстрока";
sHlpSemicolQuot = "точка с запятой (если внутри кавычек)";
sHlpListSepar   = "разделитель списка имен (вне кавычек)";
sHlpStreamSepar = "разделитель файла:потока (двоеточие)";
sHlpAnyChar_NL  = "любой символ, кроме \\n";
sHlpDigit       = "цифра [0-9]";
sHlpNonDigit    = "не цифра [^0-9]";
sHlpWhiteSp     = "пробельный символ [ \\f\\n\\r\\t\\v]";
sHlpNonWhiteSp  = "непробельный символ";
sHlpWordChar    = "словесный символ [A-Za-z0-9_]";
sHlpNonWordChar = "несловесный символ";
sHlpNULL        = "нулевой символ";
sHlpFF          = "перевод страницы \\x0C";
sHlpNL          = "перевод строки \\x0A";
sHlpCR          = "возврат каретки \\x0D";
sHlpTab         = "табуляция \\x09";
sHlpVTab        = "вертикальная табуляция \\x0B";
sHlpCharHex     = "символ с кодом FF";
sHlpUniCharHex  = "символ юникода 00FF";
sHlpBegin       = "начало строки или текста";
sHlpEnd         = "конец строки или текста";
sHlpWordBoun    = "граница слова";
sHlpNonWordBoun = "не граница слова";
sHlpAlternative = "одна из альтернатив: ab либо xy";
sHlpCharSet     = "набор символов, нужен любой из них";
sHlpNegCharSet  = "исключающий набор символов";
sHlpRange       = "диапазон символов от a до z";
sHlpNegRange    = "исключающий диапазон";
sHlpCapture     = "запоминающая скобка";
sHlpNotCapture  = "незапоминающая скобка";
sHlpFollow      = "далее следует ab";
sHlpNotFollow   = "далее не следует ab";
sHlpBackrefer9  = "обратная ссылка, диапазон 1-9";
sHlpBackrefer99 = "обратная ссылка, диапазон 01-99";
sHlpZeroOrOne   = "0 или 1 раз";
sHlpZeroOrMore  = "0 или более раз";
sHlpOneOrMore   = "1 или более раз";
sHlpexactly     = "ровно 3 раза";
sHlpAtLeast     = "не менее 3 раз";
sHlpFromTo      = "от 3 до 7 раз";
sHlpSpecChars   = "()[]{}^$.?+*|\\ специальные символы";
sHlpDollar      = "символ доллара";
sHlpEntireStr   = "вся захваченная строка";
sHlpPrecedeStr  = "подстрока, предшествующая найденной строке";
sHlpFollowStr   = "подстрока, следующая за найденной строкой";
sHlpSubmatch9   = "9я подстрока (диапазон 1-9)";
sHlpSubmatch99  = "99я подстрока (диапазон 01-99)";
sHlpBackslash   = "обратный слеш";
- Russian by Andrey_A_A, F.Phoenix, Nizaury, VladSh
FindReplaceFiles_2052.lng

Code:
/**************************************
FindReplaceFiles.js - ver. 2016-02-13
Interface language
Language:      ChineseSimplified (2052)
Translated by: cnnnc
***************************************/
sTxtDlgTitle    = "查找/替换文件";
sTxtDir         = "目录(&D)";
sTxtCurrent     = "当前(&C)";
sTxtBrowse      = "浏览(&B)...";
sTxtSubDirs     = "子目录层数(&L):";
sTxtAll         = "所有";
sTxtFileName    = "文件:数据流名称(&N)";
sTxtRegExp      = "正则表达式";
sTxtNotName     = "不匹配名称";
sTxtFiles       = "文件 (主数据流)";
sTxtStreams     = "备选 NTFS 数据流";
sTxtTextInFile  = "文件/数据流中的文本(&T)";
sTxtMatchCase   = "区分大小写";
sTxtMultiline   = "多行";
sTxtNotContain  = "不包含文字";
sTxtSkipBinary  = "跳过二进制文件";
sTxtSkipLarger  = "跳过大于[B]:";
sTxtReplaceWith = "替换为(&W):";
sTxtSkipFiles   = "跳过文件";
sTxtReadOnly    = "只读";
sTxtHidden      = "隐藏";
sTxtSystem      = "系统";
sTxtInResults   = "In results";                  //new
sTxtSearch      = "搜索";
sTxtReplace     = "替换(&R)";
sTxtHistory     = "&History";                    //new
sTxtEdit        = "编辑";
sTxtCopyList    = "复制列表";
sTxtClearList   = "清空列表";
sTxtSettings    = "设置";
sTxtClose       = "关闭";
sTxtFilesFound  = "个文件被找到";
sTxtFilesRepl   = "个文件被替换";
sTxtNoFiles     = "<无文件>";
sTxtByteSymbol  = "字节";
sTxtNTFSStream  = "NTFS 数据流";
sTxtWait        = "请稍候...";
sTxtChooseDir   = "请选择目录:";
sTxtPathShow    = "文件列表中显示完整路径";
sTxtSeparateWnd = "在独立窗口运行";
sTxtKeepHist    = "Keep history";                //new
sTxtKeepFiles   = "保留文件列表";
sTxtDirNoExist  = "目录不存在。";
sTxtFileNoExist = "文件不存在。";
sTxtErrorRE     = "正则表达式错误。";
sTxtWantReplace = "是否想要替换文件的内容?\n\n警告: 本操作无法撤消。";
sTxtDocModified = "Document was modified. Do you want to save it?";  //new
sHlpAnyChar     = "任意单一字符";
sHlpAnyString   = "任意个字符的字符串";
sHlpSemicolQuot = "分号必须在双引号中";
sHlpListSepar   = "列表分隔符(分号)";
sHlpStreamSepar = "文件:数据流分隔符(分号)";
sHlpAnyChar_NL  = "任意单一字符,除了 \\n";
sHlpDigit       = "数字 [0-9]";
sHlpNonDigit    = "非数字 [^0-9]";
sHlpWhiteSp     = "空白字符 [ \\f\\n\\r\\t\\v]";
sHlpNonWhiteSp  = "非空白字符";
sHlpWordChar    = "单词字符 [A-Za-z0-9_]";
sHlpNonWordChar = "非单词字符";
sHlpNULL        = "NULL 字符";
sHlpFF          = "换页符 \\x0C";
sHlpNL          = "换行符 \\x0A";
sHlpCR          = "回车符 \\x0D";
sHlpTab         = "制表符 \\x09";
sHlpVTab        = "垂直制表符 \\x0B";
sHlpCharHex     = "字符 16 进制编码 FF";
sHlpUniCharHex  = "Unicode 字符 16 进制编码 00FF";
sHlpBegin       = "字串/行的开头";
sHlpEnd         = "字串/行的末尾";
sHlpWordBoun    = "单词边界";
sHlpNonWordBoun = "非单词边界";
sHlpAlternative = "匹配 ab 或 xy";
sHlpCharSet     = "字符集合, 匹配所包含的任意一个字符";
sHlpNegCharSet  = "负值字符集合,匹配未包含的任意字符";
sHlpRange       = "匹配 a 到 z 范围内的任意小写字母字符";
sHlpNegRange    = "匹配任何不在 a 到 z 范围内的任意字符";
sHlpCapture     = "匹配 ab 并获取这一匹配";
sHlpNotCapture  = "匹配 ab 但不获取匹配";
sHlpFollow      = "在任何匹配 ab 的字符串开始处匹配查找字符串";
sHlpNotFollow   = "在任何不匹配 ab 的字符串开始处匹配查找字符串";
sHlpBackrefer9  = "向后引用, 范围 1-9";
sHlpBackrefer99 = "向后引用, 范围 01-99";
sHlpZeroOrOne   = "匹配前面的子表达式零次或一次";
sHlpZeroOrMore  = "匹配前面的子表达式零次或多次";
sHlpOneOrMore   = "匹配前面的子表达式一次或多次";
sHlpexactly     = "精确匹配 3 次";
sHlpAtLeast     = "最少匹配 3 次";
sHlpFromTo      = "匹配 3 到 7 次的";
sHlpSpecChars   = "()[]{}^$.?+*|\\ 特殊符号";
sHlpDollar      = "美元符号";
sHlpEntireStr   = "匹配整个字符串";
sHlpPrecedeStr  = "子字符串位于匹配字符串前面";
sHlpFollowStr   = "子字符串位于匹配字符串后面";
sHlpSubmatch9   = "第 9 个捕捉子匹配, 范围 1-9";
sHlpSubmatch99  = "第 99 个捕捉子匹配, 范围 01-99";
sHlpBackslash   = "反斜线";
- Chinese-Simplified by cnnnc


Last edited by KDJ on Sat Feb 13, 2016 12:10 pm; edited 4 times in total
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 6223

PostPosted: Sun Mar 01, 2015 5:55 pm    Post subject: Reply with quote

Detect codepage by extension or by file content.

AutoScript-DetectEx.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27664#27664
// Version: 1.0
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Detect codepage by extension or by file content.
// Description(1049): Определить кодировку по расширению или по содержимому файла.
//
// Arguments:
// -DetectArray='[["ext1,ext2","ExpContent","ExpFlags","CodePage",BOM,DetectLang],["ext3",...]'
//
//              "ext1,ext2"  -extensions divided by semicolon. If "", any extension is matched.
//              "ExpContent" -search file content with regular expression. If "", not used.
//              "ExpFlags"   -regular expression flags.
//              "CodePage"   -default codepage specified as number, as IANA charset (e.g. "utf-8") or as regular expression backreference (e.g. "$1" or "\\1").
//              BOM          -byte order mark. If -1, it will be autodetected.
//              DetectLang   -detection language number (see LANGID_* defines). Special values:
//                              -1  don't change current detection language.
//                              -2  force to use specified "CodePage" without any detection.
// -ContentBuffer=1024  Content buffer size for regular expression search. Special values:
//                              0   use codepage recognition buffer size (default).
//                              -1  read entire file.
//
// Usage (add to "CmdLineBegin=" manual parameter):
//   /Call("Scripts::Main", 2, "AutoScript-DetectEx.js", `-DetectArray='[["cmd,bat","","","866",-1,0x0419],["xml,htm,html",".*?(encoding|charset)=([a-z\\d_\\-]+)","i","$2",-1,-2]]'`)

//Arguments
var pDetectArray=AkelPad.GetArgValue("DetectArray", "");
var nContentBuffer=AkelPad.GetArgValue("ContentBuffer", 0);

//Defines
var LANGID_NONE     =0;      //None
var LANGID_RUSSIAN  =0x0419; //Cyrillic (1251, OEM, KOI8-R, UTF-8)
var LANGID_POLISH   =0x0415; //Eastern European (1250, OEM, UTF-8)
var LANGID_GERMAN   =0x0407; //Western European (1252, OEM, UTF-8)
var LANGID_TURKISH  =0x041F; //Turkish (1254, OEM, UTF-8)
var LANGID_CHINESE  =0x0404; //Chinese (ANSI, UTF-8)
var LANGID_JAPANESE =0x0411; //Japanese (932, UTF-8)
var LANGID_KOREAN   =0x0412; //Korean (949, UTF-8)

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hScript;
var lpdwFlags;
var dwFlags;
var lpFile;
var pFile;
var pExt="";
var lpnCodePage;
var lpbBOM;
var nDefaultCodepage;
var nLangCodepageRecognition;
var nNewDefaultCodepage;
var nNewBOM;
var nNewLangCodepageRecognition;
var pContent;
var pCharset;
var oPattern;
var aDetectArray=[];
var aMatch=[];
var nOffset;
var i;

if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
  //Script is running, second call close it.
  AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
  if (pDetectArray)
    eval("aDetectArray=" + pDetectArray + ";");
  if (!nContentBuffer)
    nContentBuffer=AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 184 /*MI_CODEPAGERECOGNITIONBUFFER*/, 0);
  if (!aDetectArray.length)
  {
    AkelPad.MessageBox(hMainWnd, "Too few parameters", WScript.ScriptName, 16 /*MB_ICONERROR*/);
    WScript.Quit();
  }
  for (i=0; i < aDetectArray.length; ++i)
  {
    aDetectArray[i][0]=aDetectArray[i][0].toLowerCase();
  }

  if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x435 /*AKDN_OPENDOCUMENT_START*/,
                                                               0x436 /*AKDN_OPENDOCUMENT_FINISH*/))
  {
    //Allow other scripts running and unlock main thread from waiting this script.
    AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);

    //Message loop
    AkelPad.WindowGetMessage();

    AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
  }
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x435 /*AKDN_OPENDOCUMENT_START*/)
  {
    nDefaultCodepage=0;
    nLangCodepageRecognition=-1;
    lpdwFlags=AkelPad.MemRead(lParam + (_X64?40:20) /*offsetof(NOPENDOCUMENT, dwFlags)*/, 3 /*DT_DWORD*/);
    dwFlags=AkelPad.MemRead(lpdwFlags, 3 /*DT_DWORD*/);

    if (!(dwFlags & 0x100 /*OD_REOPEN*/))
    {
      lpFile=AkelPad.MemRead(lParam + (_X64?16:8) /*offsetof(NOPENDOCUMENT, wszFile)*/, 2 /*DT_QWORD*/);
      pFile=AkelPad.MemRead(lpFile, 1 /*DT_UNICODE*/);
      pExt=AkelPad.GetFilePath(pFile, 4 /*CPF_FILEEXT*/).toLowerCase();
      pContent="";
      pCharset="";
      nNewDefaultCodepage=0;

      for (i=0; i < aDetectArray.length; ++i)
      {
        if (aDetectArray[i][0])
        {
          if ((nOffset=aDetectArray[i][0].indexOf(pExt)) != -1 &&
              (aDetectArray[i][0].substr(nOffset + pExt.length, 1) == "" ||
               aDetectArray[i][0].substr(nOffset + pExt.length, 1) == ","))
          {
            pCharset=aDetectArray[i][3];
          }
          else continue;
        }
        if (aDetectArray[i][1])
        {
          if (!pContent)
            pContent=AkelPad.ReadFile(pFile, 0x1C /*ADT_DETECTCODEPAGE|ADT_DETECTBOM|ADT_NOMESSAGES*/, 0, 0, nContentBuffer);
          oPattern=new RegExp(aDetectArray[i][1], aDetectArray[i][2]);
          if (aMatch=pContent.match(oPattern))
          {
            if (aDetectArray[i][3].substr(0, 1) == "$" || aDetectArray[i][3].substr(0, 1) == "\\")
              pCharset=aMatch[parseInt(aDetectArray[i][3].substr(1))];
            else
              pCharset=aDetectArray[i][3];
          }
          else continue;
        }
        if (pCharset)
        {
          nNewDefaultCodepage=parseInt(pCharset);
          if (isNaN(nNewDefaultCodepage))
          {
            pCharset=pCharset.toLowerCase();
            nNewDefaultCodepage=GetCodepageByName(pCharset);
          }
          break;
        }
      }
      if (i < aDetectArray.length && nNewDefaultCodepage)
      {
        nNewBOM=aDetectArray[i][4];
        nNewLangCodepageRecognition=aDetectArray[i][5];

        if (nNewLangCodepageRecognition != -1)
        {
          if (nNewLangCodepageRecognition == -2)
          {
            if (nNewBOM == -1)
              dwFlags|=0x8 /*OD_ADT_DETECTBOM*/;
            else
            {
              lpbBOM=AkelPad.MemRead(lParam + (_X64?32:16) /*offsetof(NOPENDOCUMENT, bBOM)*/, 2 /*DT_QWORD*/);
              AkelPad.MemCopy(lpbBOM, nNewBOM, 3 /*DT_DWORD*/);
              dwFlags&=~0x8 /*OD_ADT_DETECTBOM*/;
            }
            lpnCodePage=AkelPad.MemRead(lParam + (_X64?24:12) /*offsetof(NOPENDOCUMENT, nCodePage)*/, 2 /*DT_QWORD*/);
            AkelPad.MemCopy(lpnCodePage, nNewDefaultCodepage, 3 /*DT_DWORD*/);
            AkelPad.MemCopy(lpdwFlags, dwFlags & ~0x6 /*OD_ADT_REGCODEPAGE|OD_ADT_DETECTCODEPAGE*/, 3 /*DT_DWORD*/);
            nNewDefaultCodepage=0;
          }
          else
          {
            nLangCodepageRecognition=AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 183 /*MI_LANGCODEPAGERECOGNITION*/, 0);
            AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 183 /*MIS_LANGCODEPAGERECOGNITION*/, nNewLangCodepageRecognition);
          }
        }
        if (nNewDefaultCodepage)
        {
          nDefaultCodepage=AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 177 /*MI_DEFAULTCODEPAGE*/, 0);
          AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 177 /*MIS_DEFAULTCODEPAGE*/, nNewDefaultCodepage);
        }
      }
    }
  }
  else if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/)
  {
    if (nDefaultCodepage)
      AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 177 /*MIS_DEFAULTCODEPAGE*/, nDefaultCodepage);
    if (nLangCodepageRecognition != -1)
      AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 183 /*MIS_LANGCODEPAGERECOGNITION*/, nLangCodepageRecognition);
  }
}

function GetCodepageByName(pName)
{
  switch (pName)
  {
    case "ibm037": return 37;
    case "ibm437": return 437;
    case "ibm500": return 500;
    case "asmo-708": return 708;
    case "dos-720": return 720;
    case "ibm737": return 737;
    case "ibm775": return 775;
    case "ibm850": return 850;
    case "ibm852": return 852;
    case "ibm855": return 855;
    case "ibm857": return 857;
    case "ibm00858": return 858;
    case "ibm860": return 860;
    case "ibm861": return 861;
    case "dos-862": return 862;
    case "ibm863": return 863;
    case "ibm864": return 864;
    case "ibm865": return 865;
    case "cp866": return 866;
    case "ibm869": return 869;
    case "ibm870": return 870;
    case "windows-874": return 874;
    case "cp875": return 875;
    case "shift_jis": return 932;
    case "gb2312": return 936;
    case "ks_c_5601-1987": return 949;
    case "big5": return 950;
    case "ibm1026": return 1026;
    case "ibm01047": return 1047;
    case "ibm01140": return 1140;
    case "ibm01141": return 1141;
    case "ibm01142": return 1142;
    case "ibm01143": return 1143;
    case "ibm01144": return 1144;
    case "ibm01145": return 1145;
    case "ibm01146": return 1146;
    case "ibm01147": return 1147;
    case "ibm01148": return 1148;
    case "ibm01149": return 1149;
    case "utf-16le": return 1200;
    case "utf-16be": return 1201;
    case "windows-1250": return 1250;
    case "windows-1251": return 1251;
    case "windows-1252": return 1252;
    case "windows-1253": return 1253;
    case "windows-1254": return 1254;
    case "windows-1255": return 1255;
    case "windows-1256": return 1256;
    case "windows-1257": return 1257;
    case "windows-1258": return 1258;
    case "johab": return 1361;
    case "macintosh": return 10000;
    case "x-mac-japanese": return 10001;
    case "x-mac-chinesetrad": return 10002;
    case "x-mac-korean": return 10003;
    case "x-mac-arabic": return 10004;
    case "x-mac-hebrew": return 10005;
    case "x-mac-greek": return 10006;
    case "x-mac-cyrillic": return 10007;
    case "x-mac-chinesesimp": return 10008;
    case "x-mac-romanian": return 10010;
    case "x-mac-ukrainian": return 10017;
    case "x-mac-thai": return 10021;
    case "x-mac-ce": return 10029;
    case "x-mac-icelandic": return 10079;
    case "x-mac-turkish": return 10081;
    case "x-mac-croatian": return 10082;
    case "utf-32le": return 12000;
    case "utf-32be": return 12001;
    case "x-chinese_cns": return 20000;
    case "x-cp20001": return 20001;
    case "x_chinese-eten": return 20002;
    case "x-cp20003": return 20003;
    case "x-cp20004": return 20004;
    case "x-cp20005": return 20005;
    case "x-ia5": return 20105;
    case "x-ia5-german": return 20106;
    case "x-ia5-swedish": return 20107;
    case "x-ia5-norwegian": return 20108;
    case "us-ascii": return 20127;
    case "x-cp20261": return 20261;
    case "x-cp20269": return 20269;
    case "ibm273": return 20273;
    case "ibm277": return 20277;
    case "ibm278": return 20278;
    case "ibm280": return 20280;
    case "ibm284": return 20284;
    case "ibm285": return 20285;
    case "ibm290": return 20290;
    case "ibm297": return 20297;
    case "ibm420": return 20420;
    case "ibm423": return 20423;
    case "ibm424": return 20424;
    case "x-ebcdic-koreanextended": return 20833;
    case "ibm-thai": return 20838;
    case "koi8-r": return 20866;
    case "ibm871": return 20871;
    case "ibm880": return 20880;
    case "ibm905": return 20905;
    case "ibm00924": return 20924;
    case "euc-jp": return 20932;
    case "x-cp20936": return 20936;
    case "x-cp20949": return 20949;
    case "cp1025": return 21025;
    case "koi8-u": return 21866;
    case "iso-8859-1": return 28591;
    case "iso-8859-2": return 28592;
    case "iso-8859-3": return 28593;
    case "iso-8859-4": return 28594;
    case "iso-8859-5": return 28595;
    case "iso-8859-6": return 28596;
    case "iso-8859-7": return 28597;
    case "iso-8859-8": return 28598;
    case "iso-8859-9": return 28599;
    case "iso-8859-13": return 28603;
    case "iso-8859-15": return 28605;
    case "x-europa": return 29001;
    case "iso-8859-8-i": return 38598;
    case "iso-2022-jp": return 50220;
    case "csiso2022jp": return 50221;
    case "iso-2022-jp": return 50222;
    case "iso-2022-kr": return 50225;
    case "x-cp50227": return 50227;
    case "euc-jp": return 51932;
    case "euc-cn": return 51936;
    case "euc-kr": return 51949;
    case "hz-gb-2312": return 52936;
    case "gb18030": return 54936;
    case "x-iscii-de": return 57002;
    case "x-iscii-be": return 57003;
    case "x-iscii-ta": return 57004;
    case "x-iscii-te": return 57005;
    case "x-iscii-as": return 57006;
    case "x-iscii-or": return 57007;
    case "x-iscii-ka": return 57008;
    case "x-iscii-ma": return 57009;
    case "x-iscii-gu": return 57010;
    case "x-iscii-pa": return 57011;
    case "utf-7": return 65000;
    case "utf-8": return 65001;
  }
  return 0;
}

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



Joined: 06 Mar 2010
Posts: 1915
Location: Poland

PostPosted: Fri Mar 13, 2015 8:03 pm    Post subject: Reply with quote

GUI for PDFtk Server - manipulating PDF documents (PDFtk). Part 1.

Parts 2, 3, 4, 5 are in the next posts.
All in one: KDJ.zip

PDFtk-G.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27750#27750
// Version: 2016-08-05
// Author: KDJ
//
// *** GUI for PDFtk Server - manipulating PDF documents ***
// https://www.pdflabs.com/tools/pdftk-server
//
// Run in AkelPad window:
//   Call("Scripts::Main", 1, "PDFtk-G.js")
//   Call("Scripts::Main", 1, "PDFtk-G.js", "1")
// Run from command line (required registration: regsvr32.exe Scripts.dll):
//   wscript.exe PDFtk-G.js
//   wscript.exe PDFtk-G.js 1
//
// Argument:
//   0 - run only single instance of the script (default)
//   1 - allow to run the script in multiple instances of AkelPad.exe or wscript.exe
//
// Keyboard and mouse:
//   F1        - PDFtk help
//   F5 (F9)   - refresh source PDFs list
//   Alt+Enter - maximize/restore window
//   double click on PDF list - edit ranges
//   right click on list - context menu

if (typeof AkelPad == "undefined")
{
  try
  {
    AkelPad = new ActiveXObject("AkelPad.Document");
    _PtrAdd = function(n1, n2) {return AkelPad.Global._PtrAdd(n1, n2);};
    _X64    = AkelPad.Constants._X64;
  }
  catch (oError)
  {
    WScript.Echo("You need to register Scripts.dll");
    WScript.Quit();
  }
}

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

if ((WScript.Arguments.length > 0) && (WScript.Arguments(0) == "1"))
  sClass += oSys.Call("Kernel32::GetCurrentProcessId");
else
  sClass += hInstDLL;

var hDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0);

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

  oSys.Call("User32::SetForegroundWindow", hDlg);
  WScript.Quit();
}

var hMainWnd = AkelPad.GetMainWnd();
var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
var hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var hIconSmall = oSys.Call("User32::LoadImageW",
                   hInstDLL, //hinst
                   101,      //lpszName
                   1,        //uType=IMAGE_ICON
                   16,       //cxDesired
                   16,       //cyDesired
                   0);       //fuLoad
var hIconBig = oSys.Call("User32::LoadImageW",
                 hInstDLL, //hinst
                 101,      //lpszName
                 1,        //uType=IMAGE_ICON
                 32,       //cxDesired
                 32,       //cyDesired
                 0);       //fuLoad
var sDlgTitle   = 'PDFtk-G';
var sScriptDir  = oFSO.GetParentFolderName(WScript.ScriptFullName);
var nTotalPages = 0;
var nOutPages   = -1;
var nOutRanges  = 0;
var sPDFtkExe;
var hProcess;
var bCreating;
var bRefreshing;
var nExitCode;

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

var nTab       = 0;
var bCollateW  = 0;
var bShuffleW  = 0;
var bSplitAll  = 0;
var bWaterAll  = 0;
var nWater     = 0;
var nBook      = 0;
var bUTF8      = 1;
var nData      = 0;
var sWaterAdd  = "_watermark";
var sWaterPDF  = "";
var sBookTXT   = "";
var sDataTXT   = "";
var sPDFtkDir  = "";
var sPDFReader = "";
var sTXTEditor = "";
var sLastDir   = "";
var nAfter     = 0;
var bSaveList  = 1;
var bSavePass  = 1;
var bPassProt  = 0;
var sOwnerPass = "";
var sUserPass  = "";
var bTopPrint  = 1;
var bLowPrint  = 1;
var bModCont   = 1;
var bAssembly  = 1;
var bCopyCont  = 1;
var bScrRead   = 1;
var bModAnnot  = 1;
var bFillIn    = 1;
var nPDF       = -1;
var aPDF       = [];
var aDlg       = [];

var IDTABTC      = 1000;
var IDCOLLATES   = 1001;
var IDCOLLATEIB  = 1002;
var IDCOLLATEWB  = 1003;
var IDSHUFFLES   = 1004;
var IDSHUFFLEIB  = 1005;
var IDSHUFFLEWB  = 1006;
var IDSPLITS     = 1007;
var IDSPLITALLB  = 1008;
var IDWATERS     = 1009;
var IDWATERALLB  = 1010;
var IDWATERADDS  = 1011;
var IDWATERADDE  = 1012;
var IDWATERBKB   = 1013;
var IDWATERBKMB  = 1014;
var IDWATERSTB   = 1015;
var IDWATERSTMB  = 1016;
var IDWATERPDFS  = 1017;
var IDWATERPDFE  = 1018;
var IDWATERPDFB  = 1019;
var IDWATEROPENB = 1020;
var IDBOOKUTF8B  = 1021;
var IDBOOKEXPB   = 1022;
var IDBOOKIMPB   = 1023;
var IDBOOKTXTE   = 1024;
var IDBOOKTXTB   = 1025;
var IDBOOKOPENB  = 1026;
var IDBOOKHELPB  = 1027;
var IDDATAUTF8B  = 1028;
var IDDATAANNOB  = 1029;
var IDDATAFIELB  = 1030;
var IDDATAINFOB  = 1031;
var IDDATAUPDB   = 1032;
var IDDATATXTE   = 1033;
var IDDATATXTB   = 1034;
var IDDATAOPENB  = 1035;
var IDPDFTKDIRS  = 1036;
var IDPDFTKDIRE  = 1037;
var IDPDFTKDIRB  = 1038;
var IDREADERS    = 1039;
var IDREADERE    = 1040;
var IDREADERB    = 1041;
var IDEDITORS    = 1042;
var IDEDITORE    = 1043;
var IDEDITORB    = 1044;
var IDAFTERS     = 1045;
var IDAFTERCB    = 1046;
var IDKEEPLISTB  = 1047;
var IDKEEPPASSB  = 1048;
var IDPDFLV      = 1049;
var IDADDB       = 1050;
var IDDUPB       = 1051;
var IDREMOVEB    = 1052;
var IDCLEARB     = 1053;
var IDUPB        = 1054;
var IDDOWNB      = 1055;
var IDRANGESB    = 1056;
var IDOPENB      = 1057;
var IDREFRESHB   = 1058;
var IDTOTALS     = 1059;
var IDOUTPDFS    = 1060;
var IDPASSPROTB  = 1061;
var IDOWNERPASS  = 1062;
var IDOWNERPASE  = 1063;
var IDUSERPASS   = 1064;
var IDUSERPASE   = 1065;
var IDTOPPRINTB  = 1066;
var IDLOWPRINTB  = 1067;
var IDMODCONTB   = 1068;
var IDASSEMBLYB  = 1069;
var IDCOPYCONTB  = 1070;
var IDSCRREADB   = 1071;
var IDMODANNOTB  = 1072;
var IDFILLINB    = 1073;
var IDALLPERMB   = 1074;
var IDCREATEB    = 1075;
var IDOPENPDFB   = 1076;
var IDOPENTXTB   = 1077;
var IDOPENDIRB   = 1078;
var IDHELPB      = 1079;
var IDSITEB      = 1080;
var IDEXITB      = 1081;
var IDPROGRESS   = 1082;

aDlg.MinW = Scale.X(793) + oSys.Call("User32::GetSystemMetrics", 7 /*SM_CXFIXEDFRAME*/) * 2;
aDlg.MinH = Scale.Y(460) + oSys.Call("User32::GetSystemMetrics", 8 /*SM_CYFIXEDFRAME*/) * 2 + oSys.Call("User32::GetSystemMetrics", 4 /*SM_CYCAPTION*/);
aDlg.X    = 100;
aDlg.Y    = 100;
aDlg.W    = aDlg.MinW;
aDlg.H    = aDlg.MinH;
aDlg.Max  = 0;

GetLangStrings();
ReadIni();

aDlg[IDTABTC]      = {W: 773, H: 23,        C: "SysTabControl32",   S: 0x50010500 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|TCS_FIXEDWIDTH|TCS_BUTTONS*/};
//Collate
aDlg[IDCOLLATES]   = {T: sTxtCollateDescr,  C: "STATIC",            S: 0x40000000 /*WS_CHILD*/};
aDlg[IDCOLLATEIB]  = {T: sTxtInsertWater,   C: "BUTTON",            S: 0x40010003 /*WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDCOLLATEWB]  = {T: sTxtWatermark,     C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
//Shuffle
aDlg[IDSHUFFLES]   = {T: sTxtShuffleDescr,  C: "STATIC",            S: 0x40000000 /*WS_CHILD*/};
aDlg[IDSHUFFLEIB]  = {T: sTxtInsertWater,   C: "BUTTON",            S: 0x40010003 /*WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDSHUFFLEWB]  = {T: sTxtWatermark,     C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
//Split
aDlg[IDSPLITS]     = {T: sTxtSplitDescr,    C: "STATIC",            S: 0x40000000 /*WS_CHILD*/};
aDlg[IDSPLITALLB]  = {T: sTxtAllDocs,       C: "BUTTON",            S: 0x40010003 /*WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX*/};
//Watermark
aDlg[IDWATERS]     = {T: sTxtWaterDescr,    C: "STATIC",            S: 0x40000000 /*WS_CHILD*/};
aDlg[IDWATERALLB]  = {T: sTxtAllDocs,       C: "BUTTON",            S: 0x40010003 /*WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDWATERADDS]  = {T: sTxtAddToName,     C: "STATIC",            S: 0x40000000 /*WS_CHILD*/};
aDlg[IDWATERADDE]  = {T: sWaterAdd,         C: "EDIT",              S: 0x40010080 /*WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
aDlg[IDWATERBKB]   = {T: sTxtBackgr,        C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDWATERBKMB]  = {T: sTxtMultiBackgr,   C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDWATERSTB]   = {T: sTxtStamp,         C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDWATERSTMB]  = {T: sTxtMultiStamp,    C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDWATERPDFS]  = {T: sTxtWaterPDF,      C: "STATIC",            S: 0x40000000 /*WS_CHILD*/};
aDlg[IDWATERPDFE]  = {T: sWaterPDF,         C: "EDIT",              S: 0x40010080 /*WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
aDlg[IDWATERPDFB]  = {T: "...",             C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
aDlg[IDWATEROPENB] = {T: ">>",              C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
//Bookmarks
aDlg[IDBOOKUTF8B]  = {T: "UTF-8",           C: "BUTTON",            S: 0x40010003 /*WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDBOOKEXPB]   = {T: sTxtExportFrom,    C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDBOOKIMPB]   = {T: sTxtImportTo,      C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDBOOKTXTE]   = {T: sBookTXT,          C: "EDIT",              S: 0x40010080 /*WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
aDlg[IDBOOKTXTB]   = {T: "...",             C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
aDlg[IDBOOKOPENB]  = {T: ">>",              C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
aDlg[IDBOOKHELPB]  = {T: "?",               C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
//PDF info
aDlg[IDDATAUTF8B]  = {T: "UTF-8",           C: "BUTTON",            S: 0x40010003 /*WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDDATAANNOB]  = {T: sTxtDumpAnnots,    C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDDATAFIELB]  = {T: sTxtDumpFields,    C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDDATAINFOB]  = {T: sTxtDumpInfo,      C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDDATAUPDB]   = {T: sTxtUpdateInfo,    C: "BUTTON",            S: 0x40010009 /*WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON*/};
aDlg[IDDATATXTE]   = {T: sDataTXT,          C: "EDIT",              S: 0x40010080 /*WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
aDlg[IDDATATXTB]   = {T: "...",             C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
aDlg[IDDATAOPENB]  = {T: ">>",              C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
//Settings
aDlg[IDPDFTKDIRS]  = {T: sTxtPDFtkDir,      C: "STATIC",            S: 0x40000002 /*WS_CHILD|SS_RIGHT*/};
aDlg[IDPDFTKDIRE]  = {T: sPDFtkDir,         C: "EDIT",              S: 0x40010080 /*WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
aDlg[IDPDFTKDIRB]  = {T: "...",             C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
aDlg[IDREADERS]    = {T: sTxtPDFReader,     C: "STATIC",            S: 0x40000002 /*WS_CHILD|SS_RIGHT*/};
aDlg[IDREADERE]    = {T: sPDFReader,        C: "EDIT",              S: 0x40010080 /*WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
aDlg[IDREADERB]    = {T: "...",             C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
aDlg[IDEDITORS]    = {T: sTxtTXTEditor,     C: "STATIC",            S: 0x40000002 /*WS_CHILD|SS_RIGHT*/};
aDlg[IDEDITORE]    = {T: sTXTEditor,        C: "EDIT",              S: 0x40010080 /*WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
aDlg[IDEDITORB]    = {T: "...",             C: "BUTTON",            S: 0x40010000 /*WS_CHILD|WS_TABSTOP*/};
aDlg[IDAFTERS]     = {T: sTxtAfterCreate,   C: "STATIC",            S: 0x40000000 /*WS_CHILD*/};
aDlg[IDAFTERCB]    = {                      C: "COMBOBOX",          S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|CBS_DROPDOWNLIST*/};
aDlg[IDKEEPLISTB]  = {T: sTxtKeepList,      C: "BUTTON",            S: 0x40010003 /*WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDKEEPPASSB]  = {T: sTxtKeepPass,      C: "BUTTON",            S: 0x40010003 /*WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX*/};
//Source PDF list
aDlg[IDPDFLV]      = {                      C: "SysListView32",     S: 0x5080800D /*WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_REPORT*/};
aDlg[IDADDB]       = {T: sTxtAdd,           C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, K: "Insert"};
aDlg[IDDUPB]       = {T: sTxtDuplicate,     C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, K: "Shift+Insert"};
aDlg[IDREMOVEB]    = {T: sTxtRemove,        C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, K: "Alt+Del"};
aDlg[IDCLEARB]     = {T: sTxtClear,         C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, K: "Shift+Alt+Del"};
aDlg[IDUPB]        = {T: sTxtMoveUp,        C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, K: "Alt+\Up"};
aDlg[IDDOWNB]      = {T: sTxtMoveDown,      C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, K: "Alt+Down"};
aDlg[IDRANGESB]    = {T: sTxtRanges,        C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, K: "Enter"};
aDlg[IDOPENB]      = {T: sTxtOpen,          C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, K: "Ctrl+Enter"};
aDlg[IDREFRESHB]   = {T: sTxtRefresh,       C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/, K: "F5 (F9)"};
aDlg[IDTOTALS]     = {                      C: "STATIC",            S: 0x50000002 /*WS_CHILD|WS_VISIBLE|SS_RIGHT*/};
//Output PDF
aDlg[IDOUTPDFS]    = {T: sTxtOutputPermiss, C: "STATIC",            S: 0x50001001 /*WS_CHILD|WS_VISIBLE|SS_SUNKEN|SS_CENTER*/};
aDlg[IDPASSPROTB]  = {T: sTxtPassProt,      C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDOWNERPASS]  = {T: sTxtOwner,         C: "STATIC",            S: 0x50000002 /*WS_CHILD|WS_VISIBLE|SS_RIGHT*/};
aDlg[IDOWNERPASE]  = {T: sOwnerPass,        C: "EDIT",              S: 0x50010080 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
aDlg[IDUSERPASS]   = {T: sTxtUser,          C: "STATIC",            S: 0x50000002 /*WS_CHILD|WS_VISIBLE|SS_RIGHT*/};
aDlg[IDUSERPASE]   = {T: sUserPass,         C: "EDIT",              S: 0x50010080 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL*/, ES: 0x00000200 /*WS_EX_CLIENTEDGE*/};
aDlg[IDTOPPRINTB]  = {T: sTxtTopPrint,      C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDLOWPRINTB]  = {T: sTxtLowPrint,      C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDMODCONTB]   = {T: sTxtModCont,       C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDASSEMBLYB]  = {T: sTxtAssembly,      C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDCOPYCONTB]  = {T: sTxtCopyCont,      C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDSCRREADB]   = {T: sTxtScrRead,       C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDMODANNOTB]  = {T: sTxtModAnnot,      C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDFILLINB]    = {T: sTxtFillIn,        C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
aDlg[IDALLPERMB]   = {T: sTxtAllPerm,       C: "BUTTON",            S: 0x50010003 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX*/};
//Buttons
aDlg[IDCREATEB]    = {T: sTxtCreateFiles,   C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/};
aDlg[IDOPENPDFB]   = {T: sTxtOpenPDF,       C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/};
aDlg[IDOPENTXTB]   = {T: sTxtOpenTXT,       C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/};
aDlg[IDOPENDIRB]   = {T: sTxtOpenDir,       C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/};
aDlg[IDHELPB]      = {T: sTxtPDFtkHelp,     C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/};
aDlg[IDSITEB]      = {T: sTxtPDFtkSite,     C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/};
aDlg[IDEXITB]      = {T: sTxtExit,          C: "BUTTON",            S: 0x50010000 /*WS_CHILD|WS_VISIBLE|WS_TABSTOP*/};
aDlg[IDPROGRESS]   = {                      C: "msctls_progress32", S: 0x40000000 /*WS_CHILD*/};

AkelPad.ScriptNoMutex(0x11 /*ULT_LOCKSENDMESSAGE|ULT_UNLOCKSCRIPTSQUEUE*/);
AkelPad.WindowRegisterClass(sClass);

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

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

AkelPad.WindowGetMessage();
AkelPad.WindowUnregisterClass(sClass);
oSys.Call("User32::DestroyIcon", hIconSmall);
oSys.Call("User32::DestroyIcon", hIconBig);

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

  if (uMsg == 1 /*WM_CREATE*/)
  {
    hDlg = hWnd;
    InitDlg();
  }

  else if (uMsg == 0x8000 /*WM_APP*/)
  {
    oSys.Call("User32::UpdateWindow", hDlg);

    if (aPDF.length)
      PostMessage(hDlg, 273 /*WM_COMMAND*/, IDREFRESHB, 0);
  }

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

  else if (uMsg == 6 /*WM_ACTIVATE*/)
  {
    if (wParam == 0 /*WA_INACTIVE*/)
      aDlg.Focus = oSys.Call("User32::GetFocus");
  }

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

  else if (uMsg == 36 /*WM_GETMINMAXINFO*/)
  {
    AkelPad.MemCopy(_PtrAdd(lParam, 24), aDlg.MinW, 3 /*DT_DWORD*/); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(lParam, 28), aDlg.MinH, 3 /*DT_DWORD*/); //ptMinTrackSize_y
  }

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

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

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

  else if (uMsg == 15 /*WM_PAINT*/)
    PaintFrames();

  else if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if (wParam == 0x09 /*VK_TAB*/)
    {
      if (Ctrl() && ! Alt())
      {
        if (Shift())
        {
          if (nTab > 0)
            --nTab;
          else
            nTab = 6;
        }
        else
        {
          if (nTab < 6)
            ++nTab;
          else
            nTab = 0;
        }

        PostMessage(aDlg[IDTABTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nTab, 0);
      }
    }
    else if (wParam == 0x70 /*VK_F1*/)
    {
      if (! Ctrl() && ! Shift())
        PDFtkHelp();
    }
    else if ((wParam == 0x74 /*VK_F5*/) || (wParam == 0x78 /*VK_F9*/))
    {
      if (! Ctrl() && ! Shift())
        PostMessage(hDlg, 273 /*WM_COMMAND*/, IDREFRESHB, 0);
    }
    else if (oSys.Call("User32::GetFocus") == aDlg[IDPDFLV].HWND)
    {
      if (wParam == 0x0D /*VK_RETURN*/)
      {
        if (! Alt())
        {
          if (Ctrl() || Shift())
            PostMessage(hDlg, 273 /*WM_COMMAND*/, IDOPENB, 0);
          else
            PostMessage(hDlg, 273 /*WM_COMMAND*/, IDRANGESB, 0);
        }
      }
      else if (wParam == 0x2D /*VK_INSERT*/)
      {
        if (! Ctrl())
          PostMessage(hDlg, 273 /*WM_COMMAND*/, Shift() ? IDDUPB : IDADDB, 0);
      }
      else if (wParam == 0x5D /*VK_APPS*/)
      {
        if (! Ctrl() && ! Shift())
          MenuPDFLV();
      }
    }
  }

  else if (uMsg == 260 /*WM_SYSKEYDOWN*/)
  {
    if (wParam == 13 /*VK_RETURN*/)
    {
      if (! Shift())
        oSys.Call("User32::ShowWindow", hDlg, oSys.Call("User32::IsZoomed", hDlg) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
    }
    else if (oSys.Call("User32::GetFocus") == aDlg[IDPDFLV].HWND)
    {
      if (wParam == 0x2E /*VK_DELETE*/)
        PostMessage(hDlg, 273 /*WM_COMMAND*/, Shift() ? IDCLEARB : IDREMOVEB, 0);
      else if (wParam == 0x26 /*VK_UP*/)
      {
        if (! Shift())
          PostMessage(hDlg, 273 /*WM_COMMAND*/, IDUPB, 0);
      }
      else if (wParam == 0x28 /*VK_DOWN*/)
      {
        if (! Shift())
          PostMessage(hDlg, 273 /*WM_COMMAND*/, IDDOWNB, 0);
      }
    }
  }

  else if (uMsg == 78 /*WM_NOTIFY*/)
  {
    if (wParam == IDTABTC)
    {
      nTab = SendMessage(aDlg[IDTABTC].HWND, 4911 /*TCM_GETCURFOCUS*/, 0, 0);
      EnableControlsDlg();
      SetDefButton(0, IDTABTC);
      SetColumsWidthLV();
      PostMessage(aDlg[IDTABTC].HWND, 4876 /*TCM_SETCURSEL*/, nTab, 0);
    }
    else if (wParam == IDPDFLV)
    {
      switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), 3 /*DT_DWORD*/))
      {
        case -101 : //LVN_ITEMCHANGED
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, 3 /*DT_DWORD*/) & 0x2 /*LVIS_SELECTED*/)
          {
            nPDF = GetCurSelLV(aDlg[IDPDFLV].HWND);
            EnableControlsDlg();
          }
          break;
        case -2 : //NM_CLICK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
            SetCurSelLV(aDlg[IDPDFLV].HWND, GetCurFocLV(aDlg[IDPDFLV].HWND));
          break;
        case -3 : //NM_DBLCLK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
            SetCurSelLV(aDlg[IDPDFLV].HWND, GetCurFocLV(aDlg[IDPDFLV].HWND));
          else
            PostMessage(hDlg, 273 /*WM_COMMAND*/, IDRANGESB, 0);
          break;
        case -5 : //NM_RCLICK
        case -6 : //NM_RDBLCLK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
            SetCurSelLV(aDlg[IDPDFLV].HWND, GetCurFocLV(aDlg[IDPDFLV].HWND));
          SetDefButton();
          if (! (bCreating || bRefreshing))
            MenuPDFLV(_PtrAdd(lParam, _X64 ? 44 : 32) /*NMITEMACTIVATE.ptAction*/);
          break;
      }
    }
  }

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

    if (nID == IDCOLLATEIB)
    {
      bCollateW = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      EnableControlsDlg();
    }

    else if (nID == IDSHUFFLEIB)
    {
      bShuffleW = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      EnableControlsDlg();
    }

    else if ((nID == IDCOLLATEWB) || (nID == IDSHUFFLEWB))
    {
      nTab = 3;
      SendMessage(aDlg[IDTABTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nTab, 0);
      SendMessage(aDlg[IDWATERPDFE].HWND, 177 /*EM_SETSEL*/, 0, -1);
      oSys.Call("User32::SetFocus", aDlg[IDWATERPDFE].HWND);
    }

    else if (nID == IDSPLITALLB)
      bSplitAll = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);

    else if (nID == IDWATERALLB)
    {
      bWaterAll = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      EnableControlsDlg();
    }

    else if (nID == IDWATERADDE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
        sWaterAdd = GetWindowText(lParam);
    }

    else if ((nID >= IDWATERBKB) && (nID <= IDWATERSTMB))
      nWater = nID - IDWATERBKB;

    else if (nID == IDWATERPDFE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
      {
        sWaterPDF = GetWindowText(lParam);
        EnableControlsDlg();
      }
    }

    else if (nID == IDWATERPDFB)
      SetFileName(sTxtSelWaterPDF, "pdf", sWaterPDF, aDlg[IDWATERPDFE].HWND);

    else if (nID == IDWATEROPENB)
      OpenWaterPDF();

    else if (nID == IDBOOKUTF8B)
    {
      bUTF8 = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      SendMessage(aDlg[IDDATAUTF8B].HWND, 241 /*BM_SETCHECK*/, bUTF8, 0);
    }

    else if ((nID == IDBOOKEXPB) || (nID == IDBOOKIMPB))
    {
      nBook = nID - IDBOOKEXPB;
      EnableControlsDlg();
    }

    else if (nID == IDBOOKTXTE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
      {
        sBookTXT = GetWindowText(lParam);
        EnableControlsDlg();
      }
    }

    else if (nID == IDBOOKTXTB)
      SetFileName(sTxtSelBookTXT, "txt", sBookTXT, aDlg[IDBOOKTXTE].HWND);

    else if (nID == IDBOOKOPENB)
      OpenBookTXT();

    else if (nID == IDBOOKHELPB)
      MsgBox(sTxtBookmarksHelp);

    else if (nID == IDDATAUTF8B)
    {
      bUTF8 = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      SendMessage(aDlg[IDBOOKUTF8B].HWND, 241 /*BM_SETCHECK*/, bUTF8, 0);
    }

    else if ((nID >= IDDATAANNOB) && (nID <= IDDATAUPDB))
    {
      nData = nID - IDDATAANNOB;
      EnableControlsDlg();
    }

    else if (nID == IDDATATXTE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
      {
        sDataTXT = GetWindowText(lParam);
        EnableControlsDlg();
      }
    }

    else if (nID == IDDATATXTB)
      SetFileName(sTxtSelDataTXT, "txt", sDataTXT, aDlg[IDDATATXTE].HWND);

    else if (nID == IDDATAOPENB)
      OpenDataTXT();

    else if (nID == IDPDFTKDIRE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
        sPDFtkDir = GetWindowText(lParam);
    }

    else if (nID == IDPDFTKDIRB)
      SetPDFtkDir();

    else if (nID == IDREADERE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
        sPDFReader = GetWindowText(lParam);
    }

    else if (nID == IDREADERB)
      SetFileName(sTxtSelPDFReader, "exe", sPDFReader, aDlg[IDREADERE].HWND);

    else if (nID == IDEDITORE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
        sTXTEditor = GetWindowText(lParam);
    }

    else if (nID == IDEDITORB)
      SetFileName(sTxtSelTXTEditor, "exe", sTXTEditor, aDlg[IDEDITORE].HWND);

    else if (nID == IDAFTERCB)
    {
      if ((nCode == 1 /*CBN_SELCHANGE*/) || (nCode == 8 /*CBN_CLOSEUP*/))
        nAfter = SendMessage(lParam, 327 /*CB_GETCURSEL*/, 0, 0);
    }

    else if (nID == IDKEEPLISTB)
      bSaveList = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);

    else if (nID == IDKEEPPASSB)
      bSavePass = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);

    else if ((nID >= IDADDB) && (nID <= IDREFRESHB))
    {
      if (oSys.Call("User32::IsWindowEnabled", aDlg[nID].HWND))
      {
        if (nID == IDADDB)
          Add();
        else if (nID == IDDUPB)
          Duplicate();
        else if (nID == IDREMOVEB)
          Remove();
        else if (nID == IDCLEARB)
          Clear();
        else if (nID == IDUPB)
          MoveUp();
        else if (nID == IDDOWNB)
          MoveDown();
        else if (nID == IDRANGESB)
          Ranges();
        else if (nID == IDOPENB)
          Open();
        else
          Refresh(1);

        EnableControlsDlg();
      }
    }

    else if (nID == IDPASSPROTB)
    {
      bPassProt = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      EnableControlsDlg();
    }

    else if ((nID == IDOWNERPASE) || (nID == IDUSERPASE))
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
      {
        if (nID == IDOWNERPASE)
          sOwnerPass = GetWindowText(lParam);
        else
          sUserPass = GetWindowText(lParam);
        EnableControlsDlg();
      }
    }

    else if ((nID >= IDTOPPRINTB) && (nID <= IDFILLINB))
    {
      if (nID == IDTOPPRINTB)
        bTopPrint = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      else if (nID == IDLOWPRINTB)
        bLowPrint = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      else if (nID == IDMODCONTB)
        bModCont = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      else if (nID == IDASSEMBLYB)
        bAssembly = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      else if (nID == IDCOPYCONTB)
        bCopyCont = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      else if (nID == IDSCRREADB)
        bScrRead = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      else if (nID == IDMODANNOTB)
        bModAnnot = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      else if (nID == IDFILLINB)
        bFillIn = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);

      EnableControlsDlg();
    }

    else if (nID == IDALLPERMB)
    {
      bTopPrint = bLowPrint = bModCont = bAssembly = bCopyCont = bScrRead = bModAnnot = bFillIn = SendMessage(lParam, 240 /*BM_GETCHECK*/, 0, 0);
      for (i = IDTOPPRINTB; i <= IDFILLINB; ++i)
        SendMessage(aDlg[i].HWND, 241 /*BM_SETCHECK*/, bTopPrint, 0);
    }

    else if (nID == IDCREATEB)
    {
      if (bCreating)
        StopCmd();
      else
        Create();
    }

    else if (nID == IDOPENPDFB)
      OpenPDF();

    else if (nID == IDOPENTXTB)
      OpenTXT();

    else if (nID == IDOPENDIRB)
      OpenFolder();

    else if (nID == IDHELPB)
      PDFtkHelp();

    else if (nID == IDSITEB)
      AkelPad.Exec('rundll32.exe shell32, ShellExec_RunDLL ' + 'https://www.pdflabs.com/tools/pdftk-server');

    else if ((nID == IDEXITB) || (nID == 2 /*IDCANCEL*/))
      PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }

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

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

  return 0;
}

function InitDlg()
{
  var lpTCITEM;
  var lpLVCOLUMN;
  var aText;
  var aFmt;
  var i;

  if (! hMainWnd)
  {
    SendMessage(hDlg, 128 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);
    SendMessage(hDlg, 128 /*WM_SETICON*/, 1 /*ICON_BIG*/,   hIconBig);
  }

  for (i = IDTABTC; i < aDlg.length; ++i)
  {
    aDlg[i].HWND = oSys.Call("User32::CreateWindowExW",
      aDlg[i].ES, //dwExStyle
      aDlg[i].C,  //lpClassName
      aDlg[i].T,  //lpWindowName
      aDlg[i].S,  //dwStyle
      0,          //x
      0,          //y
      aDlg[i].W,  //nWidth
      aDlg[i].H,  //nHeight
      hDlg,       //hWndParent
      i,          //ID
      hInstDLL,   //hInstance
      0);         //lpParam
    SendMessage(aDlg[i].HWND, 48 /*WM_SETFONT*/, hGuiFont, 1);
  }

  //Split
  SendMessage(aDlg[IDSPLITALLB].HWND, 241 /*BM_SETCHECK*/, bSplitAll, 0);

  //Collate
  SendMessage(aDlg[IDCOLLATEIB].HWND, 241 /*BM_SETCHECK*/, bCollateW, 0);

  //Shuffle
  SendMessage(aDlg[IDSHUFFLEIB].HWND, 241 /*BM_SETCHECK*/, bShuffleW, 0);

  //Watermark
  SendMessage(aDlg[IDWATERALLB].HWND, 241 /*BM_SETCHECK*/, bWaterAll, 0);
  SendMessage(aDlg[IDWATERADDE].HWND, 197 /*EM_SETLIMITTEXT*/, 20, 0);
  for (i = IDWATERBKB; i <= IDWATERSTMB; ++i)
    SendMessage(aDlg[i].HWND, 241 /*BM_SETCHECK*/, 0, 0);
  SendMessage(aDlg[IDWATERBKB + nWater].HWND, 241 /*BM_SETCHECK*/, 1, 0);

  //Bookmarks
  SendMessage(aDlg[IDBOOKUTF8B].HWND, 241 /*BM_SETCHECK*/, bUTF8, 0);
  for (i = IDBOOKEXPB; i <= IDBOOKIMPB; ++i)
    SendMessage(aDlg[i].HWND, 241 /*BM_SETCHECK*/, 0, 0);
  SendMessage(aDlg[IDBOOKEXPB + nBook].HWND, 241 /*BM_SETCHECK*/, 1, 0);

  //PDF info
  SendMessage(aDlg[IDDATAUTF8B].HWND, 241 /*BM_SETCHECK*/, bUTF8, 0);
  for (i = IDDATAANNOB; i <= IDDATAUPDB; ++i)
    SendMessage(aDlg[i].HWND, 241 /*BM_SETCHECK*/, 0, 0);
  SendMessage(aDlg[IDDATAANNOB + nData].HWND, 241 /*BM_SETCHECK*/, 1, 0);

  //Settings
  SendMessage(aDlg[IDAFTERCB].HWND, 323 /*CB_ADDSTRING*/, 0, sTxtShowMessage);
  SendMessage(aDlg[IDAFTERCB].HWND, 323 /*CB_ADDSTRING*/, 0, sTxtOpenNewFile);
  SendMessage(aDlg[IDAFTERCB].HWND, 323 /*CB_ADDSTRING*/, 0, sTxtOpenOutDir);
  SendMessage(aDlg[IDAFTERCB].HWND, 334 /*CB_SETCURSEL*/, nAfter, 0);
  SendMessage(aDlg[IDKEEPLISTB].HWND, 241 /*BM_SETCHECK*/, bSaveList, 0);
  SendMessage(aDlg[IDKEEPPASSB].HWND, 241 /*BM_SETCHECK*/, bSavePass, 0);

  //Source PDF list
  lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44 /*sizeof(LVCOLUMN)*/);
  aText      = [AkelPad.MemStrPtr(sTxtSourcePDFs), AkelPad.MemStrPtr(sTxtPageCount), AkelPad.MemStrPtr(sTxtPagesToCopy + "/" + sTxtRotation), AkelPad.MemStrPtr(sTxtOutPages)];
  aFmt       = [0 /*LVCFMT_LEFT*/, 1 /*LVCFMT_RIGHT*/, 0, 1]; //Alignment of the column header

  AkelPad.MemCopy(lpLVCOLUMN, 5 /*LVCF_FMT|LVCF_TEXT*/, 3 /*DT_DWORD*/); //mask
  for (i = 0; i < 4; ++i)
  {
    AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, 4), aFmt[i], 3 /*DT_DWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, _X64 ? 16 : 12), aText[i], 2 /*DT_QWORD*/);
    SendMessage(aDlg[IDPDFLV].HWND, 4193 /*LVM_INSERTCOLUMNW*/, i, lpLVCOLUMN);
  }
  AkelPad.MemFree(lpLVCOLUMN);

  for (i = 0; i < aPDF.length;)
  {
    if (oFSO.FileExists(aPDF[i].F))
    {
      aPDF[i].TP = 0;
      aPDF[i].OP = 0;
      aPDF[i].OR = 0;
      InsertItemLV(aDlg[IDPDFLV].HWND, i++);
    }
    else
      aPDF.splice(i, 1);
  }

  if ((nPDF < 0) && aPDF.length)
    nPDF = 0;
  else if (nPDF >= aPDF.length)
    nPDF = aPDF.length - 1;

  SendMessage(aDlg[IDPDFLV].HWND, 4150 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0, 0x0421 /*LVS_EX_INFOTIP|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES*/);
  SetCurSelLV(aDlg[IDPDFLV].HWND, nPDF);

  //Output PDF
  SendMessage(aDlg[IDOWNERPASE].HWND, 197 /*EM_SETLIMITTEXT*/, 32, 0);
  SendMessage(aDlg[IDUSERPASE].HWND,  197 /*EM_SETLIMITTEXT*/, 32, 0);
  SendMessage(aDlg[IDPASSPROTB].HWND, 241 /*BM_SETCHECK*/, bPassProt, 0);
  SendMessage(aDlg[IDTOPPRINTB].HWND, 241 /*BM_SETCHECK*/, bTopPrint, 0);
  SendMessage(aDlg[IDLOWPRINTB].HWND, 241 /*BM_SETCHECK*/, bLowPrint, 0);
  SendMessage(aDlg[IDMODCONTB].HWND,  241 /*BM_SETCHECK*/, bModCont,  0);
  SendMessage(aDlg[IDASSEMBLYB].HWND, 241 /*BM_SETCHECK*/, bAssembly, 0);
  SendMessage(aDlg[IDCOPYCONTB].HWND, 241 /*BM_SETCHECK*/, bCopyCont, 0);
  SendMessage(aDlg[IDSCRREADB].HWND,  241 /*BM_SETCHECK*/, bScrRead, 0);
  SendMessage(aDlg[IDMODANNOTB].HWND, 241 /*BM_SETCHECK*/, bModAnnot, 0);
  SendMessage(aDlg[IDFILLINB].HWND,   241 /*BM_SETCHECK*/, bFillIn, 0);

  //Progress
  SendMessage(aDlg[IDPROGRESS].HWND, 1028 /*PBM_SETSTEP*/, 1, 0);

  //Tabs
  lpTCITEM = AkelPad.MemAlloc(_X64 ? 40 : 28 /*sizeof(TCITEM)*/);
  aText    = [AkelPad.MemStrPtr(sTxtCollate), AkelPad.MemStrPtr(sTxtShuffle), AkelPad.MemStrPtr(sTxtSplit), AkelPad.MemStrPtr(sTxtWatermark), AkelPad.MemStrPtr(sTxtBookmarks), AkelPad.MemStrPtr(sTxtPDFInfo), AkelPad.MemStrPtr(sTxtSettings)];

  AkelPad.MemCopy(lpTCITEM, 1 /*TCIF_TEXT*/, 3 /*DT_DWORD*/); //mask
  for (i = 0; i < aText.length; ++i)
  {
    AkelPad.MemCopy(_PtrAdd(lpTCITEM, _X64 ? 16 : 12), aText[i], 2 /*DT_QWORD*/); //pszText
    SendMessage(aDlg[IDTABTC].HWND, 4926 /*TCM_INSERTITEMW*/, i, lpTCITEM);
  }
  AkelPad.MemFree(lpTCITEM);
  SendMessage(aDlg[IDTABTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nTab, 0);

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

  aDlg.Focus = aDlg[IDTABTC].HWND;
}

function EnableControlsDlg()
{
  var bOutputPDF = ! ((nTab == 4) && (nBook == 0) || (nTab == 5) && (nData != 3));
  var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44 /*sizeof(LVCOLUMN)*/);
  var lpText     = AkelPad.MemAlloc(128);
  var i;

  oSys.Call("User32::EnableWindow", aDlg[IDTABTC].HWND, ! (bCreating || bRefreshing));

  for (i = IDCOLLATES; i <= IDCOLLATEWB; ++i)
    oSys.Call("User32::ShowWindow", aDlg[i].HWND, nTab == 0);
  oSys.Call("User32::EnableWindow", aDlg[IDCOLLATEIB].HWND, ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDCOLLATEWB].HWND, bCollateW && ! (bCreating || bRefreshing));

  for (i = IDSHUFFLES; i <= IDSHUFFLEWB; ++i)
    oSys.Call("User32::ShowWindow", aDlg[i].HWND, nTab == 1);
  oSys.Call("User32::EnableWindow", aDlg[IDSHUFFLEIB].HWND, ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDSHUFFLEWB].HWND, bShuffleW && ! (bCreating || bRefreshing));

  oSys.Call("User32::ShowWindow",   aDlg[IDSPLITS].HWND,    nTab == 2);
  oSys.Call("User32::ShowWindow",   aDlg[IDSPLITALLB].HWND, nTab == 2);
  oSys.Call("User32::EnableWindow", aDlg[IDSPLITALLB].HWND, (aPDF.length > 1) && ! (bCreating || bRefreshing));

  for (i = IDWATERS; i <= IDWATEROPENB; ++i)
    oSys.Call("User32::ShowWindow", aDlg[i].HWND, nTab == 3);
  oSys.Call("User32::EnableWindow", aDlg[IDWATERALLB].HWND, (aPDF.length > 1) && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDWATERADDS].HWND, (aPDF.length > 1) && bWaterAll && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDWATERADDE].HWND, (aPDF.length > 1) && bWaterAll && ! (bCreating || bRefreshing));
  for (i = IDWATERBKB; i <= IDWATERPDFB; ++i)
    oSys.Call("User32::EnableWindow", aDlg[i].HWND, ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDWATEROPENB].HWND, sWaterPDF.length && ! (bCreating || bRefreshing));

  for (i = IDBOOKUTF8B; i <= IDBOOKHELPB; ++i)
    oSys.Call("User32::ShowWindow", aDlg[i].HWND, nTab == 4);
  for (i = IDBOOKUTF8B; i <= IDBOOKIMPB; ++i)
    oSys.Call("User32::EnableWindow", aDlg[i].HWND, ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDBOOKTXTE].HWND,  (nBook == 1) && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDBOOKTXTB].HWND,  (nBook == 1) && ! (bCreating || bRefreshing) );
  oSys.Call("User32::EnableWindow", aDlg[IDBOOKOPENB].HWND, (nBook == 1) && sBookTXT.length && ! (bCreating || bRefreshing) );
  oSys.Call("User32::EnableWindow", aDlg[IDBOOKHELPB].HWND, (nBook == 1) && ! (bCreating || bRefreshing) );

  for (i = IDDATAUTF8B; i <= IDDATAOPENB; ++i)
    oSys.Call("User32::ShowWindow", aDlg[i].HWND, nTab == 5);
  for (i = IDDATAUTF8B; i <= IDDATAUPDB; ++i)
    oSys.Call("User32::EnableWindow", aDlg[i].HWND, ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDDATATXTE].HWND,  (nData == 3) && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDDATATXTB].HWND,  (nData == 3) && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDDATAOPENB].HWND, (nData == 3) && sDataTXT.length && ! (bCreating || bRefreshing));

  for (i = IDPDFTKDIRS; i <= IDKEEPPASSB; ++i)
  {
    oSys.Call("User32::ShowWindow",   aDlg[i].HWND, nTab == 6);
    oSys.Call("User32::EnableWindow", aDlg[i].HWND, ! (bCreating || bRefreshing));
  }

  oSys.Call("User32::EnableWindow", aDlg[IDADDB].HWND,     ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDDUPB].HWND,     aPDF.length && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDREMOVEB].HWND,  aPDF.length && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDCLEARB].HWND,   aPDF.length && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDUPB].HWND,      (nPDF > 0) && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDDOWNB].HWND,    (nPDF < aPDF.length - 1) && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDRANGESB].HWND,  aPDF.length && aPDF[nPDF].TP && ((nTab < 2) || (nTab > 5)) && ! (bCreating || bRefreshing));
  oSys.Call("User32::EnableWindow", aDlg[IDOPENB].HWND,    aPDF.length && ! (bCreating || bRefreshing));
  oSys.Call("User32::ShowWindow",   aDlg[IDREFRESHB].HWND, aPDF.length && (nOutPages < 0) && ! (bCreating || bRefreshing));
  oSys.Call("User32::ShowWindow",   aDlg[IDTOTALS].HWND,   ! (aPDF.length && (nOutPages < 0)));
  if ((nTab < 2) || (nTab > 5))
    SetWindowText(aDlg[IDTOTALS].HWND, sTxtTotalOutPages + ((nOutPages < 0) ? "0" : nOutPages));
  else
    SetWindowText(aDlg[IDTOTALS].HWND, sTxtTotalPages + nTotalPages);

  oSys.Call("User32::EnableWindow", aDlg[IDOUTPDFS].HWND,   bOutputPDF);
  oSys.Call("User32::EnableWindow", aDlg[IDPASSPROTB].HWND, bOutputPDF && ! (bCreating || bRefreshing));
  for (i = IDOWNERPASS; i <= IDALLPERMB; ++i)
    oSys.Call("User32::EnableWindow", aDlg[i].HWND, bOutputPDF && bPassProt && ! (bCreating || bRefreshing));
  SendMessage(aDlg[IDALLPERMB].HWND, 241 /*BM_SETCHECK*/, bTopPrint && bLowPrint && bModCont && bAssembly && bCopyCont && bScrRead && bModAnnot && bFillIn, 0);

  oSys.Call("User32::EnableWindow", aDlg[IDCREATEB].HWND, aPDF.length && ((nTab != 3) || sWaterPDF.length) && ((nTab != 4) || (nBook == 0) || sBookTXT.length) && ((nTab != 5) || (nData != 3) || sDataTXT.length) && (nTab != 6) && ((! bOutputPDF) || (! bPassProt) || sOwnerPass.length || sUserPass.length) && (nOutPages >= 0) && (bCreating || ! bRefreshing));
  SetWindowText(aDlg[IDCREATEB].HWND, bCreating ? sTxtCancel : aDlg[IDCREATEB].T);

  for (i = IDOPENPDFB; i <= IDSITEB; ++i)
    oSys.Call("User32::EnableWindow", aDlg[i].HWND, ! (bCreating || bRefreshing));

  if (aPDF.length)
  {
    if (! (aDlg[IDPDFLV].S & 0x00010000 /*WS_TABSTOP*/))
      aDlg[IDPDFLV].S |= 0x00010000 /*WS_TABSTOP*/;
  }
  else
  {
    if (aDlg[IDPDFLV].S & 0x00010000 /*WS_TABSTOP*/)
      aDlg[IDPDFLV].S ^= 0x00010000 /*WS_TABSTOP*/;
  }
  oSys.Call("User32::SetWindowLongW", aDlg[IDPDFLV].HWND, -16 /*GWL_STYLE*/, aDlg[IDPDFLV].S);

  AkelPad.MemCopy(lpText, sTxtSourcePDFs + (aPDF.length ? " (" + (nPDF + 1) + "/" + aPDF.length + ")" : ""), 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(lpLVCOLUMN, 4 /*LVCF_TEXT*/, 3 /*DT_DWORD*/); //mask
  AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, _X64 ? 16 : 12), lpText, 2 /*DT_QWORD*/);
  SendMessage(aDlg[IDPDFLV].HWND, 4192 /*LVM_SETCOLUMNW*/, 0, lpLVCOLUMN);
  AkelPad.MemFree(lpLVCOLUMN);
  AkelPad.MemFree(lpText);
}



Last edited by KDJ on Sat Aug 06, 2016 12:09 pm; edited 10 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1915
Location: Poland

PostPosted: Fri Mar 13, 2015 8:06 pm    Post subject: Reply with quote

GUI for PDFtk Server - manipulating PDF documents. Part 2.

PDFtk-G_part2.js

Code:
function SetDefButton(nDefID, nFocusID)
{
  var i;

  SendMessage(aDlg[IDCOLLATEWB].HWND,  244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDSHUFFLEWB].HWND,  244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDWATERPDFB].HWND,  244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDWATEROPENB].HWND, 244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDBOOKTXTB].HWND,   244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDBOOKOPENB].HWND,  244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDBOOKHELPB].HWND,  244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDDATATXTB].HWND,   244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDDATAOPENB].HWND,  244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDPDFTKDIRB].HWND,  244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDREADERB].HWND,    244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
  SendMessage(aDlg[IDEDITORB].HWND,    244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);

  for (i = IDADDB; i <= IDREFRESHB; ++i)
    SendMessage(aDlg[i].HWND, 244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);

  for (i = IDCREATEB; i <= IDEXITB; ++i)
    SendMessage(aDlg[i].HWND, 244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);

  if (nDefID)
    SendMessage(aDlg[nDefID].HWND, 244 /*BM_SETSTYLE*/, 1 /*BS_DRFPUSHBUTTON*/, 1);
  if (nFocusID)
    oSys.Call("User32::SetFocus", aDlg[nFocusID].HWND);
}

function ResizeDlg(nW, nH)
{
  var nFlags = 0x14; //SWP_NOACTIVATE|SWP_NOZORDER
  var nX3    = Scale.X(3);
  var nX5    = Scale.X(5);
  var nX10   = Scale.X(10);
  var nX16   = Scale.X(16);
  var nX20   = Scale.X(20);
  var nX70   = Scale.X(70);
  var nX90   = Scale.X(90);
  var nX110  = Scale.X(110);
  var nX130  = Scale.X(130);
  var nX150  = Scale.X(150);
  var nX170  = Scale.X(170);
  var nX200  = Scale.X(200);
  var nX250  = Scale.X(250);
  var nX350  = Scale.X(350);
  var nX400  = Scale.X(400);
  var nX600  = Scale.X(600);
  var nX640  = Scale.X(640);
  var nX750  = Scale.X(750);
  var nY3    = Scale.Y(3);
  var nY5    = Scale.Y(5);
  var nY10   = Scale.Y(10);
  var nY13   = Scale.Y(13);
  var nY16   = Scale.Y(16);
  var nY20   = Scale.Y(20);
  var nY21   = Scale.Y(21);
  var nY23   = Scale.Y(23);
  var nY26   = Scale.Y(26);
  var nX, nY;
  var i;

  oSys.Call("User32::SetWindowPos", aDlg[IDTABTC].HWND, 0,
    nX10,
    nY10,
    nW - nX10 * 2,
    nY23,
    nFlags);
  SendMessage(aDlg[IDTABTC].HWND, 4905 /*TCM_SETITEMSIZE*/, 0, MkLong(Math.floor((nW - nX10 * 2 - nX3 * 8) / 7), nY23));

  //Collate
  nX = Math.round((nW - nX400) / 2);
  oSys.Call("User32::SetWindowPos", aDlg[IDCOLLATES].HWND, 0,
    nX,
    Scale.Y(50),
    nX400,
    nY13 * 3,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDCOLLATEIB].HWND, 0,
    nX,
    Scale.Y(103),
    nX250,
    nY16,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDCOLLATEWB].HWND, 0,
    nX + nX250 + nX5,
    Scale.Y(100),
    nX90,
    nY23,
    nFlags);

  //Shuffle
  nX = Math.round((nW - nX640) / 2);
  oSys.Call("User32::SetWindowPos", aDlg[IDSHUFFLES].HWND, 0,
    nX,
    Scale.Y(50),
    nX640,
    nY13 * 3,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDSHUFFLEIB].HWND, 0,
    nX,
    Scale.Y(103),
    nX250,
    nY16,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDSHUFFLEWB].HWND, 0,
    nX + nX250 + nX5,
    Scale.Y(100),
    nX90,
    nY23,
    nFlags);

  //Split
  nX = Math.round((nW - nX600) / 2);
  oSys.Call("User32::SetWindowPos", aDlg[IDSPLITS].HWND, 0,
    nX,
    Scale.Y(60),
    nX600,
    nY13 * 2,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDSPLITALLB].HWND, 0,
    nX,
    Scale.Y(95),
    nX130,
    nY16,
    nFlags);

  //Watermark
  nX = Math.round((nW - nX750) / 2);
  oSys.Call("User32::SetWindowPos", aDlg[IDWATERS].HWND, 0,
    nX,
    Scale.Y(50),
    nX750,
    nY13,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDWATERALLB].HWND, 0,
    nX,
    Scale.Y(70),
    nX130,
    nY16,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDWATERADDS].HWND, 0,
    nX,
    Scale.Y(90),
    nX90,
    nY13,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDWATERADDE].HWND, 0,
    nX,
    Scale.Y(105),
    nX90,
    nY21,
    nFlags);
  nX += nX130 + nX20;
  for (i = 0; i < 2; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDWATERBKB + i].HWND, 0,
      nX,
      Scale.Y(80) + nY20 * i,
      nX110,
      nY16,
      nFlags);
  nX += nX110 + nX5;
  for (i = 0; i < 2; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDWATERSTB + i].HWND, 0,
      nX,
      Scale.Y(80) + nY20 * i,
      nX90,
      nY16,
      nFlags);
  nX += nX90 + nX5;
  oSys.Call("User32::SetWindowPos", aDlg[IDWATERPDFS].HWND, 0,
    nX,
    Scale.Y(80),
    nX350,
    nY13,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDWATERPDFE].HWND, 0,
    nX,
    Scale.Y(96),
    nX350,
    nY21,
    nFlags);
  for (i = 0; i < 2; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDWATERPDFB + i].HWND, 0,
      nX + nX350 + nX20 * i,
      Scale.Y(95),
      nX20,
      nY23,
      nFlags);

  //Bookmarks
  nX = Math.round((nW - Scale.X(505)) / 2);
  oSys.Call("User32::SetWindowPos", aDlg[IDBOOKUTF8B].HWND, 0,
    nX,
    Scale.Y(50),
    Scale.X(50),
    nY16,
    nFlags);
  nX += Scale.X(80);
  for (i = 0; i < 2; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDBOOKEXPB + i].HWND, 0,
      nX,
      Scale.Y(50) + nY20 * i,
      nX350,
      nY16,
      nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDBOOKTXTE].HWND, 0,
    nX + nX16,
    Scale.Y(90),
    nX350,
    nY21,
    nFlags);
  for (i = 0; i < 3; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDBOOKTXTB + i].HWND, 0,
      nX + nX16 + nX350 + nX20 * i,
      Scale.Y(89),
      nX20,
      nY23,
      nFlags);

  //PDF info
  nX = Math.round((nW - Scale.X(705)) / 2);
  oSys.Call("User32::SetWindowPos", aDlg[IDDATAUTF8B].HWND, 0,
    nX,
    Scale.Y(50),
    Scale.X(50),
    nY16,
    nFlags);
  nX += Scale.X(80);
  for (i = 0; i < 2; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDDATAANNOB + i].HWND, 0,
      nX,
      Scale.Y(50) + nY20 * i,
      nX200,
      nY16,
      nFlags);
  nX += Scale.X(220);
  for (i = 0; i < 2; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDDATAINFOB + i].HWND, 0,
      nX,
      Scale.Y(50) + nY20 * i,
      nX350,
      nY16,
      nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDDATATXTE].HWND, 0,
    nX + nX16,
    Scale.Y(90),
    nX350,
    nY21,
    nFlags);
  for (i = 0; i < 2; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDDATATXTB + i].HWND, 0,
      nX + nX16 + nX350 + nX20 * i,
      Scale.Y(89),
      nX20,
      nY23,
      nFlags);

  //Settings
  nX = Math.round((nW - Scale.X(700)) / 2);
  for (i = 0; i < 3; ++i)
  {
    oSys.Call("User32::SetWindowPos", aDlg[IDPDFTKDIRS + i * 3].HWND, 0,
      nX,
      Scale.Y(55) + nY26 * i,
      nX90,
      nY13,
      nFlags);
    oSys.Call("User32::SetWindowPos", aDlg[IDPDFTKDIRE + i * 3].HWND, 0,
      nX + nX90 + nX3,
      Scale.Y(51) + nY26 * i,
      nX350,
      nY21,
      nFlags);
    oSys.Call("User32::SetWindowPos", aDlg[IDPDFTKDIRB + i * 3].HWND, 0,
      nX + nX90 + nX3 + nX350,
      Scale.Y(50) + nY26 * i,
      nX20,
      nY23,
      nFlags);
  }
  nX += Scale.X(530),
  oSys.Call("User32::SetWindowPos", aDlg[IDAFTERS].HWND, 0,
    nX,
    Scale.Y(45),
    nX170,
    nY13,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDAFTERCB].HWND, 0,
    nX,
    Scale.Y(60),
    nX170,
    Scale.Y(100),
    nFlags);
  for (i = 0; i < 2; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDKEEPLISTB + i].HWND, 0,
      nX,
      Scale.Y(91) + nY20 * i,
      nX170,
      nY16,
      nFlags);

  //Source PDFs
  nY = Scale.Y(150);
  oSys.Call("User32::SetWindowPos", aDlg[IDPDFLV].HWND, 0,
    nX10,
    nY,
    nW - nX10 * 2,
    nH - Scale.Y(154) - nY5 * 2 - nY23 - nY,
    nFlags);
  nY = nH - Scale.Y(154) - nY5 - nY23;
  for (i = 0; i < 8; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDADDB + i].HWND, 0,
      nX10 + nX5 + (nX70 + nX3) * i,
      nY,
      nX70,
      nY23,
      nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDREFRESHB].HWND, 0,
    nW - nX10 - nX5 - nX70,
    nY,
    nX70,
    nY23,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDTOTALS].HWND, 0,
    nW - nX10 - nX5 - (nX150 + nX10),
    nY + nY5,
    nX150 + nX10,
    nY13,
    nFlags);

  //Output PDF - permissions
  nX = Math.round((nW - nX70 - 3 - nX150 * 4 - nX10 * 8) / 2);
  nY = nH - Scale.Y(136) + nY13;
  oSys.Call("User32::SetWindowPos", aDlg[IDOUTPDFS].HWND, 0,
    (nW - nX200) / 2,
    nY - nY13 - nY5,
    nX200,
    nY16,
    nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDPASSPROTB].HWND, 0,
    nX + nX70 + nX3,
    nY,
    nX150,
    nY16,
    nFlags);
  for (i = 0; i < 2; ++i)
  {
    oSys.Call("User32::SetWindowPos", aDlg[IDOWNERPASS + i * 2].HWND, 0,
      nX,
      nY + nY20 + nY26 * i + nY3,
      nX70,
      nY13,
      nFlags);
    oSys.Call("User32::SetWindowPos", aDlg[IDOWNERPASE + i * 2].HWND, 0,
      nX + nX70 + nX3,
      nY + nY20 + nY26 * i,
      nX150,
      nY21,
      nFlags);
  }
  nX += nX70 + nX3 + nX150 + nX10 * 6;
  nY += nY13;
  for (i = 0; i < 9; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[IDTOPPRINTB + i].HWND, 0,
      nX + (nX150 + nX10) * Math.floor(i / 3),
      nY + nY20 * (i % 3),
      nX150,
      nY16,
      nFlags);

  //buttons
  oSys.Call("User32::SetWindowPos", aDlg[IDCREATEB].HWND, 0,
    nX10,
    nH - nY10 - nY26,
    nX90,
    nY26,
    nFlags);
  for (i = IDOPENPDFB; i <= IDEXITB; ++i)
    oSys.Call("User32::SetWindowPos", aDlg[i].HWND, 0,
      nW - nX10 - nX90 * (IDEXITB - i + 1) - nX5 * (IDEXITB - i),
      nH - nY10 - nY26,
      nX90,
      nY26,
      nFlags);
  oSys.Call("User32::SetWindowPos", aDlg[IDPROGRESS].HWND, 0,
    nX10 + nX90 + nX5,
    nH - nY10 - nY26,
    Scale.X(105),
    nY26,
    nFlags);

  SetColumsWidthLV();
  SendMessage(aDlg[IDPDFLV].HWND, 4115 /*LVM_ENSUREVISIBLE*/, nPDF, false);
  oSys.Call("user32::InvalidateRect", hDlg, 0, true);
}

function PaintFrames()
{
  var lpPaint = AkelPad.MemAlloc(_X64 ? 72 : 64 /*sizeof(PAINTSTRUCT)*/);
  var lpRect  = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
  var hDC     = oSys.Call("User32::BeginPaint", hDlg, lpPaint);
  var nW, nH;

  oSys.Call("User32::GetClientRect", hDlg, lpRect);
  nW = AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/);
  nH = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/);

  if (! (oSys.Call("User32::IsZoomed", hDlg) || oSys.Call("User32::IsIconic", hDlg)))
  {
    AkelPad.MemCopy(_PtrAdd(lpRect, 0), nW - oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/), 3 /*DT_DWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpRect, 4), nH - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), 3 /*DT_DWORD*/);
    oSys.Call("User32::DrawFrameControl", hDC, lpRect, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/);
  }

  AkelPad.MemCopy(_PtrAdd(lpRect,  0), Scale.X(10), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect,  4), Scale.Y(33), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect,  8), nW - Scale.X(10), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect, 12), Scale.Y(135), 3 /*DT_DWORD*/);
  oSys.Call("User32::DrawEdge", hDC, lpRect, 0x9 /*EDGE_BUMP*/, 0x800F /*BF_MONO|BF_RECT*/);

  AkelPad.MemCopy(_PtrAdd(lpRect,  4), Scale.Y(150), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect, 12), nH - Scale.Y(154), 3 /*DT_DWORD*/);
  oSys.Call("User32::DrawEdge", hDC, lpRect, 0x9 /*EDGE_BUMP*/, 0x800F /*BF_MONO|BF_RECT*/);

  AkelPad.MemCopy(_PtrAdd(lpRect,  4), nH - Scale.Y(136), 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRect, 12), nH - Scale.Y(46),  3 /*DT_DWORD*/);
  oSys.Call("User32::DrawEdge", hDC, lpRect, 0x9 /*EDGE_BUMP*/, 0x800F /*BF_MONO|BF_RECT*/);

  oSys.Call("User32::EndPaint", hDlg, lpPaint);

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

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

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

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

  AkelPad.MemFree(lpRect);
}

function GetWindowText(hWnd)
{
  var sText    = "";
  var nTextLen = SendMessage(hWnd, 14 /*WM_GETTEXTLENGTH*/, 0, 0);
  var lpText;

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

  return sText;
}

function SetWindowText(hWnd, sText)
{
  SendMessage(hWnd, 12 /*WM_SETTEXT*/, 0, sText.toString());
}

function ReplaceEditText(hWnd, sText)
{
  SendMessage(hWnd, 177 /*EM_SETSEL*/, 0, -1);
  SendMessage(hWnd, 194 /*EM_REPLACESEL*/, 1, sText);
  SendMessage(hWnd, 177 /*EM_SETSEL*/, 0, -1);
}

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

  SendMessage(hWnd, 4110 /*LVM_GETITEMRECT*/, nItem, lpRect);
  oSys.Call("User32::ClientToScreen", hWnd, lpRect);
  oSys.Call("User32::ClientToScreen", hWnd, _PtrAdd(lpRect, 8));

  oRect.X1 = AkelPad.MemRead(_PtrAdd(lpRect,  0), 3 /*DT_DWORD*/);
  oRect.Y1 = AkelPad.MemRead(_PtrAdd(lpRect,  4), 3 /*DT_DWORD*/);
  oRect.X2 = AkelPad.MemRead(_PtrAdd(lpRect,  8), 3 /*DT_DWORD*/);
  oRect.Y2 = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/);

  AkelPad.MemFree(lpRect);
}

function GetCurFocLV(hWnd)
{
  return SendMessage(hWnd, 4108 /*LVM_GETNEXTITEM*/, -1, 0x1 /*LVNI_FOCUSED*/)
}

function GetCurSelLV(hWnd)
{
  return SendMessage(hWnd, 4108 /*LVM_GETNEXTITEM*/, -1, 0x2 /*LVNI_SELECTED*/);
}

function SetCurSelLV(hWnd, nItem)
{
  var lpLVITEM = AkelPad.MemAlloc(_X64 ? 72 : 60 /*sizeof(LVITEM)*/);

  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x3, 3 /*DT_DWORD*/); //state=LVIS_SELECTED|LVIS_FOCUSED
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16),  -1, 3 /*DT_DWORD*/); //stateMask
  SendMessage(hWnd, 4139 /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
  SendMessage(hWnd, 4115 /*LVM_ENSUREVISIBLE*/, nItem, 0);

  AkelPad.MemFree(lpLVITEM);
}

function InsertItemLV(hWnd, nItem, sText)
{
  var lpText   = AkelPad.MemAlloc(512 * 2);
  var lpLVITEM = AkelPad.MemAlloc(_X64 ? 72 : 60 /*sizeof(LVITEM)*/);

  AkelPad.MemCopy(lpText, (hWnd == aDlg[IDPDFLV].HWND) ? aPDF[nItem].F : sText, 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 0),              0x0001, 3 /*DT_DWORD*/); //mask=LVIF_TEXT
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 4),               nItem, 3 /*DT_DWORD*/); //iItem
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 24 : 20), lpText, 2 /*DT_QWORD*/); //pszText
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 32 : 24),   1024, 3 /*DT_DWORD*/); //cchTextMax
  SendMessage(hWnd, 4173 /*LVM_INSERTITEMW*/, 0, lpLVITEM);

  if (hWnd == aDlg[IDPDFLV].HWND)
  {
    AkelPad.MemCopy(lpText, aPDF[nItem].TP ? aPDF[nItem].TP.toString() : "?", 1 /*DT_UNICODE*/);
    AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), 1, 3 /*DT_DWORD*/); //iSubItem
    SendMessage(hWnd, 4212 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);

    AkelPad.MemCopy(lpText, aPDF[nItem].R ? aPDF[nItem].R.substr(0, 511) : sTxtAll, 1 /*DT_UNICODE*/);
    AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), 2, 3 /*DT_DWORD*/); //iSubItem
    SendMessage(hWnd, 4212 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);

    AkelPad.MemCopy(lpText, aPDF[nItem].OP.toString(), 1 /*DT_UNICODE*/);
    AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8), 3, 3 /*DT_DWORD*/); //iSubItem
    SendMessage(hWnd, 4212 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);
  }

  AkelPad.MemFree(lpText);
  AkelPad.MemFree(lpLVITEM);
}

function SetItemTextLV(hWnd, nItem, nSubItem, sText)
{
  var lpText   = AkelPad.MemAlloc(512 * 2);
  var lpLVITEM = AkelPad.MemAlloc(_X64 ? 72 : 60 /*sizeof(LVITEM)*/);

  AkelPad.MemCopy(lpText, sText.toString().substr(0, 511), 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 0),              0x0001, 3 /*DT_DWORD*/); //mask=LVIF_TEXT
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8),            nSubItem, 3 /*DT_DWORD*/); //iSubItem
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 24 : 20), lpText, 2 /*DT_QWORD*/); //pszText
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 32 : 24),   1024, 3 /*DT_DWORD*/); //cchTextMax

  SendMessage(hWnd, 4212 /*LVM_SETITEMTEXTW*/, nItem, lpLVITEM);

  AkelPad.MemFree(lpText);
  AkelPad.MemFree(lpLVITEM);
}

function DeleteItemLV(hWnd, nItem)
{
  SendMessage(hWnd, 4104 /*LVM_DELETEITEM*/, nItem, 0);
}

function SetColumsWidthLV()
{
  var oRect  = {};
  var aWidth = [0, Scale.X(75), 0, 0];
  var i;

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

  if ((nTab < 2) || (nTab == 6))
  {
    aWidth[2] = Scale.X(190);
    aWidth[3] = Scale.X(105);
  }

  aWidth[0] = oRect.W - oSys.Call("User32::GetSystemMetrics", 2 /*SM_CXVSCROLL*/) - aWidth[1] - aWidth[2] - aWidth[3];

  for (i = 0; i <= 3; ++i)
    SendMessage(aDlg[IDPDFLV].HWND, 4126 /*LVM_SETCOLUMNWIDTH*/, i, aWidth[i]);
}

function IsPDFtkExists()
{
  var sDir = sPDFtkDir ? sPDFtkDir : sScriptDir;

  sPDFtkExe = sDir + ((sDir.slice(-1) == "\\") ? "" : "\\") + "pdftk.exe";

  if (oFSO.FileExists(sPDFtkExe))
    return true;

  nTab = 6;
  SendMessage(aDlg[IDTABTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nTab, 0);
  SendMessage(aDlg[IDPDFTKDIRE].HWND, 177 /*EM_SETSEL*/, 0, -1);
  oSys.Call("User32::SetFocus", aDlg[IDPDFTKDIRE].HWND);
  MsgBox(sPDFtkExe + "\n\n" + sTxtNoFile);

  return false;
}

function IsReaderExists()
{
  var bExists = true;
  var sFile;

  if (! oFSO.FileExists(sPDFReader))
  {
    if (sFile = GetAssocString(".pdf"))
    {
      sPDFReader = sFile;
      ReplaceEditText(aDlg[IDREADERE].HWND, sPDFReader);
    }
    else
    {
      bExists = false;
      nTab    = 6;

      SendMessage(aDlg[IDTABTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nTab, 0);
      SendMessage(aDlg[IDREADERE].HWND, 177 /*EM_SETSEL*/, 0, -1);
      oSys.Call("User32::SetFocus", aDlg[IDREADERE].HWND);
      MsgBox(sTxtNoPDFReader);
    }
  }

  return bExists;
}

function IsEditorExists()
{
  var bExists = true;
  var sFile;

  if (! oFSO.FileExists(sTXTEditor))
  {
    if (hMainWnd)
    {
      sTXTEditor = GetAkelExe();
      ReplaceEditText(aDlg[IDEDITORE].HWND, sTXTEditor);
    }
    else if (sFile = GetAssocString(".txt"))
    {
      sTXTEditor = sFile;
      ReplaceEditText(aDlg[IDEDITORE].HWND, sTXTEditor);
    }
    else
    {
      bExists = false;
      nTab    = 6;

      SendMessage(aDlg[IDTABTC].HWND, 4912 /*TCM_SETCURFOCUS*/, nTab, 0);
      SendMessage(aDlg[IDEDITORE].HWND, 177 /*EM_SETSEL*/, 0, -1);
      oSys.Call("User32::SetFocus", aDlg[IDEDITORE].HWND);
      MsgBox(sTxtNoTXTEditor);
    }
  }

  return bExists;
}

function GetAssocString(sStr)
{
  var sFile  = "";
  var lpFile = AkelPad.MemAlloc(260 * 2);;
  var lpSize = AkelPad.MemAlloc(4);

  AkelPad.MemCopy(lpSize, 260, 3 /*DT_DWORD*/);

  if (oSys.Call("Shlwapi::AssocQueryStringW", 0, 2 /*ASSOCSTR_EXECUTABLE*/, sStr, "open", lpFile, lpSize) == 0 /*S_OK*/)
    sFile = AkelPad.MemRead(lpFile, 1 /*DT_UNICODE*/);

  AkelPad.MemFree(lpFile);
  AkelPad.MemFree(lpSize);

  return sFile;
}

function GetAkelExe()
{
  var lpFile = AkelPad.MemAlloc(260 * 2);
  var sFile;

  oSys.Call("Kernel32::GetModuleFileNameW", 0, lpFile, 260);
  sFile = AkelPad.MemRead(lpFile, 1 /*DT_UNICODE*/);
  AkelPad.MemFree(lpFile);

  return sFile;
}

function SetPDFtkDir()
{
  var oRect = {};
  var sDir;

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

  if (sDir = BrowseForFolder(sPDFtkDir, "\n" + sTxtSelPDFtkDir, oRect.X, oRect.Y + oRect.H + 3))
  {
    ReplaceEditText(aDlg[IDPDFTKDIRE].HWND, sDir);
    SetDefButton(0, IDPDFTKDIRE);
  }
}

function SetFileName(sTitle, sExt, sFile, hWndEdit)
{
  var oRect = {};

  GetWindowPos(hWndEdit, oRect);

  if (sFile = GetOpenSaveFileName(0, sTitle, sExt, sFile, 0, oRect.X, oRect.Y + oRect.H + 3))
  {
    ReplaceEditText(hWndEdit, sFile);
    oSys.Call("User32::SetFocus", hWndEdit);
    SetDefButton();
  }
}

function OpenWaterPDF()
{
  if (oFSO.FileExists(sWaterPDF))
  {
    if (IsReaderExists())
      AkelPad.Exec('"' + sPDFReader + '" "' + sWaterPDF + '"');
  }
  else
  {
    SendMessage(aDlg[IDWATERPDFE].HWND, 177 /*EM_SETSEL*/, 0, -1);
    SetDefButton(0, IDWATERPDFE);
    MsgBox(sWaterPDF + "\n\n" + sTxtNoFile);
  }
}

function OpenBookTXT()
{
  if (oFSO.FileExists(sBookTXT))
  {
    if (IsEditorExists())
      AkelPad.Exec('"' + sTXTEditor + '" "' + sBookTXT + '"');
  }
  else
  {
    SendMessage(aDlg[IDBOOKTXTE].HWND, 177 /*EM_SETSEL*/, 0, -1);
    SetDefButton(0, IDBOOKTXTE);
    MsgBox(sBookTXT + "\n\n" + sTxtNoFile);
  }
}

function OpenDataTXT()
{
  if (oFSO.FileExists(sDataTXT))
  {
    if (IsEditorExists())
      AkelPad.Exec('"' + sTXTEditor + '" "' + sDataTXT + '"');
  }
  else
  {
    SendMessage(aDlg[IDDATATXTE].HWND, 177 /*EM_SETSEL*/, 0, -1);
    SetDefButton(0, IDDATATXTE);
    MsgBox(sDataTXT + "\n\n" + sTxtNoFile);
  }
}

function MenuPDFLV(lpPoint)
{
  var MF_STRING = 0x0000;
  var MF_GRAYED = 0x0001;
  var hMenu     = oSys.Call("User32::CreatePopupMenu");
  var oRect;
  var nX, nY;
  var nCmd;
  var i;

  //menu from mouse r-click
  if (lpPoint)
  {
    oSys.Call("User32::ClientToScreen", aDlg[IDPDFLV].HWND, lpPoint);
    nX = AkelPad.MemRead(_PtrAdd(lpPoint, 0), 3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(_PtrAdd(lpPoint, 4), 3 /*DT_DWORD*/);
  }
  //menu from keyboard
  else
  {
    oRect = {};
    GetWindowPos(aDlg[IDPDFLV].HWND, oRect);
    nX = oRect.X + (oRect.W - Scale.X(200)) / 2;
    GetItemRectLV(aDlg[IDPDFLV].HWND, nPDF, oRect);
    nY = oRect.Y2;
  }

  for (i = IDADDB; i <= IDOPENB; ++i)
    oSys.Call("User32::AppendMenuW", hMenu, oSys.Call("User32::IsWindowEnabled", aDlg[i].HWND) ? MF_STRING : MF_GRAYED, i, aDlg[i].T + "\t" + aDlg[i].K);

  oSys.Call("user32::AppendMenuW", hMenu, 0x0800 /*MF_SEPARATOR*/, 0);
  oSys.Call("User32::AppendMenuW", hMenu, aPDF.length ? MF_STRING : MF_GRAYED, IDREFRESHB, aDlg[IDREFRESHB].T + "\t" + aDlg[IDREFRESHB].K);

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

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

  if (nCmd)
    PostMessage(hDlg, 273 /*WM_COMMAND*/, nCmd, 0);
}

function Add()
{
  var oRect = {};
  var sDir  = "";
  var aFile;
  var i;

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

  if (aPDF.length)
    sDir = oFSO.GetParentFolderName(aPDF[nPDF].F);

  aFile = GetOpenSaveFileName(0, sTxtSelSourcePDFs, "pdf", sDir, 1, null, oRect.Y + Scale.X(20));

  if (aFile.length)
  {
    nOutPages = -1;
    nPDF      = aPDF.length;

    for (i = 0; i < aFile.length; ++i)
    {
      aPDF.push({F: aFile[i], R: "", P: "", TP: 0, OP: 0, OR: 0});
      InsertItemLV(aDlg[IDPDFLV].HWND, aPDF.length - 1);
    }

    SetCurSelLV(aDlg[IDPDFLV].HWND, nPDF);
    Refresh();
  }
}

function Duplicate()
{
  if (nOutPages >= 0)
  {
    nTotalPages += aPDF[nPDF].TP;
    nOutPages   += aPDF[nPDF].OP;
    nOutRanges  += aPDF[nPDF].OR;
  }

  aPDF.splice(nPDF + 1, 0, {F: aPDF[nPDF].F, R: aPDF[nPDF].R, P: aPDF[nPDF].P, TP: aPDF[nPDF].TP, OP: aPDF[nPDF].OP, OR: aPDF[nPDF].OR});
  InsertItemLV(aDlg[IDPDFLV].HWND, ++nPDF);
  SetCurSelLV(aDlg[IDPDFLV].HWND, nPDF);
}

function Remove()
{
  if (nOutPages >= 0)
  {
    nTotalPages -= aPDF[nPDF].TP;
    nOutPages   -= aPDF[nPDF].OP;
    nOutRanges  -= aPDF[nPDF].OR;
  }

  aPDF.splice(nPDF, 1);
  DeleteItemLV(aDlg[IDPDFLV].HWND, nPDF);

  if (nPDF >= aPDF.length)
    --nPDF;

  SetCurSelLV(aDlg[IDPDFLV].HWND, nPDF);

  if (! aPDF.length)
  {
    nTotalPages = 0;
    nOutPages   = -1;
    nOutRanges  = 0;
    SetDefButton(IDADDB, IDADDB);
  }
}

function Clear()
{
  nTotalPages = 0;
  nOutPages   = -1;
  nOutRanges  = 0;
  nPDF        = -1;
  aPDF.length = 0;

  SendMessage(aDlg[IDPDFLV].HWND, 4105 /*LVM_DELETEALLITEMS*/, 0, 0);
  SetCurSelLV(aDlg[IDPDFLV].HWND, nPDF);
  SetDefButton(IDADDB, IDADDB);
}

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

  aPDF.splice(nPDF - 1, 0, {F: aPDF[nPDF].F, R: aPDF[nPDF].R, P: aPDF[nPDF].P, TP: aPDF[nPDF].TP, OP: aPDF[nPDF].OP, OR: aPDF[nPDF].OR});
  aPDF.splice(nPDF + 1, 1);
  DeleteItemLV(aDlg[IDPDFLV].HWND, nPDF--);
  InsertItemLV(aDlg[IDPDFLV].HWND, nPDF);
  SetCurSelLV(aDlg[IDPDFLV].HWND, nPDF);

  if ((nPDF == 0) && (hFocus == aDlg[IDUPB].HWND))
    SetDefButton(IDDOWNB, IDDOWNB);
}

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

  aPDF.splice(nPDF + 2, 0, {F: aPDF[nPDF].F, R: aPDF[nPDF].R, P: aPDF[nPDF].P, TP: aPDF[nPDF].TP, OP: aPDF[nPDF].OP, OR: aPDF[nPDF].OR});
  aPDF.splice(nPDF, 1);
  DeleteItemLV(aDlg[IDPDFLV].HWND, nPDF++);
  InsertItemLV(aDlg[IDPDFLV].HWND, nPDF);
  SetCurSelLV(aDlg[IDPDFLV].HWND, nPDF);

  if ((nPDF == aPDF.length - 1) && (hFocus == aDlg[IDDOWNB].HWND))
    SetDefButton(IDUPB, IDUPB);
}



Last edited by KDJ on Wed Nov 04, 2015 8:00 pm; edited 5 times in total
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3 ... 18, 19, 20, 21, 22  Next
Page 19 of 22

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


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