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

Scripts collection
Goto page Previous  1, 2, 3 ... 9, 10, 11 ... 17, 18, 19  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
Infocatcher



Joined: 06 Aug 2007
Posts: 1620

PostPosted: Mon Feb 07, 2011 4:38 am    Post subject: Reply with quote

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

// (c) Infocatcher 2011, 2014
// version 0.1.3 - 2014-03-03

//===================
// Switch between tabs in order of them arrangement (temporary check "Switch tabs: right-left" option)
// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#4222
// Proposed hotkeys: Ctrl+PageDown and Ctrl+PageUp

// Usage:
//   Call("Scripts::Main", 1, "tabsRightLeft.js")           - switch to next tab
//   Call("Scripts::Main", 1, "tabsRightLeft.js", "-prev")  - switch to previous tab
//===================

var next = WScript.Arguments.length ? WScript.Arguments(0) != "-prev" : true;

var hMainWnd = AkelPad.GetMainWnd();

if(hMainWnd && AkelPad.IsMDI()) {
   var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
   var forceRightLeft = !(tabOpts & 0x20000 /*TAB_SWITCH_RIGHTLEFT*/);
   if(forceRightLeft)
      AkelPad.Command(4311 /*IDM_WINDOW_TABSWITCH_RIGHTLEFT*/);

   selectTab(next);

   if(forceRightLeft)
      AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
}
else {
   AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}

function selectTab(next) {
   var cmd = next ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
   AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, cmd, 0);
}
<download | mirror | development version>
Switch between tabs in order of them arrangement (temporary check "Switch tabs: right-left" option).

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

// (c) Infocatcher 2011, 2014
// version 0.1.2 - 2014-03-03

//===================
// Switch between tabs in order of them usage (temporary check "Switch tabs: next-previous" option)
// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#4222
// Proposed hotkeys: Ctrl+PageDown and Ctrl+PageUp

// Usage:
//   Call("Scripts::Main", 1, "tabsNextPrevious.js")           - switch to next tab
//   Call("Scripts::Main", 1, "tabsNextPrevious.js", "-prev")  - switch to previous tab
//===================

var next = WScript.Arguments.length ? WScript.Arguments(0) != "-prev" : true;

var hMainWnd = AkelPad.GetMainWnd();

if(hMainWnd && AkelPad.IsMDI()) {
   var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
   var forceNextPrev = !(tabOpts & 0x10000 /*TAB_SWITCH_NEXTPREV*/);
   if(forceNextPrev)
      AkelPad.Command(4310 /*IDM_WINDOW_TABSWITCH_NEXTPREV*/);

   selectTab(next);

   if(forceNextPrev)
      AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
}
else {
   AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}

function selectTab(next) {
   var cmd = next ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
   AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, cmd, 0);
}
<download | mirror | development version>
Switch between tabs in order of them usage (temporary check "Switch tabs: next-previous" option).

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

// (c) Infocatcher 2011, 2014
// version 0.1.2 - 2014-03-03

//===================
// Switch between tabs using alternative way
// (temporary check "Switch tabs: right-left" or "Switch tabs: next-previous" option)
// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#4222
// Proposed hotkeys: Ctrl+PageDown and Ctrl+PageUp

// Usage:
//   Call("Scripts::Main", 1, "tabsSwitchAlt.js")           - switch to next tab
//   Call("Scripts::Main", 1, "tabsSwitchAlt.js", "-prev")  - switch to previous tab
//===================

var next = WScript.Arguments.length ? WScript.Arguments(0) != "-prev" : true;

var hMainWnd = AkelPad.GetMainWnd();

if(hMainWnd && AkelPad.IsMDI()) {
   var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
   var isNextPrev = tabOpts & 0x10000 /*TAB_SWITCH_NEXTPREV*/;
   AkelPad.Command(isNextPrev ? 4311 /*IDM_WINDOW_TABSWITCH_RIGHTLEFT*/ : 4310 /*IDM_WINDOW_TABSWITCH_NEXTPREV*/);
   selectTab(next);
   AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
}
else {
   AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}

function selectTab(next) {
   var cmd = next ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
   AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, cmd, 0);
}
<download | mirror | development version>
Switch between tabs using alternative way (temporary check "Switch tabs: right-left" or "Switch tabs: next-previous" option).

For all scripts required MDI or PMDI window mode!


Last edited by Infocatcher on Mon Mar 03, 2014 8:38 am; edited 4 times in total
Back to top
View user's profile Send private message Visit poster's website
opk44



Joined: 16 Jan 2010
Posts: 335

PostPosted: Mon Feb 07, 2011 9:03 am    Post subject: Reply with quote

RU: Информация о номере версии редактора и плагинов
EN: Info about version of AkelPad and plugins

VersionInfo.js
Code:
// version 0.1.0 - 2011-02-06
//
// Usage:
// Call("Scripts::Main", 1, "VersionInfo.js")
//

var WM_COMMAND=273;
var WM_USER=1024;

var ADTYPE_ROOT = 0;   //   корневая папка AkelPad'а.
var ADTYPE_PLUGS = 4;   //   "[AkelPad]\AkelFiles\Plugs".
var IDM_FILE_NEW=4101;   // команда на создание нового файла
var AEM_EMPTYUNDOBUFFER = WM_USER + 2055;   //Erase undo and redo history
var AEM_SETMODIFY = WM_USER + 2063;   //Set the state of an edit control's modification flag.

var sh1 = "--------------------------------";
var sh2 = "  File                   Version";
var sh3 = "  Plugin                 Version";
var sh4 = "\r\n";

var pAkelDir=AkelPad.GetAkelDir(ADTYPE_ROOT);
var pAkelPlugsDir=AkelPad.GetAkelDir(ADTYPE_PLUGS);

var hMainWnd=AkelPad.GetMainWnd();
AkelPad.SendMessage(hMainWnd, WM_COMMAND, IDM_FILE_NEW, 0);

//   Вывод информации в созданную вкладку
AkelPad.ReplaceSel(sh1 + sh4 + sh2 + sh4 + sh1 + sh4);
AkelPad.ReplaceSel(ShowFolderFileVersionList(pAkelDir, "Exe"));
AkelPad.ReplaceSel(sh1 + sh4 + sh3 + sh4 + sh1 + sh4);
AkelPad.ReplaceSel(ShowFolderFileVersionList(pAkelPlugsDir, "Dll"));
//   Установиться на начало текста и дать возможность беспрепятственно закрыть вкладку
AkelPad.SetSel(0, 0);
AkelPad.SendMessage(AkelPad.GetEditWnd(), AEM_SETMODIFY, 0, 0);
AkelPad.SendMessage(AkelPad.GetEditWnd(), AEM_EMPTYUNDOBUFFER, 0, 0);

//
//   Список версий файлов с заданным расширением в указанной директории
//
function ShowFolderFileVersionList(folderspec, extension){
   var fso, f, f1, fc, s, si;
   fso = new ActiveXObject("Scripting.FileSystemObject");
   f = fso.GetFolder(folderspec);
   fc = new Enumerator(f.files);
   s = "";
   si = "";
   for (; !fc.atEnd(); fc.moveNext()){
      si = fc.item().Name;
      if (StringTailUpper(si, 3)==extension.toUpperCase()){
         s += StringFixLength(si, 25) + ShowFileVersion(fc.item()) + "\r\n";
      }
   }
   return(s);
}
//
//   Получить информацию о версии файла
//
function ShowFileVersion(filespec){
   var fso, s = "";
   fso = new ActiveXObject("Scripting.FileSystemObject");
   s += fso.GetFileVersion(filespec);
   return(s);
}
//
//   Получить "хвост" строки заданной длины в верхнем рагистре
//
function StringTailUpper(strvar, numvar){
   s = strvar.substr(strvar.length - numvar, strvar.length)
   return(s.toUpperCase());
}
//
//   Дополнить строку пробелами до заданной длины
//
function StringFixLength(strvar, numvar){
   while (strvar.length < numvar){
      strvar += ' ';
   }
   return(strvar);
}
Back to top
View user's profile Send private message
se7h



Joined: 28 Sep 2009
Posts: 767
Location: Minsk, Belarus

PostPosted: Fri Feb 11, 2011 7:38 pm    Post subject: Reply with quote

WinMerge.js
Code:
/// WinMerge v0.4.1
// (с) se7h, VladSh
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11455#11455
//
// Comparison of current and selected files using WinMerge (http://winmerge.org/)
//
// Usage in Toolbar/ContextMenu plugin:
// -"Compare with file..." Call("Scripts::Main", 1, "WinMerge.js") Icon(pathToAnyIcon)      - searching for a path to WinMerge automatically
// -"Compare with file..." Call("Scripts::Main", 1, "WinMerge.js", `"d:\Programs\TotalCmd\UTILs\WinMerge\"`)      - takes a path from scripts Arguments, else searching a path automatically
//
// CommonFunctions.js you found here http://akelpad.sourceforge.net/forum/viewtopic.php?p=1582#1582


//Options
var pFilter = "Text files (*.txt)\x00*.txt\x00All Files (*.*)\x00*.*\x00\x00";
var nFilterIndex = 2;

