Scripts discussion (2)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1879
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

VladSh
А как же

Code: Select all

<div xmlns="http://www.w3.org/1999/xhtml">
	<b>...</b>
	...
</div>
?
Плюс можно же вручную вводить произвольные тэги.

Offline
Posts: 3243
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher
Ход конём - для автодетекта передавать в аргументах bbcode=... не 2, а перечень расширений, в которых хотим видеть <> :D

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Instructor за SetCaretAtCursor.js спасибо

Подскажите что можно сделать... использую при вставке , чтобы окно не прокручивалось команды

Code: Select all

SendMessage(.GetEditWnd(), 3185, 3, True)
SendMessage(.GetEditWnd(), 3185, 3, False)
работает отлично

Но если курсор стоит внизу документа, то текст вставляется, но не отображается (горизонтальная прокрутка остаётся на месте)
Пример: документ 30-40 строк, чтобы прокрутка была, курсор в самом низу, вставляем строку

Code: Select all

With AkelPad
  Call .SendMessage(.GetEditWnd(), 3185, 3, True)
  Call .ReplaceSel(vbNewLine)
  Call .SendMessage(.GetEditWnd(), 3185, 3, False)
End With
строка вставилась, но её не видно...
Функция Redraw тоже не помогает
Её можно увидеть если перейти на другую вкладку и обратно...

Поведение может быть и правильное, но как обновить окно (не документ) , чтобы вставленная часть отобразилась?

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

Post by KDJ »

Andrey_A_A

Code: Select all

With AkelPad
  Call .SendMessage(.GetEditWnd(), 3185, 3, True)
  Call .ReplaceSel(vbNewLine)
  Call .SendMessage(.GetEditWnd(), 3185, 3, False)
'3376 = AEM_UPDATESCROLLBAR
  Call .SendMessage(.GetEditWnd(), 3376 , 3, 0)
End With

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

KDJ, спасибо, всё заработало!

Offline
Posts: 176
Joined: Sat Dec 24, 2011 4:05 pm

Post by F. Phoenix »

→ VladSh
CommonFunctions.js wrote://возвращает расширение по применённой теме (coder-файла); на основе кода Instructor'а
function getExtBySyntaxFile(hWndE)
Она ж не расширение возвращает, а имя кодер-файла, которое может быть каким угодно. Сбивает.
По-моему, лучше так:
// Возвращает используемый файл синтаксиса (на основе кода Instructor'а).
function getActiveSyntax(hWndE)
На расширение же нужно какую-то другую функцию, которая бы проверяла, прописано ли такое-то расширение в кодер-файле.

PS: Кстати точности ради непомешало бы ввести какие-то местные идентификаторы синтаксиса :roll: Т.е. валяется у меня например штатная подсветка для C# cs.coder, и своя cs-alt.coder, сделанная на основе подсветки SharpDevelop. В скрипте конечн несложно проверить обе, но было б неплохо, если б в самих кодер-файлах прописывалось что-то типа:
Syntax: C#
А вообще идеальную модель обработки файлов вижу примерно так:
Image

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

Post by KDJ »

How to create maximized window in ActiveX?
WS_MAXIMIZE style is ignored:

Code: Select all

var AkelPad = new ActiveXObject("AkelPad.Document");
var oSys = AkelPad.SystemFunction();
var hInstanceDLL = AkelPad.GetInstanceDll();
var sClassName = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstanceDLL;

AkelPad.WindowRegisterClass(sClassName);
oSys.Call("User32::CreateWindowExW",
  0,            //dwExStyle
  sClassName,   //lpClassName
  0,            //lpWindowName
  0x91CF0000,   //dwStyle=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_THICKFRAME|WS_MAXIMIZE
  100,          //x
  100,          //y
  300,          //nWidth
  200,          //nHeight
  0,            //hWndParent
  0,            //ID
  hInstanceDLL, //hInstance
  DialogCallback);
AkelPad.WindowGetMessage();
AkelPad.WindowUnregisterClass(sClassName);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 5) //WM_SIZE
    oSys.Call("User32::SetWindowTextW", hWnd, "Is maximized? " + (oSys.Call("User32::IsZoomed", hWnd) ? "Yes" : "No"));
  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 27) //VK_ESCAPE
      oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }
  else if (uMsg == 16) //WM_CLOSE
    oSys.Call("User32::DestroyWindow", hWnd);
  else if (uMsg == 2) //WM_DESTROY
    oSys.Call("User32::PostQuitMessage", 0);
  return 0;
}


After adding WScript.Echo("...") working properly:

Code: Select all

WScript.Echo("Create maximized window");
var AkelPad = new ActiveXObject("AkelPad.Document");
var oSys = AkelPad.SystemFunction();
var hInstanceDLL = AkelPad.GetInstanceDll();
var sClassName = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstanceDLL;

