Code: Select all
// Argumens:
// -RW=0 - (default) don't store inserted strings
// =1 - store inserted strings
// -history=20 - (default) set history length (with -RW=1 only)
// Ru:
// -RW=0 - по умолчанию не сохранять введенные строки
// =1 - сохранять введенные строки
// -history=20 - размер истории, по умолчанию 20, только вместе с -RW=1
//
// Usage:
// Call("Scripts::Main", 1, "InsertUnicodeChar.js")
// Call("Scripts::Main", 1, "InsertUnicodeChar.js", '-RW=1')
// Call("Scripts::Main", 1, "InsertUnicodeChar.js", '-RW=1 -history=10')
if (! AkelPad.Include("CreateDialog_functions.js")) WScript.Quit();
var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var pAkelPlugsDir = AkelPad.GetAkelDir(4);
var pAkelScriptsDir = AkelPad.GetAkelDir(5);
var nArg1 = AkelPad.GetArgValue("RW", 0);
var nArg2 = AkelPad.GetArgValue("history", 20);
var fso = new ActiveXObject("Scripting.FileSystemObject");
var aHex;
//read parameters from ini file
if (nArg1 = 1)
{
var sIniFile = WScript.ScriptFullName.replace(/\.js$/i, ".ini");
if (fso.FileExists(sIniFile))
{
var aHex = AkelPad.ReadFile(sIniFile, 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, true).split(/[,]/);
}
else
{
var aHex = ["002F"];
}
}
else
{
var aHex = ["002F"];
}
//GUI. Thanks KDJ
var IDLABELS = 1000;
var IDTEXTCB = 1001;
var IDOKB = 1002;
var IDCANCELB = 1004;
var aDlg = [];
aDlg.Title = "Insert characters from hex codes";
aDlg.Style = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER;
aDlg.Parent = AkelPad.GetMainWnd();
aDlg.Callback = DialogCallback;
aDlg.W = 216;
aDlg.H = 63;
aDlg.CtlStyle = WS_VISIBLE;
aDlg.CtlFontN = "MS Shell Dlg";
aDlg.CtlFirst = IDLABELS;
aDlg[IDLABELS] = {X: 8, Y: 8, W: 200, H: 10, Title: "Four digits hex codes:", Class: "STATIC"};
aDlg[IDTEXTCB] = {X: 8, Y: 20, W: 200, H: 100, Class: "COMBOBOX", Style: WS_TABSTOP | CBS_DROPDOWN};
aDlg[IDOKB] = {X: 8, Y: 40, W: 50, H: 15, Title: "OK", Style: WS_TABSTOP | BS_DEFPUSHBUTTON};
aDlg[IDCANCELB] = {X: 66, Y: 40, W: 50, H: 15, Title: "Cancel", Style: WS_TABSTOP};
CreateDialogBox(aDlg);
function DialogCallback(hWnd, uMsg, wParam, lParam)
{
var nLowParam;
var i;
if (uMsg == 272 /*WM_INITDIALOG*/)
{
//fill ComboBox
for (i = 0; i < aHex.length; ++i)
AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 323 /*CB_ADDSTRING*/, 0, aHex[i]);
AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 334 /*CB_SETCURSEL*/, 0, 0);
}
else if (uMsg == 273 /*WM_COMMAND*/)
{
nLowParam = wParam & 0xFFFF;
if (nLowParam == IDOKB)
{
Action();
oSys.Call("User32::EndDialog", hWnd, 0);
}
else if ((nLowParam == IDCANCELB) || (nLowParam == 2 /*IDCANCEL*/))
oSys.Call("User32::EndDialog", hWnd, 0);
}
}
function Action()
{
var nTextLen = AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 14 /*WM_GETTEXTLENGTH*/, 0, 0) + 1;
var lpText = AkelPad.MemAlloc(nTextLen * 2);
var sIniString = "";
var sChar = "";
var sHex = "";
var i;
AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 13 /*WM_GETTEXT*/, nTextLen, lpText);
sHex = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
AkelPad.MemFree(lpText);
if (sHex.length != 4)
{
AkelPad.MessageBox(hMainWnd, "Four digits only (0-9, A-F).", "Error", 0x10 /*MB_ICONERROR*/);
}
else if (/[^a-f\d]+/i.test(sHex))
{
AkelPad.MessageBox(hMainWnd, "Hex digits only (0-9, A-F).", "Error", 0x10 /*MB_ICONERROR*/);
}
else
{
if (AkelPad.GetEditWnd())
{
if(fso.FileExists(pAkelPlugsDir + "\\HexSel.dll"))
{
AkelPad.Call("HexSel::Main", 1, 10, "", "", sHex);
}
else
{
if (sHex = sHex.substr(0, Math.floor(sHex.length / 4) * 4))
{
for (i = 0; i < sHex.length; i += 4)
sChar += String.fromCharCode(parseInt(sHex.substr(i, 4), 16));
AkelPad.ReplaceSel(sChar);
}
}
}
}
//add sHex to aHex & write parameters (aHex and other) to ini file
if (nArg1 = 1)
{
var oFile = fso.OpenTextFile(WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini", 2, true, -1);
if (sHex != aHex[0])
{
sIniString = aHex.unshift(sHex);
}
if (aHex.length > nArg2)
{
aHex.splice(nArg2, aHex.length)
}
sIniString = aHex.join(",");
oFile.Write(sIniString);
oFile.Close();
}
}