PanelControl позволяет запрашивать различную информацию и выполнять управляющие действия над панелями и командной строкой.
intptr_t WINAPI PanelControl( HANDLE hPanel, enum FILE_CONTROL_COMMANDS Command, intptr_t Param1, void *Param2 );
PANEL_ACTIVE, для пассивной - PANEL_PASSIVE. Это позволяет
использовать эту функцию в командах плагина без создания новой панели. Также PANEL_ACTIVE(PANEL_PASSIVE) можно использовать для неплагиновой панели.| Команда | Описание |
|---|---|
| Панель | |
| FCTL_CHECKPANELSEXIST | Проверить доступность панелей.Param1 не используется.Param2 не используется.Функция возвращает FALSE, если Far Manager запущен с ключами /e или /v (в качестве внешнего редактора или программы просмотра). В этом режиме панели не создаются.
|
| FCTL_ISACTIVEPANEL | Проверяет, является ли панель активной.Param1 не используется.Param2 не используется.Функция возвращает FALSE, если панель неактивна. |
| FCTL_CLOSEPANEL | Закрыть текущую панель плагина.Param1 не используется.Param2 указывает на имя каталога, который будет показан в панели после закрытия. |
| FCTL_GETPANELINFO | Получить общую информацию о панели.Param1 не используется.Param2 указывает на структуру PanelInfo, которая получит информацию о панели.В процессе исполнения запроса Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELINFO,0,&PInfo);Far Manager вызывает экспортируемую функцию GetOpenPanelInfoW того плагина, которому принадлежит панель. Far Manager содержит защиту от бесконечной рекурсии: в случае, когда плагин из обработчика GetOpenPanelInfoW() тоже вызывает
Info.PanelControl(...,FCTL_GETPANELINFO), повторного вложенного вызова GetOpenPanelInfoW() не произойдёт.
В некоторых случаях (пример: поиск в архивах по Alt+F7) физически панель плагина не создаётся, поэтому необходимо
обязательно проверять код возврата у |
| FCTL_GETCOLUMNTYPES | Получить строку, описывающую типы колонок.Param1 размер буфера. Указывает максимальное количество символов, которые могут быть записаны в Param2, включая завершающий '\0'.Param2 указывает на буфер, выделяемый плагином, в который будет помещено описание типов колонок (например, такая строка "N,SC,D,T").Функция возвращает необходимый размер буфера в символах, если Param2 = NULL. |
| FCTL_GETCOLUMNWIDTHS | Получить строку, описывающую ширину колонок.Param1 размер буфера в символах. Указывает максимальное количество символов, которые могут быть записаны в Param2, включая завершающий '\0'.Param2 указывает на буфер, выделяемый плагином, в который будет помещено описание ширины колонок (например, такая строка "0,8,0,5").Функция возвращает необходимый размер буфера в символах, если Param2 = NULL. |
| FCTL_GETPANELDIRECTORY | Получить текущий каталог панели.Param1 размер буфера. Начало буфера - структура типа FarPanelDirectory, затем следуют компоненты структуры.Param2 указывает на структуру типа FarPanelDirectory.Функция возвращает необходимый размер буфера, если Param2 = NULL или Param1 меньше реального размера. |
| FCTL_GETPANELFORMAT | Получить формат панели (см. OpenPanelInfo::Format).Param1 размер буфера в символах. Указывает максимальное количество символов, которые могут быть записаны в Param2, включая завершающий '\0'.Param2 указывает на буфер, выделяемый плагином, в который будет помещен формат панели.Если панель не принадлежит плагину, то функция вернет размер пустой строки. Функция возвращает необходимый размер буфера в символах, если Param2 = NULL. |
| FCTL_GETPANELHOSTFILE | Получить имя файла, на основе которого эмулирована файловая система на панели (см. OpenPanelInfo::HostFile).Param1 размер буфера в символах. Указывает максимальное количество символов, которые могут быть записаны в Param2, включая завершающий '\0'.Param2 указывает на буфер, выделяемый плагином, в который будет помещено имя хост-файла.Если панель не принадлежит плагину, то функция вернет размер пустой строки. Функция возвращает необходимый размер буфера в символах, если Param2 = NULL. |
| FCTL_GETPANELITEM | Получить файловый элемент панели.Param1 порядковый номер элемента на панели (подмножество PanelInfo::ItemsNumber).Param2 указывает на структуру типа FarGetPluginPanelItem.Функция возвращает размер запрашиваемого элемента панели PluginPanelItem,
если Примечание: если установить значение
PluginPanelItem PPI; Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELITEM,J,&PPI); Пример корректного использования:
for(int J=0; J < PInfo.ItemsNumber; J++)
{
size_t Size=Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELITEM,J,0);
PluginPanelItem *PPI=(PluginPanelItem*)malloc(Size);
if (PPI)
{
FarGetPluginPanelItem FGPPI={sizeof(FarGetPluginPanelItem),Size,PPI};
Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELITEM,J,&FGPPI);
lstrcpy(CurFile[J],PPI->FileName);
free(PPI);
}
}
Более эффективным при переборе большого количества элементов панели будет иметь на стеке буфер размером,
скажем, 16 КиБ и использовать его, когда этот размер достаточен. В тех же редких случаях, когда это не так,
можно выделять буфер требуемого размера в динамической памяти (и можно также его не освобождать сразу, а
перевыделять по мере необходимости, например, каждый раз не менее чем удваивая размер.)
|
| FCTL_GETPANELPREFIX | Получить префикс плагиновой панели.Param1 размер буфера. Указывает максимальное количество символов, которые могут быть записаны в Param2, включая завершающий '\0'. Param2 указывает на буфер, выделяемый плагином, в который будет помещено значение префикса плагиновой панели (см. PluginInfo::CommandPrefix).Если панель не принадлежит плагину, то функция вернет размер пустой строки. Функция возвращает необходимый размер буфера в символах, если Param2 = NULL. |
| FCTL_GETSELECTEDPANELITEM | Получить выделенный файловый элемент панели.Param1 порядковый номер элемента на панели (подмножество PanelInfo::SelectedItemsNumber).Param2 указывает на структуру типа FarGetPluginPanelItem.Функция возвращает размер запрашиваемого элемента панели PluginPanelItem, если Param2 = NULL. PanelInfo.SelectedItemsNumber равно 1, если не выделено никаких элементов. В этом случае PluginPanelItem содержит данные для
элемента под курсором. Если вы хотите узнать, действительно ли выделен этот файл, то проверьте у него состояние флага |
| FCTL_GETCURRENTPANELITEM | Получить текущий файловый элемент панели.Param1 не используется.Param2 указывает на структуру типа FarGetPluginPanelItem.Функция возвращает размер запрашиваемого элемента панели PluginPanelItem, если Param2 = NULL. |
| FCTL_REDRAWPANEL | Перерисовать панель.Param1 не используется.Param2 указатель на структуру PanelRedrawInfo, которой можно задать новые позиции курсора и верхнего элемента панели. Если Param2 = NULL, то позиции курсора и верхнего элемента панели при прорисовке не изменяются.Панель прорисуется только в случае, если в данный момент панель видна. |
| FCTL_SETACTIVEPANEL | Сделать панель активной.Param1 не используется.Param2 не используется.Функция возвращает FALSE, если hPanel отлична от PANEL_ACTIVE или PANEL_PASSIVE и не принадлежит плагину, или панель в данный момент невидима.Для hPanel = PANEL_ACTIVE никаких действий не происходит, функция вернет TRUE.
Например, установить на пассивной панели каталог TempDirectory и сделать эту панель активной: FarPanelDirectory dirInfo={sizeof(FarPanelDirectory),TempDirectory,nullptr,{0},nullptr};
Info.PanelControl(PANEL_PASSIVE,FCTL_SETPANELDIRECTORY,0,&dirInfo);
Info.PanelControl(PANEL_PASSIVE,FCTL_SETACTIVEPANEL,0,0);
|
| FCTL_SETPANELDIRECTORY | Установить текущий каталог в панели.Param1 не используется.Param2 указывает на структуру типа FarPanelDirectory.Если плагин поддерживает свою собственную панель, он будет закрыт после выполнения этой команды. После выполнения этой функции пропадёт выделение с элементов каталога и его будет невозможно восстановить (комбинация Ctrl+M) по желанию пользователя, даже если новый каталог равен старому. |
| FCTL_BEGINSELECTION, FCTL_ENDSELECTION |
Начать/закончить операцию выделения в панели.Param1 не используется.Param2 не используется.
|
| FCTL_SETSELECTION | Установить выделение в панели.Param1 порядковый номер элемента на панели (подмножество PanelInfo::ItemsNumber).Param2 указывает на переменную типа BOOL (TRUE - выделить элемент, FALSE - снять выделение).
Нужно вызвать Пример:
// начинаем операцию по выделению файлов
Info.PanelControl(PANEL_ACTIVE,FCTL_BEGINSELECTION,0,NULL);
// выделяем
for(int i=0; i < PInfo.ItemsNumber; i++)
{
Info.PanelControl(PANEL_ACTIVE,FCTL_SETSELECTION,i,(void*)TRUE);
}
// завершаем операцию и перерисовываем панель
Info.Control(PANEL_ACTIVE,FCTL_ENDSELECTION,0,NULL);
Info.Control(PANEL_ACTIVE,FCTL_REDRAWPANEL,0,NULL);
|
| FCTL_CLEARSELECTION | Снять выделение с выделенных элементов панели.Param1 порядковый номер элемента на панели (подмножество PanelInfo::SelectedItemsNumber).Param2 не используется.Нужно вызвать
|
| FCTL_SETSORTMODE | Установить режим сортировки для панели.Param1 целое число, содержащее режим сортировки (см. "Режимы сортировки").Param2 не используется. |
| FCTL_SETSORTORDER | Задаёт порядок сортировки для панели.Param1 целое число, содержащее порядок сортировки: 0 или 1 (обратная сортировка).Param2 не используется. |
| FCTL_SETVIEWMODE | Установить режим просмотра панели.Param1 целое число, которое содержит номер нового режима, от 0 до 9.Param2 не используется. |
| FCTL_UPDATEPANEL | Обновить содержимое панели. Если Param1 = 0, текущее выделение файлов будет снято, иначе выделение не изменится.Param2 не используется. |
| FCTL_SETDIRECTORIESFIRST | Задаёт режим отображения каталогов в начале списка файлов.Param1 целое число, 1 - каталоги отображаются в начале списка, 0 - нет.Param2 не используется. |
| Командная строка | |
| FCTL_GETCMDLINE | Получить содержимое командной строки.Param1 размер буфера в символах. Указывает максимальное количество символов, которые могут быть записаны в Param2, включая '\0'.Param2 указывает на буфер, выделяемый плагином, который получит данные.Функция возвращает необходимый размер буфера в символах, если Param2 = NULL. |
| FCTL_GETCMDLINEPOS | Получить позицию курсора в командной строке.Param1 не используется.Param2 содержит указатель на переменную типа int, в которую будет помещена позиция курсора. |
| FCTL_GETCMDLINESELECTION | Получить параметры выделенного текста командной строки.Param1 не используется.Param2 указывает на структуру CmdLineSelect. |
| FCTL_INSERTCMDLINE | Вставить текст в командную строку, начиная с текущей позиции курсора.Param1 не используется.Param2 указывает на строку, оканчивающуюся нулём, которая будет вставлена в командную строку. |
| FCTL_SETCMDLINE | Установить содержимое командной строки.Param1 не используется.Param2 указывает на строку, оканчивающуюся нулём, которая будет помещена в командную строку. |
| FCTL_SETCMDLINEPOS | Установить позицию курсора в командной строке.Param1 содержит переменную с новой позицией курсора.Param2 не используется. |
| FCTL_SETCMDLINESELECTION | Выделить текст командной строки.Param1 не используется.Param2 указывает на структуру CmdLineSelect. |
| Прочие | |
| FCTL_SETUSERSCREEN | Установить обработанную плагином копию Пользовательского экрана под панели Far Manager.Param1: 0 - дополнительно добавить перевод строки (при повторном вызове), 1 - не добавлять.Param2 должен быть NULL. |
| FCTL_GETUSERSCREEN | Предоставить для нужд плагина копию Пользовательского экрана Far Manager (он показывается, когда панели убpаны).Param1: 0 - дополнительно добавить перевод строки, 1 - не добавлять.Param2 должен быть NULL. |
Command выше.Command выше.TRUE, иначе FALSE.