Scripts collection

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

Cycling between specified font settings.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18482#p18482
// cpFontSwitch.js 	ver.1.6 	2012-07-19
// Cycling between specified font settings.
// Usage: Call("Scripts::Main", 1, "cpFontSwitch.js", `m [n1] [t1] [s1] [ [n2] [t2] [s2] [n3] [t3] [s3]  ...]`)
//    m - options mask, integer 1...7:
//      0x001 (1)  -  process font name
//      0x010 (2)  -  process font type
//      0x100 (4)  -  process font size
//    n - font name, in quotes
//    t - font type:
//      1 - normal
//      2 - bold
//      3 - italic
//      4 - bold italic
//    s - font size
// Examples:
//     Call("Scripts::Main", 1, "cpFontSwitch.js", `2 1 2 3`)
//        Switch font between normal/bold/italic.
//     Call("Scripts::Main", 1, "cpFontSwitch.js", `6 1 10 2 12`)
//        Switch between normal font(size 10) and bold font(size 12).
//     Call("Scripts::Main", 1, "cpFontSwitch.js", `7 "MS Sans Serif" 1 8 "Courier New" 2 10`)
//        Switch between normal "MS Sans Serif"(size 8) and bold "Courier New"(size 10).
//     Call("Scripts::Main", 1, "cpFontSwitch.js", `5 "MS Sans Serif" 8 "Courier New" 10 "Arial" 9`)
//        Switch between "MS Sans Serif"(size 8), "Courier New"(size 10) and "Arial"(size 9).

var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var lpLogFont;
var pFontName = "";
var nWeight;
var bItalic;
var nFontType;
var nFontSize;
var i;
var oMask;
var rowLen;
var colLen;

if (hMainWnd && hWndEdit && IsIntRng(0, 0, 1, 7) && (lpLogFont = AkelPad.MemAlloc(92 /*sizeof(LOGFONTW)*/)))		///////////////////
{
   AkelPad.SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, hWndEdit, lpLogFont);
   pFontName = AkelPad.MemRead(lpLogFont + 28 /*offsetof(LOGFONTW, lfFaceName)*/, 1 /*DT_UNICODE*/);
   nWeight = AkelPad.MemRead(lpLogFont + 16 /*offsetof(LOGFONTW, lfWeight)*/, 3 /*DT_DWORD*/);
   bItalic = AkelPad.MemRead(lpLogFont + 20 /*offsetof(LOGFONTW, lfItalic)*/, 5 /*DT_BYTE*/);
   nFontSize = AkelPad.SendMessage(hWndEdit, 3188 /*AEM_GETCHARSIZE*/, 3 /*AECS_POINTSIZE*/, 0);
   AkelPad.MemFree(lpLogFont);
   if (pFontName && nWeight && nFontSize)													///////////////////
   {
      if (nWeight < 600)											////
         nFontType = 1;
       else
         nFontType = 2;
      if (bItalic)
         nFontType += 2;
      oMask = WScript.Arguments(0);								////
      i = oMask;
      for (colLen=0; i!=0; ++colLen)
         i &= ~(-i);
      rowLen = (WScript.Arguments.Length - 1) / colLen;
      if (IsIntRng(1, rowLen, 1))
      {
         for (i; i < rowLen; ++i)										////
         {
            if  (((!(1 & oMask)) || ((1 & oMask) && (pFontName == WScript.Arguments(i * colLen + 1)))) && ((!(2 & oMask)) || ((2 & oMask) && (nFontType == WScript.Arguments(i * colLen + 1 + (1 & oMask))))) && ((!(4 & oMask)) || ((4 & oMask) && (nFontSize == WScript.Arguments(i * colLen + 1 + (1 & oMask) + ((2 & oMask) >> 1))))))
               break;
         }
         if (++i >= rowLen) i=0;
         if (1 & oMask)    pFontName = WScript.Arguments(i * colLen + 1);		////
         if (2 & oMask)    nFontType = WScript.Arguments(i * colLen + 1 + (1 & oMask));
         if (4 & oMask)    nFontSize = WScript.Arguments(i * colLen + 1 + (1 & oMask) + ((2 & oMask) >> 1));
         if (isNaN(pFontName) && IsIntRng(1, nFontType, 1, 4) && IsIntRng(1, nFontSize, 0))
         {
            AkelPad.Font(pFontName, nFontType, nFontSize);
         }
      }
   }
}

function IsIntRng(aMod, aNum, aFrom, aTo)   //aMod: 0 - aNum is script argument namber, 1 - aNum is namber
{
   var aValue;
   if (aMod&1)
      aValue = aNum;
   else if (WScript.Arguments.length > aNum)
      aValue = +WScript.Arguments(aNum);
   if ((Math.floor(aValue) == aValue) && (aValue >= aFrom) && ((aTo === undefined) || (aValue <= aTo)))
      return true; 
   return false;
}
Last edited by Visitor7 on Thu Jul 19, 2012 2:18 pm, edited 9 times in total.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

Advanced Undo/Redo manipulation.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18578#p18578
// UndoMax.js      v1.3 lite      2012-06-27
// Undo all changes made after document opening:
//         Call("Scripts::Main", 1, "UndoMax.js")
//     or Call("Scripts::Main", 1, "UndoMax.js", "0")
// Undo all changes made since the last save. The same result would Reopen (F5), but need confirmation:
//         Call("Scripts::Main", 1, "UndoMax.js", "1")
// Redo all changes:
//         Call("Scripts::Main", 1, "UndoMax.js", "2")
//
// Advanced usage:  Call("Scripts::Main", 1, "UndoMax.js", "[s[ l]]")
//    s - settings, integer 1...7:
//        b001 (1)  -  undo mode			(0 - after opening, 1 - last/no save)
//        b010 (2)  -  undo/redo switch	(0 - undo, 1 - redo)
//        b100 (4)  -  report				(0 - do nothing, 1 - show the number of actions performed upon script completion)
//    l - limit, specified number of undo/redo actions.
// Examples:
//    Call("Scripts::Main", 1, "UndoMax.js", "0 10")
//        Try to repeat undo 10 times.
//    Call("Scripts::Main", 1, "UndoMax.js", "6 7")
//        Try to repeat redo 7 times with report.
//    Call("Scripts::Main", 1, "UndoMax.js", "1 15")
//        Try to repeat undo 15 times within the last save.
//    Call("Scripts::Main", 1, "UndoMax.js", "4")
//        Undo all with report.

var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();
var uSettings = 0;
var limit = Number.MAX_VALUE;
var aNamber;
var aReport = "";

if (hMainWnd && hWndEdit)
{
  if(WScript.Arguments.length > 0)
    uSettings = WScript.Arguments(0);
  if(WScript.Arguments.length > 1)
    limit = WScript.Arguments(1);
  aNamber = (uSettings&2)?uniRedo(limit):uniUndo((uSettings&1), limit);
  aReport += (uSettings&2)?"Redo":"Undo";
  aReport += " actions: " + aNamber;
  if (uSettings&4)
    AkelPad.MessageBox(hMainWnd, aReport, "UndoMax.js", 64 /*MB_OK, MB_ICONINFORMATION*/);
}

function uniUndo(mod, lim)
{
  var n = 0;
  if (((!(mod&1)) && AkelPad.SendMessage(hWndEdit, 3075 /*AEM_CANUNDO*/, 0, 0)) || (AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0) && (mod&1)))
  {
    SetRedraw(hWndEdit, false);
    AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, true);
    while (AkelPad.SendMessage(hWndEdit, 3075 /*AEM_CANUNDO*/, 0, 0))
    {
      if ( (!AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0) && (mod&1)) || (n >= lim) )
        break;
      AkelPad.SendMessage(hWndEdit, 3077 /*AEM_UNDO*/, 0, 0);
      ++n;
    }
    AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, false);
    SetRedraw(hWndEdit, true);
  } 
  return n;
}

function uniRedo(lim)
{
  var n = 0;
  if (AkelPad.SendMessage(hWndEdit, 3076 /*AEM_CANREDO*/, 0, 0))
  {
    SetRedraw(hWndEdit, false);
    AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, true);
    while (AkelPad.SendMessage(hWndEdit, 3076 /*AEM_CANREDO*/, 0, 0))
    {
      if (n >= lim)
        break;
      AkelPad.SendMessage(hWndEdit, 3078 /*AEM_REDO*/, 0, 0);
      ++n;
    }
    AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, false);
    SetRedraw(hWndEdit, true);
  } 
  return n;
}

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


Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18575#p18575
// UndoMax.js      v1.3      2012-06-27		(En/Ru)
// Advanced Undo/Redo manipulation.
//
// Usage:  Call("Scripts::Main", 1, "UndoMax.js", "[s[ l[ p]]]")
//    s - settings, integer 0...31, default 0:
//        b00001 (1)  -   undo mode			(0 - after opening, 1 - last/no save)
//        b00010 (2)  -   undo/redo switch		(0 - undo, 1 - redo)
//        b00100 (4)  -   report				(0 - do nothing, 1 - show the number of actions performed upon script completion)
//        b01000 (8)  -   prompt				(0 - do nothing, 1 - request command arguments at startup)
//        b10000 (16) -  shiftkeys			(0 - enable, 1 - disable. use to avoid conflict if you call the script through hot key combination with shift)
//        The report and the prompt can also be activated by shift keys holding in moment of script startup(or by pressing during a pause after startup):
//        Report - left shift key.  Prompt - right shift key. 
//    l - limit, specified number of undo/redo actions. Default 0 - maximum actions.
//    p - waiting time of shift pressing after startup, in milliseconds, default 0. Use when calling the script through hot key combination and want to use the shift keys.
// Examples:
//    Call("Scripts::Main", 1, "UndoMax.js", "0")  or  Call("Scripts::Main", 1, "UndoMax.js") 
//         Undo all changes made after document opening.
//    Call("Scripts::Main", 1, "UndoMax.js", "1")
//         Undo all changes made since the last save. The same result would Reopen (F5), but need confirmation.
//    Call("Scripts::Main", 1, "UndoMax.js", "2")
//         Redo all changes.
//    Call("Scripts::Main", 1, "UndoMax.js", "1 10")
//         Try to repeat undo 10 times within the last saved.
//    Call("Scripts::Main", 1, "UndoMax.js", "6 7")
//         Try to repeat redo 7 times with report.
//    Call("Scripts::Main", 1, "UndoMax.js", "4") 
//         Undo all changes made after document opening with report.
//    Call("Scripts::Main", 1, "UndoMax.js", "28")
//        Prompt with report.
//    Call("Scripts::Main", 1, "UndoMax.js", "1 0 250")
//        Undo all(last save) with a pause 250 ms, for example, to assign hot key combination Alt+U to be able to use the shift keys .

var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();
var uSettings = 0;
var limit = 0;
var aNamber;
var aReport = "";
var rKey = 0;
var pKey = 0;
var usPause = 0;

if (hMainWnd && hWndEdit)
{
  if(WScript.Arguments.length > 0)
     uSettings = WScript.Arguments(0);
  if(WScript.Arguments.length > 1)
     limit = WScript.Arguments(1);
  if(WScript.Arguments.length > 2)
     usPause = WScript.Arguments(2);
  WScript.Sleep(usPause);
  if (!(uSettings&16))
     {
      pKey = oSys.Call("user32::GetAsyncKeyState", 161/*VK_RSHIFT*/);
      rKey = oSys.Call("user32::GetAsyncKeyState", 160/*VK_LSHIFT*/);
     }
  if ((uSettings&8) || (pKey<0))
    {
     var cpResult = AkelPad.InputBox(hMainWnd, "UndoMax.js", GetLangString(0) + (uSettings&3) + " " + limit + ")", "")
     if (cpResult) 
        {
         var arrResult = cpResult.split(' ');
         if (arrResult[0])   uSettings = ((uSettings&4) | arrResult[0]);
         if (arrResult[1])   limit = arrResult[1];
         else limit = 0;
        }
     else if (cpResult === undefined) 
         WScript.Quit();
    }
  if (limit == 0) limit = Number.MAX_VALUE;
  aNamber = (uSettings&2)?uniRedo(limit):uniUndo((uSettings&1), limit);
  if ((uSettings&4) || (rKey<0))
    {
     aReport += (uSettings&2)?"Redo":"Undo";
     aReport += GetLangString(1) + aNamber;
     AkelPad.MessageBox(hMainWnd, aReport, "UndoMax.js", 64 /*MB_OK, MB_ICONINFORMATION*/);
    }
}

function uniUndo(mod, lim)
{
  var n = 0;
  if (((!(mod&1)) && AkelPad.SendMessage(hWndEdit, 3075 /*AEM_CANUNDO*/, 0, 0)) || (AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0) && (mod&1)))
  {
    SetRedraw(hWndEdit, false);
    AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, true);
    while (AkelPad.SendMessage(hWndEdit, 3075 /*AEM_CANUNDO*/, 0, 0))
    {
      if ( (!AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0) && (mod&1)) || (n >= lim) )
        break;
      AkelPad.SendMessage(hWndEdit, 3077 /*AEM_UNDO*/, 0, 0);
      ++n;
    }
    AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, false);
    SetRedraw(hWndEdit, true);
  }
  return n;
}

function uniRedo(lim)
{
  var n = 0;
  if (AkelPad.SendMessage(hWndEdit, 3076 /*AEM_CANREDO*/, 0, 0))
  {
    SetRedraw(hWndEdit, false);
    AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, true);
    while (AkelPad.SendMessage(hWndEdit, 3076 /*AEM_CANREDO*/, 0, 0))
    {
      if (n >= lim)
        break;
      AkelPad.SendMessage(hWndEdit, 3078 /*AEM_REDO*/, 0, 0);
      ++n;
    }
    AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, false);
    SetRedraw(hWndEdit, true);
  }
  return n;
}

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

function GetLangString(nStringID)
{
  var nLangID=AkelPad.GetLangId(1 /*LANGID_PRIMARY*/);
  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u0412\u0432\u0435\u0434\u0438\u0442\u0435\u0020\u043D\u043E\u0432\u044B\u0435\u0020\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B\u003A\u0020\u0053\u0020\u005B\u004C\u005D\u000D\u000A\u0053\u0020\u002D\u0020\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u0020\u0028\u0030\u0020\u002D\u0020\u0075\u006E\u0064\u006F\u003B\u0020\u0031\u0020\u002D\u0020\u0075\u006E\u0064\u006F\u0020\u0434\u043E\u0020\u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F\u003B\u0020\u0032\u0020\u002D\u0020\u0072\u0065\u0064\u006F\u0029\u000D\u000A\u004C\u0020\u002D\u0020\u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\u0020\u043F\u043E\u0432\u0442\u043E\u0440\u043E\u0432\u0020\u0028\u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0020\u0435\u0441\u043B\u0438\u0020\u043D\u0435\u0020\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\u0029\u000D\u000A\u0028\u004F\u004B\u0020\u002D\u0020\u0442\u0435\u043A\u0443\u0449\u0438\u0435\u002E\u0020\u0043\u0061\u006E\u0063\u0065\u006C\u0020\u002D\u0020\u0432\u044B\u0445\u043E\u0434\u002E\u0020\u0422\u0435\u043A\u0443\u0449\u0438\u0435\u003A\u0020";
    if (nStringID == 1)
      return "\u0020\u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E\u003A\u0020";
  }
  else
  {
    if (nStringID == 0)
      return "Enter new script arguments: A [N]\nA - action (0 - undo; 1 - undo last save; 2 - redo)\nN - reiteration number (maximum if not specified)\n(OK - current, Cancel - exit. Current: ";
    if (nStringID == 1)
      return " actions: ";
  }
  return "";
}

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

Hide tabbar if one tab.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18632#p18632
// AutohideTab.js    ver.2.8    2012-07-19
// Hide tabbar if one tab.
//    Opens files in the current tab if the Alt key holded or the left mouse button pressed.
//    Can open files in the current tab by default, by pressing Alt or LMB in a new tab.
// Usage: Call ("Scripts::Main", 1, "AutohideTab.js"[, "s [p]"])
//    Second call closes the script.
//    s - settings flags, integer 0...15, default 1:
//       b0001 (1) - open files in current tab by default, in new tab if holded Alt.
//       b0010 (2) - don`t restore tabbar on exit.
//       b0100 (4) - if no tabbar on start, then show it at the bottom.
//       b1000 (8) - force tabbar on exit.
//    p - delay time of file opening in milliseconds, default 100:
//       Scripts checks on hold the left mouse button. To give you time to press it after Drag`n`Drop, pause is needed.
//       Example: Call ("Scripts::Main", 1, "AutohideTab.js", "3 120")
// Autorun (in AkelPad.ini or Registry):
//    Add following to "CmdLineBegin": /Call ("Scripts::Main", 1, "AutohideTab.js"[, "s[ p]"])
//
// Скрывает панель вкладок если вкладка одна.
//    Открывает файл в текущей вкладке если удержана клавиша Alt или нажата левая кнопка мыши.
//    Может по умолчанию открывать файлы в текущей вкладке, а по Alt или LMB - в новой.
// Запуск: Call("Scripts::Main", 1, "AutohideTab.js"[, "s[ p]"])
//    Повторный вызов закрывает скрипт.
//    s - флаги установок, целое от 0 до 15, по умолчанию 1:
//       b0001  (1)  -  открывать файлы в текущей вкладке по умолчанию, а если удержана Alt - в новой.
//       b0010  (2)  -  не возвращать состояние строки вкладок при выходе из программы.
//       b0100  (4)  -  если строка вкладок отсутствует в момент запуска скрипта, то показывать ее внизу.
//       b1000  (8)  -  принудительно включать строку вкладок при выходе из программы.
//    p - время задержки открытия файла в миллисекундах, по умолчанию 100:
//       Cкрипт проверяет на удержание левую клавишу мыши, но чтобы вы успели ее нажать после
//       Drag`n`Drop, нужна пауза.
//       Например: Call("Scripts::Main", 1, "AutohideTab.js", "3 120")
// Автозапуск(в AkelPad.ini или реестре):
//    Добавить в строку "CmdLineBegin" следующее: /Call("Scripts::Main", 1, "AutohideTab.js"[, "s[ p]"])

var hMainWnd = AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var pClassName="AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("kernel32::GetCurrentProcessId");
var hInstanceDLL = AkelPad.GetInstanceDll();
var hWnd;
var options = 1;
var pauseOpen = 100;
var tabState;
var tabBottom = false;
var keyAlt;
var mouseLB;
var framesMany;
var framesManyPrev = 2;

if (hMainWnd && AkelPad.IsMDI())
{
   if (AkelPad.WindowRegisterClass(pClassName))
   {
      hWnd = oSys.Call("user32::CreateWindowEx" + _TCHAR, 0, pClassName, 0, 0x80000000/*WS_POPUP*/, 0,0,0,0, hMainWnd, 0, hInstanceDLL, WindowCallback);
      if (hWnd)
      {
         if (AkelPad.WindowSubClass(hMainWnd, AkelPadCallBack,/*AKDN_*/ 1036 /*EDIT_ONFINISH*/, 1035 /*EDIT_ONSTART*/, 1077 /*OPENDOCUMENT_START*/))
         {
             AkelPad.ScriptNoMutex();
             AkelPad.WindowGetMessage();
             AkelPad.WindowUnsubClass(hMainWnd);
         }
         else
            AkelPad.SendMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
      }
      AkelPad.WindowUnregisterClass(pClassName);
   }
   else if (hWnd = oSys.Call("user32::FindWindowEx" + _TCHAR, 0, 0, pClassName, 0))
      AkelPad.SendMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
}

function AkelPadCallBack(hwnd,umsg,wparam,lparam)
{
   if (umsg == 1077 /*AKDN_OPENDOCUMENT_START*/)
   {
      keyAlt = oSys.Call("user32::GetAsyncKeyState", 18 /*VK_MENU*/);
      WScript.Sleep(pauseOpen);
      mouseLB = oSys.Call("user32::GetAsyncKeyState", 1 /*VK_LBUTTON*/);
      if ( (((keyAlt < 0) || (mouseLB < 0)) && (!(options & 1))) || (((keyAlt >= 0) && (mouseLB >= 0)) && (options & 1)) )
          AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
   }
   else if (umsg == 1035 /*AKDN_EDIT_ONSTART*/)
      OneTabHide(1);
   else if (umsg == 1036 /*AKDN_EDIT_ONFINISH*/)
      OneTabHide(0);
   return 0;
}

function WindowCallback(hwnd, umsg, wparam,lparam)
{
   if (umsg == 1 /*WM_CREATE*/)
   {
      options = GetArg(0, options, 0, 15);
      pauseOpen = GetArg(1, pauseOpen, 0);
      tabState = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABoptionsMDI*/, 0);
      if ( (tabState & 4) || ((options & 4)&&(tabState & 1)) )
         tabBottom = true;
      OneTabHide(0);
   }
   else if (umsg == 16 /*WM_CLOSE*/)
   {
      if (((options&8) && (tabBottom)) || ((!(options&2)) && (tabState&4)))
         AkelPad.Command(4302 /*IDM_WINDOW_TABVIEW_BOTTOM*/);
      else if ((!(options&2)) && (tabState&1) && (!(options&8)))
         AkelPad.Command(4303 /*IDM_WINDOW_TABVIEW_NONE*/);
      else if ((!(options&2)) || (options&8))
         AkelPad.Command(4301 /*IDM_WINDOW_TABVIEW_TOP*/);
      oSys.Call("user32::DestroyWindow", hwnd);
   }
   else if (umsg == 2 /*WM_DESTROY*/)
      oSys.Call("user32::PostQuitMessage", 0);
   return 0;
}

function OneTabHide(shift)
{
   framesMany = ((AkelPad.SendMessage(hMainWnd, 1291 /*AKD_FRAMESTATS*/, 0 /*FWS_COUNTALL*/, 0) + shift) > 1)?true:false;
   if (framesMany != framesManyPrev)
   {
      framesManyPrev = framesMany;
      if (framesMany)
      {
         if (tabBottom)    AkelPad.Command(4302 /*IDM_WINDOW_TABVIEW_BOTTOM*/);
         else        AkelPad.Command(4301 /*IDM_WINDOW_TABVIEW_TOP*/);
      }
      else      AkelPad.Command(4303 /*IDM_WINDOW_TABVIEW_NONE*/);
   }
}

function GetArg(aNum, aDef, aFrom, aTo)
{
   if (WScript.Arguments.length > aNum)
   {
      var aValue = +WScript.Arguments(aNum);
      if ((Math.floor(aValue) == aValue) && (aValue >= aFrom) && ((aTo === undefined) || (aValue <= aTo)))
         return aValue;
   }
   return aDef;
}

Offline
Posts: 176
Joined: Sat Dec 24, 2011 4:05 pm

Post by F. Phoenix »

Remaked Vlad's SpacesToTabs script: now it converts only leading spaces and takes more options.

Code: Select all

/* [Ru] Скрипт для преобразования пробелов в начале строки в табуляцию.
// Параметры:
//    /w — переопределить число пробелов в 1 табуляции (формат: /w=число)
//    /s — не подтверждать количество пробелов (по умолчанию перед заменой вылезает диалог)
//    /r — обработка лишних пробелов: /r- — удаление, /r+ — замена на табуляцию (по умолчанию скрипт их не трогает)
*/
/* [En] Convert leading spaces to tabulation.
// Arguments: 
//    /w — set tab width (default is AkelPad's settings; format: /w=number)
//    /s — don't show input box before process
//    /r — residual spaces: /r- — remove, /r+ — make tab (default is ignore)
*/
// Version: F.Phoenix, 2012-08-18a (based on VladSh's SpacesToTabs 2.0)
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=19164#p19164

var CAPTION_AP = "AkelPad -> " + WScript.ScriptName;
var hWndEdit = AkelPad.GetEditWnd();
if (hWndEdit)
{
	// Getting selected text 
	var bTextSelected = true;
	var pSelText = AkelPad.GetSelText();
	if (!pSelText)
	{
		pSelText = AkelPad.GetTextRange(0, -1);
		bTextSelected = false;
	}
	if (!pSelText) WScript.Quit();
	
	// Settings
	var nOptWidth = 0, bOptSilent = false, nOptResidual = 0;
	for (var i = 0; i < WScript.Arguments.length; i++)
	{
		var arg = WScript.Arguments(i);
		if (arg == "/s") bOptSilent = true;
		else if (arg.search(/^\/w=\d+$/) != -1) nOptWidth = arg.substr(3);
		else if (arg.search(/^\/r[\+\-]$/) != -1) nOptResidual = arg.substr(2) + 1;
	}
	var nTabStop = (nOptWidth > 0 ? nOptWidth : AkelPad.SendMessage(hWndEdit, 3239 /*AEM_GETTABSTOP*/ , 0, 0));
	if (!bOptSilent)
	{
		var bRu = (AkelPad.GetLangId(1 /*LANGID_PRIMARY*/) == 0x19);
		nTabStop = AkelPad.InputBox(hWndEdit, CAPTION_AP, (bRu ? "Введите количество пробелов в одном символе табуляции"
		                                                       : "Enter the number of spaces in one tab character"), nTabStop);
		if (isNaN(nTabStop)) //not isNumber
		{
			if (nTabStop) AkelPad.MessageBox(hWndEdit, (bRu ? "Введено нечисловое значение, операция отменена..."
			                                                : "Non-numeric value entered, the operation is canceled..."),
			                                 CAPTION_AP, 48 /*MB_ICONEXCLAMATION*/ ); //press Cancel 
			WScript.Quit();
		}
	}
	
	// Changing text (common part)
	pSelText = pSelText.replace(/^\s+/mg, Replacer);
	if(!bTextSelected) AkelPad.SetSel(0, -1);
	AkelPad.ReplaceSel(pSelText);
}

function Replacer(str)
{
	var nMin = (nOptResidual == 0 ? nTabStop : 1);
	for (var nSpaceCount = nTabStop; nSpaceCount >= nMin; nSpaceCount--)
	{
		var rxSpaces = new RegExp(' {' + nSpaceCount + '}', "g");
		str = str.replace(rxSpaces, (nSpaceCount == nTabStop || nOptResidual == "+1" ? "\t" : ""));
	}
	return str;
}


(Download)

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

Post by Infocatcher »

Code: Select all

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

// (c) Infocatcher 2012, 2014
// version 0.1.0.1 - 2014-04-20

// Close current tab and remove information about it from recent files

// Dependencies:
//   DeleteRecentFile.js
//   http://akelpad.sourceforge.net/forum/viewtopic.php?p=10810#p10810

// Arguments:
//   -file='%f'     - file to forget (or don't specify to use current)
//   -confirm=true  - show confirmation dialog

// Usage in ContextMenu plugin:
//   -"Forget about this tab" Call("Scripts::Main", 1, "forgetAboutTab.js") Icon("%a\AkelFiles\Plugs\RecentFiles.dll", 5)
//   -"Забыть об этой вкладке" Call("Scripts::Main", 1, "forgetAboutTab.js") Icon("%a\AkelFiles\Plugs\RecentFiles.dll", 5)

var file = AkelPad.GetArgValue("file", "") || AkelPad.GetEditFile(0);
var ask  = AkelPad.GetArgValue("confirm", true);
if(file && (!ask || confirm())) {
	WScript.Sleep(50);
	AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
	//WScript.Sleep(50);
	AkelPad.Call("Scripts::Main", 1, "DeleteRecentFile.js", file);
}

function confirm() {
	return AkelPad.MessageBox(
		AkelPad.GetMainWnd(),
		getConfirmText(),
		WScript.ScriptName,
		33 /*MB_OKCANCEL|MB_ICONQUESTION*/
	) == 1 /*IDOK*/;
}
function getConfirmText() {
	switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
		case 0x19: /*ru*/ return "Забыть об этой вкладке?";
		default:   /*en*/ return "Forget about this tab?";
	}
}
<download | mirror | development version>
Close current tab and remove information about it from recent files.
Dependencies: DeleteRecentFile.js
Last edited by Infocatcher on Sun Apr 20, 2014 5:20 pm, edited 2 times in total.

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

Post by Instructor »

Draw tables with pseudographic symbols.

