Идея в том, чтобы заменить DI_EDIT+DIF_EDITOR на один контрол - DI_MEMOEDIT. Некоторые понятия пересекаются с внутренностями ФАРа, но постараюсь внести больше абстракции
Мммм... если это будет реализовано , то эта реализация в первую очередь появится в UserMenu. Т.е. именно на ней можно будет увидеть этот контрол в действии. Следующий этап - Plugin API (и какой-нить очередной тестовый плагин "Reversi", показывающий как это будет ).
То, что приведено ниже - (пока) только мои мысли. Надеюсь, что общее обсуждение сдвинет с мертвой точки этот минипроект.
Исходные данные
Классы
Редактор в ФАРе организован следующим образом:
1. Edit - минимальный редактор одной строки
2. Editor - это связанный список строк Edit. ничего не знает о понятиях "ФАЙЛ", "Строка состояний" и "кейбар"
3. FileEditor - собственно тот самый редактор (который вы видите, нажимая F4 на файле); несет на борту экземпляр класса Editor. FileEditor - работает только с файлами, имеет кейбар и строку состояний.
4. EditControl - основан на Edit - строка редактирования в диалогах (через DlgEdit), ком.строке
5. DlgEdit - юзается в диалогах в качестве строки редактирования, содержит в себе экземпляр EditControl
Info.EditorControl
Эта функция разделена между Editor и FileEditor.
В FileEditor работают следующие команды: ECTL_GETINFO (заполняет поле FileName, остальное заполняется в Editor), ECTL_GETBOOKMARKS, ECTL_SETTITLE, ECTL_EDITORTOOEM, ECTL_OEMTOEDITOR, ECTL_REDRAW, ECTL_SETKEYBAR, ECTL_SAVEFILE, ECTL_QUIT, ECTL_READINPUT, ECTL_PROCESSINPUT, ECTL_PROCESSKEY.
В Editor работают следующие команды: ECTL_GETSTRING, ECTL_INSERTSTRING, ECTL_INSERTTEXT, ECTL_SETSTRING, ECTL_DELETESTRING, ECTL_DELETECHAR, ECTL_GETINFO (все, кроме FileName), ECTL_SETPOSITION, ECTL_SELECT, ECTL_REDRAW, ECTL_TABTOREAL, ECTL_REALTOTAB, ECTL_EXPANDTABS, ECTL_ADDCOLOR, ECTL_GETCOLOR, ECTL_PROCESSKEY, ECTL_SETPARAM, ECTL_TURNOFFMARKINGBLOCK, ECTL_DELETEBLOCK.
Вводная
Многострочный редактор в диалогах
Диалоговый элемент DI_MEMOEDIT будет строится на основе класса...???
Предстоит разработать АПИ. Для этого нужно решать несколько вопросов:
Атрибуты
- Кодировка OEM
- Имеет ли смысл держать тип EOL в таком контроле или ограничится только символом '\n', а остальное отображать AS IS?
- Имеет ли смысл ввести понятие "мягкий перенос"? Скажем, если EOL=='\r\n' и встречается............
- .....
Думается мне вот так:
- FarDialogItem.Data и MaxLength - для инициализации ???. В этом случае FAR берет данные и создает объект класса Editor...
- само собой и в функции обработчике (DM_SETTEXT)
- или только в функции обработчике окна.
- Используется FarDialogItem.Data и ???. Освобождать память посредством ???, т.к. память, выделенная плагином не будет использоваться.
- само собой и в функции обработчике (DM_GETTEXT)
- или только в функции обработчике окна
- Пусть сам плагин заботится об этом.
- ФАР эти данные только в режиме RO будет юзать. Т.е. преобразует буфер во внутренний формат.
- А когда ФАР возвращает данные (преобразование списка в буфер), то плагин должен воспользоваться функцией ???
События
- DN_EDITCHANGE
- DN_GOTFOCUS
- DN_KILLFOCUS
- DN_DRAWDLGITEM
- DN_CTLCOLORDLGITEM
- DN_BTNCLICK
- DN_MOUSECLICK
- DN_MOUSEEVENT
- ???
- DM_GETDLGITEM
- DM_GETTEXT
- DM_GETTEXTLENGTH
- DM_KEY
- DM_SETFOCUS
- DM_SETTEXT
- DM_SETMAXTEXTLENGTH
- DM_SETTEXTLENGTH
- DM_GETCURSORPOS
- DM_SETCURSORPOS
- DM_GETTEXTPTR
- DM_SETTEXTPTR
- DM_SETITEMPOSITION
- DM_GETITEMPOSITION
- DM_EDITUNCHANGEDFLAG
- DM_GETITEMDATA
- DM_SETITEMDATA
- DM_GETCURSORSIZE
- DM_SETCURSORSIZE
- DM_GETSELECTION
- DM_SETSELECTION
- ???
- Т.к. обработка цветовых областей оставлена в классе Editor, то как colorer поведет себя в условиях, когда физически файла нету
- ...и нужна ли раскраска в DI_MEMOEDIT
- Поведение клавиши Tab - переход на другой контрол или... или переход, но для ввода табуляции в поле редактирования применять Ctrl-Q Tab.
Другие вопросы & Ideas?