//Variables
var WshShell = new ActiveXObject("WScript.shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var hMainWnd = AkelPad.GetMainWnd();
var pInitialFile = AkelPad.GetEditFile(0);
var pSelFilePath;

var pToolFileName = "WinMergeU.exe";
var pToolPath = "";

if (WScript.Arguments.length)      //сначала пытаемся взять из аргументов
   pToolPath = getPath(WScript.Arguments(0) + pToolFileName);

if (!pToolPath)
{
   try {
      //ищем по записи в реестре
      pToolPath = WshShell.RegRead("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\" + pToolFileName + "\\");
      if (pToolPath)
         pToolPath = getPath(pToolPath);
   } catch(e) {}
   
   if (!pToolPath)
   {
      //ищем в путях по системмным переменным
      var appPaths = ["%ProgramFiles%\\WinMerge\\", "%ProgramFiles (x86)%\\WinMerge\\"];
      var p = 0;
      do
      {
         pToolPath = getPath(appPaths[p] + pToolFileName);
         if (pToolPath) break;
         p += 1;
      }
      while (p < appPaths.length)
       
      if (!pToolPath)
      {
         //ищем в стандартных путях по доступным локальным дискам
         appPaths = [":\\Program Files\\WinMerge\\", ":\\Program Files(x86)\\WinMerge\\"];
         var disks = getDrivesList();
         for (var d = 0; d < disks.length; d++)
         {
            p = 0;
            do
            {
               pToolPath = getPath(disks[d] + appPaths[p] + pToolFileName);
               if (pToolPath) break;
               p += 1;
            }
            while (p < appPaths.length)
            if (pToolPath) break;
         }
         
         if (!pToolPath)
         {
            warn("Application WinMerge was not found!");
            WScript.Quit();
         }
      }
   }
}

if (hMainWnd) {
  if (! AkelPad.Include("CommonFunctions.js"))
     pSelFilePath = FileDialog(true, hMainWnd, pInitialFile, pFilter, nFilterIndex);
  else
     pSelFilePath = FileDialogDefault(true, pInitialFile, GetFileExt(pInitialFile));

   if(pSelFilePath) {
      var cmdLine = "\"" + pToolPath + "\" \"" + pInitialFile + "\" \"" + pSelFilePath + "\"";
      WshShell.Exec(cmdLine);
   }
}

//VladSh by MSDN :)
function getDrivesList()
{
   var e = new Enumerator(fso.Drives);
   var x;
   var i = 0;
   var disks = [];
   for (; !e.atEnd(); e.moveNext())
   {
      x = e.item();
      if (x.DriveType == 3 && x.IsReady)
      {
         disks[i] = x.DriveLetter;
         i += 1;
      }
   }
   return disks;
}

//Instructor function
function FileDialog(bOpenTrueSaveFalse, hWnd, pInitialFile, pFilter, nFilterIndex) {
   var nFlags = 0x880804; //OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_EXPLORER|OFN_ENABLESIZING
   var pDefaultExt = "txt";
   var lpStructure;
   var lpFilterBuffer;
   var lpFileBuffer;
   var lpExtBuffer;
   var oSys;
   var pResultFile = "";
   var nCallResult;

   if(lpFilterBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
      AkelPad.MemCopy(lpFilterBuffer, pFilter.substr(0, 255), _TSTR);

      if(lpFileBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
         AkelPad.MemCopy(lpFileBuffer, pInitialFile.substr(0, 255), _TSTR);

         if(lpExtBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
            AkelPad.MemCopy(lpExtBuffer, pDefaultExt.substr(0, 255), _TSTR);

            if(lpStructure = AkelPad.MemAlloc(_X64 ? 136 : 76)) { //sizeof(OPENFILENAMEA) or sizeof(OPENFILENAMEW)
               //Fill structure
               AkelPad.MemCopy(lpStructure, _X64 ? 136 : 76, 3 /*DT_DWORD*/);             //lStructSize
               AkelPad.MemCopy(lpStructure + (_X64 ? 8 : 4), hWnd, 2 /*DT_QWORD*/);         //hwndOwner
               AkelPad.MemCopy(lpStructure + (_X64 ? 24 : 12), lpFilterBuffer, 2 /*DT_QWORD*/); //lpstrFilter
               AkelPad.MemCopy(lpStructure + (_X64 ? 44 : 24), nFilterIndex, 3 /*DT_DWORD*/); //nFilterIndex
               AkelPad.MemCopy(lpStructure + (_X64 ? 48 : 28), lpFileBuffer, 2 /*DT_QWORD*/); //lpstrFile
               AkelPad.MemCopy(lpStructure + (_X64 ? 56 : 32), 256, 3 /*DT_DWORD*/);         //nMaxFile
               AkelPad.MemCopy(lpStructure + (_X64 ? 96 : 52), nFlags, 3 /*DT_DWORD*/);      //Flags
               AkelPad.MemCopy(lpStructure + (_X64 ? 104 : 60), lpExtBuffer, 2 /*DT_QWORD*/); //lpstrDefExt

               if(oSys = AkelPad.SystemFunction()) {
                  //Call dialog
                  if(bOpenTrueSaveFalse == true) {
                     nCallResult = oSys.Call("comdlg32::GetOpenFileName" + _TCHAR, lpStructure);
                  } else {
                     nCallResult = oSys.Call("comdlg32::GetSaveFileName" + _TCHAR, lpStructure);
                  }

                  //Result file
                  if(nCallResult) {
                     pResultFile = AkelPad.MemRead(lpFileBuffer, _TSTR);
                  }
               }

               AkelPad.MemFree(lpStructure);
            }

            AkelPad.MemFree(lpExtBuffer);
         }

         AkelPad.MemFree(lpFileBuffer);
      }

      AkelPad.MemFree(lpFilterBuffer);
   }

   return pResultFile;
}

//Infocatcher functions
function warn(msg) {
   AkelPad.MessageBox(AkelPad.GetMainWnd(), msg, WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}
function getPath(paths) {
   var path = WshShell.ExpandEnvironmentStrings(paths);
   if(fso.FileExists(path))
      return path;

   return "";
}


History:
0.1 - initial release
0.2 - added: trying to find the path to WinMerge.exe in the registry and in Program Files (x86) (by VladSh)
0.2.1 - using environment variables
0.2.2 - little fix
0.3 - some improvements in finding paths to WinMerge
0.4 - added ability to specify the path to WinMerge manually (via the argument)
0.4.1 - extended open dialogue with files extensions list (provided by CommonFunction.js)

Comparison of current and selected files using WinMerge


Last edited by se7h on Fri Sep 23, 2011 6:44 pm; edited 6 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1374
Location: Poland

PostPosted: Sat Feb 12, 2011 11:19 pm    Post subject: Reply with quote

Regular expression tester for JavaScript - Part One.
Part Two is in the next post.
In one file is here: KDJ.zip

RegExpTestJS.js

Code:
// RegExpTestJS.js - ver. 2013-03-01
//
// Regular expression tester for JavaScript
//
// Call("Scripts::Main", 1, "RegExpTestJS.js")
//
// Shortcut keys in dialog box:
// Enter - test
// F1 - RegExp help
// Shift+Alt+ Right, Left, Down, Up, End, Home, PgDn, PgUp - move dialog box,
// Alt+ Num-(-), Num+(+) - change opaque/transparency level of dialog box.

var DT_DWORD    = 3;
var BM_GETCHECK = 240;
var BM_SETCHECK = 241;

var hMainWnd     = AkelPad.GetMainWnd();
var hEditWnd     = AkelPad.GetEditWnd();
var oSys         = AkelPad.SystemFunction();
var hGuiFont     = oSys.Call("gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var hInstanceDLL = AkelPad.GetInstanceDll();
var pClassName   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstanceDLL;

var nWndPosX;
var nWndPosY;
var nOpaque = 255;
var pREStr  = "/[a-z]/ig";
var pString = "";
var pWith   = "";
var bIgCase = 1;
var bGlobal = 0;
var bMultiL = 0;
var nNL     = 1;
var nAction = 1;
var oRE     = new RegExp();
var aRECol  = new Array();
var oSel    = {"Source1"  : 0,
               "Source1"  : 0,
               "RE1"      : 0,
               "RE2"      : 0,
               "String1"  : 0,
               "String2"  : 0,
               "With1"    : 0,
               "With2"    : 0,
               "Result1"  : 0,
               "Result2"  : 0,
               "GlobPro1" : 0,
               "GlobPro2" : 0};
var nBufSize = 65536;
var lpBuffer;
var hWndDlg;
var hWndEdHlp;
var hFocus;
var bIsTest;
var bIsReturn;

ReadIni();

if (AkelPad.GetSelStart() != AkelPad.GetSelEnd())
  pString = AkelPad.GetSelText(3 /*"\r\n"*/);

//Main window
var lpWnd       = [];
var IDREGEXP    = 1000;
var IDSOURCE    = 1001;
var IDESCAPE    = 1002;
var IDUNESCAPE  = 1003;
var IDCOPYSOU   = 1004;
var IDEDSOURCE  = 1005;
var IDRE        = 1006;
var IDIGCASE    = 1007;
var IDGLOBAL    = 1008;
var IDMULTIL    = 1009;
var IDCOLLECT   = 1010
var IDCOPYRE    = 1011;
var IDEDRE      = 1012;
var IDSTRING    = 1013;
var IDNEWLINE   = 1014;
var IDNLWIN     = 1015;
var IDNLUNIX    = 1016;
var IDNLMAC     = 1017;
var IDCOPYSTR   = 1018;
var IDEDSTRING  = 1019;
var IDACTION    = 1020;
var IDMETEST    = 1021;
var IDMEEXEC    = 1022;
var IDMESEARCH  = 1023;
var IDMEMATCH   = 1024;
var IDMESPLIT   = 1025;
var IDMEREPLACE = 1026;
var IDEDWITH    = 1027;
var IDRESULT    = 1028;
var IDLASTIND   = 1029;
var IDRESETIND  = 1030;
var IDCOPYRES   = 1031;
var IDEDRESULT  = 1032;
var IDGLOBPRO   = 1033;
var IDEDGLOBPRO = 1034;
var IDTEST      = 1035;
var IDHELP      = 1036;
var IDOPAQMINUS = 1037;
var IDOPAQPLUS  = 1038;
var IDCLOSE     = 1039;

//Collection window
var lpCol      = [];
var IDNAME     = 1000;
var IDLIST     = 1001;
var IDVALUE    = 1002;
var IDREVAL    = 1003;
var IDADD      = 1004;
var IDRENAME   = 1005;
var IDDELETE   = 1006;
var IDOK       = 1007;
var IDCOLCLOSE = 1008;

var WNDTYPE  = 0;
var WND      = 1;
var WNDEXSTY = 2;
var WNDSTY   = 3;
var WNDX     = 4;
var WNDY     = 5;
var WNDW     = 6;
var WNDH     = 7;
var WNDTXT   = 8;

//0x50000000 - WS_VISIBLE|WS_CHILD
//0x50000007 - WS_VISIBLE|WS_CHILD|BS_GROUPBOX
//0x50000009 - WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON
//0x50010000 - WS_VISIBLE|WS_CHILD|WS_TABSTOP
//0x50010001 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
//0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50010080 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL
//0x50210004 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|WS_VSCROLL|ES_MULTILINE
//0x50310004 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE
//0x50310804 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|WS_HSCROLL|WS_VSCROLL|ES_READONLY|ES_MULTILINE
//0x50A10003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|LBS_STANDARD
//0x50002000 - WS_VISIBLE|WS_CHILD|SS_EDITCONTROL
//Windows              WNDTYPE,WND,WNDEXSTY,     WNDSTY,WNDX,WNDY,WNDW,WNDH, WNDTXT
lpWnd[IDREGEXP   ] = ["BUTTON",  0,       0, 0x50000007,   7,  10, 491, 140, pTxtRegExp];
lpWnd[IDSOURCE   ] = ["STATIC",  0,       0, 0x50000000,  15,  27, 150,  13, pTxtSource];
lpWnd[IDESCAPE   ] = ["BUTTON",  0,       0, 0x50010000, 180,  23, 100,  20, pTxtEscape];
lpWnd[IDUNESCAPE ] = ["BUTTON",  0,       0, 0x50010000, 285,  23, 100,  20, pTxtUnEscape];
lpWnd[IDCOPYSOU  ] = ["BUTTON",  0,       0, 0x50010000, 390,  23, 100,  20, pTxtCopyPaste];
lpWnd[IDEDSOURCE ] = ["EDIT",    0,   0x200, 0x50210004,  15,  45, 475,  35, ""];
lpWnd[IDRE       ] = ["STATIC",  0,       0, 0x50000000,  15,  92,  30,  13, pTxtRE];
lpWnd[IDIGCASE   ] = ["BUTTON",  0,       0, 0x50010003,  50,  92,  70,  16, pTxtIgCase];
lpWnd[IDGLOBAL   ] = ["BUTTON",  0,       0, 0x50010003, 133,  92,  55,  16, pTxtGlobal];
lpWnd[IDMULTIL   ] = ["BUTTON",  0,       0, 0x50010003, 190,  92,  55,  16, pTxtMultiL];
lpWnd[IDCOLLECT  ] = ["BUTTON",  0,       0, 0x50010000, 285,  88, 100,  20, pTxtCollect];
lpWnd[IDCOPYRE   ] = ["BUTTON",  0,       0, 0x50010000, 390,  88, 100,  20, pTxtCopyPaste];
lpWnd[IDEDRE     ] = ["EDIT",    0,   0x200, 0x50210004,  15, 110, 475,  35, pREStr];
lpWnd[IDSTRING   ] = ["BUTTON",  0,       0, 0x50000007,   7, 160, 491, 145, pTxtString];
lpWnd[IDNEWLINE  ] = ["STATIC",  0,       0, 0x50000000,  50, 177,  70,  13, pTxtNewLine];
lpWnd[IDNLWIN    ] = ["BUTTON",  0,       0, 0x50000009, 120, 177,  70,  16, pTxtNLWin];
lpWnd[IDNLUNIX   ] = ["BUTTON",  0,       0, 0x50000009, 200, 177,  70,  16, pTxtNLUnix];
lpWnd[IDNLMAC    ] = ["BUTTON",  0,       0, 0x50000009, 270, 177,  70,  16, pTxtNLMac];
lpWnd[IDCOPYSTR  ] = ["BUTTON",  0,       0, 0x50010000, 390, 173, 100,  20, pTxtCopyPaste];
lpWnd[IDEDSTRING ] = ["EDIT",    0,   0x200, 0x50310004,  15, 195, 475, 105, pString];
lpWnd[IDACTION   ] = ["BUTTON",  0,       0, 0x50000007,   7, 315, 491,  65, pTxtAction];
lpWnd[IDMETEST   ] = ["BUTTON",  0,       0, 0x50000009,  15, 335,  85,  16, pTxtMeTest];
lpWnd[IDMEEXEC   ] = ["BUTTON",  0,       0, 0x50000009, 115, 335,  85,  16, pTxtMeExec];
lpWnd[IDMESEARCH ] = ["BUTTON",  0,       0, 0x50000009, 215, 335,  85,  16, pTxtMeSearch];
lpWnd[IDMEMATCH  ] = ["BUTTON",  0,       0, 0x50000009, 315, 335,  85,  16, pTxtMeMatch];
lpWnd[IDMESPLIT  ] = ["BUTTON",  0,       0, 0x50000009, 415, 335,  75,  16, pTxtMeSplit];
lpWnd[IDMEREPLACE] = ["BUTTON",  0,       0, 0x50000009,  15, 355, 120,  16, pTxtMeReplace];
lpWnd[IDEDWITH   ] = ["EDIT",    0,   0x200, 0x50010080, 135, 355, 355,  20, pWith];
lpWnd[IDRESULT   ] = ["BUTTON",  0,       0, 0x50000007,   7, 390, 491, 145, pTxtResult];
lpWnd[IDLASTIND  ] = ["STATIC",  0,       0, 0x50000000,  50, 407, 130,  13, pTxtLastInd];
lpWnd[IDRESETIND ] = ["BUTTON",  0,       0, 0x50010000, 180, 403, 100,  20, pTxtResetInd];
lpWnd[IDCOPYRES  ] = ["BUTTON",  0,       0, 0x50010000, 390, 403, 100,  20, pTxtCopy];
lpWnd[IDEDRESULT ] = ["EDIT",    0,   0x200, 0x50310804,  15, 425, 475, 105, ""];
lpWnd[IDGLOBPRO  ] = ["BUTTON",  0,       0, 0x50000007,   7, 545, 381, 125, pTxtGlobPro];
lpWnd[IDEDGLOBPRO] = ["EDIT",    0,   0x200, 0x50310804,  15, 560, 365, 105, ""];
lpWnd[IDTEST     ] = ["BUTTON",  0,       0, 0x50010001, 395, 550, 100,  23, pTxtTest];
lpWnd[IDHELP     ] = ["BUTTON",  0,       0, 0x50010000, 395, 575, 100,  23, pTxtHelp];
lpWnd[IDOPAQMINUS] = ["BUTTON",  0,       0, 0x50010000, 395, 600, 100,  23, pTxtOpaqMinus];
lpWnd[IDOPAQPLUS ] = ["BUTTON",  0,       0, 0x50010000, 395, 625, 100,  23, pTxtOpaqPlus];
lpWnd[IDCLOSE    ] = ["BUTTON",  0,       0, 0x50010000, 395, 650, 100,  23, pTxtClose];

lpCol[IDNAME     ] = ["BUTTON",  0,       0, 0x50000007,  10,  10, 260,  30, pTxtName];
lpCol[IDLIST     ] = ["LISTBOX", 0,       0, 0x50A10003,  10,  30, 260, 270, ""];
lpCol[IDVALUE    ] = ["BUTTON",  0,       0, 0x50000007, 280,  40, 225, 235, pTxtValue];
lpCol[IDREVAL    ] = ["STATIC",  0,       0, 0x50002000, 285,  60, 215, 210, ""];
lpCol[IDADD      ] = ["BUTTON",  0,       0, 0x50010000,  10, 290,  95,  23, pTxtAdd];
lpCol[IDRENAME   ] = ["BUTTON",  0,       0, 0x50010000, 110, 290,  95,  23, pTxtRename];
lpCol[IDDELETE   ] = ["BUTTON",  0,       0, 0x50010000, 210, 290,  95,  23, pTxtDelete];
lpCol[IDOK       ] = ["BUTTON",  0,       0, 0x50010001, 310, 290,  95,  23, pTxtOK];
lpCol[IDCOLCLOSE ] = ["BUTTON",  0,       0, 0x50010000, 410, 290,  95,  23, pTxtClose];

if (hEditWnd)
{
  if (lpBuffer = AkelPad.MemAlloc(nBufSize * _TSIZE))
  {
    if (AkelPad.WindowRegisterClass(pClassName))
    {
      //Create dialog
      hWndDlg = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                          0,               //dwExStyle
                          pClassName,      //lpClassName
                          pTxtCaption,     //lpWindowName
                          0x90CA0000,      //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
                          0,               //x
                          0,               //y
                          510,             //nWidth
                          710,             //nHeight
                          hMainWnd,        //hWndParent
                          0,               //ID
                          hInstanceDLL,    //hInstance
                          DialogCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.
      if (hWndDlg)
      {
        //Allow other scripts running
        AkelPad.ScriptNoMutex();

        //Message loop
        AkelPad.WindowGetMessage();
      }
      AkelPad.WindowUnregisterClass(pClassName);
    }
    else if (hWndDlg = oSys.Call("user32::FindWindowEx" + _TCHAR, 0, 0, pClassName, 0))
    {
      AkelPad.SendMessage(hWndDlg, 7 /*WM_SETFOCUS*/, 0, 0);
    }
    AkelPad.MemFree(lpBuffer);
  }
}

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

  if (uMsg == 1) //WM_CREATE
  {
    //Create windows
    for (i = 1000; i < lpWnd.length; ++i)
    {
      lpWnd[i][WND] = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                                lpWnd[i][WNDEXSTY],//dwExStyle
                                lpWnd[i][WNDTYPE], //lpClassName
                                0,                 //lpWindowName
                                lpWnd[i][WNDSTY],  //dwStyle
                                lpWnd[i][WNDX],    //x
                                lpWnd[i][WNDY],    //y
                                lpWnd[i][WNDW],    //nWidth
                                lpWnd[i][WNDH],    //nHeight
                                hWnd,              //hWndParent
                                i,                 //ID
                                hInstanceDLL,      //hInstance
                                0);                //lpParam
      //Set font and text
      SetWndFontAndText(lpWnd[i][WND], hGuiFont, lpWnd[i][WNDTXT]);
    }

    //Set limit edit text
    AkelPad.SendMessage(lpWnd[IDEDSOURCE ][WND], 197 /*EM_SETLIMITTEXT*/, 256, 0);
    AkelPad.SendMessage(lpWnd[IDEDRE     ][WND], 197 /*EM_SETLIMITTEXT*/, 256, 0);
    AkelPad.SendMessage(lpWnd[IDEDSTRING ][WND], 197 /*EM_SETLIMITTEXT*/, nBufSize - 1, 0);
    AkelPad.SendMessage(lpWnd[IDEDWITH   ][WND], 197 /*EM_SETLIMITTEXT*/, 256, 0);
    AkelPad.SendMessage(lpWnd[IDEDRESULT ][WND], 197 /*EM_SETLIMITTEXT*/, nBufSize - 1, 0);
    AkelPad.SendMessage(lpWnd[IDEDGLOBPRO][WND], 197 /*EM_SETLIMITTEXT*/, nBufSize - 1, 0);
    //Check
    CheckButtons();
    //Set window position
    if ((nWndPosX == undefined) || (nWndPosY == undefined))
      MoveWindow(hMainWnd, hWnd, "RT");
    else
      MoveWindow(hMainWnd, hWnd, [nWndPosX, nWndPosY]);
    //Set opaque
    if (nOpaque < 255)
      SetOpaqueLevel(hWnd, nOpaque);

    hFocus = lpWnd[IDEDSOURCE][WND];

    SetLastIndex();
    SetSource();
  }

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

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

  else if ((uMsg == 256) /*WM_KEYDOWN*/ &&
           (! (oSys.Call("user32::GetAsyncKeyState", 0x11 /*VK_CONTROL*/) & 0x80000000)))
  {
    if (wParam == 27) //VK_ESCAPE
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    else if (wParam == 13) //VK_RETURN
    {
      if (bIsTest)
        bIsTest = 0;
      else
      {
        hFocus = oSys.Call("user32::GetFocus");
        if ((hFocus != lpWnd[IDESCAPE   ][WND]) && (hFocus != lpWnd[IDUNESCAPE ][WND]) &&
            (hFocus != lpWnd[IDCOPYSOU  ][WND]) && (hFocus != lpWnd[IDCOLLECT  ][WND]) &&
            (hFocus != lpWnd[IDCOPYRE   ][WND]) && (hFocus != lpWnd[IDCOPYSTR  ][WND]) &&
            (hFocus != lpWnd[IDRESETIND ][WND]) && (hFocus != lpWnd[IDCOPYRES  ][WND]) &&
            (hFocus != lpWnd[IDTEST     ][WND]) && (hFocus != lpWnd[IDHELP     ][WND]) &&
            (hFocus != lpWnd[IDOPAQMINUS][WND]) && (hFocus != lpWnd[IDOPAQPLUS ][WND]) &&
            (hFocus != lpWnd[IDCLOSE    ][WND]))
          oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDTEST, 0);
      }
    }
    else if (wParam == 112) //VK_F1
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDHELP, 0);
  }

  else if ((uMsg == 258 /*WM_CHAR*/) && (wParam == 9 /*VK_TAB*/))
    oSys.Call("user32::SetFocus",
                oSys.Call("user32::GetNextDlgTabItem", hWnd, oSys.Call("user32::GetFocus"),
                  oSys.Call("user32::GetAsyncKeyState", 0xA0 /*VK_LSHIFT*/) & 0x80000000));

  else if (uMsg == 260) //WM_SYSKEYDOWN
  {
    if (oSys.Call("user32::GetAsyncKeyState", 0xA0 /*VK_LSHIFT*/) & 0x80000000)
    {
      if (wParam == 0x27) //VK_RIGHT
        MoveWindow(hMainWnd, hWnd, "R");
      else if (wParam == 0x25) //VK_LEFT
        MoveWindow(hMainWnd, hWnd, "L");
      else if (wParam == 0x28) //VK_DOWN
        MoveWindow(hMainWnd, hWnd, "D");
      else if (wParam == 0x26) //VK_UP
        MoveWindow(hMainWnd, hWnd, "U");
      else if (wParam == 0x23) //VK_END
        MoveWindow(hMainWnd, hWnd, "E");
      else if (wParam == 0x24) //VK_HOME
        MoveWindow(hMainWnd, hWnd, "H");
      else if (wParam == 0x22) //VK_NEXT
        MoveWindow(hMainWnd, hWnd, "B");
      else if (wParam == 0x21) //VK_PRIOR
        MoveWindow(hMainWnd, hWnd, "T");
    }

    if ((wParam == 109) || (wParam == 189))  //Num- or -
      SetOpaqueLevel(hWnd, -2);
    else if ((wParam == 107) || (wParam == 187))  //Num+ or +
      SetOpaqueLevel(hWnd, -1);
  }

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

    if (nLowParam == IDEDSOURCE)
    {
      if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
        AkelPad.SendMessage(lpWnd[IDEDSOURCE][WND], 0x00B1 /*EM_SETSEL*/, oSel.Source1, oSel.Source2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.Source1 = LoWord(AkelPad.SendMessage(lpWnd[IDEDSOURCE][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.Source2 = HiWord(AkelPad.SendMessage(lpWnd[IDEDSOURCE][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
      }
      else if (nHiwParam == 0x0300 /*EN_CHANGE*/)
      {
        SetLastIndex(0);
        SetRE();
      }
    }
    else if (nLowParam == IDEDRE)
    {
      if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
        AkelPad.SendMessage(lpWnd[IDEDRE][WND], 0x00B1 /*EM_SETSEL*/, oSel.RE1, oSel.RE2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.RE1 = LoWord(AkelPad.SendMessage(lpWnd[IDEDRE][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.RE2 = HiWord(AkelPad.SendMessage(lpWnd[IDEDRE][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        SetRE();
      }
      else if (nHiwParam == 0x0300 /*EN_CHANGE*/)
      {
        SetLastIndex(0);
        SetSource();
      }
    }
    else if (nLowParam == IDEDSTRING)
    {
      if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
        AkelPad.SendMessage(lpWnd[IDEDSTRING][WND], 0x00B1 /*EM_SETSEL*/, oSel.String1, oSel.String2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.String1 = LoWord(AkelPad.SendMessage(lpWnd[IDEDSTRING][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.String2 = HiWord(AkelPad.SendMessage(lpWnd[IDEDSTRING][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
      }
      else if (nHiwParam == 0x0300 /*EN_CHANGE*/)
        SetLastIndex(0);
    }
    else if (nLowParam == IDEDWITH)
    {
      if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
        AkelPad.SendMessage(lpWnd[IDEDWITH][WND], 0x00B1 /*EM_SETSEL*/, oSel.With1, oSel.With2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.With1 = LoWord(AkelPad.SendMessage(lpWnd[IDEDWITH][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.With2 = HiWord(AkelPad.SendMessage(lpWnd[IDEDWITH][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
      }
      else if (nHiwParam == 0x0300 /*EN_CHANGE*/)
        SetLastIndex(0);
    }
    else if (nLowParam == IDEDRESULT)
    {
      if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
        AkelPad.SendMessage(lpWnd[IDEDRESULT][WND], 0x00B1 /*EM_SETSEL*/, oSel.Result1, oSel.Result2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.Result1 = LoWord(AkelPad.SendMessage(lpWnd[IDEDRESULT][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.Result2 = HiWord(AkelPad.SendMessage(lpWnd[IDEDRESULT][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
      }
    }
    else if (nLowParam == IDEDGLOBPRO)
    {
      if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
        AkelPad.SendMessage(lpWnd[IDEDGLOBPRO][WND], 0x00B1 /*EM_SETSEL*/, oSel.GlobPro1, oSel.GlobPro2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.GlobPro1 = LoWord(AkelPad.SendMessage(lpWnd[IDEDGLOBPRO][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.GlobPro2 = HiWord(AkelPad.SendMessage(lpWnd[IDEDGLOBPRO][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
      }
    }
    else if ((nLowParam >= IDIGCASE) && (nLowParam <= IDMULTIL))
    {
      CheckButtons(nLowParam);
      SetLastIndex(0);
      SetRE();
    }
    else if (((nLowParam >= IDNLWIN) && (nLowParam <= IDNLMAC)) ||
            ((nLowParam >= IDMETEST) && (nLowParam <= IDMEREPLACE)))
    {
      CheckButtons(nLowParam);
      SetLastIndex(0);
    }
    else if ((nLowParam == IDESCAPE) || (nLowParam == IDUNESCAPE))
    {
      if (EscapeUnescape(nLowParam == IDESCAPE))
      {
        SetLastIndex(0);
        SetRE();
      }
    }
    else if ((nLowParam == IDCOPYSOU) || (nLowParam == IDCOPYRE) ||
             (nLowParam == IDCOPYSTR) || (nLowParam == IDCOPYRES))
    {
      if (CopyPaste(nLowParam))
      {
        SetLastIndex(0);
        if (nLowParam == IDCOPYSOU)
          SetRE();
        else if (nLowParam == IDCOPYRE)
          SetSource();
      }
    }
    else if (nLowParam == IDCOLLECT)
      Collection();
    else if (nLowParam == IDRESETIND)
      SetLastIndex(0);
    else if (nLowParam == IDTEST)
    {
      bIsTest = (oSys.Call("user32::GetFocus") == lpWnd[IDTEST][WND]) ? 1 : 0;
      SetRE();
      TestRE();
    }
    else if (nLowParam == IDHELP)
      Help();
    else if (nLowParam == IDOPAQMINUS)
      SetOpaqueLevel(hWnd, -2);
    else if (nLowParam == IDOPAQPLUS)
      SetOpaqueLevel(hWnd, -1);
    else if (nLowParam == IDCLOSE)
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

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

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

  else
    SetDefID(hWnd);

  return 0;
}

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

  AkelPad.MemCopy(lpBuffer, pText.substr(0, nBufSize - 1), _TSTR);
  oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, lpBuffer);
}

function MoveWindow(hWndParent, hWnd, Action)
{
  var rcWndParent;
  var rcWnd;
  var nX;
  var nY;

  if (! hWndParent)
    hWndParent=oSys.Call("user32::GetDesktopWindow");

  rcWndParent = GetWindowPos(hWndParent);
  rcWnd       = GetWindowPos(hWnd);

  nX = rcWnd.left;
  nY = rcWnd.top;

  if (Action == "R") //Move right
    nX = rcWnd.left + ((rcWnd.left < rcWndParent.right - 50) ? 20: 0);
  else if (Action == "L") //Move left
    nX = rcWnd.left - ((rcWnd.right > rcWndParent.left + 50) ? 20: 0);
  else if (Action == "D") //Move down
    nY = rcWnd.top + ((rcWnd.top < rcWndParent.bottom - 50) ? 20: 0);
  else if (Action == "U") //Move up
    nY = rcWnd.top - ((rcWnd.bottom > rcWndParent.top + 50) ? 20: 0);
  else if (Action == "E") //Move end (right)
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
  else if (Action == "H") //Move home (left)
    nX = rcWnd.left + (rcWndParent.left - rcWnd.left);
  else if (Action == "B") //Move bottom
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  else if (Action == "T") //Move top
    nY = rcWnd.top + (rcWndParent.top - rcWnd.top);
  else if (Action == "C") //Center window
  {
    nX = rcWndParent.left + ((rcWndParent.right  - rcWndParent.left) / 2 - (rcWnd.right  - rcWnd.left) / 2);
    nY = rcWndParent.top  + ((rcWndParent.bottom - rcWndParent.top)  / 2 - (rcWnd.bottom - rcWnd.top)  / 2);
  }
  else if (Action == "LT") //Move left top
  {
    nX = rcWndParent.left;
    nY = rcWndParent.top;
  }
  else if (Action == "RT") //Move right top
  {
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
    nY = rcWndParent.top;
  }
  else if (Action == "LB") //Move left bottom
  {
    nX = rcWndParent.left;
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  }
  else if (Action == "RB") //Move right bottom
  {
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  }
  else
  {
    nX = Action[0];
    nY = Action[1];
  }

  oSys.Call("user32::SetWindowPos", hWnd, 0, nX, nY, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
}

function GetWindowPos(hWnd)
{
  var lpRect = AkelPad.MemAlloc(16) //sizeof(RECT);
  var rcRect = [];

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

  rcRect.left   = AkelPad.MemRead(lpRect,     DT_DWORD);
  rcRect.top    = AkelPad.MemRead(lpRect + 4, DT_DWORD);
  rcRect.right  = AkelPad.MemRead(lpRect + 8, DT_DWORD);
  rcRect.bottom = AkelPad.MemRead(lpRect +12, DT_DWORD);
  AkelPad.MemFree(lpRect);

  return rcRect;
}

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

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

function SetOpaqueLevel(hWnd, nLevel)
{
  var lpBuf;
  var nStyle;

  if (nLevel < 0)
  {
    lpBuf  = AkelPad.MemAlloc(1);
    if (oSys.Call("user32::GetLayeredWindowAttributes", hWnd, 0, lpBuf, 0))
    {
      nOpaque = AkelPad.MemRead(lpBuf, 5 /*DT_BYTE*/);
      nOpaque += (nLevel == -1) ? 20 : -20;
    }
    AkelPad.MemFree(lpBuf);
  }

  if (nOpaque > 255)
    nOpaque = 255;
  else if (nOpaque < 55)
    nOpaque = 55;

  //WS_EX_LAYERED style
  nStyle = oSys.Call("User32::GetWindowLong" + _TCHAR, hWnd, -20 /*GWL_EXSTYLE*/);

  if (! (nStyle & 0x00080000 /*WS_EX_LAYERED*/))
  {
    nStyle |= 0x00080000 /*WS_EX_LAYERED*/;
    oSys.Call("User32::SetWindowLongW", hWnd, -20 /*GWL_EXSTYLE*/, nStyle);
  }

  oSys.Call("user32::SetLayeredWindowAttributes", hWnd, 0, nOpaque, 2 /*LWA_ALPHA*/);
}

function SetDefID(hWnd)
{
  var nID    = 1000;
  var hFocus = oSys.Call("user32::GetFocus");

  while ((nID < lpWnd.length) && (hFocus != lpWnd[nID][WND]))
    ++nID;

  if ((nID != IDESCAPE) && (nID != IDUNESCAPE)  && (nID != IDCOPYSOU)  && (nID != IDCOLLECT) &&
      (nID != IDCOPYRE) && (nID != IDCOPYSTR)   && (nID != IDCOPYRES)  && (nID != IDRESETIND) &&
      (nID != IDHELP)   && (nID != IDOPAQMINUS) && (nID != IDOPAQPLUS) && (nID != IDCLOSE))
    nID = IDTEST;

  oSys.Call("user32::DefDlgProc" + _TCHAR, hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
}

function CheckButtons(nButton)
{
  var nID;

  if (nButton)
  {
    bIgCase = AkelPad.SendMessage(lpWnd[IDIGCASE][WND], BM_GETCHECK, 0, 0);
    bGlobal = AkelPad.SendMessage(lpWnd[IDGLOBAL][WND], BM_GETCHECK, 0, 0);
    bMultiL = AkelPad.SendMessage(lpWnd[IDMULTIL][WND], BM_GETCHECK, 0, 0);

    for (nID = IDNLWIN; nID <= IDNLMAC; ++nID)
    {
      if (AkelPad.SendMessage(lpWnd[nID][WND], BM_GETCHECK, 0, 0))
      {
        nNL = nID - IDNLWIN + 1;
        break;
      }
    }

    for (nID = IDMETEST; nID <= IDMEREPLACE; ++nID)
    {
      if (AkelPad.SendMessage(lpWnd[nID][WND], BM_GETCHECK, 0, 0))
      {
        nAction = nID - IDMETEST + 1;
        break;
      }
    }
  }

  AkelPad.SendMessage(lpWnd[IDIGCASE   ][WND], BM_SETCHECK, bIgCase       , 0);
  AkelPad.SendMessage(lpWnd[IDGLOBAL   ][WND], BM_SETCHECK, bGlobal       , 0);
  AkelPad.SendMessage(lpWnd[IDMULTIL   ][WND], BM_SETCHECK, bMultiL       , 0);
  AkelPad.SendMessage(lpWnd[IDNLWIN    ][WND], BM_SETCHECK, (nNL == 1)    , 0);
  AkelPad.SendMessage(lpWnd[IDNLUNIX   ][WND], BM_SETCHECK, (nNL == 2)    , 0);
  AkelPad.SendMessage(lpWnd[IDNLMAC    ][WND], BM_SETCHECK, (nNL == 3)    , 0);
  AkelPad.SendMessage(lpWnd[IDMETEST   ][WND], BM_SETCHECK, (nAction == 1), 0);
  AkelPad.SendMessage(lpWnd[IDMEEXEC   ][WND], BM_SETCHECK, (nAction == 2), 0);
  AkelPad.SendMessage(lpWnd[IDMESEARCH ][WND], BM_SETCHECK, (nAction == 3), 0);
  AkelPad.SendMessage(lpWnd[IDMEMATCH  ][WND], BM_SETCHECK, (nAction == 4), 0);
  AkelPad.SendMessage(lpWnd[IDMESPLIT  ][WND], BM_SETCHECK, (nAction == 5), 0);
  AkelPad.SendMessage(lpWnd[IDMEREPLACE][WND], BM_SETCHECK, (nAction == 6), 0);

  oSys.Call("user32::EnableWindow", lpWnd[IDEDWITH][WND], (nAction == 6));
  oSys.Call("user32::EnableWindow", lpWnd[IDCOLLECT][WND], (typeof Collection == "function"));
}

function EscapeUnescape(bEscape)
{
  var bIsChange = 0;
  var pSource;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDSOURCE][WND], lpBuffer, nBufSize);
  pSource = AkelPad.MemRead(lpBuffer, _TSTR);

  if (bEscape)
    pSource = pSource.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&");
  else
    pSource = pSource.replace(/\\([\\\/.^$+*?|()\[\]{}])/g, "$1");

  if (pSource != AkelPad.MemRead(lpBuffer, _TSTR))
  {
    SetWndFontAndText(lpWnd[IDEDSOURCE][WND], hGuiFont, pSource);
    bIsChange = 1;
  }
  return bIsChange;
}

function CopyPaste(nID)
{
  var bIsChange = 0;
  var rcWnd;
  var hMenu;
  var nCmd;
  var nIDED;

  if (nID == IDCOPYSOU)
    nIDED = IDEDSOURCE;
  else if (nID == IDCOPYRE)
    nIDED = IDEDRE;
  else if (nID == IDCOPYSTR)
    nIDED = IDEDSTRING;
  else if (nID == IDCOPYRES)
    nIDED = IDEDRESULT;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[nIDED][WND], lpBuffer, nBufSize);

  rcWnd = GetWindowPos(lpWnd[nID][WND]);
  hMenu = oSys.Call("user32::CreatePopupMenu");

  oSys.Call("user32::AppendMenu" + _TCHAR, hMenu,
              AkelPad.MemRead(lpBuffer, _TSTR) ? 0x0 /*MF_STRING*/ : 0x1 /*MF_GRAYED*/, 1, pTxtCopyCB);
  oSys.Call("user32::AppendMenu" + _TCHAR, hMenu,
              AkelPad.MemRead(lpBuffer, _TSTR) ? 0x0 /*MF_STRING*/ : 0x1 /*MF_GRAYED*/, 2, pTxtCopyAP);

  if ((nID == IDCOPYSOU) || (nID == IDCOPYRE) || (nID == IDCOPYSTR))
  {
    oSys.Call("user32::AppendMenu" + _TCHAR, hMenu, 0x800 /*MF_SEPARATOR*/, 0, 0);
    oSys.Call("user32::AppendMenu" + _TCHAR, hMenu,
                AkelPad.GetClipboardText() ? 0x0 /*MF_STRING*/ : 0x1 /*MF_GRAYED*/, 3, pTxtPasteCB);
    oSys.Call("user32::AppendMenu" + _TCHAR, hMenu,
                AkelPad.GetSelText() ? 0x0 /*MF_STRING*/ : 0x1 /*MF_GRAYED*/, 4, pTxtPasteAP);
  }

  nCmd = oSys.Call("user32::TrackPopupMenu", hMenu, 0x188 /*TPM_RIGHTALIGN|TPM_NONOTIFY|TPM_RETURNCMD*/,
                    rcWnd.right, rcWnd.bottom, 0, hWndDlg, 0);
  oSys.Call("user32::DestroyMenu", hMenu);

  if (nCmd == 1)
    AkelPad.SetClipboardText(AkelPad.MemRead(lpBuffer, _TSTR));
  else if (nCmd == 2)
    AkelPad.ReplaceSel(AkelPad.MemRead(lpBuffer, _TSTR), 1);
  else if (nCmd == 3)
  {
    if (AkelPad.GetClipboardText() != AkelPad.MemRead(lpBuffer, _TSTR))
    {
      SetWndFontAndText(lpWnd[nIDED][WND], hGuiFont, AkelPad.GetClipboardText());
      bIsChange = 1;
    }
  }
  else if (nCmd == 4)
  {
    if (AkelPad.GetSelText(3 /*\r\n*/) != AkelPad.MemRead(lpBuffer, _TSTR))
    {
      SetWndFontAndText(lpWnd[nIDED][WND], hGuiFont, AkelPad.GetSelText(3 /*\r\n*/));
      bIsChange = 1;
    }
  }

  return bIsChange;
}

function SetLastIndex(nInd)
{
  if (nInd == undefined)
    nInd = oRE.lastIndex;
  else
    oRE.lastIndex = nInd;

  SetWndFontAndText(lpWnd[IDLASTIND][WND], hGuiFont, pTxtLastInd + nInd);
}

function SetRE()
{
  var pModyf = "";
  var pSource;
  var oError;

  if (bIgCase) pModyf += "i";
  if (bGlobal) pModyf += "g";
  if (bMultiL) pModyf += "m";

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDSOURCE][WND], lpBuffer, nBufSize);
  pSource = AkelPad.MemRead(lpBuffer, _TSTR);

  try
  {
    pREStr = String(RegExp(pSource, pModyf));
    if (pREStr.length > AkelPad.SendMessage(lpWnd[IDEDRE][WND], 213 /*EM_GETLIMITTEXT*/, 0, 0))
      pREStr = "";
  }
  catch (oError)
  {
    pREStr = "";
  }

  SetWndFontAndText(lpWnd[IDEDRE][WND], hGuiFont, pREStr);
}

function SetSource()
{
  var pSource = "";
  var nPos;
  var pModyf;
  var oError;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDRE][WND], lpBuffer, nBufSize);
  pREStr = AkelPad.MemRead(lpBuffer, _TSTR).replace(/(^[ \t]+)|([ \t]+$)/g, "");

  if ((pREStr.charAt(0) == "/") && ((nPos = pREStr.lastIndexOf("/")) > 0))
  {
    pModyf = pREStr.substring(nPos + 1);
    if (! (pModyf && /[^igm]/.test(pModyf)))
    {
      pSource = pREStr.substring(1, nPos);

      if (pSource.length > AkelPad.SendMessage(lpWnd[IDEDSOURCE][WND], 213 /*EM_GETLIMITTEXT*/, 0, 0))
        pSource = "";
      else
      {
        bIgCase = (pModyf.indexOf("i") < 0) ? 0 : 1;
        bGlobal = (pModyf.indexOf("g") < 0) ? 0 : 1;
        bMultiL = (pModyf.indexOf("m") < 0) ? 0 : 1;
        CheckButtons();
      }
    }
  }

  SetWndFontAndText(lpWnd[IDEDSOURCE][WND], hGuiFont, pSource);
}

function TestRE()
{
  var pResult = "";
  var pModyf  = "";
  var pNLWin  = "\r\n";
  var pSource;
  var aTestRes;
  var i;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDRE][WND], lpBuffer, nBufSize);
  pREStr = AkelPad.MemRead(lpBuffer, _TSTR);
  if (! pREStr)
  {
    AkelPad.MessageBox(hWndDlg, pTxtNoRE, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    oSys.Call("user32::SetFocus", lpWnd[IDEDRE][WND]);
    return;
  }

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDSTRING][WND], lpBuffer, nBufSize);
  pString = AkelPad.MemRead(lpBuffer, _TSTR);
  if (! pString)
  {
    AkelPad.MessageBox(hWndDlg, pTxtNoStr, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    oSys.Call("user32::SetFocus", lpWnd[IDEDSTRING][WND]);
    return;
  }

  if (nNL == 2)
    pString = pString.replace(/\r\n/g, "\n");
  else if (nNL == 3)
    pString = pString.replace(/\r\n/g, "\r");

  if (oRE.lastIndex == 0)
  {
    oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDSOURCE][WND], lpBuffer, nBufSize);
    pSource = AkelPad.MemRead(lpBuffer, _TSTR);
    if (bIgCase) pModyf += "i";
    if (bGlobal) pModyf += "g";
    if (bMultiL) pModyf += "m";
    oRE = new RegExp(pSource, pModyf);
  }

  if (nAction == 1) //.test
    pResult = oRE.test(pString).toString();

  else if (nAction == 2) //.exec
  {
    aTestRes = oRE.exec(pString);
    if (aTestRes)
    {
      for (i = 0; i < aTestRes.length; ++i)
        pResult += pTxtArray + "[" + i + "]=" + aTestRes[i] + ((i == aTestRes.length - 1) ? "" : pNLWin);
    }
    else
      pResult = String(aTestRes);
  }

  else if (nAction == 3) //.search
    pResult = pString.search(oRE).toString();

  else if (nAction == 4) //.match
  {
    aTestRes = pString.match(oRE);
    if (aTestRes)
    {
      for (i = 0; i < aTestRes.length; ++i)
        pResult += pTxtArray + "[" + i + "]=" + aTestRes[i] + ((i == aTestRes.length - 1) ? "" : pNLWin);
    }
    else
      pResult = String(aTestRes);
  }

  else if (nAction == 5) //.split
  {
    aTestRes = pString.split(oRE);
    if (aTestRes.length)
    {
      for (i = 0; i < aTestRes.length; ++i)
        pResult += pTxtArray + "[" + i + "]=" + aTestRes[i] + ((i == aTestRes.length - 1) ? "" : pNLWin);
    }
    else
      pResult = pTxtEmpArray;
  }

  else if (nAction == 6) //.replace
  {
    oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDWITH][WND], lpBuffer, nBufSize);
    pWith   = AkelPad.MemRead(lpBuffer, _TSTR);
    pResult = pString.replace(oRE, pWith);
  }

  SetWndFontAndText(lpWnd[IDEDRESULT][WND], hGuiFont, pResult);
  SetLastIndex();

  pResult  = "RegExp.$1=" + RegExp.$1 + pNLWin;
  pResult += "RegExp.$2=" + RegExp.$2 + pNLWin;
  pResult += "RegExp.$3=" + RegExp.$3 + pNLWin;
  pResult += "RegExp.$4=" + RegExp.$4 + pNLWin;
  pResult += "RegExp.$5=" + RegExp.$5 + pNLWin;
  pResult += "RegExp.$6=" + RegExp.$6 + pNLWin;
  pResult += "RegExp.$7=" + RegExp.$7 + pNLWin;
  pResult += "RegExp.$8=" + RegExp.$8 + pNLWin;
  pResult += "RegExp.$9=" + RegExp.$9 + pNLWin;
  pResult += "RegExp.index=" + RegExp.index + pNLWin;
  pResult += "RegExp.lastIndex=" + RegExp.lastIndex + pNLWin;
  pResult += "RegExp.lastMatch=" + RegExp.lastMatch + pNLWin;
  pResult += "RegExp.lastParen=" + RegExp.lastParen + pNLWin;
  pResult += "RegExp.leftContext=" + RegExp.leftContext + pNLWin;
  pResult += "RegExp.rightContext=" + RegExp.rightContext;

  SetWndFontAndText(lpWnd[IDEDGLOBPRO][WND], hGuiFont, pResult);

  oSys.Call("user32::SetFocus", lpWnd[IDEDRESULT][WND]);
}

function Help()
{
  var rcWnd   = GetWindowPos(hWndDlg);
  var hWndHlp = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                          0,              //dwExStyle
                          pClassName,     //lpClassName
                          pTxtREHelp,     //lpWindowName
                          0x90C80000,     //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU
                          rcWnd.left+15,  //x
                          rcWnd.top+40,   //y
                          425,            //nWidth
                          500,            //nHeight
                          hWndDlg,        //hWndParent
                          0,              //ID
                          hInstanceDLL,   //hInstance
                          DialogCallbackHelp); //lpParam

  if (hWndHlp)
  {
    oSys.Call("user32::EnableWindow", hMainWnd, 0);
    oSys.Call("user32::EnableWindow", hWndDlg, 0);
    AkelPad.WindowGetMessage();
  }
}

function DialogCallbackHelp(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 1) //WM_CREATE
  {
    hWndEdHlp = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                          0x200,        //dwExStyle
                          "EDIT",       //lpClassName
                          0,            //lpWindowName
                          0x50200804,   //WS_VISIBLE|WS_CHILD|WS_VSCROLL|ES_READONLY|ES_MULTILINE
                          10,           //x
                          10,           //y
                          400,          //nWidth
                          450,          //nHeight
                          hWnd,         //hWndParent
                          0,            //ID
                          hInstanceDLL, //hInstance
                          0);           //lpParam
    SetWndFontAndText(hWndEdHlp, hGuiFont, pTxtHelpText);
  }

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

  else if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if ((wParam == 27 /*VK_ESCAPE*/) || (wParam == 112 /*VK_F1*/))
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    oSys.Call("user32::EnableWindow", hMainWnd, 1);
    oSys.Call("user32::EnableWindow", hWndDlg, 1);
    oSys.Call("user32::DestroyWindow", hWnd);
  }

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

  return 0;
}

function Collection()
{
  var rcWnd   = GetWindowPos(hWndDlg);
  var hWndCol = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                          0,              //dwExStyle
                          pClassName,     //lpClassName
                          pTxtRECollect,  //lpWindowName
                          0x90C80000,     //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU
                          rcWnd.left-4,   //x
                          rcWnd.top+180,  //y
                          520,            //nWidth
                          350,            //nHeight
                          hWndDlg,        //hWndParent
                          0,              //ID
                          hInstanceDLL,   //hInstance
                          DialogCallbackCol); //lpParam

  if (hWndCol)
  {
    oSys.Call("user32::EnableWindow", hMainWnd, 0);
    oSys.Call("user32::EnableWindow", hWndDlg, 0);
    AkelPad.WindowGetMessage();
  }
}

function DialogCallbackCol(hWnd, uMsg, wParam, lParam)
{
  var i, nPos, nLowParam, nHiwParam;

  if (uMsg == 1) //WM_CREATE
  {
    for (i = 1000; i < lpCol.length; ++i)
    {
      lpCol[i][WND] = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                                lpCol[i][WNDEXSTY],//dwExStyle
                                lpCol[i][WNDTYPE], //lpClassName
                                0,                 //lpWindowName
                                lpCol[i][WNDSTY],  //dwStyle
                                lpCol[i][WNDX],    //x
                                lpCol[i][WNDY],    //y
                                lpCol[i][WNDW],    //nWidth
                                lpCol[i][WNDH],    //nHeight
                                hWnd,              //hWndParent
                                i,                 //ID
                                hInstanceDLL,      //hInstance
                                0);                //lpParam
      SetWndFontAndText(lpCol[i][WND], hGuiFont, lpCol[i][WNDTXT]);
    }

    //Fill listbox
    for (i = 0; i < aRECol.length; ++i)
    {
      AkelPad.MemCopy(lpBuffer, aRECol[i][0], _TSTR);
      nPos = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0180 /*LB_ADDSTRING*/, 0, lpBuffer);
      if (nPos >= 0)
      {
        AkelPad.SendMessage(lpCol[IDLIST][WND], 0x019A /*LB_SETITEMDATA*/, nPos, i);
        if (aRECol[i][1] == pREStr)
          AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0186 /*LB_SETCURSEL*/, nPos, 0);
      }
    }

    CheckButtonsCollection();
  }

  else if (uMsg == 7) //WM_SETFOCUS
  {
    oSys.Call("user32::SetFocus", lpCol[IDLIST][WND]);
    SetSelRE();
  }

  else if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if (wParam == 27 /*VK_ESCAPE*/)
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    else if (wParam == 13 /*VK_RETURN*/)
    {
      if (! bIsReturn)
        oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDOK, 0);
    }
    else if (wParam == 45 /*VK_INSERT*/)
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDADD, 0);
    else if (wParam == 46 /*VK_DELETE*/)
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDDELETE, 0);
    else if (wParam == 113 /*VK_F2*/)
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDRENAME, 0);
  }

  else if (uMsg == 257 /*WM_KEYUP*/)
    bIsReturn = 0;

  else if (uMsg == 258 /*WM_CHAR*/)
    FindRE(wParam);

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

    if (nLowParam == IDLIST)
    {
      if (nHiwParam == 1 /*LBN_SELCHANGE*/)
        SetSelRE();
      else if (nHiwParam == 2 /*LBN_DBLCLK*/)
        oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDOK, 0);
    }
    else if (nLowParam == IDADD)
    {
      bIsReturn = 1;
      AddRE(hWnd);
    }
    else if (nLowParam == IDRENAME)
    {
      bIsReturn = 1;
      RenameRE(hWnd);
    }
    else if (nLowParam == IDDELETE)
    {
      bIsReturn = 1;
      DeleteRE();
    }
    else if (nLowParam == IDOK)
    {
      nPos = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0188 /*LB_GETCURSEL*/, 0, 0);
      if (nPos >= 0)
      {
        i = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0199 /*LB_GETITEMDATA*/, nPos, 0);
        SetWndFontAndText(lpWnd[IDEDRE][WND], hGuiFont, aRECol[i][1]);
        SetLastIndex(0);
        SetSource();
      }
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }
    else if (nLowParam == IDCOLCLOSE)
      oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    for (i = aRECol.length - 1; i >= 0; --i)
    {
      if (! aRECol[i][0])
        aRECol.splice(i, 1);
    }
    oSys.Call("user32::EnableWindow", hMainWnd, 1);
    oSys.Call("user32::EnableWindow", hWndDlg, 1);
    oSys.Call("user32::DestroyWindow", hWnd);
  }

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

  else
    SetDefIDCollection(hWnd);

  return 0;
}

function SetDefIDCollection(hWnd)
{
  var nID    = 1000;
  var hFocus = oSys.Call("user32::GetFocus");

  while ((nID < lpCol.length) && (hFocus != lpCol[nID][WND]))
    ++nID;

  if (nID == IDLIST)
    nID = IDOK;

  oSys.Call("user32::DefDlgProc" + _TCHAR, hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
}

function CheckButtonsCollection()
{
  var bEnable;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDRE][WND], lpBuffer, nBufSize);
  if (AkelPad.MemRead(lpBuffer, _TSTR))
    bEnable = 1;
  else
    bEnable = 0;
  oSys.Call("user32::EnableWindow", lpCol[IDADD][WND], bEnable);

  if (AkelPad.SendMessage(lpCol[IDLIST][WND], 0x018B /*LB_GETCOUNT*/, 0, 0) > 0)
    bEnable = 1;
  else
  {
    bEnable = 0;
    oSys.Call("user32::SetFocus", lpCol[IDLIST][WND]);
  }

  oSys.Call("user32::EnableWindow", lpCol[IDRENAME][WND], bEnable);
  oSys.Call("user32::EnableWindow", lpCol[IDDELETE][WND], bEnable);
  oSys.Call("user32::EnableWindow", lpCol[IDOK    ][WND], bEnable);
}

function SetSelRE(nPos)
{
  var pVal = "";
  var i;

  if (nPos == undefined)
    nPos = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0188 /*LB_GETCURSEL*/, 0, 0);
  if (nPos < 0)
    nPos = 0;

  nPos = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0186 /*LB_SETCURSEL*/, nPos, 0);

  if (nPos >= 0)
  {
    i    = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0199 /*LB_GETITEMDATA*/, nPos, 0);
    pVal = aRECol[i][1];
  }

  SetWndFontAndText(lpCol[IDREVAL][WND], hGuiFont, pVal);
}
}


Last edited by KDJ on Fri Mar 01, 2013 11:46 pm; edited 21 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1374
Location: Poland

PostPosted: Sun Feb 20, 2011 1:08 pm    Post subject: Reply with quote

Regular expression tester for JavaScript - Part Two.

The second part of the script: RegExpTestJS.js (see previous post).
Both parts should be placed in one file.

RegExpTestJS_part2.js

Code:
function AddRE(hWnd)
{
  var bNameExist = 1;
  var pName = "";
  var nPos;
  var i;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDRE][WND], lpBuffer, nBufSize);
  pREStr = AkelPad.MemRead(lpBuffer, _TSTR);

  if (pREStr)
  {
    for (i = 0; i < aRECol.length; ++i)
    {
      if (aRECol[i][1] == pREStr)
      {
        for (nPos = 0; nPos < AkelPad.SendMessage(lpCol[IDLIST][WND], 0x018B /*LB_GETCOUNT*/, 0, 0); ++nPos)
        {
          if (AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0199 /*LB_GETITEMDATA*/, nPos, 0) == i)
            break;
        }
        SetSelRE(nPos);
        AkelPad.MessageBox(hWnd, pTxtREExist + aRECol[i][0], pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
        return;
      }
    }

    nPos = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0188 /*LB_GETCURSEL*/, 0, 0);
    if (nPos >= 0)
    {
      i = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0199 /*LB_GETITEMDATA*/, nPos, 0);
      pName = aRECol[i][0];
    }

    while (bNameExist)
    {
      bNameExist = 0;
      pName = AkelPad.InputBox(hWnd, pTxtAddRE, pTxtName, pName);

      if (pName != undefined)
        pName = pName.replace(/ +$/, "");
 
      if (pName)
      {
        for (i = 0; i < aRECol.length; ++i)
        {
          if (aRECol[i][0] == pName)
          {
            for (nPos = 0; nPos < AkelPad.SendMessage(lpCol[IDLIST][WND], 0x018B /*LB_GETCOUNT*/, 0, 0); ++nPos)
            {
              if (AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0199 /*LB_GETITEMDATA*/, nPos, 0) == i)
                break;
            }
            SetSelRE(nPos);
            AkelPad.MessageBox(hWnd, pTxtNameExist + pName, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
            bNameExist = 1;
            break;
          }
        }

        if (! bNameExist)
        {
          AkelPad.MemCopy(lpBuffer, pName, _TSTR);
          nPos = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0180 /*LB_ADDSTRING*/, 0, lpBuffer);
          if (nPos >= 0)
          {
            i = aRECol.push([pName, pREStr]) - 1;
            AkelPad.SendMessage(lpCol[IDLIST][WND], 0x019A /*LB_SETITEMDATA*/, nPos, i);
            SetSelRE(nPos);
            CheckButtonsCollection();
          }
        }
      }
    }
  }
  else
    AkelPad.MessageBox(hWnd, pTxtNoRE, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
}

