View previous topic :: View next topic |
Author |
Message |
Infocatcher
Joined: 06 Aug 2007 Posts: 1767
|
Posted: Mon Feb 07, 2011 4:38 am Post subject: |
|
|
tabsRightLeft.js Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11387#11387
// http://infocatcher.ucoz.net/js/akelpad_scripts/tabsRightLeft.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/tabsRightLeft.js
// (c) Infocatcher 2011, 2014
// version 0.1.3 - 2014-03-03
//===================
// Switch between tabs in order of them arrangement (temporary check "Switch tabs: right-left" option)
// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#4222
// Proposed hotkeys: Ctrl+PageDown and Ctrl+PageUp
// Usage:
// Call("Scripts::Main", 1, "tabsRightLeft.js") - switch to next tab
// Call("Scripts::Main", 1, "tabsRightLeft.js", "-prev") - switch to previous tab
//===================
var next = WScript.Arguments.length ? WScript.Arguments(0) != "-prev" : true;
var hMainWnd = AkelPad.GetMainWnd();
if(hMainWnd && AkelPad.IsMDI()) {
var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
var forceRightLeft = !(tabOpts & 0x20000 /*TAB_SWITCH_RIGHTLEFT*/);
if(forceRightLeft)
AkelPad.Command(4311 /*IDM_WINDOW_TABSWITCH_RIGHTLEFT*/);
selectTab(next);
if(forceRightLeft)
AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
}
else {
AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}
function selectTab(next) {
var cmd = next ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, cmd, 0);
} |
<download | mirror | development version>
Switch between tabs in order of them arrangement (temporary check "Switch tabs: right-left" option).
tabsNextPrevious.js Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11387#11387
// http://infocatcher.ucoz.net/js/akelpad_scripts/tabsNextPrevious.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/tabsNextPrevious.js
// (c) Infocatcher 2011, 2014
// version 0.1.2 - 2014-03-03
//===================
// Switch between tabs in order of them usage (temporary check "Switch tabs: next-previous" option)
// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#4222
// Proposed hotkeys: Ctrl+PageDown and Ctrl+PageUp
// Usage:
// Call("Scripts::Main", 1, "tabsNextPrevious.js") - switch to next tab
// Call("Scripts::Main", 1, "tabsNextPrevious.js", "-prev") - switch to previous tab
//===================
var next = WScript.Arguments.length ? WScript.Arguments(0) != "-prev" : true;
var hMainWnd = AkelPad.GetMainWnd();
if(hMainWnd && AkelPad.IsMDI()) {
var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
var forceNextPrev = !(tabOpts & 0x10000 /*TAB_SWITCH_NEXTPREV*/);
if(forceNextPrev)
AkelPad.Command(4310 /*IDM_WINDOW_TABSWITCH_NEXTPREV*/);
selectTab(next);
if(forceNextPrev)
AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
}
else {
AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}
function selectTab(next) {
var cmd = next ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, cmd, 0);
} |
<download | mirror | development version>
Switch between tabs in order of them usage (temporary check "Switch tabs: next-previous" option).
tabsSwitchAlt.js Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11387#11387
// http://infocatcher.ucoz.net/js/akelpad_scripts/tabsSwitchAlt.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/tabsSwitchAlt.js
// (c) Infocatcher 2011, 2014
// version 0.1.2 - 2014-03-03
//===================
// Switch between tabs using alternative way
// (temporary check "Switch tabs: right-left" or "Switch tabs: next-previous" option)
// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#4222
// Proposed hotkeys: Ctrl+PageDown and Ctrl+PageUp
// Usage:
// Call("Scripts::Main", 1, "tabsSwitchAlt.js") - switch to next tab
// Call("Scripts::Main", 1, "tabsSwitchAlt.js", "-prev") - switch to previous tab
//===================
var next = WScript.Arguments.length ? WScript.Arguments(0) != "-prev" : true;
var hMainWnd = AkelPad.GetMainWnd();
if(hMainWnd && AkelPad.IsMDI()) {
var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
var isNextPrev = tabOpts & 0x10000 /*TAB_SWITCH_NEXTPREV*/;
AkelPad.Command(isNextPrev ? 4311 /*IDM_WINDOW_TABSWITCH_RIGHTLEFT*/ : 4310 /*IDM_WINDOW_TABSWITCH_NEXTPREV*/);
selectTab(next);
AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
}
else {
AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}
function selectTab(next) {
var cmd = next ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, cmd, 0);
} |
<download | mirror | development version>
Switch between tabs using alternative way (temporary check "Switch tabs: right-left" or "Switch tabs: next-previous" option).
For all scripts required MDI or PMDI window mode!
Last edited by Infocatcher on Mon Mar 03, 2014 8:38 am; edited 4 times in total |
|
Back to top |
|
 |
opk44
Joined: 16 Jan 2010 Posts: 607
|
Posted: Mon Feb 07, 2011 9:03 am Post subject: |
|
|
RU: Информация о номере версии редактора и плагинов
EN: Info about version of AkelPad and plugins
VersionInfo.js Code: | // version 0.1.0 - 2011-02-06
//
// Usage:
// Call("Scripts::Main", 1, "VersionInfo.js")
//
var WM_COMMAND=273;
var WM_USER=1024;
var ADTYPE_ROOT = 0; // корневая папка AkelPad'а.
var ADTYPE_PLUGS = 4; // "[AkelPad]\AkelFiles\Plugs".
var IDM_FILE_NEW=4101; // команда на создание нового файла
var AEM_EMPTYUNDOBUFFER = WM_USER + 2055; //Erase undo and redo history
var AEM_SETMODIFY = WM_USER + 2063; //Set the state of an edit control's modification flag.
var sh1 = "--------------------------------";
var sh2 = " File Version";
var sh3 = " Plugin Version";
var sh4 = "\r\n";
var pAkelDir=AkelPad.GetAkelDir(ADTYPE_ROOT);
var pAkelPlugsDir=AkelPad.GetAkelDir(ADTYPE_PLUGS);
var hMainWnd=AkelPad.GetMainWnd();
AkelPad.SendMessage(hMainWnd, WM_COMMAND, IDM_FILE_NEW, 0);
// Вывод информации в созданную вкладку
AkelPad.ReplaceSel(sh1 + sh4 + sh2 + sh4 + sh1 + sh4);
AkelPad.ReplaceSel(ShowFolderFileVersionList(pAkelDir, "Exe"));
AkelPad.ReplaceSel(sh1 + sh4 + sh3 + sh4 + sh1 + sh4);
AkelPad.ReplaceSel(ShowFolderFileVersionList(pAkelPlugsDir, "Dll"));
// Установиться на начало текста и дать возможность беспрепятственно закрыть вкладку
AkelPad.SetSel(0, 0);
AkelPad.SendMessage(AkelPad.GetEditWnd(), AEM_SETMODIFY, 0, 0);
AkelPad.SendMessage(AkelPad.GetEditWnd(), AEM_EMPTYUNDOBUFFER, 0, 0);
//
// Список версий файлов с заданным расширением в указанной директории
//
function ShowFolderFileVersionList(folderspec, extension){
var fso, f, f1, fc, s, si;
fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.GetFolder(folderspec);
fc = new Enumerator(f.files);
s = "";
si = "";
for (; !fc.atEnd(); fc.moveNext()){
si = fc.item().Name;
if (StringTailUpper(si, 3)==extension.toUpperCase()){
s += StringFixLength(si, 25) + ShowFileVersion(fc.item()) + "\r\n";
}
}
return(s);
}
//
// Получить информацию о версии файла
//
function ShowFileVersion(filespec){
var fso, s = "";
fso = new ActiveXObject("Scripting.FileSystemObject");
s += fso.GetFileVersion(filespec);
return(s);
}
//
// Получить "хвост" строки заданной длины в верхнем рагистре
//
function StringTailUpper(strvar, numvar){
s = strvar.substr(strvar.length - numvar, strvar.length)
return(s.toUpperCase());
}
//
// Дополнить строку пробелами до заданной длины
//
function StringFixLength(strvar, numvar){
while (strvar.length < numvar){
strvar += ' ';
}
return(strvar);
} |
|
|
Back to top |
|
 |
