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