Image


Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=19835#p19835
// Version: 1.4
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Draw tables with pseudographic symbols.
//                    Lines are drawn with Shift/Ctrl/Alt+Arrow key.
//                    Second script call will turn off drawing.
// Description(1049): Рисование таблиц псевдографическими символами.
//                    Линии рисуются клавишами Shift/Ctrl/Alt+Стрелки.
//                    Второй вызов скрипта останавливает рисование.
//
// Arguments:
// -DoubleLine=true  -Draw with double line (default is false).
// -Shift=true       -Lines are drawn with Arrow + Shift key (default is true).
// -Ctrl=true        -Lines are drawn with Arrow + Ctrl key (default is false).
// -Alt=true         -Lines are drawn with Arrow + Alt key (default is false).
//
// Usage:
// Call("Scripts::Main", 1, "DrawLine.js", `-DoubleLine=true -Shift=false -Ctrl=true`)

//Arguments
var bDoubleLine=AkelPad.GetArgValue("DoubleLine", false);
var bShift=AkelPad.GetArgValue("Shift", true);
var bCtrl=AkelPad.GetArgValue("Ctrl", false);
var bAlt=AkelPad.GetArgValue("Alt", false);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hSubClass;
var hScript;
var lpCaretIndex;
var lpLeftIndex;
var lpUpIndex;
var lpRightIndex;
var lpDownIndex;
var nCaretChar;
var nCharInLine;
var nLeftChar;
var nRightChar;
var nUpChar;
var nDownChar;
var nInsertChar;
var dwOptions;
var dwExOptions;
var bMove;
var bInit;
var aCharsConnect;
var aLeftConnect;
var aUpConnect;
var aRightConnect;
var aDownConnect;

if (!bShift && !bCtrl && !bAlt)
{
  AkelPad.MessageBox(hMainWnd, GetLangString(0), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
  WScript.Quit();
}

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 (bDoubleLine)
  {
    aCharsConnect=[9574, 9552, 9559, 9580, 9571, 9577, 9565, 9568, 9553, 9562, 9556];
    aLeftConnect=[9574, 9552, 9559, 9580, 9571, 9577, 9565];
    aUpConnect=[9568, 9580, 9571, 9553, 9562, 9577, 9565];
    aRightConnect=[9556, 9552, 9574, 9568, 9580, 9562, 9577];
    aDownConnect=[9556, 9574, 9559, 9553, 9568, 9580, 9571];
  }
  else
  {
    aCharsConnect=[9516, 9472, 9488, 9532, 9508, 9524, 9496, 9500, 9474, 9492, 9484];
    aLeftConnect=[9516, 9472, 9488, 9532, 9508, 9524, 9496];
    aUpConnect=[9500, 9532, 9508, 9474, 9492, 9524, 9496];
    aRightConnect=[9484, 9472, 9516, 9500, 9532, 9492, 9524];
    aDownConnect=[9484, 9516, 9488, 9474, 9500, 9532, 9508];
  }

  lpCaretIndex=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/);
  lpLeftIndex=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/);
  lpUpIndex=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/);
  lpRightIndex=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/);
  lpDownIndex=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/);

  if (hSubClass=AkelPad.WindowSubClass(2 /*WSC_EDITPROC*/, EditCallback, 256 /*WM_KEYDOWN*/))
  {
    //Allow other scripts running.
    AkelPad.ScriptNoMutex();

    //Message loop
    AkelPad.WindowGetMessage();

    AkelPad.WindowUnsubClass(2 /*WSC_EDITPROC*/);
  }
  AkelPad.MemFree(lpCaretIndex);
  AkelPad.MemFree(lpLeftIndex);
  AkelPad.MemFree(lpUpIndex);
  AkelPad.MemFree(lpRightIndex);
  AkelPad.MemFree(lpDownIndex);
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if (wParam == 0x25 /*VK_LEFT*/ ||
        wParam == 0x26 /*VK_UP*/ ||
        wParam == 0x27 /*VK_RIGHT*/ ||
        wParam == 0x28 /*VK_DOWN*/)
    {
      if ((!bShift || (oSys.Call("user32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000)) &&
          (!bCtrl || (oSys.Call("user32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000)) &&
          (!bAlt || (oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU*/) & 0x8000)))
      {
        dwExOptions=AkelPad.SendMessage(hWnd, 3233 /*AEM_EXGETOPTIONS*/, 0, 0)
        if (!(dwExOptions & 0x4 /*AECOE_OVERTYPE*/))
        {
          AkelPad.SendMessage(hWnd, 3379 /*AEM_LOCKUPDATE*/, 0x2 /*AELU_CARET*/, 1);
          AkelPad.SendMessage(hWnd, 3234 /*AEM_EXSETOPTIONS*/, 2 /*AECOOP_OR*/, 0x4 /*AECOE_OVERTYPE*/);
        }
        dwOptions=AkelPad.SendMessage(hWnd, 3227 /*AEM_GETOPTIONS*/, 0, 0);
        if (!(dwOptions & 0x200 /*AECO_CARETOUTEDGE*/))
          AkelPad.SendMessage(hWnd, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x200 /*AECO_CARETOUTEDGE*/);
        bInit=true;

        for (;;)
        {
          nLeftChar=0;
          nRightChar=0;
          nUpChar=0;
          nDownChar=0;
          bMove=false;

          AkelPad.SendMessage(hWnd, 3130 /*AEM_GETINDEX*/, 5 /*AEGI_CARETCHAR*/, lpCaretIndex);
          nCaretChar=AkelPad.SendMessage(hWnd, 3046 /*AEM_CHARAT*/, lpCaretIndex, 0);
          nCharInLine=AkelPad.MemRead(_PtrAdd(lpCaretIndex, _X64?16:8) /*offsetof(AECHARINDEX, nCharInLine)*/, 3 /*DT_DWORD*/);

          oSys.Call("kernel32::RtlMoveMemory", lpLeftIndex, lpCaretIndex, _X64?24:12 /*sizeof(AECHARINDEX)*/);
          if (AkelPad.SendMessage(hWnd, 3130 /*AEM_GETINDEX*/, 21 /*AEGI_PREVCHARINLINE*/, lpLeftIndex))
            nLeftChar=AkelPad.SendMessage(hWnd, 3046 /*AEM_CHARAT*/, lpLeftIndex, 0);

          oSys.Call("kernel32::RtlMoveMemory", lpRightIndex, lpCaretIndex, _X64?24:12 /*sizeof(AECHARINDEX)*/);
          if (AkelPad.SendMessage(hWnd, 3130 /*AEM_GETINDEX*/, 20 /*AEGI_NEXTCHARINLINE*/, lpRightIndex))
            nRightChar=AkelPad.SendMessage(hWnd, 3046 /*AEM_CHARAT*/, lpRightIndex, 0);

          oSys.Call("kernel32::RtlMoveMemory", lpUpIndex, lpCaretIndex, _X64?24:12 /*sizeof(AECHARINDEX)*/);
          if (AkelPad.SendMessage(hWnd, 3130 /*AEM_GETINDEX*/, 25 /*AEGI_PREVLINE*/, lpUpIndex))
          {
            AkelPad.MemCopy(_PtrAdd(lpUpIndex, _X64?16:8) /*offsetof(AECHARINDEX, nCharInLine)*/, nCharInLine, 3 /*DT_DWORD*/);
            nUpChar=AkelPad.SendMessage(hWnd, 3046 /*AEM_CHARAT*/, lpUpIndex, 0);
          }

          oSys.Call("kernel32::RtlMoveMemory", lpDownIndex, lpCaretIndex, _X64?24:12 /*sizeof(AECHARINDEX)*/);
          if (AkelPad.SendMessage(hWnd, 3130 /*AEM_GETINDEX*/, 24 /*AEGI_NEXTLINE*/, lpDownIndex))
          {
            AkelPad.MemCopy(_PtrAdd(lpDownIndex, _X64?16:8) /*offsetof(AECHARINDEX, nCharInLine)*/, nCharInLine, 3 /*DT_DWORD*/);
            nDownChar=AkelPad.SendMessage(hWnd, 3046 /*AEM_CHARAT*/, lpDownIndex, 0);
          }

          if (wParam == 0x25 /*VK_LEFT*/)
          {
            if (InArray(nDownChar, aUpConnect) && InArray(nUpChar, aDownConnect) && InArray(nRightChar, aLeftConnect))
              nInsertChar=aCharsConnect[3];
            else if (InArray(nDownChar, aUpConnect) && InArray(nRightChar, aLeftConnect))
              nInsertChar=aCharsConnect[0];
            else if (InArray(nUpChar, aDownConnect) && InArray(nRightChar, aLeftConnect))
              nInsertChar=aCharsConnect[5];
            else if (InArray(nDownChar, aUpConnect) && InArray(nUpChar, aDownConnect))
              nInsertChar=aCharsConnect[4];
            else if (InArray(nDownChar, aUpConnect))
              nInsertChar=aCharsConnect[2];
            else if (InArray(nUpChar, aDownConnect))
              nInsertChar=aCharsConnect[6];
            else
              nInsertChar=aCharsConnect[1];
            if (nCaretChar == nInsertChar)
            {
              if (bInit)
              {
                nInsertChar=aCharsConnect[1];
                bMove=true;
              }
              else break;
            }
            if (bMove) AkelPad.SendMessage(hWnd, 3044 /*AEM_KEYDOWN*/, 0x25 /*VK_LEFT*/, 0);
            AkelPad.SendMessage(hWnd, 3045 /*AEM_INSERTCHAR*/, nInsertChar, 0);
            AkelPad.SendMessage(hWnd, 3044 /*AEM_KEYDOWN*/, 0x25 /*VK_LEFT*/, 0);
          }
          else if (wParam == 0x26 /*VK_UP*/)
          {
            if (InArray(nLeftChar, aRightConnect) && InArray(nRightChar, aLeftConnect) && InArray(nDownChar, aUpConnect))
              nInsertChar=aCharsConnect[3];
            else if (InArray(nLeftChar, aRightConnect) && InArray(nDownChar, aUpConnect))
              nInsertChar=aCharsConnect[4];
            else if (InArray(nRightChar, aLeftConnect) && InArray(nDownChar, aUpConnect))
              nInsertChar=aCharsConnect[7];
            else if (InArray(nLeftChar, aRightConnect) && InArray(nRightChar, aLeftConnect))
              nInsertChar=aCharsConnect[5];
            else if (InArray(nLeftChar, aRightConnect))
              nInsertChar=aCharsConnect[6];
            else if (InArray(nRightChar, aLeftConnect))
              nInsertChar=aCharsConnect[9];
            else
              nInsertChar=aCharsConnect[8];
            if (nCaretChar == nInsertChar)
            {
              if (bInit)
              {
                nInsertChar=aCharsConnect[8];
                bMove=true;
              }
              else break;
            }
            if (bMove) AkelPad.SendMessage(hWnd, 3044 /*AEM_KEYDOWN*/, 0x26 /*VK_UP*/, 0);
            AkelPad.SendMessage(hWnd, 3045 /*AEM_INSERTCHAR*/, nInsertChar, 0);
            AkelPad.SendMessage(hWnd, 3044 /*AEM_KEYDOWN*/, 0x25 /*VK_LEFT*/, 0);
          }
          else if (wParam == 0x27 /*VK_RIGHT*/)
          {
            if (InArray(nDownChar, aUpConnect) && InArray(nUpChar, aDownConnect) && InArray(nLeftChar, aRightConnect))
              nInsertChar=aCharsConnect[3];
            else if (InArray(nDownChar, aUpConnect) && InArray(nLeftChar, aRightConnect))
              nInsertChar=aCharsConnect[0];
            else if (InArray(nUpChar, aDownConnect) && InArray(nLeftChar, aRightConnect))
              nInsertChar=aCharsConnect[5];
            else if (InArray(nDownChar, aUpConnect) && InArray(nUpChar, aDownConnect))
              nInsertChar=aCharsConnect[7];
            else if (InArray(nDownChar, aUpConnect))
              nInsertChar=aCharsConnect[10];
            else if (InArray(nUpChar, aDownConnect))
              nInsertChar=aCharsConnect[9];
            else
              nInsertChar=aCharsConnect[1];

            if (nCaretChar == nInsertChar)
            {
              if (bInit)
              {
                nInsertChar=aCharsConnect[1];
                bMove=true;
              }
              else break;
            }
            if (bMove) AkelPad.SendMessage(hWnd, 3044 /*AEM_KEYDOWN*/, 0x27 /*VK_RIGHT*/, 0);
            AkelPad.SendMessage(hWnd, 3045 /*AEM_INSERTCHAR*/, nInsertChar, 0);
            AkelPad.SendMessage(hWnd, 3044 /*AEM_KEYDOWN*/, 0x25 /*VK_LEFT*/, 0);
          }
          else if (wParam == 0x28 /*VK_DOWN*/)
          {
            if (InArray(nLeftChar, aRightConnect) && InArray(nRightChar, aLeftConnect) && InArray(nUpChar, aDownConnect))
              nInsertChar=aCharsConnect[3];
            else if (InArray(nLeftChar, aRightConnect) && InArray(nUpChar, aDownConnect))
              nInsertChar=aCharsConnect[4];
            else if (InArray(nRightChar, aLeftConnect) && InArray(nUpChar, aDownConnect))
              nInsertChar=aCharsConnect[7];
            else if (InArray(nLeftChar, aRightConnect) && InArray(nRightChar, aLeftConnect))
              nInsertChar=aCharsConnect[0];
            else if (InArray(nLeftChar, aRightConnect))
              nInsertChar=aCharsConnect[2];
            else if (InArray(nRightChar, aLeftConnect))
              nInsertChar=aCharsConnect[10];
            else
              nInsertChar=aCharsConnect[8];
            if (nCaretChar == nInsertChar)
            {
              if (bInit)
              {
                nInsertChar=aCharsConnect[8];
                bMove=true;
              }
              else break;
            }
            if (bMove)
            {
              if (!nDownChar) AppendText("\n");
              AkelPad.SendMessage(hWnd, 3044 /*AEM_KEYDOWN*/, 0x28 /*VK_DOWN*/, 0);
            }
            AkelPad.SendMessage(hWnd, 3045 /*AEM_INSERTCHAR*/, nInsertChar, 0);
            AkelPad.SendMessage(hWnd, 3044 /*AEM_KEYDOWN*/, 0x25 /*VK_LEFT*/, 0);
          }
          if (bInit && bMove)
            bInit=false;
          else
            break;
        }
        if (!(dwOptions & 0x200 /*AECO_CARETOUTEDGE*/))
          AkelPad.SendMessage(hWnd, 3228 /*AEM_SETOPTIONS*/, 4 /*AECOOP_XOR*/, 0x200 /*AECO_CARETOUTEDGE*/);
        if (!(dwExOptions & 0x4 /*AECOE_OVERTYPE*/))
        {
          AkelPad.SendMessage(hWnd, 3234 /*AEM_EXSETOPTIONS*/, 4 /*AECOOP_XOR*/, 0x4 /*AECOE_OVERTYPE*/);
          AkelPad.SendMessage(hWnd, 3379 /*AEM_LOCKUPDATE*/, 0x2 /*AELU_CARET*/, false);
          AkelPad.SendMessage(hWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
        }
        AkelPad.WindowNoNextProc(hSubClass);
        return 0;
      }
    }
  }
}

function InArray(nItem, lpArray)
{
  var i;

  for (i=0; i < lpArray.length; ++i)
  {
    if (lpArray[i] == nItem)
      return true;
  }
  return false;
}

function AppendText(pText)
{
  var lpAppend;

  if (lpAppend=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AEAPPENDTEXTW)*/))
  {
    AkelPad.MemCopy(_PtrAdd(lpAppend, 0) /*offsetof(AEAPPENDTEXTW, pText)*/, AkelPad.MemStrPtr(pText), 2 /*DT_QWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpAppend, _X64?8:4) /*offsetof(AEAPPENDTEXTW, dwTextLen)*/, pText.length, 2 /*DT_QWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpAppend, _X64?16:8) /*offsetof(AEAPPENDTEXTW, nNewLine)*/, 1 /*AELB_ASINPUT*/, 3 /*DT_DWORD*/);
    AkelPad.SendMessage(AkelPad.GetEditWnd(), 3028 /*AEM_APPENDTEXTW*/, 0, lpAppend);
    AkelPad.MemFree(lpAppend);
  }
}

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

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

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\x0425\x043E\x0442\x044F\x0020\x0431\x044B\x0020\x043E\x0434\x0438\x043D\x0020\x0438\x0437\x0020\x043C\x043E\x0434\x0438\x0444\x0438\x043A\x0430\x0442\x043E\x0440\x043E\x0432 Ctrl, Shift, Alt \x0434\x043E\x043B\x0436\x0435\x043D\x0020\x0431\x044B\x0442\x044C\x0020\x0432\x043A\x043B\x044E\x0447\x0435\x043D\x002E";
  }
  else
  {
    if (nStringID == 0)
      return "At least one of the modifiers Ctrl, Shift, Alt must be enabled.";
  }
  return "";
}
Last edited by Instructor on Sat Apr 18, 2015 4:21 am, edited 5 times in total.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Отчёты писал и пришлось подсчитывать количество доков в xml, родился маленький, но полезный скриптец по подсчёту суммы чисел в выделенном тексте:

Code: Select all

// Description(1033): The sum of all the numbers contained in the selected text
// Description(1049): Подсчёт суммы всех чисел, содержащихся в выделенном тексте
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=20177#p20177
// Version: 1.2 (2014.12.01)
// Author: VladSh
// 
// Usage:
// 	-"По всему тексту" Call("Scripts::Main", 1, "SumNumbers.js")
// 	-"Только между xml-тэгами" Call("Scripts::Main", 1, "SumNumbers.js", `-qStart="<" -qEnd=">"`)

var str = AkelPad.GetSelText();
if (str) {
	if (WScript.Arguments.length == 2) {
		var qStart = AkelPad.GetArgValue("qStart", "");
		var qEnd = AkelPad.GetArgValue("qEnd", "");
		str = str.replace(new RegExp("[^" + qStart + qEnd + "]*[" + qEnd + "]", "g"), "");
	}
	
	var arr = str.match(/\d+/g);
	if (arr) {
		var sResult = arr[0];
		var nResult = parseInt(sResult);
		for (i = 1; i < arr.length; i++) {
			sResult += " + " + arr[i];
			nResult += parseInt(arr[i]);
		}
		AkelPad.Call("Log::Output", 1, "", "", "", "");	//временный сброс "REPATTERN" и "RETAGS", установленных в диалоге настроек плагина
		AkelPad.Call("Log::Output", 4, sResult + " = " + nResult + "\n", -1, 1);
	}
}
Last edited by VladSh on Wed Jan 14, 2015 10:14 pm, edited 2 times in total.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Code: Select all

/*****************************************************************************
 *  KeySubst.js  v.0.9                                                       *
 *  (C) DV, May-June 2011, Oct 2012                                          *
 *  Thanks to: Instructor, FeyFre                                            *
 *****************************************************************************/
/*  Examples:
     -"En->Ru,Ru->En" Call("Scripts::Main", 1, "KeySubst.js", `-to=rus,eng`)
     -"En->Uk,Uk->En" Call("Scripts::Main", 1, "KeySubst.js", `-to=ukr,eng`)
     -"En->Ru,Uk->Ru" Call("Scripts::Main", 1, "KeySubst.js", `-to=rus,rus`)
     -"En->Uk,Ru->Uk" Call("Scripts::Main", 1, "KeySubst.js", `-to=ukr,ukr`)
     -"En->En,Uk->Ru" Call("Scripts::Main", 1, "KeySubst.js", `-to=eng,rus`)
     -"En->En,Ru->Uk" Call("Scripts::Main", 1, "KeySubst.js", `-to=eng,ukr`)
    To deactivate the script, use Ctrl+~ (VK_CONTROL+VK_OEM_3).
 *****************************************************************************/

var alph = [
 /* eng=0 */ [ "`1234567890-=\\qwertyuiop[]asdfghjkl;\'zxcvbnm,./`",
               "~!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?~",
               // special key combinations...
               "\u0055",
               "\u0055" ],
 /* rus=1 */ [ "ё1234567890-=\\йцукенгшщзхъфывапролджэячсмитьбю.ё",
               "Ё!\"№;%:?*()_+/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё",
               // special key combinations...
               "\u0055",
               "\u0055" ],
 /* ukr=2 */ [ "\'1234567890-=\\йцукенгшщзхїфівапролджєячсмитьбю.ё",
               "\'!\"№;%:?*()_+/ЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄЯЧСМИТЬБЮ,Ё",
               // special key combinations...
               "ґ",
               "Ґ" ]
]; // Note: trailing 'ё' is needed for Ukrainian because of ` to ' hack.

var eng = 0;
var rus = 1;
var ukr = 2;

var default_langTo1 = rus; // rus: En->Ru
var default_langTo2 = eng; // eng: Ru->En,Uk->En
var langTo1 = -1;
var langTo2 = -1;
var argLangTo = getScriptArg("-to").toLowerCase().split(",");
if (argLangTo.length > 0)
{
  langTo1 = getLang(argLangTo[0]);
  if (argLangTo.length > 1)
  {
    langTo2 = getLang(argLangTo[1]);
  }
}
var hWndMain = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();

AkelPad.ScriptNoMutex();

var mutexName = "KeySubst_js_" + hWndMain;
var hMutex;
if (hMutex = oSys.Call("kernel32::CreateMutex" + _TCHAR, 0, 1, mutexName))
{
  if (oSys.GetLastError() == 183 /*ERROR_ALREADY_EXISTS*/)
  {
    oSys.Call("kernel32::CloseHandle", hMutex);
    oSys.Call("user32::SendMessage" + _TCHAR, hWndEdit, 0x0100 /*WM_KEYDOWN*/, 0xC0, 0);
    WScript.Quit();
  }
}

var hEditSubClass;
if (hEditSubClass = AkelPad.WindowSubClass(2 /*WSC_EDITPROC*/, EditCallback))
{
  //Message loop
  AkelPad.WindowGetMessage();

  AkelPad.WindowUnsubClass(2 /*WSC_EDITPROC*/);
  oSys.Call("kernel32::CloseHandle", hMutex);
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x0102 /*WM_CHAR*/)
  {
    var ch = convertSymbolCode(hWnd, wParam, 0);
    if (ch != 0)
    {
      AkelPad.WindowNextProc(hEditSubClass, hWnd, uMsg, ch, lParam);
      AkelPad.SendMessage(hWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
      AkelPad.WindowNoNextProc(hEditSubClass);
      return 1; // processed
    }
  }
  else if ( (uMsg == 0x0100 /*WM_KEYDOWN*/) ||
            (uMsg == 0x0104 /*WM_SYSKEYDOWN*/) )
  {
    var nCtrlState = oSys.Call("user32::GetKeyState", 0x11 /*VK_CONTROL: Ctrl*/);
    var nAltState = oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU: Alt*/)
    var nAltGrState = oSys.Call("user32::GetKeyState", 0xA5 /*VK_RMENU: AltGr*/)

    if (wParam == 0xC0 /*VK_OEM_3: (`~)*/)
    {
      if ((lParam == 0) || ((nCtrlState & 0x80) && !(nAltState & 0x80)))
      {
        //Exit message loop
        oSys.Call("user32::PostQuitMessage", 0);
        return 1; // processed
      }
    }

    var nSet = 0;
    if (((nCtrlState & 0x80) && (nAltState & 0x80)) ||
        (nAltGrState & 0x80))
    {
      nSet = 1;
    }
    // check special key combinations...
    if (nSet != 0)
    {
      var ch = convertSymbolCode(hWnd, wParam, nSet);
      if (ch != 0)
      {
        oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 0x0102 /*WM_CHAR*/, ch, lParam);
        return 1; // processed
      }
    }
  }
  return 0;
}

function convertSymbolCode(hWnd, wParam, nSet)
{
  var nLangId = getEditLangId(hWnd);
  var nLangFrom = eng;
  var nLangTo = (langTo1 == -1) ? default_langTo1 : langTo1;
  if (nLangId == 1049) /* rus */
  {
    nLangFrom = rus;
    nLangTo = (langTo2 == -1) ? default_langTo2 : langTo2;
  }
  else if (nLangId == 1058) /* ukr */
  {
    nLangFrom = ukr;
    nLangTo = (langTo2 == -1) ? default_langTo2 : langTo2;
  }

  if (nLangTo != nLangFrom)
  {
    if (nSet == 0)
    {
      // characters
      var nCase = 0;
      var ch = String.fromCharCode(wParam);
      var i = alph[nLangFrom][nCase].indexOf(ch);
      if (i < 0)
      {
        nCase = 1;
        i = alph[nLangFrom][nCase].indexOf(ch);
      }
      if (i >= 0)
      {
        if (i < alph[nLangTo][nCase].length)
        {
          ch = alph[nLangTo][nCase].charCodeAt(i);
          return ch;
        }
      }
    }
    else
    {
      // codes
      var nShiftState = oSys.Call("user32::GetKeyState", 0x10 /*VK_SHIFT: Shift*/);
      var nCase = (nShiftState & 0x80) ? (2*nSet + 1) : (2*nSet);
      var i;
      for (i = 0; i < alph[nLangFrom][nCase].length; i++)
      {
        if (alph[nLangFrom][nCase].charCodeAt(i) == wParam)
        {
          var ch = alph[nLangTo][nCase].charCodeAt(i);
          if (ch != wParam)
            return ch;
        }
      }
    }
  }
  return 0;
}

function getEditLangId(hEdit)
{
  var nEditThreadId = oSys.Call("user32::GetWindowThreadProcessId", hEdit, 0);
  var nLang = oSys.Call("user32::GetKeyboardLayout", nEditThreadId);
  return (nLang & 0xFFFF);
}

function getLang(s)
{
  var lang = -1;
  if (s == "eng")
    lang = eng;
  else if (s == "rus")
    lang = rus;
  else if (s == "ukr")
    lang = ukr;
  return lang;
}

function getScriptArg(argName)
{
  var s = "";
  argName = argName.toLowerCase();
  for (var n = 0; n < WScript.Arguments.length; n++)
  {
    var t = WScript.Arguments(n);
    var a = t.split("=");
    if (a[0].toLowerCase() == argName)
    {
      s = a[1];
      break;
    }
  }
  return s;
}

Скрипт, который подменяет нажатые клавиши.
* Этот скрипт нужно сохранить как юникодный файл ( в кодировке UTF-16 LE или UTF-8 ) !
В представленном функционале подмена нажатых клавиш имитирует использование русской или украинской раскладки клавиатуры во время работы с английской раскладкой. И наоборот: при работе с русской раскладкой клавиатуры имитируется английская.
Подмена нажатых клавиш не зависит от установленных языков (кроме английского) и работает даже в том случае, если в системе в принципе не установлена ни русская, ни украинская раскладка клавиатуры.
Соответственно, скрипт можно дополнить для поддержки других раскладок.

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

Post by KDJ »

Search files by name/content and replace content - part 1.
Part 2 - in the next post.
Required to include: BrowseForFolder_function.js and FileAndStream_functions.js
All in one: KDJ.zip

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=20235#p20235
// Version: 2018-11-06
// Author: KDJ
//
// *** Search files by name/content and replace content. ***
//
// Usage:
//   Call("Scripts::Main", 1, "FindReplaceFiles.js")
//
// Required to include: BrowseForFolder_function.js, FileAndStream_functions.js
//
// Keyboard and mouse:
//   Alt+F       - set focus to Files list
//   Ctrl+A      - select all items in file list
//   Ctrl+C      - copy selected items from file list
//   Del         - remove selected items from file list (don't delete the files)
//   F4          - open all selected files for editing
//   DoubleClick
//   Ctrl+Enter
//   Shift+Enter - open focused file for editing and select the found text (or close file if is currently edited)
//   Alt+Enter   - maximize/restore window
//   F1          - help for regular expressions or wildcards
//   Alt+Del     - remove item from history list ("Directory", "File:Stream names", "Text in file\stream", "Replace with", "History")

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

if (hDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0))
{
  SetForegroundWindow(hDlg);
  WScript.Quit();
}

if (! (AkelPad.Include("BrowseForFolder_function.js") && AkelPad.Include("FileAndStream_functions.js")))
  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 DT_UNICODE = 1;
var DT_QWORD   = 2;
var DT_DWORD   = 3;
var DT_WORD    = 4;

var hMainWnd   = AkelPad.GetMainWnd();
var hGuiFont   = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var nBkColorRE = 0xA0FFFF;
var hBrush     = oSys.Call("Gdi32::CreateSolidBrush", nBkColorRE);
var nHistTime  = 0;
var nHistMax   = 15;
var nLevelMax  = 27;
var nBufSize   = 1024;
var lpBuffer   = AkelPad.MemAlloc(nBufSize);
var lpLVITEM   = AkelPad.MemAlloc(_X64 ? 72 : 60); //sizeof(LVITEM)
var hParent;
var hFocus;
var bCloseCBL;
var bCloseDlg;

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