se7h
Joined: 28 Sep 2009 Posts: 767 Location: Minsk, Belarus
|
Posted: Fri Feb 11, 2011 7:38 pm Post subject: |
|
|
WinMerge.js Code: | /// WinMerge v0.4.1
// (с) se7h, VladSh
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11455#11455
//
// Comparison of current and selected files using WinMerge (http://winmerge.org/)
//
// Usage in Toolbar/ContextMenu plugin:
// -"Compare with file..." Call("Scripts::Main", 1, "WinMerge.js") Icon(pathToAnyIcon) - searching for a path to WinMerge automatically
// -"Compare with file..." Call("Scripts::Main", 1, "WinMerge.js", `"d:\Programs\TotalCmd\UTILs\WinMerge\"`) - takes a path from scripts Arguments, else searching a path automatically
//
// CommonFunctions.js you found here http://akelpad.sourceforge.net/forum/viewtopic.php?p=1582#1582
//Options
var pFilter = "Text files (*.txt)\x00*.txt\x00All Files (*.*)\x00*.*\x00\x00";
var nFilterIndex = 2;
//Variables
var WshShell = new ActiveXObject("WScript.shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var hMainWnd = AkelPad.GetMainWnd();
var pInitialFile = AkelPad.GetEditFile(0);
var pSelFilePath;
var pToolFileName = "WinMergeU.exe";
var pToolPath = "";
if (WScript.Arguments.length) //сначала пытаемся взять из аргументов
pToolPath = getPath(WScript.Arguments(0) + pToolFileName);
if (!pToolPath)
{
try {
//ищем по записи в реестре
pToolPath = WshShell.RegRead("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\" + pToolFileName + "\\");
if (pToolPath)
pToolPath = getPath(pToolPath);
} catch(e) {}
if (!pToolPath)
{
//ищем в путях по системмным переменным
var appPaths = ["%ProgramFiles%\\WinMerge\\", "%ProgramFiles (x86)%\\WinMerge\\"];
var p = 0;
do
{
pToolPath = getPath(appPaths[p] + pToolFileName);
if (pToolPath) break;
p += 1;
}
while (p < appPaths.length)
if (!pToolPath)
{
//ищем в стандартных путях по доступным локальным дискам
appPaths = [":\\Program Files\\WinMerge\\", ":\\Program Files(x86)\\WinMerge\\"];
var disks = getDrivesList();
for (var d = 0; d < disks.length; d++)
{
p = 0;
do
{
pToolPath = getPath(disks[d] + appPaths[p] + pToolFileName);
if (pToolPath) break;
p += 1;
}
while (p < appPaths.length)
if (pToolPath) break;
}
if (!pToolPath)
{
warn("Application WinMerge was not found!");
WScript.Quit();
}
}
}
}
if (hMainWnd) {
if (! AkelPad.Include("CommonFunctions.js"))
pSelFilePath = FileDialog(true, hMainWnd, pInitialFile, pFilter, nFilterIndex);
else
pSelFilePath = FileDialogDefault(true, pInitialFile, GetFileExt(pInitialFile));
if(pSelFilePath) {
var cmdLine = "\"" + pToolPath + "\" \"" + pInitialFile + "\" \"" + pSelFilePath + "\"";
WshShell.Exec(cmdLine);
}
}
//VladSh by MSDN :)
function getDrivesList()
{
var e = new Enumerator(fso.Drives);
var x;
var i = 0;
var disks = [];
for (; !e.atEnd(); e.moveNext())
{
x = e.item();
if (x.DriveType == 3 && x.IsReady)
{
disks[i] = x.DriveLetter;
i += 1;
}
}
return disks;
}
//Instructor function
function FileDialog(bOpenTrueSaveFalse, hWnd, pInitialFile, pFilter, nFilterIndex) {
var nFlags = 0x880804; //OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_EXPLORER|OFN_ENABLESIZING
var pDefaultExt = "txt";
var lpStructure;
var lpFilterBuffer;
var lpFileBuffer;
var lpExtBuffer;
var oSys;
var pResultFile = "";
var nCallResult;
if(lpFilterBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
AkelPad.MemCopy(lpFilterBuffer, pFilter.substr(0, 255), _TSTR);
if(lpFileBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
AkelPad.MemCopy(lpFileBuffer, pInitialFile.substr(0, 255), _TSTR);
if(lpExtBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
AkelPad.MemCopy(lpExtBuffer, pDefaultExt.substr(0, 255), _TSTR);
if(lpStructure = AkelPad.MemAlloc(_X64 ? 136 : 76)) { //sizeof(OPENFILENAMEA) or sizeof(OPENFILENAMEW)
//Fill structure
AkelPad.MemCopy(lpStructure, _X64 ? 136 : 76, 3 /*DT_DWORD*/); //lStructSize
AkelPad.MemCopy(lpStructure + (_X64 ? 8 : 4), hWnd, 2 /*DT_QWORD*/); //hwndOwner
AkelPad.MemCopy(lpStructure + (_X64 ? 24 : 12), lpFilterBuffer, 2 /*DT_QWORD*/); //lpstrFilter
AkelPad.MemCopy(lpStructure + (_X64 ? 44 : 24), nFilterIndex, 3 /*DT_DWORD*/); //nFilterIndex
AkelPad.MemCopy(lpStructure + (_X64 ? 48 : 28), lpFileBuffer, 2 /*DT_QWORD*/); //lpstrFile
AkelPad.MemCopy(lpStructure + (_X64 ? 56 : 32), 256, 3 /*DT_DWORD*/); //nMaxFile
AkelPad.MemCopy(lpStructure + (_X64 ? 96 : 52), nFlags, 3 /*DT_DWORD*/); //Flags
AkelPad.MemCopy(lpStructure + (_X64 ? 104 : 60), lpExtBuffer, 2 /*DT_QWORD*/); //lpstrDefExt
if(oSys = AkelPad.SystemFunction()) {
//Call dialog
if(bOpenTrueSaveFalse == true) {
nCallResult = oSys.Call("comdlg32::GetOpenFileName" + _TCHAR, lpStructure);
} else {
nCallResult = oSys.Call("comdlg32::GetSaveFileName" + _TCHAR, lpStructure);
}
//Result file
if(nCallResult) {
pResultFile = AkelPad.MemRead(lpFileBuffer, _TSTR);
}
}
AkelPad.MemFree(lpStructure);
}
AkelPad.MemFree(lpExtBuffer);
}
AkelPad.MemFree(lpFileBuffer);
}
AkelPad.MemFree(lpFilterBuffer);
}
return pResultFile;
}
//Infocatcher functions
function warn(msg) {
AkelPad.MessageBox(AkelPad.GetMainWnd(), msg, WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}
function getPath(paths) {
var path = WshShell.ExpandEnvironmentStrings(paths);
if(fso.FileExists(path))
return path;
return "";
} |
History:
0.1 - initial release
0.2 - added: trying to find the path to WinMerge.exe in the registry and in Program Files (x86) (by VladSh)
0.2.1 - using environment variables
0.2.2 - little fix
0.3 - some improvements in finding paths to WinMerge
0.4 - added ability to specify the path to WinMerge manually (via the argument)
0.4.1 - extended open dialogue with files extensions list (provided by CommonFunction.js)
Comparison of current and selected files using WinMerge
Last edited by se7h on Fri Sep 23, 2011 6:44 pm; edited 6 times in total |
|
Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1929 Location: Poland
|
Posted: Sat Feb 12, 2011 11:19 pm Post subject: |
|
|
Regular expression tester for JavaScript - Part One.
Part Two is in the next post.
In one file is here: KDJ.zip
RegExpTestJS.js
Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11473#11473
// 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 |
|
Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1929 Location: Poland
|
Posted: Sun Feb 20, 2011 1:08 pm Post subject: |
|
|
Regular expression tester for JavaScript - Part Two.
The second part of the script: RegExpTestJS.js (see previous post).
Both parts should be placed in one file.
RegExpTestJS_part2.js
Code: | function AddRE(hWnd)
{
var bNameExist = 1;
var pName = "";
var nPos;
var i;
oSys.Call("user32::GetWindowText" + _TCHAR, 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:
RegExpTestJS_1033.lng
Code: | /********************************
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
RegExpTestJS_1045.lng
Code: | /********************************
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
RegExpTestJS_1049.lng
Code: | /*********************************
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
RegExpTestJS_2052.lng
Code: | /********************************
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 |
|
Back to top |
|
 |
se7h
Joined: 28 Sep 2009 Posts: 767 Location: Minsk, Belarus
|
Posted: Mon Feb 21, 2011 7:49 pm Post subject: |
|
|
insertPathToFile.js Code: | /// insertPathToFile v0.1.1
// (c) se7h
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11477#11477
//
// Insert relative/absolute path to selected file
//
// Usage in Toolbar/ContextMenu plugin:
// -"Insert relative path..." Call("Scripts::Main", 1, "insertRelativePath.js", `"%d"`) Icon(pathToAnyIcon)
// -"Insert absolute path..." Call("Scripts::Main", 1, "insertRelativePath.js") Icon(pathToAnyIcon)
//
// CommonFunctions.js you found here http://akelpad.sourceforge.net/forum/viewtopic.php?p=1582#1582
//Options
var pFilter = "Text files (*.txt)\x00*.txt\x00All Files (*.*)\x00*.*\x00\x00";
var nFilterIndex = 2;
var dirSysSeparator = "\\";
//Variables
var hMainWnd = AkelPad.GetMainWnd();
var pInitialFile = AkelPad.GetEditFile(0);
var pSelFilePath;
var DirPath = "";
if(WScript.Arguments.length) {
DirPath = WScript.Arguments(0);
}
if(hMainWnd) {
if (! AkelPad.Include("CommonFunctions.js"))
pSelFilePath = FileDialog(true, hMainWnd, pInitialFile, pFilter, nFilterIndex);
else
pSelFilePath = FileDialogDefault(true, pInitialFile, "*");
if(pSelFilePath) {
if(!DirPath) {
AkelPad.ReplaceSel(pSelFilePath);
} else {
AkelPad.ReplaceSel(GetRelativePath(DirPath, pSelFilePath));
}
}
}
function GetRelativePath(mainDirPath, absoluteFilePath) {
var firstPathParts = new Array();
var secondPathParts = new Array();
firstPathParts = mainDirPath.split(dirSysSeparator);
secondPathParts = absoluteFilePath.split(dirSysSeparator);
var sameCounter = 0;
for(var i = 0; i < Math.min(firstPathParts.length, secondPathParts.length); i++) {
if(!(firstPathParts[i].toLowerCase() == secondPathParts[i].toLowerCase())) {
break;
}
sameCounter++;
}
if(sameCounter == 0) {
return absoluteFilePath;
}
var newPath = "";
for(var i = sameCounter; i < firstPathParts.length; i++) {
if(i > sameCounter) {
newPath += dirSysSeparator;
}
newPath += "..";
}
if(newPath.length == 0) {
newPath = ".";
}
for(var i = sameCounter; i < secondPathParts.length; i++) {
newPath += dirSysSeparator;
newPath += secondPathParts[i];
}
return newPath;
}
//Instructor function
function FileDialog(bOpenTrueSaveFalse, hWnd, pInitialFile, pFilter, nFilterIndex) {
var nFlags = 0x880804; //OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_EXPLORER|OFN_ENABLESIZING
var pDefaultExt = "txt";
var lpStructure;
var lpFilterBuffer;
var lpFileBuffer;
var lpExtBuffer;
var oSys;
var pResultFile = "";
var nCallResult;
if(lpFilterBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
AkelPad.MemCopy(lpFilterBuffer, pFilter.substr(0, 255), _TSTR);
if(lpFileBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
AkelPad.MemCopy(lpFileBuffer, pInitialFile.substr(0, 255), _TSTR);
if(lpExtBuffer = AkelPad.MemAlloc(256 * _TSIZE)) {
AkelPad.MemCopy(lpExtBuffer, pDefaultExt.substr(0, 255), _TSTR);
if(lpStructure = AkelPad.MemAlloc(_X64 ? 136 : 76)) { //sizeof(OPENFILENAMEA) or sizeof(OPENFILENAMEW)
//Fill structure
AkelPad.MemCopy(lpStructure, _X64 ? 136 : 76, 3 /*DT_DWORD*/); //lStructSize
AkelPad.MemCopy(lpStructure + (_X64 ? 8 : 4), hWnd, 2 /*DT_QWORD*/); //hwndOwner
AkelPad.MemCopy(lpStructure + (_X64 ? 24 : 12), lpFilterBuffer, 2 /*DT_QWORD*/); //lpstrFilter
AkelPad.MemCopy(lpStructure + (_X64 ? 44 : 24), nFilterIndex, 3 /*DT_DWORD*/); //nFilterIndex
AkelPad.MemCopy(lpStructure + (_X64 ? 48 : 28), lpFileBuffer, 2 /*DT_QWORD*/); //lpstrFile
AkelPad.MemCopy(lpStructure + (_X64 ? 56 : 32), 256, 3 /*DT_DWORD*/); //nMaxFile
AkelPad.MemCopy(lpStructure + (_X64 ? 96 : 52), nFlags, 3 /*DT_DWORD*/); //Flags
AkelPad.MemCopy(lpStructure + (_X64 ? 104 : 60), lpExtBuffer, 2 /*DT_QWORD*/); //lpstrDefExt
if(oSys = AkelPad.SystemFunction()) {
//Call dialog
if(bOpenTrueSaveFalse == true) {
nCallResult = oSys.Call("comdlg32::GetOpenFileName" + _TCHAR, lpStructure);
} else {
nCallResult = oSys.Call("comdlg32::GetSaveFileName" + _TCHAR, lpStructure);
}
//Result file
if(nCallResult) {
pResultFile = AkelPad.MemRead(lpFileBuffer, _TSTR);
}
}
AkelPad.MemFree(lpStructure);
}
AkelPad.MemFree(lpExtBuffer);
}
AkelPad.MemFree(lpFileBuffer);
}
AkelPad.MemFree(lpFilterBuffer);
}
return pResultFile;
} |
Insert relative/absolute path to selected file
History version:
0.1 - initial release
0.1.1 - extended file dialogue with files extensions list (provided by CommonFunction.js)
Last edited by se7h on Fri Sep 23, 2011 6:55 pm; edited 1 time in total |
|
Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1929 Location: Poland
|
Posted: Sun Feb 27, 2011 9:15 pm Post subject: |
|
|
Sorting strings contained between any separators.
SortWords.js
Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11749#11749
// 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 |
|
Back to top |
|
 |
