--[[------------------------------------------------------------------------------------------------
Folder Shortcuts Menu v. 2.08 (c) 2013-2015 Smitis
http://forum.farmanager.com/viewtopic.php?t=7873
--]]------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- Настройки.
-- Персональные настройки можно держать в отдельном файле (см. пример FolderShortcutsMenu.example.cfg)
-- Файл должен иметь то же имя, что и файл макроса с расширением cfg (по умолчанию FolderShortcutsMenu.cfg)
----------------------------------------------------------------------------------------------------
local cfg = {}
cfg.file_menu = "Shortcuts.farmenu" -- имя файла меню, если пусто, будет использоваться главное меню
cfg.menu_item = "Shortcuts" -- заголовок меню (на самом деле это имя подменю, которое выводится в заголовок)
cfg.def_name = "FolderShortcuts-" -- начальная часть имени подменю по умолчанию (используется только при создании подменю)
cfg.max_len = 60 -- максимальная длина имени ссылки, длинные имена обрезаются
cfg.add_date = false -- добавлять дату перед именем ссылки
-- Использование глобальной функции
cfg.create_func = false -- создавать глобальную функцию (например, для работы ранее созданных ссылок)
cfg.use_func = false -- использовать глобальную функцию при создании новых ссылок
-- Макросы добавляющие ссылки прямо в пользовательском меню
-- Работают в ЛЮБОМ пользовательском меню!
cfg.add_from_menu = "CtrlShift`" -- для активной панели
cfg.add_from_menu2 = "" -- для обеих панелей
-- Макросы открывающие общее меню
cfg.show_main = "CtrlAlt`" -- из панелей
cfg.show_main_dlg = "" -- из диалогов
cfg.show_main_edt = "" -- из редактора
-- Макросы для открытия списка ссылок
cfg.add_link = "/(R|L)CtrlShift[0-9]/" -- добавить ссылку
cfg.add_link2 = "" -- добавить ссылку на обе панели
cfg.show_sub = "/(R|L)Ctrl(R|L)Alt[0-9]/" -- открыть список ссылок
cfg.show_sub_dlg = "" -- открыть список ссылок из диалога
cfg.show_sub_edt = "" -- открыть список ссылок из редактора
----------------------------------------------------------------------------------------------------
-- Загрузка персональных настроек
----------------------------------------------------------------------------------------------------
cfg.cfg = cfg
do local f,m=loadfile((...):gsub("[^.]+$","cfg"))
if f then setfenv(f,{cfg=cfg,win=win}) if not pcall(f) then msgbox("FSM","\nCONFIG ERROR\n ",1)
end end end
----------------------------------------------------------------------------------------------------
if cfg.use_func or cfg.create_func then -- глобальная функция
_G.ApplyFolderShortcut = function(afolder,aparam,aplugin,ahost,afile,pfolder,pparam,pplugin,phost,pfile)
if Area.Dialog or Area.Editor then
print(afolder)
else
if afolder and panel.SetPanelDirectory(nil,1,{Name=afolder,Param=aparam,PluginId=win.Uuid(aplugin),File=ahost}) then
Panel.SetPos(0,afile)
panel.RedrawPanel(nil,1)
end
if pfolder and panel.SetPanelDirectory(nil,0,{Name=pfolder,Param=pparam,PluginId=win.Uuid(pplugin),File=phost}) then
Panel.SetPos(1,pfile)
panel.RedrawPanel(nil,0)
end
end
end
_G.ApplyFolderShortcut2 = ApplyFolderShortcut
end
----------------------------------------------------------------------------------------------------
local function scmenu_open(common) -- открыть меню
if Area.Search then Keys "Esc" end
if cfg.file_menu and cfg.file_menu:len()>0 then
mf.usermenu(3,cfg.file_menu)
else
mf.usermenu(1)
if Area.Dialog then
Keys("Enter")
else
return
end
end
if Menu.Select(cfg.menu_item,0) == 0 then
-- Создать общее подменю
Keys "Ins Right Enter Tab"
print(cfg.menu_item)
Keys "CtrlEnter"
end
Keys "Enter"
if common then return end
local hk = akey(1):sub(-1)
if Menu.Select(hk.." ",1) > 0 and Menu.ItemStatus() == 65 then
-- Подменю есть - войти
Keys "Enter"
return true
else
-- Подменю нет - добавить
Keys( "Ins Right Enter "..hk.." Tab" )
print( cfg.def_name..hk )
Keys( "CtrlEnter Enter" )
return true
end
return false
end
----------------------------------------------------------------------------------------------------
local function sc_fmt(_dir,_file)
return ('"%s","%s","%s","%s","%s"')
:format(_dir.Name,_dir.Param,win.Uuid(_dir.PluginId),_dir.File,_file)
:gsub("%!","!!")
:gsub("\\","\\\\")
end
----------------------------------------------------------------------------------------------------
local function sc_post(_panel,_dir,_file) -- panel=1 active, 0 passive
local post
if _panel == 1 then -- для активной панели
post = [==[
do
local _folder,_param,_plugin,_host,_file=%s
if Area.Dialog or Area.Editor then
print(_folder)
elseif panel.SetPanelDirectory(nil,1,{Name=_folder,Param=_param,PluginId=win.Uuid(_plugin),File=_host}) then
Panel.SetPos(0,_file)
panel.RedrawPanel(nil,1)
end
end
]==]
else -- для пассивной панели
post = [==[
do
local _folder,_param,_plugin,_host,_file=%s
if not Area.Dialog and not Area.Editor and panel.SetPanelDirectory(nil,0,{Name=_folder,Param=_param,PluginId=win.Uuid(_plugin),File=_host}) then
Panel.SetPos(1,_file)
panel.RedrawPanel(nil,0)
end
end
]==]
end
return post:gsub("[%c%s]+"," "):format(sc_fmt(_dir,_file))
end
----------------------------------------------------------------------------------------------------
local function scmenu_add(both) -- добавить ссылку
if Area.Search then Keys "Esc" end
-- Название пункта меню
local name = APanel.Path0
if APanel.HostFile ~= "" then
name = APanel.HostFile
elseif APanel.Path ~= "" then
name = APanel.Path
end
name = name:match("([^\\/]+)$") -- убрать путь
if cfg.add_date then name=os.date("%Y-%m-%d ")..name end
name = name:sub(1,cfg.max_len):gsub("%!","!!")
-- Команда меню
local post = "lua:"
local fun = both and "ApplyFolderShortcut2" or "ApplyFolderShortcut"
if cfg.use_func then -- с использованием глобальной функции
post = post.." "..fun.."("..sc_fmt(panel.GetPanelDirectory(nil,1),panel.GetCurrentPanelItem(nil,1).FileName)
if both then
post = post..","..sc_fmt(panel.GetPanelDirectory(nil,0),panel.GetCurrentPanelItem(nil,0).FileName)
end
post = post..")"
else -- без использования глобальной функции
post = post..sc_post(1,panel.GetPanelDirectory(nil,1),panel.GetCurrentPanelItem(nil,1).FileName)
if both then post = post..sc_post(0,panel.GetPanelDirectory(nil,0),panel.GetCurrentPanelItem(nil,0).FileName) end
end
-- Вставка пункта меню
Keys "Ins Enter Tab" print(name) Keys "Tab"
print(post)
Keys "CtrlEnter"
end
----------------------------------------------------------------------------------------------------
if cfg.show_sub and cfg.show_sub~="" then
Macro { -- Показать подменю
description="Folder Shortcuts Menu: Show";
area="Shell Search QView Info Tree";
uid="BF734595-2704-437A-AF59-3B4C6CF1E82E";
key=cfg.show_sub;
action=scmenu_open;
}
end
----------------------------------------------------------------------------------------------------
if cfg.show_sub_dlg and cfg.show_sub_dlg~="" then
Macro { -- Показать подменю из диалога
description="Folder Shortcuts Menu: Show";
area="Dialog";
uid="75110493-9021-4C33-BFDE-F1A4E6B58184";
condition=function()
return Area.Dialog and (Dlg.ItemType==4 or Dlg.ItemType==6)
end;
key=cfg.show_sub_dlg;
action=scmenu_open;
}
end
----------------------------------------------------------------------------------------------------
if cfg.show_sub_edt and cfg.show_sub_edt~="" then
Macro { -- Показать подменю из диалога
description="Folder Shortcuts Menu: Show";
area="Editor";
uid="0227BA3D-8EDA-46AE-9994-B4FD5135C0A1";
key=cfg.show_sub_edt;
action=scmenu_open;
}
end
----------------------------------------------------------------------------------------------------
if cfg.add_link and cfg.add_link~="" then
Macro { -- Добавить ссылку для активной панели
description="Folder Shortcuts Menu: Add shortcut";
area="Shell Search QView Info Tree";
uid="9E1AD1BF-AA40-4B6F-945D-2BA53A93AD60";
key=cfg.add_link;
action=function()
if scmenu_open() then
scmenu_add(false)
Keys "ShiftF10"
end
end;
}
end
----------------------------------------------------------------------------------------------------
if cfg.add_link2 and cfg.add_link2~="" then
Macro { -- Добавить ссылку для обеих панелей
description="Folder Shortcuts Menu: Add shortcut 2";
area="Shell Search QView Info Tree";
uid="16487E98-38CA-4D6F-BE27-F04636890858";
key=cfg.add_link2;
action=function()
if Area.Search then Keys "Esc" end
if scmenu_open() then
scmenu_add(true)
Keys "ShiftF10"
end
end;
}
end
----------------------------------------------------------------------------------------------------
if cfg.show_main and cfg.show_main~="" then
Macro { -- Показать общее меню
description="Folder Shortcuts Menu: Show common";
area="Shell Search QView Info Tree";
uid="9D3ED069-AD8B-4322-B2FB-57F0714AF623";
key=cfg.show_main;
action=function()
scmenu_open(true)
end;
}
end
----------------------------------------------------------------------------------------------------
if cfg.show_main_dlg and cfg.show_main_dlg~="" then
Macro { -- Показать общее меню из диалога
description="Folder Shortcuts Menu: Show common";
area="Dialog";
uid="1CE042B6-B4AD-4086-AC71-421A957C4BE8";
condition=function()
return Area.Dialog and (Dlg.ItemType==4 or Dlg.ItemType==6)
end;
key=cfg.show_main_dlg;
action=function()
scmenu_open(true)
end;
}
end
----------------------------------------------------------------------------------------------------
if cfg.show_main_edt and cfg.show_main_edt~="" then
Macro { -- Показать общее меню из редактора
description="Folder Shortcuts Menu: Show common";
area="Editor";
uid="9E405664-B7FF-4DAA-A01A-C26D7B7AD015";
key=cfg.show_main_edt;
action=function()
scmenu_open(true)
end;
}
end
----------------------------------------------------------------------------------------------------
if cfg.add_from_menu and cfg.add_from_menu~="" then
Macro { -- Добавить в открытое меню
description="Folder Shortcuts Menu: Add shortcut";
area="UserMenu";
uid="D7C1870E-2434-4640-B9DD-AFF120CC5203";
key=cfg.add_from_menu;
action=function()
scmenu_add(false)
end;
}
end
----------------------------------------------------------------------------------------------------
if cfg.add_from_menu2 and cfg.add_from_menu2~="" then
Macro { -- Добавить в открытое меню для обеих панелей
description="Folder Shortcuts Menu: Add shortcut 2";
area="UserMenu";
uid="E9725979-5D60-487E-BF1C-E3ACE3C68289";
key=cfg.add_from_menu2;
action=function()
scmenu_add(true)
end;
}
end
----------------------------------------------------------------------------------------------------