OberonCore
https://forum.oberoncore.ru/

Подсветка парных скобок
https://forum.oberoncore.ru/viewtopic.php?f=47&t=4376
Страница 1 из 2

Автор:  Иван Денисов [ Среда, 05 Июнь, 2013 09:19 ]
Заголовок сообщения:  Подсветка парных скобок

Понял, что для счастья анализа чужих программ мне не хватает подсветки парных скобок.

Написал заготовку. Скобки она приемлемо ищет и подсвечивает, но вот как прикрутить ее, чтобы после каждого перемещения каретки они автоматически запускалась не могу догадаться. Подскажите какой-нибудь ход, если есть идеи, пожалуйста.

Хотелось бы сделать это в компонентном духе. Пытался сделать с помощью Services.Action, чтобы мониторила постоянно, но при этом начинает мигать каретка. Пытался встроить в обработку сообщений TextViews, вылетает отображение... что-то делаю не так.

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

Вложения:
test.png
test.png [ 43.91 КБ | Просмотров: 12672 ]
Комментарий к файлу: Подсветка скобок
DiaBrackets.txt [10.23 КБ]
Скачиваний: 787

Автор:  Пётр Кушнир [ Среда, 05 Июнь, 2013 09:39 ]
Заголовок сообщения:  Re: Подсветка парных скобок

По результатам исследования в сырцах я выяснил такой путь прохождения пользовательских сигналов управления.

На примере нажатия клавиши:
Нажатие → WinAPI → оконная процедура HostWindows.DocHandler (или DlgHandler, в зависимости от типа окна) → HostWindows.Window.KeyDown → супервызов Windows.Window.KeyDown → Windows.Window.ForwardCtrlMsg → Views.HandleCtrlMsg (это процедурная переменная, установленная из Controllers) → Controllers.HandleCtrlMsgs.

У нас тоже возникала подобная задача, была идея реализовать совместное редактирование документов по сети а-ля google docs, но в ББ. Тогда мы не решили её, но теперь, я думаю, вполне разумно было бы оборачивать эту процедуру, иначе получается, что оборачивать возможно только окно.
Правда в самом механизме работы связки процедур Views.ForwardCtrlMsg → ... → Controllers.HandleCtrlMsgs я ещё не разбирался.

Автор:  Иван Кузьмицкий [ Среда, 05 Июнь, 2013 09:41 ]
Заголовок сообщения:  Re: Подсветка парных скобок

В общем-то, можно сразу по-взрослому сделать свой контроллер и вставить его вместо стандартного.

Автор:  Пётр Кушнир [ Среда, 05 Июнь, 2013 09:41 ]
Заголовок сообщения:  Re: Подсветка парных скобок

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