Infocatcher
Joined: 06 Aug 2007 Posts: 1767
|
Posted: Fri Mar 04, 2011 5:36 pm Post subject: |
|
|
runScript.js Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11863#11863
// http://infocatcher.ucoz.net/js/akelpad_scripts/runScript.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/runScript.js
// (c) Infocatcher 2011, 2013-2014
// version 0.2.8 - 2014-08-16
//===================
// Run script from AkelFiles\Plugs\Scripts\ directory
// Hotkeys:
// Enter - Ok
// Ctrl+Enter (Shift+Enter), F3 - Exec
// F4, Ctrl+E - Edit
// F2, Ctrl+S - Rewrite options (and remove arguments for removed files)
// F1, Shift+F1 - Next/previous script
// F5 - Refresh scripts list
// Escape - Cancel
// Arguments:
// -saveOptions=0 - don't save options
// =1 - save options only for runned scripts (default)
// =2 - always save options
// -savePosition=true - allow store last window position
// -saveSize=true - allow store last window size
// -script="someScript.js" - select someScript.js in the list
// Usage:
// Call("Scripts::Main", 1, "runScript.js")
// Call("Scripts::Main", 1, "runScript.js", `-script="someScript.js" -saveOptions=0 -savePosition=false`)
//===================
function _localize(s) {
var strings = {
"&Arguments": {
ru: "&Аргументы"
},
"OK": {
ru: "ОК"
},
"Exec": {
ru: "Запустить"
},
"Edit": {
ru: "Изменить"
},
"Cancel": {
ru: "Отмена"
}
};
var lng;
switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
case 0x19: lng = "ru"; break;
default: lng = "en";
}
_localize = function(s) {
return strings[s] && strings[s][lng] || s;
};
return _localize(s);
}
var hMainWnd = AkelPad.GetMainWnd();
if(!hMainWnd)
WScript.Quit();
var oSys = AkelPad.SystemFunction();
var oSet = AkelPad.ScriptSettings();
var fso = new ActiveXObject("Scripting.FileSystemObject");
var scriptsDir = AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/);
var dialogTitle = WScript.ScriptName.replace(/^[!-\-_]+/, "");
dialogTitle = dialogTitle.charAt(0).toUpperCase() + dialogTitle.substr(1);
function getPrefName(scriptName) {
return "/" + scriptName.replace(/=/g, "<equals>");
}
// Read arguments:
var scriptName = AkelPad.GetArgValue("script", "");
var saveOptions = AkelPad.GetArgValue("saveOptions", 1);
var savePosition = AkelPad.GetArgValue("savePosition", true);
var saveSize = AkelPad.GetArgValue("saveSize", true);
var filePath = AkelPad.GetEditFile(0);
if(!scriptName && fso.GetParentFolderName(filePath).toLowerCase() == scriptsDir.toLowerCase())
scriptName = fso.GetFileName(filePath);
selectScriptDialog();
function isScript(path) {
return /\.(js|vbs)$/i.test(path);
}
function expandArgs(args) {
var wsh = new ActiveXObject("WScript.Shell");
expandArgs = function(args) {
var file = AkelPad.GetEditFile(0);
return wsh.ExpandEnvironmentStrings(args)
.replace(/%f/ig, file)
.replace(/%d/ig, fso.GetParentFolderName(file))
.replace(/%a/ig, AkelPad.GetAkelDir())
.replace(/%([^%]|$)/g, "$1")
.replace(/%%/g, "%");
};
return expandArgs(args);
}
function selectScriptDialog(modal) {
var hInstanceDLL = AkelPad.GetInstanceDll();
var dialogClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("kernel32::GetCurrentProcessId");
var hWndDialog = oSys.Call("user32::FindWindowEx" + _TCHAR, 0, 0, dialogClass, 0);
if(hWndDialog) {
if(oSys.Call("user32::IsIconic", hWndDialog))
oSys.Call("user32::ShowWindow", hWndDialog, 9 /*SW_RESTORE*/);
AkelPad.SendMessage(hWndDialog, 7 /*WM_SETFOCUS*/, 0, 0);
return;
}
if(
!AkelPad.WindowRegisterClass(dialogClass)
&& ( // Previous script instance crashed
!AkelPad.WindowUnregisterClass(dialogClass)
|| !AkelPad.WindowRegisterClass(dialogClass)
)
)
return;
var curName = isScript(scriptName) && scriptName;
var dlgX, dlgY;
var lastW, lastH;
if((saveOptions || savePosition || saveSize) && oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/)) {
if(saveOptions && !curName)
curName = oSet.Read("lastScript", 3 /*PO_STRING*/, "");
if(savePosition) {
dlgX = oSet.Read("windowLeft", 1 /*PO_DWORD*/);
dlgY = oSet.Read("windowTop", 1 /*PO_DWORD*/);
}
if(saveSize) {
lastW = oSet.Read("windowWidth", 1 /*PO_DWORD*/);
lastH = oSet.Read("windowHeight", 1 /*PO_DWORD*/);
}
oSet.End();
}
var _cleanup = {};
function saveSettings(rewrite) {
if(!saveOptions && !savePosition && !saveSize)
return;
if(!oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/ | (rewrite ? 0x4 /*POB_CLEAR*/ : 0)))
return;
if(saveOptions) {
if(runned || saveOptions == 2)
oSet.Write("lastScript", 3 /*PO_STRING*/, saveOptions == 2 ? curName : runnedName);
var names = saveOptions == 2 ? argsObj : runned || {};
for(var name in names)
saveArgs(name, argsObj[name]);
for(var name in _cleanup) {
oSet.Delete("lastArgs-" + encodeURIComponent(name));
!names[name] && saveArgs(name, _cleanup[name]);
}
}
if((savePosition || saveSize) && !oSys.Call("user32::IsIconic", hWndDialog)) {
var rcWnd = getWindowRect(hWndDialog);
if(rcWnd) {
if(savePosition) {
oSet.Write("windowLeft", 1 /*PO_DWORD*/, rcWnd.left);
oSet.Write("windowTop", 1 /*PO_DWORD*/, rcWnd.top);
}
if(saveSize) {
oSet.Write("windowWidth", 1 /*PO_DWORD*/, Math.round((rcWnd.right - rcWnd.left)/scale.x(10000)*10000) - sizeNonClientX);
oSet.Write("windowHeight", 1 /*PO_DWORD*/, Math.round((rcWnd.bottom - rcWnd.top)/scale.y(10000)*10000) - sizeNonClientY);
}
}
}
oSet.End();
}
function saveArgs(name, args) {
var prefName = getPrefName(name);
if(args)
oSet.Write(prefName, 3 /*PO_STRING*/, args);
else
oSet.Delete(prefName);
}
var IDC_STATIC = -1;
var IDC_LISTBOX = 1000;
var IDC_ARGS = 1001;
var IDC_OK = 1002;
var IDC_EXEC = 1003;
var IDC_EDIT = 1004;
var IDC_CANCEL = 1005;
var selfRun = false;
var runned, runnedName;
var argsObj = {};
var hWndListBox, hWndGroupArgs, hWndArgs;
var hWndOK, hWndExec, hWndEdit, hWndCancel;
var lbW = 260;
var lbH = 320;
var btnW = 82;
var btnH = 23;
var btnSep = 4;
var gbH = 48;
var gbW = lbW + 12 + btnW;
var dlgW = 12 + lbW + 12 + btnW + 12;
var dlgH = 12 + lbH + 12 + gbH + 12;
var dlgMinW = dlgW - lbW + 120;
var dlgMinH = 12 + btnH*4 + btnSep*3 + 12 + gbH + 12;
if(lastW != undefined)
lastW = Math.max(dlgMinW, lastW);
if(lastH != undefined)
lastH = Math.max(dlgMinH, lastH);
var scale = new Scale(0, hMainWnd);
var sizeNonClientX = oSys.Call("user32::GetSystemMetrics", 32 /*SM_CXSIZEFRAME*/) * 2;
var sizeNonClientY = oSys.Call("user32::GetSystemMetrics", 33 /*SM_CYSIZEFRAME*/) * 2 + oSys.Call("user32::GetSystemMetrics", 4 /*SM_CYCAPTION*/);
// Create dialog
hWndDialog = oSys.Call(
"user32::CreateWindowEx" + _TCHAR,
0, //dwExStyle
dialogClass, //lpClassName
0, //lpWindowName
0x90CE0000, //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_THICKFRAME
scale.x(dlgX || 0), //x
scale.y(dlgY || 0), //y
scale.x(lastW || dlgW) + sizeNonClientX, //nWidth
scale.y(lastH || dlgH) + sizeNonClientY, //nHeight
hMainWnd, //hWndParent
0, //ID
hInstanceDLL, //hInstance
dialogCallback //Script function callback. To use it class must be registered by WindowRegisterClass.
);
if(!hWndDialog)
return;
function dialogCallback(hWnd, uMsg, wParam, lParam) {
switch(uMsg) {
case 1: //WM_CREATE
dlgW = scale.x(dlgW) + sizeNonClientX;
dlgH = scale.y(dlgH) + sizeNonClientY;
dlgMinW = scale.x(dlgMinW) + sizeNonClientX;
dlgMinH = scale.y(dlgMinH) + sizeNonClientY;
var hGuiFont = oSys.Call("gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
// Dialog caption
oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, dialogTitle);
hWndListBox = createWindowEx(
0x204, //WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY
"LISTBOX", //lpClassName
0, //lpWindowName
0x50210103, //WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_TABSTOP|LBS_NOINTEGRALHEIGHT|LBS_SORT|LBS_NOTIFY
12, //x
12, //y
lbW, //nWidth
lbH, //nHeight
hWnd, //hWndParent
IDC_LISTBOX, //ID
hInstanceDLL, //hInstance
0 //lpParam
);
setWindowFont(hWndListBox, hGuiFont);
// GroupBox action
hWndGroupArgs = createWindowEx(
0, //dwExStyle
"BUTTON", //lpClassName
0, //lpWindowName
0x50000007, //WS_VISIBLE|WS_CHILD|BS_GROUPBOX
12, //x
12 + lbH + 12, //y
gbW, //nWidth
gbH, //nHeight
hWnd, //hWndParent
IDC_STATIC, //ID
hInstanceDLL, //hInstance
0 //lpParam
);
setWindowFontAndText(hWndGroupArgs, hGuiFont, _localize("&Arguments"));
// Edit: arguments
hWndArgs = createWindowEx(
0x200, //WS_EX_CLIENTEDGE
"EDIT", //lpClassName
0, //lpWindowName
0x50010080, //WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL
12 + 8, //x
12 + lbH + 12 + 18, //y
gbW - 8*2, //nWidth
21, //nHeight
hWnd, //hWndParent
IDC_ARGS, //ID
hInstanceDLL, //hInstance
0 //lpParam
);
setWindowFont(hWndArgs, hGuiFont);
setEditText(hWndArgs, "");
// OK button window
hWndOK = createWindowEx(
0, //dwExStyle
"BUTTON", //lpClassName
0, //lpWindowName
0x50010001, //WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
12 + lbW + 12, //x
12, //y
btnW, //nWidth
btnH, //nHeight
hWnd, //hWndParent
IDC_OK, //ID
hInstanceDLL, //hInstance
0 //lpParam
);
setWindowFontAndText(hWndOK, hGuiFont, _localize("OK"));
// Exec button window
hWndExec = createWindowEx(
0, //dwExStyle
"BUTTON", //lpClassName
0, //lpWindowName
0x50010000, //WS_VISIBLE|WS_CHILD|WS_TABSTOP
12 + lbW + 12, //x
12 + btnH + btnSep, //y
btnW, //nWidth
btnH, //nHeight
hWnd, //hWndParent
IDC_EXEC, //ID
hInstanceDLL, //hInstance
0 //lpParam
);
setWindowFontAndText(hWndExec, hGuiFont, _localize("Exec"));
// Edit button window
hWndEdit = createWindowEx(
0, //dwExStyle
"BUTTON", //lpClassName
0, //lpWindowName
0x50010000, //WS_VISIBLE|WS_CHILD|WS_TABSTOP
12 + lbW + 12, //x
12 + (btnH + btnSep)*2, //y
btnW, //nWidth
btnH, //nHeight
hWnd, //hWndParent
IDC_EDIT, //ID
hInstanceDLL, //hInstance
0 //lpParam
);
setWindowFontAndText(hWndEdit, hGuiFont, _localize("Edit"));
// Cancel button window
hWndCancel = createWindowEx(
0, //dwExStyle
"BUTTON", //lpClassName
0, //lpWindowName
0x50010000, //WS_VISIBLE|WS_CHILD|WS_TABSTOP
12 + lbW + 12, //x
12 + (btnH + btnSep)*3, //y
btnW, //nWidth
btnH, //nHeight
hWnd, //hWndParent
IDC_CANCEL, //ID
hInstanceDLL, //hInstance
0 //lpParam
);
setWindowFontAndText(hWndCancel, hGuiFont, _localize("Cancel"));
if(lastW != undefined || lastH != undefined)
resizeDialog(hWnd, lastW || dlgW, lastH || dlgH);
fillListBox();
updArgs();
//centerWindow(hWnd);
//centerWindow(hWnd, hMainWnd);
restoreWindowPosition(hWnd, hMainWnd);
break;
case 7: //WM_SETFOCUS
oSys.Call("user32::SetFocus", curName ? hWndArgs : hWndListBox);
break;
case 256: //WM_KEYDOWN
var ctrl = oSys.Call("user32::GetAsyncKeyState", 162 /*VK_LCONTROL*/)
|| oSys.Call("user32::GetAsyncKeyState", 163 /*VK_RCONTROL*/);
var shift = oSys.Call("user32::GetAsyncKeyState", 160 /*VK_LSHIFT*/)
|| oSys.Call("user32::GetAsyncKeyState", 161 /*VK_RSHIFT*/);
//var alt = oSys.Call("user32::GetAsyncKeyState", 164 /*VK_LMENU*/)
// || oSys.Call("user32::GetAsyncKeyState", 165 /*VK_RMENU*/);
if(wParam == 27) //VK_ESCAPE
oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_CANCEL, 0);
else if(wParam == 13) { //VK_RETURN
if(ctrl || shift) // Ctrl+Enter, Shift+Enter
oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_EXEC, 0);
else // Enter
oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_OK, 0);
}
else if(wParam == 114 /*VK_F3*/) // F3
oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_EXEC, 0);
else if(wParam == 112 /*VK_F1*/)
navigate(ctrl || shift);
else if(wParam == 113 /*VK_F2*/ || ctrl && wParam == 83 /*S*/) { // F2, Ctrl+S
var so = saveOptions;
saveOptions = 2;
saveSettings(true);
saveOptions = so;
}
else if(wParam == 115 /*VK_F4*/ || ctrl && wParam == 69 /*E*/) // F4, Ctrl+E
oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_EDIT, 0);
else if(wParam == 116 /*VK_F5*/)
redrawListbox();
//else if(wParam != 16 /*VK_SHIFT*/ && wParam != 17 /*VK_CONTROL*/ && wParam != 18 /*VK_MENU*/)
// AkelPad.MessageBox(hWnd, wParam, dialogTitle, 0 /*MB_OK*/);
break;
case 273: //WM_COMMAND
var idc = wParam & 0xffff;
switch(idc) {
case IDC_OK:
case IDC_EXEC:
var isSelf = curName == WScript.ScriptName;
selfRun = false;
if(!curName || isSelf && idc == IDC_EXEC)
break;
if(!runned)
runned = {};
runned[runnedName = curName] = true;
if(isSelf)
selfRun = true;
else
AkelPad.Call("Scripts::Main", 1, curName, expandArgs(argsObj[curName] || ""));
if(idc == IDC_OK)
closeDialog();
else
ensureVisibility();
break;
case IDC_EDIT:
curName && AkelPad.Call("Scripts::Main", 3, curName);
break;
case IDC_CANCEL:
closeDialog();
break;
case IDC_ARGS:
argsObj[curName] = windowText(hWndArgs).replace(/^\s+|\s+$/g, "");
break;
case IDC_LISTBOX:
updArgs();
if((wParam >> 16 & 0xFFFF) == 2 /*LBN_DBLCLK*/)
oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_EXEC, 0);
}
break;
case 36: //WM_GETMINMAXINFO
AkelPad.MemCopy(lParam + 24, dlgMinW, 3 /*DT_DWORD*/); //ptMinTrackSize.x
AkelPad.MemCopy(lParam + 28, dlgMinH, 3 /*DT_DWORD*/); //ptMinTrackSize.y
break;
case 5: //WM_SIZE
if(oSys.Call("user32::IsIconic", hWnd))
break;
var rcWnd = getWindowRect(hWnd);
var curW = rcWnd.right - rcWnd.left;
var curH = rcWnd.bottom - rcWnd.top;
resizeDialog(hWnd, curW, curH);
break;
case 15: //WM_PAINT
// Based on code of SearchReplace.js script
var ps;
var hDC;
var lpGrip;
var rcGrip;
if(ps = AkelPad.MemAlloc(_X64 ? 72 : 64 /*sizeof(PAINTSTRUCT)*/)) {
if(hDC = oSys.Call("user32::BeginPaint", hWnd, ps)) {
if(lpGrip = AkelPad.MemAlloc(16 /*sizeof(RECT)*/)) {
if(oSys.Call("user32::GetClientRect", hWnd, lpGrip)) {
rcGrip = parseRect(lpGrip);
rcGrip.left = rcGrip.right - oSys.Call("user32::GetSystemMetrics", 2 /*SM_CXVSCROLL*/);
rcGrip.top = rcGrip.bottom - oSys.Call("user32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/);
AkelPad.MemCopy(lpGrip, rcGrip.left, 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpGrip + 4, rcGrip.top, 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpGrip + 8, rcGrip.right, 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpGrip + 12, rcGrip.bottom, 3 /*DT_DWORD*/);
oSys.Call("user32::DrawFrameControl", hDC, lpGrip, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/);
}
AkelPad.MemFree(lpGrip);
}
oSys.Call("user32::EndPaint", hWnd, ps);
}
AkelPad.MemFree(ps);
}
break;
case 16: //WM_CLOSE
saveSettings();
modal && enabled(hMainWnd, true); // Enable main window
oSys.Call("user32::DestroyWindow", hWnd); // Destroy dialog
break;
case 2: //WM_DESTROY
oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
}
return 0;
}
function fillListBox() {
//var t = new Date().getTime();
var files = [];
// Foollowing is very slow (especially on slow devices like USB flash):
//var filesEnum = new Enumerator(fso.GetFolder(scriptsDir).Files);
//for(; !filesEnum.atEnd(); filesEnum.moveNext()) {
// var name = filesEnum.item().Name;
// if(isScript(name))
// files[files.length] = name;
//}
// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=12548#12548
var lpFindData = AkelPad.MemAlloc(592 /*sizeof(WIN32_FIND_DATAW)*/);
if(!lpFindData)
return;
var hSearch = oSys.Call("kernel32::FindFirstFile" + _TCHAR, scriptsDir + "\\*", lpFindData);
if(!hSearch)
return;
do {
var fName = AkelPad.MemRead(lpFindData + 44 /*offsetof(WIN32_FIND_DATAW, cFileName)*/, _TSTR);
if(fName == "." || fName == "..")
continue;
if(isScript(fName))
files[files.length] = fName;
}
while(oSys.Call("kernel32::FindNextFile" + _TCHAR, hSearch, lpFindData));
oSys.Call("kernel32::FindClose", hSearch);
AkelPad.MemFree(lpFindData);
//WScript.Echo(new Date().getTime() - t);
//files.sort();
var lpStr = AkelPad.MemAlloc(256*_TSIZE);
if(!lpStr)
return;
var read = oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/);
var indx = 0;
for(var i = 0, l = files.length; i < l; ++i) {
var name = files[i];
if(read) {
var args = oSet.Read(getPrefName(name), 3 /*PO_STRING*/);
var oldArgs = oSet.Read("lastArgs-" + encodeURIComponent(name), 3 /*PO_STRING*/);
if(oldArgs != undefined)
_cleanup[name] = oldArgs;
argsObj[name] = args || oldArgs || "";
}
AkelPad.MemCopy(lpStr, name.substr(0, 255), _TSTR);
AkelPad.SendMessage(hWndListBox, 0x180 /*LB_ADDSTRING*/, 0, lpStr);
}
AkelPad.MemFree(lpStr);
read && oSet.End();
var indx = getIndexFromString(curName);
if(indx != undefined)
AkelPad.SendMessage(hWndListBox, 0x186 /*LB_SETCURSEL*/, indx, 0);
else
curName = "";
}
function redrawListbox() {
for(var name in argsObj)
delete argsObj[name];
AkelPad.SendMessage(hWndDialog, 11 /*WM_SETREDRAW*/, false, 0);
var maxIndx = AkelPad.SendMessage(hWndListBox, 0x18B /*LB_GETCOUNT*/, 0, 0) - 1;
for(var i = maxIndx; i >= 0; --i)
AkelPad.SendMessage(hWndListBox, 0x182 /*LB_DELETESTRING*/, i, 0);
fillListBox();
AkelPad.SendMessage(hWndDialog, 11 /*WM_SETREDRAW*/, true, 0);
//var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
//if(lpRect) {
// var rc = getWindowRect(hWndListBox, hWndDialog);
// AkelPad.MemCopy(lpRect, rc.left, 3 /*DT_DWORD*/);
// AkelPad.MemCopy(lpRect + 4, rc.top, 3 /*DT_DWORD*/);
// AkelPad.MemCopy(lpRect + 8, rc.right, 3 /*DT_DWORD*/);
// AkelPad.MemCopy(lpRect + 12, rc.bottom, 3 /*DT_DWORD*/);
// oSys.Call("user32::InvalidateRect", hWndDialog, lpRect, true);
// AkelPad.MemFree(lpRect);
//}
oSys.Call("user32::InvalidateRect", hWndListBox, 0, true);
updArgs();
}
function updArgs() {
var str = getStringFromIndex(AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0));
if(!str) {
enableControls({
exec: false,
edit: false,
ok: false
});
return;
}
curName = str;
setEditText(hWndArgs, argsObj[str] || "");
enableControls({
exec: str != WScript.ScriptName,
edit: true,
ok: true
});
}
function enableControls(enable) {
var hWndFocused = oSys.Call("user32::GetFocus");
enabled(hWndExec, enable.exec);
enabled(hWndEdit, enable.edit);
enabled(hWndOK, enable.ok);
if(
!enable.exec && hWndFocused == hWndExec
|| !enable.edit && hWndFocused == hWndEdit
|| !enable.ok && hWndFocused == hWndOK
)
oSys.Call("user32::SetFocus", hWndDialog);
}
function ensureVisibility() {
var indx = AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0);
if(indx != -1)
AkelPad.SendMessage(hWndListBox, 0x186 /*LB_SETCURSEL*/, indx, 0);
}
function navigate(up) {
var i = AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0);
var max = AkelPad.SendMessage(hWndListBox, 0x18B /*LB_GETCOUNT*/, 0, 0) - 1;
if(up) {
if(--i < 0)
i = max;
}
else {
if(++i > max)
i = 0;
}
AkelPad.SendMessage(hWndListBox, 0x186 /*LB_SETCURSEL*/, i, 0);
oSys.Call("user32::PostMessage" + _TCHAR, hWndDialog, 273 /*WM_COMMAND*/, IDC_LISTBOX, 0);
}
function restoreWindowPosition(hWnd, hWndParent) {
if(dlgX == undefined || dlgY == undefined) {
centerWindow(hWnd, hWndParent);
return;
}
var rcWnd = getWindowRect(hWnd);
if(!rcWnd)
return;
var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
if(!lpRect)
return;
AkelPad.MemCopy(lpRect, dlgX, 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpRect + 4, dlgY, 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpRect + 8, dlgX + (rcWnd.right - rcWnd.left), 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpRect + 12, dlgY + (rcWnd.top - rcWnd.bottom), 3 /*DT_DWORD*/);
var hMonitor = oSys.Call("user32::MonitorFromRect", lpRect, 0x2 /*MONITOR_DEFAULTTONEAREST*/);
if(hMonitor) {
//typedef struct tagMONITORINFO {
// DWORD cbSize;
// RECT rcMonitor;
// RECT rcWork;
// DWORD dwFlags;
//} MONITORINFO, *LPMONITORINFO;
var sizeofMonitorInfo = 4 + 16 + 16 + 4;
var lpMi = AkelPad.MemAlloc(sizeofMonitorInfo);
if(lpMi) {
AkelPad.MemCopy(lpMi, sizeofMonitorInfo, 3 /*DT_DWORD*/);
oSys.Call("user32::GetMonitorInfo" + _TCHAR, hMonitor, lpMi);
var rcWork = parseRect(lpMi + 4 + 16);
AkelPad.MemFree(lpMi);
}
}
else { //?
oSys.Call("user32::SystemParametersInfo" + _TCHAR, 48 /*SPI_GETWORKAREA*/, 0, lpRect, 0);
var rcWork = parseRect(lpRect);
}
AkelPad.MemFree(lpRect);
if(rcWork) {
var edge = Math.max(
16,
oSys.Call("user32::GetSystemMetrics", 33 /*SM_CYSIZEFRAME*/)
+ oSys.Call("user32::GetSystemMetrics", 4 /*SM_CYCAPTION*/)
);
var minX = rcWork.left - (rcWnd.right - rcWnd.left) + edge;
var minY = rcWork.top;
var maxX = rcWork.right - edge;
var maxY = rcWork.bottom - edge;
dlgX = Math.max(minX, Math.min(maxX, dlgX));
dlgY = Math.max(minY, Math.min(maxY, dlgY));
}
moveWindow(hWnd, dlgX, dlgY);
}
function centerWindow(hWnd, hWndParent) {
var rcWnd = getWindowRect(hWnd);
var rcWndParent = getWindowRect(hWndParent || oSys.Call("user32::GetDesktopWindow"));
if(!rcWndParent || !rcWnd)
return;
var x = rcWndParent.left + ((rcWndParent.right - rcWndParent.left) / 2 - (rcWnd.right - rcWnd.left) / 2);
var y = rcWndParent.top + ((rcWndParent.bottom - rcWndParent.top) / 2 - (rcWnd.bottom - rcWnd.top) / 2);
moveWindow(hWnd, x, y);
}
function moveWindow(hWnd, x, y, hWndParent) {
if(hWndParent) {
var rcWnd = getWindowRect(hWnd, hWndParent);
x += rcWnd.left;
y += rcWnd.top;
}
oSys.Call("user32::SetWindowPos", hWnd, 0, x, y, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
}
function resizeWindow(hWnd, dw, dh) {
var rcWnd = getWindowRect(hWnd);
var w = rcWnd.right - rcWnd.left + dw;
var h = rcWnd.bottom - rcWnd.top + dh;
oSys.Call("user32::SetWindowPos", hWnd, 0, 0, 0, w, h, 0x16 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE*/);
}
function resizeDialog(hWnd, curW, curH) {
var dw = curW - dlgW;
var dh = curH - dlgH;
resizeWindow(hWndListBox, dw, dh);
resizeWindow(hWndGroupArgs, dw, 0);
resizeWindow(hWndArgs, dw, 0);
moveWindow(hWndGroupArgs, 0, dh, hWnd);
moveWindow(hWndArgs, 0, dh, hWnd);
moveWindow(hWndOK, dw, 0, hWnd);
moveWindow(hWndExec, dw, 0, hWnd);
moveWindow(hWndEdit, dw, 0, hWnd);
moveWindow(hWndCancel, dw, 0, hWnd);
dlgW = curW;
dlgH = curH;
}
function getWindowRect(hWnd, hWndParent) {
var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
if(!lpRect)
return null;
oSys.Call("user32::GetWindowRect", hWnd, lpRect);
hWndParent && oSys.Call("user32::ScreenToClient", hWndParent, lpRect);
var rcWnd = parseRect(lpRect);
AkelPad.MemFree(lpRect);
return rcWnd;
}
function parseRect(lpRect) {
return {
left: AkelPad.MemRead(lpRect, 3 /*DT_DWORD*/),
top: AkelPad.MemRead(lpRect + 4, 3 /*DT_DWORD*/),
right: AkelPad.MemRead(lpRect + 8, 3 /*DT_DWORD*/),
bottom: AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/)
};
}
function getStringFromIndex(i) {
if(i == -1 || i == undefined)
return "";
var len = AkelPad.SendMessage(hWndListBox, 0x18A /*LB_GETTEXTLEN*/, i, 0);
var lpString = AkelPad.MemAlloc((len + 1)*_TSIZE);
if(!lpString)
return "";
AkelPad.SendMessage(hWndListBox, 0x189 /*LB_GETTEXT*/, i, lpString);
var str = AkelPad.MemRead(lpString, _TSTR);
AkelPad.MemFree(lpString);
return str;
}
function getIndexFromString(str) {
for(var i = 0, l = AkelPad.SendMessage(hWndListBox, 0x18B /*LB_GETCOUNT*/, 0, 0); i < l; ++i) {
var s = getStringFromIndex(i);
if(s == str)
return i;
}
return undefined;
}
function windowText(hWnd, pText) {
if(arguments.length > 1)
return oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, pText);
var len = oSys.Call("user32::GetWindowTextLength" + _TCHAR, hWnd);
var lpText = AkelPad.MemAlloc((len + 1)*_TSIZE);
if(!lpText)
return "";
oSys.Call("user32::GetWindowText" + _TCHAR, hWnd, lpText, len + 1);
pText = AkelPad.MemRead(lpText, _TSTR);
AkelPad.MemFree(lpText);
return pText;
}
function setWindowFont(hWnd, hFont) {
AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
}
function setWindowFontAndText(hWnd, hFont, pText) {
setWindowFont(hWnd, hFont);
windowText(hWnd, pText);
}
function setEditText(hWnd, pText, selectAll) {
windowText(hWnd, pText);
pText && AkelPad.SendMessage(hWnd, 177 /*EM_SETSEL*/, selectAll ? 0 : pText.length, -1);
}
function enabled(hWnd, val) {
oSys.Call("user32::EnableWindow", hWnd, val);
}
function destroyWindow(hWnd) {
oSys.Call("user32::DestroyWindow", hWnd);
}
function closeDialog() {
oSys.Call("user32::PostMessage" + _TCHAR, hWndDialog, 16 /*WM_CLOSE*/, 0, 0);
}
function Scale(hDC, hWnd) {
var hNewDC = hDC || oSys.Call("user32::GetDC", hWnd);
if(hNewDC) {
this._x = oSys.Call("gdi32::GetDeviceCaps", hNewDC, 88 /*LOGPIXELSX*/);
this._y = oSys.Call("gdi32::GetDeviceCaps", hNewDC, 90 /*LOGPIXELSY*/);
//Align to 16 pixel
this._x += (16 - this._x % 16) % 16;
this._y += (16 - this._y % 16) % 16;
!hDC && oSys.Call("user32::ReleaseDC", hWnd, hNewDC);
this.x = function(x) {
return oSys.Call("kernel32::MulDiv", x, this._x, 96);
};
this.y = function(y) {
return oSys.Call("kernel32::MulDiv", y, this._y, 96);
};
}
else {
this.x = this.y = function(n) {
return n;
};
}
}
function createWindowEx(
dwExStyle, lpClassName, lpWindowName, dwStyle,
x, y, w, h,
hWndParent, id, hInstance, callback
) {
return oSys.Call(
"user32::CreateWindowEx" + _TCHAR,
dwExStyle, lpClassName, lpWindowName, dwStyle,
scale.x(x), scale.y(y),
scale.x(w), scale.y(h),
hWndParent, id, hInstance, callback || 0
);
}
modal && enabled(hMainWnd, false); // Disable main window, to make dialog modal
AkelPad.ScriptNoMutex(); // Allow other scripts running
AkelPad.WindowGetMessage(); // Message loop
AkelPad.WindowUnregisterClass(dialogClass);
selfRun && AkelPad.Call("Scripts::Main", 1, WScript.ScriptName, expandArgs(argsObj[curName] || ""));
} |
<download | mirror | development version>
Run script from AkelFiles\Plugs\Scripts\ directory with arguments.
Screenshots