function RenameRE(hWnd)
{
  var nPos = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0188 /*LB_GETCURSEL*/, 0, 0);
  var bNameExist = 1;
  var nPos1;
  var i;
  var n;
  var pName;

  if (nPos >= 0)
  {
    n = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0199 /*LB_GETITEMDATA*/, nPos, 0);
    pName = aRECol[n][0];

    while (bNameExist)
    {
      bNameExist = 0;
      pName = AkelPad.InputBox(hWnd, pTxtRenRE, pTxtNewName, pName);

      if (pName != undefined)
        pName = pName.replace(/ +$/, "");
 
      if (pName)
      {
        for (i = 0; i < aRECol.length; ++i)
        {
          if ((aRECol[i][0] == pName) && (i != n))
          {
            for (nPos1 = 0; nPos1 < AkelPad.SendMessage(lpCol[IDLIST][WND], 0x018B /*LB_GETCOUNT*/, 0, 0); ++nPos1)
            {
              if (AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0199 /*LB_GETITEMDATA*/, nPos1, 0) == i)
                break;
            }
            SetSelRE(nPos1);
            AkelPad.MessageBox(hWnd, pTxtNameExist + pName, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
            SetSelRE(nPos);
            bNameExist = 1;
            break;
          }
        }

        if (! bNameExist)
        {
          aRECol[n][0] = pName;
          AkelPad.MemCopy(lpBuffer, pName, _TSTR);
          AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0182 /*LB_DELETESTRING*/, nPos, lpBuffer);
          nPos = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0180 /*LB_ADDSTRING*/, 0, lpBuffer);
          AkelPad.SendMessage(lpCol[IDLIST][WND], 0x019A /*LB_SETITEMDATA*/, nPos, n);
          SetSelRE(nPos);
        }
      }
    }
  }
}

function DeleteRE()
{
  var nPos = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0188 /*LB_GETCURSEL*/, 0, 0);
  var i;

  if (nPos >= 0)
  {
    i = AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0199 /*LB_GETITEMDATA*/, nPos, 0);
    aRECol[i] = ["", ""];

    if (nPos == AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0182 /*LB_DELETESTRING*/, nPos, 0))
      --nPos;

    SetSelRE(nPos);
    CheckButtonsCollection();
  }
}

function FindRE(nChar)
{
  var pChar = String.fromCharCode(nChar).toUpperCase();
  var nPos;

  for (nPos = 0; nPos < AkelPad.SendMessage(lpCol[IDLIST][WND], 0x018B /*LB_GETCOUNT*/, 0, 0); ++nPos)
  {
    AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0189 /*LB_GETTEXT*/, nPos, lpBuffer);
    pName = AkelPad.MemRead(lpBuffer, _TSTR);
    if (pChar == pName.charAt(0).toUpperCase())
    {
      AkelPad.SendMessage(lpCol[IDLIST][WND], 0x0186 /*LB_SETCURSEL*/, nPos, 0);
      SetSelRE(nPos);
      break;
    }
  }
}

