Scripts collection

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11387#p11387
// 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#p4222
// 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).

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11387#p11387
// 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#p4222
// 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).

Code: Select all

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

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

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

Code: Select all

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

Offline
Posts: 767
Joined: Mon Sep 28, 2009 10:03 am
Location: Minsk, Belarus

Post by se7h »

Code: Select all

/// WinMerge v0.4.1
// (с) se7h, VladSh 
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11455#p11455 
// 
// 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#p1582


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

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

Post by KDJ »

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11473#p11473
// Version: 2015-09-19
// Author: KDJ
//
// *** Regular expression tester for JavaScript ***
//
// Usage:
//   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 aWnd        = [];
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 aCol       = [];
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
aWnd[IDREGEXP   ] = ["BUTTON",  0,       0, 0x50000007,   7,  10, 491, 140, pTxtRegExp];
aWnd[IDSOURCE   ] = ["STATIC",  0,       0, 0x50000000,  15,  27, 150,  13, pTxtSource];
aWnd[IDESCAPE   ] = ["BUTTON",  0,       0, 0x50010000, 180,  23, 100,  20, pTxtEscape];
aWnd[IDUNESCAPE ] = ["BUTTON",  0,       0, 0x50010000, 285,  23, 100,  20, pTxtUnEscape];
aWnd[IDCOPYSOU  ] = ["BUTTON",  0,       0, 0x50010000, 390,  23, 100,  20, pTxtCopyPaste];
aWnd[IDEDSOURCE ] = ["EDIT",    0,   0x200, 0x50210004,  15,  45, 475,  35, ""];
aWnd[IDRE       ] = ["STATIC",  0,       0, 0x50000000,  15,  92,  30,  13, pTxtRE];
aWnd[IDIGCASE   ] = ["BUTTON",  0,       0, 0x50010003,  50,  92,  70,  16, pTxtIgCase];
aWnd[IDGLOBAL   ] = ["BUTTON",  0,       0, 0x50010003, 133,  92,  55,  16, pTxtGlobal];
aWnd[IDMULTIL   ] = ["BUTTON",  0,       0, 0x50010003, 190,  92,  55,  16, pTxtMultiL];
aWnd[IDCOLLECT  ] = ["BUTTON",  0,       0, 0x50010000, 285,  88, 100,  20, pTxtCollect];
aWnd[IDCOPYRE   ] = ["BUTTON",  0,       0, 0x50010000, 390,  88, 100,  20, pTxtCopyPaste];
aWnd[IDEDRE     ] = ["EDIT",    0,   0x200, 0x50210004,  15, 110, 475,  35, pREStr];
aWnd[IDSTRING   ] = ["BUTTON",  0,       0, 0x50000007,   7, 160, 491, 145, pTxtString];
aWnd[IDNEWLINE  ] = ["STATIC",  0,       0, 0x50000000,  50, 177,  70,  13, pTxtNewLine];
aWnd[IDNLWIN    ] = ["BUTTON",  0,       0, 0x50000009, 120, 177,  70,  16, pTxtNLWin];
aWnd[IDNLUNIX   ] = ["BUTTON",  0,       0, 0x50000009, 200, 177,  70,  16, pTxtNLUnix];
aWnd[IDNLMAC    ] = ["BUTTON",  0,       0, 0x50000009, 270, 177,  70,  16, pTxtNLMac];
aWnd[IDCOPYSTR  ] = ["BUTTON",  0,       0, 0x50010000, 390, 173, 100,  20, pTxtCopyPaste];
aWnd[IDEDSTRING ] = ["EDIT",    0,   0x200, 0x50310004,  15, 195, 475, 105, pString];
aWnd[IDACTION   ] = ["BUTTON",  0,       0, 0x50000007,   7, 315, 491,  65, pTxtAction];
aWnd[IDMETEST   ] = ["BUTTON",  0,       0, 0x50000009,  15, 335,  85,  16, pTxtMeTest];
aWnd[IDMEEXEC   ] = ["BUTTON",  0,       0, 0x50000009, 115, 335,  85,  16, pTxtMeExec];
aWnd[IDMESEARCH ] = ["BUTTON",  0,       0, 0x50000009, 215, 335,  85,  16, pTxtMeSearch];
aWnd[IDMEMATCH  ] = ["BUTTON",  0,       0, 0x50000009, 315, 335,  85,  16, pTxtMeMatch];
aWnd[IDMESPLIT  ] = ["BUTTON",  0,       0, 0x50000009, 415, 335,  75,  16, pTxtMeSplit];
aWnd[IDMEREPLACE] = ["BUTTON",  0,       0, 0x50000009,  15, 355, 120,  16, pTxtMeReplace];
aWnd[IDEDWITH   ] = ["EDIT",    0,   0x200, 0x50010080, 135, 355, 355,  20, pWith];
aWnd[IDRESULT   ] = ["BUTTON",  0,       0, 0x50000007,   7, 390, 491, 145, pTxtResult];
aWnd[IDLASTIND  ] = ["STATIC",  0,       0, 0x50000000,  50, 407, 130,  13, pTxtLastInd];
aWnd[IDRESETIND ] = ["BUTTON",  0,       0, 0x50010000, 180, 403, 100,  20, pTxtResetInd];
aWnd[IDCOPYRES  ] = ["BUTTON",  0,       0, 0x50010000, 390, 403, 100,  20, pTxtCopy];
aWnd[IDEDRESULT ] = ["EDIT",    0,   0x200, 0x50310804,  15, 425, 475, 105, ""];
aWnd[IDGLOBPRO  ] = ["BUTTON",  0,       0, 0x50000007,   7, 545, 381, 125, pTxtGlobPro];
aWnd[IDEDGLOBPRO] = ["EDIT",    0,   0x200, 0x50310804,  15, 560, 365, 105, ""];
aWnd[IDTEST     ] = ["BUTTON",  0,       0, 0x50010001, 395, 550, 100,  23, pTxtTest];
aWnd[IDHELP     ] = ["BUTTON",  0,       0, 0x50010000, 395, 575, 100,  23, pTxtHelp];
aWnd[IDOPAQMINUS] = ["BUTTON",  0,       0, 0x50010000, 395, 600, 100,  23, pTxtOpaqMinus];
aWnd[IDOPAQPLUS ] = ["BUTTON",  0,       0, 0x50010000, 395, 625, 100,  23, pTxtOpaqPlus];
aWnd[IDCLOSE    ] = ["BUTTON",  0,       0, 0x50010000, 395, 650, 100,  23, pTxtClose];

