Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

[Yustas.NeO] wrote:Не-не-не, я имею ввиду: если в выделени находится несколько строк текста (тоесть в выделении находится символ переноса строки.), то нужно получить ПОЛНОЕ выделение этих строк текста. А если тройным кликом, то выделится только текущая строка текста.
Вот теперь ясно.
[Yustas.NeO] wrote:Будем подождать :)
Так уже пару лет ждём... ))
[Yustas.NeO] wrote:Жаль только что скролл текста прыгает...
Для этого перед выполнением операций с окном редактирования надо отключать прорисовку, а после - включать: функции AutoRedrawOff и AutoRedrawOn в SelCompleteLine.js.

P.S. Мы точно всё это по второму кругу в этой теме проговариваем, только первый раз я был спрашивающий :mrgreen:

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

VladSh wrote:Для этого перед выполнением операций с окном редактирования надо отключать прорисовку, а после - включать: функции AutoRedrawOff и AutoRedrawOn в SelCompleteLine.js.
Осталось только понять, как эти функции подключить :wink:
VladSh wrote:P.S. Мы точно всё это по второму кругу в этой теме проговариваем, только первый раз я был спрашивающий :mrgreen:
Круговорот опыта в природе :)

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

Post by VladSh »

[Yustas.NeO] wrote:Осталось только понять, как эти функции подключить :wink:
Это я разбил функции на 2, а изначально у Instructor'а была одна SetRedraw, а у Infocatcher'а такая же toggleRedraw с дополнительным параметром.
Пример использования можно глянуть, например, в UndoAllNoScroll.js.


Instructor
Только что глянул на SearchReplace.js, так там это имеет следующий вид:

Code: Select all

function SetRedraw(hWnd, bRedraw)
{
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   if (bRedraw) oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
Альтернативная запись? Думаю заменить у себя...
Last edited by VladSh on Thu Jun 24, 2010 1:01 pm, edited 1 time in total.

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

Post by VladSh »

Instructor
Работая с InternetRequest.js столкнулся с неприятной особенностью... WshShell.Exec обрезает содержимое. Из всего, выделенного мной текста, в браузер, передаётся только 86 символов, из них 74 кирилических и 10 пробелов.
Есть ли какой-нибудь другой способ передать длинный URL в браузер?

Примечание: если юзать этот же скрипт из браузера, то всё работает корректно - передаётся весь выделенный текст.
Last edited by VladSh on Mon Jan 31, 2011 9:49 am, edited 1 time in total.

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

Post by Instructor »

VladSh
Да, видимо у методов Exec\Run ограничения на длину передаваемой строки. На Run'е максимально получилось 2048 - пробовал так:

Code: Select all

   var pSelText = /*encodeURI*/(AkelPad.GetSelText());
   if (pSelText != "")
   {
      var pLink = WScript.Arguments(0).replace("\\s", pSelText);

      var WshShell = new ActiveXObject("WScript.Shell");
      WshShell.Run('\"' + pLink + '\"');
   }
Если преобразовывать в URI, то количество знаков уменьшится втрое.

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

Post by VladSh »

Instructor
Спасибо огромное! Работает! 8)

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

Post by Infocatcher »

VladSh wrote:изначально у Instructor'а была одна SetRedraw, а у Infocatcher'а такая же toggleRedraw с дополнительным параметром.
Все же логически это и правда set. :D

convertHTML.js теперь умеет самостоятельно угадывать направление конвертирования.

Заодно чуть подкорректировал textStatistics.js.

Offline
Posts: 35
Joined: Mon Jun 15, 2009 3:46 pm

Post by ccaid »

[Yustas.NeO] wrote: если в выделени находится несколько строк текста (тоесть в выделении находится символ переноса строки.), то нужно получить ПОЛНОЕ выделение этих строк текста. А если тройным кликом, то выделится только текущая строка текста.
делаем тройной клик на первой строке и, не отпуская кнопку, двигаем курсор мыши вниз — выделяется несколько строк

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

ccaid wrote:делаем тройной клик на первой строке и, не отпуская кнопку, двигаем курсор мыши вниз — выделяется несколько строк
Такой способ - в момент перемещения мышки - не выделяет строки не от \n до \n!

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

Post by KDJ »

Many scripts changes the contents of the document, although its status is read-only.
For example: InsertDate.js, InsertFile.js, LinesFilter.js, SearchReplace.js and other placed on the forum.
Maybe should be used to verify:

Code: Select all

if (AkelPad.GetEditReadOnly(0)==false)
{
...
}
For example, in the script InsertDate.js:

Code: Select all

if (AkelPad.GetEditReadOnly(0)==false)
{
  if (hMainWnd)
  {
    pTime=TimeFormat(pFormat);
    AkelPad.ReplaceSel(pTime);
  }
}

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

Post by Infocatcher »

KDJ
I think, the following code is more «logical»:

Code: Select all

