DI_MEMOEDIT

Разработка Far.
User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

DI_MEMOEDIT

Post by Skirda » Fri 19 Jan, 2007 18:54

Предлагаю к обсуждению сабж.

Идея в том, чтобы заменить DI_EDIT+DIF_EDITOR на один контрол - DI_MEMOEDIT. Некоторые понятия пересекаются с внутренностями ФАРа, но постараюсь внести больше абстракции :-)
Мммм... если это будет реализовано :oops: , то эта реализация в первую очередь появится в UserMenu. Т.е. именно на ней можно будет увидеть этот контрол в действии. Следующий этап - Plugin API (и какой-нить очередной тестовый плагин "Reversi", показывающий как это будет :quote: ).
То, что приведено ниже - (пока) только мои мысли. Надеюсь, что общее обсуждение сдвинет с мертвой точки этот минипроект.

Исходные данные

Классы
Редактор в ФАРе организован следующим образом:
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 будет строится на основе класса...???

Предстоит разработать АПИ. Для этого нужно решать несколько вопросов:

Атрибуты
  1. Кодировка OEM
  2. Имеет ли смысл держать тип EOL в таком контроле или ограничится только символом '\n', а остальное отображать AS IS?
  3. Имеет ли смысл ввести понятие "мягкий перенос"? Скажем, если EOL=='\r\n' и встречается............
  4. .....
Как плагин передает в менеджер диалогов данные
Думается мне вот так:
  1. FarDialogItem.Data и MaxLength - для инициализации ???. В этом случае FAR берет данные и создает объект класса Editor...
  2. само собой и в функции обработчике (DM_SETTEXT)
  3. или только в функции обработчике окна.
Как FAR возвращает эти данные
  1. Используется FarDialogItem.Data и ???. Освобождать память посредством ???, т.к. память, выделенная плагином не будет использоваться.
  2. само собой и в функции обработчике (DM_GETTEXT)
  3. или только в функции обработчике окна
Выделение памяти под буфер передаваемый в плагин
  • Пусть сам плагин заботится об этом.
  • ФАР эти данные только в режиме RO будет юзать. Т.е. преобразует буфер во внутренний формат.
  • А когда ФАР возвращает данные (преобразование списка в буфер), то плагин должен воспользоваться функцией ???
Какие DN_? и DM_? нужны для управления этим контролом

События
  • 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
  • ???
Colorer ???
  • Т.к. обработка цветовых областей оставлена в классе Editor, то как colorer поведет себя в условиях, когда физически файла нету
  • ...и нужна ли раскраска в DI_MEMOEDIT
Tab ???
  • Поведение клавиши Tab - переход на другой контрол или... или переход, но для ввода табуляции в поле редактирования применять Ctrl-Q Tab.

Другие вопросы & Ideas?

User avatar
zg
zero-gravity
Posts: 5253
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Re: DI_MEMOEDIT

Post by zg » Fri 19 Jan, 2007 23:35

Skirda wrote:Как плагин передает в менеджер диалогов данные
Думается мне вот так:
  1. или только в функции обработчике окна.
Как FAR возвращает эти данные
  1. или только в функции обработчике окна
Какие DN_? и DM_? нужны для управления этим контролом
1. получение строки
2. раскраска :)
[*]...и нужна ли раскраска в DI_MEMOEDIT[/list]
нужна
  • Поведение клавиши Tab - переход на другой контрол или... или переход, но для ввода табуляции в поле редактирования применять Ctrl-Q Tab.
tab переходит на следующий контрол. кому надо другое — обработают :)

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

Post by t-rex » Sat 20 Jan, 2007 07:50

А может лучше сделать обьект который будет открывать полноценный редактор внутри диалога? И работать с ним через EditorControl? А то в общем выходит просто много строчный эдит конрол который ну чуть лучше чем DIF_EDITOR да и от раскраски в нём польза чисто теоритеческая (да и то может только через DialogManager).

User avatar
Alexey Samlyukov
Posts: 1759
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 2 times
Contact:

Post by Alexey Samlyukov » Sat 20 Jan, 2007 08:56

Добавлю: плагины с DI_EDIT+DIF_EDITOR такая редкость, что мне и не встречались.
А так я согласен с AY.

User avatar
zg
zero-gravity
Posts: 5253
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Post by zg » Sat 20 Jan, 2007 10:32

Alexey Samlyukov wrote:Добавлю: плагины с DI_EDIT+DIF_EDITOR такая редкость, что мне и не встречались.
потому что достаточно кривая хрень. потому никто и не использует.

User avatar
[e]Bu$ter
Posts: 792
Joined: Mon 30 May, 2005 23:05
Location: Беларусь, Минск
Contact:

Post by [e]Bu$ter » Sat 20 Jan, 2007 23:04