aCol[IDNAME     ] = ["BUTTON",  0,       0, 0x50000007,  10,  10, 260,  30, pTxtName];
aCol[IDLIST     ] = ["LISTBOX", 0,       0, 0x50A10003,  10,  30, 260, 270, ""];
aCol[IDVALUE    ] = ["BUTTON",  0,       0, 0x50000007, 280,  40, 225, 235, pTxtValue];
aCol[IDREVAL    ] = ["STATIC",  0,       0, 0x50002000, 285,  60, 215, 210, ""];
aCol[IDADD      ] = ["BUTTON",  0,       0, 0x50010000,  10, 290,  95,  23, pTxtAdd];
aCol[IDRENAME   ] = ["BUTTON",  0,       0, 0x50010000, 110, 290,  95,  23, pTxtRename];
aCol[IDDELETE   ] = ["BUTTON",  0,       0, 0x50010000, 210, 290,  95,  23, pTxtDelete];
aCol[IDOK       ] = ["BUTTON",  0,       0, 0x50010001, 310, 290,  95,  23, pTxtOK];
aCol[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 < aWnd.length; ++i)
    {
      aWnd[i][WND] = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                               aWnd[i][WNDEXSTY], //dwExStyle
                               aWnd[i][WNDTYPE],  //lpClassName
                               0,                 //lpWindowName
                               aWnd[i][WNDSTY],   //dwStyle
                               aWnd[i][WNDX],     //x
                               aWnd[i][WNDY],     //y
                               aWnd[i][WNDW],     //nWidth
                               aWnd[i][WNDH],     //nHeight
                               hWnd,              //hWndParent
                               i,                 //ID
                               hInstanceDLL,      //hInstance
                               0);                //lpParam
      //Set font and text
      SetWndFontAndText(aWnd[i][WND], hGuiFont, aWnd[i][WNDTXT]);
    }

    //Set limit edit text
    AkelPad.SendMessage(aWnd[IDEDSOURCE ][WND], 197 /*EM_SETLIMITTEXT*/, 256, 0);
    AkelPad.SendMessage(aWnd[IDEDRE     ][WND], 197 /*EM_SETLIMITTEXT*/, 256, 0);
    AkelPad.SendMessage(aWnd[IDEDSTRING ][WND], 197 /*EM_SETLIMITTEXT*/, nBufSize - 1, 0);
    AkelPad.SendMessage(aWnd[IDEDWITH   ][WND], 197 /*EM_SETLIMITTEXT*/, 256, 0);
    AkelPad.SendMessage(aWnd[IDEDRESULT ][WND], 197 /*EM_SETLIMITTEXT*/, nBufSize - 1, 0);
    AkelPad.SendMessage(aWnd[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 = aWnd[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 != aWnd[IDESCAPE   ][WND]) && (hFocus != aWnd[IDUNESCAPE ][WND]) &&
            (hFocus != aWnd[IDCOPYSOU  ][WND]) && (hFocus != aWnd[IDCOLLECT  ][WND]) &&
            (hFocus != aWnd[IDCOPYRE   ][WND]) && (hFocus != aWnd[IDCOPYSTR  ][WND]) &&
            (hFocus != aWnd[IDRESETIND ][WND]) && (hFocus != aWnd[IDCOPYRES  ][WND]) &&
            (hFocus != aWnd[IDTEST     ][WND]) && (hFocus != aWnd[IDHELP     ][WND]) &&
            (hFocus != aWnd[IDOPAQMINUS][WND]) && (hFocus != aWnd[IDOPAQPLUS ][WND]) &&
            (hFocus != aWnd[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(aWnd[IDEDSOURCE][WND], 0x00B1 /*EM_SETSEL*/, oSel.Source1, oSel.Source2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.Source1 = LoWord(AkelPad.SendMessage(aWnd[IDEDSOURCE][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.Source2 = HiWord(AkelPad.SendMessage(aWnd[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(aWnd[IDEDRE][WND], 0x00B1 /*EM_SETSEL*/, oSel.RE1, oSel.RE2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.RE1 = LoWord(AkelPad.SendMessage(aWnd[IDEDRE][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.RE2 = HiWord(AkelPad.SendMessage(aWnd[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(aWnd[IDEDSTRING][WND], 0x00B1 /*EM_SETSEL*/, oSel.String1, oSel.String2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.String1 = LoWord(AkelPad.SendMessage(aWnd[IDEDSTRING][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.String2 = HiWord(AkelPad.SendMessage(aWnd[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(aWnd[IDEDWITH][WND], 0x00B1 /*EM_SETSEL*/, oSel.With1, oSel.With2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.With1 = LoWord(AkelPad.SendMessage(aWnd[IDEDWITH][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.With2 = HiWord(AkelPad.SendMessage(aWnd[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(aWnd[IDEDRESULT][WND], 0x00B1 /*EM_SETSEL*/, oSel.Result1, oSel.Result2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.Result1 = LoWord(AkelPad.SendMessage(aWnd[IDEDRESULT][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.Result2 = HiWord(AkelPad.SendMessage(aWnd[IDEDRESULT][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
      }
    }
    else if (nLowParam == IDEDGLOBPRO)
    {
      if (nHiwParam == 0x0100 /*EN_SETFOCUS*/)
        AkelPad.SendMessage(aWnd[IDEDGLOBPRO][WND], 0x00B1 /*EM_SETSEL*/, oSel.GlobPro1, oSel.GlobPro2);
      else if (nHiwParam == 0x0200 /*EN_KILLFOCUS*/)
      {
        oSel.GlobPro1 = LoWord(AkelPad.SendMessage(aWnd[IDEDGLOBPRO][WND], 0x00B0 /*EM_GETSEL*/, 0, 0));
        oSel.GlobPro2 = HiWord(AkelPad.SendMessage(aWnd[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") == aWnd[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(_PtrAdd(lpRect,  0), DT_DWORD);
  rcRect.top    = AkelPad.MemRead(_PtrAdd(lpRect,  4), DT_DWORD);
  rcRect.right  = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD);
  rcRect.bottom = AkelPad.MemRead(_PtrAdd(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 lpAlpha;
  var nStyle;

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

  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 < aWnd.length) && (hFocus != aWnd[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(aWnd[IDIGCASE][WND], BM_GETCHECK, 0, 0);
    bGlobal = AkelPad.SendMessage(aWnd[IDGLOBAL][WND], BM_GETCHECK, 0, 0);
    bMultiL = AkelPad.SendMessage(aWnd[IDMULTIL][WND], BM_GETCHECK, 0, 0);

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

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

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

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

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

  oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[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(aWnd[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, aWnd[nIDED][WND], lpBuffer, nBufSize);

  rcWnd = GetWindowPos(aWnd[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(aWnd[nIDED][WND], hGuiFont, AkelPad.GetClipboardText());
      bIsChange = 1;
    }
  }
  else if (nCmd == 4)
  {
    if (AkelPad.GetSelText(3 /*\r\n*/) != AkelPad.MemRead(lpBuffer, _TSTR))
    {
      SetWndFontAndText(aWnd[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(aWnd[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, aWnd[IDEDSOURCE][WND], lpBuffer, nBufSize);
  pSource = AkelPad.MemRead(lpBuffer, _TSTR);

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

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

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

  oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[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(aWnd[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(aWnd[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, aWnd[IDEDRE][WND], lpBuffer, nBufSize);
  pREStr = AkelPad.MemRead(lpBuffer, _TSTR);
  if (! pREStr)
  {
    AkelPad.MessageBox(hWndDlg, pTxtNoRE, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    oSys.Call("user32::SetFocus", aWnd[IDEDRE][WND]);
    return;
  }

  oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[IDEDSTRING][WND], lpBuffer, nBufSize);
  pString = AkelPad.MemRead(lpBuffer, _TSTR);
  if (! pString)
  {
    AkelPad.MessageBox(hWndDlg, pTxtNoStr, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    oSys.Call("user32::SetFocus", aWnd[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, aWnd[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, aWnd[IDEDWITH][WND], lpBuffer, nBufSize);
    pWith   = AkelPad.MemRead(lpBuffer, _TSTR);
    pResult = pString.replace(oRE, pWith);
  }

  SetWndFontAndText(aWnd[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(aWnd[IDEDGLOBPRO][WND], hGuiFont, pResult);

  oSys.Call("user32::SetFocus", aWnd[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 < aCol.length; ++i)
    {
      aCol[i][WND] = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                               aCol[i][WNDEXSTY], //dwExStyle
                               aCol[i][WNDTYPE],  //lpClassName
                               0,                 //lpWindowName
                               aCol[i][WNDSTY],   //dwStyle
                               aCol[i][WNDX],     //x
                               aCol[i][WNDY],     //y
                               aCol[i][WNDW],     //nWidth
                               aCol[i][WNDH],     //nHeight
                               hWnd,              //hWndParent
                               i,                 //ID
                               hInstanceDLL,      //hInstance
                               0);                //lpParam
      SetWndFontAndText(aCol[i][WND], hGuiFont, aCol[i][WNDTXT]);
    }

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

    CheckButtonsCollection();
  }

  else if (uMsg == 7) //WM_SETFOCUS
  {
    oSys.Call("user32::SetFocus", aCol[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(aCol[IDLIST][WND], 0x0188 /*LB_GETCURSEL*/, 0, 0);
      if (nPos >= 0)
      {
        i = AkelPad.SendMessage(aCol[IDLIST][WND], 0x0199 /*LB_GETITEMDATA*/, nPos, 0);
        SetWndFontAndText(aWnd[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 < aCol.length) && (hFocus != aCol[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, aWnd[IDEDRE][WND], lpBuffer, nBufSize);
  if (AkelPad.MemRead(lpBuffer, _TSTR))
    bEnable = 1;
  else
    bEnable = 0;
  oSys.Call("user32::EnableWindow", aCol[IDADD][WND], bEnable);

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

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

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

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

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

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

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

}
Last edited by KDJ on Sat Sep 19, 2015 3:43 pm, edited 24 times in total.

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

Post by KDJ »

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.

Code: Select all

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

  oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[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(aCol[IDLIST][WND], 0x018B /*LB_GETCOUNT*/, 0, 0); ++nPos)
        {
          if (AkelPad.SendMessage(aCol[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(aCol[IDLIST][WND], 0x0188 /*LB_GETCURSEL*/, 0, 0);
    if (nPos >= 0)
    {
      i = AkelPad.SendMessage(aCol[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(aCol[IDLIST][WND], 0x018B /*LB_GETCOUNT*/, 0, 0); ++nPos)
            {
              if (AkelPad.SendMessage(aCol[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(aCol[IDLIST][WND], 0x0180 /*LB_ADDSTRING*/, 0, lpBuffer);
          if (nPos >= 0)
          {
            i = aRECol.push([pName, pREStr]) - 1;
            AkelPad.SendMessage(aCol[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(aCol[IDLIST][WND], 0x0188 /*LB_GETCURSEL*/, 0, 0);
  var bNameExist = 1;
  var nPos1;
  var i;
  var n;
  var pName;

  if (nPos >= 0)
  {
    n = AkelPad.SendMessage(aCol[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(aCol[IDLIST][WND], 0x018B /*LB_GETCOUNT*/, 0, 0); ++nPos1)
            {
              if (AkelPad.SendMessage(aCol[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(aCol[IDLIST][WND], 0x0182 /*LB_DELETESTRING*/, nPos, lpBuffer);
          nPos = AkelPad.SendMessage(aCol[IDLIST][WND], 0x0180 /*LB_ADDSTRING*/, 0, lpBuffer);
          AkelPad.SendMessage(aCol[IDLIST][WND], 0x019A /*LB_SETITEMDATA*/, nPos, n);
          SetSelRE(nPos);
        }
      }
    }
  }
}

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

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

    if (nPos == AkelPad.SendMessage(aCol[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(aCol[IDLIST][WND], 0x018B /*LB_GETCOUNT*/, 0, 0); ++nPos)
  {
    AkelPad.SendMessage(aCol[IDLIST][WND], 0x0189 /*LB_GETTEXT*/, nPos, lpBuffer);
    pName = AkelPad.MemRead(lpBuffer, _TSTR);
    if (pChar == pName.charAt(0).toUpperCase())
    {
      AkelPad.SendMessage(aCol[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, aWnd[IDEDRE][WND], lpBuffer, nBufSize);
  pREStr = AkelPad.MemRead(lpBuffer, _TSTR).replace(/[\\"]/g, "\\$&");
  oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[IDEDSTRING][WND], lpBuffer, nBufSize);
  pString = AkelPad.MemRead(lpBuffer, _TSTR).replace(/[\\"]/g, "\\$&").replace(/\r/g, "\\r").replace(/\n/g, "\\n");
  oSys.Call("user32::GetWindowText" + _TCHAR, aWnd[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:

Code: Select all

/********************************
RegExpTestJS.js - ver. 2015-09-19
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

Code: Select all

/********************************
RegExpTestJS.js - ver. 2015-09-19
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

Code: Select all

/*********************************
RegExpTestJS.js - ver. 2015-09-19
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

Code: Select all

/********************************
RegExpTestJS.js - ver. 2015-09-19
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 Sat Sep 19, 2015 3:45 pm, edited 14 times in total.

Offline
Posts: 767
Joined: Mon Sep 28, 2009 10:03 am
Location: Minsk, Belarus

Post by se7h »

Code: Select all

/// insertPathToFile v0.1.1
// (c) se7h 
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11477#p11477 
// 
// 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#p1582

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

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

Post by KDJ »

Sorting strings contained between any separators.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11749#p11749
// Version: 2015-09-19
// Author: KDJ
//
// *** Sort words ***
//
// 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(_PtrAdd(lpRect,  0), DT_DWORD);
  aRect.top    = AkelPad.MemRead(_PtrAdd(lpRect,  4), DT_DWORD);
  aRect.right  = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD);
  aRect.bottom = AkelPad.MemRead(_PtrAdd(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 19, 2015 3:49 pm, edited 7 times in total.

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

Post by Infocatcher »

Code: Select all

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

Image Image


Code: Select all

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

Code: Select all

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

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

Post by KDJ »

Replace replicate chars with one char.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11960#p11960
// Version: 2015-09-19
// Author: KDJ
//
// *** Replace replicate chars with one char ***
//
// Usage:
//   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, "\\$&");
}

Last edited by KDJ on Sat Sep 19, 2015 3:46 pm, edited 2 times in total.

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

Post by KDJ »

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11964#p11964
// Version: 2011-12-06
// Author: KDJ
//
// *** Inserts tab or spaces, inversely to setting bTabStopAsSpaces ***
//
// Usage:
//   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 Sat Dec 20, 2014 6:59 pm, edited 4 times in total.

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

ini и "Избранное"

Post by VladSh »

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11993#p11993
// Description(1033): Works with ini-files. Script implemented as the library for using in other scripts.
// Description(1049): Библиотека функций для работы с внешними ini-файлами; имя секции не учитывается!
// Version: 1.0 (2011.03.15)
// Author: VladSh

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


[more="работа с "Избранным""]

Code: Select all

// Description(1033): Export/Replace Favourites-menu
// Description(1049): Работа с меню «Избранное»: экспорт / замена / очистка
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11993#p11993
// Version: 1.7 (2014.12.17)
// Author: VladSh
// 
// Usage:
// 	-"Экспортировать..." 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;
			var sPluginFunction = "ContextMenu::Main";
			
			if (AkelPad.IsPluginRunning(sPluginFunction)) 
				bRunning = (AkelPad.Call(sPluginFunction, 10) != -1);		//отключаем плагин
			
			oINI.write(pFavTextParam, pFavFileText);
			
			if (bRunning)
				AkelPad.Call(sPluginFunction, 10);											//включаем плагин
			
			if (nActn == 2)
				AkelPad.MessageBox(AkelPad.GetMainWnd(), "Favourites replaced successfully.", WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
		}
	}
}
Благодарности: Instructor'у за реализацию возможности немедленного обновления меню!


Код, вставляемый в меню "ContextMenu::Show":

Code: Select all

"FAVOURITESMANAGE"
{
  FAVOURITES
  SEPARATOR
  "Добавить в избранное..." Favourites(1) Icon(0)
  "Управление избранным..." Favourites(3) Icon(1)
  SEPARATOR
  -"Экспортировать..." Call("Scripts::Main", 1, "Favourites.js", "1") Icon("%a\AkelFiles\Plugs\ContextMenu.dll", 4)
  -"Импортировать (заменить)..." Call("Scripts::Main", 1, "Favourites.js", "2") Icon("%a\AkelFiles\Plugs\ContextMenu.dll", 5)
  -"Очистить избранное..." Call("Scripts::Main", 1, "Favourites.js", "0") Icon("%a\AkelFiles\Plugs\ContextMenu.dll", 6)
  SEPARATOR
  -"Изменить меню..." Call("ContextMenu::Main", 1, 0, '"FAVOURITESMANAGE"')
}
Код, вставляемый в "Главное меню":

Code: Select all

"Избранное" Menu("FAVOURITESMANAGE") Index(-3)

Скрипт больше не поддерживается, т.к. не имеет смысла. Используйте SessionMenu.js.
Как пользоваться сессиями расписал здесь.
Last edited by VladSh on Thu Sep 15, 2016 7:14 pm, edited 14 times in total.

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

Post by KDJ »

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12008#p12008
// Version: 2015-01-08
// Author: KDJ
//
// *** Restore default URL prefixes ***
//
// Call:
//   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(_PtrAdd(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 Jan 08, 2015 8:29 pm, edited 5 times in total.

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

Post by KDJ »

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

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12009#p12009
// Version: 2011-12-16
// Author: KDJ
//
// *** Restore default URL delimiters ***
//
// Usage:
//   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 Sat Dec 20, 2014 7:17 pm, edited 4 times in total.

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

Post by Infocatcher »

measuresConverter.js <download | 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.
Required timer.js library!


Image Image


Post size limit, here is packed file:

Code: Select all

begin 644 measuresConverter.7z
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
*%08!`"``````````
`
end
sum -r/size 23493/30160

Save as text file with .uue extension, unpack with Total Commander or WinRAR. And unpack .7z with WinRAR or 7-Zip.
Alternative download: Infocatcher.zip (all in one).
Last edited by Infocatcher on Sun Dec 24, 2023 9:40 pm, edited 24 times in total.

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

ассоциирование файлов

Post by VladSh »

Code: Select all

// Description(1033): Associating with program the file extensions, listed in AkelPad.ini
// Description(1049): Ассоциирование с программой расширений, указанных в AkelPad.ini
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12169#p12169
// Version: 1.3 (2015.01.14)
// Author: VladSh
// 
// Usage:
// 	-"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

var oSet = AkelPad.ScriptSettings();
if (!oSet.Begin("", 0x41 /* POB_PROGRAM + POB_READ */)) {
	AkelPad.MessageBox(AkelPad.GetMainWnd(), "AkelPad settings are 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 = oSet.Read("FileTypes" + arrOperations[nOper], 3 /*PO_STRING*/);
	if (sExts) reassocList(sExts.split(";"), arrOperations[nOper].toLowerCase(), '"' + AkelPad.GetAkelDir(0) + '\\AkelPad.exe" "%1"', "AkelUndo");
}
oSet.End();

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);
}
Last edited by VladSh on Wed Jan 14, 2015 9:32 pm, edited 2 times in total.