Scripts discussion (2)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Visitor7
No, for example file is SearchReplace.js
Turn on LineBoard and CodeFold:
Image

Turn off LineBoard:
Image

Turn on LineBoard with parameter 1:
"LineBoard" +Call("LineBoard::Main", 1)
or in script:
AkelPad.Call("LineBoard::Main", 1);
Image

CodeFold disappeared. Is turned on but not visible.
It seems to me that this is a bug in LineBoard plugin.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

ScreenView.js
Added:
Ctrl+INS - copy view name to the clipboard.
Pressing the font button with Ctrl or Shift key, displays only monospace fonts.

ChooseFont_function.js
On title bar added "[Monospace]", if are displayed only fixed-pitch fonts.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

KDJ wrote:CodeFold disappeared. Is turned on but not visible.
Да, действительно. Приходится либо перезапускать LineBoard, либо запускать сначала LineBoard, а потом CodeFold.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

Помогите со скриптом:

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

Хотелось бы заменить объект окна на какой-нибудь более простой и в принципе невидимый.
Last edited by Visitor7 on Sat Jun 23, 2012 12:28 pm, edited 12 times in total.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Translator.js
Fixed: Yandex Translator didn't work.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Visitor7
UndoMax.js
It seems to me that it is unnecessary:
var hMainWnd=AkelPad.GetMainWnd();
and can be shortened:
if (hWndEdit && hWndEdit)

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

KDJ
Спасибо, исправил на "if (hMainWnd && hWndEdit)". А зачем вообще нужны подобные проверки? Эти скрипты и так расcчитаны лишь на запуск из Akelpad. Или он может не всегда отвечать?

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Visitor7, ваш скрипт могут запустить без открытого документа, в следствии чего hWndEdit будет нулевым. Согласитесь, Вашем скрипту делать нечего в таком случае.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

FeyFre
Такое возможно только в MDI и только в одном случае - если принудительно всё закрыть, а потом зачем-то запустить скрипт. И данный скрипт без этой доп. проверки определит что ему делать нечего.
Это единственная причина?

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

In this case, probably enough to check hWndEdit:
if (hWndEdit)

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

ScreenView.js
Added: Color theme.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

Code: Select all

var hMainWnd = AkelPad.GetMainWnd();

if(AkelPad.WindowSubClass(hMainWnd, AkelPadCallBack, 1077 /*AKDN_OPENDOCUMENT_START*/, 1030 /*AKDN_MAIN_ONFINISH*/))
{
   AkelPad.ScriptNoMutex();
   AkelPad.WindowGetMessage();
   AkelPad.WindowUnsubClass(hMainWnd);
}

function AkelPadCallBack(hwnd,umsg,wparam,lparam)
{
   if(umsg == 1030 /*AKDN_MAIN_ONFINISH*/)
   {
      oSys.Call("user32::PostQuitMessage",0);
   }
   if(umsg == 1077 /*AKDN_OPENDOCUMENT_START*/)
   {
      AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
   }
   return 0;
}

1. Как лучше определить что скрипт уже запущен из повторного запуска.
2. Как получить обработку начала DragDrop или чуть позже узнать какой клавишей мыши тянули файл?

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Visitor7, только запущен, или ещё и дернуть его?
1. Генерируем идентификатор - строка которая однозначно укажет на именно это скрипт в этом экземпляре АР. Для перового условия вполне достаточно будет взять значение WScript.ScriptBaseName, для второго - Process ID, через вызов oSys.Call("kernel32::GetCurrentProcessId"). Ну и добавить соль, если нужно несколько таких имен. В качестве соли можно использовать всё что угодно, но желательно говорящую, что-бы в процессе отладки было удобнее. Пример:
var id = WScript.ScriptBaseName+oSys.Call("kernel32::GetCurrentProcessId")+соль.
2. Этот идентификатор кормим в различные глобальные функции.
Например, что-бы проверить на обычную запущенность, достаточно создать мутекс. Первый раз он создастся, последующие будет отвечать ошибкой "уже существует". Не забываем его удалять перед самым завершением скрипта.
Если нужно взаимодействовать с первым экземпляром, то нужно создать соотв. активный объект. Например, окно с классом идентификатором, которому можно бросить управляющие сообщения.
В качестве примеров гляньте History.js или SetCodetExt.js - оба контролируют повторный запуск окном.
Last edited by FeyFre on Sat Jun 30, 2012 4:34 pm, edited 1 time in total.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

ScreenView.js
Added ColorCoderTheme.
Bugs fixed.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

FeyFre
В двух словах: я хочу скрипт, который скрывает вкладку если она одна и позволяет по удержанию Alt или перетаскиванию правой кнопкой мыши открывать файл в текущей вкладке.
Первым делом я построил его по подобию history.js

