Scripts discussion (3)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

KDJ
Thank you very much, works fine (as usual) :)

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

Post by VladSh »

~ to

Code: Select all

sTxtCount          = 'Подсчитать';
sTxtFindAll        = 'Найти все';
sTxtWait           = 'Подождите...';
sTxtBookmark       = 'Установить закладку';
sTxtUnmark         = 'Удалить закладку';
sTxtTotalFound     = 'Всего вхождений: ';

но надо там размер кнопок менять, - в русском они всегда больше.

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

Post by VladSh »

Skif_off
Предложения по скрипту:
1. Перенести его в тему со скриптами и первой ссылкой установить ссылку реального сообщения, где он будет там находиться (так повелось уже и для ScriptNameCopyAsBBCode.js удобно).
2. Если можно, то сделать вместо текстового поля ComboBox с ранее введенными вариантами (можно в ini с именем скрипта рядом писать).

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

VladSh
1. Постеснялся, если честно: моя только идея по сути (встроенная функция и условный оператор - это несерьёзно).
2. Не уверен, т.к.почти не знаю язык, а ComboBox - это совсем не AkelPad.InputBox :)
Вообще, скрипт не задумывался как альтернатива charmap.exe, поэтому просто, поэтому и взялся. Есть пара мыслей, посмотрю ближе к ночи, но не обещаю.

З.Ы. К слову, на авторство не претендую, лишь бы у нас был ещё один удобный инструмент.

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

Post by VladSh »

Skif_off
Потом тема уйдёт с старые и скрипт затеряется... Лучше всё-таки там.
Это только предложение, как было бы удобнее. Оно не часто востребовано, так что можно пренебречь :) Я знаю, что сложновато это и сам ленюсь разбираться в UI для скриптов)), хотя у KDJ в скриптах и есть примеры.

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

Post by KDJ »

VladSh
In new version of FindReplaceEx.js I will try to resize buttons and dialog window.
I'm going also to change the language strings:

Code: Select all

//English
sTxtBookmark = 'Bookmark all';
sTxtUnmark   = 'Unmark all';
//Polish
sTxtBookmark = 'Oznacz zakładkami';
sTxtUnmark   = 'Usuń zakładki';
Please give me Russian translation.

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

Post by VladSh »

KDJ
Вероятно так:

Code: Select all

//Russian
sTxtBookmark = 'Закладки на все';
sTxtUnmark   = 'Удалить все';
Если сделать отдельную группу элементов управления под названием "Закладки", то с кнопок можно будет убрать слова "Закладки" и "Закладка", это позволит сэкономить место.

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

VladSh
С разбегу с user32::CreateWindowEx не разобрался, пару-тройку дней прикину, потом решу. Но, думаю, смысла в ComboBox не много: для часто употребляемых есть Insert() плагина ContextMenu.

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

Post by KDJ »

FindReplaceEx.js
Added: buttons and dialog width are adjusted to the buttons text length.
Updated: Russian translation (by VladSh).

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

Post by KDJ »

Skif_off
For ease you can use CreateDialog_functions.js.
Here is the template to create an input box with ComboBox:

Code: Select all

if (! AkelPad.Include("CreateDialog_functions.js")) WScript.Quit();

var oSys  = AkelPad.SystemFunction();
var aText = ["Text1", "Text2", "Text3", "Text4"];

//read parameters from ini file
//...

var IDLABELS  = 1000;
var IDTEXTCB  = 1001;
var IDOKB     = 1002;
var IDCANCELB = 1004;
var aDlg      = [];

aDlg.Title    = "Window title";
aDlg.Style    = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER;
aDlg.Parent   = AkelPad.GetMainWnd();
aDlg.Callback = DialogCallback;
aDlg.W        = 216;
aDlg.H        = 63;
aDlg.CtlStyle = WS_VISIBLE;
aDlg.CtlFontN = "MS Shell Dlg";
aDlg.CtlFirst = IDLABELS;

aDlg[IDLABELS]  = {X:   8, Y:   8, W: 200, H:  10, Title: "ComboBox label", Class: "STATIC"};
aDlg[IDTEXTCB]  = {X:   8, Y:  20, W: 200, H: 100,                          Class: "COMBOBOX", Style: WS_TABSTOP | CBS_DROPDOWN};
aDlg[IDOKB]     = {X:   8, Y:  40, W:  50, H:  15, Title: "OK",                                Style: WS_TABSTOP | BS_DEFPUSHBUTTON};
aDlg[IDCANCELB] = {X:  66, Y:  40, W:  50, H:  15, Title: "Cancel",                            Style: WS_TABSTOP};