Автор:  Иван Денисов [ Среда, 05 Июнь, 2013 11:02 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Пётр Кушнир писал(а):
И ещё, насколько я понимаю, в случае режима автоподсветки надо добиваться такого эффекта, который бы не влиял на документ исходника, то есть, чтобы цвет скобок не сохранялся и вообще не был частью документа, а только частью отображения.
Есть механизм, как с маркерами ошибок, которые никогда не сохраняются. Пока пошел по пути наименьшего сопротивления, перед сохранением возможно вызвать DiaBrackets.Reset и все вернется в исходный вид.

Автор:  Евгений Темиргалеев [ Среда, 05 Июнь, 2013 11:54 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Иван Денисов писал(а):
Хотелось бы сделать это в компонентном духе. Пытался сделать с помощью Services.Action, чтобы мониторила постоянно, но при этом начинает мигать каретка. Пытался встроить в обработку сообщений TextViews, вылетает отображение... что-то делаю не так.
Смотрите, может быть этого будет довольно:
ObxWrappers Docu писал(а):
Overview by Example: ObxWrappers

This example implements a wrapper. Wrappers are views which contain other views. In particular, a wrapper may have the same size as the view(s) that it wraps. In this way, it can combine its own functionality with that of the wrapped view(s).

For example
• a debugging wrapper lists the messages received by the wrapped view into the log
• a background wrapper adds a background color, over which its wrapped view is drawn (which typically has no background color, i.e., which has a transparent background)
• a layer wrapper contains several layered views, e.g., a graph view overlaid by a caption view
• a terminal wrapper contains a terminal session and wraps a standard text view displaying the log of the session
a bundling wrapper filters out controller messages, such that the wrapped view becomes read-only etc., the sky's the limit! Wrappers demonstrate the power of composition, i.e., how functionality of different objects can be combined in a very simple manner, without having to use complex language mechanisms such as inheritance.

...

Автор:  Иван Денисов [ Среда, 05 Июнь, 2013 14:39 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Идея отличная. Сделать обертку для текстового отображения, тогда на задний план теоретически возможно выводить подкраску и перехватывать ввод, чтобы учитывать все сдвиги. Попробую разобраться с обертками. И Петру спасибо за «путь прохождения пользовательских сигналов управления», может пригодиться.

Автор:  Пётр Кушнир [ Среда, 05 Июнь, 2013 15:20 ]
Заголовок сообщения:  Re: Подсветка парных скобок

как только вы сделаете обёртку, все пункты меню, настроенные на охрану подфокусного отображения TextViews.View перестанут воспринимать нужный тип отображения в документе, разве нет?

Автор:  Иван Денисов [ Среда, 05 Июнь, 2013 16:36 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Пётр Кушнир писал(а):
как только вы сделаете обёртку, все пункты меню, настроенные на охрану подфокусного отображения TextViews.View перестанут воспринимать нужный тип отображения в документе, разве нет?
Нет не пропадают, уже проверил. Есть проблемы с тем как назад сделать Unwrap. И в момент обработки сообщения позиция каретки старая (а не там куда переместилась). Пока разбираюсь.

Привязку делаю таким образом:
Код:
   PROCEDURE Check*;
      VAR poll: Controllers.PollOpsMsg;
      w: View; replace: Controllers.ReplaceViewMsg;
      v: Views.View;
   BEGIN
      v := Controllers.FocusView();
      IF (v # NIL) THEN
         NEW(w); w.inner := v; Stores.Join(w, w.inner);
         replace.old := v; replace.new := w;
         Controllers.Forward(replace)
      END
   END Check;

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

Автор:  Иван Денисов [ Среда, 05 Июнь, 2013 20:26 ]
Заголовок сообщения:  Re: Подсветка парных скобок

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

Недоделки: при копировании скобки остаются выдленными, при быстром наборе скобки остаются выделенными, желательно, чтобы при сохранении обертка сама снималась (пока не нашел как это сделать).

Вложения:
Комментарий к файлу: 3
DiaBrackets.txt [14.56 КБ]
Скачиваний: 767
test.png
test.png [ 1.05 КБ | Просмотров: 12589 ]

Автор:  Илья Ермаков [ Четверг, 06 Июнь, 2013 01:55 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Может, подменять скобки вьюшками? Которые для компилятора сообщают о себе как о символе (так можно)? А в остальном всё поведение и обеспечивают.

Автор:  Иван Денисов [ Четверг, 06 Июнь, 2013 06:24 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Илья Ермаков писал(а):
А в остальном всё поведение и обеспечивают.
А как это возможно реализовать? Уточняю, как они определят свое место в тексте, когда курсор не рядом с ними и надо назад превратиться в простую скобку?

Автор:  Иван Денисов [ Четверг, 06 Июнь, 2013 06:34 ]
Заголовок сообщения:  Re: Подсветка парных скобок

А кажется понял мысль. Позиции отображений можно и не хранить, а просто сканировать текст каждый раз и их искать. Надо проверить на сколько это шустро работает.

А еще, подскажите, есть ли возможность не записывать изменения для последующей возможности отмены Ctrl+Z?

Автор:  Иван Кузьмицкий [ Четверг, 06 Июнь, 2013 06:48 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Иван Денисов писал(а):
есть ли возможность не записывать изменения для последующей возможности отмены Ctrl+Z?
Операторные скобки Models.BeginModification/Models.EndModification

Автор:  Илья Ермаков [ Четверг, 06 Июнь, 2013 06:53 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Иван Денисов писал(а):
А кажется понял мысль. Позиции отображений можно и не хранить, а просто сканировать текст каждый раз и их искать. Надо проверить на сколько это шустро работает.


А я не предлагаю постоянно менять с отображения на скобку...
Я предлагаю однократно по команде "Подсвечивать скобки" поменять все скобки на спец. вьюшки. Компиляция работать будет, если вьюшку научить сообщать о себе заменяющий символ (какое-то сообщение было, не помню).
Только открывать в другом ББ без компонента подсветки не получится - ну, иметь для этого команду "Убрать подсветку скобок" - и перед сохранением исходников в режиме для других людей это выключать.. Или как-то автоматически...

Сама вьюшка может узнать своё место в тексте: self.context(TextModels.Context).какой_то_метод_был.

Автор:  Валерий Лаптев [ Четверг, 06 Июнь, 2013 08:15 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Вообще-то во многих с++ных средах скобки подсвечиваются только в момент наведения текстового курсора.
То есть, если текстовый курсор перед или после скобки, то подсвечивается парная ей.
В остальных случаях, когда курсор далеко, скобки никак не подсвечиваются.

Автор:  Александр Ильин [ Четверг, 06 Июнь, 2013 09:27 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Илья Ермаков писал(а):
Может, подменять скобки вьюшками?
Если я правильно помню, удаление таких скобок будет требовать двух нажатий BackSpace вместо одного.

Автор:  Евгений Темиргалеев [ Четверг, 06 Июнь, 2013 09:35 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Илья Ермаков писал(а):
Может, подменять скобки вьюшками? Которые для компилятора сообщают о себе как о символе (так можно)? А в остальном всё поведение и обеспечивают.
На мой взгляд, это не самая ... лучшая идея. Настройки внешнего вида жестко фиксировать в носителе данных (с увеличением объема данных и сложности как во внешнем представлении, так и во внутреннем). Обёртка здесь более адекватное решение. Впрочем, Илья Евгеньевич, ниже уже сам заметил, что просто так подменить всё не получится.
Илья Ермаков писал(а):
Компиляция работать будет, если вьюшку научить сообщать о себе заменяющий символ (какое-то сообщение было, не помню).
Кому интересно, пример в ert0devSpecViews.

Автор:  Евгений Темиргалеев [ Четверг, 06 Июнь, 2013 09:36 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Александр Ильин писал(а):
Илья Ермаков писал(а):
Может, подменять скобки вьюшками?
Если я правильно помню, удаление таких скобок будет требовать двух нажатий BackSpace вместо одного.
Не будет.

Автор:  Иван Денисов [ Четверг, 06 Июнь, 2013 09:49 ]
Заголовок сообщения:  Re: Подсветка парных скобок

Пока мне кажется лучшим вариант с временной заменой именно пары скобок, которые подсвечиваются. Поскольку тогда уйдет проблема с вычислением позиций этих скобок при изменении текста. Столкнулся с большой сложностью учесть все варианты вставки, удаления, работы с буфером, а если еще и маркеры ошибок выскочат, и при отмене операций через Ctrl+Z, размер текста непредсказуемо меняется. А так задача их замены на скобки выглядит легче, по указателю обратиться, спросить где они, и заменить на простые скобки. Внешний вид их может вообще ничем от цветной жирной скобки не отличаться, поскольку в такое отображение легко передать шрифт и атрибуты. Про то как замаскировать их под скобки при компиляции уже читал, это реально. На днях продолжу эпопею. Спасибо за обсуждение.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/