AkelPad.WindowRegisterClass(sClassName);
oSys.Call("User32::CreateWindowExW",
  0,            //dwExStyle
  sClassName,   //lpClassName
  0,            //lpWindowName
  0x91CF0000,   //dwStyle=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_THICKFRAME|WS_MAXIMIZE
  100,          //x
  100,          //y
  300,          //nWidth
  200,          //nHeight
  0,            //hWndParent
  0,            //ID
  hInstanceDLL, //hInstance
  DialogCallback);
AkelPad.WindowGetMessage();
AkelPad.WindowUnregisterClass(sClassName);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 5) //WM_SIZE
    oSys.Call("User32::SetWindowTextW", hWnd, "Is maximized? " + (oSys.Call("User32::IsZoomed", hWnd) ? "Yes" : "No"));
  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 27) //VK_ESCAPE
      oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }
  else if (uMsg == 16) //WM_CLOSE
    oSys.Call("User32::DestroyWindow", hWnd);
  else if (uMsg == 2) //WM_DESTROY
    oSys.Call("User32::PostQuitMessage", 0);
  return 0;
}


How to explain such behavior?
Last edited by KDJ on Sun Aug 26, 2012 3:36 pm, edited 1 time in total.

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

Post by FeyFre »

KDJ, It seems to be well known bug, but MS does not confirms it. Instead of usage WS_MAXIMIZED, You should use ShowWindow(hwnd,SW_SHOWMAXIMIZED).

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

Post by KDJ »

FeyFre
I'm curious whether in Win7 this bug also occurs?

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

Post by FeyFre »

KDJ, probably they are not think it is bug. Probably it is intended to be so, but we do not know conditions which influence this behaviour.

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

Post by KDJ »

Thanks FeyFre. ShowWindow() function solves the problem (instead of WS_VISIBLE and WS_MAXIMIZE).

Code: Select all

var AkelPad = new ActiveXObject("AkelPad.Document");
var oSys = AkelPad.SystemFunction();
var hInstanceDLL = AkelPad.GetInstanceDll();
var sClassName = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstanceDLL;
var bMaximize = 1;
var hWnd;

AkelPad.WindowRegisterClass(sClassName);
hWnd = oSys.Call("User32::CreateWindowExW",
  0,            //dwExStyle
  sClassName,   //lpClassName
  0,            //lpWindowName
  0x80CF0000,   //dwStyle=WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_THICKFRAME
  100,          //x
  100,          //y
  300,          //nWidth
  200,          //nHeight
  0,            //hWndParent
  0,            //ID
  hInstanceDLL, //hInstance
  DialogCallback);
oSys.Call("User32::ShowWindow", hWnd, bMaximize ? 3 /*SW_MAXIMIZE*/ : 1 /*SW_SHOWNORMAL*/);
AkelPad.WindowGetMessage();
AkelPad.WindowUnregisterClass(sClassName);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 5) //WM_SIZE
    oSys.Call("User32::SetWindowTextW", hWnd, "Is maximized? " + (oSys.Call("User32::IsZoomed", hWnd) ? "Yes" : "No"));
  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 27) //VK_ESCAPE
      oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }
  else if (uMsg == 16) //WM_CLOSE
    oSys.Call("User32::DestroyWindow", hWnd);
  else if (uMsg == 2) //WM_DESTROY
    oSys.Call("User32::PostQuitMessage", 0);
  return 0;
}

Offline
Site Admin
Posts: 6411
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:Что-то я не понимаю, как использовать
Call("Coder::Settings", 18, WINDOW, DOCUMENT, *ALIAS, *ALIASLENGTH)

Code: Select all

var hWndEdit=AkelPad.GetEditWnd();
var hDocEdit=AkelPad.GetEditDoc();
var pAlias="";
var lpAlias;

if (hWndEdit && hDocEdit)
{
  if (lpAlias=AkelPad.MemAlloc(256 * 2 /*sizeof(wchar_t)*/))
  {
    AkelPad.CallW("Coder::Settings", 18 /*DLLA_CODER_GETALIAS*/, hWndEdit, hDocEdit, lpAlias, 0);
    pAlias=AkelPad.MemRead(lpAlias, 1 /*DT_UNICODE*/);
    AkelPad.MemFree(lpAlias);
  }
  WScript.Echo(pAlias);
}

Offline
Posts: 1879
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor
Спасибо!
Просьба добавить этот пример в документацию. А то там ведь без изучения исходников ничего не понять. :)

И еще. У меня задан псевдоним для неизвестного файла. И я ожидал его получить на новом несохраненном файле, но нет – пустую строку выдает.

Offline
Posts: 1879
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

VladSh wrote:Ход конём - для автодетекта передавать в аргументах bbcode=... не 2, а перечень расширений, в которых хотим видеть <> :D
Нечто вроде: insertTag-test.js

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

KDJ в скрипте FileInfo.js
вставь пожалуйста параметр или в основу добавь, чтобы детальная статистика в новой вкладке отражалась в моноширинном шрифте

Code: Select all

WScript.Sleep 10 : Call AkelPad.Font ("Courier New", 1, 10)
Locked