CreateDialogBox(aDlg);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  var nLowParam;
  var i;

  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    //fill ComboBox
    for (i = 0; i < aText.length; ++i)
      AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 323 /*CB_ADDSTRING*/, 0, aText[i]);

    AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 334 /*CB_SETCURSEL*/, 0, 0);
  }

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    nLowParam = wParam & 0xFFFF;

    if (nLowParam == IDOKB)
    {
      Action();
      oSys.Call("User32::EndDialog", hWnd, 0);
    }

    else if ((nLowParam == IDCANCELB) || (nLowParam == 2 /*IDCANCEL*/))
      oSys.Call("User32::EndDialog", hWnd, 0);
  }
}

function Action()
{
  var nTextLen = AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 14 /*WM_GETTEXTLENGTH*/, 0, 0) + 1;  
  var lpText   = AkelPad.MemAlloc(nTextLen * 2);
  var sText;

  AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 13 /*WM_GETTEXT*/, nTextLen, lpText);
  sText = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
  AkelPad.MemFree(lpText);

  if (sText)
  {
    AkelPad.ReplaceSel(sText, 1);

    //add sText to aText
    //write parameters (aText and other) to ini file
    //...
  }
}

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

Post by Instructor »

VladSh wrote:sTxtUnmark = 'Удалить все';
Как-то неоднозначно. Я бы предложил:

Code: Select all

sTxtUnmarkAll      = 'Убрать закладки';

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

Post by VladSh »

Instructor
Да, если бы были всплывающие подсказки на кнопках, то было бы проще :)
На сколько я понимаю смысл этих кнопок, одна из них проставляет закладки на все строки, которые были найдены по текущему поиску, а другая удаляет тоже только с этих же строк.

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

Post by KDJ »

FindReplaceEx.js
Fixed: delete bookmarks, if found string contains new line character.
Corrected: Russian translation.

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

KDJ
Thank you, works fine :)

Code: Select all

// Argumens:
//   -RW=0         - (default) don't store inserted strings
//      =1         - store inserted strings
//   -history=20   - (default) set history length (with -RW=1 only)
// Ru:
//   -RW=0         - по умолчанию не сохранять введенные строки
//      =1         - сохранять введенные строки
//   -history=20   - размер истории, по умолчанию 20, только вместе с -RW=1
//
// Usage:
// Call("Scripts::Main", 1, "InsertUnicodeChar.js")
// Call("Scripts::Main", 1, "InsertUnicodeChar.js", '-RW=1')
// Call("Scripts::Main", 1, "InsertUnicodeChar.js", '-RW=1 -history=10')

if (! AkelPad.Include("CreateDialog_functions.js")) WScript.Quit();

var hMainWnd        = AkelPad.GetMainWnd();
var oSys            = AkelPad.SystemFunction();
var pAkelPlugsDir   = AkelPad.GetAkelDir(4);
var pAkelScriptsDir = AkelPad.GetAkelDir(5);
var nArg1           = AkelPad.GetArgValue("RW", 0);
var nArg2           = AkelPad.GetArgValue("history", 20);
var fso             = new ActiveXObject("Scripting.FileSystemObject");
var aHex;

//read parameters from ini file
if (nArg1 = 1)
{
  var sIniFile = WScript.ScriptFullName.replace(/\.js$/i, ".ini");
  
  if (fso.FileExists(sIniFile))
  {
    var aHex = AkelPad.ReadFile(sIniFile, 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, true).split(/[,]/);
  }
  else
  {
    var aHex = ["002F"];
  }
}
else
{
  var aHex = ["002F"];
}

//GUI. Thanks KDJ
var IDLABELS  = 1000;
var IDTEXTCB  = 1001;
var IDOKB     = 1002;
var IDCANCELB = 1004;
var aDlg      = [];

aDlg.Title    = "Insert characters from hex codes";
aDlg.Style    = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER;
aDlg.Parent   = AkelPad.GetMainWnd();
aDlg.Callback = DialogCallback;
aDlg.W        = 216;
aDlg.H        = 63;
aDlg.CtlStyle = WS_VISIBLE;
aDlg.CtlFontN = "MS Shell Dlg";
aDlg.CtlFirst = IDLABELS;

