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

Таким образом, посредством встраивания вьюшки может происходить уточнение назначения текстового документа, введение новой функциональности и всё тому подобное. Как бы, бб даёт нам тексты вообще, и чисто случайно оказывается, что рядом лежит компилятор, а теперь мы встраиваем девелоперские якоря и уже точно фиксируем то, что этот текст является исходником.Якоря в тексте - фича сезона "Весна-лето 2013"

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

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

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

Однако, в самих текстах есть вполне конкретные средства взаимодействия с внедрёнными отображениями, через хендлер HandlePropMsg. Вот что удалось выяснить:
TextSetters.Prefприходит в отображение, когда оно есть на экране. Это и понятно, сеттеры вроде как занимаются размещением блоков текста на фрейме, подготавливая их к отрисовке.TextControllers.FilterPrefприходит когда юзер производит активность мышью, но в эту активность не включена прокрутка. То есть, движения и нажатия кнопок. Важный момент, FilterPref приходят даже когда отображения не видно на экране. Это уже интереснееTextModels.Prefэто самая интересная фича. Сообщение приходит на каждый чих. Оно инициируется напрямую из TextModels.Reader при каждом чтении, то есть, почти всегда, реально, это самый надёжный способ узнать про активность в документе (прокрутка, движение курсора, ввод текста, всё подряд). При этом, сообщение событийное, то есть не нужны экшны и обёртывание отображений или контроллеров.
Далее, как мы уже знаем из прошлых сообщений про якоря, отображение внутри контейнера может получить доступ к своему предку. Но остаётся проблема, отображение получает сигналы в остальные хендлеры (Model, View, Ctrl) только когда оно видимое. А эти хендлеры нам нужны, чтобы получать самое важное сообщение в рамках задачи автокомплита - сообщение TextModels.UpdateMsg.

Решение нам подсказывает документация (а на самом деле - исходник DevMarkers). Можно создать отображение и внедрить его в текст таким образом, что для текста ничего не изменится. В свою очередь само отображение не будет давать себя сохранять в документе, используя метод Stores.Store.ExternalizeAs.

Итак, всё готово, чтобы приступить к набору текстов в ББ.