Code: Select all

// AutohideTab.js    ver.1.5 beta   2012-06-26
// Скрывает панель вкладок если вкладка одна.
// Открывает файл в текущей вкладке если удержана клавиша Alt или нажата левая кнопка мыши.
// Может по умолчанию открывать файлы в текущей вкладке, а по Alt или LMB - в новой.
// Запуск: Call("Scripts::Main", 1, "AutohideTab.js"[, "s[ p]"])
//    Повторный вызов закрывает скрипт.
//    s - маска установок, целое от 0 до 15, по умолчанию 1:
//       b0001  (1)  -  открывать файлы в текущей вкладке по умолчанию, а если удержана Alt - в новой.
//       b0010  (2)  -  не возвращать состояние строки вкладок при выходе из программы.
//       b0100  (4)  -  если строка вкладок отсутствует в момент запуска скрипта, то показывать ее внизу.
//       b1000  (8)  -  принудительно включать строку вкладок при выходе из программы.
//    p - время задержки открытия файла в миллисекундах, по умолчанию 100:
//       Cкрипт проверяет на удержание левую клавишу мыши, но чтобы вы успели ее нажать после 
//       отпускания при Drag`n`Drop файла в окно Akelpad, нужна пауза до начала открытия файла. 
//       Открытие всех файлов начнет чуть притормаживать.
//       Например: Call("Scripts::Main", 1, "AutohideTab.js", "1 100")
// Автозапуск(в AkelPad.ini или реестре):
//    Добавить в строку "CmdLineBegin" следующее: /Call("Scripts::Main", 1, "AutohideTab.js"[, "s[ p]"])

var hMainWnd = AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hModuleDll = AkelPad.GetInstanceDll();
var pDock = 0;
var hDockWnd = 0;
var DOCKCLASSNAME = "AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("kernel32::GetCurrentProcessId");
var QuitMutext = false;
var aKey;
var aMB;
var sOpts = 0;
var odPause = 100;
var tbBottom = false;
var tState;
var lpInitFrame;
var lpFrame;
var i;

var dock = FindWindowEx(hMainWnd,DOCKCLASSNAME);
if(dock)
    AkelPad.SendMessage(dock, 16 /*WM_CLOSE*/, 0, 0);
else
{
    if(WScript.Arguments.length > 0)
        sOpts = WScript.Arguments(0);
    if(WScript.Arguments.length > 1)
        odPause = WScript.Arguments(1);
    tState = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
    if ( (tState & 4) || ((sOpts & 4)&&(tState & 1)) )
        tbBottom = true;
   tabHide(0);
   var res = AkelPad.WindowRegisterClass(DOCKCLASSNAME);
   if(CreateDock())
   {
      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 (tbBottom)
          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()
{
  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)
  {
      if (tbBottom)
           AkelPad.Command(4302 /*IDM_WINDOW_TABVIEW_BOTTOM*/);
      else
           AkelPad.Command(4301 /*IDM_WINDOW_TABVIEW_TOP*/);
  }
  else
       AkelPad.Command(4303 /*IDM_WINDOW_TABVIEW_NONE*/);
}

function CreateDock()
{
   var tpDock = AkelPad.MemAlloc(52/*sizeof(DOCK)*/);
   AkelPad.MemCopy(tpDock + 8, 1/*DKF_OWNTHREAD*/|4/*DKF_DRAGDROP*/, 3);
   AkelPad.MemCopy(tpDock + 16, 4/*BOTTOM*/, 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,0,hMainWnd,0,DockWindowProc);
      if(hDockWnd!=0)
      {
         AkelPad.SendMessage(hMainWnd, 1278 /*AKD_DOCK*/, 4 /*DK_SUBCLASS*/, pDock);
         AkelPad.SendMessage(hMainWnd, 1278 /*AKD_DOCK*/, 512 /*DK_HIDE*/, 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*/)
   {
      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;
}

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 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 == (1046 /*AKDN_FRAME_ACTIVATE*/ || 1078 /*AKDN_OPENDOCUMENT_FINISH*/))  
      tabHide();
   if(umsg == 1077 /*AKDN_OPENDOCUMENT_START*/)
   {
      aKey = oSys.Call("user32::GetAsyncKeyState", 18 /*VK_MENU*/);
      WScript.Sleep(odPause);
      aMB = oSys.Call("user32::GetAsyncKeyState", 1 /*VK_LBUTTON*/); 
      if ( (((aKey < 0) || (aMB < 0)) && (!(sOpts & 1))) || (((aKey >= 0) && (aMB >= 0)) && (sOpts & 1)) )
          AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
   }
   return 0;
}

Работает вполне, только я так и не понял как узнать состояние клавиш мыши в момент перетаскивания, поэтому временно придумал обратный двойной клик)) Но мне не нужны окна и доки, объем скрипта и функциональность не соответствуют. Поэтому я решил попробовать без них.

