*****************************************************************
***                  Log AkelPad plugin v5.2                  ***
*****************************************************************

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


*** 描述 ***

监视日志或实时捕捉应用程序的输出。


*** 函数 ***

Log::Watch
监视日志。

Log::Output
捕捉输出。

Log::Settings
设置对话框。


*** 外部调用 Log::Output ***

Call("Log::Output", 1, "PROGRAM", "WORKDIR", "REPATTERN", "RETAGS", INPUTCODEPAGE, OUTPUTCODEPAGE, FLAGS, "ALIAS")
  参数:
    1
      执行应用程序并捕捉输出。
    "PROGRAM"
      要执行的文件。可以为 "", 如果需要请更改 "REPATTERN" 和 "RETAGS"。
    "WORKDIR"
      工作目录。
    "REPATTERN"
      正则表达式模式。可应用于从面板中的每一行跳转到编辑区中的文本。
    "RETAGS"
      模式匹配图。
        /FILE=\1         要跳转到的文件。
        /GOTOLINE=\2:\3  要跳转到的行和列。
        /GOTOBYTE=\2     要跳转到的字节偏移。
        /GOTOCHAR=\2     要跳转到的字符偏移。
        /FRAME=\1        要跳转到的帧数据句柄。
    INPUTCODEPAGE
      向执行文件输入的文本的代码页。
      If -1, 自动检测代码页。
      If -2 或未指定，将使用插件设置中的代码页。
    OUTPUTCODEPAGE
      从可执行文件输出的文本的代码页。
      If -1, 自动检测代码页。
      If -2 或未指定，将使用插件设置中的代码页。
    FLAGS (下列值之和):
         1  不创建输出面板。
         2  隐藏输入行。
         4  在执行之前保存所有文档。
         8  添加文本到末尾。
        16  不滚动到末尾。
        32  自动换行。
        64  创建，但不显示输出面板。需要关闭命令: Call("Log::Output", 6)。
       128  如果应用程序退出代码等于零就关闭输出面板。

      4096  来源输入 - 选区或所有文档（选区为空时）。
      8192  来源输入 - 所有文档。
     16384  来源输入 - 选区。
            默认值: 不使用来源输入。

   1048576  输出目标 - 选定区域，若选区为空则为所有文档。
   2097152  输出目标 - 当前文档。
   4194304  输出目标 - 当前文档选区。
   8388608  输出目标 - 新建标签。
            默认值: 输出目标 - 界面面板。
    "ALIAS"
      Coder 插件主题的别名，如: ".html"。默认情况是不使用。

  例 (输出到 输出面板):
    Call("Log::Output", 1, `tracert akelpad.sourceforge.net`)
  例 (输出到选区而不是 输出面板):
    Call("Log::Output", 1, `ipconfig`, "", "", "", -1, -1, 1048577)
  例 (执行编译的批处理文件):
    Call("Log::Output", 1, `"%d\Build.cmd" /S`, "%d", "^\s*(.*)[(:](\d+)([,:](\d+))?[):]", "/FILE=\1 /GOTOLINE=\2:\4", -2, -2, 4)

Call("Log::Output", 2, *WINDOW, *DOCK)
  参数:
    2
      获取文本输出窗口的句柄。在 Scripts 插件中使用。
    *WINDOW
      指针指向一个接收文本输出窗口句柄的变量。
    *DOCK
      指针指向一个接收指向 DOCK结构的指针的变量。
  例:
    WScript.Echo(GetOutputWindow());

    function GetOutputWindow()
    {
      var lpWnd;
      var hWnd=0;

      if (lpWnd=AkelPad.MemAlloc(_X64?8:4 /*sizeof(HWND)*/))
      {
        AkelPad.Call("Log::Output", 2, lpWnd);
        hWnd=AkelPad.MemRead(lpWnd, 2 /*DT_QWORD*/);
        AkelPad.MemFree(lpWnd);
      }
      return hWnd;
    }

Call("Log::Output", 3, *EXECSTATE, *PLUGINTHREAD, *PROCESSHANDLE, *PROCESSID, *EXITCODE)
  参数:
    3
      获得关于当前可执行应用程序的信息。在 Scripts 插件中使用。
    *EXECSTATE
      指针指向一个接收执行状态的变量。可以为 NULL。
      等于下列值之和:
        0  空闲状态。
        1  执行命令已收到。
        2  插件线程已创建，因此应用程序将会被执行。
        4  应用程序已被执行并且正在运行中。
    *PLUGINTHREAD
      指针指向一个从被执行的应用程序接收插件线程句柄的变量。可以为 NULL。
    *PROCESSHANDLE
      指针指向一个接收被执行的应用程序的进程句柄的变量。可以为 NULL。
    *PROCESSID
      指针指向一个接收被执行的应用程序的进程 ID 的变量。可以为 NULL。
    *EXITCODE
      指针指向一个接收被执行应用程序退出码的变量，可以为 NULL。
  例:
    WScript.Echo(GetExecState());

    function GetExecState()
    {
      var lpState;
      var nState=0;

      if (lpState=AkelPad.MemAlloc(4 /*sizeof(DWORD)*/))
      {
        AkelPad.Call("Log::Output", 3, lpState);
        nState=AkelPad.MemRead(lpState, 3 /*DT_DWORD*/);
        AkelPad.MemFree(lpState);
      }
      return nState;
    }

Call("Log::Output", 4, "TEXT", TEXTLEN, APPEND, CODEPAGE, "ALIAS")
  参数:
    4
      设置/添加输出面板中的文本。在 Scripts 插件中使用。
    "TEXT"
      要插入的文本。
    TEXTLEN
      文本长度 (默认值为 -1)。如果等于 -1，文本字串在遇到 NULL 符号时终止。
    APPEND (下列之一):
      0 替换输出面板中的所有文本。
      1 在输出面板中添加文本 (默认值)。
      2 在输出面板中新起行添加文本。
    CODEPAGE
      ANSI 文本代码页。默认值为 零，使用 ANSI 系统代码页。若文本为 Unicode 时不能用。
    "ALIAS"
      Coder 插件主题的别名，如: ".html"。默认情况是不使用。

Call("Log::Output", 5, "TEXT", TEXTLEN, APPEND)
  与 4 相同。仅兼容性保留。

Call("Log::Output", 6)
  参数:
    6
      关闭输出面板。
  例 (使用函数 GetOutputWindow 和 GetExecState):
    WScript.Echo(GetStdOut("ipconfig"));

    function GetStdOut(pCmd)
    {
      var hWndOutput=GetOutputWindow();
      var pStdOut="";
      var bClose=true;

      AkelPad.Call("Log::Output", 1, pCmd, "", "", "", -1, -1, 64);
      while (GetExecState())
        WScript.Sleep(100);

      if (hWndOutput)
        bClose=false;
      else
        hWndOutput=GetOutputWindow();

      if (hWndOutput)
      {
        AkelPad.SetEditWnd(hWndOutput);
        pStdOut=AkelPad.GetTextRange(0, -1);
        AkelPad.SetEditWnd(0);
        if (bClose) AkelPad.Call("Log::Output", 6);
      }
      return pStdOut;
    }


*** 外部调用 Log::Settings ***

Call("Log::Settings", 1, PAGE)
  参数:
    1
      打开设置对话框的指定页面。
    PAGE
      零 时基于页面索引。
