OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 11 Декабрь, 2019 21:45

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Подсветка парных скобок
СообщениеДобавлено: Среда, 05 Июнь, 2013 09:19 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Понял, что для счастья анализа чужих программ мне не хватает подсветки парных скобок.

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

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

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


Вложения:
test.png
test.png [ 43.91 КБ | Просмотров: 7066 ]
Комментарий к файлу: Подсветка скобок
DiaBrackets.txt [10.23 КБ]
Скачиваний: 405
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Среда, 05 Июнь, 2013 09:39 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2638
Откуда: Россия, Ярославль
По результатам исследования в сырцах я выяснил такой путь прохождения пользовательских сигналов управления.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Среда, 05 Июнь, 2013 09:41 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
В общем-то, можно сразу по-взрослому сделать свой контроллер и вставить его вместо стандартного.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Среда, 05 Июнь, 2013 09:41 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2638
Откуда: Россия, Ярославль
И ещё, насколько я понимаю, в случае режима автоподсветки надо добиваться такого эффекта, который бы не влиял на документ исходника, то есть, чтобы цвет скобок не сохранялся и вообще не был частью документа, а только частью отображения.


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Среда, 05 Июнь, 2013 11:54 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Иван Денисов писал(а):
Хотелось бы сделать это в компонентном духе. Пытался сделать с помощью 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.

...


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Идея отличная. Сделать обертку для текстового отображения, тогда на задний план теоретически возможно выводить подкраску и перехватывать ввод, чтобы учитывать все сдвиги. Попробую разобраться с обертками. И Петру спасибо за «путь прохождения пользовательских сигналов управления», может пригодиться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Среда, 05 Июнь, 2013 15:20 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2638
Откуда: Россия, Ярославль
как только вы сделаете обёртку, все пункты меню, настроенные на охрану подфокусного отображения TextViews.View перестанут воспринимать нужный тип отображения в документе, разве нет?


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Пётр Кушнир писал(а):
как только вы сделаете обёртку, все пункты меню, настроенные на охрану подфокусного отображения 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;

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


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Вроде сносно получилось. Обертка присоединяется, скобки выделяются. Есть возможность сохранить в таком режиме, есть возможность снять обертку до сохранения или после открытия сохраненного с оберткой файла. Меню текстом остается активным, никакие функции текста не повреждаются (правда при прокрутке заметил небольшое мелькание...).

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


Вложения:
Комментарий к файлу: 3
DiaBrackets.txt [14.56 КБ]
Скачиваний: 400
test.png
test.png [ 1.05 КБ | Просмотров: 6983 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Четверг, 06 Июнь, 2013 01:55 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9164
Откуда: Россия, Орёл
Может, подменять скобки вьюшками? Которые для компилятора сообщают о себе как о символе (так можно)? А в остальном всё поведение и обеспечивают.


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
Илья Ермаков писал(а):
А в остальном всё поведение и обеспечивают.
А как это возможно реализовать? Уточняю, как они определят свое место в тексте, когда курсор не рядом с ними и надо назад превратиться в простую скобку?


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2477
А кажется понял мысль. Позиции отображений можно и не хранить, а просто сканировать текст каждый раз и их искать. Надо проверить на сколько это шустро работает.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Четверг, 06 Июнь, 2013 06:48 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
Иван Денисов писал(а):
есть ли возможность не записывать изменения для последующей возможности отмены Ctrl+Z?
Операторные скобки Models.BeginModification/Models.EndModification


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Четверг, 06 Июнь, 2013 06:53 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9164
Откуда: Россия, Орёл
Иван Денисов писал(а):
А кажется понял мысль. Позиции отображений можно и не хранить, а просто сканировать текст каждый раз и их искать. Надо проверить на сколько это шустро работает.


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Четверг, 06 Июнь, 2013 08:15 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3124
Откуда: Астрахань
Вообще-то во многих с++ных средах скобки подсвечиваются только в момент наведения текстового курсора.
То есть, если текстовый курсор перед или после скобки, то подсвечивается парная ей.
В остальных случаях, когда курсор далеко, скобки никак не подсвечиваются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Четверг, 06 Июнь, 2013 09:27 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2318
Откуда: Россия, Томск
Илья Ермаков писал(а):
Может, подменять скобки вьюшками?
Если я правильно помню, удаление таких скобок будет требовать двух нажатий BackSpace вместо одного.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Четверг, 06 Июнь, 2013 09:35 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсветка парных скобок
СообщениеДобавлено: Четверг, 06 Июнь, 2013 09:36 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Александр Ильин писал(а):
Илья Ермаков писал(а):
Может, подменять скобки вьюшками?
Если я правильно помню, удаление таких скобок будет требовать двух нажатий BackSpace вместо одного.
Не будет.


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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB