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

2006-2016 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)


*** 描述 ***

显示可自定义的工具栏菜单。

备注:
- 鼠标右键点击（或按下 Ctrl + 鼠标左键点击）工具栏按钮将打开选定按钮代码的参数对话框。


*** 函数 ***

ToolBar::Main
启动和停止插件的主函数。


*** 语法 ***

变量:
  %f 活动文件
  %d 活动文件所在目录
  %a AkelPad 所在目录
  %m 菜单 ID (句柄)
  %i 菜单项目 ID
  %bl 被按下按钮在屏幕坐标上的左面
  %bt 被按下按钮在屏幕坐标上的顶部
  %br 被按下按钮在屏幕坐标上的右面
  %bb 被按下按钮在屏幕坐标上的底部
  %% 符号 %
  %系统变量%

注释:
  # 注释
  ; 注释

特殊项目:
  SEPARATOR
    按钮分隔符。
  SEPARATOR1
    与 SEPARATOR 相同，但如果序列中指定多个的 SEPARATOR1，那么将被合并成单一一个 SEPARATOR1。
  BREAK
    之后的按钮在新一行 (新一排的创建)。如果一个按钮在一个 SEPARATOR 之前，新一行将会被 SEPARATOR 所分隔。BREAK 仅适用于水平工具栏。
  SET(标记[, 附加参数])
    设置文字解析标记 (已经设置的标记不会被删除)。根据下列数字之和来设置:
      SET(1)
        SDI 模式时忽略下面的行。
      SET(2)
        MDI 模式时忽略下面的行。
      SET(4)
        PMDI 模式时忽略下面的行。
      SET(32, "%a\AkelFiles\Plugs\Scripts.dll")
        如果“Scripts.dll”文件存在就解析下面的行。
      SET(64, If("expression"[, IfTrue, IfFalse]))
        如果结果不等于零就解析下面的行。
          "expression"
            表达式可以由下列组成:
            - 数学运算符:
              +, -, *, /, %, &, |, ^.
            - 逻辑运算符:
              >, <, ==, !=, >=, <=, &&, ||, x?y:z.
            - 注释:
              /*注释*/
            - 方法:
              SendMain(nMessage, wParam, lParam)
                nMessage
                  指定要发送给主窗口的消息。
                wParam
                  指定额外消息特定信息。
                lParam
                  指定额外消息特定信息。
              SendEdit(nMessage, wParam, lParam)
                nMessage
                  指定要发送给当前编辑窗口的消息。
                wParam
                  指定额外消息特定信息。
                lParam
                  指定额外消息特定信息。
              Call("Plugin::Function"[, 附加参数])
                - 如果调用一个插件，那么通过指定的参数 &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);')`)
                    若当前文档已命令就解析下面的行。
                - It is possible to call Scripts plugin method directly.
                  SET(64, If(`AkelPad.Constants._X64 == 1`))
                    若程序为 x64 就解析下面的行。
          IfTrue
            数值，如果表达式结果为真 (不等于零)。
          IfFalse
            数值，如果表达式结果为假 (等于零)。
        SET(64, If(`SendMain(1222 /*AKD_GETMAININFO*/, 5 /*MI_SAVESETTINGS*/, 0) == 2 /*SS_INI*/`))
          如果设置是保存到 ini 文件就解析下面的行。
      SET(128, If("expression"[, IfTrue, IfFalse]))
         设置按钮状态。
          "expression"
            请参阅 SET(64) 的说明。禁止在 SET(128) 里执行脚本。
          IfTrue
            0x0 //IFS_NORMAL    标准。
            0x1 //IFS_CHECKED   复选。
            0x2 //IFS_GRAYED    禁用变灰。
          IfFalse
            0x0 //IFS_NORMAL    标准。
            0x1 //IFS_CHECKED   复选。
            0x2 //IFS_GRAYED    禁用变灰。
        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() | Menu()] Icon()

  [-]"[按钮文字]"
    "我的按钮"
      移动鼠标到该按钮时出现在屏幕提示的文字。
    -"我的按钮"
      有负号的按钮的状态不会被某种方法所改变(变为不可用，选上)。
    ""
      按钮无文字也可以被方法 Command() 所使用，插件将使用 Command() 所引用的主菜单项目的文字来代替。

    Command(数字)
      Command(4162)
        方法调用 4162 的内部命令。本例子的这个代码用来打开 "转到行..." 对话框。
        查阅 AkelHelp-Eng.htm 或插件源码中的 AkelDLL.h 可了解完整的命令列表。
    Call("插件::函数"[, 附加参数])
      Call("Scripts::Main")
        方法将调用脚本插件的主函数。
    +Call("插件::函数"[, 附加参数])
      +Call("LineBoard::Main")
        方法将调用 LineBoard 插件的主函数。插件仍会在程序重启后运行。
    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
        文件字节顺序标记。如果 -1 或未指定表示自动检测。
      OpenFile("C:\File.txt", 65001, -1)
        方法将使用 UTF-8 代码页打开文件。
    SaveFile("文件"[, 使用代码页][, 使用BOM])
      "文件"
        保存当前的文档到指定的文件名。
      使用代码页
        代码页。如果 -1 或未指定表示将会使用当前的代码页。
      使用BOM
        字节顺序标记。1 表示存在，0 表示不存在，-1 表示未指定将会使用当前的 BOM。
      SaveFile("C:\File.txt", 65001, 0)
        方法将使用无 BOM 的 UTF-8 代码页保存文件。
    Font("字体", 字形, 大小)
      "字体"
        字体, 例如："Courier". "" 表示不改变。
      字形 (下列之一):
        0  忽略.
        1  常规.
        2  粗体.
        3  斜体.
        4  粗斜体.
      大小
        字体大小. 0 表示不改变。
      Font("Courier", 4, 10)
        方法将设置 Courier 粗斜体，大小 10 pt.
    Recode(源编码, 目标编码)
      源编码
      来源代码页。值为 -1 表示自动检测。
      目标编码
      目标代码页。值为 -1 表示自动检测。
      Recode(1252, 437)
        方法将重新编码文字的代码页从 1252 到 437。
    Insert("文字"[, 转义符序列])
      "文字"
        要插入的文字。
      转义符序列:
        0 - "文字" 不包含转义符序列 (默认值)。
        1 - "文字" 包含转义符序列。
           转义符序列集与程序的查找/替换对话框的相同，并且:
           "\s" - 将替换为编辑窗口中的选定区域的文字；
           "\|" - 设置插入点的位置在插入文本之后。
      Insert("一些字符串")
        方法将用指定的文字替换选定区域。
      Insert("<B>\s</B>", 1)
        方法将围起选定区域。
      Insert("\[0031 0032 0033]", 1)
        方法将替换选定区域为 "123"。

    Menu("菜单名")
      "菜单名"
        指定来自 "ContextMenu::Show menu" (ContextMenu 插件) 的子菜单名。
        如果方法作为额外的方法来使用，象 Command()，菜单将会通过下拉箭头弹出。
        如果方法作为单一方法来使用，那么不绘制下拉箭头，菜单将会在按钮被点击时弹出。
        例:
          1. 创建新按钮。
               "特殊字符" +Call("SpecialChar::Main") Menu("SPECIALCHAR") Icon("%a\AkelFiles\Plugs\SpecialChar.dll", 0)
          2. 创建新子菜单。通过打开 "主菜单->选项->插件...->ContextMenu::Main",
             选择 "ContextMenu::Show menu" 并添加子菜单代码:
               "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")
  -"拼写检查" Call("Scripts::Main", 1, "SpellCheck.js", "")
  "语法高亮显示" +Call("Coder::Highlight")
  "注册表编辑器" Exec("regedit.exe") Icon("regedit.exe")


*** 外部调用 ***

Call("ToolBar::Main", 1, "ROWS(SHOW)")
  参数:
    1
      指定排的打开工具栏。请参阅 BREAK 的说明。
       如果 ToolBar 已经打开，那么:
       - 如果指定排的字串等于活动的，该面板将会被关闭;
       - 如果指定排的字串不等于活动的，原打开的仍保持，并激活新的排集。
    "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  由插件绘制的非激活按钮上的图标。