var nWndMinW = Scale.X(475);
var nWndMinH = Scale.Y(488);
var oWndPos  = {"X": 240, "Y": 140, "W": nWndMinW, "H": nWndMinH, "Max": 0};

var bPathShow       = 1;
var bSeparateWnd    = 0;
var bKeepHist       = 1;
var bKeepFiles      = 1;
var nPathLen        = 0;
var bSortDesc       = 0;
var nDirLevel       = -1;
var bNameRE         = 0;
var bNotName        = 0;
var bInFiles        = 1;
var bInStreams      = 0;
var bSkipReadOnly   = 0;
var bSkipHidden     = 0;
var bSkipSystem     = 0;
var bInResults      = 0;
var bContentRE      = 0;
var bMatchCase      = 0;
var bMultiline      = 0;
var bNotContain     = 0;
var bSkipBinary     = 1;
var bSkipLarger     = 1;
var nMaxFileSize    = 0;
var sDir            = "";
var sName           = "";
var sContent        = "";
var sReplace        = "";
var sLastContent    = "";
var bLastContentRE  = 0;
var bLastMatchCase  = 0;
var bLastMultiline  = 0;
var bLastNotContain = 0;
var bAfterReplace   = 0;
var aDirs           = [];
var aNames          = [];
var aContents       = [];
var aReplace        = [];
var aFiles          = [];
var aFilesSel       = [0];
var nFilesFoc       = 0;
var aHist           = [];

ReadIni();

var aDlg         = [];
var IDDIRG       = 2000;
var IDDIRCB      = 2001;
var IDCURRENTB   = 2002;
var IDBROWSEB    = 2003;
var IDDIRLEVELS  = 2004;
var IDDIRLEVELCB = 2005;
var IDNAMEG      = 2006;
var IDNAMECB     = 2007;
var IDHELP1B     = 2008;
var IDNAMERE     = 2009;
var IDNOTNAME    = 2010;
var IDINFILES    = 2011;
var IDINSTREAMS  = 2012;
var IDCONTENTG   = 2013;
var IDCONTENTCB  = 2014;
var IDHELP2B     = 2015;
var IDMATCHCASE  = 2016;
var IDCONTENTRE  = 2017;
var IDMULTILINE  = 2018;
var IDNOTCONTAIN = 2019;
var IDSKIPBINARY = 2020;
var IDSKIPLARGER = 2021;
var IDMAXSIZEE   = 2022;
var IDREPLACES   = 2023;
var IDREPLACECB  = 2024;
var IDHELP3B     = 2025;
var IDSKIPG      = 2026;
var IDREADONLY   = 2027;
var IDHIDDEN     = 2028;
var IDSYSTEM     = 2029;
var IDINRESULTS  = 2030;
var IDSEARCHB    = 2031;
var IDREPLACEB   = 2032;
var IDHISTORYB   = 2033;
var IDEDITB      = 2034;
var IDCOPYB      = 2035;
var IDCLEARB     = 2036;
var IDSETTINGSB  = 2037;
var IDCLOSEB     = 2038;
var IDFILELV     = 2039;
var IDSTATUS     = 2040;

//0x50000000=WS_VISIBLE|WS_CHILD
//0x50000002=WS_VISIBLE|WS_CHILD|SS_RIGHT
//0x50000007=WS_VISIBLE|WS_CHILD|BS_GROUPBOX
//0x50000100=WS_VISIBLE|WS_CHILD|SBARS_SIZEGRIP
//0x50010000=WS_VISIBLE|WS_CHILD|WS_TABSTOP
//0x50010042=WS_VISIBLE|WS_CHILD|WS_TABSTOP|CBS_AUTOHSCROLL|CBS_DROPDOWN
//0x50010003=WS_VISIBLE|WS_CHILD|WS_TABSTOP|CBS_DROPDOWNLIST
//0x50010003=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50012002=WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_NUMBER|ES_RIGHT
//0x50810009=WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|LVS_SHOWSELALWAYS|LVS_REPORT
aDlg[IDDIRG      ]={S:0x50000007, C:"BUTTON", T:sTxtDir};
aDlg[IDDIRCB     ]={S:0x50210042, C:"COMBOBOX"}; 
aDlg[IDCURRENTB  ]={S:0x50010000, C:"BUTTON", T:sTxtCurrent};
aDlg[IDBROWSEB   ]={S:0x50010000, C:"BUTTON", T:sTxtBrowse};
aDlg[IDDIRLEVELS ]={S:0x50000002, C:"STATIC", T:sTxtSubDirs};
aDlg[IDDIRLEVELCB]={S:0x50010003, C:"COMBOBOX"};
aDlg[IDNAMEG     ]={S:0x50000007, C:"BUTTON", T:sTxtFileName};
aDlg[IDNAMECB    ]={S:0x50210042, C:"COMBOBOX", Sel1:0, Sel2:-1};
aDlg[IDHELP1B    ]={S:0x50010000, C:"BUTTON", T:"?"};
aDlg[IDNAMERE    ]={S:0x50010003, C:"BUTTON", T:sTxtRegExp};
aDlg[IDNOTNAME   ]={S:0x50010003, C:"BUTTON", T:sTxtNotName};
aDlg[IDINFILES   ]={S:0x50010003, C:"BUTTON", T:sTxtFiles};
aDlg[IDINSTREAMS ]={S:0x50010003, C:"BUTTON", T:sTxtStreams};
aDlg[IDCONTENTG  ]={S:0x50000007, C:"BUTTON", T:sTxtTextInFile};
aDlg[IDCONTENTCB ]={S:0x50210042, C:"COMBOBOX", Sel1:0, Sel2:-1};
aDlg[IDHELP2B    ]={S:0x50010000, C:"BUTTON", T:"?"};
aDlg[IDMATCHCASE ]={S:0x50010003, C:"BUTTON", T:sTxtMatchCase};
aDlg[IDCONTENTRE ]={S:0x50010003, C:"BUTTON", T:sTxtRegExp};
aDlg[IDMULTILINE ]={S:0x50010003, C:"BUTTON", T:sTxtMultiline};
aDlg[IDNOTCONTAIN]={S:0x50010003, C:"BUTTON", T:sTxtNotContain};
aDlg[IDSKIPBINARY]={S:0x50010003, C:"BUTTON", T:sTxtSkipBinary};
aDlg[IDSKIPLARGER]={S:0x50010003, C:"BUTTON", T:sTxtSkipLarger};
aDlg[IDMAXSIZEE  ]={S:0x50012002, C:"EDIT", ES:0x200};
aDlg[IDREPLACES  ]={S:0x50000000, C:"STATIC", T:sTxtReplaceWith};
aDlg[IDREPLACECB ]={S:0x50210042, C:"COMBOBOX", Sel1:0, Sel2:-1};
aDlg[IDHELP3B    ]={S:0x50010000, C:"BUTTON", T:"?"};
aDlg[IDSKIPG     ]={S:0x50000007, C:"BUTTON", T:sTxtSkipFiles};
aDlg[IDREADONLY  ]={S:0x50010003, C:"BUTTON", T:sTxtReadOnly};
aDlg[IDHIDDEN    ]={S:0x50010003, C:"BUTTON", T:sTxtHidden};
aDlg[IDSYSTEM    ]={S:0x50010003, C:"BUTTON", T:sTxtSystem};
aDlg[IDINRESULTS ]={S:0x50010003, C:"BUTTON", T:sTxtInResults};
aDlg[IDSEARCHB   ]={S:0x50010000, C:"BUTTON", T:sTxtSearch};
aDlg[IDREPLACEB  ]={S:0x50010000, C:"BUTTON", T:sTxtReplace};
aDlg[IDHISTORYB  ]={S:0x50010000, C:"BUTTON", T:sTxtHistory};
aDlg[IDEDITB     ]={S:0x50010000, C:"BUTTON", T:sTxtEdit};
aDlg[IDCOPYB     ]={S:0x50010000, C:"BUTTON", T:sTxtCopyList};
aDlg[IDCLEARB    ]={S:0x50010000, C:"BUTTON", T:sTxtClearList};
aDlg[IDSETTINGSB ]={S:0x50010000, C:"BUTTON", T:sTxtSettings};
aDlg[IDCLOSEB    ]={S:0x50010000, C:"BUTTON", T:sTxtClose};
aDlg[IDFILELV    ]={S:0x50810009, C:"SysListView32"};
aDlg[IDSTATUS    ]={S:0x50000100, C:"msctls_statusbar32"};

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

while (! bCloseDlg)
{
  bCloseDlg = true;
  hParent   = bSeparateWnd ? 0 : hMainWnd;
  oWndPos.W = Math.max(Scale.X(oWndPos.W), nWndMinW);
  oWndPos.H = Math.max(Scale.Y(oWndPos.H), nWndMinH);

  SetForegroundWindow(hMainWnd);

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

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

AkelPad.WindowUnregisterClass(sClass);
AkelPad.MemFree(lpBuffer);
AkelPad.MemFree(lpLVITEM);
oSys.Call("Gdi32::DeleteObject", hBrush);
SetForegroundWindow(hMainWnd);

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

  if (uMsg == 1 /*WM_CREATE*/)
  {
    for (i = 2000; 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, 0, 0, 0, //x, y, nWidth, nHeight
        hWnd,       //hWndParent
        i,          //ID
        hInstDLL,   //hInstance
        0);         //lpParam

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

    for (i = IDNAMERE; i <= IDINSTREAMS; ++i)
      aDlg[i].W = GetTextWidth(aDlg[i].T.replace("&", ""), hWnd, hGuiFont) + Scale.X(18);
    for (i = IDMATCHCASE; i <= IDSKIPLARGER; ++i)
      aDlg[i].W = GetTextWidth(aDlg[i].T.replace("&", ""), hWnd, hGuiFont) + Scale.X(18);

    //Get handles to edit/list in ComboBoxes IDNAMECB, IDCONTENTCB and IDREPLACECB
    AkelPad.MemCopy(lpBuffer, _X64 ? 64 : 52 /*sizeof(COMBOBOXINFO)*/, DT_DWORD);
    oSys.Call("User32::GetComboBoxInfo", aDlg[IDNAMECB].HWND, lpBuffer);
    aDlg[IDNAMECB].HWNDEdit = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 48 : 44) /*hwndItem*/, DT_QWORD);
    aDlg[IDNAMECB].HWNDList = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 56 : 48) /*hwndList*/, DT_QWORD);
    oSys.Call("User32::GetComboBoxInfo", aDlg[IDCONTENTCB].HWND, lpBuffer);
    aDlg[IDCONTENTCB].HWNDEdit = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 48 : 44) /*hwndItem*/, DT_QWORD);
    aDlg[IDCONTENTCB].HWNDList = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 56 : 48) /*hwndList*/, DT_QWORD);
    oSys.Call("User32::GetComboBoxInfo", aDlg[IDREPLACECB].HWND, lpBuffer);
    aDlg[IDREPLACECB].HWNDEdit = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 48 : 44) /*hwndItem*/, DT_QWORD);
    aDlg[IDREPLACECB].HWNDList = AkelPad.MemRead(_PtrAdd(lpBuffer, _X64 ? 56 : 48) /*hwndList*/, DT_QWORD);

    SendMessage(aDlg[IDDIRCB    ].HWND, 0x0141 /*CB_LIMITTEXT*/, 256, 0);
    SendMessage(aDlg[IDNAMECB   ].HWND, 0x0141 /*CB_LIMITTEXT*/, 256, 0);
    SendMessage(aDlg[IDCONTENTCB].HWND, 0x0141 /*CB_LIMITTEXT*/, 256, 0);
    SendMessage(aDlg[IDREPLACECB].HWND, 0x0141 /*CB_LIMITTEXT*/, 256, 0);
    SendMessage(aDlg[IDDIRCB    ].HWND, 0x0155 /*CB_SETEXTENDEDUI*/, 1, 0);
    SendMessage(aDlg[IDNAMECB   ].HWND, 0x0155 /*CB_SETEXTENDEDUI*/, 1, 0);
    SendMessage(aDlg[IDCONTENTCB].HWND, 0x0155 /*CB_SETEXTENDEDUI*/, 1, 0);
    SendMessage(aDlg[IDREPLACECB].HWND, 0x0155 /*CB_SETEXTENDEDUI*/, 1, 0);

    SetCheckButtons();
    SetWindowText(aDlg[IDMAXSIZEE].HWND, (nMaxFileSize > 0) ? nMaxFileSize.toString() : "");
    FillCB();
    SetPartsSB();

    SendMessage(aDlg[IDFILELV].HWND, 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0x0020 /*LVS_EX_FULLROWSELECT*/, 0x0020);
    SetColumnLV();
    SetHeaderLV();
    PostMessage(hWnd, 0x8000 /*WM_APP*/, 0, 0);

    hFocus = aDlg[(bInResults && aFiles.length) ? IDCONTENTCB : IDDIRCB].HWND;
  }

  else if (uMsg == 0x8000 /*WM_APP*/)
  {
    SetWindowText(aDlg[IDDIRCB].HWND, sDir);
    SetWindowText(aDlg[IDNAMECB].HWND, sName);
    SetWindowText(aDlg[IDCONTENTCB].HWND, sContent);
    SetWindowText(aDlg[IDREPLACECB].HWND, sReplace);
    SendMessage(hFocus, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(0, -1));
    EnableButtons();
    oSys.Call("User32::UpdateWindow", hWnd);
    SetTextSB(-2);
    FillLV();
    SendMessage(aDlg[IDFILELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nFilesFoc, false);
  }

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

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

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

  else if (uMsg == 36) //WM_GETMINMAXINFO
  {
    AkelPad.MemCopy(_PtrAdd(lParam, 24), nWndMinW, DT_DWORD); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(lParam, 28), nWndMinH, DT_DWORD); //ptMinTrackSize_y
  }

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

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

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

  else if (uMsg == 307 /*WM_CTLCOLOREDIT*/)
  {
    if ((lParam == aDlg[IDNAMECB].HWNDEdit) || (lParam == aDlg[IDCONTENTCB].HWNDEdit) || (lParam == aDlg[IDREPLACECB].HWNDEdit))
    {
      if (((lParam == aDlg[IDNAMECB].HWNDEdit) && bNameRE) || (((lParam == aDlg[IDCONTENTCB].HWNDEdit) || (lParam == aDlg[IDREPLACECB].HWNDEdit)) && bContentRE))
      {
        oSys.Call("Gdi32::SetBkColor", wParam, nBkColorRE);
        return hBrush;
      }
      else
      {
        oSys.Call("Gdi32::SetBkColor", wParam, oSys.Call("User32::GetSysColor", 5 /*COLOR_WINDOW*/));
        return oSys.Call("User32::GetSysColorBrush", 5 /*COLOR_WINDOW*/);
      }
    }
  }

  else if (uMsg == 308 /*WM_CTLCOLORLISTBOX*/)
  {
    if ((lParam == aDlg[IDNAMECB].HWNDList) || (lParam == aDlg[IDCONTENTCB].HWNDList) || (lParam == aDlg[IDREPLACECB].HWNDList))
    {
      if (((lParam == aDlg[IDNAMECB].HWNDList) && bNameRE) || (((lParam == aDlg[IDCONTENTCB].HWNDList) || (lParam == aDlg[IDREPLACECB].HWNDList)) && bContentRE))
      {
        oSys.Call("Gdi32::SetBkColor", wParam, nBkColorRE);
        return hBrush;
      }
      else
      {
        oSys.Call("Gdi32::SetBkColor", wParam, oSys.Call("User32::GetSysColor", 5 /*COLOR_WINDOW*/));
        return oSys.Call("User32::GetSysColorBrush", 5 /*COLOR_WINDOW*/);
      }
    }
  }

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

      if (Ctrl() || Shift())
      {
        if (nID == IDFILELV)
          OpenOrCloseFile();
      }
      else
      {
        if (new Date().getTime() - nHistTime > 100)
        {
          if (nID == IDFILELV)
            PostMessage(hWnd, 273 /*WM_COMMAND*/, IDEDITB, 0);
          else if (IsCloseCB() &&
                   (nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B)   && (nID != IDHELP2B) &&
                   (nID != IDHELP3B)   && (nID != IDSEARCHB) && (nID != IDREPLACEB) && (nID != IDHISTORYB) &&
                   (nID != IDEDITB)    && (nID != IDCOPYB)   && (nID != IDCLEARB)   && (nID != IDSETTINGSB))
            PostMessage(hWnd, 273 /*WM_COMMAND*/, IDSEARCHB, 0);
        }
      }
    }
    else if (wParam == 0x70 /*VK_F1*/)
    {
      if ((! Ctrl()) && (! Shift()))
      {
        hFocus = oSys.Call("User32::GetFocus");

        if (hFocus == aDlg[IDNAMECB].HWNDEdit)
        {
          oSys.Call("User32::SetFocus", aDlg[IDHELP1B].HWND);
          Help(IDHELP1B, 1);
        }
        else if ((hFocus == aDlg[IDCONTENTCB].HWNDEdit) && bContentRE)
        {
          oSys.Call("User32::SetFocus", aDlg[IDHELP2B].HWND);
          Help(IDHELP2B, 1);
        }
        else if ((hFocus == aDlg[IDREPLACECB].HWNDEdit) && bContentRE)
        {
          oSys.Call("User32::SetFocus", aDlg[IDHELP3B].HWND);
          Help(IDHELP3B, 1);
        }
      }
    }
    else if (wParam == 0x73 /*VK_F4*/)
    {
      if ((! Ctrl()) && (! Shift()))
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDEDITB, 0);
    }
  }

  else if (uMsg == 260 /*WM_SYSKEYDOWN*/)
  {
    if (! Shift())
    {
      if (wParam == 0x46 /*F key*/)
          oSys.Call("User32::SetFocus", aDlg[IDFILELV].HWND);
      else if (wParam == 0x0D /*VK_RETURN*/)
        oSys.Call("User32::ShowWindow", hDlg, oSys.Call("User32::IsZoomed", hDlg) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
      else if (wParam == 0x2E /*VK_DELETE*/)
      {
        if (SendMessage(aDlg[IDDIRCB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0))
          DeleteItemCB(aDlg[IDDIRCB].HWND, aDirs);
        else if (SendMessage(aDlg[IDNAMECB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0))
          DeleteItemCB(aDlg[IDNAMECB].HWND, aNames);
        else if (SendMessage(aDlg[IDCONTENTCB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0))
          DeleteItemCB(aDlg[IDCONTENTCB].HWND, aContents);
        else if (SendMessage(aDlg[IDREPLACECB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0))
          DeleteItemCB(aDlg[IDREPLACECB].HWND, aReplace);
      }
    }
  }

  else if ((uMsg == 78 /*WM_NOTIFY*/) && (wParam == IDFILELV))
  {
    switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8) /*code*/, DT_DWORD))
    {
      case -101 : //LVN_ITEMCHANGED
        if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 20) /*uNewState*/, DT_DWORD) & 0x1 /*LVIS_FOCUSED*/)
          SetTextSB(AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD));
        break;

      case -3 : //NM_DBLCLK
        if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) > -1)
        {
          OpenOrCloseFile();
          break;
        }
      case -2 : //NM_CLICK
      case -5 : //NM_RCLICK
      case -6 : //NM_RDBLCLK
        if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, DT_DWORD) == -1)
          SetSelLV(GetCurFocLV());
        break;

      case -155 : //LVN_KEYDOWN
        if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*wVKey*/, DT_WORD) == 0x2E /*VK_DELETE*/)
        {
          if ((! Ctrl()) && (! Shift()) && (! Alt()))
            RemoveFromList();
        }
        else if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12), DT_WORD) == 0x41 /*A key*/)
        {
          if (Ctrl() && (! Shift()) && (! Alt()))
            SetSelAllLV();
        }
        else if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12), DT_WORD) == 0x43 /*C key*/)
        {
          if (Ctrl() && (! Shift()) && (! Alt()))
            CopySelected();
        }
        break;

      case -108 : //LVN_COLUMNCLICK
        bSortDesc = ! bSortDesc;
        nFilesFoc = aFiles.length - GetCurFocLV() - 1;

        GetSelArrayLV();
        aFiles.reverse();
        aFilesSel.reverse();

        for (i = 0; i < aFilesSel.length; ++i)
          aFilesSel[i] = aFiles.length - aFilesSel[i] - 1;

        SetHeaderLV();
        FillLV();
    }
  }

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

    if (nID == IDDIRLEVELCB)
    {
      if (nCode == 1 /*CBN_SELCHANGE*/)
      {
        nDirLevel = SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x0147 /*CB_GETCURSEL*/, 0, 0);
        if (nDirLevel == (SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x0146 /*CB_GETCOUNT*/, 0, 0) - 1))
          nDirLevel = -1;
      }
      else if (nCode == 8 /*CBN_CLOSEUP*/)
        bCloseCBL = 0;
    }
    else if ((nID == IDNAMECB) || (nID == IDCONTENTCB) || (nID == IDREPLACECB))
    {
      if (nCode == 3 /*CBN_SETFOCUS*/)
        SendMessage(aDlg[nID].HWNDEdit, 177 /*EM_SETSEL*/, aDlg[nID].Sel1, aDlg[nID].Sel2);
      else if (nCode == 10 /*CBN_SELENDCANCEL*/)
      {
        aDlg[nID].Sel1 = LoWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0));
        aDlg[nID].Sel2 = HiWord(SendMessage(lParam, 0x0140 /*CB_GETEDITSEL*/, 0, 0));
      }
      EnableButtons();
    }
    else if (nID == IDCURRENTB)
      CurrentDir();
    else if (nID == IDBROWSEB)
      BrowseDirs();
    else if ((nID == IDHELP1B) || (nID == IDHELP2B) || (nID == IDHELP3B))
      Help(nID);
    else if (nID == IDNAMERE)
    {
      bNameRE = ! bNameRE;
      oSys.Call("User32::InvalidateRect", aDlg[IDNAMECB].HWNDEdit, 0, true);
    }
    else if (nID == IDNOTNAME)
      bNotName = ! bNotName;
    else if (nID == IDINFILES)
    {
      bInFiles = ! bInFiles;
      if (! bInFiles)
      {
        bInStreams = true;
        SendMessage(aDlg[IDINSTREAMS].HWND, 0x00F1 /*BM_SETCHECK*/, bInStreams, 0);
      }
    }
    else if (nID == IDINSTREAMS)
    {
      bInStreams = ! bInStreams;
      if (! bInStreams)
      {
        bInFiles = true;
        SendMessage(aDlg[IDINFILES].HWND, 0x00F1 /*BM_SETCHECK*/, bInFiles, 0);
      }
    }
    else if (nID == IDMATCHCASE)
      bMatchCase = ! bMatchCase;
    else if (nID == IDCONTENTRE)
    {
      bContentRE = ! bContentRE;
      EnableButtons();
      oSys.Call("User32::InvalidateRect", aDlg[IDCONTENTCB].HWNDEdit, 0, true);
      oSys.Call("User32::InvalidateRect", aDlg[IDREPLACECB].HWNDEdit, 0, true);
    }
    else if (nID == IDMULTILINE)
      bMultiline = ! bMultiline;
    else if (nID == IDNOTCONTAIN)
    {
      bNotContain = ! bNotContain;
      EnableButtons();
    }
    else if (nID == IDSKIPBINARY)
      bSkipBinary = ! bSkipBinary;
    else if (nID == IDSKIPLARGER)
    {
      bSkipLarger = ! bSkipLarger;
      EnableButtons();
    }
    else if (nID == IDMAXSIZEE)
    {
      if (nCode == 0x0300 /*EN_CHANGE*/)
      {
        nMaxFileSize = parseInt(GetWindowText(lParam), 10);
        if ((! isFinite(nMaxFileSize)) || (nMaxFileSize <= 0))
        {
          nMaxFileSize = 0;
          SetWindowText(lParam, "");
        }
      }
    }
    else if (nID == IDREADONLY)
      bSkipReadOnly = ! bSkipReadOnly;
    else if (nID == IDHIDDEN)
      bSkipHidden = ! bSkipHidden;
    else if (nID == IDSYSTEM)
      bSkipSystem = ! bSkipSystem;
    else if (nID == IDINRESULTS)
    {
      bInResults = ! bInResults;
      EnableButtons();
    }
    else if ((nID == IDSEARCHB) || (nID == IDREPLACEB))
      SearchFiles(nID == IDREPLACEB);
    else if (nID == IDHISTORYB)
      History();
    else if (nID == IDEDITB)
      OpenFiles();
    else if (nID == IDCOPYB)
      CopyList();
    else if (nID == IDCLEARB)
      ClearList();
    else if (nID == IDSETTINGSB)
      Settings();
    else if ((nID == IDCLOSEB) || (nID == 2 /*IDCANCEL*/))
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

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

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

  else
  {
    nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
    if (nID == IDFILELV)
      nID = IDEDITB;
    else if ((nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B) && (nID != IDHELP2B) && (nID != IDHELP3B) && (nID < IDSEARCHB))
      nID = IDSEARCHB;
    oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
  }

  return 0;
}

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

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

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

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

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

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

function 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 GetWindowPos(hWnd, oRect)
{
  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)

  oSys.Call("User32::GetWindowRect", hWnd, lpRect);
  oRect.X = AkelPad.MemRead(_PtrAdd(lpRect,  0), DT_DWORD);
  oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect,  4), DT_DWORD);
  oRect.W = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD) - oRect.X;
  oRect.H = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - oRect.Y;
  AkelPad.MemFree(lpRect);
}

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

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

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

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

function GetTextWidth(sText, hWnd, hFont)
{
  var hDC    = oSys.Call("User32::GetDC", hWnd);
  var lpSize = AkelPad.MemAlloc(8);
  var nWidth;

  oSys.Call("Gdi32::SelectObject", hDC, hFont);
  oSys.Call("Gdi32::SetMapMode", hDC, 1 /*MM_TEXT*/);
  oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, sText, sText.length, lpSize);

  nWidth = AkelPad.MemRead(lpSize, DT_DWORD);

  oSys.Call("User32::ReleaseDC", hWnd, hDC);
  AkelPad.MemFree(lpSize);
  return nWidth;
}

