Имеется так же возможность задания конкретного каталога для перехода (не только Desktop текущего пользователя) - достигается путем введения блока конфигурирования плагина. Этим самым "конкретным каталогом" может быть каталог, в котором лежит куча LNK-файлов, связи на папки и файлы, etc.
На данном шаге плагин не создает собственной панели. Работа плагина аналогична команде Far Manager "Ссылки на папки" для одного каталога.
Попробуем решить задачу в лоб, как есть, т.е. в меню дисков и меню выбора плагинов должен появится пункт меню, выбрав который пользователь попадет на свою Доску. Для создания полноценного плагина на данном этапе нам понадобятся 6 экспортируемых функций:
- GetGlobalInfoW - передать в FAR глобальную информацию о плагине (версия, автор, etc.)
- SetStartupInfoW - получить от FAR начальные значения, необходимые плагину
- GetPluginInfoW - передать в FAR информацию о плагине
- ConfigureW - настройки плагина: показывать ли плагин в меню выбора дисков и задание каталога по умолчанию.
- OpenW - пользователь вызвал плагин
- GetFindDataW - передача в FAR нашего каталога для позиционирования на панели
Так же нам нужны будут 3 команды функции управления панелями PanelControl:
- FCTL_SETPANELDIRECTORY - установить нужный нам каталог в панели
- FCTL_REDRAWPANEL - перерисовать панель, чтобы не было артефактов прорисовки
- FCTL_CLOSEPANEL - заставит закрыть текущую панель с указанием каталога назначения
Вариант 1. OPEN_PLUGINSMENU
Пока мы "не знаем" как создавать свою файловую панель (да она нам сейчас и ни к чему), поэтому воспользуемся тем фактом, что в функцию PanelControl первым параметром можно передать значение PANEL_ACTIVE:
Далее все просто. В OpenW для активной панели (PANEL_ACTIVE) установить каталог (FCTL_SETPANELDIRECTORY), обновить панель (FCTL_REDRAWPANEL) и вернуть в FAR значение nullptr (при этом FAR сразу "закроет" плагин):hPanel - Текущий описатель панели. При запросе информации относительно активной панели установите этот параметр равным PANEL_ACTIVE, для пассивной - PANEL_PASSIVE. Это позволяет использовать эту функцию в командах плагина без создания новой панели. Так же PANEL_ACTIVE(PANEL_PASSIVE) можно использовать для неплагиновой панели.
Code: Select all
HANDLE WINAPI OpenW(const struct OpenInfo *OInfo)
{
if(Opt.DefaultFolder[0] != 0)
{
if(OInfo->OpenFrom == OPEN_PLUGINSMENU)
{
FarPanelDirectory dirInfo = {sizeof(dirInfo), Opt.DefaultFolder, nullptr, {}, nullptr};
::Info.PanelControl(PANEL_ACTIVE, FCTL_SETPANELDIRECTORY, 0, &dirInfo);
::Info.PanelControl(PANEL_ACTIVE,FCTL_REDRAWPANEL,0,nullptr);
}
...
}
return nullptr;
}
На данном этапе известно, что FAR вызовет функцию плагина OpenW со значением OpenInfo::OpenFrom, равным OPEN_LEFTDISKMENU или OPEN_RIGHTDISKMENU. В этом случае в FAR необходимо вернуть все, что угодно, кроме nullptr. Для простоты вернем адрес переменной Opt.
Code: Select all
HANDLE WINAPI OpenW(const struct OpenInfo *OInfo)
{
if(Opt.DefaultFolder[0] != 0)
{
...
else if(OInfo->OpenFrom == OPEN_LEFTDISKMENU || OInfo->OpenFrom == OPEN_RIGHTDISKMENU)
{
return (HANDLE)&Opt;
}
}
return nullptr;
}
- нам нужно что-то "сказать", чтобы Far Manager перешел на панели в нужный каталог; это можно сделать с помощью PanelControl(FCTL_CLOSEPANEL,"Каталог")
- нам известно из какого меню (слева или справа) вызван плагин, но неизвестно какая из панелей активна, поэтому простым вызовом PanelControl(PANEL_ACTIVE,FCTL_CLOSEPANEL,"Каталог") не обойтись (в этом случае наш каталог всегда будет позиционироваться на активной панели, т.е. действие аналогичное варианту OPEN_PLUGINSMENU)
- ближайшая функция, которая позволит нам позиционировать каталог с помощью PanelControl(FCTL_CLOSEPANEL,"Каталог") - это GetFindDataW: функция GetFindDataW во-первых будет вызвана тогда, когда FAR будет обновлять панели (т.е. сразу после закрытия меню), во-вторых у нее есть описатель нужной нам панели (здесь знания "активная/не активная" уже не нужны).
Code: Select all
intptr_t WINAPI GetFindDataW(GetFindDataInfo *Info)
{
::Info.PanelControl(Info->hPanel,FCTL_CLOSEPANEL,0,(void*)Opt.DefaultFolder);
return TRUE;
}