executeScript.js Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11863#11863
// http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.js
// http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.vbs
// (c) Infocatcher 2011
// version 0.2.2 - 2011-12-20
//===================
// Execute selected or all code
// Arguments:
// -useTempFile=true - run script from temp file (useful for tracking errors)
// -onlySelected=true - use only selected text
// -type="js" - don't ask script type
// Usage:
// Call("Scripts::Main", 1, "executeScript.js")
// Call("Scripts::Main", 1, "executeScript.js", `-type="js"`)
//===================
function _localize(s) {
var strings = {
"Yes – run as JScript\nNo – run as VBScript": {
ru: "Да – запустить как JScript\nНет – запустить как VBScript"
}
};
var lng;
switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
case 0x19: lng = "ru"; break;
default: lng = "en";
}
_localize = function(s) {
return strings[s] && strings[s][lng] || s;
};
return _localize(s);
}
// Read arguments:
// getArg(argName, defaultValue)
var useTempFile = getArg("useTempFile", true);
var type = getArg("type");
var fileToDelete = getArg("fileToDelete");
var onlySelected = getArg("onlySelected", false);
if(fileToDelete) {
var fso = new ActiveXObject("Scripting.FileSystemObject");
if(fso.FileExists(fileToDelete))
fso.DeleteFile(fileToDelete);
WScript.Quit();
}
var hMainWnd = AkelPad.GetMainWnd();
if(!hMainWnd)
WScript.Quit();
var dialogTitle = WScript.ScriptName.replace(/^[!-\-_]+/, "");
dialogTitle = dialogTitle.charAt(0).toUpperCase() + dialogTitle.substr(1);
var filePath = AkelPad.GetEditFile(0);
var isJs = type ? type == "js" : isJsFile(filePath);
var isVbs = type ? type == "vbs" : isVbsFile(filePath);
if(!isJs && !isVbs) {
var btn = AkelPad.MessageBox(
hMainWnd,
_localize("Yes – run as JScript\nNo – run as VBScript"),
WScript.ScriptName,
35 /*MB_YESNOCANCEL|MB_ICONQUESTION*/
);
isJs = btn == 6; //IDYES
isVbs = btn == 7; //IDNO
}
if(useTempFile && (isJs || isVbs)) {
var tmpFile = WScript.ScriptFullName.replace(/\.[^.]+$/, "") + "-exec." + (isJs ? "js" : "vbs");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var textStream = fso.CreateTextFile(tmpFile, true /*overwrite*/, true /*unicode*/);
textStream.Write(AkelPad.GetSelText() || AkelPad.GetTextRange(0, -1));
textStream.Close();
AkelPad.Call("Scripts::Main", 1, fso.GetFileName(tmpFile));
AkelPad.Call("Scripts::Main", 1, WScript.ScriptName, "\"-fileToDelete='" + tmpFile.replace(/[\\'"]/g, "\\$&") + "'\"");
}
else if(isJs)
eval(AkelPad.GetSelText() || (onlySelected ? "" : AkelPad.GetTextRange(0, -1)));
else if(isVbs)
AkelPad.Call("Scripts::Main", 1, WScript.ScriptName.replace(/\.[^.]+$/, "") + ".vbs", "-onlySelected=" + onlySelected);
function getExt(path) {
return /\.([^.]+)$/.test(path) ? RegExp.$1 : "";;
}
function isJsFile(path) {
return /^js(m|on)?$/.test(getExt(path));
}
function isVbsFile(path) {
return /^(bas|vb[s5]?|wbt|frm)$/.test(getExt(path));
}
function getArg(argName, defaultVal) {
var args = {};
for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; i++)
if(/^[-\/](\w+)(=(.+))?$/i.test(WScript.Arguments(i)))
args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
getArg = function(argName, defaultVal) {
argName = argName.toLowerCase();
return typeof args[argName] == "undefined" // argName in args
? defaultVal
: args[argName];
};
return getArg(argName, defaultVal);
} |
<download | mirror | development version>
executeScript.vbs Code: | ' http://akelpad.sourceforge.net/forum/viewtopic.php?p=11863#11863
' http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.js
' http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.vbs
' version 0.1.2 - 2011-04-11
' Supplemental script for runScript.js
' Executes selected or all code
option explicit
dim onlySelected
if WScript.Arguments.length then
onlySelected = WScript.Arguments(0) = "-onlySelected=true"
else
onlySelected = false
end if
if onlySelected <> true and AkelPad.GetSelStart = AkelPad.GetSelEnd then
executeGlobal AkelPad.GetTextRange(0, -1)
else
executeGlobal AkelPad.GetSelText
end if |
(supplemental) <download | mirror | development version>
Execute selected or all code.
Last edited by Infocatcher on Sat Aug 16, 2014 7:51 pm; edited 17 times in total |
|
Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1929 Location: Poland
|
Posted: Sat Mar 12, 2011 2:08 pm Post subject: |
|
|
Replace replicate chars with one char.
ReplaceReplicateCharsWithOne.js
Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11960#11960
// 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 |
|
Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1929 Location: Poland
|
Posted: Sat Mar 12, 2011 8:51 pm Post subject: |
|
|
Inserts a tabulation or spaces, inversely to setting Options->Settings->Editor 1->Tab size->Spaces (bTabStopAsSpaces).
InsertTabOrSpaces.js
Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11964#11964
// 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 |
|
Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 3076 Location: Киев, Русь
|
Posted: Tue Mar 15, 2011 10:07 am Post subject: ini и "Избранное" |
|
|
работа с внешними ini-файлами: INI.js
Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11993#11993
// 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();
}
}
}
}; |
работа с "Избранным"
Favourites.js
Code: | // Description(1033): Export/Replace Favourites-menu
// Description(1049): Работа с меню «Избранное»: экспорт / замена / очистка
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11993#11993
// 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: | "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: | "Избранное" Menu("FAVOURITESMANAGE") Index(-3) |
Скрипт больше не поддерживается, т.к. не имеет смысла. Используйте SessionMenu.js.
Как пользоваться сессиями расписал здесь.
Last edited by VladSh on Thu Sep 15, 2016 7:14 pm; edited 14 times in total |
|
Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1929 Location: Poland
|
Posted: Tue Mar 15, 2011 8:05 pm Post subject: |
|
|
Restores default value URL prefixes (Options->Settings->Editor 2->Prefixes).
ResetUrlPrefixes.js
Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=12008#12008
// 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 |
|
Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1929 Location: Poland
|
Posted: Tue Mar 15, 2011 8:12 pm Post subject: |
|
|
Restores default value URL delimiters (Options->Settings->Editor 2->Delimiters).
ResetUrlDelimiters.js
Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=12009#12009
// 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 |
|
Back to top |
|
 |
Infocatcher
Joined: 06 Aug 2007 Posts: 1767
|
Posted: Sun Mar 20, 2011 8:26 pm Post subject: |
|
|
measuresConverter.js <download | mirror | development version>
Convert measures (internal) and currency (used cached data from exchange-rates.org, fxexchangerate.com and bitcoincharts.com).
Can convert numbers and expressions, pick up selected text.
Screenshots
Post size limit, here is packed file:
measuresConverter.uue Code: | begin 644 measuresConverter.7z
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
MLD.+1BWP)L[F-#CO\`G!]#=:1GO\O8U8PCF)W/>.O_)N5U.R190"CJ(JY
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
G`'(`=`!E`'(`+@!J`',````4"@$`GN29R](_T`$5!@$`(```````
`
end
sum -r/size 11907/22179
|
Save as text file with .uue extension, unpack with Total Commander or WinRAR. And unpack .7z with WinRAR or 7-Zip.
Last edited by Infocatcher on Tue Feb 03, 2015 5:05 pm; edited 15 times in total |
|
Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 3076 Location: Киев, Русь
|
Posted: Thu Mar 24, 2011 12:07 pm Post subject: ассоциирование файлов |
|
|
reassoc.js
Code: | // 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#12169
// 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 |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|