--[=[ ----------------------------------------------------------------------------------------------
Работа с описаниями файлов, в том числе и с многострочными
v.2.03 (C) 2013-2015 Smitis
- Замена стандартного диалога редактирования.
- Редактируется описание только текущего элемента панелей, не зависимо от выделения (Выделение сохраняется/восстанавливается через внутренний буфер. Восстановление предыдущего выделения через CtrlM теряется.)
- Возможность редактирования многострочных описаний.
Для работы требуется модуль DialogClass
viewtopic.php?t=8523
Обсуждение макросов для работы с описаниями
viewtopic.php?t=7846
Обсуждение многострочного редактора описаний
viewtopic.php?t=285
--]=] ----------------------------------------------------------------------------------------------
local F = far.Flags
local dialog = require 'DialogClass'
----------------------------------------------------------------------------------------------------
local DescriptionMultiEditId = "75CA1288-4C06-4621-870E-A4FDD9E7319E"
--far.Guids.DescriptionEditId = DescriptionEditId
local HistoryLimitLen = 80 -- описания длиней чем HistoryLimitLen в историю добавляться не будут
local DescriptionPrev = ""
----------------------------------------------------------------------------------------------------
-- Редактирование в окне с рамкой
local MultiEditId = "736B91DE-2525-4296-9529-F0BAD8503B57"
--far.Guids.MultiEditId = MultiEditId
local function MultiEdit(x1,y1,x2,y2,text,title)
dialog.New {
Guid = MultiEditId,
X1=x1, Y1=y1, X2=x2, Y2=y2, Frame=2,
DlgProc = function(hDlg,Msg,Param1,Param2,D,DI)
local coord, hfile, tmpfile
if Msg==F.DN_DRAWDIALOGDONE then
coord = D:Send(F.DM_GETDLGRECT,0,0)
tmpfile = far.MkTemp()
hfile = io.open(tmpfile,"w") hfile:write(text) hfile:close()
editor.Editor(tmpfile,title,coord.Left+4,coord.Top+2,coord.Right-4,coord.Bottom-2, bor(F.EF_DISABLEHISTORY,F.EF_DISABLESAVEPOS),0,0,65001)
hfile = io.open(tmpfile,"r") text = hfile:read("*a") hfile:close()
win.DeleteFile(tmpfile)
D:Send(F.DM_CLOSE)
end
end
} ()
return text
end
----------------------------------------------------------------------------------------------------
local idtc = win.Utf16ToUtf8(win.MultiByteToWideChar(unicode.ascii.char(0x04,0xC2),win.GetACP())) -- идентификатор TC в UTF-8
local function DescriptionEdit(init,changed)
local Selected = APanel.Selected
local Description = Panel.Item(0,0,11)
local HistoryName = "DizText"
local FileName = APanel.Current
if Area.Search then Keys "Esc" end
local D,DI = dialog.New {
Guid = DescriptionMultiEditId,
Title = "Describe file",
W=76, H=8,
DlgProc = function(hDlg,Msg,Param1,Param2,D,DI)
if Msg==F.DN_INITDIALOG then
-- для некоторых макросов требуется, чтобы поле не было "неизменённое"
if changed then
DI.Description:Unchanged(0)
end
elseif Msg==F.DN_CLOSE then
-- не записываем в историю пустые, слишком большие и многострочные описания
local text = DI.Description:GetText()
if text~="" and text:len()<=HistoryLimitLen and text:find('\n')==nil then
DI.Description:Send(F.DM_ADDHISTORY,text)
end
return true
elseif Msg==F.DN_CONTROLINPUT and Param2.EventType==F.KEY_EVENT and Param2.KeyDown then
local k = far.InputRecordToName(Param2):gsub('[RL]Ctrl','Ctrl')
if k=="CtrlE" or k=="F4" then
local coord = D:Send(F.DM_GETDLGRECT,0,0)
--local text = DI.Description:GetText():gsub('\x02',''):gsub('\x03','\n')
local text = DI.Description:GetText()
if text:sub(-2)==idtc then -- проверка частичная, так как мы не знаем, из какой кодировки конвертировали в юникод
idsymbol = text:sub(-1) -- это то, во что был преобразован id после конвертирования ANSI->UNICODE
text = text:sub(1,-3):gsub('(\\*\\n)',
function(s)
if s:sub(1,-3):len()%2==0 then
return s:sub(1,-3)..'\n' -- перед \n чётное число или 0 символов \
end
return s
end
):gsub('\\\\','\\')
end
local newtext = MultiEdit(coord.Left,coord.Top-5,coord.Right,coord.Bottom+5,text,"Description Edit")
if newtext ~= text then
if newtext:find('\n') then
newtext = newtext:gsub('\\','\\\\'):gsub('\n','\\n')..idtc
end
DI.Description:SetText(newtext)
end
return true
end
end
end,
Items = {
{"t+", Text="Description:"},
{"emh+@", Name="Description", Text=init or Description, History=HistoryName},
{"s+"},
{"b=!+", Name="OK"},
{"b=", Name="Cancel"},
},
}
D()
if D.Ret ~= -1 and D.Ret ~= DI.Cancel.Id then
if DI.Description.Text ~= Description then
DescriptionPrev = Description
Description = DI.Description.Text:gsub("^%s+",""):gsub("%s+$","") -- trim
mf.clip(5,2)
if Selected then -- сохранить выделение
Keys "CtrlShiftIns"
Panel.Select(0,0)
end
Far.DisableHistory(-1) -- добавляются в DlgProc
Keys "CtrlZ"
print(Description)
Keys "Enter"
if Selected then -- восстановить выделение
Panel.Select(0,1,2,mf.clip(0))
end
end
end
end
----------------------------------------------------------------------------------------------------
Macro { -- Описание
description="Description";
area="Shell Search";
key="CtrlAltZ";
action=function()
Keys "CtrlZ"
end;
}
----------------------------------------------------------------------------------------------------
Macro { -- Описание только одного файла
description="Description: Edit";
area="Shell Search";
key="CtrlZ";
action=function()
DescriptionEdit()
end;
}
----------------------------------------------------------------------------------------------------
Macro { -- Копирование описания в буфер обмена
description="Description: Copy to clipboard";
area="Shell Search";
key="AltC";
action=function()
if Area.Search then Keys "Esc" end
mf.clip(1,Panel.Item(0,0,11))
end;
}
----------------------------------------------------------------------------------------------------
Macro { -- Новое описание из буфера обмена
description="Description: New from clipboard";
area="Shell Search";
key="AltZ";
action=function()
if Area.Search then Keys "Esc" end
local Clipboard = mf.clip(0)
if type(Clipboard)=="string" then
DescriptionEdit(Clipboard:gsub("[\r\n]+"," "),true)
end
end;
}
----------------------------------------------------------------------------------------------------
Macro { -- Добавить описание из буфера обмена к текущему описанию через пробел.
description="Description: Append from clipboard";
area="Shell Search";
key="AltV";
action=function()
if Area.Search then Keys "Esc" end
local Clipboard = mf.clip(0)
if type(Clipboard)=="string" and Clipboard:len()>0 then
local Description = Panel.Item(0,0,11)
if Description:len() > 0 then
DescriptionEdit(Description.." "..Clipboard:gsub("[\r\n]+"," "),true)
else
DescriptionEdit(Clipboard,true)
end
end
end;
}
----------------------------------------------------------------------------------------------------
Macro { -- Удалить описание в буфер обмена. Это описание не будет помещено в DescriptionPrev
description="Description: Cut to clipboard";
area="Shell Search";
key="AltX";
action=function()
if Area.Search then Keys "Esc" end
local Description = Panel.Item(0,0,11)
if Description:len() > 0 then
Far.DisableHistory(-1) -- пустое описание не будет добавлено в историю
mf.clip(1,Description)
local selected = APanel.Selected
mf.clip(5,2)
if selected then
Keys "CtrlShiftIns"
Panel.Select(0,0)
end
Keys "CtrlZ CtrlY Enter"
if selected then
Panel.Select(0,1,2,mf.clip(0))
end
end
end;
}
----------------------------------------------------------------------------------------------------
Macro { -- Удалить описание. Это описание будет помещено в DescriptionPrev
description="Description: Delete";
area="Shell Search";
key="AltD";
action=function()
if Area.Search then Keys "Esc" end
local Description = Panel.Item(0,0,11)
if Description:len() > 0 then
Far.DisableHistory(-1) -- пустое описание не будет добавлено в историю
DescriptionPrev = Description
local selected = APanel.Selected
mf.clip(5,2)
if selected then
Keys "CtrlShiftIns"
Panel.Select(0,0)
end
Keys "CtrlZ CtrlY Enter"
if selected then
Panel.Select(0,1,2,mf.clip(0))
end
end
end;
}
----------------------------------------------------------------------------------------------------
Macro { -- Восстановить описание
description="Description: Restore";
area="Shell Search";
key="AltShiftZ";
action=function()
DescriptionEdit(DescriptionPrev)
end;
}
----------------------------------------------------------------------------------------------------