function ReadIni()
{
  var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
  var pIniName = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var pLngName = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_" + AkelPad.GetLangId(0 /*LANGID_FULL*/).toString() + ".lng";
  var oError;

  if (oFSO.FileExists(pLngName))
  {
    try
    {
      eval(AkelPad.ReadFile(pLngName));
    }
    catch (oError)
    {
    }
  }
  else
  {
    pTxtCaption   = "Regular Expressions Tester for JavaScript";
    pTxtRegExp    = "Regular Expression (RE)";
    pTxtSource    = "RE.source";
    pTxtEscape    = "&Escape";
    pTxtUnEscape  = "&UnEscape";
    pTxtRE        = "RE";
    pTxtIgCase    = "&ignoreCase";
    pTxtGlobal    = "&global";
    pTxtMultiL    = "&multiline";
    pTxtNewLine   = "New line:";
    pTxtCollect   = "&Collection";
    pTxtNLWin     = "Win (\\r\\n)";
    pTxtNLUnix    = "Unix (\\n)";
    pTxtNLMac     = "Mac (\\r)";
    pTxtString    = "String to test (Str)";
    pTxtAction    = "Action";
    pTxtMeTest    = "RE.test(Str)";
    pTxtMeExec    = "RE.exec(Str)";
    pTxtMeSearch  = "Str.search(RE)";
    pTxtMeMatch   = "Str.match(RE)";
    pTxtMeSplit   = "Str.split(RE)";
    pTxtMeReplace = "Str.replace(RE,With):";
    pTxtResult    = "Result";
    pTxtLastInd   = "RE.lastIndex=";
    pTxtResetInd  = "&Reset lastIndex";
    pTxtArray     = "Array";
    pTxtEmpArray  = "empty Array";
    pTxtGlobPro   = "Global RegExp object properties";
    pTxtTest      = "Test";
    pTxtHelp      = "Help";
    pTxtOpaqMinus = "Opaque-";
    pTxtOpaqPlus  = "Opaque+";
    pTxtClose     = "Close";
    pTxtCopyPaste = "Copy/Paste";
    pTxtCopy      = "Copy";
    pTxtCopyCB    = "Copy to clipboard";
    pTxtCopyAP    = "Copy to AkelPad";
    pTxtPasteCB   = "Paste from clipboard";
    pTxtPasteAP   = "Paste from AkelPad";
    pTxtNoRE      = "There is no Regular Expression."
    pTxtNoStr     = "There is no string to test.";
    pTxtRECollect = "Collection of Regular Expressions";
    pTxtName      = "Name";
    pTxtValue     = "Value";
    pTxtAdd       = "Add (Ins)";
    pTxtRename    = "Rename (F2)";
    pTxtDelete    = "Delete (Del)";
    pTxtOK        = "OK (Enter)";
    pTxtAddRE     = "Add Regular Expression";
    pTxtRenRE     = "Rename Regular Expression";
    pTxtNewName   = "New name";
    pTxtREExist   = "This Regular Expression already exists under name: ";
    pTxtNameExist = "This name already exists: ";
    pTxtREHelp    = "Help for Regular Expressions";
    pTxtHelpText  = "   Modifiers\r\nModifiers are used to perform case-insensitive and global searches:\r\nModifier   Description\r\ni   Perform case-insensitive matching\r\ng   Perform a global match (find all matches rather than stopping after the\r\n   first match)\r\nm   Perform multiline matching\r\n\r\n   Brackets\r\nBrackets are used to find a range of characters:\r\nExpression   Description\r\n[abc]      Find any character between the brackets\r\n[^abc]      Find any character not between the brackets\r\n[0-9]      Find any digit from 0 to 9\r\n[A-Z]      Find any character from uppercase A to uppercase Z\r\n[a-z]      Find any character from lowercase a to lowercase z\r\n[A-z]      Find any character from uppercase A to lowercase z\r\n[adgk]      Find any character in the given set\r\n[^adgk]      Find any character outside the given set\r\n(red|blue|green)   Find any of the alternatives specified\r\n\r\n   Metacharacters\r\nMetacharacters are characters with a special meaning:\r\nMetachar   Description\r\n.   Find a single character, except newline or line terminator\r\n\\w   Find a word character\r\n\\W   Find a non-word character\r\n\\d   Find a digit\r\n\\D   Find a non-digit character\r\n\\s   Find a whitespace character\r\n\\S   Find a non-whitespace character\r\n\\b   Find a match at the beginning/end of a word\r\n\\B   Find a match not at the beginning/end of a word\r\n\\0   Find a NUL character\r\n\\n   Find a new line character\r\n\\f   Find a form feed character\r\n\\r   Find a carriage return character\r\n\\t   Find a tab character\r\n\\v   Find a vertical tab character\r\n\\xxx   Find the character specified by an octal number xxx\r\n\\xdd   Find the character specified by a hexadecimal number dd\r\n\\uxxxx   Find the Unicode character specified by a hexadecimal number xxxx\r\n\r\n   Quantifiers\r\nQuantifier   Description\r\nn+   Matches any string that contains at least one n\r\nn*   Matches any string that contains zero or more occurrences of n\r\nn?   Matches any string that contains zero or one occurrences of n\r\nn{X}   Matches any string that contains a sequence of X n's\r\nn{X,Y}   Matches any string that contains a sequence of X or Y n's\r\nn{X,}   Matches any string that contains a sequence of at least X n's\r\nn$   Matches any string with n at the end of it\r\n^n   Matches any string with n at the beginning of it\r\n?=n   Matches any string that is followed by a specific string n\r\n?!n   Matches any string that is not followed by a specific string n\r\n\r\n   RegExp Object Properties\r\nProperty      Description\r\nglobal      Specifies if the \"g\" modifier is set\r\nignoreCase   Specifies if the \"i\" modifier is set\r\nlastIndex      The index at which to start the next match\r\nmultiline      Specifies if the \"m\" modifier is set\r\nsource      The text of the RegExp pattern\r\n\r\n   RegExp Object Methods\r\nMethod   Description\r\ncompile()   Compiles a regular expression\r\nexec()   Tests for a match in a string. Returns the first match\r\ntest()   Tests for a match in a string. Returns true or false\r\n\r\n            _____________________________\r\n            Source: http://www.w3schools.com";
  }

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

function WriteIni()
{
  var oFSO = new ActiveXObject("Scripting.FileSystemObject");
  var rcWnd;
  var oFile;
  var pTxtIni;
  var i;

  rcWnd = GetWindowPos(hWndDlg);

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDRE][WND], lpBuffer, nBufSize);
  pREStr = AkelPad.MemRead(lpBuffer, _TSTR).replace(/[\\"]/g, "\\$&");
  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDSTRING][WND], lpBuffer, nBufSize);
  pString = AkelPad.MemRead(lpBuffer, _TSTR).replace(/[\\"]/g, "\\$&").replace(/\r/g, "\\r").replace(/\n/g, "\\n");
  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDEDWITH][WND], lpBuffer, nBufSize);
  pWith = AkelPad.MemRead(lpBuffer, _TSTR).replace(/[\\"]/g, "\\$&");

  pTxtIni = 'nWndPosX=' + rcWnd.left + ';\r\n'  +
            'nWndPosY=' + rcWnd.top  + ';\r\n'  +
            'nOpaque='  + nOpaque    + ';\r\n'  +
            'nNL='      + nNL        + ';\r\n'  +
            'nAction='  + nAction    + ';\r\n'  +
            'pREStr="'  + pREStr     + '";\r\n' +
            'pString="' + pString    + '";\r\n' +
            'pWith="'   + pWith      + '";\r\n';

  pTxtIni += 'aRECol=[\r\n';
  for (i = 0; i < aRECol.length; ++i)
  {
    pTxtIni += '["' +
                aRECol[i][0].replace(/[\\"]/g, "\\$&") + '","' +
                aRECol[i][1].replace(/[\\"]/g, "\\$&") + '"]' +
                ((i < aRECol.length - 1) ? ',' : '') + '\r\n';
  }
  pTxtIni += '];';

  oFile = oFSO.OpenTextFile(WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini", 2, true, -1);
  oFile.Write(pTxtIni);
  oFile.Close();
}


Interface language files:
RegExpTestJS_1033.lng

Code:
/********************************
RegExpTestJS.js - ver. 2012-09-15
Interface language
Language:      English (1033)
Translated by: KDJ
*********************************/
pTxtCaption   = "Regular Expressions Tester for JavaScript";
pTxtRegExp    = "Regular Expression (RE)";
pTxtSource    = "RE.source";
pTxtEscape    = "&Escape";
pTxtUnEscape  = "&UnEscape";
pTxtRE        = "RE";
pTxtIgCase    = "&ignoreCase";
pTxtGlobal    = "&global";
pTxtMultiL    = "&multiline";
pTxtNewLine   = "New line:";
pTxtCollect   = "&Collection";
pTxtNLWin     = "Win (\\r\\n)";
pTxtNLUnix    = "Unix (\\n)";
pTxtNLMac     = "Mac (\\r)";
pTxtString    = "String to test (Str)";
pTxtAction    = "Action";
pTxtMeTest    = "RE.test(Str)";
pTxtMeExec    = "RE.exec(Str)";
pTxtMeSearch  = "Str.search(RE)";
pTxtMeMatch   = "Str.match(RE)";
pTxtMeSplit   = "Str.split(RE)";
pTxtMeReplace = "Str.replace(RE,With):";
pTxtResult    = "Result";
pTxtLastInd   = "RE.lastIndex=";
pTxtResetInd  = "&Reset lastIndex";
pTxtArray     = "Array";
pTxtEmpArray  = "empty Array";
pTxtGlobPro   = "Global RegExp object properties";
pTxtTest      = "Test";
pTxtHelp      = "Help";
pTxtOpaqMinus = "Opaque-";
pTxtOpaqPlus  = "Opaque+";
pTxtClose     = "Close";
pTxtCopyPaste = "Copy/Paste";
pTxtCopy      = "Copy";
pTxtCopyCB    = "Copy to clipboard";
pTxtCopyAP    = "Copy to AkelPad";
pTxtPasteCB   = "Paste from clipboard";
pTxtPasteAP   = "Paste from AkelPad";
pTxtNoRE      = "There is no Regular Expression."
pTxtNoStr     = "There is no string to test.";
pTxtRECollect = "Collection of Regular Expressions";
pTxtName      = "Name";
pTxtValue     = "Value";
pTxtAdd       = "Add (Ins)";
pTxtRename    = "Rename (F2)";
pTxtDelete    = "Delete (Del)";
pTxtOK        = "OK (Enter)";
pTxtAddRE     = "Add Regular Expression";
pTxtRenRE     = "Rename Regular Expression";
pTxtNewName   = "New name";
pTxtREExist   = "This Regular Expression already exists under name: ";
pTxtNameExist = "This name already exists: ";
pTxtREHelp    = "Help for Regular Expressions";
pTxtHelpText  = "   Modifiers\r\nModifiers are used to perform case-insensitive and global searches:\r\nModifier   Description\r\ni   Perform case-insensitive matching\r\ng   Perform a global match (find all matches rather than stopping after the\r\n   first match)\r\nm   Perform multiline matching\r\n\r\n   Brackets\r\nBrackets are used to find a range of characters:\r\nExpression   Description\r\n[abc]      Find any character between the brackets\r\n[^abc]      Find any character not between the brackets\r\n[0-9]      Find any digit from 0 to 9\r\n[A-Z]      Find any character from uppercase A to uppercase Z\r\n[a-z]      Find any character from lowercase a to lowercase z\r\n[A-z]      Find any character from uppercase A to lowercase z\r\n[adgk]      Find any character in the given set\r\n[^adgk]      Find any character outside the given set\r\n(red|blue|green)   Find any of the alternatives specified\r\n\r\n   Metacharacters\r\nMetacharacters are characters with a special meaning:\r\nMetachar   Description\r\n.   Find a single character, except newline or line terminator\r\n\\w   Find a word character\r\n\\W   Find a non-word character\r\n\\d   Find a digit\r\n\\D   Find a non-digit character\r\n\\s   Find a whitespace character\r\n\\S   Find a non-whitespace character\r\n\\b   Find a match at the beginning/end of a word\r\n\\B   Find a match not at the beginning/end of a word\r\n\\0   Find a NUL character\r\n\\n   Find a new line character\r\n\\f   Find a form feed character\r\n\\r   Find a carriage return character\r\n\\t   Find a tab character\r\n\\v   Find a vertical tab character\r\n\\xxx   Find the character specified by an octal number xxx\r\n\\xdd   Find the character specified by a hexadecimal number dd\r\n\\uxxxx   Find the Unicode character specified by a hexadecimal number xxxx\r\n\r\n   Quantifiers\r\nQuantifier   Description\r\nn+   Matches any string that contains at least one n\r\nn*   Matches any string that contains zero or more occurrences of n\r\nn?   Matches any string that contains zero or one occurrences of n\r\nn{X}   Matches any string that contains a sequence of X n's\r\nn{X,Y}   Matches any string that contains a sequence of X or Y n's\r\nn{X,}   Matches any string that contains a sequence of at least X n's\r\nn$   Matches any string with n at the end of it\r\n^n   Matches any string with n at the beginning of it\r\n?=n   Matches any string that is followed by a specific string n\r\n?!n   Matches any string that is not followed by a specific string n\r\n\r\n   RegExp Object Properties\r\nProperty      Description\r\nglobal      Specifies if the \"g\" modifier is set\r\nignoreCase   Specifies if the \"i\" modifier is set\r\nlastIndex      The index at which to start the next match\r\nmultiline      Specifies if the \"m\" modifier is set\r\nsource      The text of the RegExp pattern\r\n\r\n   RegExp Object Methods\r\nMethod   Description\r\ncompile()   Compiles a regular expression\r\nexec()   Tests for a match in a string. Returns the first match\r\ntest()   Tests for a match in a string. Returns true or false\r\n\r\n            _____________________________\r\n            Source: http://www.w3schools.com";
- English template for translation
RegExpTestJS_1045.lng

Code:
/********************************
RegExpTestJS.js - ver. 2012-09-15
Interface language
Language:      Polish (1045)
Translated by: KDJ
*********************************/
pTxtCaption   = "Tester wyrażeń regularnych dla JavaScript";
pTxtRegExp    = "Wyrażenie regularne (RE)";
pTxtSource    = "RE.source";
pTxtEscape    = "&Escape";
pTxtUnEscape  = "&UnEscape";
pTxtRE        = "RE";
pTxtIgCase    = "&ignoreCase";
pTxtGlobal    = "&global";
pTxtMultiL    = "&multiline";
pTxtNewLine   = "Nowy wiersz:";
pTxtCollect   = "&Kolekcja";
pTxtNLWin     = "Win (\\r\\n)";
pTxtNLUnix    = "Unix (\\n)";
pTxtNLMac     = "Mac (\\r)";
pTxtString    = "Tekst do testowania (Str)";
pTxtAction    = "Wykonaj";
pTxtMeTest    = "RE.test(Str)";
pTxtMeExec    = "RE.exec(Str)";
pTxtMeSearch  = "Str.search(RE)";
pTxtMeMatch   = "Str.match(RE)";
pTxtMeSplit   = "Str.split(RE)";
pTxtMeReplace = "Str.replace(RE,With):";
pTxtResult    = "Wynik";
pTxtLastInd   = "RE.lastIndex=";
pTxtResetInd  = "&Resetuj lastIndex";
pTxtArray     = "Array";
pTxtEmpArray  = "empty Array";
pTxtGlobPro   = "Właściowości globalnego objektu RegExp";
pTxtTest      = "Testuj";
pTxtHelp      = "Pomoc";
pTxtOpaqMinus = "Przezroczystość+";
pTxtOpaqPlus  = "Przezroczystość-";
pTxtClose     = "Zamknij";
pTxtCopyPaste = "Kopiuj/Wklej";
pTxtCopy      = "Kopiuj";
pTxtCopyCB    = "Kopiuj do schowka";
pTxtCopyAP    = "Wstaw do AkelPad'a";
pTxtPasteCB   = "Wklej ze schowka";
pTxtPasteAP   = "Wklej z AkelPad'a";
pTxtNoRE      = "Brak wyrażenia regularnego."
pTxtNoStr     = "Brak tekstu do testowania.";
pTxtRECollect = "Kolekcja wyrażeń regularnych";
pTxtName      = "Nazwa";
pTxtValue     = "Wartość";
pTxtAdd       = "Dodaj (Ins)";
pTxtRename    = "Zmień nazwę (F2)";
pTxtDelete    = "Usuń (Del)";
pTxtOK        = "OK (Enter)";
pTxtAddRE     = "Dodawanie wyrażenia regularnego";
pTxtRenRE     = "Zmiana nazwy wyrażenia regularnego";
pTxtNewName   = "Nowa nazwa";
pTxtREExist   = "To wyrażenie regularne już istnieje pod nazwą: ";
pTxtNameExist = "Ta nazwa już istnieje: ";
pTxtREHelp    = "Pomoc dla wyrażeń regularnych";
pTxtHelpText  = "   Modifiers\r\nModifiers are used to perform case-insensitive and global searches:\r\nModifier   Description\r\ni   Perform case-insensitive matching\r\ng   Perform a global match (find all matches rather than stopping after the\r\n   first match)\r\nm   Perform multiline matching\r\n\r\n   Brackets\r\nBrackets are used to find a range of characters:\r\nExpression   Description\r\n[abc]      Find any character between the brackets\r\n[^abc]      Find any character not between the brackets\r\n[0-9]      Find any digit from 0 to 9\r\n[A-Z]      Find any character from uppercase A to uppercase Z\r\n[a-z]      Find any character from lowercase a to lowercase z\r\n[A-z]      Find any character from uppercase A to lowercase z\r\n[adgk]      Find any character in the given set\r\n[^adgk]      Find any character outside the given set\r\n(red|blue|green)   Find any of the alternatives specified\r\n\r\n   Metacharacters\r\nMetacharacters are characters with a special meaning:\r\nMetachar   Description\r\n.   Find a single character, except newline or line terminator\r\n\\w   Find a word character\r\n\\W   Find a non-word character\r\n\\d   Find a digit\r\n\\D   Find a non-digit character\r\n\\s   Find a whitespace character\r\n\\S   Find a non-whitespace character\r\n\\b   Find a match at the beginning/end of a word\r\n\\B   Find a match not at the beginning/end of a word\r\n\\0   Find a NUL character\r\n\\n   Find a new line character\r\n\\f   Find a form feed character\r\n\\r   Find a carriage return character\r\n\\t   Find a tab character\r\n\\v   Find a vertical tab character\r\n\\xxx   Find the character specified by an octal number xxx\r\n\\xdd   Find the character specified by a hexadecimal number dd\r\n\\uxxxx   Find the Unicode character specified by a hexadecimal number xxxx\r\n\r\n   Quantifiers\r\nQuantifier   Description\r\nn+   Matches any string that contains at least one n\r\nn*   Matches any string that contains zero or more occurrences of n\r\nn?   Matches any string that contains zero or one occurrences of n\r\nn{X}   Matches any string that contains a sequence of X n's\r\nn{X,Y}   Matches any string that contains a sequence of X or Y n's\r\nn{X,}   Matches any string that contains a sequence of at least X n's\r\nn$   Matches any string with n at the end of it\r\n^n   Matches any string with n at the beginning of it\r\n?=n   Matches any string that is followed by a specific string n\r\n?!n   Matches any string that is not followed by a specific string n\r\n\r\n   RegExp Object Properties\r\nProperty      Description\r\nglobal      Specifies if the \"g\" modifier is set\r\nignoreCase   Specifies if the \"i\" modifier is set\r\nlastIndex      The index at which to start the next match\r\nmultiline      Specifies if the \"m\" modifier is set\r\nsource      The text of the RegExp pattern\r\n\r\n   RegExp Object Methods\r\nMethod   Description\r\ncompile()   Compiles a regular expression\r\nexec()   Tests for a match in a string. Returns the first match\r\ntest()   Tests for a match in a string. Returns true or false\r\n\r\n            _____________________________\r\n            Source: http://www.w3schools.com";
- Polish
RegExpTestJS_1049.lng

Code:
/*********************************
RegExpTestJS.js - ver. 2012-09-15
Interface language
Language:      Russian (1049)
Translated by: VladSh & F. Phoenix
*********************************/
pTxtCaption   = "Отладчик регулярных выражений JavaScript";
pTxtRegExp    = "Регулярное выражение (RE)";
pTxtSource    = "RE.source";
pTxtEscape    = "&Экранировать";
pTxtUnEscape  = "&Деэкранировать";
pTxtRE        = "RE";
pTxtIgCase    = "&ignoreCase";
pTxtGlobal    = "&global";
pTxtMultiL    = "&multiline";
pTxtNewLine   = "Переносы:";
pTxtCollect   = "&Коллекция";
pTxtNLWin     = "Win (\\r\\n)";
pTxtNLUnix    = "Unix (\\n)";
pTxtNLMac     = "Mac (\\r)";
pTxtString    = "Строка с данными для обработки (Str)";
pTxtAction    = "Операция";
pTxtMeTest    = "RE.test(Str)";
pTxtMeExec    = "RE.exec(Str)";
pTxtMeSearch  = "Str.search(RE)";
pTxtMeMatch   = "Str.match(RE)";
pTxtMeSplit   = "Str.split(RE)";
pTxtMeReplace = "Str.replace(RE,With):";
pTxtResult    = "Результат";
pTxtLastInd   = "RE.lastIndex=";
pTxtResetInd  = "Сбросить &индекс";
pTxtArray     = "Array";
pTxtEmpArray  = "(пустой массив)";
pTxtGlobPro   = "Свойства глобального объекта RegExp";
pTxtTest      = "Тест";
pTxtHelp      = "Справка";
pTxtOpaqMinus = "Прозрачность +";
pTxtOpaqPlus  = "Прозрачность -";
pTxtClose     = "Закрыть";
pTxtCopyPaste = "Обмен";
pTxtCopy      = "Обмен";
pTxtCopyCB    = "Копировать в буфер";
pTxtCopyAP    = "Копировать в AkelPad";
pTxtPasteCB   = "Вставить из буфера";
pTxtPasteAP   = "Вставить из AkelPad";
pTxtNoRE      = "Регулярное выражение отсутствует."
pTxtNoStr     = "Строка для тестирования отсутствует.";
pTxtRECollect = "Коллекция шаблонов";
pTxtName      = "Наименование";
pTxtValue     = "Значение";
pTxtAdd       = "Добавить (Ins)";
pTxtRename    = "Переим. (F2)";
pTxtDelete    = "Удалить (Del)";
pTxtOK        = "OK (Enter)";
pTxtAddRE     = "Новый шаблон";
pTxtRenRE     = "Переименование шаблона";
pTxtNewName   = "Новое имя";
pTxtREExist   = "Шаблон уже сохранен под именем ";
pTxtNameExist = "Данное наименование уже существует: ";
pTxtREHelp    = "Справка по регулярным выражениям";
pTxtHelpText  = "\tМодификаторы, использующиеся для поиска\r\ni\t\tне различать строчные и заглавные буквы\r\ng\t\tглобальный поиск (обрабатываются все совпадения\r\n\t\tс шаблоном поиска)\r\nm\t\tмногострочный поиск\r\n\r\n\tНаборы символов, использующиеся для поиска\r\nВыражение\tОписание\r\n[abc]\t\tНайти любой, указанный в скобках, символ\r\n[^abc]\t\tНайти любой символ, исключая те, что в скобках\r\n[0-9]\t\tНайти любую цифру от 0 до 9\r\n[A-Z]\t\tНайти любой символ в верхнем регистре от A до Z\r\n[a-z]\t\tНайти любой символ в нижнем регистре от a до z\r\n[A-z]\t\tНайти любой символ от A в верхнем регистре до z\r\n\t\tв нижнем регистре\r\n[adgk]\t\tНайти любой символ из заданного набора\r\n[^adgk]\t\tНайти любой символ кроме данного набора\r\n(red|blue|green)\tНайти любое из перечисленных вхождений\r\n\r\n\tСпециальные метасимволы\r\n.\t\tНайдёт любой символ, кроме переводов строк: \\n, \\r,\r\n\t\t\\u2028 или \\u2029 (можно использовать [\\s\\S] для\r\n\t\tпоиска любого символа, включая переводы строк)\r\n\\w\t\tНайдёт любой символ латинского алфавита, включая\r\n\t\tбуквы, цифры и знак подчеркивания\r\n\\W\t\tНайдет любой не-(лат.)словесный символ\r\n\\d\t\tНайдёт цифру из любого алфавита (у нас же юникод);\r\n\t\tиспльзуйте [0-9], чтобы найти только обычные цифры\r\n\\D\t\tНайдет нецифровой символ (все алфавиты)\r\n\\s\t\tНайдет любой пробельный символ, включая пробел,\r\n\t\tтабуляцию, переводы строки и другие юникодные\r\n\t\tпробельные символы\r\n\\S\t\tНайдет любой символ, кроме пробельного\r\n\\b\t\tНаходит границу слов латинских алфавитов, например\r\n\t\tпробел; не путать с [\\b]!\r\n\\B\t\tНаходит совпадения не по границам слов\r\n\\0\t\tНайдет символ NUL; не добавляйте в конец другие\r\n\t\tцифры\r\n\\n\t\tНаходит символ новой строки\r\n\\f\t\tНаходит символ прогона (form-feed)\r\n\\r\t\tНаходит символ возврата каретки\r\n\\t\t\tНаходит символ обычной табуляции\r\n\\v\t\tНаходит символ вертикальной табуляции\r\n\\hhh\t\tНаходит символ, заданный восьмеричным числом hhh\r\n\\xhh\t\tНаходит символ, заданный шестнадцатиричным\r\n\t\tчислом, с кодом hh (2 шестнадцатиричных цифры)\r\n\\uhhhh\t\tНаходит юникодный символ, заданный\r\n\t\tшестнадцатиричным числом, с кодом hhhh\r\n\t\t(4 шестнадцатиричных цифры)\r\n\r\n\tКвантификаторы\r\n^\t\tОбозначает начало входных данных; если установлен\r\n\t\tфлаг многострочного поиска \"m\", то также сработает\r\n\t\tпри начале новой строки\r\n$\t\tОбозначает конец входных данных; если установлен\r\n\t\tфлаг многострочного поиска, то также сработает\r\n\t\tв конце строки\r\nx(?=y)\t\tНаходит x, только если за x следует y\r\nx(?!y)\t\tНаходит x, только если за x не следует y\r\n+\t\tОбозначает повторение предшествующего элемента\r\n\t\t1 или более раз, эквивалентно {1,}\r\n*\t\tОбозначает повторение предшествующего элемента\r\n\t\t0 или более раз\r\n?\t\tОбозначает, что предшествующий элемент может\r\n\t\tкак присутствовать, так и отсутствовать\r\n{n}\t\tНаходит ровно n повторений предшествующего\r\n\t\tэлемента\r\n{n,}\t\tНаходит n и более повторений предшествующего\r\n\t\tэлемента\r\n{n,m}\t\tНаходит от n до m повторений предшествующего\r\n\t\tэлемента\r\n\r\n\tСвойства объекта RegExp\r\nglobal\t\tПоказывает, был ли включен флаг поиска всех\r\n\t\tсовпадений \"g\"\r\nignoreCase\tПоказывает, был ли включен флаг\r\n\t\tрегистронезависимого поиска \"i\"\r\nmultiline\t\tПоказывает, был ли включен флаг многострочного\r\n\t\tпоиска \"m\"\r\nlastIndex\t\tИндекс, с которого начинать следующий поиск\r\nsource\t\tТекст RegExp-паттерна\r\n\r\n\tМетоды объекта RegExp\r\ncompile()\t\tКомпилирует регулярное выражение\r\nexec()\t\tПри совпадении возвращает массив и обновляет\r\n\t\tсвойства объекта RegExp, если совпадений нет,\r\n\t\tвозвращает null\r\ntest()\t\tИспользуется, чтобы выяснить, есть ли совпадения\r\n\t\tрегулярного выражения со строкой (аналогично\r\n\t\tString#search), возвращает true или false; чтобы\r\n\t\tполучить сами совпадения, используйте exec или\r\n\t\tString#match\r\ntoString()\t\tВыводит строковое представление объекта RegExp,\r\n\t\tт.е. \"/паттерн/\"\r\n\t________________________________________________\r\n\tИсточники: http://www.w3schools.com,  http://javascript.ru";
- Russian by VladSh & F. Phoenix
RegExpTestJS_2052.lng

Code:
/********************************
RegExpTestJS.js - ver. 2012-09-15
Interface language
Language:      ChineseSimplified (2052)
Translated by: cnnnc
*********************************/
pTxtCaption   = "JavaScript 正则表达式测试工具";
pTxtRegExp    = "正则表达式 (RE)";
pTxtSource    = "RE.source";
pTxtEscape    = "转义(&E)";
pTxtUnEscape  = "反转义(&U)";
pTxtRE        = "RE";
pTxtIgCase    = "忽略大小写(&I)";
pTxtGlobal    = "全局(&G)";
pTxtMultiL    = "多行(&M)";
pTxtNewLine   = "换行符:";
pTxtCollect   = "收集(&C)";
pTxtNLWin     = "Win (\\r\\n)";
pTxtNLUnix    = "Unix (\\n)";
pTxtNLMac     = "Mac (\\r)";
pTxtString    = "待测字串 (Str)";
pTxtAction    = "行为";
pTxtMeTest    = "RE.test(Str)";
pTxtMeExec    = "RE.exec(Str)";
pTxtMeSearch  = "Str.search(RE)";
pTxtMeMatch   = "Str.match(RE)";
pTxtMeSplit   = "Str.split(RE)";
pTxtMeReplace = "Str.replace(RE,With):";
pTxtResult    = "结果";
pTxtLastInd   = "RE.lastIndex=";
pTxtResetInd  = "重置 lastIndex(&R)";
pTxtArray     = "数组";
pTxtEmpArray  = "空数组";
pTxtGlobPro   = "全局 RegExp 对象属性";
pTxtTest      = "测试";
pTxtHelp      = "帮助";
pTxtOpaqMinus = "透明 +";
pTxtOpaqPlus  = "透明 -";
pTxtClose     = "关闭";
pTxtCopyPaste = "复制/粘贴";
pTxtCopy      = "复制";
pTxtCopyCB    = "复制到剪贴板";
pTxtCopyAP    = "复制到 AkelPad";
pTxtPasteCB   = "从剪贴板粘贴";
pTxtPasteAP   = "从 AkelPad 粘贴";
pTxtNoRE      = "无正则表达式。"
pTxtNoStr     = "无待测字串。";
pTxtRECollect = "RegExp 收集";
pTxtName      = "名称";
pTxtValue     = "值";
pTxtAdd       = "添加 (Ins)";
pTxtRename    = "重命名 (F2)";
pTxtDelete    = "删除 (Del)";
pTxtOK        = "确定 (Enter)";
pTxtAddRE     = "添加 RegExp";
pTxtRenRE     = "重命名 RegExp";
pTxtNewName   = "新名称";
pTxtREExist   = "本 RegExp 已经存在于名下: ";
pTxtNameExist = "此名称已存在: ";
pTxtREHelp    = "RegExp 帮助";
pTxtHelpText  = "   修饰符\r\n============\r\n修饰符用于执行不区分大小写和全局的搜索:\r\n------------\r\n修饰符   说明\r\n------------\r\ni   执行不区分大小写匹配\r\ng   执行全局匹配 (查找所有匹配,而不是在第一个匹配之后停止)\r\nm   执行多行匹配\r\n\r\n   括号\r\n============\r\n括号用于查找一定范围的字符:\r\n------------\r\n表达式      说明\r\n------------\r\n[abc]      查找括号内的任一字符\r\n[^abc]      查找非括号内的任一字符\r\n[0-9]      查找任一从 0 到 9 的数字\r\n[A-Z]      查找任一大写字母 A 到 大写字母 Z\r\n[a-z]      查找任一小写字母 a 到 小写字母 z\r\n[A-z]      查找任一大写字母 A 到 小写字母 z\r\n[adgk]      查找已给集合中的任一字符\r\n[^adgk]      查找除已给集合外的任一字符\r\n(red|blue|green)   查找任何指定的选择\r\n\r\n   元字符\r\n============\r\n元字符是一种指定含义的字符:\r\n------------\r\n元字符   说明\r\n------------\r\n.   查找任一字符,换行符、行终止符除外\r\n\\w   查找单词字符\r\n\\W   查找非单词字符\r\n\\d   查找数字\r\n\\D   查找非数字字符\r\n\\s   查找空白字符\r\n\\S   查找非空白字符\r\n\\b   查找匹配在单词的开始/结束\r\n\\B   查找匹配不在单词的开始/结束\r\n\\0   查找 NUL 字符\r\n\\n   查找换行符\r\n\\f   查找换页符\r\n\\r   查找回车符\r\n\\t   查找制表符\r\n\\v   查找垂直制表符\r\n\\xxx   查找由一个八进制数字 xxx 指定的字符\r\n\\xdd   查找由一个16进制数字 dd 指定的字符\r\n\\uxxxx   查找由一个16进制数字 xxxx 指定的 Unicode 字符\r\n\r\n   数量符\r\n============\r\n数量符   说明\r\n------------\r\nn+   匹配大于等于一个 n\r\nn*   匹配大于等于零个 n\r\nn?   匹配小于等于一个 n\r\nn{X}   匹配 X 个 n\r\nn{X,Y}   匹配 在 X 和 Y 之间个 n\r\nn{X,}   匹配大于等于 X 个 n\r\nn$   匹配任何以 n 结束的字串\r\n^n   匹配任何以 n 开始的字串\r\n?=n   在任何匹配 n 的字符串开始处匹配查找字符串。\r\n?!n   在任何不匹配 n 的字符串开始处匹配查找字符串。\r\n\r\n   RegExp 对象属性\r\n============\r\n属性      说明\r\n------------\r\nglobal      如果修饰符 \"g\" 使用时指定\r\nignoreCase   如果修饰符 \"i\" 使用时指定\r\nlastIndex   该索引便于开始下一个匹配\r\nmultiline   如果修饰符 \"m\" 使用时指定\r\nsource      RegExp 模式的文字\r\n\r\n   RegExp 对象方法\r\n============\r\n方法      说明\r\n------------\r\ncompile()   编译正则表达式\r\nexec()      测试在字串中的匹配。返回第一个匹配\r\ntest()      测试在字串中的匹配。返回 true 或 false\r\n\r\n            _____________________________\r\n            来自: http://www.w3schools.com";
- Chinese-Simplified by cnnnc


Last edited by KDJ on Fri Mar 01, 2013 11:47 pm; edited 11 times in total
Back to top
View user's profile Send private message
se7h



Joined: 28 Sep 2009
Posts: 767
Location: Minsk, Belarus

PostPosted: Mon Feb 21, 2011 7:49 pm    Post subject: Reply with quote

insertPathToFile.js
Code:
/// insertPathToFile v0.1.1
// (c) se7h
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11477#11477
//
// Insert relative/absolute path to selected file
//
// Usage in Toolbar/ContextMenu plugin:
// -"Insert relative path..." Call("Scripts::Main", 1, "insertRelativePath.js", `"%d"`) Icon(pathToAnyIcon)
// -"Insert absolute path..." Call("Scripts::Main", 1, "insertRelativePath.js") Icon(pathToAnyIcon)
//
// CommonFunctions.js you found here http://akelpad.sourceforge.net/forum/viewtopic.php?p=1582#1582

//Options
var pFilter = "Text files (*.txt)\x00*.txt\x00All Files (*.*)\x00*.*\x00\x00";
var nFilterIndex = 2;
var dirSysSeparator = "\\";

//Variables
var hMainWnd = AkelPad.GetMainWnd();
var pInitialFile = AkelPad.GetEditFile(0);
var pSelFilePath;
var DirPath = "";

if(WScript.Arguments.length) {
    DirPath = WScript.Arguments(0);
}

if(hMainWnd) {
  if (! AkelPad.Include("CommonFunctions.js"))
     pSelFilePath = FileDialog(true, hMainWnd, pInitialFile, pFilter, nFilterIndex);
  else
     pSelFilePath = FileDialogDefault(true, pInitialFile, "*");

    if(pSelFilePath) {
        if(!DirPath) {
            AkelPad.ReplaceSel(pSelFilePath);
        } else {
            AkelPad.ReplaceSel(GetRelativePath(DirPath, pSelFilePath));
        }
    }
}

function GetRelativePath(mainDirPath, absoluteFilePath) {
    var firstPathParts = new Array();
    var secondPathParts = new Array();
    firstPathParts = mainDirPath.split(dirSysSeparator);
    secondPathParts = absoluteFilePath.split(dirSysSeparator);
    var sameCounter = 0;

    for(var i = 0; i < Math.min(firstPathParts.length, secondPathParts.length); i++) {
        if(!(firstPathParts[i].toLowerCase() == secondPathParts[i].toLowerCase())) {
            break;
        }

        sameCounter++;
    }

    if(sameCounter == 0) {
        return absoluteFilePath;
    }

    var newPath = "";

    for(var i = sameCounter; i < firstPathParts.length; i++) {
        if(i > sameCounter) {
            newPath += dirSysSeparator;
        }

        newPath += "..";
    }

    if(newPath.length == 0) {
        newPath = ".";
    }

    for(var i = sameCounter; i < secondPathParts.length; i++) {
        newPath += dirSysSeparator;
        newPath += secondPathParts[i];
    }

    return newPath;
}

//Instructor function
function FileDialog(bOpenTrueSaveFalse, hWnd, pInitialFile, pFilter, nFilterIndex) {
    var nFlags = 0x880804; //OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_EXPLORER|OFN_ENABLESIZING
    var pDefaultExt = "txt";
    var lpStructure;
    var lpFilterBuffer;
    var lpFileBuffer;
    var lpExtBuffer;
    var oSys;
    var pResultFile = "";
    var nCallResult;

    if(lpFilterBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
        AkelPad.MemCopy(lpFilterBuffer, pFilter.substr(0, 255), _TSTR);

        if(lpFileBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
            AkelPad.MemCopy(lpFileBuffer, pInitialFile.substr(0, 255), _TSTR);

            if(lpExtBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
                AkelPad.MemCopy(lpExtBuffer, pDefaultExt.substr(0, 255), _TSTR);

                if(lpStructure = AkelPad.MemAlloc(_X64 ? 136 : 76)) { //sizeof(OPENFILENAMEA) or sizeof(OPENFILENAMEW)
                    //Fill structure
                    AkelPad.MemCopy(lpStructure, _X64 ? 136 : 76, 3 /*DT_DWORD*/);             //lStructSize
                    AkelPad.MemCopy(lpStructure + (_X64 ? 8 : 4), hWnd, 2 /*DT_QWORD*/);         //hwndOwner
                    AkelPad.MemCopy(lpStructure + (_X64 ? 24 : 12), lpFilterBuffer, 2 /*DT_QWORD*/); //lpstrFilter
                    AkelPad.MemCopy(lpStructure + (_X64 ? 44 : 24), nFilterIndex, 3 /*DT_DWORD*/); //nFilterIndex
                    AkelPad.MemCopy(lpStructure + (_X64 ? 48 : 28), lpFileBuffer, 2 /*DT_QWORD*/); //lpstrFile
                    AkelPad.MemCopy(lpStructure + (_X64 ? 56 : 32), 256, 3 /*DT_DWORD*/);         //nMaxFile
                    AkelPad.MemCopy(lpStructure + (_X64 ? 96 : 52), nFlags, 3 /*DT_DWORD*/);      //Flags
                    AkelPad.MemCopy(lpStructure + (_X64 ? 104 : 60), lpExtBuffer, 2 /*DT_QWORD*/); //lpstrDefExt

                    if(oSys = AkelPad.SystemFunction()) {
                        //Call dialog
                        if(bOpenTrueSaveFalse == true) {
                            nCallResult = oSys.Call("comdlg32::GetOpenFileName" + _TCHAR, lpStructure);
                        } else {
                            nCallResult = oSys.Call("comdlg32::GetSaveFileName" + _TCHAR, lpStructure);
                        }

                        //Result file
                        if(nCallResult) {
                            pResultFile = AkelPad.MemRead(lpFileBuffer, _TSTR);
                        }
                    }

                    AkelPad.MemFree(lpStructure);
                }

                AkelPad.MemFree(lpExtBuffer);
            }

            AkelPad.MemFree(lpFileBuffer);
        }

        AkelPad.MemFree(lpFilterBuffer);
    }

    return pResultFile;
}


Insert relative/absolute path to selected file

History version:
0.1 - initial release
0.1.1 - extended file dialogue with files extensions list (provided by CommonFunction.js)


Last edited by se7h on Fri Sep 23, 2011 6:55 pm; edited 1 time in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1374
Location: Poland

PostPosted: Sun Feb 27, 2011 9:15 pm    Post subject: Reply with quote

Sorting strings contained between any separators.

SortWords.js

Code:
// SortWords.js - ver. 2013-09-26 (x86/x64)
//
// Usage:
// Call("Scripts::Main", 1, "SortWords.js")
//
// Shortcut keys in dialog box:
// Enter - Sort
// Esc   - Close
// Shift+Alt+Right (Left, Down, Up, End, Home, PgDn, PgUp) - move dialog box.

if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0415) //Polish
{
  var sTxtCaption  = "Sortowanie słów";
  var sTxtSep      = "Separator";
  var sTxtSepWord  = "Dowolny separator słów";
  var sTxtSepNo    = "Brak separatora - sortowanie znaków";
  var sTxtSepAny   = "Dowolny z:";
  var sTxtSepStr   = "String:";
  var sTxtTab      = "\\t = Tabulacja";
  var sTxtSortMet  = "Metoda sortowania";
  var sTxtDesc     = "&Malejąco";
  var sTxtIgCase   = "&Ignoruj wlk. liter";
  var sTxtString   = "&String";
  var sTxtLocale   = "&Alfabetycznie";
  var sTxtNum      = "&Numerycznie";
  var sTxtNoSort   = "Nie sortuj, ale";
  var sTxtReverse  = "&Odwróć kolejność słów";
  var sTxtRemoDup  = "&Usuń duplikaty słów";
  var sTxtExtrDup  = "&Zachowaj tylko powielone słowa";
  var sTxtExtrUni  = "Zac&howaj tylko unikalne słowa";
  var sTxtInLine   = "&W każdym wierszu sortuj oddzielnie";
  var sTxtCopyToCB = "Wynik kopiuj do schowka, nie zmieniaj &tekstu";
  var sTxtSort     = "Sortuj";
  var sTxtUndo     = "&Cofnij";
  var sTxtRedo     = "&Powtórz";
}
else
{
  var sTxtCaption  = "Sort words";
  var sTxtSep      = "Separator";
  var sTxtSepWord  = "Any words separator";
  var sTxtSepNo    = "No separator - sorts single chars";
  var sTxtSepAny   = "Any of:";
  var sTxtSepStr   = "String:";
  var sTxtTab      = "\\t = Tabulation";
  var sTxtSortMet  = "Sort method";
  var sTxtDesc     = "&Descending";
  var sTxtIgCase   = "&Ignore case";
  var sTxtString   = "&String";
  var sTxtLocale   = "&Alphabetically";
  var sTxtNum      = "&Numerically";
  var sTxtNoSort   = "No sort, but";
  var sTxtReverse  = "Reverse &order of words";
  var sTxtRemoDup  = "Re&move duplicate words";
  var sTxtExtrDup  = "E&xtract duplicate words";
  var sTxtExtrUni  = "Extra&ct unique words";
  var sTxtInLine   = "In each &line, sort separately";
  var sTxtCopyToCB = "Resul&t copy to clipboard, do not replace text";
  var sTxtSort     = "Sort";
  var sTxtUndo     = "&Undo";
  var sTxtRedo     = "&Redo";
}

var DT_DWORD    = 3;
var BM_SETCHECK = 241;

var oSys       = AkelPad.SystemFunction();
var hMainWnd   = AkelPad.GetMainWnd();
var hEditWnd   = AkelPad.GetEditWnd();
var hGuiFont   = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var hInstDLL   = AkelPad.GetInstanceDll();
var sClassName = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var nSep       = 0;
var sSep       = ";";
var bTabSep    = 1;
var bIgCaseSep = 1;
var bDesc      = 0;
var bIgCase    = 1;
var nMethod    = 1;
var nNoSort    = 0;
var bInLine    = 1;
var bCopyToCB  = 0;
var nUndoLimit = 0;
var nRedoLimit = 0;
var lpStrA;
var lpStrB;
var hWndDlg;
var lpBuffer;
var bColSel;
var bIsReturn;
var hFocus;
var nWndPosX;
var nWndPosY;

ReadWriteIni(0);

var aWnd        = [];
var IDGROUP1    = 1000;
var IDSEPWORD   = 1001;
var IDSEPNO     = 1002;
var IDSEPANY    = 1003;
var IDSEPSTR    = 1004;
var IDGROUP2    = 1005;
var IDSEP       = 1006;
var IDTABSEP    = 1007;
var IDIGCASESEP = 1008;
var IDGROUP3    = 1009;
var IDDESC      = 1010;
var IDIGCASE    = 1011;
var IDGROUP4    = 1012;
var IDSTRING    = 1013;
var IDLOCALE    = 1014;
var IDNUM       = 1015;
var IDGROUP5    = 1016;
var IDREVERSE   = 1017;
var IDREMODUP   = 1018;
var IDEXTRDUP   = 1019;
var IDEXTRUNI   = 1020;
var IDINLINE    = 1021;
var IDCOPYTOCB  = 1022;
var IDSORT      = 1023;
var IDUNDO      = 1024;
var IDREDO      = 1025;

var CLASS   = 0;
var WND     = 1;
var EXSTYLE = 2;
var STYLE   = 3;
var X       = 4;
var Y       = 5;
var W       = 6;
var H       = 7;
var TXT     = 8;

//0x50000007 - WS_VISIBLE|WS_CHILD|BS_GROUPBOX
//0x50000009 - WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON
//0x50010000 - WS_VISIBLE|WS_CHILD|WS_TABSTOP
//0x50010001 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
//0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50010080 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL
//Windows               CLASS, WND, EXSTYLE,      STYLE,   X,   Y,   W,   H, TXT
aWnd[IDGROUP1   ] = ["BUTTON",   0,       0, 0x50000007,  10,  10, 230, 135, sTxtSep];
aWnd[IDSEPWORD  ] = ["BUTTON",   0,       0, 0x50000009,  20,  30, 200,  16, sTxtSepWord];
aWnd[IDSEPNO    ] = ["BUTTON",   0,       0, 0x50000009,  20,  50, 200,  16, sTxtSepNo];
aWnd[IDSEPANY   ] = ["BUTTON",   0,       0, 0x50000009,  30,  75,  70,  16, sTxtSepAny];
aWnd[IDSEPSTR   ] = ["BUTTON",   0,       0, 0x50000009,  30,  95,  70,  16, sTxtSepStr];
aWnd[IDGROUP2   ] = ["BUTTON",   0,       0, 0x50000007, 100,  63, 140,  82, ""];
aWnd[IDSEP      ] = ["EDIT",     0,   0x200, 0x50010080, 110,  80, 120,  20, sSep];
aWnd[IDTABSEP   ] = ["BUTTON",   0,       0, 0x50010003, 125, 105,  90,  16, sTxtTab];
aWnd[IDIGCASESEP] = ["BUTTON",   0,       0, 0x50010003, 125, 125,  90,  16, sTxtIgCase];
aWnd[IDGROUP3   ] = ["BUTTON",   0,       0, 0x50000007,  10, 155, 230,  80, sTxtSortMet];
aWnd[IDDESC     ] = ["BUTTON",   0,       0, 0x50010003,  35, 180,  90,  16, sTxtDesc];
aWnd[IDIGCASE   ] = ["BUTTON",   0,       0, 0x50010003,  35, 200,  90,  16, sTxtIgCase];
aWnd[IDGROUP4   ] = ["BUTTON",   0,       0, 0x50000007, 130, 155, 110,  80, ""];
aWnd[IDSTRING   ] = ["BUTTON",   0,       0, 0x50000009, 145, 170,  90,  16, sTxtString];
aWnd[IDLOCALE   ] = ["BUTTON",   0,       0, 0x50000009, 145, 190,  90,  16, sTxtLocale];
aWnd[IDNUM      ] = ["BUTTON",   0,       0, 0x50000009, 145, 210,  90,  16, sTxtNum];
aWnd[IDGROUP5   ] = ["BUTTON",   0,       0, 0x50000007,  10, 245, 230, 105, sTxtNoSort];
aWnd[IDREVERSE  ] = ["BUTTON",   0,       0, 0x50010003,  50, 265, 180,  16, sTxtReverse];
aWnd[IDREMODUP  ] = ["BUTTON",   0,       0, 0x50010003,  50, 285, 180,  16, sTxtRemoDup];
aWnd[IDEXTRDUP  ] = ["BUTTON",   0,       0, 0x50010003,  50, 305, 180,  16, sTxtExtrDup];
aWnd[IDEXTRUNI  ] = ["BUTTON",   0,       0, 0x50010003,  50, 325, 180,  16, sTxtExtrUni];
aWnd[IDINLINE   ] = ["BUTTON",   0,       0, 0x50010003,  10, 360, 230,  16, sTxtInLine];
aWnd[IDCOPYTOCB ] = ["BUTTON",   0,       0, 0x50010003,  10, 380, 230,  16, sTxtCopyToCB];
aWnd[IDSORT     ] = ["BUTTON",   0,       0, 0x50010001,  10, 405,  70,  23, sTxtSort];
aWnd[IDUNDO     ] = ["BUTTON",   0,       0, 0x50010000,  90, 405,  70,  23, sTxtUndo];
aWnd[IDREDO     ] = ["BUTTON",   0,       0, 0x50010000, 170, 405,  70,  23, sTxtRedo];

if (hEditWnd)
{
  if (AkelPad.GetSelStart() == AkelPad.GetSelEnd())
    AkelPad.SetSel(0, -1);

  if (AkelPad.GetSelStart() == AkelPad.GetSelEnd())
    WScript.Quit();

  if (bColSel = AkelPad.SendMessage(hEditWnd, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0))
    bInLine = 1;

  if (AkelPad.WindowRegisterClass(sClassName))
  {
    if (lpBuffer = AkelPad.MemAlloc(256 * _TSIZE))
    {
      hWndDlg = oSys.Call("User32::CreateWindowEx" + _TCHAR,
                  0,               //dwExStyle
                  sClassName,      //lpClassName
                  sTxtCaption,     //lpWindowName
                  0x90CA0000,      //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
                  0,               //x
                  0,               //y
                  255,             //nWidth
                  465,             //nHeight
                  hMainWnd,        //hWndParent
                  0,               //ID
                  hInstDLL,        //hInstance
                  DialogCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.
      if (hWndDlg)
      {
        //Disable main window, to make dialog modal
        oSys.Call("User32::EnableWindow", hMainWnd, false);

        //Message loop
        AkelPad.WindowGetMessage();
      }
      AkelPad.MemFree(lpBuffer);
    }
    AkelPad.WindowUnregisterClass(sClassName);
  }
}

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

  if (uMsg == 1) //WM_CREATE
  {
    for (i = 1000; i < aWnd.length; ++i)
    {
      aWnd[i][WND] = oSys.Call("User32::CreateWindowEx" + _TCHAR,
                       aWnd[i][EXSTYLE], //dwExStyle
                       aWnd[i][CLASS],   //lpClassName
                       0,                //lpWindowName
                       aWnd[i][STYLE],   //dwStyle
                       aWnd[i][X],       //x
                       aWnd[i][Y],       //y
                       aWnd[i][W],       //nWidth
                       aWnd[i][H],       //nHeight
                       hWnd,             //hWndParent
                       i,                //ID
                       hInstDLL,         //hInstance
                       0);               //lpParam
      SetWindowFontAndText(aWnd[i][WND], hGuiFont, aWnd[i][TXT]);
    }

    //Set limit edit text
    AkelPad.SendMessage(aWnd[IDSEP][WND], 197 /*EM_LIMITTEXT*/, 24, 0);

    CheckButtons();
    CheckUndoRedo();

    //Set window position
    if ((nWndPosX == undefined) || (nWndPosY == undefined))
      MoveWindow(hMainWnd, hWnd, "RT");
    else
      MoveWindow(hMainWnd, hWnd, [nWndPosX, nWndPosY]);
  }

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("User32::SetFocus", aWnd[IDSEPWORD + nSep][WND]);

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 27) //VK_ESCAPE
      oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    else if (wParam == 13) //VK_RETURN
    {
      if (! bIsReturn)
      {
        hFocus = oSys.Call("User32::GetFocus");
        if ((hFocus != aWnd[IDSORT][WND]) && (hFocus != aWnd[IDUNDO][WND]) && (hFocus != aWnd[IDREDO][WND]))
          oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDSORT, 0);
      }
    }
  }

  else if (uMsg == 257) //WM_KEYUP
    bIsReturn = 0;

  else if ((uMsg == 260) /*WM_SYSKEYDOWN*/ &&
           (oSys.Call("User32::GetAsyncKeyState", 0xA0 /*VK_LSHIFT*/)))
  {
    if (wParam == 0x27) //VK_RIGHT
      MoveWindow(hMainWnd, hWnd, "R");
    else if (wParam == 0x25) //VK_LEFT
      MoveWindow(hMainWnd, hWnd, "L");
    else if (wParam == 0x28) //VK_DOWN
      MoveWindow(hMainWnd, hWnd, "D");
    else if (wParam == 0x26) //VK_UP
      MoveWindow(hMainWnd, hWnd, "U");
    else if (wParam == 0x23) //VK_END
      MoveWindow(hMainWnd, hWnd, "E");
    else if (wParam == 0x24) //VK_HOME
      MoveWindow(hMainWnd, hWnd, "H");
    else if (wParam == 0x22) //VK_NEXT
      MoveWindow(hMainWnd, hWnd, "B");
    else if (wParam == 0x21) //VK_PRIOR
      MoveWindow(hMainWnd, hWnd, "T");
  }

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

    if ((nLowParam >= IDSEPWORD) && (nLowParam <= IDCOPYTOCB) && (nLowParam != IDSEP))
      CheckButtons(nLowParam);
    else if (nLowParam == IDSORT)
    {
      if (SortWords())
        CheckUndoRedo(nLowParam);
    }
    else if (nLowParam == IDUNDO)
    {
      bIsReturn = 1;
      CheckUndoRedo(nLowParam);
    }
    else if (nLowParam == IDREDO)
    {
      bIsReturn = 1;
      CheckUndoRedo(nLowParam);
    }
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    ReadWriteIni(1);

    //Enable main window
    oSys.Call("User32::EnableWindow", hMainWnd, true);
    //Destroy dialog
    oSys.Call("User32::DestroyWindow", hWnd);
  }

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

  else
    SetDefID(hWnd);

  return 0;
}

