Code: Select all
MenuItem {
description = "CharacterMapLua 1.0";
menu = "Plugins";
area = "Shell Editor Dialog";
guid = "DF8C9172-5AD7-4065-BE39-CB128700E7ED";
text = function() return "CharacterMapLua" end;
action = function() Run() end;
}
--Macro {area = "Common"; key = "CtrlShiftF1"; description = "CharacterMapLua 1.0"; flags = ""; condition = function() return true end; action = function() Run() end;}
function Run()
local Text
local F = far.Flags
local Items = {}
Items[1] = {F.DI_DOUBLEBOX, 3, 1, 38, 18, 0, 0, 0, 0, "CharacterMapLua"}
Items[2] = {F.DI_BUTTON, 0, 17, 0, 17, 0, 0, 0, F.DIF_DEFAULTBUTTON + F.DIF_CENTERGROUP, "OK"}
Items[3] = {F.DI_BUTTON, 0, 17, 0, 17, 0, 0, 0, F.DIF_CENTERGROUP, "Cancel"}
Items[4] = {F.DI_USERCONTROL, 3, 13, 38, 17, 0, 0, 0, F.DIF_FOCUS, -1}
local cur_row = 0
local cur_col = 0
local max_row = 3 --4*32=128
local max_col = 31
local cur_prefix_symb = ""
local first_text_item = 5
-- в additional_symbols можно добавлять другие символы - они появятся в диалоге макроса
local additional_symbols = {"Ђ", "Ѓ", "‚", "ѓ", "„", "…", "†", "‡", "€", "‰", "Љ", "‹", "Њ", "Ќ", "Ћ", "Џ", "ђ", "‘", "’", "“", "”", "•", "–", "—", "", "™", "љ", "›", "њ", "ќ", "ћ", "џ", " ", "Ў", "ў", "Ј", "¤", "Ґ", "¦", "§", "Ё", "©", "Є", "«", "¬", "", "®", "Ї", "°", "±", "І", "і", "ґ", "µ", "¶", "·", "ё", "№", "є", "»", "ј", "Ѕ", "ѕ", "ї", "А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я", "а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я", "░", "▒", "▓", "│", "┤", "╡", "╢", "╖", "╕", "╣", "║", "╗", "╝", "╜", "╛", "┐", "└", "┴", "┬", "├", "─", "┼", "╞", "╟", "╚", "╔", "╩", "╦", "╠", "═", "╬", "╧", "╨", "╤", "╥", "╙", "╘", "╒", "╓", "╫", "╪", "┘", "┌", "█", "▄", "▌", "▐", "▀", "∙", "√", "■", "⌠", "≈", "≤", "≥", "⌡", "²", "÷"}
local symb_in_arr = table.maxn(additional_symbols)
for i = 1, max_col+1-math.fmod(symb_in_arr, (max_col+1)) do
additional_symbols[#additional_symbols+1] = "&" --дополняем последнюю строку до 32 символов
end
local max_row_add = math.ceil(#additional_symbols/(max_col+1)) --количество добавляемых строк по 32 символа
for row = 0, max_row do
for col = 0, max_col do
Items[#Items+1] = {F.DI_TEXT, 5+col, first_text_item-2+row, 5+col, first_text_item-2+row, 0, 0, "", 0, ""}
end
end
for row = max_row+1, max_row+max_row_add do
for col = 0, max_col do
Items[#Items+1] = {F.DI_TEXT, 5+col, first_text_item-2+row, 5+col, first_text_item-2+row, 0, 0, "", 0, ""}
end
end
local function Rebuild(hDlg)
far.SendDlgMessage(hDlg, "DM_ENABLEREDRAW", 0)
for row = 0, max_row do
for col = 0, max_col do
if row == cur_row and col == cur_col then cur_prefix_symb = "&" else cur_prefix_symb = "" end
far.SendDlgMessage(hDlg, "DM_SETTEXT", first_text_item+row*(max_col+1)+col, cur_prefix_symb..string.char(row*(max_col+1)+col))
end
end
for row = max_row+1, max_row+max_row_add do
for col = 0, max_col do
if row == cur_row and col == cur_col then cur_prefix_symb = "&" else cur_prefix_symb = "" end
far.SendDlgMessage(hDlg, "DM_SETTEXT", first_text_item+row*(max_col+1)+col, cur_prefix_symb..additional_symbols[row*(max_col+1)+col-((max_row+1)*(max_col+1))+1])
end
end
far.SendDlgMessage(hDlg, "DM_ENABLEREDRAW", 1)
end
local function DlgProc(hDlg, Msg, Param1, Param2)
if Msg == F.DN_INITDIALOG then
Rebuild(hDlg)
elseif Msg == F.DN_CONTROLINPUT and Param1 == first_text_item-1 then
if Param2.VirtualKeyCode == 37 then --left
cur_col = cur_col - 1; if cur_col < 0 then cur_col = 0 end
Rebuild(hDlg)
elseif Param2.VirtualKeyCode == 38 then --up
cur_row = cur_row - 1; if cur_row < 0 then cur_row = 0 end
Rebuild(hDlg)
elseif Param2.VirtualKeyCode == 39 then --right
cur_col = cur_col + 1; if cur_col > max_col then cur_col = max_col end
Rebuild(hDlg)
elseif Param2.VirtualKeyCode == 40 then --down
cur_row = cur_row + 1; if cur_row > max_row+max_row_add then cur_row = max_row+max_row_add end
Rebuild(hDlg)
elseif Param2.VirtualKeyCode == 13 then --enter
Text = string.sub(far.SendDlgMessage(hDlg, "DM_GETTEXT", first_text_item+cur_row*(max_col+1)+cur_col, nil), 2)
end
elseif Msg == F.DN_BTNCLICK and Param1 == 2 then
Text = string.sub(far.SendDlgMessage(hDlg, "DM_GETTEXT", first_text_item+cur_row*(max_col+1)+cur_col, nil), 2)
end
end
local guid = win.Uuid("d2e2c6d3-6142-4e11-b103-9d2f80ba19a7")
local result = far.Dialog(guid, -1, -1, 42, 20, nil, Items, nil, DlgProc)
if Text then
if Area.Editor then
editor.InsertText(nil, Text)
elseif (Area.Dialog or Area.Shell) then
mf.postmacro(print, Text)
end
end
end