aDlg[IDLABELS]  = {X:   8, Y:   8, W: 200, H:  10, Title: "Four digits hex codes:", Class: "STATIC"};
aDlg[IDTEXTCB]  = {X:   8, Y:  20, W: 200, H: 100,                          Class: "COMBOBOX", Style: WS_TABSTOP | CBS_DROPDOWN};
aDlg[IDOKB]     = {X:   8, Y:  40, W:  50, H:  15, Title: "OK",                                Style: WS_TABSTOP | BS_DEFPUSHBUTTON};
aDlg[IDCANCELB] = {X:  66, Y:  40, W:  50, H:  15, Title: "Cancel",                            Style: WS_TABSTOP};

CreateDialogBox(aDlg);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  var nLowParam;
  var i;

  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    //fill ComboBox
    for (i = 0; i < aHex.length; ++i)
      AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 323 /*CB_ADDSTRING*/, 0, aHex[i]);

    AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 334 /*CB_SETCURSEL*/, 0, 0);
  }

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    nLowParam = wParam & 0xFFFF;

    if (nLowParam == IDOKB)
    {
      Action();
      oSys.Call("User32::EndDialog", hWnd, 0);
    }

    else if ((nLowParam == IDCANCELB) || (nLowParam == 2 /*IDCANCEL*/))
      oSys.Call("User32::EndDialog", hWnd, 0);
  }
}

function Action()
{
  var nTextLen   = AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 14 /*WM_GETTEXTLENGTH*/, 0, 0) + 1;
  var lpText     = AkelPad.MemAlloc(nTextLen * 2);
  var sIniString = "";
  var sChar      = "";
  var sHex       = "";
  var i;

  AkelPad.SendMessage(aDlg[IDTEXTCB].HWND, 13 /*WM_GETTEXT*/, nTextLen, lpText);
  sHex = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
  AkelPad.MemFree(lpText);

  if (sHex.length != 4)
  {
    AkelPad.MessageBox(hMainWnd, "Four digits only (0-9, A-F).", "Error", 0x10 /*MB_ICONERROR*/);
  }
  else if (/[^a-f\d]+/i.test(sHex))
  {
    AkelPad.MessageBox(hMainWnd, "Hex digits only (0-9, A-F).", "Error", 0x10 /*MB_ICONERROR*/);
  }
  else
  {
    if (AkelPad.GetEditWnd())
    {
      if(fso.FileExists(pAkelPlugsDir + "\\HexSel.dll"))
      {
        AkelPad.Call("HexSel::Main", 1, 10, "", "", sHex);
      }
      else
      {
        if (sHex = sHex.substr(0, Math.floor(sHex.length / 4) * 4))
        {
          for (i = 0; i < sHex.length; i += 4)
            sChar += String.fromCharCode(parseInt(sHex.substr(i, 4), 16));

          AkelPad.ReplaceSel(sChar);
        }
      }
    }
  }

  //add sHex to aHex & write parameters (aHex and other) to ini file
  if (nArg1 = 1)
  {
    var oFile   = fso.OpenTextFile(WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini", 2, true, -1);
  
    if (sHex != aHex[0])
    {
      sIniString = aHex.unshift(sHex);
    }
    if (aHex.length > nArg2)
    {
      aHex.splice(nArg2, aHex.length)
    }
    sIniString = aHex.join(",");
  
    oFile.Write(sIniString);
    oFile.Close();
  }
}


Есть вопросы, если у кого найдётся свободное вреся:
1. Как не закрывать окно после AkelPad.MessageBox()? Для повторного ввода, понимаю, что нужен цикл, но не понял, как правильно добавить.
2.

Code: Select all

Insert characters from hex codes
Four digits hex codes:
OK
Cancel
Four digits only (0-9, A-F).
Hex digits only (0-9, A-F).
:)
3. Не слишком усложнил?

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

Post by Andrey_A_A »

Перевод нужен?
Skif_off

Error
Ошибка

Four digits only (0-9, A-F).
Только четыре цифры (0-9, A-F).

Hex digits only (0-9, A-F).
Hex только цифры (0-9, A-F).

Four digits hex codes
Четыре цифры шестнадцатеричный код (0-9, A-F)

Insert characters from hex codes
Вставка символа шестнадцатеричного кода

Cancel
Отмена

Ещё нужно, чтобы в историю не входил ошибочный ввод данных:
К примеру я ввёл qwerrtнгншгшщ - выдало ошибку и попало в историю...
Locked