function SetWindowFontAndText(hWnd, hFont, sText)
{
  AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
  oSys.Call("User32::SetWindowText" + _TCHAR, hWnd, sText);
}

function MoveWindow(hWndParent, hWnd, vAction)
{
  var aRectParent;
  var aRect;
  var nX;
  var nY;

  if (! hWndParent)
    hWndParent=oSys.Call("User32::GetDesktopWindow");

  aRectParent = GetWindowPos(hWndParent);
  aRect       = GetWindowPos(hWnd);

  nX = aRect.left;
  nY = aRect.top;

  if (vAction == "R") //Move right
    nX = aRect.left + ((aRect.left < aRectParent.right - 50) ? 20: 0);
  else if (vAction == "L") //Move left
    nX = aRect.left - ((aRect.right > aRectParent.left + 50) ? 20: 0);
  else if (vAction == "D") //Move down
    nY = aRect.top + ((aRect.top < aRectParent.bottom - 50) ? 20: 0);
  else if (vAction == "U") //Move up
    nY = aRect.top - ((aRect.bottom > aRectParent.top + 50) ? 20: 0);
  else if (vAction == "E") //Move end (right)
    nX = aRect.left + (aRectParent.right - aRect.right);
  else if (vAction == "H") //Move home (left)
    nX = aRect.left + (aRectParent.left - aRect.left);
  else if (vAction == "B") //Move bottom
    nY = aRect.top + (aRectParent.bottom - aRect.bottom);
  else if (vAction == "T") //Move top
    nY = aRect.top + (aRectParent.top - aRect.top);
  else if (vAction == "C") //Center window
  {
    nX = aRectParent.left + ((aRectParent.right  - aRectParent.left) / 2 - (aRect.right  - aRect.left) / 2);
    nY = aRectParent.top  + ((aRectParent.bottom - aRectParent.top)  / 2 - (aRect.bottom - aRect.top)  / 2);
  }
  else if (vAction == "LT") //Move left top
  {
    nX = aRectParent.left;
    nY = aRectParent.top;
  }
  else if (vAction == "RT") //Move right top
  {
    nX = aRect.left + (aRectParent.right - aRect.right);
    nY = aRectParent.top;
  }
  else if (vAction == "LB") //Move left bottom
  {
    nX = aRectParent.left;
    nY = aRect.top + (aRectParent.bottom - aRect.bottom);
  }
  else if (vAction == "RB") //Move right bottom
  {
    nX = aRect.left + (aRectParent.right - aRect.right);
    nY = aRect.top + (aRectParent.bottom - aRect.bottom);
  }
  else
  {
    nX = vAction[0];
    nY = vAction[1];
  }

  oSys.Call("User32::SetWindowPos", hWnd, 0, nX, nY, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
}

function GetWindowPos(hWnd)
{
  var lpRect = AkelPad.MemAlloc(16) //sizeof(RECT);
  var aRect  = [];

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

  aRect.left   = AkelPad.MemRead(lpRect,     DT_DWORD);
  aRect.top    = AkelPad.MemRead(lpRect + 4, DT_DWORD);
  aRect.right  = AkelPad.MemRead(lpRect + 8, DT_DWORD);
  aRect.bottom = AkelPad.MemRead(lpRect +12, DT_DWORD);
  AkelPad.MemFree(lpRect);

  return aRect;
}

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

function SetDefID(hWnd)
{
  var nID    = 1000;
  var hFocus = oSys.Call("User32::GetFocus");

  while ((nID < aWnd.length) && (hFocus != aWnd[nID][WND]))
    ++nID;

  if ((nID != IDUNDO) && (nID != IDREDO))
    nID = IDSORT;

  oSys.Call("User32::DefDlgProc" + _TCHAR, hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
}

function ReadWriteIni(bWrite)
{
  var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
  var sIniName = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var aRect;
  var oFile;
  var sIniTxt;

  if (bWrite)
  {
    aRect = GetWindowPos(hWndDlg);

    oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[IDSEP][WND], lpBuffer, 256);
    sSep = AkelPad.MemRead(lpBuffer, _TSTR);

    sIniTxt = 'nWndPosX='   + aRect.left + ';\r\n' +
              'nWndPosY='   + aRect.top  + ';\r\n' +
              'nSep='       + nSep + ';\r\n' +
              'sSep="'      + sSep.replace(/[\\"]/g, "\\$&") + '";\r\n' +
              'bTabSep='    + bTabSep + ';\r\n' +
              'bIgCaseSep=' + bIgCaseSep + ';\r\n' +
              'bDesc='      + bDesc + ';\r\n' +
              'bIgCase='    + bIgCase + ';\r\n' +
              'nMethod='    + nMethod + ';\r\n' +
              'nNoSort='    + nNoSort + ';\r\n' +
              'bInLine='    + bInLine + ';\r\n' +
              'bCopyToCB='  + bCopyToCB + ';'

    oFile = oFSO.OpenTextFile(sIniName, 2, true, 0);
    oFile.Write(sIniTxt);
    oFile.Close();
  }

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

function CheckButtons(nButton)
{
  if ((nButton == IDSEPWORD) || (nButton == IDSEPNO) || (nButton == IDSEPANY) || (nButton == IDSEPSTR))
    nSep = nButton - IDSEPWORD;
  else if (nButton == IDTABSEP)
    bTabSep = ! bTabSep;
  else if (nButton == IDIGCASESEP)
    bIgCaseSep = ! bIgCaseSep;
  else if (nButton == IDDESC)
    bDesc = ! bDesc;
  else if (nButton == IDIGCASE)
    bIgCase = ! bIgCase;
  else if ((nButton == IDSTRING) || (nButton == IDLOCALE) || (nButton == IDNUM))
    nMethod = nButton - IDSTRING + 1;
  else if ((nButton == IDREVERSE) || (nButton == IDREMODUP) ||
           (nButton == IDEXTRDUP) || (nButton == IDEXTRUNI))
  {
    if (nNoSort == nButton - IDREVERSE + 1)
      nNoSort = 0;
    else
      nNoSort = nButton - IDREVERSE + 1;
  }
  else if (nButton == IDINLINE)
    bInLine = ! bInLine;
  else if (nButton == IDCOPYTOCB)
    bCopyToCB = ! bCopyToCB;

  AkelPad.SendMessage(aWnd[IDSEPWORD][WND],   BM_SETCHECK, (nSep == 0),    0);
  AkelPad.SendMessage(aWnd[IDSEPNO][WND],     BM_SETCHECK, (nSep == 1),    0);
  AkelPad.SendMessage(aWnd[IDSEPANY][WND],    BM_SETCHECK, (nSep == 2),    0);
  AkelPad.SendMessage(aWnd[IDSEPSTR][WND],    BM_SETCHECK, (nSep == 3),    0);
  AkelPad.SendMessage(aWnd[IDTABSEP][WND],    BM_SETCHECK, bTabSep,        0);
  AkelPad.SendMessage(aWnd[IDIGCASESEP][WND], BM_SETCHECK, bIgCaseSep,     0);
  AkelPad.SendMessage(aWnd[IDDESC][WND],      BM_SETCHECK, bDesc,          0);
  AkelPad.SendMessage(aWnd[IDIGCASE][WND],    BM_SETCHECK, bIgCase,        0);
  AkelPad.SendMessage(aWnd[IDSTRING][WND],    BM_SETCHECK, (nMethod == 1), 0);
  AkelPad.SendMessage(aWnd[IDLOCALE][WND],    BM_SETCHECK, (nMethod == 2), 0);
  AkelPad.SendMessage(aWnd[IDNUM][WND],       BM_SETCHECK, (nMethod == 3), 0);
  AkelPad.SendMessage(aWnd[IDREVERSE][WND],   BM_SETCHECK, (nNoSort == 1), 0);
  AkelPad.SendMessage(aWnd[IDREMODUP][WND],   BM_SETCHECK, (nNoSort == 2), 0);
  AkelPad.SendMessage(aWnd[IDEXTRDUP][WND],   BM_SETCHECK, (nNoSort == 3), 0);
  AkelPad.SendMessage(aWnd[IDEXTRUNI][WND],   BM_SETCHECK, (nNoSort == 4), 0);
  AkelPad.SendMessage(aWnd[IDINLINE][WND],    BM_SETCHECK, bInLine,        0);
  AkelPad.SendMessage(aWnd[IDCOPYTOCB][WND],  BM_SETCHECK, bCopyToCB,      0);

  oSys.Call("User32::EnableWindow", aWnd[IDSEP][WND],       (nSep > 1));
  oSys.Call("User32::EnableWindow", aWnd[IDTABSEP][WND],    (nSep > 1));
  oSys.Call("User32::EnableWindow", aWnd[IDIGCASESEP][WND], (nSep > 1));
  oSys.Call("User32::EnableWindow", aWnd[IDDESC][WND],      (nNoSort == 0));
  oSys.Call("User32::EnableWindow", aWnd[IDIGCASE][WND],    (nNoSort != 1) && (nMethod != 3));
  oSys.Call("User32::EnableWindow", aWnd[IDSTRING][WND],    (nNoSort != 1));
  oSys.Call("User32::EnableWindow", aWnd[IDLOCALE][WND],    (nNoSort != 1));
  oSys.Call("User32::EnableWindow", aWnd[IDNUM][WND],       (nNoSort != 1));
  oSys.Call("User32::EnableWindow", aWnd[IDINLINE][WND],    ! bColSel);
}

function CheckUndoRedo(nButton)
{
  var nBegSel  = AkelPad.GetSelStart();
  var sTxtUndo = aWnd[IDUNDO][TXT];
  var sTxtRedo = aWnd[IDREDO][TXT];

  if (nButton == IDSORT)
  {
    if (nUndoLimit < AkelPad.SendMessage(hEditWnd, 3084 /*AEM_GETUNDOLIMIT*/, 0, 0))
      ++nUndoLimit;
    nRedoLimit = 0;
  }
  else if ((nButton == IDUNDO) && (nUndoLimit))
  {
    --nUndoLimit;
    ++nRedoLimit;
    AkelPad.SendMessage(hEditWnd, 3077 /*AEM_UNDO*/, 0, 0);
    if ((! nUndoLimit) && (oSys.Call("User32::GetFocus") == aWnd[IDUNDO][WND]))
      oSys.Call("User32::SetFocus", aWnd[IDSORT][WND]);
  }
  else if ((nButton == IDREDO) && (nRedoLimit))
  {
    ++nUndoLimit;
    --nRedoLimit;
    AkelPad.SendMessage(hEditWnd, 3078 /*AEM_REDO*/, 0, 0);
    AkelPad.SetSel(nBegSel, AkelPad.GetSelEnd());
    AkelPad.SendMessage(hEditWnd, 3128 /*AEM_UPDATESEL*/, bColSel, 0);
    if ((! nRedoLimit) && (oSys.Call("User32::GetFocus") == aWnd[IDREDO][WND]))
      oSys.Call("User32::SetFocus", aWnd[IDSORT][WND]);
  }

  if (nUndoLimit)
    sTxtUndo += " (" + nUndoLimit + ")";
  if (nRedoLimit)
    sTxtRedo += " (" + nRedoLimit + ")";

  SetWindowFontAndText(aWnd[IDUNDO][WND], hGuiFont, sTxtUndo);
  SetWindowFontAndText(aWnd[IDREDO][WND], hGuiFont, sTxtRedo);

  oSys.Call("User32::EnableWindow", aWnd[IDUNDO][WND], nUndoLimit);
  oSys.Call("User32::EnableWindow", aWnd[IDREDO][WND], nRedoLimit);
}

function SortWords()
{
  var sText = AkelPad.GetSelText();
  var aTxt  = [];
  var sSep  = "";
  var sMod  = "g";
  var rSep;
  var aWord;
  var aSep;
  var i, n;

  lpStrA = AkelPad.MemAlloc(sText.length * _TSIZE);
  lpStrB = AkelPad.MemAlloc(sText.length * _TSIZE);

  if (bInLine)
    aTxt = sText.split("\r");
  else
    aTxt[0] = sText;

  if (nSep == 0)
    sSep = " \t'`\"\\|[](){}<>,.;:+-=~!@#$%^&*/?";
  else if (nSep > 1)
  {
    oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[IDSEP][WND], lpBuffer, 256);
    sSep = AkelPad.MemRead(lpBuffer, _TSTR);
    if (bTabSep)
      sSep = sSep.replace(/\\t/g, "\t");
  }

  if (sSep)
  {
    sSep = sSep.replace(/[\\\/.^$+*?|()\[\]{}-]/g, "\\$&");

    if ((nSep == 0) || (nSep == 2))
      sSep = "[" + sSep + "\r]+";
    else if (nSep == 3)
      sSep = "((" + sSep + ")|\r)+";

    if ((nSep > 1) && bIgCaseSep)
      sMod += "i";
  }

  rSep = new RegExp(sSep, sMod);

  for (i = 0; i < aTxt.length; ++i)
  {
    aWord = aTxt[i].split(rSep);
    aSep  = aTxt[i].match(rSep);

    if ((! sSep) && (! bInLine))
    {
      n = 0;
      while (n < aWord.length)
      {
        if (aWord[n] == "\r")
        {
          aWord.splice(n, 1);
          aSep.splice(n, 2, "\r");
        }
        else
          ++n;
      }
    }

    if (aWord.length > 1)
    {
      if (! RegExp("^" + sSep, sMod).test(aTxt[i]))
        aSep.unshift("");
      if (! RegExp(sSep + "$", sMod).test(aTxt[i]))
        aSep.push("");

      if (nNoSort == 1)
        aWord.reverse();
      else if (nNoSort > 1)
        NoSort(aWord);
      else
        aWord.sort(CompareValue);

      aTxt[i] = aSep[0];

      for (n = 0; n < aWord.length; ++n)
        aTxt[i] += aWord[n] + aSep[n + 1];
    }
  }

  sText = aTxt.join("\r");

  if (bCopyToCB)
    AkelPad.SetClipboardText(sText);
  else
    AkelPad.ReplaceSel(sText, 1);

  AkelPad.MemFree(lpStrA);
  AkelPad.MemFree(lpStrB);

  return (! bCopyToCB);
}

function CompareValue(ValA, ValB)
{
  var nResult = 0;

  if (nMethod == 1)
  {
    if (bIgCase)
    {
      if (ValA.toUpperCase() > ValB.toUpperCase())
        nResult = bDesc ? -1 : 1;
      else if (ValA.toUpperCase() < ValB.toUpperCase())
        nResult = bDesc ? 1 : -1;
    }
    else
    {
      if (ValA > ValB)
        nResult = bDesc ? -1 : 1;
      else if (ValA < ValB)
        nResult = bDesc ? 1 : -1;
    }
  }
  else if (nMethod == 2)
  {
    AkelPad.MemCopy(lpStrA, ValA, _TSTR);
    AkelPad.MemCopy(lpStrB, ValB, _TSTR);
    nResult = oSys.Call("Kernel32::lstrcmp" + (bIgCase ? "i" : "") + _TCHAR, lpStrA, lpStrB);
    if (bDesc)
      nResult = -nResult;
  }
  else
  {
    var rNumber = /(-?\d+\.?\d*)|(-?\.\d+)/;
    ValA    = rNumber.exec(ValA);
    ValB    = rNumber.exec(ValB);
    ValA    = ValA ? parseFloat(ValA[0]) : 0;
    ValB    = ValB ? parseFloat(ValB[0]) : 0;
    nResult = bDesc ? (ValB - ValA) : (ValA - ValB);
  }

  return nResult;
}

function NoSort(aWord)
{
  var i, n, bIsDup;

  if (nNoSort == 2)
  {
    for (n = 0; n < aWord.length; ++n)
    {
      for (i = n + 1; i < aWord.length; ++i)
      {
        if (CompareValue(aWord[i], aWord[n]) == 0)
          aWord[i] = "";
      }
    }
  }
  else if (nNoSort == 3)
  {
    for (n = 0; n < aWord.length; ++n)
    {
      bIsDup = false;
      for (i = 0; i < aWord.length; ++i)
      {
        if ((CompareValue(aWord[i], aWord[n]) == 0) && (i != n))
        {
          bIsDup = true;
          break;
        }
      }
      if (! bIsDup)
        aWord[n] = "";
    }
  }
  else
  {
    for (n = 0; n < aWord.length; ++n)
    {
      bIsDup = false;
      for (i = n + 1; i < aWord.length; ++i)
      {
        if (CompareValue(aWord[i], aWord[n]) == 0)
        {
          bIsDup = true;
          aWord[i] = "";
        }
      }
      if (bIsDup)
        aWord[n] = "";
    }
  }
}


Last edited by KDJ on Sat Sep 28, 2013 3:31 pm; edited 4 times in total
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1620

PostPosted: Fri Mar 04, 2011 5:36 pm    Post subject: Reply with quote

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

// (c) Infocatcher 2011, 2013-2014
// version 0.2.8 - 2014-08-16

//===================
// Run script from AkelFiles\Plugs\Scripts\ directory

// Hotkeys:
//   Enter                         - Ok
//   Ctrl+Enter (Shift+Enter), F3  - Exec
//   F4, Ctrl+E                    - Edit
//   F2, Ctrl+S                    - Rewrite options (and remove arguments for removed files)
//   F1, Shift+F1                  - Next/previous script
//   F5                            - Refresh scripts list
//   Escape                        - Cancel

// Arguments:
//   -saveOptions=0               - don't save options
//               =1               - save options only for runned scripts (default)
//               =2               - always save options
//   -savePosition=true           - allow store last window position
//   -saveSize=true               - allow store last window size
//   -script="someScript.js"      - select someScript.js in the list

// Usage:
//   Call("Scripts::Main", 1, "runScript.js")
//   Call("Scripts::Main", 1, "runScript.js", `-script="someScript.js" -saveOptions=0 -savePosition=false`)
//===================

function _localize(s) {
   var strings = {
      "&Arguments": {
         ru: "&Аргументы"
      },
      "OK": {
         ru: "ОК"
      },
      "Exec": {
         ru: "Запустить"
      },
      "Edit": {
         ru: "Изменить"
      },
      "Cancel": {
         ru: "Отмена"
      }
   };
   var lng;
   switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
      case 0x19: lng = "ru"; break;
      default:   lng = "en";
   }
   _localize = function(s) {
      return strings[s] && strings[s][lng] || s;
   };
   return _localize(s);
}

var hMainWnd = AkelPad.GetMainWnd();
if(!hMainWnd)
   WScript.Quit();

var oSys = AkelPad.SystemFunction();
var oSet = AkelPad.ScriptSettings();
var fso = new ActiveXObject("Scripting.FileSystemObject");
var scriptsDir = AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/);
var dialogTitle = WScript.ScriptName.replace(/^[!-\-_]+/, "");
dialogTitle = dialogTitle.charAt(0).toUpperCase() + dialogTitle.substr(1);

function getPrefName(scriptName) {
   return "/" + scriptName.replace(/=/g, "<equals>");
}

// Read arguments:
var scriptName   = AkelPad.GetArgValue("script", "");
var saveOptions  = AkelPad.GetArgValue("saveOptions", 1);
var savePosition = AkelPad.GetArgValue("savePosition", true);
var saveSize     = AkelPad.GetArgValue("saveSize", true);

var filePath = AkelPad.GetEditFile(0);
if(!scriptName && fso.GetParentFolderName(filePath).toLowerCase() == scriptsDir.toLowerCase())
   scriptName = fso.GetFileName(filePath);

selectScriptDialog();

function isScript(path) {
   return /\.(js|vbs)$/i.test(path);
}
function expandArgs(args) {
   var wsh = new ActiveXObject("WScript.Shell");
   expandArgs = function(args) {
      var file = AkelPad.GetEditFile(0);
      return wsh.ExpandEnvironmentStrings(args)
         .replace(/%f/ig, file)
         .replace(/%d/ig, fso.GetParentFolderName(file))
         .replace(/%a/ig, AkelPad.GetAkelDir())
         .replace(/%([^%]|$)/g, "$1")
         .replace(/%%/g, "%");
   };
   return expandArgs(args);
}

function selectScriptDialog(modal) {
   var hInstanceDLL = AkelPad.GetInstanceDll();
   var dialogClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("kernel32::GetCurrentProcessId");

   var hWndDialog = oSys.Call("user32::FindWindowEx" + _TCHAR, 0, 0, dialogClass, 0);
   if(hWndDialog) {
      if(oSys.Call("user32::IsIconic", hWndDialog))
         oSys.Call("user32::ShowWindow", hWndDialog, 9 /*SW_RESTORE*/);
      AkelPad.SendMessage(hWndDialog, 7 /*WM_SETFOCUS*/, 0, 0);
      return;
   }

   if(
      !AkelPad.WindowRegisterClass(dialogClass)
      && ( // Previous script instance crashed
         !AkelPad.WindowUnregisterClass(dialogClass)
         || !AkelPad.WindowRegisterClass(dialogClass)
      )
   )
      return;

   var curName = isScript(scriptName) && scriptName;

   var dlgX, dlgY;
   var lastW, lastH;
   if((saveOptions || savePosition || saveSize) && oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/)) {
      if(saveOptions && !curName)
         curName = oSet.Read("lastScript", 3 /*PO_STRING*/, "");
      if(savePosition) {
         dlgX = oSet.Read("windowLeft", 1 /*PO_DWORD*/);
         dlgY = oSet.Read("windowTop",  1 /*PO_DWORD*/);
      }
      if(saveSize) {
         lastW = oSet.Read("windowWidth",  1 /*PO_DWORD*/);
         lastH = oSet.Read("windowHeight", 1 /*PO_DWORD*/);
      }
      oSet.End();
   }
   var _cleanup = {};
   function saveSettings(rewrite) {
      if(!saveOptions && !savePosition && !saveSize)
         return;
      if(!oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/ | (rewrite ? 0x4 /*POB_CLEAR*/ : 0)))
         return;
      if(saveOptions) {
         if(runned || saveOptions == 2)
            oSet.Write("lastScript", 3 /*PO_STRING*/, saveOptions == 2 ? curName : runnedName);
         var names = saveOptions == 2 ? argsObj : runned || {};
         for(var name in names)
            saveArgs(name, argsObj[name]);
         for(var name in _cleanup) {
            oSet.Delete("lastArgs-" + encodeURIComponent(name));
            !names[name] && saveArgs(name, _cleanup[name]);
         }
      }
      if((savePosition || saveSize) && !oSys.Call("user32::IsIconic", hWndDialog)) {
         var rcWnd = getWindowRect(hWndDialog);
         if(rcWnd) {
            if(savePosition) {
               oSet.Write("windowLeft", 1 /*PO_DWORD*/, rcWnd.left);
               oSet.Write("windowTop",  1 /*PO_DWORD*/, rcWnd.top);
            }
            if(saveSize) {
               oSet.Write("windowWidth",  1 /*PO_DWORD*/, Math.round((rcWnd.right - rcWnd.left)/scale.x(10000)*10000) - sizeNonClientX);
               oSet.Write("windowHeight", 1 /*PO_DWORD*/, Math.round((rcWnd.bottom - rcWnd.top)/scale.y(10000)*10000) - sizeNonClientY);
            }
         }
      }
      oSet.End();
   }
   function saveArgs(name, args) {
      var prefName = getPrefName(name);
      if(args)
         oSet.Write(prefName, 3 /*PO_STRING*/, args);
      else
         oSet.Delete(prefName);
   }

   var IDC_STATIC  = -1;
   var IDC_LISTBOX = 1000;
   var IDC_ARGS    = 1001;
   var IDC_OK      = 1002;
   var IDC_EXEC    = 1003;
   var IDC_EDIT    = 1004;
   var IDC_CANCEL  = 1005;

   var selfRun = false;
   var runned, runnedName;
   var argsObj = {};

   var hWndListBox, hWndGroupArgs, hWndArgs;
   var hWndOK, hWndExec, hWndEdit, hWndCancel;

   var lbW = 260;
   var lbH = 320;

   var btnW = 82;
   var btnH = 23;
   var btnSep = 4;

   var gbH = 48;
   var gbW = lbW + 12 + btnW;

   var dlgW = 12 + lbW + 12 + btnW + 12;
   var dlgH = 12 + lbH + 12 + gbH + 12;

   var dlgMinW = dlgW - lbW + 120;
   var dlgMinH = 12 + btnH*4 + btnSep*3 + 12 + gbH + 12;

   if(lastW != undefined)
      lastW = Math.max(dlgMinW, lastW);
   if(lastH != undefined)
      lastH = Math.max(dlgMinH, lastH);

   var scale = new Scale(0, hMainWnd);
   var sizeNonClientX = oSys.Call("user32::GetSystemMetrics", 32 /*SM_CXSIZEFRAME*/) * 2;
   var sizeNonClientY = oSys.Call("user32::GetSystemMetrics", 33 /*SM_CYSIZEFRAME*/) * 2 + oSys.Call("user32::GetSystemMetrics", 4 /*SM_CYCAPTION*/);

   // Create dialog
   hWndDialog = oSys.Call(
      "user32::CreateWindowEx" + _TCHAR,
      0,                                       //dwExStyle
      dialogClass,                             //lpClassName
      0,                                       //lpWindowName
      0x90CE0000,                              //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_THICKFRAME
      scale.x(dlgX || 0),                      //x
      scale.y(dlgY || 0),                      //y
      scale.x(lastW || dlgW) + sizeNonClientX, //nWidth
      scale.y(lastH || dlgH) + sizeNonClientY, //nHeight
      hMainWnd,                                //hWndParent
      0,                                       //ID
      hInstanceDLL,                            //hInstance
      dialogCallback                           //Script function callback. To use it class must be registered by WindowRegisterClass.
   );
   if(!hWndDialog)
      return;

   function dialogCallback(hWnd, uMsg, wParam, lParam) {
      switch(uMsg) {
         case 1: //WM_CREATE
            dlgW = scale.x(dlgW) + sizeNonClientX;
            dlgH = scale.y(dlgH) + sizeNonClientY;
            dlgMinW = scale.x(dlgMinW) + sizeNonClientX;
            dlgMinH = scale.y(dlgMinH) + sizeNonClientY;

            var hGuiFont = oSys.Call("gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);

            // Dialog caption
            oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, dialogTitle);

            hWndListBox = createWindowEx(
               0x204,        //WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY
               "LISTBOX",    //lpClassName
               0,            //lpWindowName
               0x50210103,   //WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_TABSTOP|LBS_NOINTEGRALHEIGHT|LBS_SORT|LBS_NOTIFY
               12,           //x
               12,           //y
               lbW,          //nWidth
               lbH,          //nHeight
               hWnd,         //hWndParent
               IDC_LISTBOX,  //ID
               hInstanceDLL, //hInstance
               0             //lpParam
            );
            setWindowFont(hWndListBox, hGuiFont);

            // GroupBox action
            hWndGroupArgs = createWindowEx(
               0,             //dwExStyle
               "BUTTON",      //lpClassName
               0,             //lpWindowName
               0x50000007,    //WS_VISIBLE|WS_CHILD|BS_GROUPBOX
               12,            //x
               12 + lbH + 12, //y
               gbW,           //nWidth
               gbH,           //nHeight
               hWnd,          //hWndParent
               IDC_STATIC,    //ID
               hInstanceDLL,  //hInstance
               0              //lpParam
            );
            setWindowFontAndText(hWndGroupArgs, hGuiFont, _localize("&Arguments"));

            // Edit: arguments
            hWndArgs = createWindowEx(
               0x200,              //WS_EX_CLIENTEDGE
               "EDIT",             //lpClassName
               0,                  //lpWindowName
               0x50010080,         //WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL
               12 + 8,             //x
               12 + lbH + 12 + 18, //y
               gbW - 8*2,          //nWidth
               21,                 //nHeight
               hWnd,               //hWndParent
               IDC_ARGS,           //ID
               hInstanceDLL,       //hInstance
               0                   //lpParam
            );
            setWindowFont(hWndArgs, hGuiFont);
            setEditText(hWndArgs, "");

            // OK button window
            hWndOK = createWindowEx(
               0,             //dwExStyle
               "BUTTON",      //lpClassName
               0,             //lpWindowName
               0x50010001,    //WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
               12 + lbW + 12, //x
               12,            //y
               btnW,          //nWidth
               btnH,          //nHeight
               hWnd,          //hWndParent
               IDC_OK,        //ID
               hInstanceDLL,  //hInstance
               0              //lpParam
            );
            setWindowFontAndText(hWndOK, hGuiFont, _localize("OK"));

            // Exec button window
            hWndExec = createWindowEx(
               0,                  //dwExStyle
               "BUTTON",           //lpClassName
               0,                  //lpWindowName
               0x50010000,         //WS_VISIBLE|WS_CHILD|WS_TABSTOP
               12 + lbW + 12,      //x
               12 + btnH + btnSep, //y
               btnW,               //nWidth
               btnH,               //nHeight
               hWnd,               //hWndParent
               IDC_EXEC,           //ID
               hInstanceDLL,       //hInstance
               0                   //lpParam
            );
            setWindowFontAndText(hWndExec, hGuiFont, _localize("Exec"));

            // Edit button window
            hWndEdit = createWindowEx(
               0,                      //dwExStyle
               "BUTTON",               //lpClassName
               0,                      //lpWindowName
               0x50010000,             //WS_VISIBLE|WS_CHILD|WS_TABSTOP
               12 + lbW + 12,          //x
               12 + (btnH + btnSep)*2, //y
               btnW,                   //nWidth
               btnH,                   //nHeight
               hWnd,                   //hWndParent
               IDC_EDIT,               //ID
               hInstanceDLL,           //hInstance
               0                       //lpParam
            );
            setWindowFontAndText(hWndEdit, hGuiFont, _localize("Edit"));

            // Cancel button window
            hWndCancel = createWindowEx(
               0,                      //dwExStyle
               "BUTTON",               //lpClassName
               0,                      //lpWindowName
               0x50010000,             //WS_VISIBLE|WS_CHILD|WS_TABSTOP
               12 + lbW + 12,          //x
               12 + (btnH + btnSep)*3, //y
               btnW,                   //nWidth
               btnH,                   //nHeight
               hWnd,                   //hWndParent
               IDC_CANCEL,             //ID
               hInstanceDLL,           //hInstance
               0                       //lpParam
            );
            setWindowFontAndText(hWndCancel, hGuiFont, _localize("Cancel"));

            if(lastW != undefined || lastH != undefined)
               resizeDialog(hWnd, lastW || dlgW, lastH || dlgH);

            fillListBox();
            updArgs();

            //centerWindow(hWnd);
            //centerWindow(hWnd, hMainWnd);
            restoreWindowPosition(hWnd, hMainWnd);
         break;
         case 7: //WM_SETFOCUS
            oSys.Call("user32::SetFocus", curName ? hWndArgs : hWndListBox);
         break;
         case 256: //WM_KEYDOWN
            var ctrl = oSys.Call("user32::GetAsyncKeyState", 162 /*VK_LCONTROL*/)
               || oSys.Call("user32::GetAsyncKeyState", 163 /*VK_RCONTROL*/);
            var shift = oSys.Call("user32::GetAsyncKeyState", 160 /*VK_LSHIFT*/)
               || oSys.Call("user32::GetAsyncKeyState", 161 /*VK_RSHIFT*/);
            //var alt = oSys.Call("user32::GetAsyncKeyState", 164 /*VK_LMENU*/)
            //   || oSys.Call("user32::GetAsyncKeyState", 165 /*VK_RMENU*/);
            if(wParam == 27) //VK_ESCAPE
               oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_CANCEL, 0);
            else if(wParam == 13) { //VK_RETURN
               if(ctrl || shift) // Ctrl+Enter, Shift+Enter
                  oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_EXEC, 0);
               else // Enter
                  oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_OK, 0);
            }
            else if(wParam == 114 /*VK_F3*/) // F3
               oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_EXEC, 0);
            else if(wParam == 112 /*VK_F1*/)
               navigate(ctrl || shift);
            else if(wParam == 113 /*VK_F2*/ || ctrl && wParam == 83 /*S*/) { // F2, Ctrl+S
               var so = saveOptions;
               saveOptions = 2;
               saveSettings(true);
               saveOptions = so;
            }
            else if(wParam == 115 /*VK_F4*/ || ctrl && wParam == 69 /*E*/) // F4, Ctrl+E
               oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_EDIT, 0);
            else if(wParam == 116 /*VK_F5*/)
               redrawListbox();

            //else if(wParam != 16 /*VK_SHIFT*/ && wParam != 17 /*VK_CONTROL*/ && wParam != 18 /*VK_MENU*/)
            //   AkelPad.MessageBox(hWnd, wParam, dialogTitle, 0 /*MB_OK*/);
         break;
         case 273: //WM_COMMAND
            var idc = wParam & 0xffff;
            switch(idc) {
               case IDC_OK:
               case IDC_EXEC:
                  var isSelf = curName == WScript.ScriptName;
                  selfRun = false;
                  if(!curName || isSelf && idc == IDC_EXEC)
                     break;
                  if(!runned)
                     runned = {};
                  runned[runnedName = curName] = true;
                  if(isSelf)
                     selfRun = true;
                  else
                     AkelPad.Call("Scripts::Main", 1, curName, expandArgs(argsObj[curName] || ""));
                  if(idc == IDC_OK)
                     closeDialog();
                  else
                     ensureVisibility();
               break;
               case IDC_EDIT:
                  curName && AkelPad.Call("Scripts::Main", 3, curName);
               break;
               case IDC_CANCEL:
                  closeDialog();
               break;
               case IDC_ARGS:
                  argsObj[curName] = windowText(hWndArgs).replace(/^\s+|\s+$/g, "");
               break;
               case IDC_LISTBOX:
                  updArgs();
                  if((wParam >> 16 & 0xFFFF) == 2 /*LBN_DBLCLK*/)
                     oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_EXEC, 0);
            }
         break;
         case 36: //WM_GETMINMAXINFO
            AkelPad.MemCopy(lParam + 24, dlgMinW, 3 /*DT_DWORD*/); //ptMinTrackSize.x
            AkelPad.MemCopy(lParam + 28, dlgMinH, 3 /*DT_DWORD*/); //ptMinTrackSize.y
         break;
         case 5: //WM_SIZE
            if(oSys.Call("user32::IsIconic", hWnd))
               break;
            var rcWnd = getWindowRect(hWnd);
            var curW = rcWnd.right - rcWnd.left;
            var curH = rcWnd.bottom - rcWnd.top;
            resizeDialog(hWnd, curW, curH);
         break;
         case 15: //WM_PAINT
            // Based on code of SearchReplace.js script
            var ps;
            var hDC;
            var lpGrip;
            var rcGrip;
            if(ps = AkelPad.MemAlloc(_X64 ? 72 : 64 /*sizeof(PAINTSTRUCT)*/)) {
               if(hDC = oSys.Call("user32::BeginPaint", hWnd, ps)) {
                  if(lpGrip = AkelPad.MemAlloc(16 /*sizeof(RECT)*/)) {
                     if(oSys.Call("user32::GetClientRect", hWnd, lpGrip)) {
                        rcGrip = parseRect(lpGrip);
                        rcGrip.left = rcGrip.right  - oSys.Call("user32::GetSystemMetrics", 2 /*SM_CXVSCROLL*/);
                        rcGrip.top  = rcGrip.bottom - oSys.Call("user32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/);

                        AkelPad.MemCopy(lpGrip,      rcGrip.left,   3 /*DT_DWORD*/);
                        AkelPad.MemCopy(lpGrip + 4,  rcGrip.top,    3 /*DT_DWORD*/);
                        AkelPad.MemCopy(lpGrip + 8,  rcGrip.right,  3 /*DT_DWORD*/);
                        AkelPad.MemCopy(lpGrip + 12, rcGrip.bottom, 3 /*DT_DWORD*/);

                        oSys.Call("user32::DrawFrameControl", hDC, lpGrip, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/);
                     }
                     AkelPad.MemFree(lpGrip);
                  }
                  oSys.Call("user32::EndPaint", hWnd, ps);
               }
               AkelPad.MemFree(ps);
            }
         break;
         case 16: //WM_CLOSE
            saveSettings();
            modal && enabled(hMainWnd, true); // Enable main window
            oSys.Call("user32::DestroyWindow", hWnd); // Destroy dialog
         break;
         case 2: //WM_DESTROY
            oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
      }
      return 0;
   }

   function fillListBox() {
      //var t = new Date().getTime();
      var files = [];
      // Foollowing is very slow (especially on slow devices like USB flash):
      //var filesEnum = new Enumerator(fso.GetFolder(scriptsDir).Files);
      //for(; !filesEnum.atEnd(); filesEnum.moveNext()) {
      //   var name = filesEnum.item().Name;
      //   if(isScript(name))
      //      files[files.length] = name;
      //}

      // Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=12548#12548
      var lpFindData = AkelPad.MemAlloc(592 /*sizeof(WIN32_FIND_DATAW)*/);
      if(!lpFindData)
         return;
      var hSearch = oSys.Call("kernel32::FindFirstFile" + _TCHAR, scriptsDir + "\\*", lpFindData);
      if(!hSearch)
         return;
      do {
         var fName = AkelPad.MemRead(lpFindData + 44 /*offsetof(WIN32_FIND_DATAW, cFileName)*/, _TSTR);
         if(fName == "." || fName == "..")
            continue;
         if(isScript(fName))
            files[files.length] = fName;
      }
      while(oSys.Call("kernel32::FindNextFile" + _TCHAR, hSearch, lpFindData));
      oSys.Call("kernel32::FindClose", hSearch);
      AkelPad.MemFree(lpFindData);
      //WScript.Echo(new Date().getTime() - t);
      //files.sort();

      var lpStr = AkelPad.MemAlloc(256*_TSIZE);
      if(!lpStr)
         return;

      var read = oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/);

      var indx = 0;
      for(var i = 0, l = files.length; i < l; ++i) {
         var name = files[i];

         if(read) {
            var args = oSet.Read(getPrefName(name), 3 /*PO_STRING*/);
            var oldArgs = oSet.Read("lastArgs-" + encodeURIComponent(name), 3 /*PO_STRING*/);
            if(oldArgs != undefined)
               _cleanup[name] = oldArgs;
            argsObj[name] = args || oldArgs || "";
         }

         AkelPad.MemCopy(lpStr, name.substr(0, 255), _TSTR);
         AkelPad.SendMessage(hWndListBox,  0x180 /*LB_ADDSTRING*/, 0, lpStr);
      }
      AkelPad.MemFree(lpStr);
      read && oSet.End();

      var indx = getIndexFromString(curName);
      if(indx != undefined)
         AkelPad.SendMessage(hWndListBox,  0x186 /*LB_SETCURSEL*/, indx, 0);
      else
         curName = "";
   }
   function redrawListbox() {
      for(var name in argsObj)
         delete argsObj[name];

      AkelPad.SendMessage(hWndDialog, 11 /*WM_SETREDRAW*/, false, 0);

      var maxIndx = AkelPad.SendMessage(hWndListBox,  0x18B /*LB_GETCOUNT*/, 0, 0) - 1;
      for(var i = maxIndx; i >= 0; --i)
         AkelPad.SendMessage(hWndListBox,  0x182 /*LB_DELETESTRING*/, i, 0);
      fillListBox();

      AkelPad.SendMessage(hWndDialog, 11 /*WM_SETREDRAW*/, true, 0);
      //var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
      //if(lpRect) {
      //   var rc = getWindowRect(hWndListBox, hWndDialog);
      //   AkelPad.MemCopy(lpRect,      rc.left,   3 /*DT_DWORD*/);
      //   AkelPad.MemCopy(lpRect + 4,  rc.top,    3 /*DT_DWORD*/);
      //   AkelPad.MemCopy(lpRect + 8,  rc.right,  3 /*DT_DWORD*/);
      //   AkelPad.MemCopy(lpRect + 12, rc.bottom, 3 /*DT_DWORD*/);
      //   oSys.Call("user32::InvalidateRect", hWndDialog, lpRect, true);
      //   AkelPad.MemFree(lpRect);
      //}
      oSys.Call("user32::InvalidateRect", hWndListBox, 0, true);

      updArgs();
   }
   function updArgs() {
      var str = getStringFromIndex(AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0));
      if(!str) {
         enableControls({
            exec: false,
            edit: false,
            ok:   false
         });
         return;
      }
      curName = str;
      setEditText(hWndArgs, argsObj[str] || "");
      enableControls({
         exec: str != WScript.ScriptName,
         edit: true,
         ok:   true
      });
   }
   function enableControls(enable) {
      var hWndFocused = oSys.Call("user32::GetFocus");
      enabled(hWndExec, enable.exec);
      enabled(hWndEdit, enable.edit);
      enabled(hWndOK,   enable.ok);
      if(
         !enable.exec && hWndFocused == hWndExec
         || !enable.edit && hWndFocused == hWndEdit
         || !enable.ok && hWndFocused == hWndOK
      )
         oSys.Call("user32::SetFocus", hWndDialog);
   }
   function ensureVisibility() {
      var indx = AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0);
      if(indx != -1)
         AkelPad.SendMessage(hWndListBox,  0x186 /*LB_SETCURSEL*/, indx, 0);
   }
   function navigate(up) {
      var i = AkelPad.SendMessage(hWndListBox,  0x188 /*LB_GETCURSEL*/, 0, 0);
      var max = AkelPad.SendMessage(hWndListBox,  0x18B /*LB_GETCOUNT*/, 0, 0) - 1;
      if(up) {
         if(--i < 0)
            i = max;
      }
      else {
         if(++i > max)
            i = 0;
      }
      AkelPad.SendMessage(hWndListBox,  0x186 /*LB_SETCURSEL*/, i, 0);
      oSys.Call("user32::PostMessage" + _TCHAR, hWndDialog, 273 /*WM_COMMAND*/, IDC_LISTBOX, 0);
   }

   function restoreWindowPosition(hWnd, hWndParent) {
      if(dlgX == undefined || dlgY == undefined) {
         centerWindow(hWnd, hWndParent);
         return;
      }

      var rcWnd = getWindowRect(hWnd);
      if(!rcWnd)
         return;

      var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
      if(!lpRect)
         return;
      AkelPad.MemCopy(lpRect,      dlgX,                              3 /*DT_DWORD*/);
      AkelPad.MemCopy(lpRect + 4,  dlgY,                              3 /*DT_DWORD*/);
      AkelPad.MemCopy(lpRect + 8,  dlgX + (rcWnd.right - rcWnd.left), 3 /*DT_DWORD*/);
      AkelPad.MemCopy(lpRect + 12, dlgY + (rcWnd.top - rcWnd.bottom), 3 /*DT_DWORD*/);
      var hMonitor = oSys.Call("user32::MonitorFromRect", lpRect, 0x2 /*MONITOR_DEFAULTTONEAREST*/);

      if(hMonitor) {
         //typedef struct tagMONITORINFO {
         //  DWORD cbSize;
         //  RECT  rcMonitor;
         //  RECT  rcWork;
         //  DWORD dwFlags;
         //} MONITORINFO, *LPMONITORINFO;
         var sizeofMonitorInfo = 4 + 16 + 16 + 4;
         var lpMi = AkelPad.MemAlloc(sizeofMonitorInfo);
         if(lpMi) {
            AkelPad.MemCopy(lpMi, sizeofMonitorInfo, 3 /*DT_DWORD*/);
            oSys.Call("user32::GetMonitorInfo" + _TCHAR, hMonitor, lpMi);
            var rcWork = parseRect(lpMi + 4 + 16);
            AkelPad.MemFree(lpMi);
         }
      }
      else { //?
         oSys.Call("user32::SystemParametersInfo" + _TCHAR, 48 /*SPI_GETWORKAREA*/, 0, lpRect, 0);
         var rcWork = parseRect(lpRect);
      }
      AkelPad.MemFree(lpRect);

      if(rcWork) {
         var edge = Math.max(
            16,
            oSys.Call("user32::GetSystemMetrics", 33 /*SM_CYSIZEFRAME*/)
               + oSys.Call("user32::GetSystemMetrics", 4 /*SM_CYCAPTION*/)
         );

         var minX = rcWork.left - (rcWnd.right - rcWnd.left) + edge;
         var minY = rcWork.top;
         var maxX = rcWork.right - edge;
         var maxY = rcWork.bottom - edge;

         dlgX = Math.max(minX, Math.min(maxX, dlgX));
         dlgY = Math.max(minY, Math.min(maxY, dlgY));
      }

      moveWindow(hWnd, dlgX, dlgY);
   }
   function centerWindow(hWnd, hWndParent) {
      var rcWnd = getWindowRect(hWnd);
      var rcWndParent = getWindowRect(hWndParent || oSys.Call("user32::GetDesktopWindow"));
      if(!rcWndParent || !rcWnd)
         return;
      var x = rcWndParent.left + ((rcWndParent.right  - rcWndParent.left) / 2 - (rcWnd.right  - rcWnd.left) / 2);
      var y = rcWndParent.top  + ((rcWndParent.bottom - rcWndParent.top)  / 2 - (rcWnd.bottom - rcWnd.top)  / 2);
      moveWindow(hWnd, x, y);
   }
   function moveWindow(hWnd, x, y, hWndParent) {
      if(hWndParent) {
         var rcWnd = getWindowRect(hWnd, hWndParent);
         x += rcWnd.left;
         y += rcWnd.top;
      }
      oSys.Call("user32::SetWindowPos", hWnd, 0, x, y, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
   }
   function resizeWindow(hWnd, dw, dh) {
      var rcWnd = getWindowRect(hWnd);
      var w = rcWnd.right - rcWnd.left + dw;
      var h = rcWnd.bottom - rcWnd.top + dh;
      oSys.Call("user32::SetWindowPos", hWnd, 0, 0, 0, w, h, 0x16 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE*/);
   }
   function resizeDialog(hWnd, curW, curH) {
      var dw = curW - dlgW;
      var dh = curH - dlgH;

      resizeWindow(hWndListBox, dw, dh);

      resizeWindow(hWndGroupArgs, dw, 0);
      resizeWindow(hWndArgs,      dw, 0);
      moveWindow(hWndGroupArgs, 0, dh, hWnd);
      moveWindow(hWndArgs,      0, dh, hWnd);

      moveWindow(hWndOK,     dw, 0, hWnd);
      moveWindow(hWndExec,   dw, 0, hWnd);
      moveWindow(hWndEdit,   dw, 0, hWnd);
      moveWindow(hWndCancel, dw, 0, hWnd);

      dlgW = curW;
      dlgH = curH;
   }
   function getWindowRect(hWnd, hWndParent) {
      var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
      if(!lpRect)
         return null;
      oSys.Call("user32::GetWindowRect", hWnd, lpRect);
      hWndParent && oSys.Call("user32::ScreenToClient", hWndParent, lpRect);
      var rcWnd = parseRect(lpRect);
      AkelPad.MemFree(lpRect);
      return rcWnd;
   }
   function parseRect(lpRect) {
      return {
         left:   AkelPad.MemRead(lpRect,      3 /*DT_DWORD*/),
         top:    AkelPad.MemRead(lpRect +  4, 3 /*DT_DWORD*/),
         right:  AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/),
         bottom: AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/)
      };
   }

   function getStringFromIndex(i) {
      if(i == -1 || i == undefined)
         return "";
      var len = AkelPad.SendMessage(hWndListBox, 0x18A /*LB_GETTEXTLEN*/, i, 0);
      var lpString = AkelPad.MemAlloc((len + 1)*_TSIZE);
      if(!lpString)
         return "";
      AkelPad.SendMessage(hWndListBox, 0x189 /*LB_GETTEXT*/, i, lpString);
      var str = AkelPad.MemRead(lpString, _TSTR);
      AkelPad.MemFree(lpString);
      return str;
   }
   function getIndexFromString(str) {
      for(var i = 0, l = AkelPad.SendMessage(hWndListBox, 0x18B /*LB_GETCOUNT*/, 0, 0); i < l; ++i) {
         var s = getStringFromIndex(i);
         if(s == str)
            return i;
      }
      return undefined;
   }

   function windowText(hWnd, pText) {
      if(arguments.length > 1)
         return oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, pText);
      var len = oSys.Call("user32::GetWindowTextLength" + _TCHAR, hWnd);
      var lpText = AkelPad.MemAlloc((len + 1)*_TSIZE);
      if(!lpText)
         return "";
      oSys.Call("user32::GetWindowText" + _TCHAR, hWnd, lpText, len + 1);
      pText = AkelPad.MemRead(lpText, _TSTR);
      AkelPad.MemFree(lpText);
      return pText;
   }
   function setWindowFont(hWnd, hFont) {
      AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
   }
   function setWindowFontAndText(hWnd, hFont, pText) {
      setWindowFont(hWnd, hFont);
      windowText(hWnd, pText);
   }
   function setEditText(hWnd, pText, selectAll) {
      windowText(hWnd, pText);
      pText && AkelPad.SendMessage(hWnd, 177 /*EM_SETSEL*/, selectAll ? 0 : pText.length, -1);
   }
   function enabled(hWnd, val) {
      oSys.Call("user32::EnableWindow", hWnd, val);
   }
   function destroyWindow(hWnd) {
      oSys.Call("user32::DestroyWindow", hWnd);
   }
   function closeDialog() {
      oSys.Call("user32::PostMessage" + _TCHAR, hWndDialog, 16 /*WM_CLOSE*/, 0, 0);
   }
   function Scale(hDC, hWnd) {
      var hNewDC = hDC || oSys.Call("user32::GetDC", hWnd);
      if(hNewDC) {
         this._x = oSys.Call("gdi32::GetDeviceCaps", hNewDC, 88 /*LOGPIXELSX*/);
         this._y = oSys.Call("gdi32::GetDeviceCaps", hNewDC, 90 /*LOGPIXELSY*/);

         //Align to 16 pixel
         this._x += (16 - this._x % 16) % 16;
         this._y += (16 - this._y % 16) % 16;

         !hDC && oSys.Call("user32::ReleaseDC", hWnd, hNewDC);

         this.x = function(x) {
            return oSys.Call("kernel32::MulDiv", x, this._x, 96);
         };
         this.y = function(y) {
            return oSys.Call("kernel32::MulDiv", y, this._y, 96);
         };
      }
      else {
         this.x = this.y = function(n) {
            return n;
         };
      }
   }
   function createWindowEx(
      dwExStyle, lpClassName, lpWindowName, dwStyle,
      x, y, w, h,
      hWndParent, id, hInstance, callback
   ) {
      return oSys.Call(
         "user32::CreateWindowEx" + _TCHAR,
         dwExStyle, lpClassName, lpWindowName, dwStyle,
         scale.x(x), scale.y(y),
         scale.x(w), scale.y(h),
         hWndParent, id, hInstance, callback || 0
      );
   }

   modal && enabled(hMainWnd, false); // Disable main window, to make dialog modal

   AkelPad.ScriptNoMutex(); // Allow other scripts running
   AkelPad.WindowGetMessage(); // Message loop

   AkelPad.WindowUnregisterClass(dialogClass);

   selfRun && AkelPad.Call("Scripts::Main", 1, WScript.ScriptName, expandArgs(argsObj[curName] || ""));
}
<download | mirror | development version>
Run script from AkelFiles\Plugs\Scripts\ directory with arguments.
Screenshots



