*****************************************************************
***                ToolBar AkelPad plugin v12.5               ***
*****************************************************************

2006-2016 Шенгальц Александр aka Instructor (Shengalts@mail.ru)


*** Описание ***

Добавляет настраиваемую панель инструментов.


Замечания:
- Правый клик мыши (либо левый клик мыши с удерживанием клавиши Ctrl) по кнопке
  на панели инструментов открывает диалог настроек с отмеченным кодом кнопки.


*** Функции ***

ToolBar::Main
Главная функция для запуска и остановки плагина.


*** Синтаксис ***

Переменные:
  %f  активный файл
  %d  директория активного файла
  %a  директория AkelPad'а
  %m  идентификатор панели инструментов (handle)
  %i  идентификатор кнопки
  %bl левый угол нажатой кнопки в экранных координатах
  %bt верхний угол нажатой кнопки в экранных координатах
  %br правый угол нажатой кнопки в экранных координатах
  %bb нижний угол нажатой кнопки в экранных координатах
  %% символ %
  %системная переменная%

Комментарии:
  # комментарий
  ; комментарий

Специальные пункты:
  SEPARATOR
    кнопка разделитель.
  SEPARATOR1
    тоже, что и SEPARATOR, но, если указано несколько SEPARATOR1 подряд, то сливается в один SEPARATOR1.
  BREAK
    перенос последующих кнопок на новую строку (создание нового ряда). Если кнопке предшествует SEPARATOR, то новая
    строка будет отделена разделителем. BREAK работает только при горизонтальном расположении панели.
  SET(флаги[, дополнительные параметры])
    устанавливает флаг обработки текста (не отменяет уже установленные). Задается суммой членов:
      SET(1)
        игнорировать последующие строки, если используется режим SDI.
      SET(2)
        игнорировать последующие строки, если используется режим MDI.
      SET(4)
        игнорировать последующие строки, если используется режим PMDI.
      SET(32, "%a\AkelFiles\Plugs\Scripts.dll")
        обрабатывать последующие строки, если файл "Scripts.dll" найден.
      SET(64, If("выражение"[, ЕслиИстина, ЕслиЛожь]))
        обрабатывать последующие строки, если результат не равен нулю.
          "выражение"
            Выражение может содержать:
            - математические операции:
              +, -, *, /, %, &, |, ^.
            - логические операции:
              >, <, ==, !=, >=, <=, &&, ||, x?y:z.
            - комментарии:
              /*комментарий*/
            - методы:
              SendMain(nMessage, wParam, lParam)
                nMessage
                  Сообщение, которое посылается главному окну программы.
                wParam
                  Дополнительная информация.
                lParam
                  Дополнительная информация.
              SendEdit(nMessage, wParam, lParam)
                nMessage
                  Сообщение, которое посылается текущему окну редактирования.
                wParam
                  Дополнительная информация.
                lParam
                  Дополнительная информация.
              Call("Плагин::Функция"[, дополнительные параметры])
                - Если вызывается плагин, то код выхода передаётся через специальный параметр &nResult. &nResult должен находится на месте, где синтаксис внешнего вызова требует указатель на число.
                  SET(64, If(`Call("Coder::CodeFold", 1, &nResult)`)
                    обрабатывать последующие строки, если открыто окно CodeFold.
                - Если вызывается скрипт, то необходимо использовать внешние вызовы 2 или 4, а также передавать код выхода из скрипта через AkelPad.ScriptExitCode.
                  SET(64, If(`Call("Scripts::Main", 4, "EvalCmd.js", 'if (AkelPad.GetEditFile(0)) AkelPad.ScriptExitCode(1);')`)
                    обрабатывать последующие строки, если текущий документ имеет имя.
                - Возможно вызывать метод Scripts плагина напрямую. Разрешено в SET(128).
                  SET(64, If(`AkelPad.Constants._X64 == 1`))
                    обрабатывать последующие строки, если программа имеет битность x64.
          ЕслиИстина
            Числовое значение, если результат выражения - истина (не равен нулю).
          ЕслиЛожь
            Числовое значение, если результат выражения - ложь (равен нулю).
        SET(64, If(`SendMain(1222 /*AKD_GETMAININFO*/, 5 /*MI_SAVESETTINGS*/, 0) == 2 /*SS_INI*/`))
          обрабатывать последующие строки, если настройки сохраняются в ini файл.
      SET(128, If("выражение"[, ЕслиИстина, ЕслиЛожь]))
        установить статус кнопки.
          "выражение"
            См. описание SET(64). В SET(128) вызов скрипта запрещён.
          ЕслиИстина
            0x0 //IFS_NORMAL    Обычный пункт.
            0x1 //IFS_CHECKED   Отмеченный (вдавленный) пункт.
            0x2 //IFS_GRAYED    Неактивный, серый пункт.
            0x4 //IFS_DISABLED  Неактивный пункт.
          ЕслиЛожь
            0x0 //IFS_NORMAL    Обычный пункт.
            0x1 //IFS_CHECKED   Отмеченный (вдавленный) пункт.
            0x2 //IFS_GRAYED    Неактивный, серый пункт.
            0x4 //IFS_DISABLED  Неактивный пункт.
        SET(128, If("SendMain(1223 /*AKD_GETFRAMEINFO*/, 69 /*FI_CARETOPTIONS*/, 0) & 0x2 /*CO_CARETVERTLINE*/", 0x1, 0x0))
          отметить последующие пункты, если включен активный столбец.
        SET(128, If(`Call("Scripts::Main", 5, "SearchReplace.js", 2 /*SH_THISSCRIPT*/, &nResult)`, 0x1, 0x0))
          отметить последующие пункты, если работает скрипт SearchReplace.js.
        SET(128, If(`AkelPad.IsPluginRunning("Coder::HighLight")`, 0x1, 0x0))
          отметить последующие пункты, если работает Coder::HighLight.
UNSET(128)
  UNSET(флаги)
    снимает флаг обработки текста. См. SET() для описания.

Создание кнопки:
  [-]"[текст кнопки]" [Command() | Call() | +Call() | Exec() | OpenFile() | SaveFile() | Font() | Recode() | Insert() | Menu()] Icon()

  [-]"[текст кнопки]"
    "Моя кнопка"
      текст появляющийся во всплывающей подсказке, при наведении мышкой на кнопку.
    -"Моя кнопка"
      при наличии знака минуса, кнопка не будет каким-либо образом менять свой статус
      (становиться неактивной, вдавливаться).
    ""
      при отсутствии текста кнопки, а также использовании метода Command(), берется текст
      пункта главного меню, на который ссылается метод Command().

    Command(номер)
      Command(4162)
        метод вызывает внутреннюю команду под номером 4162. В данном случае этот код
        отвечает за открытие диалогового окна "Перейти к строке...".
        Для полного перечня команд: см. AkelHelp-Rus.htm или AkelDLL.h в исходных кодах плагина.
    Call("Плагин::Функция"[, дополнительные параметры])
      Call("Scripts::Main")
        метод вызывает плагин Scripts и функцию Main.
    +Call("Плагин::Функция"[, дополнительные параметры])
      +Call("LineBoard::Main")
        метод вызывает плагин LineBoard и функцию Main. Плагин также будет работать после
        перезагрузки программы.
    Exec("командная строка"[, "рабочая директория"][, Ожидать][, СтильОкна])
      "командная строка"
        Командная строка.
      "рабочая директория"
        Рабочая директория. По умолчанию "".
      Ожидать
        Ожидать завершения программы. 1 - ожидать, 0 - не ожидать (по умолчанию).
      СтильОкна (один из следующих):
        0 скрытое окно.
        1 окно как есть (по умолчанию).
        2 свернутое окно.
        3 развернутое окно.
        6 свернутое, не активное окно.
        9 не развернутое окно.
        Замечание: программы могут игнорировать данный параметр.
      Exec("notepad.exe")
        метод вызывает блокнот.
      Exec(`notepad.exe`)
        метод вызывает блокнот.
      Exec('notepad.exe')
        метод вызывает блокнот.
      Exec('%windir%\notepad.exe')
        метод вызывает блокнот.
      Exec(`rundll32.exe shell32,ShellExec_RunDLL "%f"`, "%d")
        метод передает активный файл для открытия по ассоциации Windows.
    OpenFile("файл"[, Кодировка][, СигнатураBOM])
      "файл"
        Файл для открытия.
      Кодировка
        Кодировка открытия. Если -1 либо не указана, она будет определена автоматически.
      СигнатураBOM
        Сигнатура BOM файла. Если -1 либо не указана, она будет определена автоматически.
      OpenFile("C:\File.txt", 65001, -1)
        метод открывает файл в кодировке UTF-8.
    SaveFile("файл"[, Кодировка][, СигнатураBOM])
      "файл"
        Сохранение текущего документа в указанный файл.
      Кодировка
        Кодировка сохранения. Если -1 либо не указана, будет использована текущая кодировка.
      СигнатураBOM
        Сигнатура BOM файла. 1 - присутствует, 0 - отсутствует, -1 либо не указана - используется текущий BOM.
      SaveFile("C:\File.txt", 65001, 0)
        метод сохраняет файл в кодировке UTF-8 без BOM.
    Font("Шрифт", Начертание, Размер)
      "Шрифт"
        Имя шрифта, например, "Courier". Не изменяется, если "".
      Начертание (одно из следующих):
        0  игнорировать.
        1  обычный шрифт.
        2  жирный шрифт.
        3  курсивный шрифт.
        4  жирный курсивный шрифт.
      Размер
        Размер шрифта. Не изменяется, если 0.
      Font("Courier", 4, 10)
        метод устанавливает жирный курсив Courier шрифт размером 10 pt.
    Recode(ПерекодироватьИз, ПерекодироватьВ)
      ПерекодироватьИз
        Кодировка источник. Если -1, она будет определена автоматически.
      ПерекодироватьВ
        Кодировка приемник. Если -1, она будет определена автоматически.
      Recode(1251, 866)
        метод перекодирует текст из кодировки 1251 в 866.
    Insert("текст"[, Esc-последовательности])
      "текст"
        Вставляемый текст.
      Esc-последовательности:
        0  "текст" не содержит Esc-последовательностей (по умолчанию).
        1  "текст" содержит Esc-последовательности. Набор последовательностей аналогичен
           диалогу поиска/замены в программе, а также:
           "\s" - заменяется на выделенный в окне редактирования текст;
           "\|" - указывает на положение каретки после вставки текста.
      Insert("Некая строка")
        метод заменяет выделение на указанный текст.
      Insert("<B>\s</B>", 1)
        метод добавляет к выделению текст по краям.
      Insert("\[0031 0032 0033]", 1)
        метод заменяет выделение на "123".

    Menu("ИМЯ МЕНЮ")
      "ИМЯ МЕНЮ"
        Название подменю из "Меню ContextMenu::Show" (ContextMenu плагин).
        Если метод используется как дополнительный, например с Command(), то меню отображается по нажатию на стрелочку.
        Если метод используется один, то стрелочка не рисуется и меню отображается по нажатию на кнопку.
        Пример:
          1. Создадим новую кнопку.
               "Специальные символы" +Call("SpecialChar::Main") Menu("SPECIALCHAR") Icon("%a\AkelFiles\Plugs\SpecialChar.dll", 0)
          2. Создадим новое подменю. Для этого откроем "Главное меню->Настройки->Плагины...->ContextMenu::Main",
             выберем "Меню ContextMenu::Show" и добавим код подменю:
               "SPECIALCHAR"
               {
                 "Настроить..." Call("SpecialChar::Settings")
               }

    Icon(["файл"][, индекс])
      Icon("Shell32.dll", 47)
        иконка находится в файле Shell32.dll под индексом 47.
      Icon("%a\AkelFiles\Plugs\Explorer.dll")
        иконка находится в файле Explorer.dll под индексом 0.
      Icon("%a\AkelFiles\Plugs\Toolbar\MyIcon.ico")
        иконка находится в файле MyIcon.ico.
      Icon(12)
        иконка находится в файле ToolBar.dll под индексом 12.

Примеры:
  "Перекодировать выделение" Command(4182) Icon(0)
  "" Command(4182) Icon(0)
  "Сортировать строки" Call("Format::LineSortStrAsc") Icon(0)
  -"Проверить орфографию" Call("Scripts::Main", 1, "SpellCheck.js", "") Icon(0)
  "Подсветка синтаксиса" +Call("Coder::Highlight") Icon(0)
  "Редактор реестра" Exec("regedit.exe") Icon("regedit.exe")


*** Внешний вызов ***

Call("ToolBar::Main", 1, "ROWS(SHOW)")
  Параметры:
    1
      Открыть панель инструментов с указанными рядами. См. описание BREAK.
      Если панель уже открыта, то:
      - Если указанная строка рядов совпадает с активной, то панель закрывается;
      - Если указанная строка рядов не совпадает с активной, то панель остается открытой и устанавливается новый набор рядов.
    "ROWS(SHOW)"
      Строка с номерами рядов и их видимости (опционально) через запятую. Например: "1,2,4" или "1(1),2(-1),4".
      Если "", то отображаются все ряды.
      ROWS
        Номер ряда.
      SHOW
        Видимость рядов (один из следующих):
          -2  не менять видимость ряда.
          -1  инвертировать видимость ряда.
           0  скрыть ряд.
           1  отобразить ряд (по умолчанию).


*** Ручные установки ***

SidePriority
  Приоритет расположения панелей инструментов (один из следующих):
    1  располагать сначала верхние и нижние, затем левые и правые (по умолчанию).
    2  располагать сначала левые и правые, затем верхние и нижние.
ArrowOverlay
  Наложение стрелки для кнопки с методом Menu() без действия (один из следующих):
   -1  не налагать, но использовать стиль BTNS_WHOLEDROPDOWN.
    0  не налагать.
    1  налагать обычно.
    2  налагать белый как маску, т.е. белый цвет в иконке стрелки исключается из итоговой иконки (по умолчанию).
GrayedIcons
  Отрисовка иконок на неактивных кнопках (один из следующих):
    0  иконки на неактивных кнопках отрисовываются системой (по умолчанию).
    1  иконки на неактивных кнопках отрисовываются плагином.