zg wrote:
Alexey Samlyukov wrote:Добавлю: плагины с DI_EDIT+DIF_EDITOR такая редкость, что мне и не встречались.
потому что достаточно кривая хрень. потому никто и не использует.
Ага, если это то о чём я думаю, то действительно кривая... т.е. на редактор она не смахивает.
t-rex wrote:А может лучше сделать обьект который будет открывать полноценный редактор внутри диалога?
Вот это было бы круто, если я правильно понял: тот же радактор, только без key-bar'a но с меню плагинов по F11 и т.п.?

В любом случае, идея здравая! Наконец-то можно будет редактор описание толковый сделать...

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Post by Skirda » Mon 22 Jan, 2007 08:34

t-rex wrote:А может лучше сделать обьект который будет открывать полноценный редактор внутри диалога?
Угу, имели мы уже нечто подобное... в поисковике - диалог + вертикальное меню, связанные между собой... хрен знает через какое колено.

Ок. Попробую объяснить на пальцах... (вернее "дорассказать" историю до конца).

Классы
Редактор в ФАРе организован следующим образом:
1. Edit - это строка редактирования. Юзается в диалогах.
2. Editor - это связанный список строк Edit.
3. FileEditor - собственно тот самый редактор (который вы видите, нажимая F4 на файле); несет на борту экземпляр класса Editor.

Editor ничего не знает о понятиях "ФАЙЛ", "Строка состояний" и "кейбар". Напротив, FileEditor - работает только с файлами, имеет кейбар и строку состояний.

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.

Возможно, что нужно еще одно уточнение что и где будет обрабатываться.

Т.е. то, что я предлагаю, уже работает с памятью (пару функций, применимых к диалогам, все же нужно будет уточнять, но это по мере возникновения....).

User avatar
HaRT
Moderator
Posts: 8051
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

Post by HaRT » Mon 22 Jan, 2007 09:05

Skirda
А в какой области будут выполняться макросы внутри этого нового контрола: Editor или “родительской” (т.е. Dialog или Editor в зависимости от того, где используется)?
Или может вообще в “наследуемой” по цепочке: Editor -> Dialog -> Common -> BuiltIn?

User avatar
jbak
Posts: 609
Joined: Tue 04 Oct, 2005 15:01
Location: Одесса

Post by jbak » Mon 22 Jan, 2007 10:13

Навскидку, где встречалась DI_EDIT+DIF_EDITOR - плагины AltDescription и EUM. В обоих случаях поле кустарно подменяется на FileEditor, открывающий временный файл.
Действительно, нельзя ли сделать так как предлагает t-rex? Чтобы в поле кроме всего прочего были доступны любые плагины, макросы редактора и прочее?
В поле FarDialogItem.Data пусть хранятся строки, разделённые \r или там \n, не помешал бы и путь к файлу - хоть даже в незадействованном поле History. И флаг DIF_DATAFILE или что-то такое, взять данные из файла или из поля Data.
Tab/ShiftTab пущай переводят в следующее/предыдущее поле

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Post by Skirda » Mon 22 Jan, 2007 12:49

HaRT, Dialog.

jbak, UserMenu в ФАРе

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Post by Skirda » Mon 22 Jan, 2007 12:51

jbak wrote:Действительно, нельзя ли сделать так как предлагает t-rex?
...и вешать костыли на "отучение" объекта (порожденного от FileEditor) от файла, кейбара и прочей шелупони, не имеющей отношения к диалогам?
Есть уже все, что надо - Editor

DominiK
Posts: 232
Joined: Wed 06 Apr, 2005 18:38
Location: Ростов-на-Дону
Contact:

Post by DominiK » Mon 22 Jan, 2007 13:21

Наверное стоит добавить возможность (по аналогии с асечными клиентами)
Ctrl-Enter - следующая строка
Enter - некое событие, по которому можно нечто делать или, например, выходить на следующий элемент диалога с соответствии с TabIndex (или какой там термин принят в FAR API)
...и наоборот (в зависимости от соотв. флажка)

Сорри за сумбур в изложении

User avatar
Centaur
Posts: 1083
Joined: Tue 05 Apr, 2005 20:09
Location: Novosibirsk, Russia

Post by Centaur » Mon 22 Jan, 2007 13:26

DominiK
В FAR’е уже исторически принято по Ctrl+Enter всегда активировать дефолтную кнопку. Не надо ломать это поведение.

User avatar
HaRT
Moderator
Posts: 8051
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

Post by HaRT » Mon 22 Jan, 2007 13:51

Skirda wrote:HaRT, Dialog.
Надеюсь, тогда при нахождении в этом контроле будут работать элементы макроязыка, начинающиеся с префикса “Editor.”, и родственные им?

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Post by Skirda » Mon 22 Jan, 2007 16:09

HaRT, посмотрим.

Я выкатил эту инфу для того, чтобы за один присест сделать некую базу для этого контрола (с последующими мелкими уточнениями). От вас требуется внести уточнения в спецификацию.

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

Post by t-rex » Mon 22 Jan, 2007 16:27

Skirda
А как для этого контрола будет работать EditorControl? Т.е. как он будет вызыватся?

Post Reply

Return to “Development”