executeScript.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11863#11863
// http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.js
// http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.vbs

// (c) Infocatcher 2011
// version 0.2.2 - 2011-12-20

//===================
// Execute selected or all code

// Arguments:
//   -useTempFile=true   - run script from temp file (useful for tracking errors)
//   -onlySelected=true  - use only selected text
//   -type="js"          - don't ask script type

// Usage:
//   Call("Scripts::Main", 1, "executeScript.js")
//   Call("Scripts::Main", 1, "executeScript.js", `-type="js"`)
//===================

function _localize(s) {
   var strings = {
      "Yes – run as JScript\nNo – run as VBScript": {
         ru: "Да – запустить как JScript\nНет – запустить как VBScript"
      }
   };
   var lng;
   switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
      case 0x19: lng = "ru"; break;
      default:   lng = "en";
   }
   _localize = function(s) {
      return strings[s] && strings[s][lng] || s;
   };
   return _localize(s);
}

// Read arguments:
// getArg(argName, defaultValue)
var useTempFile  = getArg("useTempFile", true);
var type         = getArg("type");
var fileToDelete = getArg("fileToDelete");
var onlySelected = getArg("onlySelected", false);

if(fileToDelete) {
   var fso = new ActiveXObject("Scripting.FileSystemObject");
   if(fso.FileExists(fileToDelete))
      fso.DeleteFile(fileToDelete);
   WScript.Quit();
}

