Scripts collection

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

Post by KDJ »

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=25700#p25700
// 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&hilit=#p25621
  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&hilit=#p25591
  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.

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

Post by KDJ »

Code: Select all

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.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

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


Image



Image


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

Image
.

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

Code: Select all

// === autoInsertTab.js === http://akelpad.sourceforge.net/forum/viewtopic.php?p=26347#p26347
// (с) 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#p19641


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);
}

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

Post by Instructor »

Paste text preserving leading spaces.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=26373#p26373
// 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.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Code: Select all

// === [autoInsertQuotes.js] ===
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=26484#p26484
// 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#p11382
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#p19641
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.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

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

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=26918#p26918
// 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";
  }
}


Code: Select all

"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.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

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

Image
Image


Code: Select all

// [createSelectedFile.js]
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=26939#p26939
// 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#p11382
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.

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

Post by Instructor »

Show sessions menu for open.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27098#p27098
// 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.

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

Post by KDJ »

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27171#p27171
// 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.

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

Post by KDJ »

Code: Select all

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.

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

Post by Instructor »

Align text in one line or column selection.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27218#p27218
// 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 "";
}

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

Post by KDJ »

Interface language files for FindReplaceFiles.js

Code: Select all

/************************************
FindReplaceFiles.js - ver. 2018-11-06
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

Code: Select all

/************************************
FindReplaceFiles.js - ver. 2018-11-06
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

Code: Select all

/************************************
FindReplaceFiles.js - ver. 2018-11-06
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

Code: Select all

/*******************************************************
FindReplaceFiles.js - ver. 2018-11-06
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

Code: Select all

/**************************************
FindReplaceFiles.js - ver. 2018-11-06
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   = "在结果中";
sTxtSearch      = "搜索";
sTxtReplace     = "替换(&R)";
sTxtHistory     = "历史记录(&H)";
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        = "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 Tue Nov 06, 2018 7:34 pm, edited 5 times in total.

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

Post by Instructor »

Detect codepage by extension or by file content.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27664#p27664
// 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;
}

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

Post by KDJ »

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=27750#p27750
// 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.

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

Post by KDJ »

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

Code: Select all

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.
Post Reply