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 не избежать.
|
Автор: | Пётр Кушнир [ Среда, 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: Подсветка парных скобок | |||
Вроде сносно получилось. Обертка присоединяется, скобки выделяются. Есть возможность сохранить в таком режиме, есть возможность снять обертку до сохранения или после открытия сохраненного с оберткой файла. Меню текстом остается активным, никакие функции текста не повреждаются (правда при прокрутке заметил небольшое мелькание...). Недоделки: при копировании скобки остаются выдленными, при быстром наборе скобки остаются выделенными, желательно, чтобы при сохранении обертка сама снималась (пока не нашел как это сделать).
|
Автор: | Илья Ермаков [ Четверг, 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/ |