var hMainWnd = AkelPad.GetMainWnd();
if(!hMainWnd)
   WScript.Quit();
var dialogTitle = WScript.ScriptName.replace(/^[!-\-_]+/, "");
dialogTitle = dialogTitle.charAt(0).toUpperCase() + dialogTitle.substr(1);

var filePath = AkelPad.GetEditFile(0);

var isJs  = type ? type == "js"  : isJsFile(filePath);
var isVbs = type ? type == "vbs" : isVbsFile(filePath);

if(!isJs && !isVbs) {
   var btn = AkelPad.MessageBox(
      hMainWnd,
      _localize("Yes – run as JScript\nNo – run as VBScript"),
      WScript.ScriptName,
      35 /*MB_YESNOCANCEL|MB_ICONQUESTION*/
   );
   isJs  = btn == 6; //IDYES
   isVbs = btn == 7; //IDNO
}

if(useTempFile && (isJs || isVbs)) {
   var tmpFile = WScript.ScriptFullName.replace(/\.[^.]+$/, "") + "-exec." + (isJs ? "js" : "vbs");

   var fso = new ActiveXObject("Scripting.FileSystemObject");
   var textStream = fso.CreateTextFile(tmpFile, true /*overwrite*/, true /*unicode*/);
   textStream.Write(AkelPad.GetSelText() || AkelPad.GetTextRange(0, -1));
   textStream.Close();

   AkelPad.Call("Scripts::Main", 1, fso.GetFileName(tmpFile));
   AkelPad.Call("Scripts::Main", 1, WScript.ScriptName, "\"-fileToDelete='" + tmpFile.replace(/[\\'"]/g, "\\$&") + "'\"");
}
else if(isJs)
   eval(AkelPad.GetSelText() || (onlySelected ? "" : AkelPad.GetTextRange(0, -1)));
else if(isVbs)
   AkelPad.Call("Scripts::Main", 1, WScript.ScriptName.replace(/\.[^.]+$/, "") + ".vbs", "-onlySelected=" + onlySelected);

function getExt(path) {
   return /\.([^.]+)$/.test(path) ? RegExp.$1 : "";;
}
function isJsFile(path) {
   return /^js(m|on)?$/.test(getExt(path));
}
function isVbsFile(path) {
   return /^(bas|vb[s5]?|wbt|frm)$/.test(getExt(path));
}

function getArg(argName, defaultVal) {
   var args = {};
   for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; i++)
      if(/^[-\/](\w+)(=(.+))?$/i.test(WScript.Arguments(i)))
         args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
   getArg = function(argName, defaultVal) {
      argName = argName.toLowerCase();
      return typeof args[argName] == "undefined" // argName in args
         ? defaultVal
         : args[argName];
   };
   return getArg(argName, defaultVal);
}
<download | mirror | development version>
executeScript.vbs
Code:
' http://akelpad.sourceforge.net/forum/viewtopic.php?p=11863#11863
' http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.js
' http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.vbs

' version 0.1.2 - 2011-04-11

' Supplemental script for runScript.js
' Executes selected or all code

option explicit
dim onlySelected
if WScript.Arguments.length then
   onlySelected = WScript.Arguments(0) = "-onlySelected=true"
else
   onlySelected = false
end if

if onlySelected <> true and AkelPad.GetSelStart = AkelPad.GetSelEnd then
   executeGlobal AkelPad.GetTextRange(0, -1)
else
   executeGlobal AkelPad.GetSelText
end if
(supplemental) <download | mirror | development version>
Execute selected or all code.


Last edited by Infocatcher on Sat Aug 16, 2014 7:51 pm; edited 17 times in total
Back to top
View user's profile Send private message Visit poster's website
KDJ



Joined: 06 Mar 2010
Posts: 1374
Location: Poland

PostPosted: Sat Mar 12, 2011 2:08 pm    Post subject: Reply with quote

Replace replicate chars with one char.

ReplaceReplicateCharsWithOne.js

Code:
// Replace replicate chars with one char - 2011-03-12
//
// Call("Scripts::Main", 1, "ReplaceReplicateCharsWithOne.js")

var oSys = AkelPad.SystemFunction();

if (oSys.Call("kernel32::GetUserDefaultLangID") == 0x0415) //Polish
{
  var pTxtCaption = "Zamień powtórzenia znaków na jeden";
  var pTxtLabel   = "Podaj znaki do zamiany (jeśli puste, będą zamienione wszystkie):";
}
else
{
  var pTxtCaption = "Replace replicate chars with one char";
  var pTxtLabel   = "Input chars to replace (if blank, it will be replaced all):";
}

var hEditWnd = AkelPad.GetEditWnd();
var pChars;
var pSelTxt;
var rRE;
var i;

if (hEditWnd)
{
  if (AkelPad.GetSelStart() == AkelPad.GetSelEnd())
    AkelPad.SetSel(0, -1);

  pChars = AkelPad.InputBox(hEditWnd, pTxtCaption, pTxtLabel, pChars);

  if (pChars != undefined)
  {
    pSelTxt = AkelPad.GetSelText();

    if (! pChars) //replace all
      pSelTxt = pSelTxt.replace(/(.)\1+/g, "$1");

    else
    {
      for (i = 0; i < pChars.length ; ++i)
      {
        rRE = new RegExp("(" + escapeRegExp(pChars.charAt(i)) + ")\\1+", "g");
        pSelTxt = pSelTxt.replace(rRE, "$1");
      }
    }

    AkelPad.ReplaceSel(pSelTxt, 1);
  }
}

// function written by Infocatcher
function escapeRegExp(str)
{
   return str.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&");
}

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



Joined: 06 Mar 2010
Posts: 1374
Location: Poland

PostPosted: Sat Mar 12, 2011 8:51 pm    Post subject: Reply with quote

Inserts a tabulation or spaces, inversely to setting Options->Settings->Editor 1->Tab size->Spaces (bTabStopAsSpaces).

InsertTabOrSpaces.js

Code:
// InsertTabOrSpaces.js - 2011-12-05
//
// Inserts tab or spaces, inversely to setting bTabStopAsSpaces.
//
// Call("Scripts::Main", 1, "InsertTabOrSpaces.js")
//
// Can assign shortcut key, eg: Ctrl+Alt+Tab

var hMainWnd = AkelPad.GetMainWnd();
var hEditWnd = AkelPad.GetEditWnd();
var bTabStopAsSpaces;

if (hMainWnd && hEditWnd)
{
  bTabStopAsSpaces = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 53 /*FI_TABSTOPASSPACES*/, 0);

  AkelPad.SetFrameInfo(0, 2 /*FIS_TABSTOPASSPACES*/, (! bTabStopAsSpaces));

  AkelPad.Command(4164 /*IDM_EDIT_INSERT_TAB*/);

  AkelPad.SetFrameInfo(0, 2 /*FIS_TABSTOPASSPACES*/, bTabStopAsSpaces);
}



