Scripts collection
Discuss and announce AkelPad plugins
- Author
- Message
-
Offline
- Posts: 670
- Joined: Thu Jun 03, 2010 8:47 am
- Location: Сочи, Хоста
- Contact:
Post by Andrey_A_A »
На днях готовил релиз AkelPad Image, собралось немало интересных наработок.
Выкладываю одним архивом 170 скриптов, написанных с 2010 года на vbs (возможно что-то из этого списка понравится и принесёт пользу)
Архив скриптов
Список с описанием всех скриптов
Если нужно будет, то архив можно залить на внутренний ресурс и добавить ссылку на первую страницу.
Обновлено 23.01.2016
----------------
В архив добавлены примеры использования и описание
Выкладываю одним архивом 170 скриптов, написанных с 2010 года на vbs (возможно что-то из этого списка понравится и принесёт пользу)
Архив скриптов
Список с описанием всех скриптов
Если нужно будет, то архив можно залить на внутренний ресурс и добавить ссылку на первую страницу.
Обновлено 23.01.2016
----------------
В архив добавлены примеры использования и описание
Last edited by Andrey_A_A on Fri Jan 22, 2016 11:42 pm, edited 5 times in total.
-
Offline
- Posts: 1949
- Joined: Sat Mar 06, 2010 7:40 pm
- Location: Poland
Right click on LineBoard panel, calls any script or ContextMenu::Show instead of LineBoard menu.
Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=23559#p23559
// Version: 2015-03-19
// Author: KDJ
//
// *** Right click on LineBoard panel, calls any script or ContextMenu::Show instead of LineBoard menu ***
//
// Usage:
// Call("Scripts::Main", 1, "LineBoardRClickPanel.js", '"ScriptOrMenu" "Parameters"')
//
// Arguments (are optional):
// "ScriptOrMenu"
// script name or submenu defined in ContextMenu::Show, default is "LineBoardBookmarks.js"
// "Parameters"
// parameters passed to the script; if script is "LineBoardBookmarks.js", default parameter is "MM"
//
// Notes:
// After first call, the script resides in the memory.
// Second script call, closes the script.
//
// For autostart, in AkelPad.ini or registry CmdLineBegin/CmdLineEnd key, need to add eg:
// /Call("Scripts::Main", 1, "LineBoardRClickPanel.js")
// show menu from script LineBoardBookmarks.js at mouse cursor position
// /Call("Scripts::Main", 1, "LineBoardRClickPanel.js", '"Bookmarks"')
// show user submenu "Bookmarks" from ContextMenu plugin at cursor position
// #menu example
// "Bookmarks"
// {
// "Set bookmarks"
// {
// -"In selection" Call("Scripts::Main", 1, "LineBoardBookmarks.js", "BS")
// -"All" Call("Scripts::Main", 1, "LineBoardBookmarks.js", "B")
// }
// "Delete bookmarks"
// {
// -"In selection" Call("Scripts::Main", 1, "LineBoardBookmarks.js", "US")
// -"All" Call("Scripts::Main", 1, "LineBoardBookmarks.js", "U"')
// }
// "Inverse bookmarks"
// {
// -"In selection" Call("Scripts::Main", 1, "LineBoardBookmarks.js", "IS")
// -"All" Call("Scripts::Main", 1, "LineBoardBookmarks.js", "I"')
// }
// SEPARATOR
// "Settings" Call("LineBoard::Settings")
// }
var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
if (hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
//script already is running, close it
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
var hSubClassEdit = AkelPad.WindowSubClass(2 /*WSC_EDITPROC*/, EditCallback, 123 /*WM_CONTEXTMENU*/);
var sArg0, sArg1;
var bMenu;
if (hSubClassEdit)
{
if (WScript.Arguments.length)
{
sArg0 = WScript.Arguments(0).toUpperCase();
if ((sArg0.slice(-3) == ".JS") || (sArg0.slice(-4) == ".VBS"))
{
if (WScript.Arguments.length > 1)
sArg1 = WScript.Arguments(1);
else if (sArg0 == "LINEBOARDBOOKMARKS.JS")
sArg1 = "MM";
}
else
bMenu = true;
}
else
{
sArg0 = "LineBoardBookmarks.js";
sArg1 = "MM";
}
//Allow other scripts running
AkelPad.ScriptNoMutex();
//Message loop
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(2 /*WSC_EDITPROC*/);
}
}
function EditCallback(hWnd, uMsg, wParam, lParam)
{
if ((uMsg == 123 /*WM_CONTEXTMENU*/) && AkelPad.IsPluginRunning("LineBoard::Main") && IsRClickPanel(hWnd, lParam & 0xFFFF, (lParam >> 16) & 0xFFFF))
{
AkelPad.WindowNoNextProc(hSubClassEdit);
if (bMenu)
AkelPad.Call("ContextMenu::Show", 1, "-6", "-6", -1, sArg0);
else
AkelPad.Call("Scripts::Main", 1, sArg0, sArg1);
AkelPad.WindowNoNextProc(hSubClassEdit);
}
return 0;
}
function IsRClickPanel(hWnd, nCursorX, nCursorY)
{
var lpRect = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
//get rectangle outside panels
AkelPad.CallW("LineBoard::Main", 11, hWnd, 0, lpRect);
AkelPad.SystemFunction().Call("User32::ClientToScreen", hWnd, lpRect);
AkelPad.SystemFunction().Call("User32::ClientToScreen", hWnd, lpRect + 8);
var nX = AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/);
var nY = AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/);
var nH = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/);
AkelPad.MemFree(lpRect);
if ((nCursorX <= nX) && (nCursorY >= nY) && (nCursorY <= nH))
return true;
return false;
}
Last edited by KDJ on Thu Mar 19, 2015 6:01 pm, edited 4 times in total.
-
Offline
- Posts: 1949
- Joined: Sat Mar 06, 2010 7:40 pm
- Location: Poland
Preview of AkelPad docs files (...\AkelPad\AkelFiles\Docs\) - part 1.
The script should be saved in Unicode format.
Required to include: BrowseForFolder_function.js and CreateDialog_functions.js
Part 2 is here: AkelPadDocsView_part2.js
All in one: KDJ.zip
The script should be saved in Unicode format.
Required to include: BrowseForFolder_function.js and CreateDialog_functions.js
Part 2 is here: AkelPadDocsView_part2.js
All in one: KDJ.zip
Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=23830#p23830
// Version: 2016-06-05
// Author: KDJ
//
// *** Preview of AkelPad docs files (...\AkelPad\AkelFiles\Docs\) ***
//
// Required to include: BrowseForFolder_function.js and CreateDialog_functions.js
//
// Usage:
// Call("Scripts::Main", 1, "AkelPadDocsView.js")
// Call("Scripts::Main", 1, "AkelPadDocsView.js", '-DocDir="C:\Documents\AkelPad" -DocOwn=1')
//
// Arguments (are optional):
// -DocDir - documents directory;
// default is -DocDir="" - standard AkelPad Docs subdirectory
// -DocOwn - if equal to 1 (true) - documents list is reading from the script ini file (variable aDocOwn);
// ini file will be created after first start the script;
// if the script is not running, you can edit ini file and change this list;
// default value is 0 (false) - standard AkelPad documents list is reading
//
// Keyboard and mouse:
// Tab - rigth <-> left panel
// Ctrl(+Shift)+Tab - next/previous document
// F1 - menu
// F4 or Alt+Enter - maximize/restore window
// right click on document name or contents - context menu
// double click on document name - open/close file in AkelPad
//
// Remarks:
// The script should be saved in Unicode format.
// For proper operation of preview the files "AkelHelp-*.htm" on Win7, AkelPad must be run as administrator.
var oSys = AkelPad.SystemFunction();
var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + AkelPad.GetInstanceDll();
if (IsScriptRunning() || (! (AkelPad.Include("BrowseForFolder_function.js") && AkelPad.Include("CreateDialog_functions.js"))))
WScript.Quit();
GetLangStrings();
var sDocDir = AkelPad.GetArgValue("DocDir", "");
var bDocOwn = AkelPad.GetArgValue("DocOwn", 0);
if (! sDocDir)
sDocDir = AkelPad.GetAkelDir(2 /*ADTYPE_DOCS*/) + "\\";
else if (sDocDir.slice(-1) != "\\")
sDocDir += "\\";
var aDocStd = [
["AkelHelp", "htm"],
["AkelHistory", "txt"],
["Clipboard", "txt"],
["Coder", "txt"],
["ContextMenu", "txt"],
["Exit", "txt"],
["Explorer", "txt"],
["Fonts", "txt"],
["Format", "txt"],
["FullScreen", "txt"],
["HexSel", "txt"],
["Hotkeys", "txt"],
["LineBoard", "txt"],
["Log", "txt"],
["Macros", "txt"],
["MinimizeToTray", "txt"],
["QSearch", "txt"],
["RecentFiles", "txt"],
["SaveFile", "txt"],
["Scripts", "txt"],
["Scroll", "txt"],
["Sessions", "txt"],
["SmartSel", "txt"],
["Sounds", "txt"],
["SpecialChar", "txt"],
["Speech", "txt"],
["SpellCheck", "txt"],
["Stats", "txt"],
["Templates", "txt"],
["ToolBar", "txt"],
["XBrackets", "txt"]];
var oFSO = new ActiveXObject("Scripting.FileSystemObject");
var hAtlLib = oSys.Call("Kernel32::LoadLibraryW", "Atl.dll");
var hMainWnd = AkelPad.GetMainWnd();
var aIsLang = new Array(2);
var bCaseFT = 0;
var bAllDocFT = 1;
var nDirectFT = 0;
var bWordWrap = 0;
var bSeparateWnd = 0;
var nLang = 0;
var nAPDSel = 0;
var sAPDSel = "";
var aAPD = [];
var aAESel;
var aFT;
var aDocOwn;
var oWB;
var hWndIES;
var bCloseDlg;
var bNewFT;
var hSubClass;
var nTextMax = 512;
var lpTextLV = AkelPad.MemAlloc(nTextMax * 2);
var lpLVITEM = AkelPad.MemAlloc(_X64 ? (72) : (60)); //sizeof(LVITEM)
AkelPad.MemCopy(lpLVITEM, 0x0001 /*LVIF_TEXT*/, 3 /*DT_DWORD*/);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 24 : 20), lpTextLV, 2 /*DT_QWORD*/);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, _X64 ? 32 : 24), nTextMax, 3 /*DT_DWORD*/);
var IDFILE = 1000;
var IDNAME = 1001;
var IDTEXT = 1002;
var IDWB = 1003;
var IDLANG1 = 1004;
var IDLANG2 = 1005;
var IDMENU = 1006;
var IDCLOSE = 1007;
var aDlg = [];
aDlg.Class = sClass;
aDlg.Title = sTxtDlgTitle;
aDlg.Style = WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
aDlg.Callback = DlgCallback;
aDlg.CtlFirst = IDFILE;
aDlg.CtlStyle = WS_VISIBLE;
aDlg.CtlFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
aDlg.MinW = 640;
aDlg.MinH = 300;
aDlg.X = 100;
aDlg.Y = 100;
aDlg.W = aDlg.MinW;
aDlg.H = aDlg.MinH;
aDlg.Maxim = 0;
aDlg[IDFILE] = {Class: "STATIC", Style: SS_CENTER};
aDlg[IDNAME] = {Class: "SysListView32", Style: WS_BORDER|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_REPORT};
aDlg[IDTEXT] = {Class: "AkelEditW", Style: WS_BORDER|WS_VSCROLL|WS_HSCROLL|ES_READONLY|ES_MULTILINE};
aDlg[IDWB] = {Class: "AtlAxWin", Style: WS_BORDER, Title: "Shell.Explorer.2"};
aDlg[IDLANG1] = {Style: BS_AUTORADIOBUTTON, Title: sTxtEnglish};
aDlg[IDLANG2] = {Style: BS_AUTORADIOBUTTON, Title: sTxtRussian};
aDlg[IDMENU] = {Title: sTxtMenu};
aDlg[IDCLOSE] = {Title: sTxtClose};
var IDFTWHAT = 2000;
var IDFTTEXT = 2001;
var IDFTCASE = 2002;
var IDFTALLDOC = 2003;
var IDFTDIRECT = 2004;
var IDFTBEGIN = 2005;
var IDFTDOWN = 2006;
var IDFTUP = 2007;
var IDFTEND = 2008;
var IDFTFIND = 2009;
var IDFTCANCEL = 2010;
var aDlgFT = [];
aDlgFT.Title = sTxtFindInTxt;
aDlgFT.Style = WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU;
aDlgFT.W = -280;
aDlgFT.H = 138;
aDlgFT.Callback = FTDlgCallback;
aDlgFT.CtlFirst = IDFTWHAT;
aDlgFT.PosPix = 1;
aDlgFT.PosPar = 2;
aDlgFT.PosEdge = "RT";
aDlgFT.CtlStyle = WS_VISIBLE;
aDlgFT.CtlFontN = "MS Shell Dlg";
aDlgFT[IDFTWHAT] = {X: 10, Y: 13, W: 30, H: 13, Title: sTxtWhat, Class: "STATIC"};
aDlgFT[IDFTTEXT] = {X: 40, Y: 10, W: 230, H: 200, Class: "COMBOBOX", Style: WS_TABSTOP|CBS_AUTOHSCROLL|CBS_DROPDOWN};
aDlgFT[IDFTCASE] = {X: 10, Y: 35, W: 85, H: 20, Title: sTxtMatchCase, Style: WS_TABSTOP|BS_AUTOCHECKBOX};
aDlgFT[IDFTALLDOC] = {X: 10, Y: 55, W: 85, H: 20, Title: sTxtAllDocs, Style: WS_TABSTOP|BS_AUTOCHECKBOX};
aDlgFT[IDFTDIRECT] = {X: 100, Y: 37, W: 85, H: 91, Title: sTxtDirection, Style: BS_GROUPBOX};
aDlgFT[IDFTBEGIN] = {X: 110, Y: 53, W: 65, H: 16, Title: sTxtBeginning, Style: BS_AUTORADIOBUTTON};
aDlgFT[IDFTDOWN] = {X: 110, Y: 71, W: 65, H: 16, Title: sTxtDown, Style: BS_AUTORADIOBUTTON};
aDlgFT[IDFTUP] = {X: 110, Y: 89, W: 65, H: 16, Title: sTxtUp, Style: BS_AUTORADIOBUTTON};
aDlgFT[IDFTEND] = {X: 110, Y: 107, W: 65, H: 16, Title: sTxtEnd, Style: BS_AUTORADIOBUTTON};
aDlgFT[IDFTFIND] = {X: 195, Y: 79, W: 75, H: 23, Title: sTxtFindNext, Style: WS_TABSTOP|BS_DEFPUSHBUTTON};
aDlgFT[IDFTCANCEL] = {X: 195, Y: 105, W: 75, H: 23, Title: sTxtCancel, Style: WS_TABSTOP|BS_PUSHBUTTON};
if (oSys.Call("Atl::AtlAxWinInit"))
{
AkelPad.ScriptNoMutex();
AkelPad.WindowRegisterClass(sClass);
while (! bCloseDlg)
{
ReadIni();
GetArrayAPD(hMainWnd);
if (! aAPD.length)
break;
bCloseDlg = true;
aDlg.HWND = 0;
aDlg.Parent = bSeparateWnd ? 0 : hMainWnd;
oWB = 0;
hWndIES = 0;
SetForegroundWindow(hMainWnd);
CreateDialogWindow(aDlg, 1);
oSys.Call("User32::ShowWindow", aDlg.HWND, aDlg.Maxim ? 3 /*SW_MAXIMIZE*/ : 1 /*SW_SHOWNORMAL*/);
AkelPad.WindowGetMessage();
}
}
AkelPad.WindowUnregisterClass(sClass);
oSys.Call("Kernel32::FreeLibrary", hAtlLib);
AkelPad.MemFree(lpTextLV);
AkelPad.MemFree(lpLVITEM);
SetForegroundWindow(hMainWnd);
function DlgCallback(hWnd, uMsg, wParam, lParam)
{
var nID, nCode;
if (uMsg == 1 /*WM_CREATE*/)
{
aDlg.HWND = hWnd;
CreateDialogWindow(aDlg, 2, hWnd);
InitDialog();
PostMessage(hWnd, 0x8000 /*WM_APP*/, 0, 0);
}
else if (uMsg == 0x8000 /*WM_APP*/)
{
if (aAESel[nLang][aAPD[nAPDSel][0]])
SetSelAE(aAESel[nLang][aAPD[nAPDSel][0]][0], aAESel[nLang][aAPD[nAPDSel][0]][1]);
}
else if (uMsg == 7 /*WM_SETFOCUS*/)
oSys.Call("User32::SetFocus", aDlg.Focus);
else if (uMsg == 36 /*WM_GETMINMAXINFO*/)
{
AkelPad.MemCopy(_PtrAdd(lParam, 24), Scale.X(aDlg.MinW), 3 /*DT_DWORD*/); //ptMinTrackSize_x
AkelPad.MemCopy(_PtrAdd(lParam, 28), Scale.Y(aDlg.MinH), 3 /*DT_DWORD*/); //ptMinTrackSize_y
}
else if (uMsg == 3 /*WM_MOVE*/)
{
if (! (oSys.Call("User32::IsZoomed", hWnd) || oSys.Call("User32::IsIconic", hWnd)))
GetWindowPos(hWnd, aDlg);
}
else if (uMsg == 5 /*WM_SIZE*/)
{
if (wParam == 0 /*SIZE_RESTORED*/)
GetWindowPos(hWnd, aDlg);
ResizeDlg(LoWord(lParam), HiWord(lParam));
}
else if (uMsg == 15 /*WM_PAINT*/)
PaintSizeGrip();
else if (uMsg == 256 /*WM_KEYDOWN*/)
{
if (wParam == 9 /*VK_TAB*/)
{
if (Ctrl())
{
if (Shift())
{
if (--nAPDSel < 0)
nAPDSel = aAPD.length - 1;
}
else
{
if (++nAPDSel >= aAPD.length)
nAPDSel = 0;
}
SetCurSelLV(nAPDSel);
if (oSys.Call("User32::IsWindowVisible", aDlg[IDWB].HWND))
{
if (aDlg.Focus == aDlg[IDTEXT].HWND)
aDlg.Focus = hWndIES;
}
else if (aDlg.Focus != aDlg[IDNAME].HWND)
aDlg.Focus = aDlg[IDTEXT].HWND;
}
else
{
if (aDlg.Focus == aDlg[IDNAME].HWND)
{
if (oSys.Call("User32::IsWindowVisible", aDlg[IDWB].HWND))
aDlg.Focus = hWndIES;
else
aDlg.Focus = aDlg[IDTEXT].HWND;
}
else
aDlg.Focus = aDlg[IDNAME].HWND;
}
oSys.Call("User32::SetFocus", aDlg.Focus);
}
else if (wParam == 0x41 /*A key*/)
{
if (Ctrl() && (! Shift()) && (! Alt()) && (aDlg.Focus == hWndIES))
oWB.ExecWB(17 /*OLECMDID_SELECTALL*/, 0, 0, 0);
}
else if ((wParam == 0x43 /*C key*/) || (wParam == 0x2D /*VK_INSERT*/))
{
if (Ctrl() && (! Alt()))
{
if (aDlg.Focus == aDlg[IDNAME].HWND)
InsertNameTo(! Shift(), false);
else if (aDlg.Focus == aDlg[IDTEXT].HWND)
InsertTextTo(! Shift());
else if ((aDlg.Focus == hWndIES) && (! Shift()))
oWB.ExecWB(12 /*OLECMDID_COPY*/, 0, 0, 0);
}
}
else if (wParam == 0x46 /*F key*/)
{
if (Ctrl() && (! Shift()) && (! Alt()))
{
if (oSys.Call("User32::IsWindowVisible", aDlg[IDWB].HWND))
oWB.ExecWB(32 /*OLECMDID_FIND*/, 0, 0, 0);
else
FTDialog();
}
}
else if (wParam == 0x55 /*U key*/)
{
if (Ctrl() && (! Shift()) && (! Alt()))
{
bWordWrap = ! bWordWrap;
SetWordWrapAE();
}
}
else if (wParam == 0x70 /*VK_F1*/)
{
if ((! Ctrl()) && (! Shift()))
MenuMain();
}
else if (wParam == 0x72 /*VK_F3*/)
{
if (! Ctrl())
{
if (oSys.Call("User32::IsWindowVisible", aDlg[IDWB].HWND))
oWB.ExecWB(32 /*OLECMDID_FIND*/, 0, 0, 0);
else
FindTextNext(Shift() ? 2 : 1);
}
}
else if (wParam == 0x73 /*VK_F4*/)
{
if ((! Ctrl()) && (! Shift()))
oSys.Call("User32::ShowWindow", hWnd, oSys.Call("User32::IsZoomed", hWnd) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
}
else if (wParam == 13 /*VK_RETURN*/)
{
if ((Ctrl() || Shift()) && (! Alt()) && (aDlg.Focus == aDlg[IDNAME].HWND))
OpenOrCloseFile();
}
}
else if (uMsg == 260 /*WM_SYSKEYDOWN*/)
{
if ((wParam == 0x43 /*C key*/) || (wParam == 0x2D /*VK_INSERT*/))
{
if (aDlg.Focus == aDlg[IDNAME].HWND)
InsertNameTo(! Shift(), true);
}
else if ((wParam == 13 /*VK_RETURN*/) && (! Shift()))
oSys.Call("User32::ShowWindow", hWnd, oSys.Call("User32::IsZoomed", hWnd) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
}
else if (uMsg == 78 /*WM_NOTIFY*/)
{
if (wParam == IDNAME)
{
switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), 3 /*DT_DWORD*/))
{
case -101 : //LVN_ITEMCHANGED
if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 20) /*NMLISTVIEW.uNewState*/, 3 /*DT_DWORD*/) & 0x2 /*LVIS_SELECTED*/)
{
nAPDSel = GetCurSelLV();
SendMessage(aDlg[IDFILE].HWND, 12 /*WM_SETTEXT*/, 0, aAPD[nAPDSel][2]);
if ((aAPD[nAPDSel][2].slice(-3) == "htm") && oFSO.FileExists(aAPD[nAPDSel][2]) && oWB)
{
oSys.Call("User32::ShowWindow", aDlg[IDTEXT].HWND, 0 /*SW_HIDE*/);
oSys.Call("User32::ShowWindow", aDlg[IDWB].HWND, 5 /*SW_SHOW*/);
if (oWB.LocationName != aAPD[nAPDSel][2].substr(aAPD[nAPDSel][2].lastIndexOf("\\") + 1))
oWB.Navigate(aAPD[nAPDSel][2]);
}
else
{
oSys.Call("User32::ShowWindow", aDlg[IDWB].HWND, 0 /*SW_HIDE*/);
oSys.Call("User32::ShowWindow", aDlg[IDTEXT].HWND, 5 /*SW_SHOW*/);
SendMessage(aDlg[IDTEXT].HWND, 12 /*WM_SETTEXT*/, 0, aAPD[nAPDSel][1]);
if (aAESel[nLang][aAPD[nAPDSel][0]])
SetSelAE(aAESel[nLang][aAPD[nAPDSel][0]][0], aAESel[nLang][aAPD[nAPDSel][0]][1]);
}
}
break;
case -3 : //NM_DBLCLK
if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) > -1)
{
OpenOrCloseFile();
break;
}
case -2 : //NM_CLICK
case -5 : //NM_RCLICK
case -6 : //NM_RDBLCLK
if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12) /*NMITEMACTIVATE.iItem*/, 3 /*DT_DWORD*/) == -1)
SetCurSelLV(GetCurFocLV());
break;
case -7 : //NM_SETFOCUS
aDlg.Focus = aDlg[IDNAME].HWND;
break;
}
}
else if (wParam == IDTEXT)
{
if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), 3 /*DT_DWORD*/) == 2103 /*AEN_LINK*/)
{
if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 16) /*AENLINK.uMsg*/, 3 /*DT_DWORD*/) == 515 /*WM_LBUTTONDBLCLK*/)
{
OpenLinkAE(lParam);
return 1;
}
}
}
}
else if (uMsg == 123 /*WM_CONTEXTMENU*/)
{
if (wParam == aDlg[IDNAME].HWND)
MenuName(LoWord(lParam), HiWord(lParam));
else if (wParam == aDlg[IDTEXT].HWND)
{
oSys.Call("User32::SetFocus", aDlg[IDTEXT].HWND);
MenuText(LoWord(lParam), HiWord(lParam));
}
}
else if (uMsg == 273 /*WM_COMMAND*/)
{
nID = LoWord(wParam);
nCode = HiWord(wParam);
if (nID == IDTEXT)
{
if (nCode == 0x0100 /*EN_SETFOCUS*/)
{
if (SendMessage(AkelPad.GetEditWnd(), 3227 /*AEM_GETOPTIONS*/, 0, 0) & 0x00000800 /*AECO_ACTIVELINE*/)
SendMessage(lParam, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00000800 /*AECO_ACTIVELINE*/);
aDlg.Focus = lParam;
}
else if (nCode == 0x0200 /*EN_KILLFOCUS*/)
{
SendMessage(lParam, 3228 /*AEM_SETOPTIONS*/, 4 /*AECOOP_XOR*/, 0x00000800 /*AECO_ACTIVELINE*/);
aAESel[nLang][aAPD[nAPDSel][0]] = [GetSelStartAE(), GetSelEndAE()];
}
}
else if ((nID >= IDLANG1) && (nID <= IDLANG2))
{
sAPDSel = aAPD[nAPDSel][0];
CheckButtons(nID);
GetArrayAPD(hWnd);
if (aAPD.length)
{
CheckButtons();
FillLV(nAPDSel, sAPDSel.toUpperCase());
oSys.Call("User32::SetFocus", aDlg.Focus);
}
else
PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
}
else if (nID == IDMENU)
{
oSys.Call("User32::SetFocus", aDlg.Focus);
MenuMain();
SendMessage(aDlg[IDMENU].HWND, 0xF4 /*BM_SETSTYLE*/, BS_PUSHBUTTON, 1);
}
else if ((nID == IDCLOSE) || (nID == 2 /*IDCANCEL*/))
PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
}
else if (uMsg == 16 /*WM_CLOSE*/)
{
aAESel[nLang][aAPD[nAPDSel][0]] = [GetSelStartAE(), GetSelEndAE()];
WriteIni();
AkelPad.WindowUnsubClass(hWndIES);
oSys.Call("User32::DestroyWindow", hWnd);
}
else if (uMsg == 2 /*WM_DESTROY*/)
oSys.Call("User32::PostQuitMessage", 0);
return 0;
}
function InitDialog()
{
var hEditWnd = AkelPad.GetEditWnd();
var lpRect;
var lpAECOLORS;
var lpPOINT;
var lpIndex1;
var lpIndex2;
var nOffset1;
var nOffset2;
var lppUnknown;
var lpLVCOLUMN;
CheckButtons();
//AkelEdit
lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
AkelPad.MemCopy(_PtrAdd(lpRect, 0), 4, 3 /*DT_DWORD*/);
AkelPad.MemCopy(_PtrAdd(lpRect, 4), 4, 3 /*DT_DWORD*/);
AkelPad.MemCopy(_PtrAdd(lpRect, 8), 4, 3 /*DT_DWORD*/);
AkelPad.MemCopy(_PtrAdd(lpRect, 12), 4, 3 /*DT_DWORD*/);
SendMessage(aDlg[IDTEXT].HWND, 3178 /*AEM_SETRECT*/, 0x03 /*AERC_MARGINS|AERC_UPDATE*/, lpRect);
AkelPad.MemFree(lpRect);
SendMessage(aDlg[IDTEXT].HWND, 48 /*WM_SETFONT*/, SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, 0, 0), true);
SendMessage(aDlg[IDTEXT].HWND, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x10000000 /*AECO_DISABLEBEEP*/);
SendMessage(aDlg[IDTEXT].HWND, 3234 /*AEM_EXSETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00000001 /*AECOE_DETECTURL*/);
SendMessage(aDlg[IDTEXT].HWND, 3226 /*AEM_SETEVENTMASK*/, 0, 0x00040000 /*AENM_LINK*/);
SetWordWrapAE();
if (hEditWnd)
{
lpAECOLORS = AkelPad.MemAlloc(17 * 4);
AkelPad.MemCopy(lpAECOLORS, 0x0001FFFE /*AECLR_ALL*/, 3 /*DT_DWORD*/);
SendMessage(hEditWnd, 3231 /*AEM_GETCOLORS*/, 0, lpAECOLORS);
SendMessage(aDlg[IDTEXT].HWND, 3232 /*AEM_SETCOLORS*/, 0, lpAECOLORS);
AkelPad.MemFree(lpAECOLORS);
if (SendMessage(hEditWnd, 3227 /*AEM_GETOPTIONS*/, 0, 0) & 0x00001000 /*AECO_ACTIVELINEBORDER*/)
SendMessage(aDlg[IDTEXT].HWND, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00001000 /*AECO_ACTIVELINEBORDER*/);
lpPOINT = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
SendMessage(hEditWnd, 3237 /*AEM_GETCARETWIDTH*/, 0, lpPOINT);
SendMessage(aDlg[IDTEXT].HWND, 3238 /*AEM_SETCARETWIDTH*/, 0, lpPOINT);
AkelPad.MemFree(lpPOINT);
SendMessage(aDlg[IDTEXT].HWND, 3260 /*AEM_SETLINEGAP*/, SendMessage(hEditWnd, 3259 /*AEM_GETLINEGAP*/, 0, 0), 0);
lpIndex1 = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
lpIndex2 = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 3 /*AEGI_FIRSTSELCHAR*/, lpIndex1);
SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 4 /*AEGI_LASTSELCHAR*/, lpIndex2);
if (SendMessage(hEditWnd, 3133 /*AEM_INDEXCOMPARE*/, lpIndex1, lpIndex2) == 0)
{
if (! SendMessage(hEditWnd, 3146 /*AEM_ISDELIMITER*/, 0x11 /*AEDLM_WORD|AEDLM_PREVCHAR*/, lpIndex1))
SendMessage(hEditWnd, 3145 /*AEM_GETPREVBREAK*/, 0x1 /*AEWB_LEFTWORDSTART*/, lpIndex1);
if (! SendMessage(hEditWnd, 3146 /*AEM_ISDELIMITER*/, 0x10 /*AEDLM_WORD*/, lpIndex2))
SendMessage(hEditWnd, 3144 /*AEM_GETNEXTBREAK*/, 0x8 /*AEWB_RIGHTWORDEND*/, lpIndex2);
}
nOffset1 = SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex1);
nOffset2 = SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex2);
AkelPad.MemFree(lpIndex1);
AkelPad.MemFree(lpIndex2);
if (nOffset1 != nOffset2)
sAPDSel = AkelPad.GetTextRange(nOffset1, nOffset2).substr(0, 256);
}
//WebBrowser
lppUnknown = AkelPad.MemAlloc(_X64 ? 8 : 4 /*sizeof(IUnknown**)*/);
if (oSys.Call("Atl::AtlAxGetControl", aDlg[IDWB].HWND, lppUnknown) == 0 /*S_OK*/)
{
oWB = AkelPad.VarDispatch(AkelPad.MemRead(lppUnknown, 2 /*DT_QWORD*/));
oWB.Silent = true;
AkelPad.ConnectObject(oWB, "WB_", "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" /*DIID_DWebBrowserEvents2*/);
}
AkelPad.MemFree(lppUnknown);
//ListView
lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44); //sizeof(LVCOLUMN)
AkelPad.MemCopy(lpLVCOLUMN, 4 /*mask=LVCF_TEXT*/, 3 /*DT_DWORD*/);
AkelPad.MemCopy(_PtrAdd(lpLVCOLUMN, _X64 ? 16 : 12), lpTextLV, 2 /*DT_QWORD*/);
AkelPad.MemCopy(lpTextLV, sTxtDocument, 1 /*DT_UNICODE*/);
SendMessage(aDlg[IDNAME].HWND, 0x1036 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0x0020 /*LVS_EX_FULLROWSELECT*/, 0x0020);
SendMessage(aDlg[IDNAME].HWND, 0x1061 /*LVM_INSERTCOLUMNW*/, 0, lpLVCOLUMN);
AkelPad.MemFree(lpLVCOLUMN);
FillLV(nAPDSel, sAPDSel.toUpperCase());
oSys.Call("User32::SetFocus", aDlg[IDTEXT].HWND);
oSys.Call("User32::SetFocus", aDlg[IDNAME].HWND);
}
function WB_DocumentComplete(pDisp, URL)
{
if (! hWndIES)
{
oWB.Document.focus(); //must be repeated, why?
oWB.Document.focus();
hWndIES = oSys.Call("User32::GetFocus");
hSubClass = AkelPad.WindowSubClass(hWndIES, IESCallback, 7 /*WM_SETFOCUS*/);
if (oSys.Call("User32::IsWindowVisible", aDlg.Focus))
oSys.Call("User32::SetFocus", aDlg.Focus);
else
aDlg.Focus = hWndIES;
}
}
function IESCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 7 /*WM_SETFOCUS*/)
aDlg.Focus = hWndIES;
return 0;
}
function LoWord(nDwNum)
{
return nDwNum & 0xFFFF;
}
function HiWord(nDwNum)
{
return (nDwNum >> 16) & 0xFFFF;
}
function MkLong(nLoWord, nHiWord)
{
return (nLoWord & 0xFFFF) | (nHiWord << 16);
}
function Ctrl()
{
return oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
}
function Shift()
{
return oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000;
}
function Alt()
{
return oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU*/) & 0x8000;
}
function SendMessage(hWnd, uMsg, wParam, lParam)
{
return AkelPad.SendMessage(hWnd, uMsg, wParam, lParam);
}
function PostMessage(hWnd, uMsg, wParam, lParam)
{
return oSys.Call("User32::PostMessageW", hWnd, uMsg, wParam, lParam);
}
function PaintSizeGrip()
{
var lpPaint = AkelPad.MemAlloc(_X64 ? 72 : 64); //sizeof(PAINTSTRUCT)
var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
var hDC;
if (hDC = oSys.Call("User32::BeginPaint", aDlg.HWND, lpPaint))
{
oSys.Call("User32::GetClientRect", aDlg.HWND, lpRect);
AkelPad.MemCopy(_PtrAdd(lpRect, 0), AkelPad.MemRead(_PtrAdd(lpRect, 8), 3 /*DT_DWORD*/) - oSys.Call("User32::GetSystemMetrics", 2 /*SM_CXVSCROLL*/), 3 /*DT_DWORD*/);
AkelPad.MemCopy(_PtrAdd(lpRect, 4), AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/) - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), 3 /*DT_DWORD*/);
oSys.Call("User32::DrawFrameControl", hDC, lpRect, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/);
oSys.Call("User32::EndPaint", aDlg.HWND, lpPaint);
}
AkelPad.MemFree(lpPaint);
AkelPad.MemFree(lpRect);
}
function ResizeDlg(nW, nH)
{
var nFlags = 0x14; //SWP_NOACTIVATE|SWP_NOZORDER
var nGapW = Scale.X(10);
var nGapH = Scale.Y(10);
var nLVW = Scale.X(110);
var nAEW = nW - nLVW - 3 * nGapW;
var i;
oSys.Call("User32::SetWindowPos",
aDlg[IDFILE].HWND, 0,
nW - nAEW - nGapW,
nGapH,
nAEW,
Scale.Y(13),
nFlags);
oSys.Call("User32::SetWindowPos",
aDlg[IDNAME].HWND, 0,
nGapW,
nGapH,
nLVW,
nH - nGapH - Scale.Y(23) - 2 * Scale.Y(25) - 2 * Scale.Y(20),
nFlags);
for (i = IDTEXT; i <= IDWB; ++i)
{
oSys.Call("User32::SetWindowPos",
aDlg[i].HWND, 0,
nW - nAEW - nGapW,
3 * nGapH,
nAEW,
nH - 4 * nGapH,
nFlags);
}
for (i = IDLANG1; i <= IDLANG2; ++i)
{
oSys.Call("User32::SetWindowPos",
aDlg[i].HWND, 0,
Scale.X(30),
nH - nGapH - Scale.Y(23) - 2 * Scale.Y(25) - (IDLANG2 - i) * Scale.Y(20),
Scale.X(70),
Scale.Y(16),
nFlags);
}
for (i = IDMENU; i <= IDCLOSE; ++i)
{
oSys.Call("User32::SetWindowPos",
aDlg[i].HWND, 0,
nGapW,
nH - nGapH - Scale.Y(23) - (IDCLOSE - i) * Scale.Y(25),
nLVW,
Scale.Y(23),
nFlags);
}
SendMessage(aDlg[IDNAME].HWND, 0x101E /*LVM_SETCOLUMNWIDTH*/, 0, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
SendMessage(aDlg[IDNAME].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, GetCurSelLV(), false);
oSys.Call("user32::InvalidateRect", aDlg.HWND, 0, true);
}
function CheckButtons(nButton)
{
if ((nButton == IDLANG1) || (nButton == IDLANG2))
nLang = nButton - IDLANG1;
SendMessage(aDlg[IDLANG1].HWND, 241 /*BM_SETCHECK*/, (nLang == 0), 0);
SendMessage(aDlg[IDLANG2].HWND, 241 /*BM_SETCHECK*/, (nLang == 1), 0);
oSys.Call("User32::EnableWindow", aDlg[IDLANG1].HWND, aIsLang[0]);
oSys.Call("User32::EnableWindow", aDlg[IDLANG2].HWND, aIsLang[1]);
}
function GetWindowPos(hWnd, oRect, bClient)
{
var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
if (bClient)
oSys.Call("User32::GetClientRect", hWnd, lpRect);
else
oSys.Call("User32::GetWindowRect", hWnd, lpRect);
oRect.X = AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/);
oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/);
oRect.W = AkelPad.MemRead(_PtrAdd(lpRect, 8), 3 /*DT_DWORD*/) - oRect.X;
oRect.H = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/) - oRect.Y;
AkelPad.MemFree(lpRect);
}
function SetForegroundWindow(hWnd)
{
if (! oSys.Call("User32::IsWindowVisible", hWnd))
oSys.Call("User32::ShowWindow", hWnd, 8 /*SW_SHOWNA*/);
if (oSys.Call("User32::IsIconic", hWnd))
oSys.Call("User32::ShowWindow", hWnd, 9 /*SW_RESTORE*/);
oSys.Call("User32::SetForegroundWindow", hWnd);
}
function OpenLinkAE(lpAENLINK)
{
var nOffset1 = SendMessage(aDlg[IDTEXT].HWND, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpAENLINK, _X64 ? 56 : 28));
var nOffset2 = SendMessage(aDlg[IDTEXT].HWND, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpAENLINK, _X64 ? 80 : 40));
var sLink;
AkelPad.SetEditWnd(aDlg[IDTEXT].HWND);
sLink = AkelPad.GetTextRange(nOffset1, nOffset2);
AkelPad.SetEditWnd(0);
oSys.Call("Shell32::ShellExecuteW", 0, "open", sLink, 0, 0, 1 /*SW_SHOWNORMAL*/);
}
function GetSelStartAE()
{
AkelPad.SetEditWnd(aDlg[IDTEXT].HWND);
var nSelStart = AkelPad.GetSelStart();
AkelPad.SetEditWnd(0);
return nSelStart;
}
function GetSelEndAE()
{
AkelPad.SetEditWnd(aDlg[IDTEXT].HWND);
var nSelEnd = AkelPad.GetSelEnd();
AkelPad.SetEditWnd(0);
return nSelEnd;
}
function SetSelAE(nSelStart, nSelEnd)
{
AkelPad.SetEditWnd(aDlg[IDTEXT].HWND);
AkelPad.SetSel(nSelStart, nSelEnd);
AkelPad.SetEditWnd(0);
}
function GetSelTextAE()
{
AkelPad.SetEditWnd(aDlg[IDTEXT].HWND);
var sText = AkelPad.GetSelText(0);
AkelPad.SetEditWnd(0);
return sText;
}
function SetWordWrapAE()
{
SendMessage(aDlg[IDTEXT].HWND, 0x0CAA /*AEM_SETWORDWRAP*/, bWordWrap ? 1 /*AEWW_WORD*/ : 0 /*AEWW_NONE*/, 0);
if (oSys.Call("User32::IsWindowVisible", aDlg[IDWB].HWND))
oSys.Call("User32::UpdateWindow", aDlg[IDWB].HWND);
}
function GetCurFocLV()
{
return SendMessage(aDlg[IDNAME].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0001 /*LVNI_FOCUSED*/);
}
function GetCurSelLV()
{
return SendMessage(aDlg[IDNAME].HWND, 0x100C /*LVM_GETNEXTITEM*/, -1, 0x0002 /*LVNI_SELECTED*/);
}
function SetCurSelLV(nItem)
{
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 12), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/);
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 16), 0x0003 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/);
SendMessage(aDlg[IDNAME].HWND, 0x102B /*LVM_SETITEMSTATE*/, nItem, lpLVITEM);
SendMessage(aDlg[IDNAME].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nItem, false);
}
function FillLV(nSel, sFind)
{
var i;
SendMessage(aDlg[IDNAME].HWND, 0x000B /*WM_SETREDRAW*/, false, 0);
SendMessage(aDlg[IDNAME].HWND, 0x1009 /*LVM_DELETEALLITEMS*/, 0, 0);
for (i = 0; i < aAPD.length; ++i)
{
AkelPad.MemCopy(_PtrAdd(lpLVITEM, 4), i, 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpTextLV, aAPD[i][0], 1 /*DT_UNICODE*/);
SendMessage(aDlg[IDNAME].HWND, 0x104D /*LVM_INSERTITEMW*/, 0, lpLVITEM);
if (aAPD[i][0].toUpperCase() == sFind)
nSel = i;
}
if (nSel >= aAPD.length)
nSel = aAPD.length - 1;
else if (nSel < 0)
nSel = 0;
SetCurSelLV(nSel);
SendMessage(aDlg[IDNAME].HWND, 0x000B /*WM_SETREDRAW*/, true, 0);
}
function GetArrayAPD(hWnd)
{
var aDoc = bDocOwn ? aDocOwn : aDocStd;
var aLang = ["-Eng", "-Rus"];
var lpFile;
var lpDetectFile;
var sFile;
var nCodePage;
var bBOM;
var i, n;
aIsLang[0] = false;
aIsLang[1] = false;
aAPD.length = 0;
while (! (aIsLang[0] || aIsLang[1]))
{
for (i = 0; i < 2; ++i)
{
for (n = 0; n < aDoc.length; ++n)
{
if (oFSO.FileExists(sDocDir + aDoc[n][0] + aLang[i] + "." + aDoc[n][1]))
{
aIsLang[i] = true;
break;
}
}
}
if (! (aIsLang[0] || aIsLang[1]))
{
AkelPad.MessageBox(hWnd, sTxtNoFilesInDir + "\n" + sDocDir, sTxtDlgTitle, 0x30 /*MB_ICONWARNING*/);
if (! oFSO.FolderExists(sDocDir))
sDocDir = AkelPad.GetAkelDir(0 /*ADTYPE_ROOT*/) + "\\";
sDocDir = BrowseForFolder(hWnd, sTxtChooseDir, sDocDir);
if (! sDocDir)
return;
else if (sDocDir.slice(-1) != "\\")
sDocDir += "\\";
}
}
if (! aIsLang[nLang])
nLang = Number(! nLang);
lpFile = AkelPad.MemAlloc(260 * 2 /*MAX_PATH * sizeof(wchar_t)*/);
lpDetectFile = AkelPad.MemAlloc(_X64 ? 24 : 20 /*sizeof(DETECTFILEW)*/);
AkelPad.MemCopy(lpDetectFile, lpFile, 2 /*DT_QWORD*/);
AkelPad.MemCopy(_PtrAdd(lpDetectFile, _X64 ? 8 : 4), 1024, 3 /*DT_DWORD*/); //dwBytesToCheck
AkelPad.MemCopy(_PtrAdd(lpDetectFile, _X64 ? 12 : 8), 0x1D /*ADT_BINARY_ERROR|ADT_DETECT_CODEPAGE|ADT_DETECT_BOM|ADT_NOMESSAGES*/, 3 /*DT_DWORD*/); //dwFlags
for (n = 0; n < aDoc.length; ++n)
{
sFile = sDocDir + aDoc[n][0] + aLang[nLang] + "." + aDoc[n][1];
if (oFSO.FileExists(sFile))
{
if (aDoc[n][1] == "htm")
aAPD.push([aDoc[n][0], "", sFile]);
else
{
AkelPad.MemCopy(lpFile, sFile, 1 /*DT_UNICODE*/);
AkelPad.MemCopy(_PtrAdd(lpDetectFile, _X64 ? 16 : 12), 0, 3 /*DT_DWORD*/); //nCodePage
AkelPad.MemCopy(_PtrAdd(lpDetectFile, _X64 ? 20 : 16), 0, 3 /*DT_DWORD*/); //bBOM
if (SendMessage(hMainWnd, 1177 /*AKD_DETECTFILEW*/, 0, lpDetectFile) == 0 /*EDT_SUCCESS*/)
{
nCodePage = AkelPad.MemRead(_PtrAdd(lpDetectFile, _X64 ? 16 : 12), 3 /*DT_DWORD*/);
bBOM = AkelPad.MemRead(_PtrAdd(lpDetectFile, _X64 ? 20 : 16), 3 /*DT_DWORD*/);
if ((nCodePage != 65000) && (nCodePage != 65001) && (nCodePage != 1200) && (nCodePage != 1201) && (nCodePage != 12000) && (nCodePage != 12001))
nCodePage = 1251 /*ANSI Cyrillic*/;
aAPD.push([aDoc[n][0], AkelPad.ReadFile(sFile, 0, nCodePage, bBOM).replace(/\r\n/g, "\n"), sFile]);
}
}
}
}
AkelPad.MemFree(lpFile);
AkelPad.MemFree(lpDetectFile);
}
function MenuMain()
{
var MF_STRING = 0x0000;
var MF_GRAYED = 0x0001;
var MF_CHECKED = 0x0008;
var MF_POPUP = 0x0010;
var MF_SEPARATOR = 0x0800;
var hMenu1 = oSys.Call("User32::CreatePopupMenu");
var hMenu = oSys.Call("User32::CreatePopupMenu");
var oRect = {};
var nCmd;
var nCmd1;
oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, 0x0002, sTxtFind + "\tCtrl+F");
oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, 0x0102, sTxtFindNextDn + "\tF3");
oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, 0x0202, sTxtFindNextUp + "\tShift+F3");
oSys.Call("User32::AppendMenuW", hMenu, (oSys.Call("User32::IsWindowVisible", aDlg[IDWB].HWND) ? MF_STRING : MF_GRAYED), 0x0001, sTxtFindInHtm + "\tCtrl+F");
oSys.Call("User32::AppendMenuW", hMenu, (oSys.Call("User32::IsWindowVisible", aDlg[IDTEXT].HWND) ? MF_POPUP : MF_GRAYED), hMenu1, sTxtFindInTxt);
oSys.Call("user32::AppendMenuW", hMenu, MF_SEPARATOR, 0);
oSys.Call("User32::AppendMenuW", hMenu, (bWordWrap ? MF_CHECKED : MF_STRING), 0x0003, sTxtWrapLines + "\tCtrl+U");
oSys.Call("User32::AppendMenuW", hMenu, (bSeparateWnd ? MF_CHECKED : MF_STRING), 0x0004, sTxtSeparateWnd);
GetWindowPos(aDlg[IDMENU].HWND, oRect);
nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x01A0 /*TPM_NONOTIFY|TPM_RETURNCMD|TPM_BOTTOMALIGN*/, oRect.X, oRect.Y, 0, aDlg.HWND, 0);
oSys.Call("User32::DestroyMenu", hMenu1);
oSys.Call("User32::DestroyMenu", hMenu);
nCmd1 = (nCmd >> 8) & 0xFF;
nCmd = nCmd & 0xFF;
if (nCmd == 1)
oWB.ExecWB(32 /*OLECMDID_FIND*/, 0, 0, 0);
else if (nCmd == 2)
{
if (nCmd1 == 0)
FTDialog();
else
FindTextNext(nCmd1);
}
else if (nCmd == 3)
{
bWordWrap = ! bWordWrap;
SetWordWrapAE();
}
else if (nCmd == 4)
{
bSeparateWnd = ! bSeparateWnd;
bCloseDlg = false;
PostMessage(aDlg.HWND, 16 /*WM_CLOSE*/, 0, 0);
}
}
function MenuName(nX, nY)
{
var lpRect;
var nX1, nY1, nY2;
var hMenu;
var nCmd;
if ((nAPDSel < 0) || (aAPD[nAPDSel][0].charAt(0) == "*"))
return;
//menu from keyboard
if (nX == 0xFFFF)
SendMessage(aDlg[IDNAME].HWND, 0x1013 /*LVM_ENSUREVISIBLE*/, nAPDSel, false);
lpRect = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
SendMessage(aDlg[IDNAME].HWND, 0x100E /*LVM_GETITEMRECT*/, nAPDSel, lpRect);
oSys.Call("User32::ClientToScreen", aDlg[IDNAME].HWND, lpRect);
oSys.Call("User32::ClientToScreen", aDlg[IDNAME].HWND, _PtrAdd(lpRect, 8));
nX1 = AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/);
nY1 = AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/);
nY2 = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/);
AkelPad.MemFree(lpRect);
if (nX == 0xFFFF)
{
nX = nX1;
nY = nY2;
}
else if ((nY < nY1) || (nY > nY2))
return;
hMenu = oSys.Call("User32::CreatePopupMenu");
oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, 1, sTxtOpenClose + "\tShift+Enter");
oSys.Call("User32::AppendMenuW", hMenu, 0x01 /*MF_GRAYED*/, 0, sTxtFileName);
oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, 2, " " + sTxtCopyToCB + "\tCtrl+C");
oSys.Call("User32::AppendMenuW", hMenu, AkelPad.GetEditWnd() && (! AkelPad.GetEditReadOnly(0)) ? 0 /*MF_STRING*/ : 0x01 /*MF_GRAYED*/, 3, " " + sTxtInsertToAP + "\tCtrl+Shift+C");
oSys.Call("User32::AppendMenuW", hMenu, 0x01 /*MF_GRAYED*/, 0, sTxtFileNamePath);
oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, 4, " " + sTxtCopyToCB + "\tAlt+C");
oSys.Call("User32::AppendMenuW", hMenu, AkelPad.GetEditWnd() && (! AkelPad.GetEditReadOnly(0)) ? 0 /*MF_STRING*/ : 0x01 /*MF_GRAYED*/, 5, " " + sTxtInsertToAP + "\tShift+Alt+C");
nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0180 /*TPM_NONOTIFY|TPM_RETURNCMD*/, nX, nY, 0, aDlg.HWND, 0);
oSys.Call("User32::DestroyMenu", hMenu);
if (nCmd == 1)
OpenOrCloseFile();
else if (nCmd == 2)
InsertNameTo(true, false);
else if (nCmd == 3)
InsertNameTo(false, false);
else if (nCmd == 4)
InsertNameTo(true, true);
else if (nCmd == 5)
InsertNameTo(false, true);
}
function MenuText(nX, nY)
{
var bSel = SendMessage(aDlg[IDTEXT].HWND, 3125 /*AEM_GETSEL*/, 0, 0);
var hMenu = oSys.Call("User32::CreatePopupMenu");
var lpPOINT;
var nCmd;
//menu from keyboard
if (nX == 0xFFFF)
{
lpPOINT = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
oSys.Call("User32::GetCaretPos", lpPOINT);
oSys.Call("User32::ClientToScreen", aDlg[IDTEXT].HWND, lpPOINT);
nX = AkelPad.MemRead(_PtrAdd(lpPOINT, 0), 3 /*DT_DWORD*/);
nY = AkelPad.MemRead(_PtrAdd(lpPOINT, 4), 3 /*DT_DWORD*/) + SendMessage(aDlg[IDTEXT].HWND, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, 0);
AkelPad.MemFree(lpPOINT);
}
oSys.Call("User32::AppendMenuW", hMenu, bSel ? 0 /*MF_STRING*/ : 0x01 /*MF_GRAYED*/, 1, sTxtCopyToCB + "\tCtrl+C");
oSys.Call("User32::AppendMenuW", hMenu, AkelPad.GetEditWnd() && (! AkelPad.GetEditReadOnly(0)) && bSel ? 0 /*MF_STRING*/ : 0x01 /*MF_GRAYED*/, 2, sTxtInsertToAP + "\tCtrl+Shift+C");
oSys.Call("user32::AppendMenuW", hMenu, 0x0800 /*MF_SEPARATOR*/, 0);
oSys.Call("User32::AppendMenuW", hMenu, 0 /*MF_STRING*/, 3, sTxtSelectAll + "\tCtrl+A");
nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0180 /*TPM_NONOTIFY|TPM_RETURNCMD*/, nX, nY, 0, aDlg.HWND, 0);
oSys.Call("User32::DestroyMenu", hMenu);
if (nCmd == 1)
InsertTextTo(true);
else if (nCmd == 2)
InsertTextTo(false);
else if (nCmd == 3)
SetSelAE(0, -1);
}
function OpenOrCloseFile()
{
var bModified;
var hFocus;
if (bSeparateWnd)
{
SetForegroundWindow(hMainWnd);
SetForegroundWindow(aDlg.HWND);
WScript.Sleep(20);
}
if (aAPD[nAPDSel][2].toUpperCase() == AkelPad.GetEditFile(0).toUpperCase())
{
bModified = AkelPad.GetEditModified(0);
if (bModified)
{
hFocus = oSys.Call("User32::GetFocus");
if (bSeparateWnd)
SetForegroundWindow(hMainWnd);
oSys.Call("User32::EnableWindow", aDlg.HWND, 0);
AkelPad.ScriptNoMutex(0x20 /*ULT_UNLOCKSENDMESSAGE*/);
}
if (AkelPad.IsMDI())
AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
else
AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
if (bModified)
{
AkelPad.ScriptNoMutex(0x10 /*ULT_LOCKSENDMESSAGE*/);
oSys.Call("User32::EnableWindow", aDlg.HWND, 1);
if (bSeparateWnd)
SetForegroundWindow(aDlg.HWND);
oSys.Call("User32::SetFocus", hFocus);
}
}
else
{
if (oFSO.FileExists(aAPD[nAPDSel][2]))
AkelPad.OpenFile(aAPD[nAPDSel][2]);
else
AkelPad.MessageBox(aDlg.HWND, aAPD[nAPDSel][2] + "\n\n" + sTxtNoFile, sTxtDlgTitle, 0x30 /*MB_ICONWARNING*/);
}
}
function InsertNameTo(bClipboard, bFull)
{
if (nAPDSel >= 0)
{
var sName = aAPD[nAPDSel][2];
if (! bFull)
sName = sName.replace(/.+\\/, "");
if (bClipboard)
AkelPad.SetClipboardText(sName);
else if (AkelPad.GetEditWnd() && (! AkelPad.GetEditReadOnly(0)))
AkelPad.ReplaceSel(sName, -1);
}
}
function InsertTextTo(bClipboard)
{
var sText = GetSelTextAE();
if (sText)
{
if (bClipboard)
AkelPad.SetClipboardText(sText);
else
AkelPad.ReplaceSel(sText, -1);
}
}
function FTDialog()
{
aDlgFT.Parent = aDlg[IDTEXT].HWND;
aDlgFT.Icon = oSys.Call("User32::LoadImageW", AkelPad.GetInstanceDll(), 101, 1 /*uType=IMAGE_ICON*/, 0, 0, 0x40 /*LR_DEFAULTSIZE*/);
oSys.Call("User32::SetFocus", aDlg[IDTEXT].HWND);
SendMessage(aDlg[IDTEXT].HWND, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00000004 /*AECO_NOHIDESEL*/);
CreateDialogBox(aDlgFT);
SendMessage(aDlg[IDTEXT].HWND, 3228 /*AEM_SETOPTIONS*/, 4 /*AECOOP_XOR*/, 0x00000004 /*AECO_NOHIDESEL*/);
oSys.Call("User32::DestroyIcon", aDlgFT.Icon);
}
function FTDlgCallback(hWnd, uMsg, wParam, lParam)
{
var nID, nCode;
if (uMsg == 272 /*WM_INITDIALOG*/)
{
FillCB();
SendMessage(aDlgFT[IDFTTEXT].HWND, 12 /*WM_SETTEXT*/, 0, GetSelTextAE() || aFT[0]);
SendMessage(aDlgFT[IDFTCASE].HWND, 241 /*BM_SETCHECK*/, bCaseFT, 0);
SendMessage(aDlgFT[IDFTALLDOC].HWND, 241 /*BM_SETCHECK*/, bAllDocFT, 0);
SendMessage(aDlgFT[IDFTBEGIN + nDirectFT].HWND, 241 /*BM_SETCHECK*/, 1, 0);
SendMessage(hWnd, 273 /*WM_COMMAND*/, MkLong(IDFTTEXT, 5 /*CBN_EDITCHANGE*/), aDlgFT[IDFTTEXT].HWND);
if (SendMessage(AkelPad.GetEditWnd(), 3227 /*AEM_GETOPTIONS*/, 0, 0) & 0x00000800 /*AECO_ACTIVELINE*/)
PostMessage(aDlg[IDTEXT].HWND, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00000800 /*AECO_ACTIVELINE*/);
}
else if (uMsg == 6 /*WM_ACTIVATE*/)
{
if (wParam)
{
oSys.Call("User32::RegisterHotKey", hWnd, 1, 0, 0x72 /*VK_F3*/);
oSys.Call("User32::RegisterHotKey", hWnd, 2, 0x4 /*MOD_SHIFT*/, 0x72 /*VK_F3*/);
}
else
{
oSys.Call("User32::UnregisterHotKey", hWnd, 1);
oSys.Call("User32::UnregisterHotKey", hWnd, 2);
}
}
else if (uMsg == 786 /*WM_HOTKEY*/)
{
if (oSys.Call("User32::IsWindowEnabled", aDlgFT[IDFTFIND].HWND) && ((wParam == 1) || (wParam == 2)))
{
FindText(wParam);
PostMessage(aDlgFT.HWND, 16 /*WM_CLOSE*/, 0, 0);
}
}
else if (uMsg == 273 /*WM_COMMAND*/)
{
nID = LoWord(wParam);
nCode = HiWord(wParam);
if (nID == IDFTTEXT)
{
if (nCode == 1 /*CBN_SELCHANGE*/)
{
oSys.Call("User32::EnableWindow", aDlgFT[IDFTFIND].HWND, SendMessage(lParam, 327 /*CB_GETCURSEL*/, 0, 0) >= 0);
bNewFT = 1;
}
else if (nCode == 5 /*CBN_EDITCHANGE*/)
{
oSys.Call("User32::EnableWindow", aDlgFT[IDFTFIND].HWND, SendMessage(lParam, 14 /*WM_GETTEXTLENGTH*/, 0, 0));
bNewFT = 1;
}
}
else if (nID == IDFTCASE)
{
bCaseFT = ! bCaseFT;
bNewFT = 1;
}
else if (nID == IDFTALLDOC)
{
bAllDocFT = ! bAllDocFT;
bNewFT = 1;
}
else if ((nID >= IDFTBEGIN) && (nID <= IDFTEND))
{
nDirectFT = nID - IDFTBEGIN;
bNewFT = 1;
}
else if (nID == IDFTFIND)
FindText(nDirectFT, 1);
else if ((nID == IDFTCANCEL) || (nID == 2 /*IDCANCEL*/))
PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
}
else if (uMsg == 16 /*WM_CLOSE*/)
oSys.Call("User32::EndDialog", hWnd, wParam);
}
function FillCB()
{
SendMessage(aDlgFT[IDFTTEXT].HWND, 331 /*CB_RESETCONTENT*/, 0, 0);
for (var i = 0; i < aFT.length; ++i)
SendMessage(aDlgFT[IDFTTEXT].HWND, 323 /*CB_ADDSTRING*/, 0, aFT[i]);
}
function FindText(nDirection, bMessage)
{
var nTextLen = SendMessage(aDlgFT[IDFTTEXT].HWND, 14 /*WM_GETTEXTLENGTH*/, 0, 0) + 1;
var lpText = AkelPad.MemAlloc(nTextLen * 2);
var sText;
var i;
SendMessage(aDlgFT[IDFTTEXT].HWND, 13 /*WM_GETTEXT*/, nTextLen, lpText);
sText = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
AkelPad.MemFree(lpText);
for (i = 0; i < aFT.length; ++i)
{
if (aFT[i] == sText)
{
aFT.splice(i, 1);
break;
}
}
aFT.unshift(sText);
if (aFT.length > 10) aFT.length = 10;
FillCB();
SendMessage(aDlgFT[IDFTTEXT].HWND, 334 /*CB_SETCURSEL*/, 0, 0);
if (! bNewFT)
{
if (nDirection == 0)
nDirection = 1;
else if (nDirection == 3)
nDirection = 2;
}
if (FindTextNext(nDirection))
bNewFT = 0;
else
{
bNewFT = 1;
if (bMessage)
AkelPad.MessageBox(aDlgFT.HWND, sTxtNotFound, aDlgFT.Title, 0x30 /*MB_ICONWARNING*/);
}
}
function FindTextNext(nDirection)
{
var bFound = false;
var nNameStart;
var nNameEnd;
var nTextStart;
var nSel;
var i;
oSys.Call("User32::SetFocus", aDlg[IDTEXT].HWND);
if (nDirection < 2)
{
nNameStart = (nDirection == 0) && bAllDocFT ? 0 : nAPDSel;
nNameEnd = bAllDocFT ? aAPD.length - 1 : nAPDSel;
nTextStart = (nDirection == 0) ? 0 : GetSelEndAE();
for (i = nNameStart; i <= nNameEnd; ++i)
{
if (bCaseFT)
nSel = aAPD[i][1].indexOf(aFT[0], (i == nNameStart) ? nTextStart : 0);
else
nSel = aAPD[i][1].toUpperCase().indexOf(aFT[0].toUpperCase(), (i == nNameStart) ? nTextStart : 0);
if (nSel > -1)
{
SetCurSelLV(i);
SetSelAE(nSel, nSel + aFT[0].length);
bFound = true;
break;
}
}
}
else
{
nNameEnd = bAllDocFT ? 0 : nAPDSel;
if (nDirection == 2)
{
nNameStart = nAPDSel;
nTextStart = GetSelStartAE() - aFT[0].length;
if ((nTextStart < 0) && (--nNameStart >= 0))
nTextStart = aAPD[nNameStart][1].length;
}
else
{
nNameStart = bAllDocFT ? aAPD.length - 1 : nAPDSel;
nTextStart = aAPD[nNameStart][1].length;
}
for (i = nNameStart; i >= nNameEnd; --i)
{
if (bCaseFT)
nSel = aAPD[i][1].lastIndexOf(aFT[0], (i == nNameStart) ? nTextStart : aAPD[i][1].length);
else
nSel = aAPD[i][1].toUpperCase().lastIndexOf(aFT[0].toUpperCase(), (i == nNameStart) ? nTextStart : aAPD[i][1].length);
if (nSel > -1)
{
SetCurSelLV(i);
SetSelAE(nSel, nSel + aFT[0].length);
bFound = true;
break;
}
}
}
return bFound;
}
Last edited by KDJ on Sun Jun 05, 2016 3:22 pm, edited 24 times in total.
-
Offline
- Posts: 1949
- Joined: Sat Mar 06, 2010 7:40 pm
- Location: Poland
Select tab by pressing Ctrl/Shift/Alt+Number (MDI/PMDI).
Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=23904#p23904
// Version: 2015-03-19
// Author: KDJ
//
// *** Select tab by pressing Ctrl/Shift/Alt+Number (MDI/PMDI) ***
//
// Usage:
// Call("Scripts::Main", 1, "TabNumberByKeyboard.js")
// Call("Scripts::Main", 1, "TabNumberByKeyboard.js", "Argument")
//
// Argument:
// "A" - Alt (default)
// "C" - Ctrl
// "S" - Shift (only in combination with Ctrl and/or Alt)
// can be: "C", "A", "CS", "CA", "CSA", "SA"
//
// Remarks:
// After first call, the script resides in the memory.
// Second script call, closes the script.
// For autostart, in AkelPad.ini or registry CmdLineBegin/CmdLineEnd key, need to add eg:
// /Call("Scripts::Main", 1, "TabNumberByKeyboard.js", "SC")
var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
if (hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
//script already is running, close it
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else if (AkelPad.IsMDI())
{
var oSys = AkelPad.SystemFunction();
var hMainWnd = AkelPad.GetMainWnd();
var bCtrl = false;
var bShift = false;
var bAlt = false;
var sArg;
var hSubClass;
var lpFrame;
var nTab;
if (WScript.Arguments.length)
{
sArg = WScript.Arguments(0).toUpperCase();
if (sArg.indexOf("C") >= 0)
bCtrl = true;
if (sArg.indexOf("S") >= 0)
bShift = true;
if (sArg.indexOf("A") >= 0)
bAlt = true;
if (bShift && (! bCtrl) && (! bAlt))
{
bShift = false;
bAlt = true;
}
}
else
bAlt = true;
hSubClass = AkelPad.WindowSubClass(2 /*WSC_EDITPROC*/, EditCallback, bCtrl ? 256 /*WM_KEYDOWN*/ : 260 /*WM_SYSKEYDOWN*/);
if (hSubClass)
{
//Allow other scripts running
AkelPad.ScriptNoMutex();
//Message loop
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(2 /*WSC_EDITPROC*/);
}
}
function EditCallback(hWnd, uMsg, wParam, lParam)
{
if ((uMsg == 256 /*WM_KEYDOWN*/) && (wParam >= 0x30 /*0 key*/) && (wParam <= 0x39 /*9 key*/) && Ctrl())
{
if ((bShift == Shift()) && (bAlt == Alt()))
FrameActivate(wParam);
}
else if ((uMsg == 260 /*WM_SYSKEYDOWN*/) && (wParam >= 0x30 /*0 key*/) && (wParam <= 0x39 /*9 key*/))
{
if (bShift == Shift())
FrameActivate(wParam);
}
return 0;
}
function FrameActivate(nKey)
{
nTab = ((nKey == 0x30) ? 10 : nKey - 0x30) - 1;
if (lpFrame = AkelPad.SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 8 /*FWF_BYTABINDEX*/, nTab))
AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame);
}
function Ctrl()
{
return Boolean(oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000);
}
function Shift()
{
return Boolean(oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000);
}
function Alt()
{
return Boolean(oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU*/) & 0x8000);
}
Last edited by KDJ on Thu Mar 19, 2015 6:02 pm, edited 2 times in total.
-
Offline
- Posts: 1862
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Post by Infocatcher »
Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=24138#p24138
// http://infocatcher.ucoz.net/js/akelpad_scripts/closeLeftOrRightTabs.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/closeLeftOrRightTabs.js
// (c) Infocatcher 2014
// version 0.1.1 - 2014-03-03
//===================
// Close tabs to the left or right (temporary check "Switch tabs: right-left" option)
// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#p4222
// Usage:
// Call("Scripts::Main", 1, "closeLeftOrRightTabs.js") - close tabs to the right
// Call("Scripts::Main", 1, "closeLeftOrRightTabs.js", "-left") - close tabs to the left
//===================
var toRight = WScript.Arguments.length ? WScript.Arguments(0) != "-left" : 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*/);
closeTabs(toRight);
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 closeTabs(toRight) {
var nextFrameCmd = toRight ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
var lpFrameInitial = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
var frameIndexInitial = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrameInitial);
for(;;) {
var restoreSelected = true;
AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, nextFrameCmd, 0);
var lpFrame = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
//if(lpFrame == lpFrameInitial)
// break;
var frameIndex = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrame);
if(toRight ? frameIndex <= frameIndexInitial : frameIndex >= frameIndexInitial--)
break; // Overflow
if(!AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4318 /*IDM_WINDOW_FRAMECLOSE*/, 0))
return; // Cancel
restoreSelected = false;
AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameInitial);
}
restoreSelected && AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameInitial);
}
Close tabs to the left or right (temporary check "Switch tabs: right-left" option).
Required MDI or PMDI window mode!
-
Offline
- Posts: 1862
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Post by Infocatcher »
Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=24434#p24434
// http://infocatcher.ucoz.net/js/akelpad_scripts/fullWindow.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/fullWindow.js
// (c) Infocatcher 2014
// version 0.1.0 - 2014-04-03
// Just like full screen mode, but preserve window size and position
// Required FullScreen plugin!
var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
if(hMainWnd) {
var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
if(lpRect) {
oSys.Call("user32::GetWindowRect", hMainWnd, lpRect);
var x = AkelPad.MemRead(lpRect, 3 /*DT_DWORD*/);
var y = AkelPad.MemRead(lpRect + 4, 3 /*DT_DWORD*/);
var w = AkelPad.MemRead(lpRect + 8, 3 /*DT_DWORD*/) - x;
var h = AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/) - y;
AkelPad.MemFree(lpRect);
AkelPad.Call("FullScreen::Main");
oSys.Call("user32::SetWindowPos", hMainWnd, 0, x, y, w, h, 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
}
}
Just like full screen mode, but preserve window size and position.
Required FullScreen plugin!
-
Offline
- Posts: 1862
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Post by Infocatcher »
Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=24559#p24559
// http://infocatcher.ucoz.net/js/akelpad_scripts/Include/timer.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/Include/timer.js
// (c) Infocatcher 2014
// version 0.1.1 - 2014-04-22
// Helper functions for user32::SetTimer()
// Usage example:
/*
var hMainWnd = AkelPad.GetMainWnd();
if(AkelPad.Include("timer.js")) {
_log("Started");
setTimeout(function() {
_log("Finished");
oSys.Call("user32::PostQuitMessage", 0);
}, 2000);
AkelPad.ScriptNoMutex();
AkelPad.WindowGetMessage();
}
function _log(s) {
oSys.Call("user32::SetWindowText" + _TCHAR, hMainWnd, WScript.ScriptName + ": " + s);
}
*/
// Be careful: 3rd argument is an ID of already created timer!
function setTimeout(fn, delay, id) {
return timers.set(fn, delay, true, id);
}
function setInterval(fn, delay, id) {
return timers.set(fn, delay, false, id);
}
function clearTimeout(id) {
timers.clear(id);
}
function clearInterval(id) {
timers.clear(id);
}
if(!hMainWnd)
var hMainWnd = AkelPad.GetMainWnd();
if(!oSys)
var oSys = AkelPad.SystemFunction();
var timers = {
_id: 1000,
getId: function() {
return AkelPad.SendMessage(hMainWnd, 1319 /*AKD_UNIQUEID*/, 0, 0) // AkelPad 4.8.8+
|| ++this._id;
},
funcs: {}, // IDs of all timers
timeouts: {}, // IDs of single-time timers
lpTimerCallback: 0,
init: function() {
if(!this.lpTimerCallback) try { // AkelPad 4.8.8+
this.lpTimerCallback = oSys.RegisterCallback(timerProc);
}
catch(e) {
this.lpTimerCallback = oSys.RegisterCallback("", timerProc, timerProc.length);
}
this.hWndTimer = AkelPad.ScriptHandle(0, 17 /*SH_GETSERVICEWINDOW*/) || hMainWnd;
return this.lpTimerCallback;
},
destroy: function() {
if(!this.lpTimerCallback)
return;
for(var id in this.funcs)
this._clear(id);
oSys.UnregisterCallback(this.lpTimerCallback);
this.lpTimerCallback = 0;
this._log("destroy");
},
has: function() {
for(var id in this.funcs)
return true;
return false;
},
set: function(fn, delay, isSingle, id) {
if(!this.init()) {
AkelPad.MessageBox(hMainWnd, "oSys.RegisterCallback() failed!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
return 0;
}
if(!id)
id = this.getId();
this.funcs[id] = fn;
if(isSingle)
this.timeouts[id] = true;
this._log("set(" + isSingle + ") " + id);
oSys.Call("user32::SetTimer", this.hWndTimer, id, delay, this.lpTimerCallback);
return id;
},
clear: function(id, isSingle) {
this._clear(id);
if(!this.has())
this.destroy();
},
_clear: function(id) {
this._log("_clear(" + id + ")");
oSys.Call("user32::KillTimer", this.hWndTimer, id);
delete this.funcs[id];
delete this.timeouts[id];
},
_prev: [],
_log: function(s) {
return; // disable logs
var prev = this._prev;
var last = prev[prev.length - 1];
RegExp.$1 = 0;
if(last && s == last.replace(/ #(\d+)$/, ""))
prev[prev.length - 1] = s + " #" + ((+RegExp.$1 || 1) + 1);
else {
while(prev.length > 8)
prev.shift();
prev.push(s);
}
s = prev.join(" -> ");
oSys.Call("user32::SetWindowText" + _TCHAR, hMainWnd, WScript.ScriptName + ": " + s);
}
};
function timerProc(hWnd, uMsg, nIDEvent, dwTime) {
var fn = timers.funcs[nIDEvent];
if(timers.timeouts[nIDEvent])
timers.clear(nIDEvent);
fn();
}
Helper functions for user32::SetTimer(), for AkelPad.Include().
Last edited by Infocatcher on Tue Apr 22, 2014 9:14 am, edited 2 times in total.
-
Offline
- Posts: 1862
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Post by Infocatcher »
Code: Select all
// https://akelpad.sourceforge.net/forum/viewtopic.php?p=24561#p24561
// https://infocatcher.ucoz.net/js/akelpad_scripts/autoSaveSession.js
// https://github.com/Infocatcher/AkelPad_scripts/blob/master/autoSaveSession.js
// (c) Infocatcher 2012-2023
// Version: 0.2.2 - 2023-11-06
// Author: Infocatcher
//// Automatically saves current session after selection or scroll changes
// Required Sessions plugin!
// Arguments:
// -startupDelay=1500 - (in ms) ignore all changes just after startup
// -minDelay=8000 - (in ms) minimum interval between two saves
// -smallDelay=500 - (in ms) minimum delay between change and save
// -session="OnExit" - name of session file
// -sessionBackup="OnExit" - name of session to backup before first write (or empty -sessionBackup="" to disable)
// -maxBackups=5 - max backups to preserve (see -sessionBackup)
// will be stored in \Sessions\%SessionName%*_autobackup_%date%.session
// -debug=true - show debug messages in window title
// Usage:
// CmdLineBegin=/Call("Scripts::Main", 1, "autoSaveSession.js")
// CmdLineBegin=/Call("Scripts::Main", 1, "autoSaveSession.js", '-startupDelay=2000 -minDelay=12000 -session="OnExit"')
// (see AkelHelp*.htm for manual settings)
var isMDI = AkelPad.IsMDI();
if(!isMDI) // We silently ignore SDI mode to allow use the same settings in any mode!
WScript.Quit();
var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var startupDelay = AkelPad.GetArgValue("startupDelay", 1500);
var minDelay = AkelPad.GetArgValue("minDelay", 8e3);
var smallDelay = AkelPad.GetArgValue("smallDelay", 500);
var sessionName = AkelPad.GetArgValue("session", "OnExit");
var sessionBackup = AkelPad.GetArgValue("sessionBackup", "OnExit");
var maxBackups = AkelPad.GetArgValue("maxBackups", 5);
var debug = AkelPad.GetArgValue("debug", false);
var bakName = "autobackup"; // Note: will search for "*_%bakName%_*.session" files
var stopWait = now() + startupDelay;
var timer = 0;
var lastSave = 0;
var lpTimerCallback = 0;
var nIDEvent;
var hWndTimer;
var lastError = "";
debug && _log("start");
var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
if(hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/)) {
// Script is running, second call close it
debug && _log("quit");
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
WScript.Quit();
}
if(hMainWnd) {
if(
AkelPad.WindowSubClass(
1 /*WSC_MAINPROC*/,
mainCallback,
0x4E /*WM_NOTIFY*/,
0x416 /*AKDN_FRAME_ACTIVATE*/,
0x418 /*AKDN_FRAME_DESTROY*/
//0x436 /*AKDN_OPENDOCUMENT_FINISH*/
//0x406 /*AKDN_MAIN_ONFINISH*/
)
) {
if(
isMDI != 1 /*WMD_MDI*/
|| AkelPad.WindowSubClass(
3 /*WSC_FRAMEPROC*/,
mainCallback,
0x4E /*WM_NOTIFY*/
)
) {
AkelPad.ScriptNoMutex(); // Allow other scripts running
AkelPad.WindowGetMessage(); // Message loop
AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
AkelPad.WindowUnsubClass(3 /*WSC_FRAMEPROC*/);
destroyTimer();
if(sessionBackup && sessionBackup != sessionName)
backupSessionOnce();
if(sessionBackup && maxBackups >= 0)
cleanupBackups();
}
else {
AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
lastError = "AkelPad.WindowSubClass(WSC_FRAMEPROC) failed!";
}
}
else {
lastError = "AkelPad.WindowSubClass(WSC_MAINPROC) failed!";
}
lastError && _error(lastError);
}
function mainCallback(hWnd, uMsg, wParam, lParam) {
//if(uMsg == 0x406 /*AKDN_MAIN_ONFINISH*/) {
// oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
// return;
//}
if(timer) // Already scheduled
return;
if(uMsg == 0x4E /*WM_NOTIFY*/) {
var cmd = AkelPad.MemRead(_PtrAdd(lParam, 8), 3 /*DT_DWORD*/);
switch(cmd) {
case 0x804 /*AEN_HSCROLL*/:
case 0x805 /*AEN_VSCROLL*/:
case 0x81E /*AEN_SELCHANGED*/:
break;
default: return;
}
}
if(stopWait) {
if(now() < stopWait)
return;
stopWait = 0;
}
if(!AkelPad.GetEditFile(0))
return;
var delay = now() - lastSave > minDelay ? smallDelay : minDelay;
timer = saveSessionDelayed(delay);
}
function saveSession() {
if(!oSys.Call("user32::IsWindowEnabled", hMainWnd)) {
timer = saveSessionDelayed(minDelay);
return;
}
timer = 0;
if(sessionBackup && sessionBackup == sessionName)
backupSessionOnce();
lastSave = now();
AkelPad.Call("Sessions::Main", 2, sessionName);
debug && _log("saved at " + new Date().toLocaleString());
}
function saveSessionDelayed(delay) {
try { // AkelPad 4.8.8+
lpTimerCallback = oSys.RegisterCallback(saveSessionTimerProc);
}
catch(e) {
lpTimerCallback = oSys.RegisterCallback("saveSessionTimerProc");
}
if(!lpTimerCallback) {
lastError = "oSys.RegisterCallback() failed!\nScript was terminated.";
oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
return 0;
}
nIDEvent = AkelPad.SendMessage(hMainWnd, 1319 /*AKD_UNIQUEID*/, 0, 0) || 10;
hWndTimer = AkelPad.ScriptHandle(0, 17 /*SH_GETSERVICEWINDOW*/) || hMainWnd;
saveSessionDelayed = function(delay) {
return oSys.Call("user32::SetTimer", hWndTimer, nIDEvent, delay, lpTimerCallback);
};
return saveSessionDelayed(delay);
}
function saveSessionTimerProc(hWnd, uMsg, nIDEvent, dwTime) {
oSys.Call("user32::KillTimer", hWndTimer, nIDEvent);
saveSession();
}
function destroyTimer() {
if(!lpTimerCallback)
return;
oSys.Call("user32::KillTimer", hWndTimer, nIDEvent);
oSys.UnregisterCallback(lpTimerCallback);
lpTimerCallback = 0;
}
function sessionsDir() {
var sd = (function() {
var oSet = AkelPad.ScriptSettings();
if(oSet.Begin("Sessions", 0x21 /*POB_READ|POB_PLUGS*/)) {
var inAppData = oSet.Read("SaveSessions", 1 /*PO_DWORD*/) == 2;
oSet.End();
}
if(inAppData) {
var wsh = new ActiveXObject("WScript.Shell");
return wsh.ExpandEnvironmentStrings("%AppData%\\AkelPad\\Sessions\\");
}
return AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\Sessions\\";
})();
sessionsDir = function() {
return sd;
};
return sd;
}
function backupSessionOnce() {
backupSessionOnce = function() {};
if(maxBackups <= 0)
return;
var fileBase = sessionsDir() + sessionBackup;
var fileExt = ".session";
var fileBak = fileBase + "_" + bakName + gts() + fileExt;
var fso = new ActiveXObject("Scripting.FileSystemObject");
try {
fso.CopyFile(fileBase + fileExt, fileBak, true);
}
catch(e) {
debug && _log("backup failed: " + (e.message || e) + " " + file);
}
function gts() {
var d = new Date();
return "_" + d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate())
+ "_" + pad(d.getHours()) + "-" + pad(d.getMinutes()) + "-" + pad(d.getSeconds());
}
function pad(n) {
return n > 9 ? n : "0" + n;
}
}
function cleanupBackups() {
var files = [];
var dir = sessionsDir();
// Based on Instructor's code: https://akelpad.sourceforge.net/forum/viewtopic.php?p=12548#p12548
var lpFindData = AkelPad.MemAlloc(592 /*sizeof(WIN32_FIND_DATAW)*/);
if(!lpFindData)
return;
var hSearch = oSys.Call("kernel32::FindFirstFile" + _TCHAR, dir + "\\*_" + bakName + "_*.session", lpFindData)
|| AkelPad.MemFree(lpFindData);
if(!hSearch)
return;
do {
var fName = AkelPad.MemRead(_PtrAdd(lpFindData, 44 /*offsetof(WIN32_FIND_DATAW, cFileName)*/), _TSTR);
if(fName == "." || fName == "..")
continue;
var dwAttributes = AkelPad.MemRead(_PtrAdd(lpFindData, 0) /*offsetof(WIN32_FIND_DATAW, dwAttributes)*/, 3 /*DT_DWORD*/);
if(dwAttributes & 0x10 /*FILE_ATTRIBUTE_DIRECTORY*/)
continue;
files[files.length] = fName;
}
while(oSys.Call("kernel32::FindNextFile" + _TCHAR, hSearch, lpFindData));
oSys.Call("kernel32::FindClose", hSearch);
AkelPad.MemFree(lpFindData);
files.sort();
if(files.length <= maxBackups)
return;
var fso = new ActiveXObject("Scripting.FileSystemObject");
var errs = 0;
for(var i = files.length - maxBackups - 1; i >= 0; --i) {
try {
fso.DeleteFile(dir + "\\" + files[i]);
}
catch(e) {
++errs;
lastError = e.message || e;
}
}
if(errs >= 10) {
_error(
"Failed to cleanup auto-backups, last error:\n" + lastError
+ "\n\nPlease, check manually: " + dir + "*_" + bakName + "_*.session"
);
}
}
function now() {
return new Date().getTime();
}
function _error(e) {
AkelPad.MessageBox(hMainWnd, e, WScript.ScriptName, 16 /*MB_ICONERROR*/);
}
function _log(s) {
oSys.Call("user32::SetWindowText" + _TCHAR, hMainWnd, WScript.ScriptName + ": " + s);
}
Automatically saves current session after selection or scroll changes
Required Sessions plugin!
Beware: may cause bugs and crashes, use at your own risk!
Last edited by Infocatcher on Sun Nov 05, 2023 10:05 pm, edited 1 time in total.
-
Offline
- Posts: 1949
- Joined: Sat Mar 06, 2010 7:40 pm
- Location: Poland
Functions for creating dialog boxes.
This script should be saved in directory: ...\AkelPad\AkelFiles\Plugs\Scripts\Include\
This script should be saved in directory: ...\AkelPad\AkelFiles\Plugs\Scripts\Include\
Code: Select all
/*
CreateDialog_functions.js
http://akelpad.sourceforge.net/forum/viewtopic.php?p=24766#p24766
Version: 2015-01-05
Author: KDJ
Contains:
CreateDialogWindow() function
CreateDialogBox() function
Scale object
--------------------
CreateDialogWindow()
--------------------
Create dialog box by using WinAPI function CreateWindowEx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680%28v=vs.85%29.aspx
Usage:
if (! AkelPad.Include("CreateDialog_functions.js")) WScript.Quit();
nWindows = CreateDialogWindow(aDlg[, nWhat[, hDlg[, nStartID[, nEndID]]]]);
Arguments:
aDlg - an array containing the parameters of windows to be created
Dialog box parameters are contained in aDlg object properties:
aDlg.ExStyle - CreateWindowEx dwExStyle (optional)
aDlg.Class - CreateWindowEx lpClassName
aDlg.Title - CreateWindowEx lpWindowName (optional)
aDlg.Style - CreateWindowEx dwStyle
aDlg.X - CreateWindowEx x (optional);
aDlg.Y - CreateWindowEx y (optional)
aDlg.W - CreateWindowEx nWidth (optional); if aDlg.W < 0, aDlg.X is horizontal position of right edge
aDlg.H - CreateWindowEx nHeight (optional); if aDlg.H < 0, aDlg.Y is vertical position of bottom edge
aDlg.Parent - CreateWindowEx hWndParent (optional)
aDlg.Menu - CreateWindowEx hMenu (optional)
aDlg.Callback - CreateWindowEx lpParam = callback function
aDlg.Icon - handle to the icon (optional)
aDlg.CtlFirst - indentifier of first control (child window) in dialog window, equal to index of first item in aDlg array (optional)
aDlg.CtlClass - default class for controls (optional)
aDlg.CtlStyle - additional style for each controls (optional)
aDlg.CtlFont - handle to default font in controls, used if no aDlg[ID].Font (optional)
aDlg.PosPar - element of screen, in relation of which will be set position of created window (optional):
0 - desktop window (default)
1 - work area
2 - parent window (aDlg.Parent)
3 - parent window client area (aDlg.Parent)
4 - any window (aDlg.PosRect)
5 - any window client area (aDlg.PosRect)
6 - pointer to RECT structure (aDlg.PosRect)
7 - four-element array (aDlg.PosRect)
8 - mouse cursor
aDlg.PosRect - if aDlg.PosPar == 4 or 5, it should be window handle,
if aDlg.PosPar == 6, it should be pointer to RECT structure containing coordinates of rectangle,
if aDlg.PosPar == 7, it should be four-element array containing coordinates of rectangle
aDlg.PosEdge - two-character string indicating from which edge of the parent object (aDlg.PosPar) will be set position of dialog window (default is "LT");
first character indicates the horizontal position:
"L" - from left edge, "R" - from right edge, "C" - center
second character indicates the vertical position:
"T" - from top edge, "B" - from bottom edge, "C" - center
aDlg.SizeClt - if true, aDlg.W and aDlg.H are treated as client area width and height, without frames and menu (optional)
Parameters of the control with identifier ID are contained in aDlg[ID] object properties:
aDlg[ID].ExStyle - CreateWindowEx dwExStyle (optional)
aDlg[ID].Class - CreateWindowEx lpClassName (optional, default is aDlg.CtlClass or "BUTTON")
aDlg[ID].Title - CreateWindowEx lpWindowName (optional)
aDlg[ID].Style - CreateWindowEx dwStyle (WS_CHILD can be omitted, will be added automatically), style = aDlg.CtlStyle | aDlg[ID].Style
aDlg[ID].X - CreateWindowEx x (optional)
aDlg[ID].Y - CreateWindowEx y (optional)
aDlg[ID].W - CreateWindowEx nWidth (optional); if aDlg[ID].W < 0, aDlg[ID].X is horizontal position of right edge
aDlg[ID].H - CreateWindowEx nHeight (optional); if aDlg[ID].H < 0, aDlg[ID].Y is vertical position of bottom edge
aDlg[ID].Font - handle to font (optional)
aDlg[ID].PosEdge - two-character string specifying control position relative to the dialog client area (optional, default is "LT");
first character indicates the horizontal position:
"L" - from left edge, "R" - from right edge, "C" - center
second character indicates the vertical position:
"T" - from top edge, "B" - from bottom edge, "C" - center
nWhat
0 - create dialog box and controls (default)
1 - create dialog box only
2 - create controls only (dialog must be created earlier)
hDlg
Is used if nWhat = 2 and controls are created in callback function after call with WM_CREATE message,
hDlg should be equal to hWnd parameter from callback function
nStartID
First control ID to create, default is aDlg.CtlFirst or 0
nEndID
Last control ID to create, default is index of last item in aDlg (aDlg.length - 1)
Return value:
count of created windows (dialog + controls)
Remarks:
After function returning, HWND properties contains window handle:
aDlg.HWND - dialog box handle
aDlg[ID].HWND - handle to the control with identifier ID
Before first function call, should be register window class: AkelPad.WindowRegisterClass(aDlg.Class).
After first function call, should be use AkelPad.WindowGetMessage() for message loop.
To destroy dialog box: AkelPad.SystemFunction().Call("User32::DestroyWindow", aDlg.HWND).
To exit message loop: AkelPad.SystemFunction().Call("User32::PostQuitMessage", 0).
If window class is no longer needed, it should be unregister: AkelPad.WindowUnregisterClass(aDlg.Class).
-----------------
CreateDialogBox()
-----------------
Create dialog box by using WinAPI functions DialogBoxIndirectParam (modal) or CreateDialogIndirectParam (modeless)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645461%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645441%28v=vs.85%29.aspx
Usage:
if (! AkelPad.Include("CreateDialog_functions.js")) WScript.Quit();
nResult = CreateDialogBox(aDlg[, bTemplate[, nStartID[, nEndID]]]);
Arguments:
aDlg - an array containing the parameters of windows to be created
Dialog box parameters are contained in aDlg object properties:
aDlg.ExStyle - extended windows styles (optional)
aDlg.Title - title of the dialog box (optional)
aDlg.Style - style of the dialog box (combination of window styles and dialog box styles)
aDlg.X - x-coordinate of the left edge of the dialog (optional);
aDlg.Y - y-coordinate of the top edge of the dialog (optional)
aDlg.W - width of the dialog clent area (optional)
aDlg.H - height of the dialog clent area (optional)
aDlg.Parent - handle to the window that owns the dialog box (optional)
aDlg.Menu - handle to the menu (optional)
aDlg.Callback - dialog box procedure
aDlg.Icon - handle to the icon (optional)
aDlg.Modeless - if true, dialog box will be modeless (optional, default is false)
aDlg.InitParam - value to pass to the dialog box procedure as lParam parameter of the WM_INITDIALOG message (optional)
aDlg.CtlFirst - indentifier of first control (child window) in dialog box, equal to index of first item in aDlg array (optional)
aDlg.CtlClass - default class for controls (optional)
aDlg.CtlStyle - additional style for each controls (optional)
aDlg.CtlFontN - font name for each controls eg. "MS Shell Dlg" (optional)
aDlg.CtlFontS - font size in pixels (optional, default is 8)
aDlg.CtlFontI - if true, font is italic (optional)
aDlg.PosPix - default is false - position and size of dialog/controls are set in dialog box units (standard behavior) and PosPar, PosWnd, PosEdge properties are ignored;
if true:
- position and size are in pixels
- DS_ABSALIGN, DS_CENTER, DS_CENTERMOUSE styles are ignored
- to determine the position, will be used parameters PosPar, PosWnd, PosEdge
- if W < 0, X is horizontal position of right edge
- if H < 0, Y is vertical position of bottom edge
aDlg.PosPar - element of screen, in relation of which will be set position of created dialog (optional):
0 - desktop window (default)
1 - work area
2 - parent window (aDlg.Parent)
3 - parent window client area (aDlg.Parent)
4 - any window (aDlg.PosRect)
5 - any window client area (aDlg.PosRect)
6 - pointer to RECT structure (aDlg.PosRect)
7 - four-element array (aDlg.PosRect)
8 - mouse cursor
aDlg.PosRect - if aDlg.PosPar == 4 or 5, it should be window handle,
if aDlg.PosPar == 6, it should be pointer to RECT structure containing coordinates of rectangle,
if aDlg.PosPar == 7, it should be four-element array containing coordinates of rectangle
aDlg.PosEdge - two-character string indicating from which edge of the parent object (aDlg.PosPar) will be set position of dialog box (default is "LT");
first character indicates the horizontal position:
"L" - from left edge, "R" - from right edge, "C" - center
second character indicates the vertical position:
"T" - from top edge, "B" - from bottom edge, "C" - center
Parameters of the control with identifier ID are contained in aDlg[ID] object properties:
aDlg[ID].ExStyle - extended window style (optional)
aDlg[ID].Class - window class of the control (optional, default is aDlg.CtlClass or "BUTTON")
aDlg[ID].Title - text in the control (optional)
aDlg[ID].Style - style of the control (WS_CHILD can be omitted, will be added automatically), style = aDlg.CtlStyle | aDlg[ID].Style
aDlg[ID].X - x-coordinate of the left edge of the control (optional)
aDlg[ID].Y - y-coordinate of the top edge of the control (optional)
aDlg[ID].W - width of the control (optional)
aDlg[ID].H - height of the control (optional)
aDlg[ID].PosEdge - two-character string specifying control position relative to the dialog client area (optional, default is "LT");
first character indicates the horizontal position:
"L" - from left edge, "R" - from right edge, "C" - center
second character indicates the vertical position:
"T" - from top edge, "B" - from bottom edge, "C" - center
bTemplate
If true, function does not create a dialog box, only creates DLGTEMPLATEEX structure and returns a pointer to it.
In this case following parameters are ignored: Parent, Menu, Callback, Icon, Modeless, InitParam, PosPix, PosPar, PosRect, PosEdge.
nStartID
First control ID to create, default is aDlg.CtlFirst or 0
nEndID
Last control ID to create, default is index of last item in aDlg (aDlg.length - 1)
Return value:
if bTemplate
pointer to DLGTEMPLATEEX structure
if dialog is modeless
window handle to the dialog box or 0 if function fails
if dialog is modal
nResult parameter specified in the call to the EndDialog function that was used to terminate the dialog box or -1 if function fails
Remarks:
In the callback function (aDlg.Callback), the handles to windows are available:
aDlg.HWND - dialog box handle
aDlg[ID].HWND - handle to the control with identifier ID
If dialog is modal:
To destroy dialog box: AkelPad.SystemFunction().Call("User32::EndDialog", aDlg.HWND, nResult).
If dialog is modeless:
After first function call, should be use AkelPad.WindowGetMessage() for message loop.
To destroy dialog box: AkelPad.SystemFunction().Call("User32::DestroyWindow", aDlg.HWND).
To exit message loop: AkelPad.SystemFunction().Call("User32::PostQuitMessage", 0).
------------
Scale object
------------
Contains methods:
Scale.X(nX) - returns the horizontal coordinate aligned according to screen DPI
Scale.Y(nY) - returns the vertical coordinate aligned according to screen DPI
Scale.UX(nX) - inverse operation to Scale.X
Scale.UY(nY) - inverse operation to Scale.Y
*/
//Window styles http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600%28v=vs.85%29.aspx
WS_BORDER = 0x00800000;
WS_CAPTION = 0x00C00000; //WS_BORDER|WS_DLGFRAME
WS_CHILD = 0x40000000;
WS_CHILDWINDOW = WS_CHILD;
WS_CLIPCHILDREN = 0x02000000;
WS_CLIPSIBLINGS = 0x04000000;
WS_DISABLED = 0x08000000;
WS_DLGFRAME = 0x00400000;
WS_GROUP = 0x00020000;
WS_HSCROLL = 0x00100000;
WS_ICONIC = 0x20000000;
WS_MAXIMIZE = 0x01000000;
WS_MAXIMIZEBOX = 0x00010000;
WS_MINIMIZE = WS_ICONIC;
WS_MINIMIZEBOX = 0x00020000;
WS_OVERLAPPED = 0x00000000;
WS_POPUP = 0x80000000;
WS_SIZEBOX = 0x00040000;
WS_SYSMENU = 0x00080000;
WS_TABSTOP = 0x00010000;
WS_THICKFRAME = WS_SIZEBOX;
WS_TILED = WS_OVERLAPPED;
WS_VISIBLE = 0x10000000;
WS_VSCROLL = 0x00200000;
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
WS_POPUPWINDOW = WS_POPUP|WS_BORDER|WS_SYSMENU;
WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW;
//Window extended styles http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543%28v=vs.85%29.aspx
WS_EX_ACCEPTFILES = 0x00000010;
WS_EX_APPWINDOW = 0x00040000;
WS_EX_CLIENTEDGE = 0x00000200;
WS_EX_COMPOSITED = 0x02000000;
WS_EX_CONTEXTHELP = 0x00000400;
WS_EX_CONTROLPARENT = 0x00010000;
WS_EX_DLGMODALFRAME = 0x00000001;
WS_EX_LAYERED = 0x00080000;
WS_EX_LAYOUTRTL = 0x00400000;
WS_EX_LEFT = 0x00000000;
WS_EX_LEFTSCROLLBAR = 0x00004000;
WS_EX_LTRREADING = 0x00000000;
WS_EX_MDICHILD = 0x00000040;
WS_EX_NOACTIVATE = 0x08000000;
WS_EX_NOINHERITLAYOUT = 0x00100000;
WS_EX_NOPARENTNOTIFY = 0x00000004;
WS_EX_RIGHT = 0x00001000;
WS_EX_RIGHTSCROLLBAR = 0x00000000;
WS_EX_RTLREADING = 0x00002000;
WS_EX_STATICEDGE = 0x00020000;
WS_EX_TOOLWINDOW = 0x00000080;
WS_EX_TOPMOST = 0x00000008;
WS_EX_TRANSPARENT = 0x00000020;
WS_EX_WINDOWEDGE = 0x00000100;
WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE|WS_EX_CLIENTEDGE;
WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW|WS_EX_TOPMOST;
//DialogBox styles http://msdn.microsoft.com/en-us/library/windows/desktop/ff729172%28v=vs.85%29.aspx
DS_3DLOOK = 0x0004;
DS_ABSALIGN = 0x0001;
DS_CENTER = 0x0800;
DS_CENTERMOUSE = 0x1000;
DS_CONTEXTHELP = 0x2000;
DS_CONTROL = 0x0400;
DS_FIXEDSYS = 0x0008;
DS_LOCALEDIT = 0x0020;
DS_MODALFRAME = 0x0080;
DS_NOFAILCREATE = 0x0010;
DS_NOIDLEMSG = 0x0100;
DS_SETFONT = 0x0040;
DS_SETFOREGROUND = 0x0200;
DS_SHELLFONT = DS_SETFONT|DS_FIXEDSYS;
DS_SYSMODAL = 0x0002;
//Class "BUTTON"
//Button styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb775951%28v=vs.85%29.aspx
BS_3STATE = 0x0005;
BS_AUTO3STATE = 0x0006;
BS_AUTOCHECKBOX = 0x0003;
BS_AUTORADIOBUTTON = 0x0009;
BS_BITMAP = 0x0080;
BS_BOTTOM = 0x0800;
BS_CENTER = 0x0300;
BS_CHECKBOX = 0x0002;
BS_DEFPUSHBUTTON = 0x0001;
BS_FLAT = 0x8000;
BS_GROUPBOX = 0x0007;
BS_ICON = 0x0040;
BS_LEFT = 0x0100;
BS_LEFTTEXT = 0x0020;
BS_MULTILINE = 0x2000;
BS_NOTIFY = 0x4000;
BS_OWNERDRAW = 0x000B;
BS_PUSHBUTTON = 0x0000;
BS_PUSHLIKE = 0x1000;
BS_RADIOBUTTON = 0x0004;
BS_RIGHT = 0x0200;
BS_RIGHTBUTTON = BS_LEFTTEXT;
BS_TEXT = 0x0000;
BS_TOP = 0x0400;
BS_VCENTER = 0x0C00;
//Win Vista
BS_SPLITBUTTON = 0x000C;
BS_DEFSPLITBUTTON = 0x000D;
BS_COMMANDLINK = 0x000E;
BS_DEFCOMMANDLINK = 0x000F;
//Class "COMBOBOX"
//ComboBoxEx extended styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb775742%28v=vs.85%29.aspx
//ComboBox styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb775796%28v=vs.85%29.aspx
CBS_AUTOHSCROLL = 0x0040;
CBS_DISABLENOSCROLL = 0x0800;
CBS_DROPDOWN = 0x0002; //+ComboBoxEx
CBS_DROPDOWNLIST = 0x0003; //+ComboBoxEx
CBS_HASSTRINGS = 0x0200;
CBS_LOWERCASE = 0x4000;
CBS_NOINTEGRALHEIGHT = 0x0400;
CBS_OEMCONVERT = 0x0080;
CBS_OWNERDRAWFIXED = 0x0010;
CBS_OWNERDRAWVARIABLE = 0x0020;
CBS_SIMPLE = 0x0001; //+ComboBoxEx
CBS_SORT = 0x0100;
CBS_UPPERCASE = 0x2000;
//Class "SysDateTimePick32"
//DateTimePicker control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb761728%28v=vs.85%29.aspx
DTS_APPCANPARSE = 0x10;
DTS_LONGDATEFORMAT = 0x04;
DTS_RIGHTALIGN = 0x20;
DTS_SHOWNONE = 0x02;
DTS_SHORTDATEFORMAT = 0x00;
DTS_SHORTDATECENTURYFORMAT = 0x0C;
DTS_TIMEFORMAT = 0x09;
DTS_UPDOWN = 0x01;
//Class "EDIT"
//Edit control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb775464%28v=vs.85%29.aspx
ES_AUTOHSCROLL = 0x0080; //+RichEdit
ES_AUTOVSCROLL = 0x0040; //+RichEdit
ES_CENTER = 0x0001; //+RichEdit
ES_LEFT = 0x0000; //+RichEdit
ES_LOWERCASE = 0x0010;
ES_MULTILINE = 0x0004; //+RichEdit
ES_NOHIDESEL = 0x0100; //+RichEdit
ES_NUMBER = 0x2000; //+RichEdit
ES_OEMCONVERT = 0x0400;
ES_PASSWORD = 0x0020; //+RichEdit
ES_READONLY = 0x0800; //+RichEdit
ES_RIGHT = 0x0002; //+RichEdit
ES_UPPERCASE = 0x0008;
ES_WANTRETURN = 0x1000; //+RichEdit
//Class "RichEdit50W";
//Library "Msftedit.dll";
//RichEdit control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb774367%28v=vs.85%29.aspx
ES_DISABLENOSCROLL = 0x00002000;
ES_NOIME = 0x00080000;
ES_NOOLEDRAGDROP = 0x00000008;
ES_SAVESEL = 0x00008000;
ES_SELECTIONBAR = 0x01000000;
ES_SELFIME = 0x00040000;
ES_SUNKEN = 0x00004000;
ES_VERTICAL = 0x00400000;
//Class "SysHeader32"
//Header control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb775241%28v=vs.85%29.aspx
HDS_BUTTONS = 0x0002;
HDS_DRAGDROP = 0x0040;
HDS_FILTERBAR = 0x0100;
HDS_FLAT = 0x0200;
HDS_FULLDRAG = 0x0080;
HDS_HIDDEN = 0x0008;
HDS_HORZ = 0x0000;
HDS_HOTTRACK = 0x0004;
//Win Vista
HDS_CHECKBOXES = 0x0400;
HDS_NOSIZING = 0x0800;
HDS_OVERFLOW = 0x1000;
//Class "LISTBOX"
//ListBox styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb775149%28v=vs.85%29.aspx
LBS_COMBOBOX = 0x8000;
LBS_DISABLENOSCROLL = 0x1000;
LBS_EXTENDEDSEL = 0x0800;
LBS_HASSTRINGS = 0x0040;
LBS_MULTICOLUMN = 0x0200;
LBS_MULTIPLESEL = 0x0008;
LBS_NODATA = 0x2000;
LBS_NOINTEGRALHEIGHT = 0x0100;
LBS_NOREDRAW = 0x0004;
LBS_NOSEL = 0x4000;
LBS_NOTIFY = 0x0001;
LBS_OWNERDRAWFIXED = 0x0010;
LBS_OWNERDRAWVARIABLE = 0x0020;
LBS_SORT = 0x0002;
LBS_STANDARD = LBS_NOTIFY|LBS_SORT|WS_VSCROLL|WS_BORDER;
LBS_USETABSTOPS = 0x0080;
LBS_WANTKEYBOARDINPUT = 0x0400;
//Class "SysListView32"
//ListView extended styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb774732%28v=vs.85%29.aspx
//ListView styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb774739%28v=vs.85%29.aspx
LVS_ALIGNLEFT = 0x0800;
LVS_ALIGNMASK = 0x0C00;
LVS_ALIGNTOP = 0x0000;
LVS_AUTOARRANGE = 0x0100;
LVS_EDITLABELS = 0x0200;
LVS_ICON = 0x0000;
LVS_LIST = 0x0003;
LVS_NOCOLUMNHEADER = 0x4000;
LVS_NOLABELWRAP = 0x0080;
LVS_NOSCROLL = 0x2000;
LVS_NOSORTHEADER = 0x8000;
LVS_OWNERDATA = 0x1000;
LVS_OWNERDRAWFIXED = 0x0400;
LVS_REPORT = 0x0001;
LVS_SHAREIMAGELISTS = 0x0040;
LVS_SHOWSELALWAYS = 0x0008;
LVS_SINGLESEL = 0x0004;
LVS_SMALLICON = 0x0002;
LVS_SORTASCENDING = 0x0010;
LVS_SORTDESCENDING = 0x0020;
LVS_TYPEMASK = 0x0003;
LVS_TYPESTYLEMASK = 0XFC00;
//Class "SysMonthCal32"
//MonthCalendar control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760919%28v=vs.85%29.aspx
MCS_DAYSTATE = 0x0001;
MCS_MULTISELECT = 0x0002;
MCS_WEEKNUMBERS = 0x0004;
MCS_NOTODAYCIRCLE = 0x0008;
MCS_NOTODAY = 0x0010;
//Win Vista
MCS_NOTRAILINGDATES = 0x0040;
MCS_SHORTDAYSOFWEEK = 0x0080;
MCS_NOSELCHANGEONNAV = 0x0100;
//Class "msctls_progress32"
//ProgressBar control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760820%28v=vs.85%29.aspx
PBS_MARQUEE = 0x08;
PBS_SMOOTH = 0x01;
PBS_VERTICAL = 0x04;
//Win Vista
PBS_SMOOTHREVERSE = 0x10;
//Class "SCROLLBAR"
//ScrollBar control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb787533%28v=vs.85%29.aspx
SBS_BOTTOMALIGN = 0x0004;
SBS_HORZ = 0x0000;
SBS_LEFTALIGN = 0x0002;
SBS_RIGHTALIGN = 0x0004;
SBS_SIZEBOX = 0x0008;
SBS_SIZEBOXBOTTOMRIGHTALIGN = 0x0004;
SBS_SIZEBOXTOPLEFTALIGN = 0x0002;
SBS_SIZEGRIP = 0x0010;
SBS_TOPALIGN = 0x0002;
SBS_VERT = 0x0001;
//Class "STATIC"
//Static control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760773%28v=vs.85%29.aspx
SS_BITMAP = 0x000E;
SS_BLACKFRAME = 0x0007;
SS_BLACKRECT = 0x0004;
SS_CENTER = 0x0001;
SS_CENTERIMAGE = 0x0200;
SS_EDITCONTROL = 0x2000;
SS_ENDELLIPSIS = 0x4000;
SS_ENHMETAFILE = 0x000F;
SS_ETCHEDFRAME = 0x0012;
SS_ETCHEDHORZ = 0x0010;
SS_ETCHEDVERT = 0x0011;
SS_GRAYFRAME = 0x0008;
SS_GRAYRECT = 0x0005;
SS_ICON = 0x0003;
SS_LEFT = 0x0000;
SS_LEFTNOWORDWRAP = 0x000C;
SS_NOPREFIX = 0x0080;
SS_NOTIFY = 0x0100;
SS_OWNERDRAW = 0x000D;
SS_PATHELLIPSIS = 0x8000;
SS_REALSIZEIMAGE = 0x0800;
SS_RIGHT = 0x0002;
SS_RIGHTJUST = 0x0400;
SS_SIMPLE = 0x000B;
SS_SUNKEN = 0x1000;
SS_TYPEMASK = 0x001F;
SS_WHITEFRAME = 0x0009;
SS_WHITERECT = 0x0006;
SS_WORDELLIPSIS = 0xC000;
//Class "msctls_statusbar32"
//StatusBar styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760730%28v=vs.85%29.aspx
SBARS_SIZEGRIP = 0x0100;
SBARS_TOOLTIPS = 0x0800;
//Class "SysLink"
//SysLink control styles http://msdn.microsoft.com/en-us/library/windows/desktop/cc136543%28v=vs.85%29.aspx
LWS_TRANSPARENT = 0x0001;
LWS_IGNORERETURN = 0x0002;
//Win Vista
LWS_NOPREFIX = 0x0004;
LWS_USEVISUALSTYLE = 0x0008;
LWS_USECUSTOMTEXT = 0x0010;
LWS_RIGHT = 0x0020;
//Class "SysTabControl32"
//Tab control extended styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760546%28v=vs.85%29.aspx
//Tab control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760549%28v=vs.85%29.aspx
TCS_BOTTOM = 0x0002;
TCS_BUTTONS = 0x0100;
TCS_FIXEDWIDTH = 0x0400;
TCS_FLATBUTTONS = 0x0008;
TCS_FOCUSNEVER = 0x8000;
TCS_FOCUSONBUTTONDOWN = 0x1000;
TCS_FORCEICONLEFT = 0x0010;
TCS_FORCELABELLEFT = 0x0020;
TCS_HOTTRACK = 0x0040;
TCS_MULTILINE = 0x0200;
TCS_MULTISELECT = 0x0004;
TCS_OWNERDRAWFIXED = 0x2000;
TCS_RAGGEDRIGHT = 0x0800;
TCS_RIGHT = 0x0002;
TCS_RIGHTJUSTIFY = 0x0000;
TCS_SCROLLOPPOSITE = 0x0001;
TCS_SINGLELINE = 0x0000;
TCS_TABS = 0x0000;
TCS_TOOLTIPS = 0x4000;
TCS_VERTICAL = 0x0080;
//Class "ToolbarWindow32"
//Toolbar control extended styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760430%28v=vs.85%29.aspx
//Toolbar control and Button styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760439%28v=vs.85%29.aspx
TBSTYLE_ALTDRAG = 0x0400;
TBSTYLE_CUSTOMERASE = 0x2000;
TBSTYLE_FLAT = 0x0800;
TBSTYLE_LIST = 0x1000;
TBSTYLE_REGISTERDROP = 0x4000;
TBSTYLE_TOOLTIPS = 0x0100;
TBSTYLE_TRANSPARENT = 0x8000;
TBSTYLE_WRAPABLE = 0x0200;
BTNS_AUTOSIZE = 0x0010;
BTNS_BUTTON = 0x0000;
BTNS_CHECK = 0x0002;
BTNS_DROPDOWN = 0x0008;
BTNS_GROUP = 0x0004;
BTNS_NOPREFIX = 0x0020;
BTNS_SEP = 0x0001;
BTNS_SHOWTEXT = 0x0040;
BTNS_WHOLEDROPDOWN = 0x0080;
BTNS_CHECKGROUP = BTNS_CHECK|BTNS_GROUP;
//Class "tooltips_class32"
//Tooltip styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760248%28v=vs.85%29.aspx
TTS_ALWAYSTIP = 0x0001;
TTS_BALLOON = 0x0040;
TTS_CLOSE = 0x0080;
TTS_NOANIMATE = 0x0010;
TTS_NOFADE = 0x0020;
TTS_NOPREFIX = 0x0002;
TTS_USEVISUALSTYLE = 0x0100;
//Class "msctls_trackbar32"
//TrackBar control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760147%28v=vs.85%29.aspx
TBS_AUTOTICKS = 0x0001;
TBS_VERT = 0x0002;
TBS_HORZ = 0x0000;
TBS_TOP = 0x0004;
TBS_BOTTOM = 0x0000;
TBS_LEFT = 0x0004;
TBS_RIGHT = 0x0000;
TBS_BOTH = 0x0008;
TBS_NOTICKS = 0x0010;
TBS_ENABLESELRANGE = 0x0020;
TBS_FIXEDLENGTH = 0x0040;
TBS_NOTHUMB = 0x0080;
TBS_REVERSED = 0x0200;
TBS_DOWNISLEFT = 0x0400;
//Win Vista
TBS_NOTIFYBEFOREMOVE = 0x0800;
TBS_TRANSPARENTBKGND = 0x1000;
//Class "SysTreeView32"
//Tree-View control extended styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb759981%28v=vs.85%29.aspx
//Tree-View control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb760013%28v=vs.85%29.aspx
TVS_CHECKBOXES = 0x0100;
TVS_DISABLEDRAGDROP = 0x0010;
TVS_EDITLABELS = 0x0008;
TVS_FULLROWSELECT = 0x1000;
TVS_HASBUTTONS = 0x0001;
TVS_HASLINES = 0x0002;
TVS_INFOTIP = 0x0800;
TVS_LINESATROOT = 0x0004;
TVS_NOHSCROLL = 0x8000;
TVS_NONEVENHEIGHT = 0x4000;
TVS_NOSCROLL = 0x2000;
TVS_NOTOOLTIPS = 0x0080;
TVS_RTLREADING = 0x0040;
TVS_SHOWSELALWAYS = 0x0020;
TVS_SINGLEEXPAND = 0x0400;
TVS_TRACKSELECT = 0x0200;
//Class "msctls_updown32"
//Up-Down control styles http://msdn.microsoft.com/en-us/library/windows/desktop/bb759885%28v=vs.85%29.aspx
UDS_ALIGNLEFT = 0x0008;
UDS_ALIGNRIGHT = 0x0004;
UDS_ARROWKEYS = 0x0020;
UDS_AUTOBUDDY = 0x0010;
UDS_HORZ = 0x0040;
UDS_HOTTRACK = 0x0100;
UDS_NOTHOUSANDS = 0x0080;
UDS_SETBUDDYINT = 0x0002;
UDS_WRAP = 0x0001;
(Scale =
{
Init: function()
{
var hWnd = AkelPad.GetMainWnd();
var hDC = AkelPad.SystemFunction().Call("User32::GetDC", hWnd);
this.ScaleX = AkelPad.SystemFunction().Call("Gdi32::GetDeviceCaps", hDC, 88 /*LOGPIXELSX*/);
this.ScaleY = AkelPad.SystemFunction().Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/);
AkelPad.SystemFunction().Call("User32::ReleaseDC", hWnd, hDC);
//Align to 16 pixel
this.ScaleX += (16 - this.ScaleX % 16) % 16;
this.ScaleY += (16 - this.ScaleY % 16) % 16;
},
X: function(n) {return AkelPad.SystemFunction().Call("Kernel32::MulDiv", n, this.ScaleX, 96);},
Y: function(n) {return AkelPad.SystemFunction().Call("Kernel32::MulDiv", n, this.ScaleY, 96);},
UX: function(n) {return AkelPad.SystemFunction().Call("Kernel32::MulDiv", n, 96, this.ScaleX);},
UY: function(n) {return AkelPad.SystemFunction().Call("Kernel32::MulDiv", n, 96, this.ScaleY);}
}).Init();
function CreateDialogWindow(aDlg, nWhat, hDlg, nStartID, nEndID)
{
var oSys = AkelPad.SystemFunction();
var hInstDLL = AkelPad.GetInstanceDll();
var lpRect = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
var nWndCount = 0;
var nFX = 0;
var nFY = 0;
var nDlgX, nDlgY, nDlgW, nDlgH;
var nParX, nParY, nParW, nParH;
var nCtlX, nCtlY, nCtlW, nCtlH, sCtlC, i;
if ((nWhat !== 1) && (nWhat !== 2)) nWhat = 0;
//create dialog
if ((nWhat < 2) && (! aDlg.HWND))
{
if (aDlg.Style & WS_CHILD) aDlg.Style ^= WS_CHILD;
if ((aDlg.Style & WS_SIZEBOX) && ((aDlg.Style & WS_BORDER) || (aDlg.Style & WS_DLGFRAME)))
{
nFX = oSys.Call("User32::GetSystemMetrics", 32 /*SM_CXSIZEFRAME*/) * 2;
nFY = oSys.Call("User32::GetSystemMetrics", 33 /*SM_CYSIZEFRAME*/) * 2;
}
else if ((aDlg.Style & WS_SIZEBOX) || (aDlg.Style & WS_DLGFRAME))
{
nFX = oSys.Call("User32::GetSystemMetrics", 7 /*SM_CXDLGFRAME*/) * 2;
nFY = oSys.Call("User32::GetSystemMetrics", 8 /*SM_CYDLGFRAME*/) * 2;
}
else if (aDlg.Style & WS_BORDER)
{
nFX = oSys.Call("User32::GetSystemMetrics", 5 /*SM_CXBORDER*/) * 2;
nFY = oSys.Call("User32::GetSystemMetrics", 6 /*SM_CYBORDER*/) * 2;
}
if (aDlg.Style & WS_VSCROLL)
nFX += oSys.Call("User32::GetSystemMetrics", 2 /*SM_CXVSCROLL*/);
if (aDlg.Style & WS_HSCROLL)
nFY += oSys.Call("User32::GetSystemMetrics", 3 /*SM_CYHSCROLL*/);
if ((aDlg.Style & WS_BORDER) && (aDlg.Style & WS_DLGFRAME))
nFY += oSys.Call("User32::GetSystemMetrics", 4 /*SM_CYCAPTION*/);
if (oSys.Call("User32::IsMenu", aDlg.Menu))
nFY += oSys.Call("User32::GetSystemMetrics", 15 /*SM_CYMENU*/);
nDlgX = Scale.X(aDlg.X || 0);
nDlgY = Scale.Y(aDlg.Y || 0);
nDlgW = aDlg.W || 0;
nDlgH = aDlg.H || 0;
if (aDlg.SizeClt)
{
nDlgW = Scale.X(nDlgW) + ((nDlgW < 0) ? -nFX : nFX);
nDlgH = Scale.Y(nDlgH) + ((nDlgH < 0) ? -nFY : nFY);
}
else
{
if (nDlgW > nFX)
nDlgW = Scale.X(nDlgW - nFX) + nFX;
else if (nDlgW < -nFX)
nDlgW = Scale.X(nDlgW + nFX) - nFX;
if (nDlgH > nFY)
nDlgH = Scale.Y(nDlgH - nFY) + nFY;
else if (nDlgH < -nFY)
nDlgH = Scale.Y(nDlgH + nFY) - nFY;
}
if (aDlg.PosPar == 1)
oSys.Call("User32::SystemParametersInfoW", 0x30 /*SPI_GETWORKAREA*/, 0, lpRect, 0);
else if ((aDlg.PosPar == 2) && oSys.Call("User32::IsWindow", aDlg.Parent))
oSys.Call("User32::GetWindowRect", aDlg.Parent, lpRect);
else if ((aDlg.PosPar == 3) && oSys.Call("User32::IsWindow", aDlg.Parent))
{
oSys.Call("User32::GetClientRect", aDlg.Parent, lpRect);
oSys.Call("User32::ClientToScreen", aDlg.Parent, lpRect);
oSys.Call("User32::ClientToScreen", aDlg.Parent, _PtrAdd(lpRect, 8));
}
else if ((aDlg.PosPar == 4) && oSys.Call("User32::IsWindow", aDlg.PosRect))
oSys.Call("User32::GetWindowRect", aDlg.PosRect, lpRect);
else if ((aDlg.PosPar == 5) && oSys.Call("User32::IsWindow", aDlg.PosRect))
{
oSys.Call("User32::GetClientRect", aDlg.PosRect, lpRect);
oSys.Call("User32::ClientToScreen", aDlg.PosRect, lpRect);
oSys.Call("User32::ClientToScreen", aDlg.PosRect, _PtrAdd(lpRect, 8));
}
else if ((aDlg.PosPar == 6) && aDlg.PosRect)
{
for (i = 0; i < 16; i += 4)
AkelPad.MemCopy(_PtrAdd(lpRect, i), AkelPad.MemRead(_PtrAdd(aDlg.PosRect, i), 3 /*DT_DWORD*/), 3 /*DT_DWORD*/);
}
else if ((aDlg.PosPar == 7) && aDlg.PosRect)
{
for (i = 0; i < 4; ++i)
AkelPad.MemCopy(_PtrAdd(lpRect, i * 4), aDlg.PosRect[i], 3 /*DT_DWORD*/);
}
else if (aDlg.PosPar == 8)
{
oSys.Call("User32::GetCursorPos", lpRect);
oSys.Call("User32::GetCursorPos", _PtrAdd(lpRect, 8));
}
else
oSys.Call("User32::GetWindowRect", oSys.Call("User32::GetDesktopWindow"), lpRect);
nParX = AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/);
nParY = AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/);
nParW = AkelPad.MemRead(_PtrAdd(lpRect, 8), 3 /*DT_DWORD*/) - nParX;
nParH = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/) - nParY;
nDlgX += nParX;
nDlgY += nParY;
if (aDlg.PosEdge)
{
aDlg.PosEdge = aDlg.PosEdge.toUpperCase();
if (aDlg.PosEdge.charAt(0) == "R")
nDlgX += nParW;
else if (aDlg.PosEdge.charAt(0) == "C")
nDlgX = nParX + (nParW - nDlgW) / 2;
if (aDlg.PosEdge.charAt(1) == "B")
nDlgY += nParH;
else if (aDlg.PosEdge.charAt(1) == "C")
nDlgY = nParY + (nParH - nDlgH) / 2;
}
if (nDlgW < 0)
{
nDlgW = -nDlgW;
nDlgX -= nDlgW;
}
if (nDlgH < 0)
{
nDlgH = -nDlgH;
nDlgY -= nDlgH;
}
aDlg.HWND = oSys.Call("User32::CreateWindowExW",
aDlg.ExStyle, //dwExStyle
aDlg.Class, //lpClassName
aDlg.Title, //lpWindowName
aDlg.Style, //dwStyle
nDlgX, //x
nDlgY, //y
nDlgW, //nWidth
nDlgH, //nHeight
aDlg.Parent, //hWndParent
aDlg.Menu, //hMenu
hInstDLL, //hInstance
aDlg.Callback);//lpParam
if (aDlg.HWND)
{
++nWndCount;
if (aDlg.Icon)
{
AkelPad.SendMessage(aDlg.HWND, 128 /*WM_SETICON*/, 0 /*ICON_SMALL*/, aDlg.Icon);
AkelPad.SendMessage(aDlg.HWND, 128 /*WM_SETICON*/, 1 /*ICON_BIG*/, aDlg.Icon);
}
}
}
//create controls
if ((nWhat == 0) || (nWhat == 2))
{
hDlg = hDlg || aDlg.HWND;
if (hDlg)
{
oSys.Call("User32::GetClientRect", hDlg, lpRect);
nDlgW = AkelPad.MemRead(_PtrAdd(lpRect, 8), 3 /*DT_DWORD*/);
nDlgH = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/);
if (arguments.length < 5)
{
if (arguments.length < 4) nStartID = aDlg.CtlFirst || 0;
nEndID = aDlg.length - 1;
}
nEndID = Math.max(nStartID, nEndID);
for (i = nStartID; i <= nEndID; ++i)
{
if (aDlg[i])
{
sCtlC = aDlg[i].Class || aDlg.CtlClass || "BUTTON";
aDlg[i].Style |= aDlg.CtlStyle | WS_CHILD;
if (aDlg[i].Style & WS_POPUP) aDlg[i].Style ^= WS_POPUP;
nCtlX = Scale.X(aDlg[i].X || 0);
nCtlY = Scale.Y(aDlg[i].Y || 0);
nCtlW = Scale.X(aDlg[i].W || 0);
nCtlH = Scale.Y(aDlg[i].H || 0);
if (aDlg[i].PosEdge)
{
aDlg[i].PosEdge = aDlg[i].PosEdge.toUpperCase();
if (aDlg[i].PosEdge.charAt(0) == "R")
nCtlX += nDlgW;
else if (aDlg[i].PosEdge.charAt(0) == "C")
nCtlX = (nDlgW - nCtlW) / 2;
if (aDlg[i].PosEdge.charAt(1) == "B")
nCtlY += nDlgH;
else if (aDlg[i].PosEdge.charAt(1) == "C")
nCtlY = (nDlgH - nCtlH) / 2;
}
if (nCtlW < 0)
{
nCtlW = -nCtlW;
nCtlX -= nCtlW;
}
if (nCtlH < 0)
{
nCtlH = -nCtlH;
nCtlY -= nCtlH;
}
aDlg[i].HWND = oSys.Call("User32::CreateWindowExW",
aDlg[i].ExStyle,//dwExStyle
sCtlC, //lpClassName
aDlg[i].Title, //lpWindowName
aDlg[i].Style, //dwStyle
nCtlX, //x
nCtlY, //y
nCtlW, //nWidth
nCtlH, //nHeight
hDlg, //hWndParent
i, //ID
hInstDLL, //hInstance
0); //lpParam
if (aDlg[i].HWND)
{
++nWndCount;
AkelPad.SendMessage(aDlg[i].HWND, 48 /*WM_SETFONT*/, aDlg[i].Font || aDlg.CtlFont, true);
}
}
}
}
}
AkelPad.MemFree(lpRect);
return nWndCount;
}
function CreateDialogBox(aDlg, bTemplate, nStartID, nEndID)
{
var oSys = AkelPad.SystemFunction();
var nCtlCount = 0;
var nResult = aDlg.Modeless ? 0 : -1;
var sTitle = aDlg.Title || "";
var nCtlFontS = aDlg.CtlFontS || 8;
var nTempLen = 30 + (sTitle.length + 1) * 2;
var lpTemp, lpItem, sCtlC, sCtlT, i;
if (arguments.length < 4)
{
if (arguments.length < 3) nStartID = aDlg.CtlFirst || 0;
nEndID = aDlg.length - 1;
}
nEndID = Math.max(nStartID, nEndID);
if (aDlg.Style & WS_CHILD) aDlg.Style ^= WS_CHILD;
if (aDlg.CtlFontN)
{
aDlg.Style |= DS_SETFONT;
nTempLen += 6 + (aDlg.CtlFontN.length + 1) * 2;
}
else if (aDlg.Style & DS_SETFONT)
aDlg.Style ^= DS_SETFONT;
nTempLen += (4 - nTempLen % 4) % 4; //align to DWORD
for (i = nStartID; i <= nEndID; ++i)
{
if (aDlg[i])
{
sCtlC = aDlg[i].Class || aDlg.CtlClass || "BUTTON";
sCtlT = aDlg[i].Title || "";
aDlg[i].Style |= aDlg.CtlStyle | WS_CHILD;
if (aDlg[i].Style & WS_POPUP) aDlg[i].Style ^= WS_POPUP;
nTempLen += 26 + (sCtlC.length + 1) * 2 + (sCtlT.length + 1) * 2;
nTempLen += (4 - nTempLen % 4) % 4; //align to DWORD
++nCtlCount;
}
}
lpTemp = AkelPad.MemAlloc(nTempLen);
lpItem = lpTemp;
//fill DLGTEMPLATEEX
AkelPad.MemCopy(_PtrAdd(lpItem, 0), 1, 4 /*DT_WORD*/); //dlgVer
AkelPad.MemCopy(_PtrAdd(lpItem, 2), 0xFFFF, 4 /*DT_WORD*/); //signature
AkelPad.MemCopy(_PtrAdd(lpItem, 8), aDlg.ExStyle, 3 /*DT_DWORD*/); //exStyle
AkelPad.MemCopy(_PtrAdd(lpItem, 12), aDlg.Style, 3 /*DT_DWORD*/); //style
AkelPad.MemCopy(_PtrAdd(lpItem, 16), nCtlCount, 4 /*DT_WORD*/); //cDlgItems
AkelPad.MemCopy(_PtrAdd(lpItem, 18), aDlg.X, 4 /*DT_WORD*/); //x
AkelPad.MemCopy(_PtrAdd(lpItem, 20), aDlg.Y, 4 /*DT_WORD*/); //y
AkelPad.MemCopy(_PtrAdd(lpItem, 22), Math.abs(aDlg.W), 4 /*DT_WORD*/); //cx
AkelPad.MemCopy(_PtrAdd(lpItem, 24), Math.abs(aDlg.H), 4 /*DT_WORD*/); //cy
AkelPad.MemCopy(_PtrAdd(lpItem, 30), sTitle, 1 /*DT_UNICODE*/);//title
lpItem = _PtrAdd(lpItem, 30 + (sTitle.length + 1) * 2);
if (aDlg.CtlFontN)
{
AkelPad.MemCopy(_PtrAdd(lpItem, 0), nCtlFontS, 4 /*DT_WORD*/); //pointsize
AkelPad.MemCopy(_PtrAdd(lpItem, 4), aDlg.CtlFontI, 5 /*DT_BYTE*/); //italic
AkelPad.MemCopy(_PtrAdd(lpItem, 5), 1, 5 /*DT_BYTE*/); //charset=DEFAULT_CHARSET
AkelPad.MemCopy(_PtrAdd(lpItem, 6), aDlg.CtlFontN, 1 /*DT_UNICODE*/);//typeface
lpItem = _PtrAdd(lpItem, 6 + (aDlg.CtlFontN.length + 1) * 2);
}
lpItem = _PtrAdd(lpItem, (4 - lpItem % 4) % 4); //align to DWORD
//fill DLGITEMTEMPLATEEX
for (i = nStartID; i <= nEndID; ++i)
{
if (aDlg[i])
{
sCtlC = aDlg[i].Class || aDlg.CtlClass || "BUTTON";
sCtlT = aDlg[i].Title || "";
AkelPad.MemCopy(_PtrAdd(lpItem, 4), aDlg[i].ExStyle, 3 /*DT_DWORD*/); //exStyle
AkelPad.MemCopy(_PtrAdd(lpItem, 8), aDlg[i].Style, 3 /*DT_DWORD*/); //style
AkelPad.MemCopy(_PtrAdd(lpItem, 12), aDlg[i].X, 4 /*DT_WORD*/); //x
AkelPad.MemCopy(_PtrAdd(lpItem, 14), aDlg[i].Y, 4 /*DT_WORD*/); //y
AkelPad.MemCopy(_PtrAdd(lpItem, 16), Math.abs(aDlg[i].W), 4 /*DT_WORD*/); //cx
AkelPad.MemCopy(_PtrAdd(lpItem, 18), Math.abs(aDlg[i].H), 4 /*DT_WORD*/); //cy
AkelPad.MemCopy(_PtrAdd(lpItem, 20), i, 3 /*DT_DWORD*/); //id
AkelPad.MemCopy(_PtrAdd(lpItem, 24), sCtlC, 1 /*DT_UNICODE*/);//windowClass
lpItem = _PtrAdd(lpItem, 24 + (sCtlC.length + 1) * 2);
AkelPad.MemCopy(lpItem, sCtlT, 1 /*DT_UNICODE*/);//title
lpItem = _PtrAdd(lpItem, (sCtlT.length + 1) * 2 + 2);
lpItem = _PtrAdd(lpItem, (4 - lpItem % 4) % 4); //align to DWORD
}
}
if (bTemplate) return lpTemp;
if (RegisterCallback())
{
nResult = oSys.Call(aDlg.Modeless ? "User32::CreateDialogIndirectParamW" : "User32::DialogBoxIndirectParamW",
AkelPad.GetInstanceDll(), //hInstance
lpTemp, //lpTemplate
aDlg.Parent, //hWndParent
CreateDialogBox.Callback[CreateDialogBox.Callback.length - 1],//lpDialogFunc
aDlg.InitParam); //lParamInit
if (aDlg.Modeless)
{
if (! nResult) UnregisterCallback();
}
else
{
if ((! nResult) && aDlg.Parent && (! oSys.Call("User32::IsWindow", aDlg.Parent))) nResult = -1;
if (nResult == -1) UnregisterCallback();
}
}
AkelPad.MemFree(lpTemp);
return nResult;
function CreateDialogBoxCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 272 /*WM_INITDIALOG*/)
{
var lpRectW, lpRectC;
var nDlgX, nDlgY, nDlgW, nDlgH;
var nParX, nParY, nParW, nParH;
var nCtlX, nCtlY, nCtlW, nCtlH;
var nFX, nFY, i;
aDlg.HWND = hWnd;
for (i = nStartID; i <= nEndID; ++i)
{
if (aDlg[i]) aDlg[i].HWND = oSys.Call("User32::GetDlgItem", hWnd, i);
}
if (oSys.Call("User32::IsMenu", aDlg.Menu)) oSys.Call("User32::SetMenu", hWnd, aDlg.Menu);
if (aDlg.Icon)
{
AkelPad.SendMessage(hWnd, 128 /*WM_SETICON*/, 0 /*ICON_SMALL*/, aDlg.Icon);
AkelPad.SendMessage(hWnd, 128 /*WM_SETICON*/, 1 /*ICON_BIG*/, aDlg.Icon);
}
if (aDlg.PosPix)
{
lpRectW = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
lpRectC = AkelPad.MemAlloc(16);
oSys.Call("User32::GetWindowRect", hWnd, lpRectW);
oSys.Call("User32::GetClientRect", hWnd, lpRectC);
nFX = AkelPad.MemRead(_PtrAdd(lpRectW, 8), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRectW, 0), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRectC, 8), 3 /*DT_DWORD*/);
nFY = AkelPad.MemRead(_PtrAdd(lpRectW, 12), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRectW, 4), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRectC, 12), 3 /*DT_DWORD*/);
nDlgX = Scale.X(aDlg.X || 0);
nDlgY = Scale.Y(aDlg.Y || 0);
nDlgW = Scale.X(aDlg.W || 0);
nDlgH = Scale.Y(aDlg.H || 0);
nDlgW += (nDlgW < 0) ? -nFX : nFX;
nDlgH += (nDlgH < 0) ? -nFY : nFY;
if (aDlg.PosPar == 1)
oSys.Call("User32::SystemParametersInfoW", 0x30 /*SPI_GETWORKAREA*/, 0, lpRectW, 0);
else if ((aDlg.PosPar == 2) && oSys.Call("User32::IsWindow", aDlg.Parent))
oSys.Call("User32::GetWindowRect", aDlg.Parent, lpRectW);
else if ((aDlg.PosPar == 3) && oSys.Call("User32::IsWindow", aDlg.Parent))
{
oSys.Call("User32::GetClientRect", aDlg.Parent, lpRectW);
oSys.Call("User32::ClientToScreen", aDlg.Parent, lpRectW);
oSys.Call("User32::ClientToScreen", aDlg.Parent, _PtrAdd(lpRectW, 8));
}
else if ((aDlg.PosPar == 4) && oSys.Call("User32::IsWindow", aDlg.PosRect))
oSys.Call("User32::GetWindowRect", aDlg.PosRect, lpRectW);
else if ((aDlg.PosPar == 5) && oSys.Call("User32::IsWindow", aDlg.PosRect))
{
oSys.Call("User32::GetClientRect", aDlg.PosRect, lpRectW);
oSys.Call("User32::ClientToScreen", aDlg.PosRect, lpRectW);
oSys.Call("User32::ClientToScreen", aDlg.PosRect, _PtrAdd(lpRectW, 8));
}
else if ((aDlg.PosPar == 6) && aDlg.PosRect)
{
for (i = 0; i < 16; i += 4)
AkelPad.MemCopy(_PtrAdd(lpRectW, i), AkelPad.MemRead(_PtrAdd(aDlg.PosRect, i), 3 /*DT_DWORD*/), 3 /*DT_DWORD*/);
}
else if ((aDlg.PosPar == 7) && aDlg.PosRect)
{
for (i = 0; i < 4; ++i)
AkelPad.MemCopy(_PtrAdd(lpRectW, i * 4), aDlg.PosRect[i], 3 /*DT_DWORD*/);
}
else if (aDlg.PosPar == 8)
{
oSys.Call("User32::GetCursorPos", lpRectW);
oSys.Call("User32::GetCursorPos", _PtrAdd(lpRectW, 8));
}
else
oSys.Call("User32::GetWindowRect", oSys.Call("User32::GetDesktopWindow"), lpRectW);
nParX = AkelPad.MemRead(_PtrAdd(lpRectW, 0), 3 /*DT_DWORD*/);
nParY = AkelPad.MemRead(_PtrAdd(lpRectW, 4), 3 /*DT_DWORD*/);
nParW = AkelPad.MemRead(_PtrAdd(lpRectW, 8), 3 /*DT_DWORD*/) - nParX;
nParH = AkelPad.MemRead(_PtrAdd(lpRectW, 12), 3 /*DT_DWORD*/) - nParY;
nDlgX += nParX;
nDlgY += nParY;
if (aDlg.PosEdge)
{
aDlg.PosEdge = aDlg.PosEdge.toUpperCase();
if (aDlg.PosEdge.charAt(0) == "R")
nDlgX += nParW;
else if (aDlg.PosEdge.charAt(0) == "C")
nDlgX = nParX + (nParW - nDlgW) / 2;
if (aDlg.PosEdge.charAt(1) == "B")
nDlgY += nParH;
else if (aDlg.PosEdge.charAt(1) == "C")
nDlgY = nParY + (nParH - nDlgH) / 2;
}
if (nDlgW < 0)
{
nDlgW = -nDlgW;
nDlgX -= nDlgW;
}
if (nDlgH < 0)
{
nDlgH = -nDlgH;
nDlgY -= nDlgH;
}
oSys.Call("User32::MoveWindow", hWnd, nDlgX, nDlgY, nDlgW, nDlgH, 0);
oSys.Call("User32::GetClientRect", hWnd, lpRectC);
nDlgW = AkelPad.MemRead(_PtrAdd(lpRectC, 8), 3 /*DT_DWORD*/);
nDlgH = AkelPad.MemRead(_PtrAdd(lpRectC, 12), 3 /*DT_DWORD*/);
for (i = nStartID; i <= nEndID; ++i)
{
nCtlX = Scale.X(aDlg[i].X || 0);
nCtlY = Scale.Y(aDlg[i].Y || 0);
nCtlW = Scale.X(aDlg[i].W || 0);
nCtlH = Scale.Y(aDlg[i].H || 0);
if (aDlg[i].PosEdge)
{
aDlg[i].PosEdge = aDlg[i].PosEdge.toUpperCase();
if (aDlg[i].PosEdge.charAt(0) == "R")
nCtlX += nDlgW;
else if (aDlg[i].PosEdge.charAt(0) == "C")
nCtlX = (nDlgW - nCtlW) / 2;
if (aDlg[i].PosEdge.charAt(1) == "B")
nCtlY += nDlgH;
else if (aDlg[i].PosEdge.charAt(1) == "C")
nCtlY = (nDlgH - nCtlH) / 2;
}
if (nCtlW < 0)
{
nCtlW = -nCtlW;
nCtlX -= nCtlW;
}
if (nCtlH < 0)
{
nCtlH = -nCtlH;
nCtlY -= nCtlH;
}
oSys.Call("User32::MoveWindow", aDlg[i].HWND, nCtlX, nCtlY, nCtlW, nCtlH, 0);
}
AkelPad.MemFree(lpRectW);
AkelPad.MemFree(lpRectC);
}
aDlg.Callback(hWnd, uMsg, wParam, lParam);
if (aDlg.Modeless) AkelPad.WindowRegisterDialog(hWnd); //Register dialog for message loop (modeless dialog created without WindowRegisterClass).
return 0;
}
aDlg.Callback(hWnd, uMsg, wParam, lParam);
if (uMsg == 2 /*WM_DESTROY*/)
{
if (aDlg.Modeless) AkelPad.WindowUnregisterDialog(hWnd);
UnregisterCallback();
}
return 0;
}
function RegisterCallback()
{
if (! CreateDialogBox.Callback) CreateDialogBox.Callback = [];
try
{
CreateDialogBox.Callback[CreateDialogBox.Callback.length] = oSys.RegisterCallback(CreateDialogBoxCallback);
return true;
}
catch (oError)
{
WScript.Echo("Unable to register callback function.");
return false;
}
}
function UnregisterCallback()
{
oSys.UnregisterCallback(CreateDialogBox.Callback[CreateDialogBox.Callback.length - 1]);
--CreateDialogBox.Callback.length;
}
}
Last edited by KDJ on Mon Jan 05, 2015 5:10 pm, edited 4 times in total.
-
Offline
- Posts: 1949
- Joined: Sat Mar 06, 2010 7:40 pm
- Location: Poland
Example of create dialog boxes by using CreateDialogWindow() and CreateDialogBox() functions.
Required to include: CreateDialog_functions.js (in previous post).
Required to include: CreateDialog_functions.js (in previous post).
Code: Select all
// CreateDialog.js - ver. 2014-05-11 (x86/x64)
//
// Example of create dialog boxes by using CreateDialogWindow() and CreateDialogBox() functions
//
// Usage:
// Call("Scripts::Main", 1, "CreateDialog.js")
// Required to include: CreateDialog_functions.js
var oSys = AkelPad.SystemFunction();
var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + AkelPad.GetInstanceDll();
var hDlg = oSys.Call("User32::FindWindowW", sClass, 0);
if (hDlg)
{
if (! oSys.Call("User32::IsWindowVisible", hDlg))
oSys.Call("User32::ShowWindow", hDlg, 8 /*SW_SHOWNA*/);
if (oSys.Call("User32::IsIconic", hDlg))
oSys.Call("User32::ShowWindow", hDlg, 9 /*SW_RESTORE*/);
oSys.Call("User32::SetForegroundWindow", hDlg);
}
else if (AkelPad.Include("CreateDialog_functions.js"))
{
var hRichEdLib = oSys.Call("Kernel32::LoadLibraryW", "Msftedit.dll");
var hIcon = oSys.Call("User32::LoadImageW", AkelPad.GetInstanceDll(), 101, 1 /*uType=IMAGE_ICON*/, 0, 0, 0x40 /*LR_DEFAULTSIZE*/);
var nCounter = 0;
var IDCANCEL = 2;
var IDMENU11 = 1011;
var IDMENU12 = 1012;
var IDMENU13 = 1013;
var IDMENU14 = 1014;
var IDMENU21 = 1021;
var IDMENU22 = 1022;
var IDMENU23 = 1023;
var IDMENU24 = 1024;
var IDGROUPB = 2000;
var IDCHECKB = 2001;
var IDRADIO1 = 2002;
var IDRADIO2 = 2003;
var IDBUTTON = 2004;
var IDGROUPCB = 2005;
var IDCBS1 = 2006;
var IDCBS2 = 2007;
var IDCBS3 = 2008;
var IDCB1 = 2009;
var IDCB2 = 2010;
var IDCB3 = 2011;
var IDGROUPDT = 2012;
var IDDT1 = 2013;
var IDDT2 = 2014;
var IDDT3 = 2015;
var IDGROUPE = 2016;
var IDE = 2017;
var IDRE = 2018;
var IDAE = 2019;
var IDGROUPLB = 2020;
var IDLB = 2021;
var IDGROUPLV = 2022;
var IDLV = 2023;
var IDGROUPMC = 2024;
var IDMC = 2025;
var IDGROUPTV = 2026;
var IDTV = 2027;
var IDGROUPLW = 2028;
var IDLW = 2029;
var IDGROUPTB = 2030;
var IDTB = 2031;
var IDGROUPUD = 2032;
var IDBUDDYUD = 2033;
var IDUD = 2034;
var IDTC = 2035;
var IDGROUPPB = 2036;
var IDPB = 2037;
var IDSBAR = 2038;
if (AkelPad.WindowRegisterClass(sClass))
{
//Allow other scripts running
AkelPad.ScriptNoMutex();
CreateDialog(false, true, AkelPad.GetMainWnd());
AkelPad.WindowUnregisterClass(sClass);
}
oSys.Call("Kernel32::FreeLibrary", hRichEdLib);
oSys.Call("user32::DestroyIcon", hIcon);
}
function CreateDialog(bBox, bModeless, hParent)
{
var nTimerID = ++nCounter;
var aDlg = [];
var nResult;
var hFocus;
aDlg.Modeless = bModeless;
aDlg.Title = "[" + nTimerID + "] " + (bBox ? "Dialog box " : "Dialog window ") + (bModeless ? "modeless" : "modal");
aDlg.Style = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
aDlg.Parent = hParent;
aDlg.Menu = CreateMainMenu();
aDlg.Callback = DialogCallback;
aDlg.Icon = hIcon;
aDlg.X = 20;
aDlg.W = 650;
aDlg.H = 432;
aDlg.PosPar = 3;
aDlg.CtlFirst = IDGROUPB;
aDlg.CtlStyle = WS_VISIBLE;
if (bBox)
{
aDlg.PosPix = true;
aDlg.CtlFontN = "MS Shell Dlg";
}
else
{
aDlg.Class = sClass;
aDlg.SizeClt = true;
aDlg.CtlFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
}
aDlg[IDGROUPB] = {X: 10, Y: 10, W: 100, H: 125, Title: "Button", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDCHECKB] = {X: 20, Y: 30, W: 80, H: 16, Title: "CheckBox", Style: WS_TABSTOP | BS_AUTOCHECKBOX};
aDlg[IDRADIO1] = {X: 20, Y: 57, W: 80, H: 16, Title: "Radio1", Style: WS_TABSTOP | BS_AUTORADIOBUTTON};
aDlg[IDRADIO2] = {X: 20, Y: 73, W: 80, H: 16, Title: "Radio2", Style: WS_TABSTOP | BS_AUTORADIOBUTTON};
aDlg[IDBUTTON] = {X: 20, Y: 102, W: 80, H: 23, Title: "PushButton", Style: WS_TABSTOP | BS_PUSHBUTTON};
aDlg[IDGROUPCB] = {X: 120, Y: 10, W: 190, H: 125, Title: "ComboBox", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDCBS1] = {X: 130, Y: 30, W: 80, H: 13, Title: "Simple", Class: "STATIC"};
aDlg[IDCBS2] = {X: 220, Y: 30, W: 80, H: 13, Title: "Drop-down", Class: "STATIC"};
aDlg[IDCBS3] = {X: 220, Y: 87, W: 80, H: 13, Title: "Drop-down list", Class: "STATIC"};
aDlg[IDCB1] = {X: 130, Y: 45, W: 80, H: 82, Class: "COMBOBOX", Style: WS_TABSTOP | WS_VSCROLL | CBS_SIMPLE | CBS_NOINTEGRALHEIGHT};
aDlg[IDCB2] = {X: 220, Y: 45, W: 80, H: 120, Class: "COMBOBOX", Style: WS_TABSTOP | CBS_DROPDOWN};
aDlg[IDCB3] = {X: 220, Y: 102, W: 80, H: 120, Class: "COMBOBOX", Style: WS_TABSTOP | CBS_DROPDOWNLIST};
aDlg[IDGROUPDT] = {X: 320, Y: 10, W: 100, H: 125, Title: "DateTimePicker", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDDT1] = {X: 330, Y: 30, W: 80, H: 23, Title: "Edit", Class: "SysDateTimePick32", Style: WS_TABSTOP};
aDlg[IDDT2] = {X: 330, Y: 66, W: 80, H: 23, Title: "Edit", Class: "SysDateTimePick32", Style: WS_TABSTOP | DTS_UPDOWN};
aDlg[IDDT3] = {X: 330, Y: 102, W: 80, H: 23, Title: "Edit", Class: "SysDateTimePick32", Style: WS_TABSTOP};
aDlg[IDGROUPE] = {X: 430, Y: 10, W: 100, H: 125, Title: "Edit", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDE] = {X: 440, Y: 30, W: 80, H: 20, Title: "Edit", Class: "EDIT", Style: WS_TABSTOP | WS_BORDER};
aDlg[IDRE] = {X: 440, Y: 60, W: 80, H: 20, Title: "RichEdit", Class: "RichEdit50W", Style: WS_TABSTOP | WS_BORDER};
aDlg[IDAE] = {X: 440, Y: 90, W: 80, H: 35, Class: "AkelEditW", Style: WS_TABSTOP | WS_BORDER | ES_MULTILINE | ES_WANTRETURN};
aDlg[IDGROUPLB] = {X: 540, Y: 10, W: 100, H: 125, Title: "ListBox", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDLB] = {X: 550, Y: 30, W: 80, H: 95, Class: "LISTBOX", Style: WS_TABSTOP | WS_VSCROLL | WS_BORDER | LBS_NOINTEGRALHEIGHT};
aDlg[IDGROUPLV] = {X: 10, Y: 145, W: 130, H: 185, Title: "ListView", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDLV] = {X: 20, Y: 165, W: 110, H: 155, Class: "SysListView32", Style: WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS};
aDlg[IDGROUPMC] = {X: 150, Y: 145, W: 190, H: 185, Title: "MonthCalendar", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDMC] = {X: 160, Y: 165, W: 170, H: 155, Class: "SysMonthCal32", Style: WS_TABSTOP | WS_BORDER};
aDlg[IDGROUPTV] = {X: 350, Y: 145, W: 150, H: 185, Title: "TreeView", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDTV] = {X: 360, Y: 165, W: 130, H: 155, Class: "SysTreeView32", Style: WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT};
aDlg[IDGROUPLW] = {X: 510, Y: 145, W: 130, H: 45, Title: "SysLink", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDLW] = {X: 520, Y: 165, W: 110, H: 16, Title: "<a>Show/hide main menu</a>", Class: "SysLink"};
aDlg[IDGROUPTB] = {X: 510, Y: 200, W: 130, H: 60, Title: "TrackBar", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDTB] = {X: 520, Y: 220, W: 110, H: 30, Class: "msctls_trackbar32", Style: WS_TABSTOP | TBS_AUTOTICKS};
aDlg[IDGROUPUD] = {X: 510, Y: 270, W: 130, H: 60, Title: "Up-Down", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDBUDDYUD] = {X: 550, Y: 295, W: 50, H: 20, Class: "EDIT", Style: WS_TABSTOP | ES_NUMBER, ExStyle: WS_EX_CLIENTEDGE};
aDlg[IDUD] = { Class: "msctls_updown32", Style: UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT};
aDlg[IDTC] = {X: 10, Y: 345, W: 490, H: 55, Class: "SysTabControl32", Style: WS_TABSTOP | TCS_FIXEDWIDTH | TCS_FOCUSONBUTTONDOWN};
aDlg[IDGROUPPB] = {X: 510, Y: 340, W: 130, H: 60, Title: "ProgressBar", Style: BS_GROUPBOX | BS_CENTER};
aDlg[IDPB] = {X: 520, Y: 365, W: 110, H: 20, Class: "msctls_progress32"};
aDlg[IDSBAR] = {Class: "msctls_statusbar32"};
if (bBox)
{
if (bModeless)
{
if (CreateDialogBox(aDlg))
{
if (nTimerID == 1)
AkelPad.WindowGetMessage(0x2 /*WGM_NOKEYSEND*/);
}
else
oSys.Call("User32::DestroyMenu", aDlg.Menu);
}
else
{
nResult = CreateDialogBox(aDlg);
if (nResult == -1)
oSys.Call("User32::DestroyMenu", aDlg.Menu);
}
}
else
{
if (CreateDialogWindow(aDlg, 1))
{
if (! bModeless)
oSys.Call("user32::EnableWindow", aDlg.Parent, 0);
if (nTimerID == 1)
AkelPad.WindowGetMessage(0x2 /*WGM_NOKEYSEND*/);
}
else
oSys.Call("User32::DestroyMenu", aDlg.Menu);
}
function DialogCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 1 /*WM_CREATE*/)
{
aDlg.HWND = hWnd;
CreateDialogWindow(aDlg, 2, hWnd);
InitDialog();
hFocus = aDlg[IDCHECKB].HWND;
}
else if (uMsg == 272 /*WM_INITDIALOG*/)
InitDialog();
else if ((uMsg == 6 /*WM_ACTIVATE*/) && (wParam == 0 /*WA_INACTIVE*/) && (! bBox))
hFocus = oSys.Call("User32::GetFocus");
else if ((uMsg == 7 /*WM_SETFOCUS*/) && (! bBox))
oSys.Call("User32::SetFocus", hFocus);
else if (uMsg == 5 /*WM_SIZE*/)
AkelPad.SendMessage(aDlg[IDSBAR].HWND, 5 /*WM_SIZE*/, 0, 0);
if (uMsg == 78 /*WM_NOTIFY*/)
{
if (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), 3 /*DT_DWORD*/) == -2 /*NM_CLICK*/)
{
if (wParam == IDLW)
{
oSys.Call("User32::SetMenu", hWnd, oSys.Call("User32::GetMenu", hWnd) ? 0 : aDlg.Menu);
AkelPad.SendMessage(aDlg[IDSBAR].HWND, 5 /*WM_SIZE*/, 0, 0);
}
}
}
else if (uMsg == 273 /*WM_COMMAND*/)
{
var nLowParam = LoWord(wParam);
if (nLowParam == IDBUTTON)
AkelPad.MessageBox(hWnd, '"PushButton" has been pressed.', aDlg.Title, 0x40 /*MB_ICONINFORMATION*/);
else if (nLowParam == IDMENU11)
CreateDialog(false, false, hWnd);
else if (nLowParam == IDMENU12)
CreateDialog(false, true, hWnd);
else if (nLowParam == IDMENU13)
CreateDialog(true, false, hWnd);
else if (nLowParam == IDMENU14)
CreateDialog(true, true, hWnd);
else if ((nLowParam >= IDMENU21) && (nLowParam <= IDMENU24))
AkelPad.MessageBox(hWnd, "Command: " + nLowParam, aDlg.Title, 0x40 /*MB_ICONINFORMATION*/);
else if (nLowParam == IDCANCEL)
oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, nLowParam, 0);
}
else if (uMsg == 275 /*WM_TIMER*/)
{
AkelPad.SendMessage(aDlg[IDPB].HWND, 1029 /*PBM_STEPIT*/, 0, 0);
SetTextSBAR(AkelPad.SendMessage(aDlg[IDPB].HWND, 1032 /*PBM_GETPOS*/, 0, 0));
}
else if (uMsg == 16 /*WM_CLOSE*/)
{
if ((! bBox) && (! bModeless))
{
oSys.Call("user32::EnableWindow", aDlg.Parent, 1);
oSys.Call("User32::SetForegroundWindow", aDlg.Parent);
}
AkelPad.WindowUnsubClass(aDlg[IDRE].HWND);
oSys.Call("User32::KillTimer", hWnd, nTimerID);
if (bBox && (! bModeless))
oSys.Call("User32::EndDialog", hWnd, wParam);
else
oSys.Call("User32::DestroyWindow", hWnd);
}
else if (uMsg == 2 /*WM_DESTROY*/)
{
oSys.Call("User32::DestroyMenu", aDlg.Menu);
if (nTimerID == 1)
oSys.Call("User32::PostQuitMessage", 0);
}
return 0;
}
function InitDialog()
{
var i;
//Button
AkelPad.SendMessage(aDlg[IDCHECKB].HWND, 241 /*BM_SETCHECK*/, 1 /*BST_CHECKED*/, 0);
AkelPad.SendMessage(aDlg[IDRADIO1].HWND, 241 /*BM_SETCHECK*/, 0 /*BST_UNCHECKED*/, 0);
AkelPad.SendMessage(aDlg[IDRADIO2].HWND, 241 /*BM_SETCHECK*/, 1 /*BST_CHECKED*/, 0);
//ComboBox
for (i = 0; i < 15; ++i) AkelPad.SendMessage(aDlg[IDCB1].HWND, 323 /*CB_ADDSTRING*/, 0, "Item " + i);
for (i = 0; i < 15; ++i) AkelPad.SendMessage(aDlg[IDCB2].HWND, 323 /*CB_ADDSTRING*/, 0, "Item " + i);
for (i = 0; i < 15; ++i) AkelPad.SendMessage(aDlg[IDCB3].HWND, 323 /*CB_ADDSTRING*/, 0, "Item " + i);
AkelPad.SendMessage(aDlg[IDCB1].HWND, 334 /*CB_SETCURSEL*/, 4, 0);
AkelPad.SendMessage(aDlg[IDCB2].HWND, 334 /*CB_SETCURSEL*/, 2, 0);
AkelPad.SendMessage(aDlg[IDCB3].HWND, 334 /*CB_SETCURSEL*/, 6, 0);
//DateTimePicker
AkelPad.SendMessage(aDlg[IDDT3].HWND, 4146 /*DTM_SETFORMATW*/, 0, "ddd HH:mm");
//Edit
AkelPad.WindowSubClass(aDlg[IDRE].HWND, RichEditCallback, 258 /*WM_CHAR*/);
oSys.Call("User32::SetWindowTextW", aDlg[IDAE].HWND, "AkelEdit\nmultiline");
//ListBox
for (i = 0; i < 20; ++i) AkelPad.SendMessage(aDlg[IDLB].HWND, 384 /*LB_ADDSTRING*/, 0, "Item " + i);
AkelPad.SendMessage(aDlg[IDLB].HWND, 390 /*LB_SETCURSEL*/, 9, 0);
//ListView
FillLV();
//TreeView
FillTV();
//TrackBar
AkelPad.SendMessage(aDlg[IDTB].HWND, 1044 /*TBM_SETTICFREQE*/, 10, 0);
//Up-Down
AkelPad.SendMessage(aDlg[IDUD].HWND, 1129 /*UDM_SETBUDDY*/, aDlg[IDBUDDYUD].HWND, 0);
AkelPad.SendMessage(aDlg[IDUD].HWND, 1135 /*UDM_SETRANGE32*/, 1, 100);
AkelPad.SendMessage(aDlg[IDUD].HWND, 1137 /*UDM_SETPOS32*/, 0, 50);
//Tab
FillTC();
//ProgressBar
AkelPad.SendMessage(aDlg[IDPB].HWND, 1028 /*PBM_SETSTEP*/, 1, 0);
oSys.Call("User32::SetTimer", aDlg.HWND, nTimerID, 200, 0);
//StatusBar
SetPartsSBAR();
SetTextSBAR(0);
}
function RichEditCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 258) //WM_CHAR
{
if (wParam == 0x09 /*VK_TAB*/)
oSys.Call("User32::SetFocus", oSys.Call("User32::GetNextDlgTabItem", aDlg.HWND, hWnd, Shift()));
}
return 0;
}
function FillLV()
{
var nBufSize = 64;
var lpText = AkelPad.MemAlloc(nBufSize);
var lpLVITEM = AkelPad.MemAlloc(_X64 ? 72 : 60 /*sizeof(LVITEM)*/);
var lpLVCOLUMN = AkelPad.MemAlloc(_X64 ? 56 : 44 /*sizeof(LVCOLUMN)*/);
var i;
AkelPad.MemCopy(lpText, "Name", 1 /*DT_UNICODE*/);
AkelPad.MemCopy(lpLVCOLUMN, 5 /*LVCF_FMT|LVCF_TEXT*/, 3 /*DT_DWORD*/); //mask
AkelPad.MemCopy(lpLVCOLUMN + (_X64 ? 16 : 12), lpText, 2 /*DT_QWORD*/); //pszText
AkelPad.SendMessage(aDlg[IDLV].HWND, 4193 /*LVM_INSERTCOLUMNW*/, 0, lpLVCOLUMN);
AkelPad.MemCopy(lpText, "Value", 1 /*DT_UNICODE*/);
AkelPad.MemCopy(lpLVCOLUMN + 4, 1 /*LVCFMT_RIGHT*/, 3 /*DT_DWORD*/); //fmt
AkelPad.SendMessage(aDlg[IDLV].HWND, 4193 /*LVM_INSERTCOLUMNW*/, 1, lpLVCOLUMN);
AkelPad.MemCopy(lpLVITEM, 1 /*LVIF_TEXT*/, 3 /*DT_DWORD*/); //mask
AkelPad.MemCopy(lpLVITEM + (_X64 ? 24 : 20), lpText, 2 /*DT_QWORD*/); //pszText
AkelPad.MemCopy(lpLVITEM + (_X64 ? 32 : 24), nBufSize, 3 /*DT_DWORD*/); //cchTextMax
for (i = 0; i < 25; ++i)
{
AkelPad.MemCopy(lpText, "Item " + i, 1 /*DT_UNICODE*/);
AkelPad.MemCopy(lpLVITEM + 4, i, 3 /*DT_DWORD*/); //iItem
AkelPad.MemCopy(lpLVITEM + 8, 0, 3 /*DT_DWORD*/); //iSubItem
AkelPad.SendMessage(aDlg[IDLV].HWND, 4173 /*LVM_INSERTITEMW*/, 0, lpLVITEM);
AkelPad.MemCopy(lpText, (i * i + 99).toString(), 1 /*DT_UNICODE*/);
AkelPad.MemCopy(lpLVITEM + 8, 1, 3 /*DT_DWORD*/); //iSubItem
AkelPad.SendMessage(aDlg[IDLV].HWND, 4212 /*LVM_SETITEMTEXTW*/, i, lpLVITEM);
}
AkelPad.SendMessage(aDlg[IDLV].HWND, 4126 /*LVM_SETCOLUMNWIDTH*/, 0, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
AkelPad.SendMessage(aDlg[IDLV].HWND, 4126 /*LVM_SETCOLUMNWIDTH*/, 1, -2 /*LVSCW_AUTOSIZE_USEHEADER*/);
AkelPad.SendMessage(aDlg[IDLV].HWND, 4150 /*LVM_SETEXTENDEDLISTVIEWSTYLE*/, 0x20 /*LVS_EX_FULLROWSELECT*/, 0x20);
AkelPad.MemCopy(lpLVITEM + 12, 3 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/); //state
AkelPad.MemCopy(lpLVITEM + 16, 3 /*LVIS_SELECTED|LVIS_FOCUSED*/, 3 /*DT_DWORD*/); //stateMask
AkelPad.SendMessage(aDlg[IDLV].HWND, 4139 /*LVM_SETITEMSTATE*/, 7, lpLVITEM);
AkelPad.SendMessage(aDlg[IDLV].HWND, 4115 /*LVM_ENSUREVISIBLE*/, 7, false);
AkelPad.MemFree(lpText);
AkelPad.MemFree(lpLVITEM);
AkelPad.MemFree(lpLVCOLUMN);
}
function FillTV()
{
var nBufSize = 64;
var lpText = AkelPad.MemAlloc(nBufSize);
var lpTVINSERT = AkelPad.MemAlloc(_X64 ? 72 : 48 /*sizeof(TVINSERTSTRUCT)*/);
var hRoot;
var hChild;
var i, n;
AkelPad.MemCopy(lpText, "Root", 1 /*DT_UNICODE*/);
AkelPad.MemCopy(lpTVINSERT + (_X64 ? 16 : 8), 0x41 /*TVIF_CHILDREN|TVIF_TEXT*/, 3 /*DT_DWORD*/); //mask
AkelPad.MemCopy(lpTVINSERT + (_X64 ? 40 : 24), lpText, 2 /*DT_QWORD*/); //pszText
AkelPad.MemCopy(lpTVINSERT + (_X64 ? 48 : 28), nBufSize, 3 /*DT_DWORD*/); //cchTextMax
AkelPad.MemCopy(lpTVINSERT + (_X64 ? 60 : 40), 1, 3 /*DT_DWORD*/); //cChildren
hRoot = AkelPad.SendMessage(aDlg[IDTV].HWND, 4402 /*TVM_INSERTITEMW*/, 0, lpTVINSERT);
for (i = 1; i < 10; ++i)
{
AkelPad.MemCopy(lpText, "Child-" + i, 1 /*DT_UNICODE*/);
AkelPad.MemCopy(lpTVINSERT, hRoot, 2 /*DT_QWORD*/); //hParent
AkelPad.MemCopy(lpTVINSERT + (_X64 ? 8 : 4), 0xFFFF0002 /*TVI_LAST*/, 2 /*DT_QWORD*/); //hInsertAfter
AkelPad.MemCopy(lpTVINSERT + (_X64 ? 60 : 40), 1, 3 /*DT_DWORD*/); //cChildren
hChild = AkelPad.SendMessage(aDlg[IDTV].HWND, 4402 /*TVM_INSERTITEMW*/, 0, lpTVINSERT);
for (n = 1; n < 4; ++n)
{
AkelPad.MemCopy(lpText, "Child-" + i + "-" + n, 1 /*DT_UNICODE*/);
AkelPad.MemCopy(lpTVINSERT, hChild, 2 /*DT_QWORD*/); //hParent
AkelPad.MemCopy(lpTVINSERT + (_X64 ? 8 : 4), 0xFFFF0002 /*TVI_LAST*/, 2 /*DT_QWORD*/); //hInsertAfter
AkelPad.MemCopy(lpTVINSERT + (_X64 ? 60 : 40), 0, 3 /*DT_DWORD*/); //cChildren
AkelPad.SendMessage(aDlg[IDTV].HWND, 4402 /*TVM_INSERTITEMW*/, 0, lpTVINSERT);
}
}
AkelPad.SendMessage(aDlg[IDTV].HWND, 4354 /*TVM_EXPAND*/, 2 /*TVE_EXPAND*/, hRoot);
AkelPad.MemFree(lpText);
AkelPad.MemFree(lpTVINSERT);
}
function FillTC()
{
var lpText = AkelPad.MemAlloc(64);
var lpTCITEM = AkelPad.MemAlloc(_X64 ? 40 : 28 /*sizeof(TCITEM)*/);
var i;
AkelPad.MemCopy(lpTCITEM, 1 /*TCIF_TEXT*/, 3 /*DT_DWORD*/); //mask
AkelPad.MemCopy(lpTCITEM + (_X64 ? 16 : 12), lpText, 2 /*DT_QWORD*/); //pszText
for (i = 0; i <= 7; ++i)
{
AkelPad.MemCopy(lpText, "Tab " + i, 1 /*DT_UNICODE*/);
AkelPad.SendMessage(aDlg[IDTC].HWND, 4926 /*TCM_INSERTITEMW*/, i, lpTCITEM);
}
AkelPad.SendMessage(aDlg[IDTC].HWND, 4905 /*TCM_SETITEMSIZE*/, 0, MkLong(60, 20));
AkelPad.SendMessage(aDlg[IDTC].HWND, 4876 /*TCM_SETCURSEL*/, 1, 0);
AkelPad.MemFree(lpText);
AkelPad.MemFree(lpTCITEM);
}
function SetPartsSBAR()
{
var lpParts = AkelPad.MemAlloc(3 * 4 /*sizeof(int)*/);
AkelPad.MemCopy(lpParts, Scale.X(80), 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpParts + 4, Scale.X(160), 3 /*DT_DWORD*/);
AkelPad.MemCopy(lpParts + 8, -1, 3 /*DT_DWORD*/);
AkelPad.SendMessage(aDlg[IDSBAR].HWND, 1028 /*SB_SETPARTS*/, 3, lpParts);
AkelPad.SendMessage(aDlg[IDSBAR].HWND, 5 /*WM_SIZE*/, 0, 0);
AkelPad.MemFree(lpParts);
}
function SetTextSBAR(nProgress)
{
AkelPad.SendMessage(aDlg[IDSBAR].HWND, 1035 /*SB_SETTEXTW*/, 0, "\tStatusBar");
AkelPad.SendMessage(aDlg[IDSBAR].HWND, 1035 /*SB_SETTEXTW*/, 1, "Progress: " + nProgress + "%");
AkelPad.SendMessage(aDlg[IDSBAR].HWND, 1035 /*SB_SETTEXTW*/, 2, "\t\t" + (new Date()).toLocaleString());
}
}
function LoWord(nDwNum)
{
return nDwNum & 0xFFFF;
}
function MkLong(nLoWord, nHiWord)
{
return (nLoWord & 0xFFFF) | (nHiWord << 16);
}
function Shift()
{
return Boolean(oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000);
}
function CreateMainMenu()
{
var MF_STRING = 0x0000;
var MF_POPUP = 0x0010;
var hMenu = oSys.Call("User32::CreateMenu");
var hMenu1 = oSys.Call("User32::CreatePopupMenu");
var hMenu2 = oSys.Call("User32::CreatePopupMenu");
var i;
oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu1, "&New");
oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu2, "&Other");
oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, IDCANCEL, "E&xit");
oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, IDMENU11, "&1 - Dialog window modal");
oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, IDMENU12, "&2 - Dialog window modeless");
oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, IDMENU13, "&3 - Dialog box modal");
oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING, IDMENU14, "&4 - Dialog box modeless");
for (i = IDMENU21; i <= IDMENU24; ++i)
oSys.Call("User32::AppendMenuW", hMenu2, MF_STRING, i, "Command " + i);
return hMenu;
}
-
Offline
- Posts: 1949
- Joined: Sat Mar 06, 2010 7:40 pm
- Location: Poland
Restart AkelPad without using additional tools.
The similar script: restart.js written by Infocatcher.
The similar script: restart.js written by Infocatcher.
Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=24839#p24839
// Version: 2014-05-25
// Author: KDJ
//
// *** AkelPad restart without additional tools ***
//
// Usage:
// Call("Scripts::Main", 1, "AkelPadRestart.js")
if (typeof AkelPad == "object")
{
if (WScript.Arguments.length != 2)
CloseAkelPad();
else
OpenFiles(WScript.Arguments(0), parseInt(WScript.Arguments(1)));
}
else if (WScript.Arguments.length == 4)
RunAkelPad(WScript.Arguments(0), WScript.Arguments(1), parseInt(WScript.Arguments(2)), parseInt(WScript.Arguments(3)));
function CloseAkelPad()
{
var oFSO = new ActiveXObject("Scripting.FileSystemObject");
var sWinDir = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings("%WinDir%");
var sWscriptExe = sWinDir + "\\Sysnative\\wscript.exe";
var hMainWnd = AkelPad.GetMainWnd();
var nMDI = AkelPad.IsMDI();
var nPID = AkelPad.SystemFunction().Call("Kernel32::GetCurrentProcessId");
var MAX_PATH = 260;
var lpBuffer = AkelPad.MemAlloc(MAX_PATH * _TSIZE);
var sAkelExe;
var nTabs;
var i;
GetLangStrings();
//on Win7 x64 no file %WinDir%\SysWOW64\qprocess.exe, therefore if AkelPd is 32bit, we run wscript.exe x64
if (! oFSO.FileExists(sWscriptExe))
sWscriptExe = sWinDir + "\\System32\\wscript.exe";
AkelPad.SystemFunction().Call("Kernel32::GetModuleFileName" + _TCHAR, 0, lpBuffer, MAX_PATH);
sAkelExe = AkelPad.MemRead(lpBuffer, _TSTR)
AkelPad.MemFree(lpBuffer);
if (AkelPad.GetEditModified(0) || AkelPad.SendMessage(hMainWnd, 1291 /*AKD_FRAMESTATS*/, 1 /*FWS_COUNTMODIFIED*/, 0))
{
switch (AkelPad.MessageBox(hMainWnd, sTxtSaveAll, WScript.ScriptBaseName, 0x23 /*MB_ICONQUESTION|MB_YESNOCANCEL*/))
{
case 6 /*IDYES*/:
if (! AkelPad.Command(nMDI ? 4110 /*IDM_FILE_SAVEALL*/ : 4105 /*IDM_FILE_SAVE*/)) return;
break;
case 7 /*IDNO*/:
if (nMDI)
{
nTabs = AkelPad.SendMessage(hMainWnd, 1291 /*AKD_FRAMESTATS*/, 0 /*FWS_COUNTALL*/, 0);
for (i = 0; i < nTabs; ++i)
AkelPad.SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 2 /*FI_WNDEDIT*/, AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 8 /*FWF_BYTABINDEX*/, i)), 0);
}
else
AkelPad.SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, 0, 0);
break;
case 2 /*IDCANCEL*/:
return;
}
}
if (nMDI)
{
if (oFSO.FileExists(AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\Sessions.dll"))
{
AkelPad.Call("Sessions::Main", 2, "OnExit");
if (AkelPad.IsPluginRunning("Sessions::Main"))
AkelPad.Call("Sessions::Main", 10); //stop plugin
}
else if (AkelPad.SendMessage(hMainWnd, 1291 /*AKD_FRAMESTATS*/, 0 /*FWS_COUNTALL*/, 0) > 1)
AkelPad.MessageBox(hMainWnd, sTxtToRestore, WScript.ScriptBaseName, 0x30 /*MB_ICONWARNING*/);
}
if (AkelPad.IsPluginRunning("Exit::Main"))
AkelPad.Call("Exit::Main"); //stop plugin
AkelPad.Exec('"' + sWscriptExe + '" "' + WScript.ScriptFullName + '" "' + sAkelExe + '" "' + AkelPad.GetEditFile(0) + '" ' + nMDI + ' ' + nPID);
AkelPad.Command(4109 /*IDM_FILE_EXIT*/);
}
function RunAkelPad(sAkelExe, sEditFile, nMDI, nPID)
{
var oWshShell = new ActiveXObject("WScript.Shell");
while (! oWshShell.Run('qprocess.exe ' + nPID, 0 /*hide cmd window*/, 1 /*return errorlevel*/))
WScript.Sleep(20);
oWshShell.Run('"' + sAkelExe + '" /Call("Scripts::Main",1,"' + WScript.ScriptName + '",`"' + sEditFile + '" ' + nMDI + '`)');
}
function OpenFiles(sEditFile, nMDI)
{
if (nMDI && AkelPad.IsMDI() && (new ActiveXObject("Scripting.FileSystemObject").FileExists(AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\Sessions.dll")))
AkelPad.Call("Sessions::Main", 1, "OnExit");
else if (sEditFile)
AkelPad.OpenFile(sEditFile, 0x002 /*OD_ADT_REG_CODEPAGE*/);
}
function GetLangStrings()
{
if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1045 /*Polish*/)
{
sTxtSaveAll = "Czy zapisać wszystkie zmienione dokumenty przed restartem?";
sTxtToRestore = "Żeby przywrócić wszystkie karty po restarcie, pownieneś zainstalować wtyczkę Sessions.";
}
// else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/)
// {
// }
else
{
sTxtSaveAll = "Save all modified documents before restart?";
sTxtToRestore = "To restore all tabs after restart, you should install Sessions plugin.";
}
}
Last edited by KDJ on Sat Dec 20, 2014 6:29 pm, edited 1 time in total.
-
Offline
- Posts: 1949
- Joined: Sat Mar 06, 2010 7:40 pm
- Location: Poland
Preview of AkelPad docs files (...\AkelPad\AkelFiles\Docs\) - part 2.
Part 1 is here: AkelPadDocsView.js
Part 1 is here: AkelPadDocsView.js
Code: Select all
function IsScriptRunning()
{
var hDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0);
if (hDlg)
{
SetForegroundWindow(hDlg);
return true;
}
}
function ReadIni()
{
var i;
try
{
eval(AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, true));
}
catch (oError)
{}
aDlg.W = Math.max(aDlg.W, aDlg.MinW);
aDlg.H = Math.max(aDlg.H, aDlg.MinH);
if (! (aAESel instanceof Array))
aAESel = [{}, {}];
if (! (aFT instanceof Array))
aFT = [];
if (! (aDocOwn instanceof Array))
aDocOwn = [];
for (i = aDocOwn.length - 1; i >= 0; --i)
{
if ((! (aDocOwn[i] instanceof Array)) || (aDocOwn[i].length < 2) || (typeof aDocOwn[i][0] != "string") || (typeof aDocOwn[i][1] != "string"))
aDocOwn.splice(i, 1);
}
if (! aDocOwn.length)
{
for (i = 0; i < aDocStd.length; ++i)
aDocOwn[i] = [aDocStd[i][0], aDocStd[i][1]];
}
}
function WriteIni()
{
var oRW = {};
var oRC = {};
var sText;
var i;
GetWindowPos(aDlg.HWND, oRW);
GetWindowPos(aDlg.HWND, oRC, 1);
sText =
'aDlg.X=' + Scale.UX(aDlg.X) + ';\r\n' +
'aDlg.Y=' + Scale.UY(aDlg.Y) + ';\r\n' +
'aDlg.W=' + (Scale.UX(aDlg.W - (oRW.W - oRC.W)) + (oRW.W - oRC.W)) + ';\r\n' +
'aDlg.H=' + (Scale.UY(aDlg.H - (oRW.H - oRC.H)) + (oRW.H - oRC.H)) + ';\r\n' +
'aDlg.Maxim=' + oSys.Call("User32::IsZoomed", aDlg.HWND) + ';\r\n' +
'bCaseFT=' + bCaseFT + ';\r\n' +
'bAllDocFT=' + bAllDocFT + ';\r\n' +
'nDirectFT=' + nDirectFT + ';\r\n' +
'bWordWrap=' + bWordWrap + ';\r\n' +
'bSeparateWnd=' + bSeparateWnd + ';\r\n' +
'nLang=' + nLang + ';\r\n' +
'nAPDSel=' + nAPDSel + ';\r\n' +
'sAPDSel="' + aAPD[nAPDSel][0] + '";\r\n' +
'aAESel=[';
for (i = 0; i < aAESel.length; ++i)
{
sText += '{';
for (n in aAESel[i])
sText += '"' + n + '":[' + aAESel[i][n] + '],';
if (sText.slice(-1) == ',')
sText = sText.slice(0, -1);
sText += '}' + (i < aAESel.length - 1 ? ',' : '');
}
sText += '];\r\naFT=[';
for (i = 0; i < aFT.length; ++i)
sText += '"' + EscapeStr(aFT[i]) + '"' + (i < aFT.length - 1 ? ',' : '');
sText += '];\r\n\r\n//you can edit array of documents:\r\naDocOwn=[\r\n';
for (i = 0; i < aDocOwn.length; ++i)
sText += '["' + aDocOwn[i][0] + '","' + aDocOwn[i][1] + '"]' + (i < aDocOwn.length - 1 ? ',' : '') + '\r\n';
sText += '];\r\n';
AkelPad.WriteFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), sText, sText.length, 1200 /*UTF-16LE*/, true);
}
function EscapeStr(sText)
{
return sText.replace(/[\\"]/g, '\\$&').replace(/\n/g, '\\n').replace(/\r/g, '\\r');
}
function GetLangStrings()
{
if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/)
{
//translated by Andrey_A_A
sTxtDlgTitle = "Просмотр документации AkelPad";
sTxtDocument = "Документ";
sTxtEnglish = "&Английский";
sTxtRussian = "&Русский";
sTxtMenu = "&Меню";
sTxtClose = "Закрыть";
sTxtFindInHtm = "Поиск в документе htm";
sTxtFindInTxt = "Поиск в документах *.txt";
sTxtWrapLines = "Перенос строк в документах *.txt";
sTxtSeparateWnd = "Запускать в отдельном окне";
sTxtOpenClose = "Открыть/Закрыть файл в AkelPad";
sTxtFileName = "Имя файла:";
sTxtFileNamePath = "Полный путь файла:";
sTxtCopyToCB = "Копировать";
sTxtInsertToAP = "Вставить в AkelPad";
sTxtSelectAll = "Выделить всё";
sTxtWhat = "&Что:";
sTxtMatchCase = "&Регистр";
sTxtAllDocs = "&Во всех";
sTxtDirection = "Направление";
sTxtBeginning = "&С начала";
sTxtDown = "&Вниз";
sTxtUp = "&Вверх";
sTxtEnd = "&C конца";
sTxtFindNext = "&Найти далее";
sTxtCancel = "Отмена";
sTxtFind = "Поиск...";
sTxtFindNextDn = "Найти далее вниз";
sTxtFindNextUp = "Найти далее ввех";
sTxtNotFound = "Не найдено.";
sTxtNoFilesInDir = "В каталоге нет файлов:";
sTxtChooseDir = "Выберите каталог с документацией AkelPad:";
sTxtNoFile = "Файл не существует.";
sTxtNoIE = "Нет в наличии Internet Explorer.";
sTxtNoCallback = "Невозможно зарегистрировать функцию обратного вызова.";
sTxtErrMessage = "Сообщение об ошибке: ";
sTxtErrNumber = "Номер ошибки: ";
}
else
{
sTxtDlgTitle = "AkelPad documents view";
sTxtDocument = "Document";
sTxtEnglish = "&English";
sTxtRussian = "&Russian";
sTxtMenu = "&Menu";
sTxtClose = "Close";
sTxtFindInHtm = "Find in htm document";
sTxtFindInTxt = "Find in *.txt documents";
sTxtWrapLines = "Wrap lines in *.txt documents";
sTxtSeparateWnd = "Run in separate window";
sTxtOpenClose = "Open/close file in AkelPad";
sTxtFileName = "File name:";
sTxtFileNamePath = "Full file name with path:";
sTxtCopyToCB = "Copy to clipboard";
sTxtInsertToAP = "Insert to AkelPad";
sTxtSelectAll = "Select all";
sTxtWhat = "&What:";
sTxtMatchCase = "&Match case";
sTxtAllDocs = "&All documents";
sTxtDirection = "Direction";
sTxtBeginning = "&Beginning";
sTxtDown = "&Down";
sTxtUp = "&up";
sTxtEnd = "&End";
sTxtFindNext = "&Find next";
sTxtCancel = "Cancel";
sTxtFind = "Find...";
sTxtFindNextDn = "Find next down";
sTxtFindNextUp = "Find next up";
sTxtNotFound = "Not found.";
sTxtNoFilesInDir = "Files not found in directory:";
sTxtChooseDir = "Choose directory with AkelPad documentation:";
sTxtNoFile = "File does not exists.";
sTxtNoIE = "Internet Explorer is not available.";
sTxtNoCallback = "Unable to register callback function.";
sTxtErrMessage = "Error message: ";
sTxtErrNumber = "Error number: ";
}
}
Last edited by KDJ on Sun Jun 05, 2016 3:23 pm, edited 20 times in total.
-
Offline
- Posts: 1250
- Joined: Thu Nov 16, 2006 11:53 am
- Location: Kyiv, Ukraine
Немного обновлённый скрипт для гурманов
Code: Select all
// Usage:
// Call("Scripts::Main", 1, "ZipCurrentFile.js")
// Call("Scripts::Main", 1, "ZipCurrentFile.js", "-OutDir=%TEMP%")
// Call("Scripts::Main", 1, "ZipCurrentFile.js", '-OutDir="C:\\Program Files"');
var sOutDir = AkelPad.GetArgValue("OutDir", "");
var isFileSaved = false;
var sCurrentFilePath = AkelPad.GetEditFile(0);
if (sCurrentFilePath)
{
if (!AkelPad.GetEditModified(0))
isFileSaved = true;
}
if (!isFileSaved)
{
WScript.Echo("File is not saved. Please save the file first!");
WScript.Quit();
}
var sZipFilePath = getZipFilePath(sCurrentFilePath);
if (!zip_create(sZipFilePath))
{
WScript.Echo("Failed to create the archive :(");
WScript.Quit();
}
if (!zip_add_file(sZipFilePath, sCurrentFilePath))
{
WScript.Echo("Failed to add the file to the archive :(");
WScript.Quit();
}
WScript.Echo("Archive created!\n" + sZipFilePath);
function getZipFilePath(sCurrentFilePath)
{
var sZipFileDir;
if (sOutDir != "")
{
var oWScript = new ActiveXObject("WScript.Shell");
var oFileSystem = new ActiveXObject("Scripting.FileSystemObject");
sZipFileDir = oWScript.ExpandEnvironmentStrings(sOutDir);
if (!oFileSystem.FolderExists(sZipFileDir))
{
WScript.Echo("Directory does not exist: " + sZipFileDir);
WScript.Quit();
}
}
else
{
sZipFileDir = getFileDir(sCurrentFilePath);
}
var sZipFileName = getFileName(sCurrentFilePath);
var s = sZipFileDir + "\\" + sZipFileName + ".zip";
return s;
}
function zip_create(sZipFilePath)
{
var isOK = false;
// Creating an empty .zip archive
try
{
var oFileSystem = new ActiveXObject("Scripting.FileSystemObject");
var oZipFile = oFileSystem.OpenTextFile(sZipFilePath, 2, true);
var data = String.fromCharCode(80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
oZipFile.Write(data);
oZipFile.Close();
isOK = true;
}
catch (err)
{
// ...
}
return isOK;
}
function zip_add_file(sZipFilePath, sFilePath)
{
var isOK = false;
// Packing the data
try
{
var oShell = new ActiveXObject("Shell.Application");
var oDstFolder = oShell.NameSpace(sZipFilePath);
oDstFolder.CopyHere(sFilePath, 16);
//WScript.Sleep(1000);
isOK = true;
}
catch (err)
{
// ...
}
return isOK;
}
function zip_add_folder(sZipFilePath, sFolderPath)
{
var isOK = false;
// Packing the data
try
{
var oShell = new ActiveXObject("Shell.Application");
var oDstFolder = oShell.NameSpace(sZipFilePath);
var oSrcFolder = oShell.NameSpace(sFolderPath);
var oFolderItems = oSrcFolder.Items();
oDstFolder.CopyHere(oFolderItems.Item(), 16);
//WScript.Sleep(1000);
isOK = true;
}
catch (err)
{
// ...
}
return isOK;
}
function getFileExt(filePathName) // file extension w/o leading '.'
{
var n = filePathName.lastIndexOf(".");
return (n >= 0) ? filePathName.substr(n + 1) : "";
}
function getFileName(filePathName) // file name w/o extension
{
var n2 = filePathName.lastIndexOf(".");
var n1 = filePathName.lastIndexOf("\\");
var nn = filePathName.lastIndexOf("/");
if (nn > n1) n1 = nn;
var s = "";
if (n1 < 0 && n2 < 0)
s = filePathName;
else if (n1 < 0)
s = filePathName.substr(0, n2);
else if (n2 < 0)
s = filePathName.substr(n1 + 1);
else if (n2 > n1)
s = filePathName.substr(n1 + 1, n2 - n1 - 1);
return s;
}
function getFileDir(filePathName) // file directory w/o trailing '\'
{
var n = filePathName.lastIndexOf("\\");
var nn = filePathName.lastIndexOf("/");
if (nn > n) n = nn;
return (n >= 0) ? filePathName.substr(0, n) : filePathName;
}
-
Offline
- Posts: 1949
- Joined: Sat Mar 06, 2010 7:40 pm
- Location: Poland
Set font in AkelPad tabs (MDI/PMDI).
Required to include: ChooseFont_function.js
Download all: KDJ.zip
Required to include: ChooseFont_function.js
Download all: KDJ.zip
Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=25572#p25572
// Version: 2016-07-07
// Author: KDJ
//
// *** Set font in AkelPad tabs (MDI/PMDI) ***
//
// Required to include: ChooseFont_function.js
//
// Usage:
// Call("Scripts::Main", 1, "TabFont.js", `"sFont" nStyle nSize`)
//
// Arguments:
// "sFont":
// Font face name, for example "Courier New", if "" - unchanged
// Or it may be (in this case, arguments nStyle and nSize are ignored):
// "0" - default GUI font
// "1" - system font
// "2" - AkelPad edit font
// "8" - font that was previously set by this script (saved in TabFont.ini)
// "9" - "Choose Font" dialog box
// "+" - increase font size
// "-" - decrease font size
// nStyle:
// 0 - unchanged
// 1 - normal
// 2 - bold
// 3 - italic
// 4 - bold italic
// nSize:
// Font size in points, if 0 - unchanged
//
// Examples:
// Call("Scripts::Main", 1, "TabFont.js") - without arguments, switching between three fonts: default GUI font, system font, AkelPad font
// Call("Scripts::Main", 1, "TabFont.js", `"2"`) - AkelPad font
// Call("Scripts::Main", 1, "TabFont.js", `"Courier New" 3 12`) - Courier New, italic, 12 pt
//
// Remark:
// In MDI mode, the height of tabs is adjusted to the height of characters (doesn't work in PMDI mode).
//
// For autostart, in AkelPad.ini or registry CmdLineBegin/CmdLineEnd key, need to add eg:
// /Call("Scripts::Main", 1, "TabFont.js", `"8"`)
if ((! AkelPad.IsMDI()) || (! (AkelPad.Include("ChooseFont_function.js"))))
WScript.Quit();
var oSys = AkelPad.SystemFunction();
var hMainWnd = AkelPad.GetMainWnd();
var hWndTab = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 13 /*MI_WNDTAB*/, 0);
var hFontGUI = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var hFontSYS = oSys.Call("Gdi32::GetStockObject", 13 /*SYSTEM_FONT*/);
var hFontAP = AkelPad.SendMessage(hMainWnd, 1231 /*AKD_GETFONT*/, 0, 0);
var hFontTabCur = AkelPad.SendMessage(hWndTab, 49 /*WM_GETFONT*/, 0, 0);
var hFontTabNew;
var nTabOpt;
var lpSize;
var hDC;
var nNewH;
var nDiffH;
var hWndMDI;
var oRectTab;
var oRectMDI;
if (WScript.Arguments.length)
{
if (WScript.Arguments(0) == "0")
hFontTabNew = hFontGUI;
else if (WScript.Arguments(0) == "1")
hFontTabNew = hFontSYS;
else if (WScript.Arguments(0) == "2")
hFontTabNew = ConvertFontFormat(hFontAP, 2, 2);
else if (WScript.Arguments(0) == "8")
hFontTabNew = GetPrevFont();
else if (WScript.Arguments(0) == "9")
hFontTabNew = ChooseFont(hMainWnd, 2, hFontTabCur, 0, 0, 2, WScript.ScriptBaseName);
else if (WScript.Arguments(0) == "+")
hFontTabNew = ResizeFont(hFontTabCur, 1);
else if (WScript.Arguments(0) == "-")
hFontTabNew = ResizeFont(hFontTabCur, -1);
else if (WScript.Arguments.length > 2)
hFontTabNew = GetFontFromArgumets(WScript.Arguments(0), parseInt(WScript.Arguments(1), 10), parseInt(WScript.Arguments(2), 10), hFontTabCur);
}
else
{
if (hFontTabCur == hFontGUI)
hFontTabNew = hFontSYS;
else if (hFontTabCur == hFontSYS)
hFontTabNew = ConvertFontFormat(hFontAP, 2, 2);
else
hFontTabNew = hFontGUI;
}
if (hFontTabNew)
{
oSys.Call("Gdi32::DeleteObject", hFontTabCur);
AkelPad.SendMessage(hWndTab, 48 /*WM_SETFONT*/, hFontTabNew, true);
if ((AkelPad.IsMDI() == 1 /*WMD_MDI*/) && (! ((nTabOpt = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0)) & 0x1 /*TAB_VIEW_NONE*/)))
{
lpSize = AkelPad.MemAlloc(8); //SIZE
hDC = oSys.Call("User32::GetDC", hWndTab);
oSys.Call("Gdi32::SelectObject", hDC, hFontTabNew);
oSys.Call("Gdi32::SetMapMode", hDC, 1 /*MM_TEXT*/);
oSys.Call("Gdi32::GetTextExtentPoint32W", hDC, "", 1, lpSize);
nNewH = Math.ceil(AkelPad.MemRead(_PtrAdd(lpSize, 4), 3 /*DT_DWORD*/) * 1.5);
oSys.Call("User32::ReleaseDC", hWndTab, hDC);
AkelPad.MemFree(lpSize);
if (nDiffH = nNewH - HiWord(AkelPad.SendMessage(hWndTab, 4905 /*TCM_SETITEMSIZE*/, 0, MakeLong(0, nNewH))))
{
hWndMDI = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 12 /*MI_WNDMDICLIENT*/, 0);
oRectTab = {};
oRectMDI = {};
GetWindowPos(hWndTab, oRectTab);
GetWindowPos(hWndMDI, oRectMDI);
if (nTabOpt & 0x2 /*TAB_VIEW_TOP*/)
{
oSys.Call("User32::SetWindowPos", hWndTab, 0, 0, 0, oRectTab.W, oRectTab.H + nDiffH, 0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/);
oSys.Call("User32::SetWindowPos", hWndMDI, 0, oRectMDI.X, oRectMDI.Y + nDiffH, oRectMDI.W, oRectMDI.H - nDiffH, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
}
else
{
oSys.Call("User32::SetWindowPos", hWndTab, 0, oRectTab.X, oRectTab.Y - nDiffH, oRectTab.W, oRectTab.H + nDiffH, 0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
oSys.Call("User32::SetWindowPos", hWndMDI, 0, 0, 0, oRectMDI.W, oRectMDI.H - nDiffH, 0x16 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE*/);
}
}
}
WriteIni();
}
function HiWord(nDwNum)
{
return (nDwNum >> 16) & 0xFFFF;
}
function MakeLong(nLoWord, nHiWord)
{
return (nLoWord & 0xFFFF) | (nHiWord << 16);
}
function GetWindowPos(hWnd, oRect)
{
var lpRect = AkelPad.MemAlloc(16); //RECT
oSys.Call("User32::GetWindowRect", hWnd, lpRect);
oSys.Call("User32::ScreenToClient", hMainWnd, _PtrAdd(lpRect, 0));
oSys.Call("User32::ScreenToClient", hMainWnd, _PtrAdd(lpRect, 8));
oRect.X = AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/);
oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/);
oRect.W = AkelPad.MemRead(_PtrAdd(lpRect, 8), 3 /*DT_DWORD*/) - oRect.X;
oRect.H = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/) - oRect.Y;
AkelPad.MemFree(lpRect);
}
function ResizeFont(hFont, nIncrease)
{
var aFont = ConvertFontFormat(hFont, 2, 3);
aFont[2] = Math.abs(aFont[2]) + nIncrease;
if (((nIncrease > 0) && (aFont[2] < 37)) || ((nIncrease < 0) && (aFont[2] > 0)))
return ConvertFontFormat(aFont, 3, 2);
}
function GetFontFromArgumets(sFont, nStyle, nSize, hFontCur)
{
var aFontCur = ConvertFontFormat(hFontCur, 2, 3);
if (! sFont)
sFont = aFontCur[0];
if ((! nStyle) || (nStyle < 1) || (nStyle > 4))
nStyle = aFontCur[1];
if (! nSize)
nSize = aFontCur[2];
return ConvertFontFormat([sFont, nStyle, nSize], 3, 2);
}
function GetPrevFont()
{
var aFontTab;
try
{
eval(AkelPad.ReadFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, true));
}
catch (oError)
{}
if (! aFontTab)
aFontTab = ["0", 0, 0];
if (aFontTab[0] == "0")
return hFontGUI;
else if (aFontTab[0] == "1")
return hFontSYS;
else
return ConvertFontFormat(aFontTab, 3, 2);
}
function WriteIni()
{
var aFontTab;
var sIniTxt;
if (hFontTabNew == hFontGUI)
aFontTab = ["0", 0, 0];
else if (hFontTabNew == hFontSYS)
aFontTab = ["1", 0, 0];
else
aFontTab = ConvertFontFormat(hFontTabNew, 2, 3);
sIniTxt = 'aFontTab=["' + aFontTab[0] + '",' + aFontTab[1] + ',' + aFontTab[2] + '];';
AkelPad.WriteFile(WScript.ScriptFullName.replace(/\.js$/i, ".ini"), sIniTxt, sIniTxt.length, 1200 /*UTF-16LE*/, true);
}
Last edited by KDJ on Thu Jul 07, 2016 7:44 pm, edited 2 times in total.
-
Offline
- Site Admin
- Posts: 6311
- Joined: Thu Jul 06, 2006 7:20 am
Post by Instructor »
Change printing paper orientation.
Code: Select all
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=25685#p25685
// Version: 1.1
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Change printing paper orientation.
// Description(1049): Изменить ориентацию бумаги для печати.
//
// Arguments:
// -Orientation=1 -Paper orientation (one of the following):
// 1 portrait.
// 2 landscape.
// -Print=1 -Print current document (one of the following):
// 0 don't print (default).
// 1 print with dialog.
// 2 silent print.
// Usage:
// Call("Scripts::Main", 1, "PrintOrientation.js", `-Orientation=2 -Print=2`)
//Arguments
var nOrientation=AkelPad.GetArgValue("Orientation", 0);
var nPrint=AkelPad.GetArgValue("Print", 0);
if (SetPaperOrientation(nOrientation))
{
//Print with dialog
if (nPrint == 1)
AkelPad.Command(4108 /*IDM_FILE_PRINT*/);
//Silent print
else if (nPrint == 2)
AkelPad.Command(4113 /*IDM_FILE_SILENTPRINT*/);
}
function SetPaperOrientation(nOrientation)
{
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var lpPrintInfo;
var lpDevMode;
var hDevMode;
var hDC;
var bResult=false;
if (nOrientation == 1 /*DMORIENT_PORTRAIT*/ ||
nOrientation == 2 /*DMORIENT_LANDSCAPE*/)
{
if (lpPrintInfo=AkelPad.MemAlloc(_X64?56:44 /*sizeof(PRINTINFO)*/))
{
if (AkelPad.SendMessage(hMainWnd, 1215 /*AKD_GETPRINTINFO*/, lpPrintInfo, true))
{
if (hDevMode=AkelPad.MemRead(_PtrAdd(lpPrintInfo, 0) /*offsetof(PRINTINFO, hDevMode)*/, 2 /*DT_QWORD*/))
{
//Set orientation
if (lpDevMode=oSys.Call("kernel32::GlobalLock", hDevMode))
{
AkelPad.MemCopy(_PtrAdd(lpDevMode, _TSTR?76:44) /*offsetof(DEVMODE, dmOrientation)*/, nOrientation, 4 /*DT_WORD*/);
bResult=true;
oSys.Call("kernel32::GlobalUnlock", hDevMode);
}
//Free printer DC
if (hDC=AkelPad.MemRead(_PtrAdd(lpPrintInfo, _X64?16:8) /*offsetof(PRINTINFO, hDC)*/, 2 /*DT_QWORD*/))
{
oSys.Call("gdi32::DeleteDC", hDC);
AkelPad.MemCopy(_PtrAdd(lpPrintInfo, _X64?16:8) /*offsetof(PRINTINFO, hDC)*/, 0, 2 /*DT_QWORD*/);
}
//Copy information
AkelPad.SendMessage(hMainWnd, 1216 /*AKD_SETPRINTINFO*/, lpPrintInfo, 0);
}
}
AkelPad.MemFree(lpPrintInfo);
}
}
return bResult;
}
Last edited by Instructor on Sat Apr 18, 2015 4:17 am, edited 2 times in total.