function ResizeDlg(nW, nH)
{
  var nFlags = 0x0114; //SWP_NOCOPYBITS|SWP_NOACTIVATE|SWP_NOZORDER
  var nW5    = Scale.X(5);
  var nW10   = Scale.X(10);
  var nW20   = Scale.X(20);
  var nW75   = Scale.X(75);
  var nW90   = Scale.X(90);
  var nW160  = Scale.X(160);
  var nH5    = Scale.Y(5);
  var nH13   = Scale.Y(13);
  var nH16   = Scale.Y(16);
  var nH21   = Scale.Y(21);
  var i;

  oSys.Call("User32::SetWindowPos",
    aDlg[IDDIRG].HWND, 0,
    nW5,
    nH5,
    nW - nW90 - nW10 - 2 * nW5,
    Scale.Y(70),
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDDIRCB].HWND, 0,
    2 * nW5,
    Scale.Y(25),
    nW - nW90 - nW10 - 4 * nW5,
    1,
    nFlags);
  for (i = IDCURRENTB; i <= IDBROWSEB; ++i)
    oSys.Call("User32::SetWindowPos",
      aDlg[i].HWND, 0,
      2 * nW5 + (i - IDCURRENTB) * (nW75 + nW5),
      Scale.Y(49),
      nW75,
      nH21,
      nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDDIRLEVELS].HWND, 0,
    nW - Scale.X(110) - 2 - nW75 - nW90 - nW10 - 2 * nW5,
    Scale.Y(54),
    Scale.X(110),
    nH13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDDIRLEVELCB].HWND, 0,
    nW - nW75 - nW90 - nW10 - 2 * nW5,
    Scale.Y(49),
    nW75,
    1,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDNAMEG].HWND, 0,
    nW5,
    Scale.Y(80),
    nW - nW90 - nW10 - 2 * nW5,
    Scale.Y(85),
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDNAMECB].HWND, 0,
    2 * nW5,
    Scale.Y(100),
    nW - nW90 - nW20 - nW10 - 4 * nW5,
    1,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDHELP1B].HWND, 0,
    nW - nW90 - nW20 - nW10 - 2 * nW5,
    Scale.Y(100),
    nW20,
    nH21,
    nFlags);
  for (i = IDNAMERE; i <= IDINSTREAMS; ++i)
    oSys.Call("User32::SetWindowPos",
      aDlg[i].HWND, 0,
      2 * nW5 + Math.floor((i - IDNAMERE) / 2) * nW160,
      Scale.Y(125 + ((i - IDNAMERE) % 2) * 20),
      aDlg[i].W,
      nH16,
      nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDCONTENTG].HWND, 0,
    nW5,
    Scale.Y(170),
    nW - nW90 - nW10 - 2 * nW5,
    Scale.Y(146),
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDCONTENTCB].HWND, 0,
    2 * nW5,
    Scale.Y(190),
    nW - nW90 - nW20 - nW10 - 4 * nW5,
    1,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDHELP2B].HWND, 0,
    nW - nW90 - nW20 - nW10 - 2 * nW5,
    Scale.Y(190),
    nW20,
    nH21,
    nFlags);
  for (i = IDMATCHCASE; i <= IDSKIPLARGER; ++i)
    oSys.Call("User32::SetWindowPos",
      aDlg[i].HWND, 0,
      2 * nW5 + Math.floor((i - IDMATCHCASE) / 3) * nW160,
      Scale.Y(215 + ((i - IDMATCHCASE) % 3) * 20),
      aDlg[i].W,
      nH16,
      nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDMAXSIZEE].HWND, 0,
    2 * nW5 + nW160 + aDlg[IDSKIPLARGER].W,
    Scale.Y(253),
    Scale.X(60),
    Scale.Y(20),
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDREPLACES].HWND, 0,
    2 * nW5,
    Scale.Y(275),
    nW160,
    nH13,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDREPLACECB].HWND, 0,
    2 * nW5,
    Scale.Y(290),
    nW - nW90 - nW20 - nW10 - 4 * nW5,
    1,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDHELP3B].HWND, 0,
    nW - nW90 - nW20 - nW10 - 2 * nW5,
    Scale.Y(290),
    nW20,
    nH21,
    nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDSKIPG].HWND, 0,
    nW - nW90 - nW5,
    nH5,
    nW90,
    Scale.Y(80),
    nFlags);
  for (i = IDREADONLY; i <= IDSYSTEM; ++i)
    oSys.Call("User32::SetWindowPos",
      aDlg[i].HWND, 0,
      nW - nW90,
      Scale.Y(25 + (i - IDREADONLY) * 20),
      nW75,
      nH16,
      nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDINRESULTS].HWND, 0,
    nW - nW90 - nW5,
    Scale.Y(108),
    nW90,
    nH16,
    nFlags);
  for (i = IDSEARCHB; i <= IDCLOSEB; ++i)
    oSys.Call("User32::SetWindowPos",
      aDlg[i].HWND, 0,
      nW - nW90 - nW5,
      Scale.Y(128 + (i - IDSEARCHB) * 24),
      nW90,
      nH21,
      nFlags);
  oSys.Call("User32::SetWindowPos",
    aDlg[IDFILELV].HWND, 0,
    -1,
    Scale.Y(325),
    nW + 2,
    nH - Scale.Y(325 + 22),
    nFlags);

  SendMessage(aDlg[IDFILELV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
  SendMessage(aDlg[IDFILELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, GetCurFocLV(), false);
  SendMessage(aDlg[IDSTATUS].HWND, 5 /*WM_SIZE*/, 0, 0);
}

function SetCheckButtons()
{
  SendMessage(aDlg[IDNAMERE    ].HWND, 0x00F1 /*BM_SETCHECK*/, bNameRE, 0);
  SendMessage(aDlg[IDNOTNAME   ].HWND, 0x00F1 /*BM_SETCHECK*/, bNotName, 0);
  SendMessage(aDlg[IDINFILES   ].HWND, 0x00F1 /*BM_SETCHECK*/, bInFiles, 0);
  SendMessage(aDlg[IDINSTREAMS ].HWND, 0x00F1 /*BM_SETCHECK*/, bInStreams, 0);
  SendMessage(aDlg[IDMATCHCASE ].HWND, 0x00F1 /*BM_SETCHECK*/, bMatchCase, 0);
  SendMessage(aDlg[IDCONTENTRE ].HWND, 0x00F1 /*BM_SETCHECK*/, bContentRE, 0);
  SendMessage(aDlg[IDMULTILINE ].HWND, 0x00F1 /*BM_SETCHECK*/, bMultiline, 0);
  SendMessage(aDlg[IDNOTCONTAIN].HWND, 0x00F1 /*BM_SETCHECK*/, bNotContain, 0);
  SendMessage(aDlg[IDSKIPBINARY].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipBinary, 0);
  SendMessage(aDlg[IDSKIPLARGER].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipLarger, 0);
  SendMessage(aDlg[IDREADONLY  ].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipReadOnly, 0);
  SendMessage(aDlg[IDHIDDEN    ].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipHidden, 0);
  SendMessage(aDlg[IDSYSTEM    ].HWND, 0x00F1 /*BM_SETCHECK*/, bSkipSystem, 0);
  SendMessage(aDlg[IDINRESULTS ].HWND, 0x00F1 /*BM_SETCHECK*/, bInResults, 0);
}

function EnableButtons()
{
  var bNotInRes = ! (bInResults && aFiles.length);
  var bContent  = oSys.Call("User32::GetWindowTextLengthW", aDlg[IDCONTENTCB].HWND);
  var i;

  oSys.Call("User32::EnableWindow", aDlg[IDDIRCB].HWND,      bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDCURRENTB].HWND,   bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDBROWSEB].HWND,    bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDDIRLEVELS].HWND,  bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDDIRLEVELCB].HWND, bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDNAMECB    ].HWND, bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDHELP1B    ].HWND, bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDNAMERE    ].HWND, bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDNOTNAME   ].HWND, bNotInRes && oSys.Call("User32::GetWindowTextLengthW", aDlg[IDNAMECB].HWND));
  oSys.Call("User32::EnableWindow", aDlg[IDINFILES   ].HWND, bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDINSTREAMS ].HWND, bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDREADONLY  ].HWND, bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDHIDDEN    ].HWND, bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDSYSTEM    ].HWND, bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDHELP2B    ].HWND, bContentRE);
  oSys.Call("User32::EnableWindow", aDlg[IDMULTILINE ].HWND, bContentRE);
  oSys.Call("User32::EnableWindow", aDlg[IDNOTCONTAIN].HWND, bContent);
  oSys.Call("User32::EnableWindow", aDlg[IDSKIPBINARY].HWND, bContent && bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDSKIPLARGER].HWND, bContent && bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDMAXSIZEE  ].HWND, bContent && bSkipLarger && bNotInRes);
  oSys.Call("User32::EnableWindow", aDlg[IDREPLACES  ].HWND, bContent && (! bNotContain));
  oSys.Call("User32::EnableWindow", aDlg[IDREPLACECB ].HWND, bContent && (! bNotContain));
  oSys.Call("User32::EnableWindow", aDlg[IDHELP3B    ].HWND, bContent && (! bNotContain) && bContentRE);
  oSys.Call("User32::EnableWindow", aDlg[IDINRESULTS ].HWND, aFiles.length);
  oSys.Call("User32::EnableWindow", aDlg[IDREPLACEB  ].HWND, bContent && (! bNotContain));
  oSys.Call("User32::EnableWindow", aDlg[IDHISTORYB  ].HWND, aHist.length);
  oSys.Call("User32::EnableWindow", aDlg[IDEDITB     ].HWND, aFiles.length);
  oSys.Call("User32::EnableWindow", aDlg[IDCOPYB     ].HWND, aFiles.length);
  oSys.Call("User32::EnableWindow", aDlg[IDCLEARB    ].HWND, aFiles.length);
}

function IsCloseCB()
{
  return (! SendMessage(aDlg[IDDIRCB    ].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0)) &&
         (! SendMessage(aDlg[IDNAMECB   ].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0)) &&
         (! SendMessage(aDlg[IDCONTENTCB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0)) &&
         (! SendMessage(aDlg[IDREPLACECB].HWND, 0x0157 /*CB_GETDROPPEDSTATE*/, 0, 0)) &&
         bCloseCBL;
}

function FillCB()
{
  var i;

  for (i = 0; i < aDirs.length; ++i)
    SendMessage(aDlg[IDDIRCB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, aDirs[i]);

  for (i = 0; i < aNames.length; ++i)
    SendMessage(aDlg[IDNAMECB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, aNames[i]);

  for (i = 0; i < aContents.length; ++i)
    SendMessage(aDlg[IDCONTENTCB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, aContents[i]);

  for (i = 0; i < aReplace.length; ++i)
    SendMessage(aDlg[IDREPLACECB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, aReplace[i]);

  for (i = 0; i < nLevelMax - 1; ++i)
    SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, i.toString());

  i = SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x0143 /*CB_ADDSTRING*/, 0, sTxtAll);
  if ((nDirLevel >= 0) && (nDirLevel < nLevelMax))
    i = nDirLevel;
  else
    nDirLevel = -1;

  SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x014E /*CB_SETCURSEL*/, i, 0);
}

function DeleteItemCB(hWndCB, aItems)
{
  var i = SendMessage(hWndCB, 0x0147 /*CB_GETCURSEL*/, 0, 0);

  aItems.splice(i, 1);
  SendMessage(hWndCB, 0x0144 /*CB_DELETESTRING*/, i, 0);

  if (i > aItems.length - 1)
    i = aItems.length - 1;

  SendMessage(hWndCB, 0x014E /*CB_SETCURSEL*/, i, 0);
}

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

function GetNextSelLV(nItem)
{
  return SendMessage(aDlg[IDFILELV].HWND, 0x100C /*LVM_GETNEXTITEM*/, nItem, 0x0002 /*LVNI_SELECTED*/);
}

function GetSelArrayLV()
{
  var nItem = -1;
  aFilesSel = [];

  while ((nItem = GetNextSelLV(nItem)) >= 0)
    aFilesSel.push(nItem);

  if (! aFilesSel.length)
    aFilesSel = [GetCurFocLV()];
}

function SetSelLV(nItem)
{
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, DT_DWORD);
  SendMessage(aDlg[IDFILELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
  SendMessage(aDlg[IDFILELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, true);
}

function SetSelArrayLV()
{
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0002 /*LVIS_SELECTED*/, DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0002 /*LVIS_SELECTED*/, DT_DWORD);

  for (var i = 0; i < aFilesSel.length; ++i)
    SendMessage(aDlg[IDFILELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, aFilesSel[i], lpLVITEM);

  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0001 /*LVIS_FOCUSED*/, DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0001 /*LVIS_FOCUSED*/, DT_DWORD);
  SendMessage(aDlg[IDFILELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, nFilesFoc, lpLVITEM);
  SendMessage(aDlg[IDFILELV].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nFilesFoc, true);
}

function SetSelAllLV()
{
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0002 /*LVIS_SELECTED*/, DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0002 /*LVIS_SELECTED*/, DT_DWORD);

  for (var i = 0; i < aFiles.length; ++i)
    SendMessage(aDlg[IDFILELV].HWND, 0x102B /*LVM_SETITEMSTATE*/, i, lpLVITEM);
}

function InsertItemLV(nItem, sText)
{
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 4), nItem, DT_DWORD); //iItem
  AkelPad.MemCopy(_PtrAdd(lpLVITEM, 8),     0, DT_DWORD); //iSubItem
  AkelPad.MemCopy(lpBuffer, sText, DT_UNICODE);
  SendMessage(aDlg[IDFILELV].HWND, 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);
}

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

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

function SetHeaderLV()
{
  var lpHDITEM = AkelPad.MemAlloc(_X64 ? 72 : 48); //sizeof(HDITEM)
  var nFmt     = 0x4000 /*HDF_STRING*/ | (bSortDesc ? 0x0200 /*HDF_SORTDOWN*/ : 0x0400 /*HDF_SORTUP*/);
  var hHeader  = SendMessage(aDlg[IDFILELV].HWND, 0x101F /*LVM_GETHEADER*/, 0, 0);

  AkelPad.MemCopy(lpBuffer, bAfterReplace ? sTxtFilesRepl : sTxtFilesFound, DT_UNICODE);
  AkelPad.MemCopy(lpHDITEM, 0x06, DT_DWORD); //mask=HDI_FORMAT|HDI_TEXT
  AkelPad.MemCopy(_PtrAdd(lpHDITEM, 8), lpBuffer, DT_QWORD); //pszText
  AkelPad.MemCopy(_PtrAdd(lpHDITEM, _X64 ? 24 : 16), nBufSize, DT_DWORD); //cchTextMax
  AkelPad.MemCopy(_PtrAdd(lpHDITEM, _X64 ? 28 : 20), nFmt, DT_DWORD); //fmt
  SendMessage(hHeader, 0x120C /*HDM_SETITEMW*/, 0, lpHDITEM);
  AkelPad.MemFree(lpHDITEM);
}

function FillLV()
{
  var nNameBegin = 0;
  var i;

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

  if (aFiles.length)
  {
    if (! bPathShow)
      nNameBegin = nPathLen;

    for (i = 0; i < aFiles.length; ++i)
      InsertItemLV(i, aFiles[i].substr(nNameBegin));

    SetSelArrayLV();
  }
  else
    InsertItemLV(0, sTxtNoFiles);

  if (GetNextSelLV(-1) < 0)
    SetSelLV(0);

  SendMessage(aDlg[IDFILELV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
  SendMessage(aDlg[IDFILELV].HWND, 0x000B /*WM_SETREDRAW*/, 1, 0);
}

function SetPartsSB()
{
  var lpParts = AkelPad.MemAlloc(5 * 4);

  AkelPad.MemCopy(_PtrAdd(lpParts,  0), Scale.X( 90), DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpParts,  4), Scale.X(190), DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpParts,  8), Scale.X(310), DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpParts, 12), Scale.X(350), DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpParts, 16),           -1, DT_DWORD);

  SendMessage(aDlg[IDSTATUS].HWND, 0x0404 /*SB_SETPARTS*/, 5, lpParts);

  AkelPad.MemFree(lpParts);
}

function SetTextSB(nItem)
{
  var sText0 = "";
  var sText1 = "";
  var sText2 = "";
  var sText3 = "";
  var sText4 = "";
  var hFile;
  var lpFileInfo;
  var lpDecimalSep;
  var lpThousandSep;
  var lpNUMBERFMT;
  var lpLocalFileTime;
  var lpSysTime;
  var nSizeHi;
  var nSizeLo;
  var nAttr;

  if ((nItem > -1) && aFiles.length)
  {
    sText0 = "\t\t" + (nItem + 1) + "/" + aFiles.length + " ";
    hFile  = oSys.Call("Kernel32::CreateFileW",
               aFiles[nItem], //lpFileName
               0,  //dwDesiredAccess
               3,  //dwShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
               0,  //lpSecurityAttributes
               3,  //dwCreationDisposition = OPEN_EXISTING
               0,  //dwFlagsAndAttributes
               0); //hTemplateFile
    lpFileInfo = AkelPad.MemAlloc(52); //sizeof(BY_HANDLE_FILE_INFORMATION)

    if (hFile && oSys.Call("Kernel32::GetFileInformationByHandle", hFile, lpFileInfo))
    {
      //file size
      nSizeHi = AkelPad.MemRead(_PtrAdd(lpFileInfo, 32), DT_DWORD);
      nSizeLo = AkelPad.MemRead(_PtrAdd(lpFileInfo, 36), DT_DWORD);
      if (nSizeLo < 0)
        nSizeLo += 0xFFFFFFFF + 1;

      lpDecimalSep  = AkelPad.MemAlloc(4 * 2);
      lpThousandSep = AkelPad.MemAlloc(4 * 2);
      lpNUMBERFMT   = AkelPad.MemAlloc(_X64 ? 40 : 24); //sizeof(NUMBERFMT)
      AkelPad.MemCopy(_PtrAdd(lpNUMBERFMT, 8), 3, DT_DWORD); //Grouping
      AkelPad.MemCopy(_PtrAdd(lpNUMBERFMT, _X64 ? 16 : 12), lpDecimalSep,  DT_QWORD);
      AkelPad.MemCopy(_PtrAdd(lpNUMBERFMT, _X64 ? 24 : 16), lpThousandSep, DT_QWORD);

      oSys.Call("Kernel32::GetLocaleInfoW", 0x400 /*LOCALE_USER_DEFAULT*/,  0xE /*LOCALE_SDECIMAL*/,  lpDecimalSep,  4);
      oSys.Call("Kernel32::GetLocaleInfoW", 0x400 /*LOCALE_USER_DEFAULT*/,  0xF /*LOCALE_STHOUSAND*/, lpThousandSep, 4);
      oSys.Call("Kernel32::GetNumberFormatW",
        0x400, //LOCALE_USER_DEFAULT
        0,
        (nSizeHi * (0xFFFFFFFF + 1) + nSizeLo).toString(),
        lpNUMBERFMT,
        lpBuffer,
        nBufSize / 2);

      AkelPad.MemFree(lpDecimalSep);
      AkelPad.MemFree(lpThousandSep);
      AkelPad.MemFree(lpNUMBERFMT);

      sText1 = "\t\t" + AkelPad.MemRead(lpBuffer, DT_UNICODE) + " " + sTxtByteSymbol + " ";

      //file date and time
      lpLocalFileTime = AkelPad.MemAlloc(8);  //FILETIME
      lpSysTime       = AkelPad.MemAlloc(16); //SYSTEMTIME

      oSys.Call("Kernel32::FileTimeToLocalFileTime", _PtrAdd(lpFileInfo, 20), lpLocalFileTime);
      oSys.Call("Kernel32::FileTimeToSystemTime", lpLocalFileTime, lpSysTime);
      oSys.Call("Kernel32::GetDateFormatW",
        0x400, //LOCALE_USER_DEFAULT
        0x1,   //DATE_SHORTDATE
        lpSysTime,
        0,
        lpBuffer,
        64);
      oSys.Call("Kernel32::GetTimeFormatW",
        0x400, //LOCALE_USER_DEFAULT
        0x8,   //TIME_FORCE24HOURFORMAT
        lpSysTime,
        0,
        _PtrAdd(lpBuffer, 128),
        64);

      AkelPad.MemFree(lpLocalFileTime);
      AkelPad.MemFree(lpSysTime);

      sText2 = "\t" + AkelPad.MemRead(lpBuffer, DT_UNICODE) + "  " + AkelPad.MemRead(_PtrAdd(lpBuffer, 128), DT_UNICODE);
      nAttr  = AkelPad.MemRead(lpFileInfo, DT_DWORD);

      if (nAttr & 32 /*FILE_ATTRIBUTE_ARCHIVE*/)  sText3 += "A";
      if (nAttr &  2 /*FILE_ATTRIBUTE_HIDDEN*/)   sText3 += "H";
      if (nAttr &  1 /*FILE_ATTRIBUTE_READONLY*/) sText3 += "R";
      if (nAttr &  4 /*FILE_ATTRIBUTE_SYSTEM*/)   sText3 += "S";

      if (aFiles[nItem].lastIndexOf(":") > 2)
        sText4 = sTxtNTFSStream;
    }

    oSys.Call("Kernel32::CloseHandle", hFile);
    AkelPad.MemFree(lpFileInfo);
  }
  else if (nItem == -2)
    sText0 = "\t" + sTxtWait;

  SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 0, sText0);
  SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 1, sText1);
  SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 2, sText2);
  SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 3, sText3);
  SendMessage(aDlg[IDSTATUS].HWND, 0x040B /*SB_SETTEXTW*/, 4, sText4);
}

function CurrentDir()
{
  sDir = AkelPad.GetEditFile(0);

  if (sDir)
    sDir = sDir.replace(/\\[^\\]+$/, "");
  else
    sDir = AkelPad.GetAkelDir();

  SetWindowText(aDlg[IDDIRCB].HWND, sDir);
  SendMessage(aDlg[IDDIRCB].HWND, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(0, -1));
}

function BrowseDirs()
{
  var oRect = {};
  var sSelDir;

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

  sSelDir = BrowseForFolder(hDlg, sTxtChooseDir, GetWindowText(aDlg[IDDIRCB].HWND).replace(/(^ +)|( +$)/g, ""), 0, 0, oRect.X, oRect.Y + oRect.H);

  if (sSelDir)
  {
    SetWindowText(aDlg[IDDIRCB].HWND, sSelDir);
    SendMessage(aDlg[IDDIRCB].HWND, 0x0142 /*CB_SETEDITSEL*/, 0, MkLong(0, -1));
  }
}

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

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

Post by KDJ »

Search files by name/content and replace content - part 2.
Interface language files for FindReplaceFiles.js are here: viewtopic.php?p=27476&#p27476

Code: Select all

function Help(nID, bPressF1)
{
  var nString = 0x0000; //MF_STRING
  var nBreak  = 0x0060; //MF_MENUBREAK|MF_MENUBARBREAK
  var nSepar  = 0x0800; //MF_SEPARATOR
  var hMenu   = oSys.Call("User32::CreatePopupMenu");
  var oRect   = {};
  var aMenu;
  var nCmd;

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

  if ((nID == IDHELP1B) && (! bNameRE))
    aMenu = [
      [nString, "?",   sHlpAnyChar],
      [nString, "*",   sHlpAnyString],
      [nString, '";"', sHlpSemicolQuot],
      [nSepar],
      [nString, ";",   sHlpListSepar],
      [nSepar],
      [nString, ":",   sHlpStreamSepar]];
  else if (nID == IDHELP3B)
    aMenu = [
      [nString, "$$",      sHlpDollar],
      [nString, "$&&",     sHlpEntireStr],
      [nString, "$`",      sHlpPrecedeStr],
      [nString, "$'",      sHlpFollowStr],
      [nString, "$9",      sHlpSubmatch9],
      [nString, "$99",     sHlpSubmatch99],
      [nSepar],
      [nString, "\\\\",    sHlpBackslash],
      [nString, "\\0",     sHlpNULL],
      [nString, "\\f",     sHlpFF],
      [nString, "\\n",     sHlpNL],
      [nString, "\\r",     sHlpCR],
      [nString, "\\t",     sHlpTab],
      [nString, "\\v",     sHlpVTab],
      [nString, "\\xFF",   sHlpCharHex],
      [nString, "\\u00FF", sHlpUniCharHex]];
  else
  {
    aMenu = [
      [nString, ".",       sHlpAnyChar_NL],
      [nString, "\\d",     sHlpDigit],
      [nString, "\\D",     sHlpNonDigit],
      [nString, "\\s",     sHlpWhiteSp],
      [nString, "\\S",     sHlpNonWhiteSp],
      [nString, "\\w",     sHlpWordChar],
      [nString, "\\W",     sHlpNonWordChar],
      [nString, "\\0",     sHlpNULL],
      [nString, "\\f",     sHlpFF],
      [nString, "\\n",     sHlpNL],
      [nString, "\\r",     sHlpCR],
      [nString, "\\t",     sHlpTab],
      [nString, "\\v",     sHlpVTab],
      [nString, "\\xFF",   sHlpCharHex],
      [nString, "\\u00FF", sHlpUniCharHex],
      [nSepar],
      [nString, "^",       sHlpBegin],
      [nString, "$",       sHlpEnd],
      [nString, "\\b",     sHlpWordBoun],
      [nString, "\\B",     sHlpNonWordBoun],
      [nBreak,  "ab|xy",   sHlpAlternative],
      [nString, "[abc]",   sHlpCharSet],
      [nString, "[^abc]",  sHlpNegCharSet],
      [nString, "[a-z]",   sHlpRange],
      [nString, "[^a-z]",  sHlpNegRange],
      [nSepar],
      [nString, "(ab)",    sHlpCapture],
      //if ((nID == IDHELP1B) && bNameRE) this element should be removed
      [nString, "(?:ab)",  sHlpNotCapture],
      [nString, "(?=ab)",  sHlpFollow],
      [nString, "(?!ab)",  sHlpNotFollow],
      [nString, "\\9",     sHlpBackrefer9],
      [nString, "\\99",    sHlpBackrefer99],
      [nSepar],
      [nString, "?",       sHlpZeroOrOne],
      [nString, "*",       sHlpZeroOrMore],
      [nString, "+",       sHlpOneOrMore],
      [nString, "{3}",     sHlpexactly],
      [nString, "{3,}",    sHlpAtLeast],
      [nString, "{3,7}",   sHlpFromTo],
      [nSepar],
      [nString, "\\(",     sHlpSpecChars]];

    if ((nID == IDHELP1B) && bNameRE)
    {
      aMenu.splice(27, 1);
      aMenu.push([nSepar]);
      aMenu.push([nString, ":", sHlpStreamSepar]);
    }
  }

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

  --nID;

  if (nCmd)
  {
    aMenu[nCmd - 1][1] = aMenu[nCmd - 1][1].replace(/&&/g, "&");
    SendMessage(aDlg[nID].HWNDEdit, 177 /*EM_SETSEL*/, aDlg[nID].Sel1, aDlg[nID].Sel2);
    SendMessage(aDlg[nID].HWNDEdit, 194 /*EM_REPLACESEL*/, 1, aMenu[nCmd - 1][1]);
    aDlg[nID].Sel1 += aMenu[nCmd - 1][1].length;
    aDlg[nID].Sel2  = aDlg[nID].Sel1;
  }

  if (nCmd || bPressF1)
    PostMessage(hDlg, 0x8001 /*WM_APP+1*/, aDlg[nID].HWND, 0);
}