Last edited by KDJ on Mon Dec 05, 2011 8:05 pm; edited 3 times in total
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2610
Location: Киев, Русь

PostPosted: Tue Mar 15, 2011 10:07 am    Post subject: ini и "Избранное" Reply with quote

работа с настройками: Settings.js

Code:
///Script "library" for working with settings
///Скрипт-"библиотека" для работы с настройками плагинов (nSubDir=4) и скриптов (nSubDir=5)
// must be placed in ...\Scripts\Include\
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11993#11993
// Version: 1.1 (2011.10.20)

var oSet;

function SettingsRead(nSubDir /*поддерживается 4 и 5 - см. AkelPad.GetAkelDir()*/, pFileName, pParameterName, nType /*см. oSet.Read()*/)
{
   var vResult;
   if (SettingsOpen(nSubDir, pFileName, 0x1 /*POB_READ*/))
      vResult = oSet.Read(pParameterName, nType);
   return vResult;
}

function SettingsWrite(nSubDir, pFileName, pParameterName, nType, vParameterValue)
{
   var bResult = false;
   if (SettingsOpen(nSubDir, pFileName, 0x2 /*POB_SAVE*/))
   {
      oSet.Write(pParameterName, nType, vParameterValue);
      oSet.End();
   }
   return bResult;
}

function SettingsDelete(nSubDir, pFileName, pParameterName)
{
   var bResult = false;
   if (SettingsOpen(nSubDir, pFileName, 0x2 /*POB_SAVE*/))
   {
      oSet.Delete(pParameterName);
      oSet.End();
   }
   return bResult;
}


function SettingsOpen(nSubDir, pFileName, nFlags /*см. oSet.Begin()*/)
{
   oSet = AkelPad.ScriptSettings();
   return oSet.Begin(((nSubDir == 4) ? "..\\" : "") + pFileName, nFlags);
}

работа с внешними ini-файлами: INI.js

Code:
///Script "library" for working with ini-files
///Скрипт-"библиотека" для работы с внешними ini-файлами; имя секции не учитывается!
// must be placed in ...\Scripts\Include\
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11993#11993
// Version: 1.0 (2011.03.15)

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

//"Класс"-объект для одноразового чтения/записи значения в параметр ini-файла
var oINI =
{
   file: {               //необходимые параметры файла
      name: "",         //полное имя файла
      text: ""            //полное содержимое
   },
   value: {            //значение параметра
      start: 0,            //позиция начала параметра в файле
      end: 0            //позиция окончания параметра в файле
   },
   
   //Установка файла и получение его содержимого
   setFile: function(pFileName)
   {
      this.file.name = pFileName;
      if (fso.FileExists(pFileName) == true)
      {
         this.file.text = AkelPad.ReadFile(pFileName);
         return true
      }
      else
         return false
   },
   
   //Получение границ значения параметра
   getParameter: function(pParamName)
   {
      this.value.start = this.file.text.indexOf(pParamName);
      
      if (this.value.start >= 0)
      {
         this.value.start = this.file.text.indexOf("=", this.value.start) + 1;
         this.value.end = this.file.text.indexOf("\r\n", this.value.start);
         return true
      }
      else
         return false
   },
   
   //Получение значения параметра
   read: function(pParamName)
   {
      if (this.getParameter(pParamName))
         return this.file.text.substring(this.value.start, this.value.end)
      else
         return ""
   },
   
   //Запись значения параметра
   write: function(pParamName, pParamValue)      //чтобы удалить параметр из ini, передавайте в значении null
   {
      var fw;
      if (this.getParameter(pParamName))
      {
         fw = fso.OpenTextFile(this.file.name, 2 /*ForWriting*/, (pParamValue != null), true);
         if (fw)
         {
            if (pParamValue != null)
            {
               //изменение значения параметра
               this.file.text = this.file.text.substring(0, this.value.start) + pParamValue + this.file.text.substring(this.value.end);
            }
            else
            {
               //удаление параметра
               this.value.start = this.file.text.indexOf(pParamName) - 1;
               this.file.text = this.file.text.substring(0, this.value.start) + this.file.text.substring(this.value.end);
            }
            
            fw.Write(this.file.text);
            fw.Close();
         }
      }
      else
      {
         if (pParamValue != null)
         {
            //добавление параметра (если его не было)
            fw = fso.OpenTextFile(this.file.name, 8 /*ForAppend*/, true, true);
            fw.Write(pParamName + "=" + pParamValue);
            fw.WriteBlankLines(1);
            fw.Close();
         }
      }
   }
   
};


работа с "Избранным": Favourites.js

Code:
///Export/Replace Favourites-menu
///Работа с меню «Избранное»: экспорт / замена / очистка
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11993#11993
// Version: 1.6 (2011.07.18)
//
//  -"Экспортировать..." Call("Scripts::Main", 1, "Favourites.js", "1")
//  -"Импортировать (заменить)..." Call("Scripts::Main", 1, "Favourites.js", "2")
//  -"Очистить избранное..." Call("Scripts::Main", 1, "Favourites.js", "0") Icon("%a\AkelFiles\Plugs\ContextMenu.dll", 6)

var pDefFileName = "MyFavourites(AkelPad)";
var pDefFileExt = "mnu";
var pFavTextParam = "FavText";

var pMenuFileName = "ContextMenu.ini";
var pMenuFile = AkelPad.GetAkelDir(4) /*ADTYPE_PLUGS*/ + "\\" + pMenuFileName;

if (! AkelPad.Include("INI.js")) WScript.Quit();
if (! oINI.setFile(pMenuFile))
{
   AkelPad.MessageBox(AkelPad.GetMainWnd(), pMenuFileName + " not found...", WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
   WScript.Quit();
}
if (! WScript.Arguments.length)
{
   AkelPad.MessageBox(AkelPad.GetMainWnd(), "Arguments not found!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
   WScript.Quit();
}
var nActn = parseInt(WScript.Arguments(0));

var pFavFile = "";
if (! AkelPad.Include("CommonFunctions.js")) WScript.Quit();

var pFavFileText = oINI.read(pFavTextParam);

if (nActn == 1)      //Экспорт
{
   if (pFavFileText)
   {
      pFavFile = FileDialogDefault(false, pDefFileName, pDefFileExt);
      if (pFavFile)
      {
         pFavFile = CorrectFileNameFull(pFavFile);
         if (pFavFile)
         {
            var nOverwrite = 6 /*IDYES*/;
            if (fso.FileExists(pFavFile) == true)
               nOverwrite = AkelPad.MessageBox(AkelPad.GetMainWnd(), "File already exist. Replace it?", WScript.ScriptName, 32 /*MB_ICONQUESTION*/ + 4 /*MB_YESNO*/);
            
            if (nOverwrite == 6)
            {
               var fc = fso.CreateTextFile(pFavFile, true, true);
               fc.Write(pFavFileText);
               fc.Close();
               AkelPad.MessageBox(AkelPad.GetMainWnd(), "Favourites exported successfully.", WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
            }
         }
      }
   }
   else
      AkelPad.MessageBox(AkelPad.GetMainWnd(), "Favourites not found...", WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
}
else      //Импорт или Очистка
{
   var bRunning = (nActn == 2 || (nActn == 0 && pFavFileText));      //при импорте возможно всегда, а при очистке, только если есть что очищать
   
   if (bRunning)
   {
      if (pFavFileText)         //диалог с предупреждением о замене выводим только тогда, когда есть заменяемый текст
         bRunning = (AkelPad.MessageBox(AkelPad.GetMainWnd(), "Favorites will be replaced, continue?", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/ + 4 /*MB_YESNO*/) == 6);
      
      if (bRunning)
      {
         if (nActn == 2)      //Импорт (замена)
         {
            pFavFile = FileDialogDefault(true, pDefFileName, pDefFileExt);
            if (pFavFile)
            {
               pFavFileText = AkelPad.ReadFile(pFavFile);
               if (!pFavFileText)
               {
                  AkelPad.MessageBox(AkelPad.GetMainWnd(), "Choosed file is empty!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
                  WScript.Quit();
               }
            }
            else
               WScript.Quit();      //в диалоге выбрали "Отмена"
         }
         else      //Очистка всего списка
            pFavFileText = "";
         
         //корректно перезаписываем Favorites-меню с немедленным отображением изменений (code from Instructor)
         bRunning = false;
         
         if (AkelPad.IsPluginRunning("ContextMenu::Main"))
            bRunning = (AkelPad.Call("ContextMenu::Main", 10) != -1);      //отключаем плагин
         
         oINI.write(pFavTextParam, pFavFileText);
         
         if (bRunning)
            AkelPad.Call("ContextMenu::Main", 10);                                 //включаем плагин
         
         if (nActn == 2)
            AkelPad.MessageBox(AkelPad.GetMainWnd(), "Favourites replaced successfully.", WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
      }
   }
}

N.B.: В коде используется CommonFunctions.js и INI.js.

Благодарности: Instructor'у за реализацию возможности немедленного обновления меню!


Last edited by VladSh on Thu Oct 20, 2011 10:34 am; edited 8 times in total
Back to top
View user's profile Send private message Visit poster's website
KDJ



Joined: 06 Mar 2010
Posts: 1374
Location: Poland

PostPosted: Tue Mar 15, 2011 8:05 pm    Post subject: Reply with quote

Restores default value URL prefixes (Options->Settings->Editor 2->Prefixes).

ResetUrlPrefixes.js

Code:
// ResetUrlPrefixes.js - 2011-12-15
//
// Reset URL prefixes.
//
// Call("Scripts::Main", 1, "ResetUrlPrefixes.js")

var URL_PREFIXES_SIZE = 128;

var hMainWnd  = AkelPad.GetMainWnd();
var hEditWnd  = AkelPad.GetEditWnd();
var sPrefixes = "";
var sPrefix1;
var lpBuffer;
var nOffset;

if (hMainWnd && hEditWnd)
{
  lpBuffer = AkelPad.MemAlloc(URL_PREFIXES_SIZE * _TSIZE);

  AkelPad.SendMessage(hEditWnd, 3252 /*AEM_SETURLPREFIXES*/, 0, 0);
  AkelPad.SendMessage(hEditWnd, 3251 /*AEM_GETURLPREFIXES*/, URL_PREFIXES_SIZE, lpBuffer);

  do
  {
    nOffset    = sPrefixes.length * _TSIZE;
    sPrefix1   = AkelPad.MemRead(lpBuffer + nOffset, _TSTR);
    sPrefixes += sPrefix1 + " ";
  }
  while (sPrefix1);
  sPrefixes = sPrefixes.replace(/ +$/, ""); //Rtrim

  AkelPad.MemCopy(lpBuffer, sPrefixes, _TSTR);
  AkelPad.SetFrameInfo(0, 41 /*FIS_URLPREFIXES*/, lpBuffer);

  AkelPad.MemFree(lpBuffer);
}



Last edited by KDJ on Thu Dec 15, 2011 7:09 pm; edited 3 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1374
Location: Poland

PostPosted: Tue Mar 15, 2011 8:12 pm    Post subject: Reply with quote

Restores default value URL delimiters (Options->Settings->Editor 2->Delimiters).

ResetUrlDelimiters.js

Code:
// ResetUrlDelimiters.js - 2011-12-15
//
// Reset URL delimiters.
//
// Call("Scripts::Main", 1, "ResetUrlDelimiters.js")      - reset left and right delimiters
// Call("Scripts::Main", 1, "ResetUrlDelimiters.js", "L") - reset left delimiters
// Call("Scripts::Main", 1, "ResetUrlDelimiters.js", "R") - reset right delimiters

var URL_DELIMITERS_SIZE = 128;

var hMainWnd = AkelPad.GetMainWnd();
var hEditWnd = AkelPad.GetEditWnd();
var lpBuffer;
var sAction;

if (WScript.Arguments.length)
{
  sAction = WScript.Arguments(0);
  if ((sAction != "L") && (sAction != "R"))
  {
    WScript.Echo("Incorrect script argument: " + sAction);
    WScript.Quit();
  }
}

if (hMainWnd && hEditWnd)
{
  lpBuffer = AkelPad.MemAlloc(URL_DELIMITERS_SIZE * _TSIZE);

  if ((! sAction) || (sAction == "L"))
  {
    AkelPad.SendMessage(hEditWnd, 3248 /*AEM_SETURLLEFTDELIMITERS*/, 0, 0);
    AkelPad.SendMessage(hEditWnd, 3247 /*AEM_GETURLLEFTDELIMITERS*/, URL_DELIMITERS_SIZE, lpBuffer);
    AkelPad.SetFrameInfo(0, 46 /*FIS_URLLEFTDELIMITERS*/, lpBuffer);
  }

  if ((! sAction) || (sAction == "R"))
  {
    AkelPad.SendMessage(hEditWnd, 3250 /*AEM_SETURLRIGHTDELIMITERS*/, 0, 0);
    AkelPad.SendMessage(hEditWnd, 3249 /*AEM_GETURLRIGHTDELIMITERS*/, URL_DELIMITERS_SIZE, lpBuffer);
    AkelPad.SetFrameInfo(0, 50 /*FIS_URLRIGHTDELIMITERS*/, lpBuffer);
  }

  AkelPad.MemFree(lpBuffer);
}



Last edited by KDJ on Thu Dec 15, 2011 7:10 pm; edited 3 times in total
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1620

PostPosted: Sun Mar 20, 2011 8:26 pm    Post subject: Reply with quote

measuresConverter.js <download | mirror | development version>
Convert measures (internal) and currency (used cached data from exchange-rates.org, fxexchangerate.com and bitcoincharts.com).
Can convert numbers and expressions, pick up selected text.

Screenshots



Post size limit, here is packed file:
measuresConverter.uue
Code:
begin 644 measuresConverter.7z
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
6%`H!```ASI9=:<\!%08!`"``````````
`
end
sum -r/size 31385/22117

Save as text file with .uue extension, unpack with Total Commander or WinRAR. And unpack .7z with WinRAR or 7-Zip.


Last edited by Infocatcher on Wed May 07, 2014 11:31 am; edited 13 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2610
Location: Киев, Русь

PostPosted: Thu Mar 24, 2011 12:07 pm    Post subject: ассоциирование файлов Reply with quote

reassoc.js

Code:
///Associating with program the file extensions, listed in AkelPad.ini
///Ассоциирование с программой расширений, указанных в AkelPad.ini
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12169#12169
// Version: 1.2 (2011.03.24)
//
// -"Files associating" Call("Scripts::Main", 1, "reassoc.js")                        - reassoc all operations
// -"Files associating (Edit)" Call("Scripts::Main", 1, "reassoc.js", "Edit")      - reassoc Edit operation only

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

var pMenuFileName = "AkelPad.ini";
var pMenuFile = AkelPad.GetAkelDir(0) /*ADTYPE_ROOT*/ + "\\" + pMenuFileName;

if (! oINI.setFile(pMenuFile))
{
   AkelPad.MessageBox(AkelPad.GetMainWnd(), pMenuFileName + " not found...", WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
   WScript.Quit();
}

var arrOperations;
if (WScript.Arguments.length)
   arrOperations = [WScript.Arguments(0)];
if (!arrOperations) arrOperations = ["Open", "Edit", "Print"];

var WshShell = new ActiveXObject("WScript.Shell");

for (var nOper = 0; nOper < arrOperations.length; nOper++)
{
   var sExts = oINI.read("FileTypes" + arrOperations[nOper]);
   if (sExts) reassocList(sExts.split(";"), arrOperations[nOper].toLowerCase(), '"' + AkelPad.GetAkelDir(0) + '\\AkelPad.exe" "%1"', "AkelUndo");
}

AkelPad.MessageBox(AkelPad.GetMainWnd(), "Ассоциирование типов файлов с программой выполнено.", WScript.ScriptName, 64);


function reassocList(arrExt, pOreration, pCommandLineNew, pUndoParamName)
{
   for (var nExt = 0; nExt < arrExt.length; nExt++)
      reassocExt(arrExt[nExt], pOreration, pCommandLineNew, pUndoParamName);
}

function reassocExt(pExt, pOreration, pCommandLineNew, pUndoParamName)
{
   //Определяем имя секции с настройками расширения, если оно зарегистрировано
   var pExtSectionPName = "HKCR\\." + pExt + "\\";
   var pExtSectionName = RegRead(pExtSectionPName);      //читаем сразу значение по умолчанию (имя секции с настройками)
   
   if (!pExtSectionName)      //если расширение не зарегистрировано или не ссылается на секцию с настройками
   {
      pExtSectionName = pExt + "file";
      WshShell.RegWrite(pExtSectionPName, pExtSectionName, "REG_SZ");      //записываем значение по умолчанию (имя секции с настройками)
   }
   
   //Работаем с секцией настроек расширения
   var pCommandSectionName = "HKCR\\" + pExtSectionName + "\\shell\\" + pOreration + "\\command\\";
   var pCommandLine = RegRead(pCommandSectionName);      //читаем сразу значение командной строки, возможно структура разделов есть, и оно заполнено
   
   if (pCommandLine != '"%1" %*')      //если это не исполняемый файл, - реассоциируем
   {
      if (pCommandLine != pCommandLineNew)      //если командные строки разные
      {
         if (pCommandLine)      //если в старой командной строке что-то есть, - сгружаем в параметр pUndoParamName
            RegWriteSZ(pCommandSectionName + pUndoParamName, pCommandLine);
         
         RegWriteSZ(pCommandSectionName, pCommandLineNew);      //записываем новое значение по умолчанию
      }
   }
}

function RegRead(pPath)
{
   try
      { return WshShell.RegRead(pPath) }
   catch(e)
      { return null }
}

function RegWriteSZ(pSection, pValue)
{
   var arrValue = pValue.split('" "');
   var pType = (arrValue[0].charAt(0) == "%") ? "REG_EXPAND_SZ" : "REG_SZ";
   WshShell.RegWrite(pSection, pValue, pType);
}

N.B.: В коде используется INI.js.


Last edited by VladSh on Thu Jul 21, 2011 3:22 pm; edited 1 time in total
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3 ... 9, 10, 11 ... 17, 18, 19  Next
Page 10 of 19

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


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