В качестве очередного отчета решил показать реализацию всплывающих подсказок. При реализации использованы стандартнее механизмы VS — IQuickInfoSource/IQuickInfoSourceProvider, так что плагины нитры будут интегрироваться с другими малагинами предоставляющими подсказки в студии. Однако я их немного подхачил, так что теперь они поддерживают вложенные подсказки и и навигацию. Потрахаться пришлось вдоволь. Дня три только в отладчике провел отлаживая декомпиленные исходники студии . Общая идея работы с подсказками следующая. Есть язык разметки которым можно форматировать содержимое хинта и сообщений об ошибках. Символы могут переопределить метод GetHint() : string и вернуть из него то представление символа, которое нужно показывать пользователю. С сообщением об ошибке все еще проще, так как переопределять ничего не надо. Прост в месте где хочется создать такое сообщение можно применять разметку. Язык разметки я назвал HintML. В нем поддерживаются следующие теги: * hint — обрамляет текст хинта или вложенный хинт. * keyword — подкрашивает текст цветом используемым для ключевых слов (по умолчанию синим). * symbol — описывает символ. Атрибут span-class позволяет задать подсветку (из описываемых в языках спэн-классов). Атрибут id — позволяет задать id символа (берется из соответствующего свойства символа). Если id задано, для символа будет отображаться вложенных хинт. * br или bl — задают конец строки. В принципе они не нужны, так как конец строки тоже работает. Возможно уберу в будущем. * ref — ссылка (аналог url в HTML) позволяет вывести ссылку с некоторым действием. Пока что действий два "goto" и "goto line". Их можно использовать для навигации по коду. Атрибут handler — задает действие, а необязательный атрибут hint — всплывающую подсказку. * b — bold. * i — italic. * u — underline. * font — шрифт. Атрибуты: size, face, color. Ну, это должно быть всем и так ясно. * code — моноширинный шрифт для кода. Вот HintML описывающий символ из анимированной приведенной ниже гифки ниже. Приводу описание только одного символа, чтобы не путать. В реальноти таких описания два, так как под курсором два (неоднозначных) символа.
А это код сообщения об ошибке из того же хинта:
Для упрощения генерации HintML я создал модуль:
Ну, и собственно, как это выглядит: PS Основная работа по хинтам завершена, но баги еще есть. Они будут отлажены по ходу пьесы. |