*****************************************************************
***              ContextMenu AkelPad plugin v17.8             ***
*****************************************************************

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


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

Настройка главного меню и контекстного меню для окна
редактирования, MDI вкладок, ссылок и последних файлов.

Замечания:
- Левый клик мыши на не специальных пунктах меню с удерживанием
  клавиши Ctrl открывает диалог настроек с отмеченным кодом пункта.
- Меню для последних файлов не работает в Win95.


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

ContextMenu::Main
Основной диалог.

ContextMenu::Show
Показать пользовательское меню.


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

Переменные:
  %f активный файл
  %d директория активного файла
  %a директория AkelPad'а
  %m идентификатор меню (handle)
  %i идентификатор пункта меню
  %u URL адрес (работает только в "Меню ссылок")
  %% символ %
  %системная переменная%

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

Специальные пункты меню:
  SEPARATOR
    пункт меню разделитель.
  SEPARATOR1
    тоже, что и SEPARATOR, но:
    - если указано несколько SEPARATOR1 подряд, то сливается в один SEPARATOR1;
    - если указан SEPARATOR1 в начале или в конце подменю, то удаляется из подменю.
  EXPLORER
    меню проводника.
  FAVOURITES
    список избранных файлов.
  RECENTFILES
    список последних файлов.
  LANGUAGES
    список языковых модулей.
  OPENCODEPAGES
    список кодировок для переоткрытия файла.
  SAVECODEPAGES
    список кодировок для сохранения файла.
  MDIDOCUMENTS
    список MDI документов (работает только в "Главное меню" в режиме MDI).
  CLEAR
    очистить меню (работает только в "Главное меню").
  INCLUDE("ИМЯ МЕНЮ")
    "ИМЯ МЕНЮ"
      Название подменю из "Меню ContextMenu::Show".
    INCLUDE("SYNTAXTHEME")
      добавляет пункты подменю "SYNTAXTHEME" из "Меню ContextMenu::Show".
  SET(флаги[, дополнительные параметры])
    устанавливает флаг обработки текста (не отменяет уже установленные). Задается суммой членов:
      SET(1)
        игнорировать последующие строки, если используется режим SDI.
      SET(2)
        игнорировать последующие строки, если используется режим MDI.
      SET(4)
        игнорировать последующие строки, если используется режим PMDI.
      SET(8)
        при копировании текста из главного меню, не захватывать горячую клавишу.
      SET(16)
        создать пункты меню без обработки плагином (отключает: иконки, метод Menu(), специальный пункт INCLUDE).
        Необходимо SET(16) располагать до первого пункта меню, а UNSET(16) сразу после последнего.
      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(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).
          ЕслиИстина
            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(флаги)
    снимает флаг обработки текста. См. описание флагов SET().

Создание пункта меню:
  [-]"[текст пункта меню]" [Command() | Call() | +Call() | Exec() | OpenFile() | SaveFile() | Font() | Recode() | Insert() | Link() | Favourites() | 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".
    Link(номер)
      Link(1)
        метод переходит по ссылке (работает только в "Меню ссылок").
      Link(2)
        метод копирует ссылку (работает только в "Меню ссылок").
      Link(3)
        метод выделяет ссылку (работает только в "Меню ссылок").
      Link(4)
        метод вырезает ссылку (работает только в "Меню ссылок").
      Link(5)
        метод заменяет ссылку текстом из буфера обмена (работает только в "Меню ссылок").
      Link(6)
        метод удаляет ссылку (работает только в "Меню ссылок").
    Favourites(номер)
      Favourites(1)
        метод добавляет текущий файл в избранное (с диалогом).
      Favourites(2)
        метод добавляет текущий файл в избранное (без диалога).
      Favourites(3)
        метод открывает диалог управления избранным.
      Favourites(4)
        метод удаляет текущий файл из избранного.
    Menu("ИМЯ МЕНЮ")
      "ИМЯ МЕНЮ"
        Название подменю из "Меню ContextMenu::Show".
      Menu("SYNTAXTHEME")
        метод добавляет подменю "SYNTAXTHEME" из "Меню ContextMenu::Show".

    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)
        иконка находится в файле ContextMenu.dll под индексом 12.

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

Создание подменю:
  "[текст подменю]" [Index() | Break() | Icon()]
  {
  }

  "[текст подменю]"
    "Мое подменю"
      текст подменю.

    Index(номер)
      Index(-1)
        метод вставляет подменю на указанную позицию главного меню, если номер позиции отрицательный, то отсчет производится с конца главного меню.
    Break(номер)
      Break(-1)
        тоже, что и Index(), но подменю вставляется на новую строку главного меню.
    Icon(["файл"][, индекс])
      Icon(0)
        см. описание в создании пункта меню. Метод Icon() не работает для подменю главного меню.

