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