var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) { ... }
(Strange to check edit window without main window.)

P.S.

Code: Select all

null == false; // false
if(!null) WScript.Echo("true"); // echo
(null == false) === !null; // false
Not in this case, but can happens. :D
+ undefined, NaN and objects like ({ valueOf: function() { return false; } })

Offline
Posts: 120
Joined: Sat Jan 12, 2008 10:16 am
Location: Shantou, China

Post by cnnnc »

But the best way is by Akelpad to judge read-only or not.

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

Post by KDJ »

Infocatcher
Sorry, I gave only a portion of the code InsertDate.js.
Here is the whole:

Code: Select all

/// Insert time and date in specified format
//
// Time:
// h   Hours with no leading zero for single-digit hours; 12-hour clock.
// hh  Hours with leading zero for single-digit hours; 12-hour clock.
// H   Hours with no leading zero for single-digit hours; 24-hour clock.
// HH  Hours with leading zero for single-digit hours; 24-hour clock.
// m   Minutes with no leading zero for single-digit minutes.
// mm  Minutes with leading zero for single-digit minutes.
// s   Seconds with no leading zero for single-digit seconds.
// ss  Seconds with leading zero for single-digit seconds.
// t   One character time-marker string, such as A or P.
// tt  Multicharacter time-marker string, such as AM or PM.
//
// Date:
// d     Day of month as digits with no leading zero for single-digit days.
// dd    Day of month as digits with leading zero for single-digit days.
// ddd   Day of week as a three-letter abbreviation.
// dddd  Day of week as its full name.
// M     Month as digits with no leading zero for single-digit months.
// MM    Month as digits with leading zero for single-digit months.
// MMM   Month as a three-letter abbreviation.
// MMMM  Month as its full name.
// y     Year as last two digits, but with no leading zero for years less than 10.
// yy    Year as last two digits, but with leading zero for years less than 10.
// yyyy  Year represented by full four digits.
//
// Example:
// "H:mm:ss dd MMMM yyyy" -> "12:50:24 07 January 2008"

//Options
var pFormat="H:mm dd.MM.yyyy";
if (WScript.Arguments.length)
  pFormat=WScript.Arguments(0);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var pTime;

if (AkelPad.GetEditReadOnly(0)==false)
{
  if (hMainWnd)
  {
    pTime=TimeFormat(pFormat);
    AkelPad.ReplaceSel(pTime);
  }
}

//Functions
function TimeFormat(pFormat)
{
  var lpFormatBuffer;
  var lpTimeBuffer;
  var pTime="";

  if (lpFormatBuffer=AkelPad.MemAlloc(256 * _TSIZE))
  {
    AkelPad.MemCopy(lpFormatBuffer, pFormat.substr(0, 255), _TSTR);

    if (lpTimeBuffer=AkelPad.MemAlloc(256 * _TSIZE))
    {
      oSys.Call("kernel32::GetTimeFormat" + _TCHAR, 1024 /*LOCALE_USER_DEFAULT*/, 0, 0, lpFormatBuffer, lpTimeBuffer);
      oSys.Call("kernel32::GetDateFormat" + _TCHAR, 1024 /*LOCALE_USER_DEFAULT*/, 0, 0, lpTimeBuffer, lpFormatBuffer, 256);
      pTime=AkelPad.MemRead(lpFormatBuffer, _TSTR);

      AkelPad.MemFree(lpTimeBuffer);
    }
    AkelPad.MemFree(lpFormatBuffer);
  }
  return pTime;
}

Last edited by KDJ on Mon Jul 05, 2010 3:32 pm, edited 1 time in total.

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

Post by VladSh »

cnnnc wrote:But the best way is by Akelpad to judge read-only or not.
Agreed.
AkelPad itself should ignore the launch scripts, perhaps only a few methods of the object.

There was still a good idea to make an additional parameter in the ContextMenu, Toolbar, Hotkeys, allowing command freezing the corresponding item.
For example:

Code: Select all

-"Insert File..." Call("Scripts::Main", 1, "InsertFile.js", `"%f"`) Freeze %r

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

Post by Infocatcher »

VladSh wrote:There was still a good idea to make an additional parameter in the ContextMenu, Toolbar, Hotkeys, allowing command freezing the corresponding item.
Here the same request: viewtopic.php?p=7724#p7724 (in Russian; google translation, but it's too horrible :D).
Something like

Code: Select all

-"Insert File..." Call("Scripts::Main", 1, "InsertFile.js", `"%f"`) Disabled(IdOfStandardCommand)
Or some predefined flags like
1 – disable, if can't paste
2 – disable, if can't copy
4 – ... can't insert (read-only)
8 – ... can't undo
16 – ... can't redo
...

And

Code: Select all

"Insert date" Command(4183) Icon("%a\AkelFiles\Plugs\ToolBar.dll", 26)
should be disabled in read-only mode.
Locked