Пример:
  "&Кодировки" Index(-1)
  {
    "Открыть как Windows-1251	Alt+W" Command(4122)
    "Открыть как DOS-866	Alt+D" Command(4123)
    "Открыть как КОИ8-Р 	Alt+K" Command(4124)
    "Открыть как UTF-16LE (стандартная)	Alt+L" Command(4125)
    "Открыть как UTF-16BE	Alt+B" Command(4126)
    "Открыть как UTF-8	Alt+U" Command(4127)
    SEPARATOR
    "&Открыть как" Icon("%a\AkelFiles\Plugs\ToolBar.dll", 36)
    {
      OPENCODEPAGES
    }
    SEPARATOR
    "Сохранить как Windows-1251	Shift+Alt+W" Command(4131)
    "Сохранить как DOS-866	Shift+Alt+D" Command(4132)
    "Сохранить как КОИ8-Р	Shift+Alt+K" Command(4133)
    "Сохранить как UTF-16LE (стандартная)	Shift+Alt+L" Command(4134)
    "Сохранить как UTF-16BE	Shift+Alt+B" Command(4135)
    "Сохранить как UTF-8	Shift+Alt+U" Command(4136)
    "Сохранить как UTF-8 (&без BOM)" Command(4137)
    SEPARATOR
    "&Сохранить как" Icon("%a\AkelFiles\Plugs\ToolBar.dll", 5)
    {
      SAVECODEPAGES
    }
    SEPARATOR
    "Определить кодировку	Alt+F5" Command(4121)
  }


*** Внешний вызов ContextMenu::Main ***

Call("ContextMenu::Main", 1, INDEX, "STRING")
  Параметры:
    1
      Открыть диалог и выбрать меню.
    INDEX
      Номер в списке (по умолчанию 0).
    STRING
      Найти строку и выделить (по умолчанию "").

Call("ContextMenu::Main", 2, OPERATION)
  Параметры:
    2
      Внешний вызов для списка избранных файлов.
    OPERATION
      Номер операции. См. описание метода Favourites().

Call("ContextMenu::Main", 10)
  Параметры:
    10
      Запуск/остановка плагина без диалога.


*** Внешний вызов ContextMenu::Show ***

Call("ContextMenu::Show", 1, "X", "Y", INDEX, "SUBMENU", *MENUHEIGHT)
  Параметры:
    1
      Открыть пользовательское меню на указанной позиции.
    "X"
      X позиция в экранных координатах (по умолчанию "-1").
    "Y"
      Y позиция в экранных координатах (по умолчанию "-1").
    INDEX
      Открыть только указанный номер подменю. Если -1, отображается все меню (по умолчанию).
    "SUBMENU"
      Открыть только указанное по имени подменю. INDEX должен быть равен -1.
    *MENUHEIGHT
      Указатель на память, которая получает высоту меню. Если указан, то меню не открывается.
  Замечания:
    - Если X и Y равны "-1", то используется позиция левого верхнего угла окна редактирования.
    - Если X и Y равны "-2", то используется позиция правого верхнего угла окна редактирования.
    - Если X и Y равны "-3", то используется позиция правого нижнего угла окна редактирования.
    - Если X и Y равны "-4", то используется позиция левого нижнего угла окна редактирования.
    - Если X и Y равны "-5", то используется позиция каретки окна редактирования.
    - Если X и Y равны "-6", то используется позиция курсора.
    - Для открытия первого подменю INDEX равен 0, второго равен 1 и т.д.

Call("ContextMenu::Show", 2, "X", "Y")
  Параметры:
    2
      Открыть главное меню на указанной позиции.
    "X"
      X позиция в экранных координатах (по умолчанию "-1").
    "Y"
      Y позиция в экранных координатах (по умолчанию "-1").
  Замечания:
    - Если X и Y равны "-1", то используется позиция левого верхнего угла окна редактирования.
    - Если X и Y равны "-2", то используется позиция правого верхнего угла окна редактирования.
    - Если X и Y равны "-3", то используется позиция правого нижнего угла окна редактирования.
    - Если X и Y равны "-4", то используется позиция левого нижнего угла окна редактирования.
    - Если X и Y равны "-5", то используется позиция каретки окна редактирования.
    - Если X и Y равны "-6", то используется позиция курсора.