Code: Select all

// AutohideTab.js    ver.1.7 alfa   2012-06-29

var hMainWnd = AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var pClassName="AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("kernel32::GetCurrentProcessId");
var aKey;
var aMB;
var aQuit = 0;
var sOpts = 1;
var odPause = 100;
var tabBottom = false;
var tState;
var lpInitFrame;
var lpFrame;
var i;

if (AkelPad.WindowRegisterClass(pClassName))
{
    SettingsInit();
    if(AkelPad.WindowSubClass(hMainWnd, AkelPadCallBack, 1081 /*AKDN_HOTKEY*/, 1078 /*AKDN_OPENDOCUMENT_FINISH*/,1077 /*AKDN_OPENDOCUMENT_START*/, 1046 /*AKDN_FRAME_ACTIVATE*/, 1030 /*AKDN_MAIN_ONFINISH*/))
    {
       OneTabHide();
       AkelPad.ScriptNoMutex();
       AkelPad.WindowGetMessage();
       AkelPad.WindowUnsubClass(hMainWnd);
       RestoreTabBar();
    }
    AkelPad.WindowUnregisterClass(pClassName);
    if (aQuit) AkelPad.Command(4109 /*IDM_FILE_EXIT*/);
}

function AkelPadCallBack(hwnd,umsg,wparam,lparam)
{
   if ((umsg == 1081/*AKDN_HOTKEY*/) && (wparam == 1876 /*Ctrl + Shift +Alt + T*/) ) 
      oSys.Call("user32::PostQuitMessage",0);
   if(umsg == (1046 /*AKDN_FRAME_ACTIVATE*/ || 1078 /*AKDN_OPENDOCUMENT_FINISH*/))  
      OneTabHide();
   if(umsg == 1077 /*AKDN_OPENDOCUMENT_START*/)
      FileClose();
   if(umsg == 1030 /*AKDN_MAIN_ONFINISH*/)
   {
      aQuit = 1;
      oSys.Call("user32::PostQuitMessage", 0);
      return 1;
   }
   return 0;
}

function SettingsInit()
{
    if(WScript.Arguments.length > 0)
        sOpts = WScript.Arguments(0);
    if(WScript.Arguments.length > 1)
        odPause = WScript.Arguments(1);
    tState = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
    if ( (tState & 4) || ((sOpts & 4)&&(tState & 1)) )
        tabBottom = true;
}

function OneTabHide()
{
  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) 
  {
      if (tabBottom)    AkelPad.Command(4302 /*IDM_WINDOW_TABVIEW_BOTTOM*/);
      else        AkelPad.Command(4301 /*IDM_WINDOW_TABVIEW_TOP*/);
  }
  else            AkelPad.Command(4303 /*IDM_WINDOW_TABVIEW_NONE*/);
}

function FileClose()
{
      aKey = oSys.Call("user32::GetAsyncKeyState", 18 /*VK_MENU*/);
      WScript.Sleep(odPause);
      aMB = oSys.Call("user32::GetAsyncKeyState", 1 /*VK_LBUTTON*/); 
      if ( (((aKey < 0) || (aMB < 0)) && (!(sOpts & 1))) || (((aKey >= 0) && (aMB >= 0)) && (sOpts & 1)) )
          AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
}

function RestoreTabBar()
{
    if (((sOpts&8) && (tabBottom)) || ((!(sOpts&2)) && (tState&4)))
          AkelPad.Command(4302 /*IDM_WINDOW_TABVIEW_BOTTOM*/);
    else if ((!(sOpts&2)) && (tState&1) && (!(sOpts&8)))
          AkelPad.Command(4303 /*IDM_WINDOW_TABVIEW_NONE*/);
    else if ((!(sOpts&2)) || (sOpts&8))
          AkelPad.Command(4301 /*IDM_WINDOW_TABVIEW_TOP*/);
}
//AkelPad.Call("Log::Output", 5, "Start..." + "\r");

Тут столкнулся с проблемами:
1. Не знаю как остановить скрипт не используя AKDN_HOTKEY, оно для постоянно работающего скрипта расточительно.
2. Не могу корректно закрыть AkelPad с работающим скриптом.
3. Не нашел способа контроля запуска кроме как использовать класс в качестве межскриптовой переменной. Что как-то не логично, должны быть более адекватные способы.
Locked