function SearchFiles(bReplace)
{
  var aPath;
  var sFile;
  var sStream;
  var rFile;
  var rStream;
  var rContent;
  var sReplaceWith;
  var nMaxLevel;
  var bLevelOK;
  var hFindFile;
  var sFileName;
  var sFullName;
  var nAttr;
  var sFileContent;
  var nCodePage;
  var bBOM;
  var lpFile;
  var lpDetectFile;
  var nDetectFile;
  var nSizeHi;
  var nSizeLo;
  var nSize;
  var nMaxSize;
  var bNTFS;
  var aStreams;
  var i, n;

  if (! (bInResults && aFiles.length))
  {
    sDir  = GetWindowText(aDlg[IDDIRCB].HWND).replace(/(^ +)|( +$)/g, "");
    sName = GetWindowText(aDlg[IDNAMECB].HWND);

    if (sDir)
      SetWindowText(aDlg[IDDIRCB].HWND, sDir);
    else
      CurrentDir();

    if (! IsDirExists(sDir))
    {
      MessageBox(sDir + "\n\n" + sTxtDirNoExist);
      PostMessage(aDlg[IDDIRCB].HWND, 7 /*WM_SETFOCUS*/, 0, 0);
      return;
    }

    if (sName)
    {
      i = 0;
      n = sName.indexOf(":");

      if (n > -1)
      {
        sFile   = sName.substr(0, n);
        sStream = sName.substr(n + 1);
      }
      else
        sFile = sName;

      if (bNameRE)
      {
        try
        {
          if (sFile)
            rFile = new RegExp(sFile, "i");

          if (sStream)
          {
            i = n + 1;
            n = -1;
            rStream = new RegExp(sStream, "i");
          }
        }
        catch (oError)
        {
          MessageBox(sName + "\n\n" + sTxtErrorRE);
          PostMessage(aDlg[IDNAMECB].HWND, 7 /*WM_SETFOCUS*/, 0, 0);
          PostMessage(aDlg[IDNAMECB].HWNDEdit, 177 /*EM_SETSEL*/, i, n);
          return;
        }
      }
      else
      {
        if (sFile)
          rFile = GetNameRegExp(sFile);

        if (sStream)
          rStream = GetNameRegExp(sStream);
      }
    }
  }

  sContent = GetWindowText(aDlg[IDCONTENTCB].HWND);
  sReplace = GetWindowText(aDlg[IDREPLACECB].HWND);

  if (sContent)
  {
    if (bContentRE)
    {
      try
      {
        rContent = new RegExp(sContent, "g" + (bMatchCase ? "" : "i") + (bMultiline ? "m" : ""));
      }
      catch (oError)
      {
        MessageBox(sContent + "\n\n" + sTxtErrorRE);
        PostMessage(aDlg[IDCONTENTCB].HWND, 7 /*WM_SETFOCUS*/, 0, 0);
        PostMessage(aDlg[IDCONTENTCB].HWNDEdit, 177 /*EM_SETSEL*/, 0, -1);
        return;
      }
    }
    else
      rContent = new RegExp(sContent.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&"), "g" + (bMatchCase ? "" : "i"));
  }

  if (bReplace)
  {
    if (MessageBox(sTxtWantReplace, true))
    {
      if (bContentRE)
        sReplaceWith = sReplace.replace(/(\\+)([^\\]*)/g, ReplaceFunc);
      else
        sReplaceWith = sReplace.replace(/\$/g, "$$$$");
    }
    else
      return;
  }

  bAfterReplace   = bReplace;
  aFilesSel       = [0];
  nFilesFoc       = 0;
  sLastContent    = sContent;
  bLastContentRE  = bContentRE;
  bLastMatchCase  = bMatchCase;
  bLastMultiline  = bMultiline;
  bLastNotContain = bNotContain;
  lpFile          = AkelPad.MemAlloc((260 + 260 + 36) * 2);
  lpDetectFile    = AkelPad.MemAlloc(_X64 ? 24 : 20); //sizeof(DETECTFILEW)

  AkelPad.MemCopy(lpDetectFile, lpFile, DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpDetectFile, _X64 ?  8 : 4), 1024, DT_DWORD); //dwBytesToCheck
  AkelPad.MemCopy(_PtrAdd(lpDetectFile, _X64 ? 12 : 8), 0x1D, DT_DWORD); //dwFlags=ADT_NOMESSAGES|ADT_DETECT_BOM|ADT_DETECT_CODEPAGE|ADT_BINARY_ERROR

  SetHeaderLV();
  SendMessage(aDlg[IDFILELV].HWND, 0x1009 /*LVM_DELETEALLITEMS*/, 0, 0);
  SendMessage(aDlg[IDFILELV].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
  oSys.Call("User32::UpdateWindow", aDlg[IDFILELV].HWND);
  SetTextSB(-2);

  if (bInResults && aFiles.length)
  {
    aStreams = aFiles.slice(0);
    aFiles   = [];
    bNTFS    = IsSupportStreams(aStreams[0].substr(0, 3));

    for (n = 0; n < aStreams.length; ++n)
    {
      if (IsFileExists(aStreams[n]))
      {
        if (rContent)
        {
          AkelPad.MemCopy(lpFile, aStreams[n], DT_UNICODE);
          nDetectFile = SendMessage(hMainWnd, 1177 /*AKD_DETECTFILEW*/, 0, lpDetectFile);

           if ((nDetectFile == 0 /*EDT_SUCCESS*/) || (nDetectFile == -4 /*EDT_BINARY*/))
           {
             rContent.lastIndex = 0;
             nCodePage    = AkelPad.MemRead(_PtrAdd(lpDetectFile, _X64 ? 16 : 12), DT_DWORD);
             bBOM         = AkelPad.MemRead(_PtrAdd(lpDetectFile, _X64 ? 20 : 16), DT_DWORD);
             sFileContent = AkelPad.ReadFile(aStreams[n], 0, nCodePage, bBOM);

            if (rContent.test(sFileContent))
            {
              if (! bNotContain)
              {
                if (bReplace)
                {
                  sFileContent = sFileContent.replace(rContent, sReplaceWith);

                  if (AkelPad.WriteFile(aStreams[n], sFileContent, sFileContent.length, nCodePage, bBOM, 0x1 /*WFF_WRITEREADONLY*/) == 0 /*ESD_SUCCESS*/)
                    aFiles.push(aStreams[n]);
                }
                else
                  aFiles.push(aStreams[n]);
              }
            }
            else if (bNotContain)
              aFiles.push(aStreams[n]);
          }
        }
        else
          aFiles.push(aStreams[n]);
      }
    }
  }
  else
  {
    aFiles    = [];
    aPath     = [sDir + ((sDir.slice(-1) != "\\") ? "\\" : "")];
    nPathLen  = aPath[0].length;
    bNTFS     = IsSupportStreams(/^[a-z]:/i.test(sDir) ? sDir.substr(0, 2) : "");
    nMaxLevel = (nDirLevel < 0) ? Infinity : nDirLevel;
    nMaxSize  = (nMaxFileSize <= 0) ? Infinity : nMaxFileSize;

    for (i = 0; i < aPath.length; ++i)
    {
      hFindFile = oSys.Call("Kernel32::FindFirstFileW", aPath[i] + "*.*", lpBuffer);

      if (hFindFile != -1) //INVALID_HANDLE_VALUE
      {
        bLevelOK = ((aPath[i].match(/\\/g).length - aPath[0].match(/\\/g).length) < nMaxLevel);

        do
        {
          sFileName = AkelPad.MemRead(_PtrAdd(lpBuffer, 44 /*offsetof(WIN32_FIND_DATAW, cFileName)*/), DT_UNICODE);
          sFullName = aPath[i] + sFileName;
          nAttr     = AkelPad.MemRead(lpBuffer, DT_DWORD);

          //files
          if (! (nAttr & 16 /*FILE_ATTRIBUTE_DIRECTORY*/))
          {
            if (((! bSkipReadOnly) || (bSkipReadOnly && (! (nAttr & 1 /*FILE_ATTRIBUTE_READONLY*/)))) &&
                ((! bSkipHidden)   || (bSkipHidden   && (! (nAttr & 2 /*FILE_ATTRIBUTE_HIDDEN*/  )))) &&
                ((! bSkipSystem)   || (bSkipSystem   && (! (nAttr & 4 /*FILE_ATTRIBUTE_SYSTEM*/  )))) &&
                ((! rFile) || ((! bNotName) && rFile.test(sFileName)) || (bNotName && (! rFile.test(sFileName)))))
            {
              if (bInStreams && bNTFS)
              {
                aStreams = EnumStreams(sFullName);

                for (n = 0; n < aStreams.length; ++n)
                {
                  if ((bInFiles && (! aStreams[n][0])) ||
                      (aStreams[n][0] && ((! rStream) || ((! bNotName) && rStream.test(aStreams[n][0])) || (bNotName && (! rStream.test(aStreams[n][0]))))))
                  {
                    sFullName = aPath[i] + sFileName + (aStreams[n][0] ? (":" + aStreams[n][0]) : "");

                    if (rContent)
                    {
                      AkelPad.MemCopy(lpFile, sFullName, DT_UNICODE);
                      nDetectFile = SendMessage(hMainWnd, 1177 /*AKD_DETECTFILEW*/, 0, lpDetectFile);

                      if (((nDetectFile == 0 /*EDT_SUCCESS*/) || ((nDetectFile == -4 /*EDT_BINARY*/) && (! bSkipBinary))) && (aStreams[n][1] <= nMaxSize))
                      {
                        rContent.lastIndex = 0;
                        nCodePage    = AkelPad.MemRead(_PtrAdd(lpDetectFile, _X64 ? 16 : 12), DT_DWORD);
                        bBOM         = AkelPad.MemRead(_PtrAdd(lpDetectFile, _X64 ? 20 : 16), DT_DWORD);
                        sFileContent = AkelPad.ReadFile(sFullName, 0, nCodePage, bBOM);

                        if (rContent.test(sFileContent))
                        {
                          if (! bNotContain)
                          {
                            if (bReplace)
                            {
                              sFileContent = sFileContent.replace(rContent, sReplaceWith);

                              if (AkelPad.WriteFile(sFullName, sFileContent, sFileContent.length, nCodePage, bBOM, 0x1 /*WFF_WRITEREADONLY*/) == 0 /*ESD_SUCCESS*/)
                                aFiles.push(sFullName);
                            }
                            else
                              aFiles.push(sFullName);
                          }
                        }
                        else if (bNotContain)
                          aFiles.push(sFullName);
                      }
                    }
                    else
                      aFiles.push(sFullName);
                  }
                }
              }
              else if (bInFiles)
              {
                if (rContent)
                {
                  nSizeHi = AkelPad.MemRead(_PtrAdd(lpBuffer, 28 /*offsetof(WIN32_FIND_DATAW, nFileSizeHigh)*/), DT_DWORD);
                  nSizeLo = AkelPad.MemRead(_PtrAdd(lpBuffer, 32 /*offsetof(WIN32_FIND_DATAW, nFileSizeLow)*/),  DT_DWORD);
                  if (nSizeLo < 0)
                    nSizeLo += 0xFFFFFFFF + 1;
                  nSize = nSizeHi * (0xFFFFFFFF + 1) + nSizeLo;

                  AkelPad.MemCopy(lpFile, sFullName, DT_UNICODE);
                  nDetectFile = SendMessage(hMainWnd, 1177 /*AKD_DETECTFILEW*/, 0, lpDetectFile);

                  if (((nDetectFile == 0 /*EDT_SUCCESS*/) || ((nDetectFile == -4 /*EDT_BINARY*/) && (! bSkipBinary))) && (nSize <= nMaxSize))
                  {
                    rContent.lastIndex = 0;
                    nCodePage    = AkelPad.MemRead(_PtrAdd(lpDetectFile, _X64 ? 16 : 12), DT_DWORD);
                    bBOM         = AkelPad.MemRead(_PtrAdd(lpDetectFile, _X64 ? 20 : 16), DT_DWORD);
                    sFileContent = AkelPad.ReadFile(sFullName, 0, nCodePage, bBOM);

                    if (rContent.test(sFileContent))
                    {
                      if (! bNotContain)
                      {
                        if (bReplace)
                        {
                          sFileContent = sFileContent.replace(rContent, sReplaceWith);

                          if (AkelPad.WriteFile(sFullName, sFileContent, sFileContent.length, nCodePage, bBOM, 0x1 /*WFF_WRITEREADONLY*/) == 0 /*ESD_SUCCESS*/)
                            aFiles.push(sFullName);
                        }
                        else
                          aFiles.push(sFullName);
                      }
                    }
                    else if (bNotContain)
                      aFiles.push(sFullName);
                  }
                }
                else
                  aFiles.push(sFullName);
              }
            }
          }
          //directories
          else if (bLevelOK && (sFileName != ".") && (sFileName != ".."))
            aPath.push(sFullName + "\\");
        }
        while (oSys.Call("Kernel32::FindNextFileW", hFindFile, lpBuffer));

        oSys.Call("Kernel32::FindClose", hFindFile);
      }
    }

    SortFiles();
  }

  AkelPad.MemFree(lpFile);
  AkelPad.MemFree(lpDetectFile);

  FillLV();
  AddToHistory();
  EnableButtons();
  PostMessage(hDlg, 0x8001 /*WM_APP+1*/, aDlg[IDFILELV].HWND, 0);
}

function GetNameRegExp(sName)
{
  var sPattern = sName
        .replace(/"([^"]*)"/g, function() {return arguments[1].replace(/;/g, "\0");})
        .replace(/[\\\/.^$+|()\[\]{}]/g, "\\$&")
        .replace(/\*/g, ".*")
        .replace(/\?/g, ".")
        .replace(/;{2,}/g, ";")
        .replace(/(^;)|(;$)/g, "")
        .replace(/;/g, "|")
        .replace(/\0/g, ";");
  return new RegExp("^(" + sPattern + ")$", "i");
}

function ReplaceFunc(s0, s1, s2)
{
  if (s1.length % 2)
  {
    switch (s2.charAt(0))
    {
      case "0":
        s2 = "\0" + s2.substr(1);
        break;
      case "f":
        s2 = "\f" + s2.substr(1);
        break;
      case "n":
        s2 = "\n" + s2.substr(1);
        break;
      case "r":
        s2 = "\r" + s2.substr(1);
        break;
      case "t":
        s2 = "\t" + s2.substr(1);
        break;
      case "v":
        s2 = "\x0B" + s2.substr(1);
        break;
      default:
        if (/^x[\dA-Fa-f]{2}/.test(s2))
          s2 = String.fromCharCode(parseInt(s2.substr(1, 2), 16)) + s2.substr(3);
        else if (/^u[\dA-Fa-f]{4}/.test(s2))
          s2 = String.fromCharCode(parseInt(s2.substr(1, 4), 16)) + s2.substr(5);
    }
  }

  return s1.substr(0, s1.length / 2) + s2;
}

function SortFiles()
{
  var nSort = bSortDesc ? -1 : 1;
  var nCompare;

  aFiles.sort(
    function(sName1, sName2)
    {
      nCompare = nSort * oSys.Call("Kernel32::lstrcmpiW", sName1.substr(0, sName1.lastIndexOf("\\")), sName2.substr(0, sName2.lastIndexOf("\\")));

      if (nCompare == 0)
        return nSort * oSys.Call("Kernel32::lstrcmpiW", sName1, sName2);
      else
        return nCompare;
    });
}

function AddToHistory()
{
  var aCB = [{HWND: aDlg[IDDIRCB].HWND,     Arr: aDirs,     Txt: sDir,     IgnoreCase: 1},
             {HWND: aDlg[IDNAMECB].HWND,    Arr: aNames,    Txt: sName,    IgnoreCase: 1},
             {HWND: aDlg[IDCONTENTCB].HWND, Arr: aContents, Txt: sContent, IgnoreCase: 0},
             {HWND: aDlg[IDREPLACECB].HWND, Arr: aReplace,  Txt: sReplace, IgnoreCase: 0}];
  var i, n;

  for (i = 0; i < aCB.length; ++i)
  {
    if (aCB[i].Txt)
    {
      n = FindInArray(aCB[i].Arr, aCB[i].Txt, aCB[i].IgnoreCase);

      if (n >= 0)
      {
        aCB[i].Arr.splice(n, 1);
        SendMessage(aCB[i].HWND, 0x0144 /*CB_DELETESTRING*/, n, 0);
      }

      aCB[i].Arr.unshift(aCB[i].Txt);
      SendMessage(aCB[i].HWND, 0x014A /*CB_INSERTSTRING*/, 0, aCB[i].Txt);

      if (aCB[i].Arr.length > nHistMax)
      {
        aCB[i].Arr.length = nHistMax;
        SendMessage(aCB[i].HWND, 0x0144 /*CB_DELETESTRING*/, nHistMax, 0);
      }

      SendMessage(aCB[i].HWND, 0x014E /*CB_SETCURSEL*/, 0, 0);
    }
  }

  for (n = 0; n < aHist.length; ++n)
  {
    if ((aHist[n].bSortDesc == bSortDesc) &&
        (aHist[n].nDirLevel == nDirLevel) &&
        (aHist[n].bNameRE == bNameRE) &&
        (aHist[n].bNotName == bNotName) &&
        (aHist[n].bInFiles == bInFiles) &&
        (aHist[n].bInStreams == bInStreams) &&
        (aHist[n].bSkipReadOnly == bSkipReadOnly) &&
        (aHist[n].bSkipHidden == bSkipHidden) &&
        (aHist[n].bSkipSystem == bSkipSystem) &&
        (aHist[n].bInResults == bInResults) &&
        (aHist[n].bMatchCase == bMatchCase) &&
        (aHist[n].bContentRE == bContentRE) &&
        (aHist[n].bMultiline == bMultiline) &&
        (aHist[n].bNotContain == bNotContain) &&
        (aHist[n].bSkipBinary == bSkipBinary) &&
        (aHist[n].bSkipLarger == bSkipLarger) &&
        (aHist[n].nMaxFileSize == nMaxFileSize) &&
        (aHist[n].sDir.toUpperCase() == sDir.toUpperCase()) &&
        (aHist[n].sName.toUpperCase() == sName.toUpperCase()) &&
        (aHist[n].sContent == sContent) &&
        (aHist[n].sReplace == sReplace) &&
        (aHist[n].bAfterReplace == bAfterReplace))
    {
      aHist.splice(n, 1);
      break;
    }
  }

  aHist.unshift({
    nPathLen: nPathLen,
    bSortDesc: bSortDesc,
    nDirLevel: nDirLevel,
    bNameRE: bNameRE,
    bNotName: bNotName,
    bInFiles: bInFiles,
    bInStreams: bInStreams,
    bSkipReadOnly: bSkipReadOnly,
    bSkipHidden: bSkipHidden,
    bSkipSystem: bSkipSystem,
    bInResults: bInResults,
    bMatchCase: bMatchCase,
    bContentRE: bContentRE,
    bMultiline: bMultiline,
    bNotContain: bNotContain,
    bSkipBinary: bSkipBinary,
    bSkipLarger: bSkipLarger,
    nMaxFileSize: nMaxFileSize,
    sDir: sDir,
    sName: sName,
    sContent: sContent,
    sReplace: sReplace,
    bAfterReplace: bAfterReplace,
    aFiles: aFiles.slice(0)});

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

function FindInArray(aArray, sText, bIgnoreCase)
{
  for (var i = 0; i < aArray.length; ++i)
  {
    if (bIgnoreCase && (aArray[i].toUpperCase() == sText.toUpperCase()) || (aArray[i] == sText))
      return i;
  }
  return -1;
}

function History()
{
  var oRect = {};
  var hWndLB;
  var nX, nY, nW, nH;

  GetSelArrayLV();

  aHist.unshift({
    nPathLen: nPathLen,
    bSortDesc: bSortDesc,
    nDirLevel: nDirLevel,
    bNameRE: bNameRE,
    bNotName: bNotName,
    bInFiles: bInFiles,
    bInStreams: bInStreams,
    bSkipReadOnly: bSkipReadOnly,
    bSkipHidden: bSkipHidden,
    bSkipSystem: bSkipSystem,
    bInResults: bInResults,
    bMatchCase: bMatchCase,
    bContentRE: bContentRE,
    bMultiline: bMultiline,
    bNotContain: bNotContain,
    bSkipBinary: bSkipBinary,
    bSkipLarger: bSkipLarger,
    nMaxFileSize: nMaxFileSize,
    sDir: GetWindowText(aDlg[IDDIRCB].HWND),
    sName: GetWindowText(aDlg[IDNAMECB].HWND),
    sContent: GetWindowText(aDlg[IDCONTENTCB].HWND),
    sReplace: GetWindowText(aDlg[IDREPLACECB].HWND),
    bAfterReplace: bAfterReplace,
    aFiles: aFiles.slice(0),
    aFilesSel: aFilesSel.slice(0),
    nFilesFoc: GetCurFocLV(),
    sLastContent: sLastContent,
    bLastContentRE: bLastContentRE,
    bLastMatchCase: bLastMatchCase,
    bLastMultiline: bLastMultiline,
    bLastNotContain: bLastNotContain});

  GetWindowPos(aDlg[IDHISTORYB].HWND, oRect);
  nX = oRect.X - Scale.X(40);
  nY = oRect.Y + oRect.H;
  nW = oRect.X - nX + oRect.W;
  nH = SendMessage(aDlg[IDNAMECB].HWNDList, 0x1A1 /*LB_GETITEMHEIGHT*/, 0, 0) * aHist.length + oSys.Call("User32::GetSystemMetrics", 6 /*SM_CYBORDER*/) * 2;

  oSys.Call("User32::CreateWindowExW",
    0,             //dwExStyle
    sClass,        //lpClassName
    0,             //lpWindowName
    0x90000000,    //dwStyle=WS_POPUP|WS_VISIBLE
    nX,            //x
    nY,            //y
    nW,            //nWidth
    nH,            //nHeight
    hDlg,          //hWndParent
    0,             //hMenu
    hInstDLL,      //hInstance
    HistCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.

  nHistTime  = new Date().getTime();

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

    if (uMsg == 1 /*WM_CREATE*/)
    {
      hWndLB = oSys.Call("User32::CreateWindowExW",
        0,          //dwExStyle
        "LISTBOX",  //lpClassName
        0,          //lpWindowName
        0x50800181, //dwStyle=WS_CHILD|WS_VISIBLE|WS_BORDER|LBS_NOINTEGRALHEIGHT|LBS_USETABSTOPS|LBS_NOTIFY
        0,          //x
        0,          //y
        nW,         //nWidth
        nH,         //nHeight
        hWnd,       //hWndParent
        3000,       //ID
        hInstDLL,   //hInstance
        0);         //lpParam
      SendMessage(hWndLB, 48 /*WM_SETFONT*/, hGuiFont, 1);

      AkelPad.MemCopy(lpBuffer, 15, DT_DWORD);
      SendMessage(hWndLB, 0x0192 /*LB_SETTABSTOPS*/, 1, lpBuffer);
      SendMessage(hWndLB, 0x0180 /*LB_ADDSTRING*/, 0, "0");

      for (i = 1; i < aHist.length; ++i)
        SendMessage(hWndLB, 0x0180 /*LB_ADDSTRING*/, 0, i.toString() + "\t" + (aHist[i].bAfterReplace ? sTxtReplace : sTxtSearch).replace("&", "").charAt(0) + ": " + aHist[i].sContent);
      SendMessage(hWndLB, 0x0186 /*LB_SETCURSEL*/, 0, 0);
    }

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

    else if (uMsg == 256 /*WM_KEYDOWN*/)
    {
      if (wParam == 13 /*VK_RETURN*/)
        PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }

    else if (uMsg == 260 /*WM_SYSKEYDOWN*/)
    {
      if ((! Ctrl()) && (! Shift()) && (wParam == 0x2E /*VK_DELETE*/))
      {
        i = SendMessage(hWndLB, 0x0188 /*LB_GETCURSEL*/, 0, 0);
        if (i > 0)
        {
          aHist.splice(i, 1);
          SendMessage(hWndLB, 0x0182 /*LB_DELETESTRING*/, i, 0);
          SendMessage(hWndLB, 0x0186 /*LB_SETCURSEL*/, (i == aHist.length) ? --i : i, 0);
          PostMessage(hWnd, 273 /*WM_COMMAND*/, MkLong(3000, 1 /*LBN_SELCHANGE*/), hWndLB);
        }
      }
    }

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

      if (nID == 3000)
      {
        if (nCode == 1 /*LBN_SELCHANGE*/)
        {
          i = SendMessage(hWndLB, 0x0188 /*LB_GETCURSEL*/, 0, 0);

          nPathLen = aHist[i].nPathLen;
          bSortDesc = aHist[i].bSortDesc;
          nDirLevel = aHist[i].nDirLevel;
          bNameRE = aHist[i].bNameRE;
          bNotName = aHist[i].bNotName;
          bInFiles = aHist[i].bInFiles;
          bInStreams = aHist[i].bInStreams;
          bSkipReadOnly = aHist[i].bSkipReadOnly;
          bSkipHidden = aHist[i].bSkipHidden;
          bSkipSystem = aHist[i].bSkipSystem;
          bInResults = aHist[i].bInResults;
          bMatchCase = aHist[i].bMatchCase;
          bContentRE = aHist[i].bContentRE;
          bMultiline = aHist[i].bMultiline;
          bNotContain = aHist[i].bNotContain;
          bSkipBinary = aHist[i].bSkipBinary;
          bSkipLarger = aHist[i].bSkipLarger;
          nMaxFileSize = aHist[i].nMaxFileSize;
          sDir = aHist[i].sDir;
          sName = aHist[i].sName;
          sContent = aHist[i].sContent;
          sReplace = aHist[i].sReplace;
          bAfterReplace = aHist[i].bAfterReplace;
          aFiles = aHist[i].aFiles.slice(0);

          if (i == 0)
          {
            aFilesSel = aHist[i].aFilesSel.slice(0);
            nFilesFoc = aHist[i].nFilesFoc;
            sLastContent = aHist[i].sLastContent;
            bLastContentRE = aHist[i].bLastContentRE;
            bLastMatchCase = aHist[i].bLastMatchCase;
            bLastMultiline = aHist[i].bLastMultiline;
            bLastNotContain = aHist[i].bLastNotContain;
          }
          else
          {
            aFilesSel = [0];
            nFilesFoc = 0;
            sLastContent = aHist[i].sContent;
            bLastContentRE = aHist[i].bContentRE;
            bLastMatchCase = aHist[i].bMatchCase;
            bLastMultiline = aHist[i].bMultiline;
            bLastNotContain = aHist[i].bNotContain;
          }

          SendMessage(aDlg[IDDIRLEVELCB].HWND, 0x014E /*CB_SETCURSEL*/, (nDirLevel >= 0) ? nDirLevel : nLevelMax - 1, 0);
          SetCheckButtons();
          SetWindowText(aDlg[IDMAXSIZEE].HWND, (nMaxFileSize > 0) ? nMaxFileSize.toString() : "");
          SetWindowText(aDlg[IDDIRCB].HWND, sDir);
          SetWindowText(aDlg[IDNAMECB].HWND, sName);
          SetWindowText(aDlg[IDCONTENTCB].HWND, sContent);
          SetWindowText(aDlg[IDREPLACECB].HWND, sReplace);
          SetHeaderLV();
          FillLV();
          EnableButtons();

          if (aHist.length == 1)
            PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
        }
        else if ((nCode == 2 /*LBN_DBLCLK*/) || (nCode == 5 /*LBN_KILLFOCUSE*/))
          PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
      }
      else if (nID == 2 /*IDCANCEL*/)
        PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }

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

    else if (uMsg == 2 /*WM_DESTROY*/)
    {
      aHist.shift();
      EnableButtons();

      if (! oSys.Call("User32::IsWindowEnabled", hFocus))
        oSys.Call("User32::SetFocus", aDlg[IDFILELV].HWND);
    }

    return 0;
  }
}

function OpenFiles()
{
  var sFiles  = "";
  var lpFrame;
  var bSaved;
  var i;

  if (aFiles.length)
  {
    if ((! hParent) && (! oSys.Call("User32::IsZoomed", hDlg)))
    {
      SetForegroundWindow(hMainWnd);
      SetForegroundWindow(hDlg);
    }

    GetSelArrayLV();

    if (! aFilesSel.length)
      aFilesSel = [GetCurFocLV()];

    for (i = 0; i < aFilesSel.length; ++i)
    {
      if (IsFileExists(aFiles[aFilesSel[i]]))
      {
        lpFrame = 0;
        bSaved  = true;

        if (AkelPad.IsMDI() && SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 152 /*MI_SINGLEOPENFILE*/, 0) && (lpFrame = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 5 /*FWF_BYFILENAME*/, aFiles[aFilesSel[i]])))
          SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame);

        if ((lpFrame || (! AkelPad.IsMDI())) && AkelPad.GetEditModified(0) && (bSaved = SaveCurDoc()))
          AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);

        if (bSaved)
          AkelPad.OpenFile(aFiles[aFilesSel[i]]);

        if (! AkelPad.IsMDI())
          break;
      }
      else
        sFiles += aFiles[aFilesSel[i]] + "\n";
    }

    if (sFiles)
      MessageBox(sFiles + "\n" + sTxtFileNoExist);
  }
}

function OpenOrCloseFile()
{
  var nItem  = GetCurFocLV();
  var bSaved = true;
  var lpFrame;
  var rContent;

  if (aFiles.length && (nItem >= 0))
  {
    if ((! hParent) && (! oSys.Call("User32::IsZoomed", hDlg)))
    {
      SetForegroundWindow(hMainWnd);
      SetForegroundWindow(hDlg);
    }

    if (aFiles[nItem].toUpperCase() == AkelPad.GetEditFile(0).toUpperCase())
    {
      if (AkelPad.GetEditModified(0))
        bSaved = SaveCurDoc();

      if (bSaved)
      {
        if (AkelPad.IsMDI())
          AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
        else
          AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
      }
    }
    else
    {
      if (IsFileExists(aFiles[nItem]))
      {
        if (AkelPad.IsMDI() && SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 152 /*MI_SINGLEOPENFILE*/, 0) && (lpFrame = SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 5 /*FWF_BYFILENAME*/, aFiles[nItem])))
          SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame);

        if ((lpFrame || (! AkelPad.IsMDI())) && AkelPad.GetEditModified(0) && (bSaved = SaveCurDoc()))
          AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);

        if (bSaved && AkelPad.OpenFile(aFiles[nItem]) == 0 /*EOD_SUCCESS*/)
        {
          if (sLastContent && (! bLastNotContain))
          {
            if (bLastContentRE)
            {
              rContent = new RegExp(sLastContent, (bLastMatchCase ? "" : "i") + (bLastMultiline ? "m" : ""));
              if (rContent.test(AkelPad.GetTextRange(0, -1, 0 /*new line as is*/)))
                AkelPad.SetSel(ByteOffsetToRichOffset(RegExp.index), ByteOffsetToRichOffset(RegExp.lastIndex));
            }
            else
              AkelPad.TextFind(0, sLastContent, 0x00200001 /*FRF_BEGINNING|FRF_DOWN*/ | (bLastMatchCase ? 0x00000004 /*FRF_MATCHCASE*/ : 0));
          }
        }
      }
      else
        MessageBox(aFiles[nItem] + "\n\n" + sTxtFileNoExist);
    }
  }
}

