Code: Select all
// AutohideTab.js ver.1.4 alfa 2012-06-23
// Скрывает панель вкладок если вкладка лишь одна. Открывает файл в текущей вкладке если удержана клавиша Alt. (резидентный)
// Запуск: Call("Scripts::Main", 1, "AutohideTab.js"[, "s[ p]"])
// Повторный вызов закрывает скрипт.
// s - маска установок, целое от 0 до 15, по умолчанию 0:
// b0001 (1) - открывать файлы в текущей вкладке по умолчанию, а если удержана Alt - в новой.
// b0010 (2) - не возвращать состояние строки вкладок при выходе из программы.
// b0100 (4) - если строка вкладок отсутствует в момент запуска скрипта, то показывать ее внизу.
// b1000 (8) - принудительно включать строку вкладок при выходе из программы.
// p - время задержки открытия файла в миллисекундах, по умолчанию 0:
// Cкрипт проверяет на удержание так же левую клавишу мыши, это удобно при drag`n`drop,
// но чтобы вы успели ее нажать после отпускания файла в окно Akelpad, нужна пауза
// до начала открытия файла. Открытие всех файлов начнет чуть притормаживать.
// Если заинтересовало, попробуйте 150 для начала. С учетом тормознутости интерпретатора мне и 100 хватает.
// Например: Call("Scripts::Main", 1, "AutohideTab.js", "3 100")
// Конечно, было бы удобней, если б сам Akelpad умел при перетаскивании левой кнопкой мыши
// открывать в новой вкладке, а при претаскивании правой кнопкой мыши открывать в текущей вкладке.
// И умел менять местами эти функции на кнопках мыши.
// Автозапуск(в AkelPad.ini или реестре):
// Добавить в строку "CmdLineBegin" следующее: /Call("Scripts::Main", 1, "AutohideTab.js"[, "s[ p]"])
// Переназначить клавишу можно в переменной aKeyCode:
// 10h SHIFT VK_SHIFT
// 11h CTRL VK_CONTROL
// 12h ALT VK_MENU
// A0h Left SHIFT VK_LSHIFT
// A1h Right SHIFT VK_RSHIFT
// A2h Left CTRL VK_LCONTROL
// A3h Right CTRL VK_RCONTROL
// A4h Left ALT VK_LMENU
// A5h Right ALT VK_RMENU
// Переназначить мышь можно в переменной aMouseCode:
// 01h LKM VK_LBUTTON
// 02h PKM VK_RBUTTON
var aKeyCode = 18; //VK_MENU
var aMouseCode = 1; //VK_LBUTTON
var hMainWnd = AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hModuleDll = AkelPad.GetInstanceDll();
var pDock = 0;
var hDockWnd = 0;
var DOCKCLASSNAME = "WNDCLS_"+WScript.ScriptBaseName;
var _SIDE = 0;
var lpInitFrame;
var lpFrame;
var i;
var QuitMutext = false;
var aKey;
var aMB;
var dock = FindWindowEx(hMainWnd,DOCKCLASSNAME);
if(dock)
AkelPad.SendMessage(dock, 16 /*WM_CLOSE*/, 0, 0);
else
{
var sopts = 0;
var odPause = 0;
if(WScript.Arguments.length > 0)
sopts = WScript.Arguments(0);
if(WScript.Arguments.length > 1)
odPause = WScript.Arguments(1);
var pos = 0;
var tState = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
if ( (tState & 4) || ((sopts & 4)&&(tState & 1)) )
pos = 1;
tabHide(0);
var res = AkelPad.WindowRegisterClass(DOCKCLASSNAME);
if(CreateDock())
{
AkelPad.SendMessage(hMainWnd, 1278 /*AKD_DOCK*/, 0x00000100/*DK_HIDE*/, pDock);
if(AkelPad.WindowSubClass(hMainWnd, AkelPadCallBack, 1078 /*AKDN_OPENDOCUMENT_FINISH*/,1077 /*AKDN_OPENDOCUMENT_START*/, 1046 /*AKDN_FRAME_ACTIVATE*/, 1030 /*AKDN_MAIN_ONFINISH*/, 1048 /*AKDN_FRAME_DESTROY*/))
{
AkelPad.ScriptNoMutex();
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(hMainWnd);
}
if(hDockWnd != 0)
{
AkelPad.SendMessage(hDockWnd, 16 /*WM_CLOSE*/, 0, 0);
hDockWnd = 0;
}
}
AkelPad.WindowUnregisterClass(DOCKCLASSNAME);
oSys.Call("user32::SetFocus",hMainWnd);
if ((sopts & 8))
{
if (pos == 1)
AkelPad.Command(4302 /*IDM_WINDOW_TABVIEW_BOTTOM*/);
else
AkelPad.Command(4301 /*IDM_WINDOW_TABVIEW_TOP*/);
}
else if (!(sopts & 2))
{
if (tState&1)
AkelPad.Command(4303 /*IDM_WINDOW_TABVIEW_NONE*/);
else if (tState&4)
AkelPad.Command(4302 /*IDM_WINDOW_TABVIEW_BOTTOM*/);
else
AkelPad.Command(4301 /*IDM_WINDOW_TABVIEW_TOP*/);
}
QuitMutext = true;
}
function tabHide(set)
{
lpInitFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
lpFrame=lpInitFrame;
for (i=0; lpFrame; ++i)
{
lpFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 3 /*FWF_PREV*/, lpFrame);
if (lpFrame == lpInitFrame) break;
}
if (i > set)
{
if (pos == 1)
AkelPad.Command(4302 /*IDM_WINDOW_TABVIEW_BOTTOM*/);
else
AkelPad.Command(4301 /*IDM_WINDOW_TABVIEW_TOP*/);
}
else
AkelPad.Command(4303 /*IDM_WINDOW_TABVIEW_NONE*/);
}
function FindWindowEx(hwndParent,lpszClassName)
{
var memclass =0;
var t = "" + lpszClassName;
memclass = AkelPad.MemAlloc((t.length+1)*_TSIZE);
AkelPad.MemCopy(memclass, t, _TSTR);
var hwnd = oSys.Call("user32::FindWindowEx"+_TCHAR, hwndParent,0,memclass,0);
AkelPad.MemFree(memclass);
return hwnd;
}
function CreateWindowEx(styleex,_class,title,style,x,y,cx,cy,parent,menu,lparam)
{
var mem_class = AkelPad.MemAlloc((_class.length+1)*_TSIZE);
AkelPad.MemCopy(mem_class, _class, _TSTR);
var mem_title = AkelPad.MemAlloc((title.length+1)*_TSIZE);
AkelPad.MemCopy(mem_title, title, _TSTR);
var hwnd = oSys.Call("user32::CreateWindowEx" + _TCHAR, styleex, mem_class, mem_title, style, x,y,cx,cy, parent, menu, hModuleDll, lparam);
AkelPad.MemFree(mem_class);
AkelPad.MemFree(mem_title);
return hwnd;
}
function CreateDock()
{
var tpDock = AkelPad.MemAlloc(52/*sizeof(DOCK)*/);
_SIDE = 2;
AkelPad.MemCopy(tpDock + 8, 1/*DKF_OWNTHREAD*/|4/*DKF_DRAGDROP*/, 3);
AkelPad.MemCopy(tpDock + 16, _SIDE, 3);
pDock = AkelPad.SendMessage(hMainWnd, 1278/*AKD_DOCK*/, 1/*DK_ADD*/, tpDock);
AkelPad.MemFree(tpDock);
if(pDock != 0)
{
hDockWnd = CreateWindowEx(0,DOCKCLASSNAME,DOCKCLASSNAME,0x040000000/*WS_CHILD*/|0x002000000/*WS_CLIPCHILDREN*/,0,0,0/*_W*/,0/*_H*/,hMainWnd,0,DockWindowProc);
if(hDockWnd!=0)
{
oSys.Call("user32::GetWindowRect",hDockWnd,pDock+20);
var szL = AkelPad.MemRead(pDock+20, 3);
var szT = AkelPad.MemRead(pDock+24, 3);
var szR = AkelPad.MemRead(pDock+28, 3);
var szB = AkelPad.MemRead(pDock+32, 3);
//rcSize={0,0,right-left,bottom-top}
AkelPad.MemCopy(pDock+20, 0, 3);
AkelPad.MemCopy(pDock+24, 0, 3);
AkelPad.MemCopy(pDock+28, szR-szL, 3);
AkelPad.MemCopy(pDock+32, szB-szT, 3);
//rcDragDrop=rcSize
AkelPad.MemCopy(pDock+36, 0, 3);
AkelPad.MemCopy(pDock+40, 0, 3);
AkelPad.MemCopy(pDock+44, szR-szL, 3);
AkelPad.MemCopy(pDock+48, szB-szT, 3);
AkelPad.MemCopy(pDock+12, hDockWnd, 3);
AkelPad.SendMessage(hMainWnd, 1278 /*AKD_DOCK*/, 4 /*DK_SUBCLASS*/, pDock);
AkelPad.SendMessage(hMainWnd, 1278 /*AKD_DOCK*/, 512 /*DK_SHOW*/, pDock);
return 1;
}
else
{
AkelPad.SendMessage(hMainWnd,1278 /*AKD_DOCK*/,2 /*DK_DELETE*/,pDock);
pDock = 0;
return 0;
}
}
else return 0;
}
function DockWindowProc(hwnd, umsg, wparam,lparam)
{
if(umsg == 16 /*WM_CLOSE*/)
{
oSys.Call("user32::DestroyWindow",hwnd);
return 1;
}
else if(umsg == 2 /*WM_DESTROY*/)
{
_SIDE = AkelPad.MemRead(pDock+16, 3);
AkelPad.SendMessage(hMainWnd,1278 /*AKD_DOCK*/,8 /*DK_UNSUBCLASS*/,pDock);
AkelPad.SendMessage(hMainWnd,1278 /*AKD_DOCK*/,2 /*DK_DELETE*/,pDock);
pDock = 0;
AkelPad.SendMessage(hMainWnd, 1277 /*AKD_RESIZE*/, 0, 0);
hDockWnd = 0;
oSys.Call("user32::PostQuitMessage", 0);
return 0;
}
return 0;
}
function AkelPadCallBack(hwnd,umsg,wparam,lparam)
{
if(umsg == 1030 /*AKDN_MAIN_ONFINISH*/)
{
AkelPad.SendMessage(hDockWnd, 16 /*WM_CLOSE*/, 0, 0);
while(!QuitMutext)
{
oSys.Call("kernel32::SwitchToThread");
}
}
if(umsg == 1048 /*AKDN_FRAME_DESTROY*/)
tabHide(1);
if(umsg == 1078 /*AKDN_OPENDOCUMENT_FINISH&& lparam == 0*/)
tabHide(0);
if(umsg == 1046 /*AKDN_FRAME_ACTIVATE*/) // Не нашёл AKDN_NEWDOCUMENT_FINISH
tabHide(0);
if(umsg == 1077 /*AKDN_OPENDOCUMENT_START*/)
{
aKey = oSys.Call("user32::GetAsyncKeyState", aKeyCode);
WScript.Sleep(odPause);
aMB = oSys.Call("user32::GetAsyncKeyState", aMouseCode); // Не нашёл AKDN_DRAGDROP_START
if ( (((aKey < 0) || (aMB < 0)) && (!(sopts & 1))) || (((aKey >= 0) && (aMB >= 0)) && (sopts & 1)) )
AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
}
return 0;
}