*****************************************************************
***                  Log AkelPad plugin v5.7                  ***
*****************************************************************

2012-2025 Шенгальц Александр 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
      Кодировка текста для передачи на вход запускаемому файлу.
      Если -1, кодировка будет определена автоматически.
      Если -2 либо не указана, будет использована кодировка из настроек плагина.
    OUTPUTCODEPAGE
      Кодировка текста для получения от запускаемого файла.
      Если -1, кодировка будет определена автоматически.
      Если -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
      Указатель на переменную, которая получает идентификатор процесса запущенного приложения. Может быть 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;
    }

Call("Log::Output::NextMatch")
  Перейти к следующему вхождению.

Call("Log::Output::PrevMatch")
  Перейти к предыдущему вхождению.

Call("Log::Output::RunCmd")
  Выполнить команду.

Call("Log::Output::RunCmdDlg")
  Диалог выполнения команды.


*** Внешний вызов Log::Settings ***

Call("Log::Settings", 1, PAGE)
  Параметры:
    1
      Открыть диалог настроек на указанной странице.
    PAGE
      Номер страницы, начиная с нуля.