function SaveCurDoc()
{
  var sFile = AkelPad.GetEditFile(0);
  var nAttr = GetFileAttr(sFile);
  var nChoice;
  var bSaveROMgs;

  nChoice = AkelPad.MessageBox(hDlg, AkelPad.GetEditFile(0) + (nAttr & 1 /*FILE_ATTRIBUTE_READONLY*/ ? "\n<" + sTxtReadOnly + ">" : "") + (nAttr & 2 /*FILE_ATTRIBUTE_HIDDEN*/ ? "\n<" + sTxtHidden + ">" : "") + (nAttr & 4 /*FILE_ATTRIBUTE_SYSTEM*/ ? "\n<" + sTxtSystem + ">" : "") + "\n\n" + sTxtDocModified, sTxtDlgTitle, 0x33 /*MB_ICONWARNING|MB_YESNOCANCEL*/);

  if (nChoice == 6 /*IDYES*/)
  {
    bSaveROMgs = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 221 /*MI_SAVEINREADONLYMSG*/, 0);
    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 221 /*MIS_SAVEINREADONLYMSG*/, 0);

    if (! AkelPad.Command(4105 /*IDM_FILE_SAVE*/))
      nChoice = 2;

    SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 221 /*MIS_SAVEINREADONLYMSG*/, bSaveROMgs);
  }
  else if (nChoice == 7 /*IDNO*/)
    SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, 0, 0);

  return (nChoice != 2);
}

function ByteOffsetToRichOffset(nByteOffset)
{
  var hEditWnd      = AkelPad.GetEditWnd();
  var lpCharIndex1  = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var lpCharIndex2  = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var lpIndexOffset = AkelPad.MemAlloc(_X64 ? 32 : 16 /*sizeof(AEINDEXOFFSET)*/);
  var nRichOffset;

  AkelPad.MemCopy(lpIndexOffset, lpCharIndex1, DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpIndexOffset, _X64 ? 8 : 4), lpCharIndex2, DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpIndexOffset, _X64 ? 16 : 8), nByteOffset, DT_QWORD);
  AkelPad.MemCopy(_PtrAdd(lpIndexOffset, _X64 ? 24 : 12), 3 /*AELB_ASIS*/, DT_DWORD);

  SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 1 /*AEGI_FIRSTCHAR*/, lpCharIndex1);
  SendMessage(hEditWnd, 3135 /*AEM_INDEXOFFSET*/, 0, lpIndexOffset);

  nRichOffset = SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpCharIndex2);

  AkelPad.MemFree(lpIndexOffset);
  AkelPad.MemFree(lpCharIndex1);
  AkelPad.MemFree(lpCharIndex2);

  return nRichOffset;
}

function CopyList()
{
  if (aFiles.length)
    AkelPad.SetClipboardText(aFiles.join("\r\n"));
}

function CopySelected()
{
  if (aFiles.length)
  {
    var sText = "";

    GetSelArrayLV();

    if (! aFilesSel.length)
      aFilesSel = [GetCurFocLV()];

    for (i = 0; i < aFilesSel.length; ++i)
      sText += aFiles[aFilesSel[i]] + "\r\n";

    AkelPad.SetClipboardText(sText);
  }
}

function ClearList()
{
  if (aFiles.length)
  {
    aFiles    = [];
    aFilesSel = [0];

    FillLV();
    EnableButtons();
    oSys.Call("User32::SetFocus", aDlg[IDFILELV].HWND);
  }
}

function RemoveFromList()
{
  if (aFiles.length)
  {
    SetTextSB(-2);
    SendMessage(aDlg[IDFILELV].HWND, 0x000B /*WM_SETREDRAW*/, 0, 0);
    SendMessage(aDlg[IDSTATUS].HWND, 0x000B /*WM_SETREDRAW*/, 0, 0);
    GetSelArrayLV();

    if (! aFilesSel.length)
      aFilesSel = [GetCurFocLV()];

    for (i = aFilesSel.length - 1; i >= 0; --i)
    {
      aFiles.splice(aFilesSel[i], 1);
      SendMessage(aDlg[IDFILELV].HWND, 0x1008 /*LVM_DELETEITEM*/, aFilesSel[i], 0);
    }

    SendMessage(aDlg[IDFILELV].HWND, 0x000B /*WM_SETREDRAW*/, 1, 0);
    SendMessage(aDlg[IDSTATUS].HWND, 0x000B /*WM_SETREDRAW*/, 1, 0);

    if (aFiles.length)
    {
      SetSelLV(aFilesSel[aFilesSel.length - 1] - aFilesSel.length + 1);
      if (GetNextSelLV(-1) < 0)
        SetSelLV(aFiles.length - 1);
    }
    else
    {
      FillLV();
      EnableButtons();
    }
  }
}

function Settings()
{
  var MF_STRING    = 0x0000;
  var MF_CHECKED   = 0x0008;
  var MF_SEPARATOR = 0x0800;
  var hMenu = oSys.Call("User32::CreatePopupMenu");
  var oRect = {};
  var nCmd;

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

  oSys.Call("User32::AppendMenuW", hMenu, (bPathShow    ? MF_CHECKED : MF_STRING), 1, sTxtPathShow);
  oSys.Call("User32::AppendMenuW", hMenu, (bSeparateWnd ? MF_CHECKED : MF_STRING), 2, sTxtSeparateWnd);
  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR);
  oSys.Call("User32::AppendMenuW", hMenu, (bKeepHist    ? MF_CHECKED : MF_STRING), 3, sTxtKeepHist);
  oSys.Call("User32::AppendMenuW", hMenu, (bKeepFiles   ? MF_CHECKED : MF_STRING), 4, sTxtKeepFiles);

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

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

  if (nCmd == 1)
  {
    bPathShow = ! bPathShow;
    nFilesFoc = GetCurFocLV();
    GetSelArrayLV();
    FillLV();
  }
  else if (nCmd == 2)
  {
    bSeparateWnd = ! bSeparateWnd;
    bCloseDlg    = false;
    PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }
  else if (nCmd == 3)
    bKeepHist = ! bKeepHist;
  else if (nCmd == 4)
    bKeepFiles = ! bKeepFiles;
}

function MessageBox(sText, bQuestion)
{
  var nType = 0x0030 /*MB_ICONWARNING*/;

  if (bQuestion)
    nType |= 0x0001 /*MB_OKCANCEL*/ | 0x0100 /*MB_DEFBUTTON2*/;

  return (AkelPad.MessageBox(hDlg, sText, sTxtDlgTitle, nType) == 1 /*IDOK*/);
}

function ReadIni()
{
  var sLngFile = WScript.ScriptFullName.replace(/\.js$/i, "_" + AkelPad.GetLangId(0 /*LANGID_FULL*/).toString() + ".lng");

  if (IsFileExists(sLngFile))
  {
    try
    {
      eval(AkelPad.ReadFile(sLngFile));
    }
    catch (oError)
    {
      GetLangStrings();
    }
  }
  else
    GetLangStrings();

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

  if (aDirs.length > nHistMax) aDirs.length = nHistMax;
  if (aNames.length > nHistMax) aNames.length = nHistMax;
  if (aContents.length > nHistMax) aContents.length = nHistMax;
  if (aReplace.length > nHistMax) aReplace.length = nHistMax;
  if (aHist.length > nHistMax) aHist.length = nHistMax;
}

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

  oWndPos.W   = Scale.UX(oWndPos.W);
  oWndPos.H   = Scale.UY(oWndPos.H);
  oWndPos.Max = oSys.Call("User32::IsZoomed", hDlg);
  sDir        = GetWindowText(aDlg[IDDIRCB].HWND);
  sName       = GetWindowText(aDlg[IDNAMECB].HWND);
  sContent    = GetWindowText(aDlg[IDCONTENTCB].HWND);
  sReplace    = GetWindowText(aDlg[IDREPLACECB].HWND);

  if (! bKeepHist)
  {
    aDirs.length     = 0;
    aNames.length    = 0;
    aContents.length = 0;
    aReplace.length  = 0;
    aHist.length     = 0;
  }

  if (bKeepFiles)
  {
    GetSelArrayLV();
    nFilesFoc = GetCurFocLV();
  }
  else
  {
    aFiles.length = 0;
    aFilesSel     = [0];
    nFilesFoc     = 0;

    for (i = 0; i < aHist.length; ++i)
      aHist[i].aFiles.length = 0;
  }

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

  sIniTxt +=
    'bPathShow='       + bPathShow + ';\r\n' +
    'bSeparateWnd='    + bSeparateWnd + ';\r\n' +
    'bKeepHist='       + bKeepHist + ';\r\n' +
    'bKeepFiles='      + bKeepFiles + ';\r\n' +
    'nPathLen='        + nPathLen + ';\r\n' +
    'bSortDesc='       + bSortDesc + ';\r\n' +
    'nDirLevel='       + nDirLevel + ';\r\n' +
    'bNameRE='         + bNameRE + ';\r\n' +
    'bNotName='        + bNotName + ';\r\n' +
    'bInFiles='        + bInFiles + ';\r\n' +
    'bInStreams='      + bInStreams + ';\r\n' +
    'bSkipReadOnly='   + bSkipReadOnly + ';\r\n' +
    'bSkipHidden='     + bSkipHidden + ';\r\n' +
    'bSkipSystem='     + bSkipSystem + ';\r\n' +
    'bInResults='      + bInResults + ';\r\n' +
    'bMatchCase='      + bMatchCase + ';\r\n' +
    'bContentRE='      + bContentRE + ';\r\n' +
    'bMultiline='      + bMultiline + ';\r\n' +
    'bNotContain='     + bNotContain + ';\r\n' +
    'bSkipBinary='     + bSkipBinary + ';\r\n' +
    'bSkipLarger='     + bSkipLarger + ';\r\n' +
    'nMaxFileSize='    + nMaxFileSize + ';\r\n' +
    'sDir="'           + sDir.replace(/[\\"]/g, '\\$&') + '";\r\n' +
    'sName="'          + sName.replace(/[\\"]/g, '\\$&') + '";\r\n' +
    'sContent="'       + sContent.replace(/[\\"]/g, '\\$&') + '";\r\n' +
    'sReplace="'       + sReplace.replace(/[\\"]/g, '\\$&') + '";\r\n' +
    'sLastContent="'   + sLastContent.replace(/[\\"]/g, '\\$&') + '";\r\n' +
    'bLastContentRE='  + bLastContentRE + ';\r\n' +
    'bLastMatchCase='  + bLastMatchCase + ';\r\n' +
    'bLastMultiline='  + bLastMultiline + ';\r\n' +
    'bLastNotContain=' + bLastNotContain + ';\r\n' +
    'bAfterReplace='   + bAfterReplace + ';\r\n' +
    'aDirs=['          + aDirs.join('\t').replace(/[\\"]/g, '\\$&').replace(/\t/g, '","').replace(/.+/, '"$&"') +'];\r\n' +
    'aNames=['         + aNames.join('\t').replace(/[\\"]/g, '\\$&').replace(/\t/g, '","').replace(/.+/, '"$&"') +'];\r\n' +
    'aContents=['      + aContents.join('\t').replace(/[\\"]/g, '\\$&').replace(/\t/g, '","').replace(/.+/, '"$&"') +'];\r\n' +
    'aReplace=['       + aReplace.join('\t').replace(/[\\"]/g, '\\$&').replace(/\t/g, '","').replace(/.+/, '"$&"') +'];\r\n' +
    'aFiles=['         + aFiles.join('\t').replace(/[\\"]/g, '\\$&').replace(/\t/g, '","').replace(/.+/, '"$&"') +'];\r\n' +
    'aFilesSel=['      + aFilesSel +'];\r\n' +
    'nFilesFoc='       + nFilesFoc +';\r\naHist=[';

  for (i = 0; i < aHist.length; ++i)
  {
    sIniTxt +=
      '{' +
      'nPathLen:'      + aHist[i].nPathLen + ',' +
      'bSortDesc:'     + aHist[i].bSortDesc + ',' +
      'nDirLevel:'     + aHist[i].nDirLevel + ',' +
      'bNameRE:'       + aHist[i].bNameRE + ',' +
      'bNotName:'      + aHist[i].bNotName + ',' +
      'bInFiles:'      + aHist[i].bInFiles + ',' +
      'bInStreams:'    + aHist[i].bInStreams + ',' +
      'bSkipReadOnly:' + aHist[i].bSkipReadOnly + ',' +
      'bSkipHidden:'   + aHist[i].bSkipHidden + ',' +
      'bSkipSystem:'   + aHist[i].bSkipSystem + ',' +
      'bInResults:'    + aHist[i].bInResults + ',' +
      'bMatchCase:'    + aHist[i].bMatchCase + ',' +
      'bContentRE:'    + aHist[i].bContentRE + ',' +
      'bMultiline:'    + aHist[i].bMultiline + ',' +
      'bNotContain:'   + aHist[i].bNotContain + ',' +
      'bSkipBinary:'   + aHist[i].bSkipBinary + ',' +
      'bSkipLarger:'   + aHist[i].bSkipLarger + ',' +
      'nMaxFileSize:'  + aHist[i].nMaxFileSize + ',' +
      'sDir:"'         + aHist[i].sDir.replace(/[\\"]/g, '\\$&') + '",' +
      'sName:"'        + aHist[i].sName.replace(/[\\"]/g, '\\$&') + '",' +
      'sContent:"'     + aHist[i].sContent.replace(/[\\"]/g, '\\$&') + '",' +
      'sReplace:"'     + aHist[i].sReplace.replace(/[\\"]/g, '\\$&') + '",' +
      'bAfterReplace:' + aHist[i].bAfterReplace + ',' +
      'aFiles:['       + aHist[i].aFiles.join('\t').replace(/[\\"]/g, '\\$&').replace(/\t/g, '","').replace(/.+/, '"$&"') + ']}' +
      ((i == aHist.length - 1) ? '' : ',');
  }

  sIniTxt += '];';

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

function GetLangStrings()
{
  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 = "File(s) 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";
}

Last edited by KDJ on Mon Jan 18, 2016 6:28 pm, edited 38 times in total.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Code: Select all

// Description(1033): Formation paragraph by previous line indented
// Description(1049): Формирование отступа по предыдущей строке
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=20315#p20315
// Version: 1.1 (2012.11.05)
// Author: VladSh

if (AkelPad.IsAkelEdit()) {
	if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
	var paragraph = "";
	var nPos = AkelPad.GetSelStart();
	var oRange = getRangeCompleteLine(nPos, nPos);
	var sLine = getTextbyRange(oRange);
	var oValues = separateRow(sLine);
	if (oValues.right) {
		// находимся на строке с текстом
		paragraph = pBreak + oValues.left + addedShiftBlock(oValues.right);
		nPos = oRange[1];
	}
	else {
		// находимся на пустой строке или это первая строка файла
		if (oValues.left || oRange[0] == 0) {
			// начальный отступ уже имеется - проставляем обычный отступ, беря из настроек
			paragraph = getShift();
		}
		else {
			// начальный отступ отсутствует - пытаемся взять его с предыдущей строки, как это делает Eclipse
			nPos = oRange[0] - 1;
			oRange = getRangeCompleteLine(nPos, nPos);
			sLine = getTextbyRange(oRange);
			oValues = separateRow(sLine);
			if (oValues.left)
				paragraph = oValues.left + addedShiftBlock(oValues.right);
			else
				paragraph = getShift();
			nPos = oRange[1] + 1;
		}
	}
	AkelPad.SetSel(nPos, nPos);
	AkelPad.ReplaceSel(paragraph);
}

// Определяем, необходим ли дополнительный отступ;
// необходим когда предыдущая строка является началом блока
function addedShiftBlock(lineValuePrev) {
	var sh = "";
	if (lineValuePrev.charAt(lineValuePrev.length - 1) == "{")
			sh = getShift();
	return sh;
}
Script used selCompleteLine.js.
Last edited by VladSh on Wed Jan 14, 2015 9:21 pm, edited 1 time in total.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Code: Select all

// Open raw email file in associated mailer ("eml" extension must be registered in OS)

var fso=new ActiveXObject("Scripting.FileSystemObject");
var sh=new ActiveXObject("Shell.Application");

var hMainWnd=AkelPad.GetMainWnd();
var pFileFullName=AkelPad.GetEditFile(0);

if (hMainWnd && pFileFullName && fso && sh)
{
	// construct new file name in TEMP folder with .eml extension
	pNewFileName = fso.BuildPath(fso.GetSpecialFolder(2), fso.GetBaseName(pFileFullName) + ".eml");
	// create temporary copy of the file
	fso.CopyFile(pFileFullName, pNewFileName, true);
	// open it in associated app
	sh.ShellExecute(pNewFileName);
}

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

Post by KDJ »

Switch between different views of AkelPad screen - part 1.
Part 2 - in the next post.
Required to include: ChooseFont_function.js and InputBox_function.js
All in one: KDJ.zip

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=20761#p20761
// Version: 2015-01-09
// Author: KDJ
//
// *** Switch between different views of AkelPad screen ***
//
// Required to include: ChooseFont_function.js and InputBox_function.js
//
// Usage:
//   Call("Scripts::Main", 1, "ScreenView.js") - dialog box with settings
//   Call("Scripts::Main", 1, "ScreenView.js", '-View="ViewName"')
//   Call("Scripts::Main", 1, "ScreenView.js", '-FullScreen=1')
//   Call("Scripts::Main", 1, "ScreenView.js", '-View="ViewName" -FullScreen=-1')
//
// Arguments:
//   View:
//     name of view to set (default is "Default")
//   FullScreen:
//    -1 - switch on/off
//     0 - full screen off
//     1 - full screen on
//     2 - not change (default)
//
// Some keyboard shortcuts in dialog box:
//   TAB      - switch between "View name" and "View settings" windows
//   INS      - New
//   F2       - Rename
//   DEL      - Delete
//   Alt+->   - plugin settings
//   Ctrl+INS - copy view name to the clipboard
//   Pressing the font button with Ctrl or Shift key, displays only monospace fonts.

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

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

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

  var DT_UNICODE   = 1;
  var DT_QWORD     = 2;
  var DT_DWORD     = 3;
  var DT_BYTE      = 5;

  var sScriptName  = "ScreenView";
  var hMainWnd     = AkelPad.GetMainWnd();
  var hEditWnd     = AkelPad.GetEditWnd();
  var oFSO         = new ActiveXObject("Scripting.FileSystemObject");
  var nBufSize     = 1024;
  var oView        = {};
  var aTB          = GetToolBarsArray();
  var oPlug        = GetPluginsObject();
  var sFullScr     = "FullScreen";
  var sFullScrFunc = sFullScr + "::Main";
  var nWndMinW     = 330;
  var nWndPosX     = 240;
  var nWndPosY     = 110;
  var nWndPosW     = nWndMinW;
  var nWndPosH     = 550 + aTB.length * 20;
  var nView        = 0;
  var hFocus;
  var hFocus1;
  var i;

  if (! hEditWnd)
    WScript.Quit();

  ReadWriteIni(false);
  CheckViewObject();

  if (WScript.Arguments.length)
  {
    if (ApplyView(AkelPad.GetArgValue("View", "Default"), AkelPad.GetArgValue(sFullScr, 2)))
      WScript.Quit();
  }

  if (nWndPosW < nWndMinW)
    nWndPosW = nWndMinW;

  var CLASS = 0;
  var HWND  = 1;
  var STYLE = 2;
  var TXT   = 3;
  var LINK  = 4;
  var NAME  = 5;

  var aWnd             = [];
  var IDNAMES          = 2000;
  var IDNAMELB         = 2001;
  var IDFULLSCREEN     = 2002;
  var IDNEW            = 2003;
  var IDRENAME         = 2004;
  var IDDELETE         = 2005;
  var IDAPPLY          = 2006;
  var IDOK             = 2007;
  var IDTHEMESET       = 2008;
  var IDCODERTHEMESET  = 2009;
  var IDCLIPBOARDSET   = 2010;
  var IDCODEFOLDSET    = 2011;
  var IDLINEBOARDSET   = 2012;
  var IDLOGSET         = 2013;
  var IDMENUSET        = 2014;
  var IDSPECCHARSET    = 2015;
  var IDVIEWSET        = 2016;
  var IDFONT           = 2017;
  var IDFONTSET        = 2018;
  var IDTHEME          = 2019;
  var IDTHEMENAME      = 2020;
  var IDCODERTHEME     = 2021;
  var IDCODERTHEMENAME = 2022;
  var IDCLIPBOARD      = 2023;
  var IDCODEFOLD       = 2024;
  var IDCODELIST       = 2025;
  var IDEXPLORER       = 2026;
  var IDHEXSEL         = 2027;
  var IDLINEBOARD      = 2028;
  var IDLOG            = 2029;
  var IDMENU           = 2030;
  var IDQSEARCH        = 2031;
  var IDSCROLLBARH     = 2032;
  var IDSCROLLBARV     = 2033;
  var IDSPECCHAR       = 2034;
  var IDSPEECH         = 2035;
  var IDSTATUSBAR      = 2036;
  var IDTABBAR         = 2037;
  var IDTABBARTOP      = 2038;
  var IDTOOLBAR        = 2039;

  //0x50000000 - WS_VISIBLE|WS_CHILD
  //0x50000001 - WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON
  //0x50000003 - WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX
  //0x50004000 - WS_VISIBLE|WS_CHILD|BS_NOTIFY
  //0x50004003 - WS_VISIBLE|WS_CHILD|BS_NOTIFY|BS_AUTOCHECKBOX
  //0x50004006 - WS_VISIBLE|WS_CHILD|BS_NOTIFY|BS_AUTO3STATE
  //0x50000007 - WS_VISIBLE|WS_CHILD|BS_GROUPBOX
  //0x50800080 - WS_VISIBLE|WS_CHILD|WS_BORDER|ES_AUTOHSCROLL
  //0x50A10103 - WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_BORDER|WS_TABSTOP|LBS_NOINTEGRALHEIGHT|LBS_SORT|LBS_NOTIFY
  //Windows               CLASS,    HWND,      STYLE, TXT,               LINK,            NAME (in oView, oPlug)
  aWnd[IDNAMES         ]=["STATIC",    0, 0x50000000, "View name",       0];
  aWnd[IDNAMELB        ]=["LISTBOX",   0, 0x50A00103, "",                0];
  aWnd[IDFULLSCREEN    ]=["BUTTON",    0, 0x50000003, "&" + sFullScr,    0];
  aWnd[IDNEW           ]=["BUTTON",    0, 0x50000000, "&New",            0];
  aWnd[IDRENAME        ]=["BUTTON",    0, 0x50000000, "&Rename",         0];
  aWnd[IDDELETE        ]=["BUTTON",    0, 0x50000000, "&Delete",         0];
  aWnd[IDAPPLY         ]=["BUTTON",    0, 0x50000000, "&Apply",          0];
  aWnd[IDOK            ]=["BUTTON",    0, 0x50000001, "OK",              0];
  aWnd[IDTHEMESET      ]=["BUTTON",    0, 0x50000000, ">",               IDTHEME];
  aWnd[IDCODERTHEMESET ]=["BUTTON",    0, 0x50000000, ">",               IDCODERTHEME];
  aWnd[IDCLIPBOARDSET  ]=["BUTTON",    0, 0x50000000, ">",               IDCLIPBOARD];
  aWnd[IDCODEFOLDSET   ]=["BUTTON",    0, 0x50000000, ">",               IDCODEFOLD];
  aWnd[IDLINEBOARDSET  ]=["BUTTON",    0, 0x50000000, ">",               IDLINEBOARD];
  aWnd[IDLOGSET        ]=["BUTTON",    0, 0x50000000, ">",               IDLOG];
  aWnd[IDMENUSET       ]=["BUTTON",    0, 0x50000000, ">",               IDMENU];
  aWnd[IDSPECCHARSET   ]=["BUTTON",    0, 0x50000000, ">",               IDSPECCHAR];
  aWnd[IDVIEWSET       ]=["BUTTON",    0, 0x50000007, "View settings",   0];
  aWnd[IDFONT          ]=["BUTTON",    0, 0x50004003, "Font",            0,               "Font"];
  aWnd[IDFONTSET       ]=["BUTTON",    0, 0x50004000, "",                0,               "FontSet"];
  aWnd[IDTHEME         ]=["BUTTON",    0, 0x50004003, "ColorTheme",      IDTHEMESET,      "Theme"];
  aWnd[IDTHEMENAME     ]=["BUTTON",    0, 0x50004000, "",                IDTHEMESET,      "ThemeName"];
  aWnd[IDCODERTHEME    ]=["BUTTON",    0, 0x50004006, "ColorCoderTheme", IDCODERTHEMESET, "CoderTheme"];
  aWnd[IDCODERTHEMENAME]=["BUTTON",    0, 0x50004000, "",                IDCODERTHEMESET, "CoderThemeName"];
  aWnd[IDCLIPBOARD     ]=["BUTTON",    0, 0x50004006, "Clipboard",       IDCLIPBOARDSET,  "Clipboard"];
  aWnd[IDCODEFOLD      ]=["BUTTON",    0, 0x50004006, "CodeFold",        IDCODEFOLDSET,   "CodeFold"];
  aWnd[IDCODELIST      ]=["BUTTON",    0, 0x50004006, "CodeFoldList",    0,               "CodeList"];
  aWnd[IDEXPLORER      ]=["BUTTON",    0, 0x50004006, "Explorer",        0,               "Explorer"];
  aWnd[IDHEXSEL        ]=["BUTTON",    0, 0x50004006, "HexSel",          0,               "HexSel"];
  aWnd[IDLINEBOARD     ]=["BUTTON",    0, 0x50004006, "LineBoard",       IDLINEBOARDSET,  "LineBoard"];
  aWnd[IDLOG           ]=["BUTTON",    0, 0x50004006, "Log",             IDLOGSET,        "Log"];
  aWnd[IDMENU          ]=["BUTTON",    0, 0x50004006, "MenuMain",        IDMENUSET,       "Menu"];
  aWnd[IDQSEARCH       ]=["BUTTON",    0, 0x50004006, "QSearch",         0,               "QSearch"];
  aWnd[IDSCROLLBARH    ]=["BUTTON",    0, 0x50004006, "ScrollBarH",      0,               "ScrollBarH"];
  aWnd[IDSCROLLBARV    ]=["BUTTON",    0, 0x50004006, "ScrollBarV",      0,               "ScrollBarV"];
  aWnd[IDSPECCHAR      ]=["BUTTON",    0, 0x50004006, "SpecialChar",     IDSPECCHARSET,   "SpecChar"];
  aWnd[IDSPEECH        ]=["BUTTON",    0, 0x50004006, "Speech",          0,               "Speech"];
  aWnd[IDSTATUSBAR     ]=["BUTTON",    0, 0x50004006, "StatusBar",       0,               "StatusBar"];
  aWnd[IDTABBAR        ]=["BUTTON",    0, 0x50004006, "TabBar",          0,               "TabBar"];
  aWnd[IDTABBARTOP     ]=["BUTTON",    0, 0x50004003, "Top",             0,               "TabBarTop"];

  for (i = 0; i < aTB.length; ++i)
  {
    aWnd[IDTOOLBAR + i                 ]=["BUTTON", 0, 0x50004006, aTB[i], 0, aTB[i]];
    aWnd[IDTOOLBAR + aTB.length + i    ]=["EDIT",   0, 0x50800080, "",     0, aTB[i] + "Rows"];
    aWnd[IDTOOLBAR + aTB.length * 2 + i]=["STATIC", 0, 0x50000000, "Rows", 0];
  }

  AkelPad.WindowRegisterClass(sClassName);

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

  //Allow other scripts running
  AkelPad.ScriptNoMutex();

  //Message loop
  AkelPad.WindowGetMessage();

  AkelPad.WindowUnregisterClass(sClassName);
}

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

    for (i = 2000; i < aWnd.length; ++i)
    {
      aWnd[i][HWND] =
        oSys.Call("User32::CreateWindowExW",
          0,              //dwExStyle
          aWnd[i][CLASS], //lpClassName
          0,              //lpWindowName
          aWnd[i][STYLE], //dwStyle
          0,              //x
          0,              //y
          0,              //nWidth
          0,              //nHeight
          hWnd,           //hWndParent
          i,              //ID
          hInstance,      //hInstance
          0);             //lpParam

      //Set font and text
      SendMessage(aWnd[i][HWND], 48 /*WM_SETFONT*/, hGuiFont, true);
      oSys.Call("User32::SetWindowTextW", aWnd[i][HWND], aWnd[i][TXT]);
    }

    for (i = 0; i < aTB.length; ++i)
      SendMessage(aWnd[IDTOOLBAR + aTB.length + i][HWND], 0x00C5 /*EM_SETLIMITTEXT*/, 23, 0);

    //fill list box
    for (i in oView)
      SendMessage(aWnd[IDNAMELB][HWND], 0x0180 /*LB_ADDSTRING*/, 0, i);

    if (nView >= GetCountLB())
      nView = GetCountLB() - 1;

    SetCurSelLB(nView);
    SendMessage(aWnd[IDNAMELB][HWND], 0x0197 /*LB_SETTOPINDEX*/, nView, 0);

    hFocus  = aWnd[IDNAMELB][HWND];
    hFocus1 = aWnd[IDFONT][HWND];
  }

  else if (uMsg == 7) //WM_SETFOCUS
  {
    EnablePluginButtons();
    CheckButtons();
    SendMessage(aWnd[IDFULLSCREEN][HWND], 0x00F1 /*BM_SETCHECK*/, IsFullScreen(), 0);
    oSys.Call("User32::SetFocus", hFocus);
  }

  else if (uMsg == 36) //WM_GETMINMAXINFO
  {
    var oRect = {};
    GetWindowPos(oSys.Call("User32::GetDesktopWindow"), oRect);
    AkelPad.MemCopy(_PtrAdd(lParam, 24), nWndMinW,     DT_DWORD); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(lParam, 28), nWndPosH,     DT_DWORD); //ptMinTrackSize_y
    AkelPad.MemCopy(_PtrAdd(lParam, 32), oRect.W - 30, DT_DWORD); //ptMaxTrackSize_x
    AkelPad.MemCopy(_PtrAdd(lParam, 36), nWndPosH,     DT_DWORD); //ptMaxTrackSize_y
  }

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

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

  else if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if (wParam == 0x09 /*VK_TAB*/)
    {
      if (hFocus == aWnd[IDNAMELB][HWND])
      {
        while (! oSys.Call("User32::IsWindowEnabled", hFocus1))
          hFocus1 = aWnd[oSys.Call("User32::GetDlgCtrlID", hFocus1) - 1][HWND];

        oSys.Call("User32::SetFocus", hFocus1);
      }
      else
      {
        var nID = oSys.Call("User32::GetDlgCtrlID", hFocus);
        if (nID < IDTOOLBAR)
          oSys.Call("User32::SetFocus", aWnd[IDNAMELB][HWND]);
        else if (nID < IDTOOLBAR + aTB.length)
          oSys.Call("User32::SetFocus", aWnd[nID + aTB.length][HWND]);
        else
          oSys.Call("User32::SetFocus", aWnd[IDNAMELB][HWND]);
      }
    }
    else if (wParam == 0x2D /*VK_INSERT*/)
    {
      if ((! Ctrl()) && (! Shift()))
        NewView();
      else if (Ctrl() && (! Shift()))
        AkelPad.SetClipboardText(GetCurTextLB());
    }
    else if (wParam == 0x71 /*VK_F2*/)
    {
      if ((! Ctrl()) && (! Shift()))
        RenameView();
    }
    else if (wParam == 0x2E /*VK_DELETE*/)
    {
      if ((! Ctrl()) && (! Shift()) && (oSys.Call("User32::GetDlgCtrlID", hFocus) < IDTOOLBAR + aTB.length))
        DeleteView();
    }
    else if (wParam == 0x0D /*VK_RETURN*/)
    {
      if ((! Ctrl()) && (! Shift()))
      {
        if ((hFocus != aWnd[IDFONTSET][HWND]) && (hFocus != aWnd[IDTHEMENAME][HWND]) && (hFocus != aWnd[IDCODERTHEMENAME][HWND]))
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDOK, 0);
      }
    }
    else if (wParam == 0x7A /*VK_F11*/)
    {
      if ((! Ctrl()) && (! Shift()))
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDFULLSCREEN, 0);
    }
    else if (wParam == 0x1B /*VK_ESCAPE*/)
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 260) //WM_SYSKEYDOWN
  {
    if (wParam == 0x27 /*VK_RIGHT*/)
    {
      var nID = oSys.Call("User32::GetDlgCtrlID", hFocus);

      if (aWnd[nID][LINK] && oSys.Call("User32::IsWindowEnabled", aWnd[aWnd[nID][LINK]][HWND]))
        PostMessage(hWnd, 273 /*WM_COMMAND*/, aWnd[nID][LINK], 0);
    }
  }

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

    if (nLowParam == IDNAMELB)
    {
      if (nHiwParam == 1 /*LBN_SELCHANGE*/)
        CheckButtons();
      else if (nHiwParam == 4 /*LBN_SETFOCUS*/)
        hFocus = lParam;
    }
    else if (nLowParam == IDFULLSCREEN)
    {
      FullScreenSwitch();
      oSys.Call("User32::SetFocus", hFocus);
    }
    else if ((nLowParam >= IDNEW) && (nLowParam <= IDSPECCHARSET))
    {
      PostMessage(lParam, 0x00F4 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
      PostMessage(aWnd[IDOK][HWND], 0x00F4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);

      if (nLowParam == IDNEW)
        NewView();
      else if (nLowParam == IDRENAME)
        RenameView();
      else if (nLowParam == IDDELETE)
        DeleteView();
      else if (nLowParam == IDAPPLY)
        ApplyView(GetCurTextLB(), 2);
      else if (nLowParam == IDOK)
      {
        ApplyView(GetCurTextLB(), 2);
        PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
      }
      else
      {
        oSys.Call("User32::ShowWindow", hWnd, 6 /*SW_MINIMIZE*/); //for Win7
        oSys.Call("User32::ShowWindow", hWnd, 0 /*SW_HIDE*/);

        if (nLowParam == IDTHEMESET)
          AkelPad.Command(4202);
        else
          oPlug[aWnd[aWnd[nLowParam][LINK]][NAME]].Settings();

        oSys.Call("User32::ShowWindow", hWnd, 9 /*SW_RESTORE*/);
      }

      oSys.Call("User32::SetFocus", hFocus);
    }
    else if (nLowParam >= IDFONT)
    {
      if (nHiwParam == 6 /*BN_SETFOCUS*/)
      {
        hFocus  = lParam;
        hFocus1 = lParam;
        if ((nLowParam == IDFONTSET) || (nLowParam == IDTHEMENAME) || (nLowParam == IDCODERTHEMENAME))
        {
          PostMessage(lParam, 0x00F4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
          PostMessage(aWnd[IDOK][HWND], 0x00F4 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
        }
      }
      else if (nHiwParam == 7 /*BN_KILLFOCUS*/)
      {
        if ((nLowParam == IDFONTSET) || (nLowParam == IDTHEMENAME) || (nLowParam == IDCODERTHEMENAME))
        {
          PostMessage(lParam, 0x00F4 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
          PostMessage(aWnd[IDOK][HWND], 0x00F4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
        }
      }
      else if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
      {
        hFocus  = lParam;
        hFocus1 = aWnd[nLowParam - aTB.length][HWND];
      }
      else
        GetButtonState(nLowParam);
    }
  }

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

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

  return 0;
}

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

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

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

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

function 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 GetWindowPos(hWnd, oRect)
{
  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)

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

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

  AkelPad.MemFree(lpRect);
}

function GetCurSelLB()
{
  return SendMessage(aWnd[IDNAMELB][HWND], 0x0188 /*LB_GETCURSEL*/, 0, 0);
}

function SetCurSelLB(nPos)
{
  SendMessage(aWnd[IDNAMELB][HWND], 0x0186 /*LB_SETCURSEL*/, nPos, 0);
}

function GetCurTextLB()
{
  var lpText = AkelPad.MemAlloc(1024);
  var sText;

  SendMessage(aWnd[IDNAMELB][HWND], 0x0189 /*LB_GETTEXT*/, GetCurSelLB(), lpText);
  sText = AkelPad.MemRead(lpText, DT_UNICODE);
  AkelPad.MemFree(lpText);

  return sText;
}

function GetCountLB()
{
  return SendMessage(aWnd[IDNAMELB][HWND], 0x018B /*LB_GETCOUNT*/, 0, 0);
}

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

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

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

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

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

function ResizeWindow(hWnd)
{
  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
  var nW, nH, nBW;
  var i;

  oSys.Call("User32::GetClientRect", hWnd, lpRect);
  nW  = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD);
  nH  = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD);
  nBW = (nW - 20 - (IDOK - IDNEW) * 3) / (IDOK - IDNEW + 1);
  AkelPad.MemFree(lpRect);

  oSys.Call("User32::SetWindowPos", aWnd[IDNAMES][HWND], 0,
            10,
            10,
            100,
            13,
            0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  oSys.Call("User32::SetWindowPos", aWnd[IDNAMELB][HWND], 0,
            10,
            30,
            nW - 200 - 30,
            nH - 30 - 23 - 20,
            0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  oSys.Call("User32::SetWindowPos", aWnd[IDFULLSCREEN][HWND], 0,
            nW - 80,
            10,
            70,
            16,
            0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  for (i = IDNEW; i <= IDOK; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i][HWND], 0,
              10 + (i - IDNEW) * (nBW + 3),
              nH - 23 - 10,
              nBW,
              23,
              0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  for (i = IDTHEMESET; i <= IDSPECCHARSET; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i][HWND], 0,
              nW - 35,
              90 + (aWnd[i][LINK] - IDTHEME) * 20,
              15,
              20,
              0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  oSys.Call("User32::SetWindowPos", aWnd[IDVIEWSET][HWND], 0,
            nW - 210,
            30,
            200,
            nH - 30 - 23 - 20,
            0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  for (i = IDFONT; i <= IDCODERTHEME; i += 2)
  {
    oSys.Call("User32::SetWindowPos", aWnd[i][HWND], 0,
              nW - 200,
              50 + (i - IDFONT) * 20,
              100,
              20,
              0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
    oSys.Call("User32::SetWindowPos", aWnd[i + 1][HWND], 0,
              nW - 190,
              70 + (i - IDFONT) * 20,
              170,
              20,
              0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  }
  for (i = IDCLIPBOARD; i <= IDTABBAR; ++i)
    oSys.Call("User32::SetWindowPos", aWnd[i][HWND], 0,
              nW - 200,
              170 + (i - IDCLIPBOARD) * 20,
              100,
              20,
              0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  oSys.Call("User32::SetWindowPos", aWnd[IDTABBARTOP][HWND], 0,
            nW - 100,
            170 + (IDTABBAR - IDCLIPBOARD) * 20,
            50,
            20,
            0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  for (i = 0; i < aTB.length; ++i)
  {
    oSys.Call("User32::SetWindowPos", aWnd[IDTOOLBAR + i][HWND], 0,
              nW - 200,
              470 + i * 20,
              100,
              20,
              0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
    oSys.Call("User32::SetWindowPos", aWnd[IDTOOLBAR + aTB.length + i][HWND], 0,
              nW - 100,
              470 + i * 20,
              50,
              18,
              0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
    oSys.Call("User32::SetWindowPos", aWnd[IDTOOLBAR + aTB.length * 2 + i][HWND], 0,
              nW - 47,
              470 + i * 20,
              30,
              13,
              0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  }

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

function GetToolBarsArray()
{
  var sToolBar  = "ToolBar";
  var lpFind    = AkelPad.MemAlloc(44 + (260 + 14) * 2); //sizeof(WIN32_FIND_DATA)
  var hFindFile = oSys.Call("kernel32::FindFirstFileW", AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\" + sToolBar + "*.dll", lpFind);
  var aTB       = [];
  var sPlugName;

  if (hFindFile != -1) //INVALID_HANDLE_VALUE
  {
    do
    {
      sPlugName = AkelPad.MemRead(_PtrAdd(lpFind, 44 /*offsetof(WIN32_FIND_DATAW, cFileName)*/), DT_UNICODE);
      aTB.push(sPlugName.substring(sPlugName.lastIndexOf("\\") + 1, sPlugName.lastIndexOf(".")));
    }
    while (oSys.Call("kernel32::FindNextFileW", hFindFile, lpFind));

    oSys.Call("kernel32::FindClose", hFindFile);
  }

  if (aTB.length)
    aTB.sort(
      function(sA, sB)
      {
        return oSys.Call("kernel32::lstrcmpiW", sA, sB);
      });
  else
    aTB.push(sToolBar);

  AkelPad.MemFree(lpFind);
  return aTB;
}

function GetPluginsObject()
{
  var oPlug = {
    Clipboard:  {Name: "Clipboard",   State:  0, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::Capture");},   Switch: function(){AkelPad.CallEx(0x14, this.Name + "::Capture");},   Settings: function(){AkelPad.Call(this.Name + "::Settings");}},
    CodeFold:   {Name: "Coder",       State:  2, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::CodeFold");},  Switch: function(){AkelPad.CallEx(0x14, this.Name + "::CodeFold");},  Settings: function(){AkelPad.Call(this.Name + "::Settings", 3, 2);}},
    CoderTheme: {Name: "Coder",       State: -1, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::HighLight");}, Switch: function(){AkelPad.CallEx(0x14, this.Name + "::HighLight");}, Settings: function(){AkelPad.Call(this.Name + "::Settings", 3, 0);}},
    Explorer:   {Name: "Explorer",    State:  0, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::Main");},      Switch: function(){AkelPad.CallEx(0x14, this.Name + "::Main");}},
    HexSel:     {Name: "HexSel",      State:  0, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::Main");},      Switch: function(){AkelPad.CallEx(0x14, this.Name + "::Main");}},
    LineBoard:  {Name: "LineBoard",   State:  2, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::Main");},      Switch: function(){AkelPad.CallEx(0x14, this.Name + "::Main", 1);},   Settings: function(){AkelPad.Call(this.Name + "::Settings");}},
    Log:        {Name: "Log",         State:  0, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::Output");},    Switch: function(){AkelPad.CallEx(0x14, this.Name + "::Output");},    Settings: function(){AkelPad.Call(this.Name + "::Settings");}},
    Menu:       {Name: "ContextMenu", State: -1, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::Main");},      Switch: function(){AkelPad.CallEx(0x14, this.Name + "::Main", 10);},  Settings: function(){AkelPad.Call(this.Name + "::Main", 1, 1);}},
    QSearch:    {Name: "QSearch",     State:  0, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::QSearch");},   Switch: function(){AkelPad.CallEx(0x14, this.Name + "::QSearch");}},
    SpecChar:   {Name: "SpecialChar", State:  2, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::Main");},      Switch: function(){AkelPad.CallEx(0x14, this.Name + "::Main");},      Settings: function(){AkelPad.Call(this.Name + "::Settings");}},
    Speech:     {Name: "Speech",      State:  0, IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::Main");},      Switch: function(){AkelPad.CallEx(0x14, this.Name + "::Main");}}
    };

  for (var i = 0; i < aTB.length; ++i)
    oPlug[aTB[i]] = {State: 0, Name: aTB[i], IsRunning: function(){return AkelPad.IsPluginRunning(this.Name + "::Main");}};

  return oPlug;
}

function CheckViewObject()
{
  var sDefault = "Default";
  var aFont    = ConvertFontFormat(SendMessage(hEditWnd, 0x0031 /*WM_GETFONT*/, 0, 0), 2, 3);
  var oTemp = {
    Font:           0,
    FontName:       aFont[0],
    FontStyle:      aFont[1],
    FontSize:       aFont[2],
    Theme:          0,
    ThemeName:      "<Standard>",
    CoderThemeName: "Default",
    CodeList:       2,
    ScrollBarH:     2,
    ScrollBarV:     2,
    StatusBar:      2,
    TabBar:         2,
    TabBarTop:      1};
  var i, n;

  for (i in oPlug)
    oTemp[i] = 2;

  oTemp.CoderTheme = 2;

  for (i = 0; i < aTB.length; ++i)
    oTemp[aTB[i] + "Rows"] = "";

  for (i in oView)
  {
    for (n in oView[i])
    {
      if (! (n in oTemp))
        delete oView[i][n];
    }
  }

  for (n in oTemp)
  {
    for (i in oView)
    {
      if (! (n in oView[i]))
        oView[i][n] = oTemp[n];
    }
  }

  if (! (sDefault in oView))
  {
    oView[sDefault] = {};
    for (n in oTemp)
      oView[sDefault][n] = oTemp[n];
  }
}

function EnablePluginButtons()
{
  var i;

  oSys.Call("User32::EnableWindow", aWnd[IDFULLSCREEN][HWND], IsPluginExists(sFullScr));
  oSys.Call("User32::EnableWindow", aWnd[IDCODERTHEME][HWND], IsPluginExists(oPlug.CoderTheme.Name));

  for (i = IDCLIPBOARD; i < IDTOOLBAR + aTB.length; ++i)
  {
    if ((aWnd[i][NAME] in oPlug) && (oPlug[aWnd[i][NAME]].State >= 0))
      oSys.Call("User32::EnableWindow", aWnd[i][HWND], IsPluginExists(oPlug[aWnd[i][NAME]].Name));
  }

  for (i = 0; i < aTB.length; ++i)
  {
    oSys.Call("User32::EnableWindow", aWnd[IDTOOLBAR + aTB.length + i    ][HWND], IsPluginExists(oPlug[aWnd[IDTOOLBAR + i][NAME]].Name));
    oSys.Call("User32::EnableWindow", aWnd[IDTOOLBAR + aTB.length * 2 + i][HWND], IsPluginExists(oPlug[aWnd[IDTOOLBAR + i][NAME]].Name));
  }

  for (i = IDCODERTHEMESET; i <= IDSPECCHARSET; ++i)
    oSys.Call("User32::EnableWindow", aWnd[i][HWND], IsPluginExists(oPlug[aWnd[aWnd[i][LINK]][NAME]].Name));
}

function CheckButtons()
{
  var sName = GetCurTextLB();
  var i;

  SendMessage(aWnd[IDFONT][HWND], 0x00F1 /*BM_SETCHECK*/, oView[sName].Font, 0);
  oSys.Call("User32::EnableWindow", aWnd[IDFONTSET][HWND], oView[sName].Font);
  oSys.Call("User32::SetWindowTextW", aWnd[IDFONTSET][HWND], oView[sName].FontName + "," + oView[sName].FontStyle + "," + oView[sName].FontSize);

  SendMessage(aWnd[IDTHEME][HWND], 0x00F1 /*BM_SETCHECK*/, oView[sName].Theme, 0);
  oSys.Call("User32::EnableWindow", aWnd[IDTHEMENAME][HWND], oView[sName].Theme);
  oSys.Call("User32::SetWindowTextW", aWnd[IDTHEMENAME][HWND], oView[sName].ThemeName);

  SendMessage(aWnd[IDCODERTHEME][HWND], 0x00F1 /*BM_SETCHECK*/, oView[sName].CoderTheme, 0);
  oSys.Call("User32::EnableWindow", aWnd[IDCODERTHEMENAME][HWND], (oView[sName].CoderTheme == 1) && oSys.Call("User32::IsWindowEnabled", aWnd[IDCODERTHEME][HWND]));
  oSys.Call("User32::SetWindowTextW", aWnd[IDCODERTHEMENAME][HWND], oView[sName].CoderThemeName);

  for (i = IDCLIPBOARD; i < IDTOOLBAR + aTB.length; ++i)
    SendMessage(aWnd[i][HWND], 0x00F1 /*BM_SETCHECK*/, oView[sName][aWnd[i][NAME]], 0);

  for (i = 0; i < aTB.length; ++i)
    oSys.Call("User32::SetWindowTextW", aWnd[IDTOOLBAR + aTB.length + i][HWND], oView[sName][aWnd[IDTOOLBAR + aTB.length + i][NAME]]);

  oSys.Call("User32::EnableWindow", aWnd[IDCODELIST ][HWND], oView[sName].CodeFold && oSys.Call("User32::IsWindowEnabled", aWnd[IDCODEFOLD][HWND]));
  oSys.Call("User32::EnableWindow", aWnd[IDTABBAR   ][HWND], AkelPad.IsMDI());
  oSys.Call("User32::EnableWindow", aWnd[IDTABBARTOP][HWND], (oView[sName].TabBar == 1) && AkelPad.IsMDI());
  oSys.Call("User32::EnableWindow", aWnd[IDRENAME   ][HWND], sName != "Default");
  oSys.Call("User32::EnableWindow", aWnd[IDDELETE   ][HWND], sName != "Default");
}

function GetButtonState(nID)
{
  var sName = GetCurTextLB();
  var lpText;

  if (! sName)
    return;

  if (nID == IDFONTSET)
  {
    var aFont = ChooseFont(hWndDlg, 3, [oView[sName].FontName, oView[sName].FontStyle, oView[sName].FontSize], 0, (Ctrl() || Shift()), 3);
    if (aFont)
    {
      oView[sName].FontName  = aFont[0];
      oView[sName].FontStyle = aFont[1];
      oView[sName].FontSize  = aFont[2];
      oSys.Call("User32::SetWindowTextW", aWnd[IDFONTSET][HWND], oView[sName].FontName + "," + oView[sName].FontStyle + "," + oView[sName].FontSize);
    }
  }
  else if (nID == IDTHEMENAME)
    SetThemeName(sName);
  else if (nID == IDCODERTHEMENAME)
    SetCoderThemeName(sName);
  else if ((nID >= IDTOOLBAR + aTB.length) && (nID < IDTOOLBAR + aTB.length * 2))
  {
    lpText = AkelPad.MemAlloc(48);
    oSys.Call("User32::GetWindowTextW", aWnd[nID][HWND], lpText, 24);
    oView[sName][aWnd[nID][NAME]] = AkelPad.MemRead(lpText, DT_UNICODE);
    AkelPad.MemFree(lpText);
  }
  else
  {
    oView[sName][aWnd[nID][NAME]] = SendMessage(aWnd[nID][HWND], 0x00F0 /*BM_GETCHECK*/, 0, 0);

    if (nID == IDTHEME)
    {
      if (oView[sName].Theme)
      {
        oView[sName].CoderTheme = 0;
        SendMessage(aWnd[IDCODERTHEME][HWND], 0x00F1 /*BM_SETCHECK*/, oView[sName].CoderTheme, 0);
      }
    }
    else if (nID == IDCODERTHEME)
    {
      if (oView[sName].CoderTheme)
      {
        oView[sName].Theme = 0;
        SendMessage(aWnd[IDTHEME][HWND], 0x00F1 /*BM_SETCHECK*/, oView[sName].Theme, 0);
      }
    }

    oSys.Call("User32::EnableWindow", aWnd[IDFONTSET       ][HWND], oView[sName].Font);
    oSys.Call("User32::EnableWindow", aWnd[IDTHEMENAME     ][HWND], oView[sName].Theme);
    oSys.Call("User32::EnableWindow", aWnd[IDCODERTHEMENAME][HWND], (oView[sName].CoderTheme == 1) && oSys.Call("User32::IsWindowEnabled", aWnd[IDCODERTHEME][HWND]));
    oSys.Call("User32::EnableWindow", aWnd[IDCODELIST      ][HWND], oView[sName].CodeFold && oSys.Call("User32::IsWindowEnabled", aWnd[IDCODEFOLD][HWND]));
    oSys.Call("User32::EnableWindow", aWnd[IDTABBARTOP     ][HWND], oView[sName].TabBar == 1);
  }
}

function IsPluginExists(sPlugName)
{
  return oFSO.FileExists(AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\" + sPlugName + ".dll");
}

function IsFullScreen()
{
  return AkelPad.IsPluginRunning(sFullScrFunc);
}

function IsSettingsInRegistry()
{
  return (SendMessage(AkelPad.GetMainWnd(), 1222 /*AKD_GETMAININFO*/, 5 /*MI_SAVESETTINGS*/, 0) == 1 /*SS_REGISTRY*/);
}

function NewView()
{
  var sCurName = GetCurTextLB();
  var sNewName = InputBox(hWndDlg, "New view", "Input name:", sCurName, 0, "CheckInputName");
  var nPos;
  var n;

  if ((sNewName) && (sNewName = sNewName.replace(/\s+$/, "")))
  {
    oView[sNewName] = {};

    for (n in oView[sCurName])
      oView[sNewName][n] = oView[sCurName][n];

    nPos = SendMessage(aWnd[IDNAMELB][HWND], 0x0180 /*LB_ADDSTRING*/, 0, sNewName);
    SetCurSelLB(nPos);
  }
}

function CheckInputName(hWnd, aNames)
{
  aNames[0] = aNames[0].replace(/\s+$/, "");

  if (aNames[0] in oView)
  {
    WarningBox(hWnd, '"' + aNames[0] + '" already exists.');
    return 0;
  }

  return -1;
}

function RenameView()
{
  var nPos     = GetCurSelLB();
  var sCurName = GetCurTextLB();
  var sNewName;
  var n;

  if (sCurName != "Default")
  {
    sNewName = InputBox(hWndDlg, "Rename view", "Input name:", sCurName, 0, "CheckInputRename", sCurName);

    if ((sNewName) && (sNewName = sNewName.replace(/\s+$/, "")) && (sNewName != sCurName))
    {
      oView[sNewName] = {};

      for (n in oView[sCurName])
        oView[sNewName][n] = oView[sCurName][n];

      delete oView[sCurName];
      SendMessage(aWnd[IDNAMELB][HWND], 0x0182 /*LB_DELETESTRING*/, nPos, 0);

      nPos = SendMessage(aWnd[IDNAMELB][HWND], 0x0180 /*LB_ADDSTRING*/, 0, sNewName);
      SetCurSelLB(nPos);
    }
  }
}

function CheckInputRename(hWnd, aNames, sCurName)
{
  aNames[0] = aNames[0].replace(/\s+$/, "");

  if ((aNames[0] != sCurName) && (aNames[0] in oView))
  {
    WarningBox(hWnd, '"' + aNames[0] + '" already exists.');
    return 0;
  }

  return -1;
}

function DeleteView()
{
  var nPos  = GetCurSelLB();
  var sName = GetCurTextLB();

  if (sName != "Default")
  {
    if (AkelPad.MessageBox(hWndDlg, 'Do you want to delete "' + sName + '"?', sScriptName, 0x00000023 /*MB_ICONQUESTION|MB_YESNOCANCEL*/) == 6 /*IDYES*/)
    {
      delete oView[sName];
      SendMessage(aWnd[IDNAMELB][HWND], 0x0182 /*LB_DELETESTRING*/, nPos, 0);

      if (nPos == GetCountLB())
        --nPos;

      SetCurSelLB(nPos);
      CheckButtons();
    }
  }
}

function ApplyView(sViewName, nFullScrAction)
{
  if (! (sViewName in oView))
  {
    WarningBox(hMainWnd, '"' + sViewName + '" does not exists.');
    return 0;
  }

  var hMenu = oSys.Call("User32::GetMenu", hMainWnd);
  var bCodeList;
  var bStatBar;
  var i;

  for (i = 0; i < aTB.length; ++i)
    oPlug[aTB[i]].Switch = function(){
      if (this.IsRunning())
        AkelPad.CallEx(0x14, this.Name + "::Main");
      else
        AkelPad.CallEx(0x14, this.Name + "::Main", 1, oView[sViewName][this.Name + "Rows"]);
      };

  //full screen
  if (IsPluginExists(sFullScr) &&
      ((nFullScrAction == 1) ||
       ((nFullScrAction == -1) && (! IsFullScreen())) ||
       ((nFullScrAction == 2) && IsFullScreen())))
  {
    bCodeList = ShowCodeList(0);
    bStatBar  = ShowStatusBar(0);

    for (i in oPlug)
    {
      if ((oPlug[i].State == 0) || (oPlug[i].State == 1))
      {
        if (oPlug[i].State = oPlug[i].IsRunning())
          oPlug[i].Switch();
      }
    }
  }
  //not full screen
  else
  {
    bCodeList = ShowCodeList(2);
    bStatBar  = ShowStatusBar(2);

    for (i in oPlug)
    {
      if ((oPlug[i].State == 0) || (oPlug[i].State == 1))
        oPlug[i].State = oPlug[i].IsRunning();
    }

    for (i = 0; i < aTB.length; ++i)
    {
      if (oPlug[aTB[i]].State == 1)
        oPlug[aTB[i]].Switch();
    }
  }

  if (IsPluginExists(sFullScr) && (nFullScrAction < 2) && (nFullScrAction != IsFullScreen()))
  {
    AkelPad.Call(sFullScrFunc);
    WScript.Sleep(80);
  }

  for (i in oPlug)
  {
    if ((oPlug[i].State >= 0) && IsPluginExists(oPlug[i].Name))
    {
      if (((oView[sViewName][i] == 0) && oPlug[i].IsRunning()) ||
          ((oView[sViewName][i] == 1) && (! oPlug[i].IsRunning())) ||
          ((oView[sViewName][i] == 2) && (oPlug[i].State < 2) && (oPlug[i].State != oPlug[i].IsRunning())))
        oPlug[i].Switch();
    }
  }

  ShowMenu(oView[sViewName].Menu, hMenu);
  ShowCodeList((oView[sViewName].CodeList == 2) ? bCodeList : oView[sViewName].CodeList);
  ShowStatusBar((oView[sViewName].StatusBar == 2) ? bStatBar : oView[sViewName].StatusBar);
  ShowScrollBar(oView[sViewName].ScrollBarH, oView[sViewName].ScrollBarV);
  ShowTabBar(oView[sViewName].TabBar, oView[sViewName].TabBarTop);
  ChangeFont(sViewName);
  ChangeTheme(sViewName);
  ChangeCoderTheme(sViewName);
  oSys.Call("user32::InvalidateRect", hMainWnd, 0, true);

  return 1;
}

function FullScreenSwitch()
{
  if (IsPluginExists(sFullScr))
  {
    var hMenu     = oSys.Call("User32::GetMenu", hMainWnd);
    var bCodeList = ShowCodeList(0);
    var bStatBar  = ShowStatusBar(0);
    var i;

    for (i = 0; i < aTB.length; ++i)
      oPlug[aTB[i]].Switch = function(){AkelPad.CallEx(0x14, this.Name + "::Main");};

    for (i in oPlug)
    {
      if ((oPlug[i].State == 0) || (oPlug[i].State == 1))
      {
        if (oPlug[i].State = oPlug[i].IsRunning())
          oPlug[i].Switch();
      }
    }

    AkelPad.Call(sFullScrFunc);
    WScript.Sleep(80);

    for (i in oPlug)
    {
      if (oPlug[i].State == 1)
        oPlug[i].Switch();
    }

    oSys.Call("User32::SetMenu", hMainWnd, hMenu);
    ShowCodeList(bCodeList);
    ShowStatusBar(bStatBar);

    ShowTabBar(2);
  }
}

function ShowCodeList(nShow)
{
  var bState  = 0;
  var lpState;

  if (oPlug.CodeFold.IsRunning())
  {
    lpState = AkelPad.MemAlloc(4);
    AkelPad.Call(oPlug.CodeFold.Name + "::CodeFold", 1, lpState);

    bState = AkelPad.MemRead(lpState, DT_DWORD);
    AkelPad.MemFree(lpState);

    if ((nShow < 2) && (nShow != bState))
      AkelPad.Call(oPlug.CodeFold.Name + "::CodeFold", 1);
  }

  return bState;
}

function ShowMenu(nShow, hMenu)
{
  var hMainMenu = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 21 /*MI_MENUMAIN*/, 0);
  var hCurMenu  = oSys.Call("User32::GetMenu", hMainWnd);

  if (nShow == 2)
    oSys.Call("User32::SetMenu", hMainWnd, hMenu);
  else if (((nShow == 0) && hCurMenu) || ((nShow == 1) && (! hCurMenu)))
  {
    if (IsPluginExists(oPlug.Menu.Name))
    {
      if (nShow)
      {
        if (oPlug.Menu.IsRunning())
        {
          oPlug.Menu.Switch();
          oPlug.Menu.Switch();

          if (oPlug.LineBoard.IsRunning())
          {
            oPlug.LineBoard.Switch();
            oPlug.LineBoard.Switch();
          }
        }

        if (! oSys.Call("User32::GetMenu", hMainWnd))
          oSys.Call("User32::SetMenu", hMainWnd, hMainMenu);
      }
      else
        oSys.Call("User32::SetMenu", hMainWnd, 0);
    }
    else
      oSys.Call("User32::SetMenu", hMainWnd, nShow ? hMainMenu : 0);
  }
}

function ShowScrollBar(nShowH, nShowV)
{
  if ((nShowH < 2) || (nShowV < 2))
  {
    var lpPOINT = AkelPad.MemAlloc(8);

    SendMessage(hEditWnd, 1245 /*EM_GETSCROLLPOS*/, 0, lpPOINT);

    if (nShowH < 2)
      SendMessage(hEditWnd, 3375 /*AEM_SHOWSCROLLBAR*/, 0 /*SB_HORZ*/, nShowH);

    if (nShowV < 2)
      SendMessage(hEditWnd, 3375 /*AEM_SHOWSCROLLBAR*/, 1 /*SB_VERT*/, nShowV);

    SendMessage(hEditWnd, 1246 /*EM_SETSCROLLPOS*/, 0, lpPOINT);
    AkelPad.MemFree(lpPOINT);
  }
}

function ShowStatusBar(nShow)
{
  var bState = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 142 /*MI_STATUSBAR*/, 0);

  if ((nShow < 2) && (nShow != bState))
    AkelPad.Command(4211 /*IDM_VIEW_SHOW_STATUSBAR*/);

  return bState;
}

function ShowTabBar(nShow, bTop)
{
  var IDM_WINDOW_TABVIEW_NONE   = 4303;
  var IDM_WINDOW_TABVIEW_TOP    = 4301;
  var IDM_WINDOW_TABVIEW_BOTTOM = 4302;
  var TAB_VIEW_NONE   = 1;
  var TAB_VIEW_TOP    = 2;
  var TAB_VIEW_BOTTOM = 4;
  var nState = SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);

  AkelPad.Command(IDM_WINDOW_TABVIEW_NONE);

  if (nShow == 1)
  {
    if (bTop)
      AkelPad.Command(IDM_WINDOW_TABVIEW_TOP);
    else
      AkelPad.Command(IDM_WINDOW_TABVIEW_BOTTOM);
  }
  else if ((nShow == 2) && (! (nState & TAB_VIEW_NONE)))
  {
    if (nState & TAB_VIEW_TOP)
      AkelPad.Command(IDM_WINDOW_TABVIEW_TOP);
    else
      AkelPad.Command(IDM_WINDOW_TABVIEW_BOTTOM);
  }
}

function ChangeFont(sViewName)
{
  if (oView[sViewName].Font)
    AkelPad.Font(oView[sViewName].FontName, oView[sViewName].FontStyle, oView[sViewName].FontSize);
}

function ChangeTheme(sViewName)
{
  if (! oView[sViewName].Theme)
    return;

  var nColorsSize = 17 * 4; //sizeof(AECOLORS)
  var lpColors    = AkelPad.MemAlloc(nColorsSize);

  if (oView[sViewName].ThemeName == "<Standard>")
    AkelPad.MemCopy(lpColors, 0x0001FFFF /*AECLR_DEFAULT|AECLR_ALL*/, DT_DWORD);

  else
  {
    if (IsSettingsInRegistry())
    {
      var hKey       = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, "Software\\Akelsoft\\AkelPad\\Themes", 0x0001 /*KEY_QUERY_VALUE*/);
      var lpDataSize = AkelPad.MemAlloc(4);

      if (hKey)
      {
        AkelPad.MemCopy(lpDataSize, nColorsSize, DT_DWORD);

        if (oSys.Call("Advapi32::RegQueryValueExW", hKey, oView[sViewName].ThemeName, 0, 0, lpColors, lpDataSize) == 0 /*ERROR_SUCCESS*/)
          AkelPad.MemCopy(lpColors, 0x0001FFFE /*AECLR_ALL*/, DT_DWORD);

        oSys.Call("Advapi32::RegCloseKey", hKey);
      }

      AkelPad.MemFree(lpDataSize);
    }
    else
    {
      var nBufSize = (nColorsSize * 2 + 1) * 2;
      var lpBuffer = AkelPad.MemAlloc(nBufSize);
      var sThemeData;
      var i;

      oSys.Call("Kernel32::GetPrivateProfileStringW", "Themes", oView[sViewName].ThemeName, 0, lpBuffer, nBufSize / 2, AkelPad.GetAkelDir(0 /*ADTYPE_ROOT*/) + "\\AkelPad.ini");

      if (sThemeData = AkelPad.MemRead(lpBuffer, DT_UNICODE))
      {
        sThemeData = "FEFF0100" + sThemeData.substr(8); //0x0001FFFE = AECLR_ALL (AEM_SETCOLORS flags)

        for (i = 0; i < sThemeData.length; i += 2)
          AkelPad.MemCopy(_PtrAdd(lpColors, i / 2), parseInt("0x" + sThemeData.substr(i, 2)), DT_BYTE);
      }

      AkelPad.MemFree(lpBuffer);
    }
  }

  if (oPlug.CoderTheme.IsRunning())
    AkelPad.Call("Coder::Settings", 5, "Default");

  AkelPad.SetFrameInfo(0, 72 /*FIS_COLORS*/, lpColors);
  AkelPad.MemFree(lpColors);
}

function ChangeCoderTheme(sViewName)
{
  if ((oView[sViewName].CoderTheme < 2) && IsPluginExists(oPlug.CoderTheme.Name))
  {
    if (oView[sViewName].CoderTheme == 1)
    {
      if (! oPlug.CoderTheme.IsRunning())
        oPlug.CoderTheme.Switch();

      AkelPad.Call("Coder::Settings", 5, oView[sViewName].CoderThemeName);
    }
    else
    {
      if (oPlug.CoderTheme.IsRunning())
        oPlug.CoderTheme.Switch();
    }
  }
}

function SetThemeName(sName)
{
  var aTheme = ["<Standard>"];
  var oRect  = {};
  var hMenu  = oSys.Call("User32::CreatePopupMenu");
  var nCmd;
  var nX, nY;
  var i;

  FillThemeArray(aTheme);

  GetWindowPos(aWnd[IDTHEMENAME][HWND], oRect);

  for (i = 0; i < aTheme.length; ++i)
    oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, i + 1, aTheme[i]);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0184 /*TPM_NONOTIFY|TPM_RETURNCMD|TPM_CENTERALIGN*/, oRect.X + oRect.W / 2, oRect.Y + oRect.H, 0, hWndDlg, 0);

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

  if (nCmd)
  {
    oView[sName].ThemeName = aTheme[nCmd - 1];
    oSys.Call("User32::SetWindowTextW", aWnd[IDTHEMENAME][HWND], oView[sName].ThemeName);
  }
}

function FillThemeArray(aTheme)
{
  if (IsSettingsInRegistry())
  {
    var nNameMaxLen = 16383;
    var lpNameLen   = AkelPad.MemAlloc(4);
    var lpName      = AkelPad.MemAlloc((nNameMaxLen + 1) * 2);
    var hKey        = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, "Software\\Akelsoft\\AkelPad\\Themes", 0x0001 /*KEY_QUERY_VALUE*/);
    var nIndex      = 0;
    var sValueName;

    if (hKey)
    {
      AkelPad.MemCopy(lpNameLen, nNameMaxLen, DT_DWORD);

      while (oSys.Call("Advapi32::RegEnumValueW", hKey, nIndex, lpName, lpNameLen, 0, 0, 0, 0) == 0 /*ERROR_SUCCESS*/)
      {
        if (sValueName = AkelPad.MemRead(lpName, DT_UNICODE))
          aTheme.push(sValueName);

        AkelPad.MemCopy(lpNameLen, nNameMaxLen, DT_DWORD);
        ++nIndex;
      }

      oSys.Call("Advapi32::RegCloseKey", hKey);
    }

    AkelPad.MemFree(lpNameLen);
    AkelPad.MemFree(lpName);
  }
  else
  {
    var nBufSize = 32767 * 2;
    var lpBuffer = AkelPad.MemAlloc(nBufSize);
    var lpKey    = lpBuffer;
    var sKey;

    if (oSys.Call("Kernel32::GetPrivateProfileSectionW", "Themes", lpBuffer, nBufSize / 2, AkelPad.GetAkelDir(0 /*ADTYPE_ROOT*/) + "\\AkelPad.ini"))
    {
      do
      {
        if (sKey = AkelPad.MemRead(lpKey, DT_UNICODE))
        {
          lpKey = _PtrAdd(lpKey, (sKey.length + 1) * 2);
          if (sKey = sKey.substr(0, sKey.indexOf("=")))
            aTheme.push(sKey);
        }
      }
      while (sKey);
    }

    AkelPad.MemFree(lpBuffer);
  }
}

Last edited by KDJ on Fri Jan 09, 2015 9:02 pm, edited 6 times in total.

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

Post by KDJ »

Switch between different views of AkelPad screen - part 2.

Code: Select all

function SetCoderThemeName(sName)
{
  var aTheme = [
    "Default",
    "Active4D",
    "Bespin",
    "Cobalt",
    "Dawn",
    "Earth",
    "iPlastic",
    "Lazy",
    "Mac Classic",
    "Monokai",
    "Solarized Light",
    "Solarized Dark",
    "SpaceCadet",
    "Sunburst",
    "Twilight",
    "Zenburn"];
  var oRect = {};
  var hMenu = oSys.Call("User32::CreatePopupMenu");
  var nCmd;
  var nX, nY;
  var i;

  FillCoderThemeArray(aTheme);

  GetWindowPos(aWnd[IDCODERTHEMENAME][HWND], oRect);

  for (i = 0; i < aTheme.length; ++i)
  {
    if (aTheme[i])
      oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, i + 1, aTheme[i]);
    else
      oSys.Call("User32::AppendMenuW", hMenu, 0x0800 /*MF_SEPARATOR*/, 0);
  }

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0184 /*TPM_NONOTIFY|TPM_RETURNCMD|TPM_CENTERALIGN*/, oRect.X + oRect.W / 2, oRect.Y + oRect.H, 0, hWndDlg, 0);

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

  if (nCmd)
  {
    oView[sName].CoderThemeName = aTheme[nCmd - 1];
    oSys.Call("User32::SetWindowTextW", aWnd[IDCODERTHEMENAME][HWND], oView[sName].CoderThemeName);
  }
}

function FillCoderThemeArray(aTheme)
{
  var nBufSize = 4096;
  var lpBuffer = AkelPad.MemAlloc(nBufSize);
  var lpDataSize;
  var hKey;
  var sThemes;
  var aTemp;
  var i;

  if (IsSettingsInRegistry())
  {
    if (hKey = GetRegKeyHandle(0x80000001 /*HKEY_CURRENT_USER*/, "Software\\Akelsoft\\AkelPad\\Plugs\\Coder", 0x0001 /*KEY_QUERY_VALUE*/))
    {
      lpDataSize = AkelPad.MemAlloc(4);
      AkelPad.MemCopy(lpDataSize, nBufSize, DT_DWORD);

      oSys.Call("Advapi32::RegQueryValueExW", hKey, "VarThemeList", 0, 0, lpBuffer, lpDataSize);

      oSys.Call("Advapi32::RegCloseKey", hKey);
      AkelPad.MemFree(lpDataSize);
    }
  }
  else
    oSys.Call("Kernel32::GetPrivateProfileStringW", "Options", "VarThemeList", 0, lpBuffer, nBufSize / 2, AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\Coder.ini");

  if (sThemes = AkelPad.MemRead(lpBuffer, DT_UNICODE))
  {
    aTemp = sThemes.split("|");
    aTheme.push("");
    for (i = 0; i < aTemp.length; ++i)
      aTheme.push(aTemp[i]);
  }

  AkelPad.MemFree(lpBuffer);
}

function GetRegKeyHandle(hParentKey, sSubKey, nAccess)
{
  var hKey   = 0;
  var lpKey  = AkelPad.MemAlloc(_X64 ? 8 : 4);
  var nError = oSys.Call("Advapi32::RegOpenKeyExW",
                         hParentKey, //hKey
                         sSubKey,    //lpSubKey
                         0,          //ulOptions
                         nAccess,    //samDesired
                         lpKey);     //phkResult

  if (! nError)
    hKey = AkelPad.MemRead(lpKey, DT_QWORD);

  AkelPad.MemFree(lpKey);

  return hKey;
}

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

function ReadWriteIni(bWrite)
{
  var sIniFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var oFile;
  var oRect;
  var sIniTxt;
  var i, n;

  if (bWrite)
  {
    GetWindowPos(hWndDlg, oRect = {});

    sIniTxt = 'nWndPosX=' + oRect.X + ';\r\n' +
              'nWndPosY=' + oRect.Y + ';\r\n' +
              'nWndPosW=' + oRect.W + ';\r\n' +
              'nView='    + GetCurSelLB() + ';\r\n';

    for (i in oView)
    {
      sIniTxt += 'oView["' + i.replace(/[\\"]/g, "\\$&") + '"]={';
      for (n in oView[i])
        sIniTxt += '"' + n + '":' + ((typeof oView[i][n] == 'string') ? '"' : '') + oView[i][n] + ((typeof oView[i][n] == 'string') ? '"' : '') + ',';

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

      sIniTxt += '};\r\n';
    }

    oFile = oFSO.OpenTextFile(sIniFile, 2, true, -1);
    oFile.Write(sIniTxt);
    oFile.Close();
  }

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

Last edited by KDJ on Fri Jan 09, 2015 9:02 pm, edited 5 times in total.

Offline
Posts: 119
Joined: Sat Jan 12, 2008 10:16 am
Location: Shantou, China

InsertNum.js

Post by cnnnc »

Code: Select all

// InsertNum.js - 2012-12-20 by cnnnc
// Insert a sequence of number.
//
// Example:
// Call("Scripts::Main", 1, "InsertNum.js")

try
{
  var hMainWnd=AkelPad.GetMainWnd();
}
catch (oError)
{
  WScript.Quit();
}

if (!(AkelPad.Include("InputBox_function.js")))
{
  WScript.Quit();
}

var sCaption =WScript.ScriptName;
var oSys     =AkelPad.SystemFunction();
var nAkelEdit=AkelPad.IsAkelEdit();
var hWndEdit =AkelPad.GetEditWnd();

var sLng=AkelPad.GetLangId(0 /*LANGID_FULL*/);
if (sLng==2052) //Chinese Simplified
{
  var vLabel     =["开始","结束","增量","宽度","填充","分隔符","十六进制","前缀","后缀"];
  var sTxtWarning="警告:次数太多,可能会内存不足。是否继续?";
  var sTxtError="错误!\n";
  var sTxtError1="仅允许数值类型。";
  var sTxtError2="不能等于";
  var sTxtError3="不能等于 0";
  var sTxtSeconds="耗时 %s 秒。";
}
else // English
{
  var vLabel     =["Start","End","Step","Width","Pad","Seperator","Hex","Prefix","Subfix"];
  var sTxtWarning="Warning: Times is so big, may be result to out of memory. Continue?";
  var sTxtError="Error!\n";
  var sTxtError1="allow number type only.";
  var sTxtError2="should not same as";
  var sTxtError3="should not be 0";
  var sTxtSeconds="It's take %s Seconds.";
}

var vEdit    =[];
var nFocus   =0;
var sFunction="CheckNum";
var vFuncArg ="";

SetRedraw(hWndEdit, false);

if (WScript.Arguments.length)
{
  eval(AkelPad.GetArgLine(0));
  if (vEdit.length!=9)
  {
    vEdit=["1","9","1","1","0","\\n","0","",""];
  }
}
else
{
  var oSet=AkelPad.ScriptSettings();

  if (oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
  {
    //Read settings
    vEdit.push(oSet.Read("Start"    , 3 /*PO_STRING*/, "1"));
    vEdit.push(oSet.Read("End"      , 3 /*PO_STRING*/, "9"));
    vEdit.push(oSet.Read("Step"     , 3 /*PO_STRING*/, "1"));
    vEdit.push(oSet.Read("Width"    , 3 /*PO_STRING*/, "1"));
    vEdit.push(oSet.Read("Pad"      , 3 /*PO_STRING*/, "0"));
    vEdit.push(oSet.Read("Seperator", 3 /*PO_STRING*/, "\\n"));
    vEdit.push(oSet.Read("Hex"      , 3 /*PO_STRING*/, "0"));
    vEdit.push(oSet.Read("Prefix"   , 3 /*PO_STRING*/, ""));
    vEdit.push(oSet.Read("Subfix"   , 3 /*PO_STRING*/, ""));

    oSet.End();
  }
  else
  {
    vEdit=["1","9","1","1","0","\\n","0","",""];
  }
  vEdit = InputBox(hMainWnd, sCaption, vLabel, vEdit, nFocus, sFunction, vFuncArg);
  if (vEdit == undefined)
  {
    SetRedraw(hWndEdit, true);
    WScript.Quit();
  }
}

var d=new Date();
var t=d.getTime();

var nStart    =Number(vEdit[0]);
var nEnd      =Number(vEdit[1]);
var nStep     =Number(vEdit[2]);

if (nStart==nEnd || nStep==0)
{
  SetRedraw(hWndEdit, true);
  WScript.Quit();
}

var nCurVal=Math.floor(Math.abs(nEnd-nStart)/nStep);
if (nCurVal>9999999)
{
  if(AkelPad.MessageBox(hMainWnd, sTxtWarning, sCaption, 52)!=6)
  {
    SetRedraw(hWndEdit, true);
    WScript.Quit();
  }
}

if (vEdit[4]=="")
{
  vEdit[3]="1";
}
var sStart    =vEdit[0];
var sEnd      =vEdit[1];
var sStep     =vEdit[2];
var nWidth    =parseInt(vEdit[3]);
var sPad      =vEdit[4];
var sSeperator=vEdit[5];
var bHex      =vEdit[6];
var sPrefix   =vEdit[7];
var sSubfix   =vEdit[8];

var m=0;
var sStr="";
var oneStop=0xFFF;


if (nStart!=parseInt(sStart) || nEnd!=parseInt(sEnd) || nStep!=parseInt(sStep))
{
  var r1,r2,r3;
  try{r1=sStart.split(".")[1].length;}catch(e){r1=0;}
  try{r2=sEnd.split(".")[1].length;}catch(e){r2=0;}
  try{r3=sStep.split(".")[1].length;}catch(e){r3=0;}
  m=Math.max(r1,r2,r3);
}

if (m==0 && bHex=="1")
{
  bHex=true;
}
else
{
  bHex=false;
}

if (sSeperator) sSeperator=TranslateEscapeString(sSeperator);
if (sPrefix) sPrefix=TranslateEscapeString(sPrefix);
if (sSubfix) sSubfix=TranslateEscapeString(sSubfix);

if (nStart<nEnd)
{
  for (;;)
  {
    if (nCurVal>oneStop)
    {
      sStr=sStr+SequenceNum(oneStop,0);
      CollectGarbage();
      nStart=nStart+(oneStop+1)*nStep;
      nCurVal=nCurVal-(oneStop+1);
    }
    else
    {
      sStr=sStr+SequenceNum(nCurVal,0);
      CollectGarbage();
      break;
    }
  }
}
else if (nStart>nEnd)
{
  for (;;)
  {
    if (nCurVal>oneStop)
    {
      sStr=sStr+SequenceNum(oneStop,1);
      CollectGarbage();
      nStart=nStart-(oneStop+1)*nStep;
      nCurVal=nCurVal-(oneStop+1);
    }
    else
    {
      sStr=sStr+SequenceNum(nCurVal,1);
      CollectGarbage();
      break;
    }
  }
}
SetRedraw(hWndEdit, true);

AkelPad.ReplaceSel(sStr);

if (!WScript.Arguments.length)
{
  if (oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/))
  {
    //Save settings
    oSet.Write("Start"    , 3 /*PO_STRING*/, vEdit[0]);
    oSet.Write("End"      , 3 /*PO_STRING*/, vEdit[1]);
    oSet.Write("Step"     , 3 /*PO_STRING*/, vEdit[2]);
    oSet.Write("Width"    , 3 /*PO_STRING*/, vEdit[3]);
    oSet.Write("Pad"      , 3 /*PO_STRING*/, vEdit[4]);
    oSet.Write("Seperator", 3 /*PO_STRING*/, vEdit[5]);
    oSet.Write("Hex"      , 3 /*PO_STRING*/, vEdit[6]);
    oSet.Write("Prefix"   , 3 /*PO_STRING*/, vEdit[7]);
    oSet.Write("Subfix"   , 3 /*PO_STRING*/, vEdit[8]);

    oSet.End();
  }
}

var d=new Date();
t=(d.getTime()-t)/1000;

if (Math.round(t)>1) AkelPad.MessageBox(hMainWnd, prepareString(sTxtSeconds, [t]), sCaption, 0 /*MB_OK*/);

sStr=null;
CollectGarbage();

//function
function Pad(nCurrentNum)
{
  var pNumText;
  var nLen;
  var cPadding="";

  if (bHex)
  {
    pNumText=nCurrentNum.toString(16);
  }
  else
  {
    pNumText=nCurrentNum.toFixed(m);
  }

  if (nCurrentNum<0) pNumText="-"+pNumText.substr(1);

  nLen=Math.abs(nWidth)-pNumText.length+1;

  while ((nLen-=1)>0)
  {
    cPadding+=sPad;
  }

  if (nWidth<0) pNumText += cPadding;
  else pNumText=cPadding+pNumText;

  return pNumText;
}

function CheckNum(hWnd, vEdit, nIndex)
{
  for (i=0; i<4; ++i)
  {
    if (isNaN(parseInt(vEdit[i])))
    {
      AkelPad.MessageBox(hWnd, sTxtError + "\""+vLabel[i]+"\" "+sTxtError1, sCaption, 0 /*MB_OK*/);
      return i;
    }
  }
  if (vEdit[0]==vEdit[1])
  {
    AkelPad.MessageBox(hWnd, sTxtError + "\""+vLabel[1]+"\" "+sTxtError2 + "\""+vLabel[0]+"\" ", sCaption, 0 /*MB_OK*/);
    return 1;
  }
  if (vEdit[2]==0)
  {
    AkelPad.MessageBox(hWnd, sTxtError + "\""+vLabel[2]+"\" "+sTxtError3, sCaption, 0 /*MB_OK*/);
    return 2;
  }
  return -1;
}

function SequenceNum(nStop,bMax)
{
  var aStr=null;
  aStr=[];

  if (bMax)
  {
    if (!bHex && (nWidth==1 || nWidth==0 || nWidth ==-1))
    {
      for (i=0; i<=nStop; i++)
      {
        aStr[i]=(nStart-i*nStep).toFixed(m);
      }
    }
    else
    {
      for (i=0; i<=nStop; i++)
      {
        aStr[i]=Pad(nStart-i*nStep);
      }
    }
  }
  else
  {
    if (!bHex && (nWidth==1 || nWidth==0 || nWidth ==-1))
    {
      for (i=0; i<=nStop; i++)
      {
        aStr[i]=(nStart+i*nStep).toFixed(m);
      }
    }
    else
    {
      for (i=0; i<=nStop; i++)
      {
        aStr[i]=Pad(nStart+i*nStep);
      }
    }
  }

  if (sPrefix=="" && sSubfix=="")
  {
    return aStr.join(sSeperator)+sSeperator;
  }
  else if (sPrefix=="" && sSubfix!="")
  {
    return aStr.join(sSubfix+sSeperator)+sSubfix+sSeperator;
  }
  else if (sPrefix!="" && sSubfix=="")
  {
    return sPrefix+aStr.join(sSeperator+sPrefix)+sSeperator;
  }
  else
  {
    return sPrefix+aStr.join(sSubfix+sSeperator+sPrefix)+sSubfix+sSeperator;
  }
}

function TranslateEscapeString(pString)
{
  pString=pString.replace(/\\\\/g, "\0");
  pString=pString.replace(/\\n|\\r/g,"\n");
  pString=pString.replace(/\\t/g,"\t");
  return pString.replace(/\0/g,"\\");
}

function prepareString(pString, aVar)
{
  pString=pString.replace(/%%/g,"←■→");
  if (pString.indexOf("%s") >= 0)
  {
    pString = pString.split("%s");
    for (i=0;i<pString.length-1;i+=1)
    {
      pString[i] = pString[i]+aVar[i].toString();
    }
    pString=pString.join("");
  }
  pString=pString.replace(/←■→/g,"%%");
  return pString;
}

function SetRedraw(hWnd, bRedraw)
{
  if (nAkelEdit)
  {
    AkelPad.SendMessage(hWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, !bRedraw);
  }

  AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  if (bRedraw)
  {
    oSys.Call("user32::InvalidateRect", hWnd, 0, true);
  }
}
, insert a sequence of number. Need Inputbox_function.js.
Post Reply