Функция выделения синтаксиса цветом реализована в платформе в соответствии с моделью повреждения, исправления и синхронизации. Для каждого изменения, внесенного в документ, синхронизатор оформления определяет область визуального представления, которую требуется временно аннулировать, а также способ исправления. Для различных типов содержимого документа можно применять разные стратегии.
Реализация выделения синтаксиса цветом (а также применение для этой цели синхронизатора оформления) не обязательна. По умолчанию синхронизатор оформления не устанавливается, поскольку классу SourceViewerConfiguration неизвестна модель документа, связанная с конкретным редактором, в которой заданы параметры работы этой функции.
Реализация функции выделения синтаксиса цветом с помощью классов синхронизации предусматривает настройку определения синхронизатора оформления в конфигурации программы просмотра исходного кода редактора. Рассмотрим способ определения синхронизатора оформления в классе JavaSourceViewerConfiguration.
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { PresentationReconciler reconciler= new PresentationReconciler(); ... return reconciler; }
Прежде чем перейти к описанию работы синхронизатора оформления, следует рассмотреть концепции повреждения, исправления и синхронизации.
По мере внесения изменений в текст редактор должен повторно отображать отдельные его фрагменты. Процесс выбора текста для повторного отображения называется вычислением повреждений. Если применяется выделение синтаксиса цветом, то объем повреждений, обусловленных редактированием возрастает, поскольку добавление или удаление одного символа может изменить цвет окружающего его текста.
Обработчики повреждений (IPresentationDamager) определяют область оформления документа, которую требуется обновить в соответствии с внесенными изменениями. Предполагается, что обработчик повреждений связан с конкретным типом содержимого документа (или областью). Он должен возвращать область повреждения в формате, поддерживаемом функцией исправления оформления (IPresentationRepairer). Успешное описание исправлений, необходимых для конкретного типа содержимого, предусматривает извлечение из поврежденной области всей необходимой информации.
Синхронизация - это общий процесс обработки оформления документа по мере внесения в него изменений с помощью редактора. Синхронизатор оформления (IPresentationReconciler) отслеживает изменения, вносимые в текст с помощью связанной программы просмотра. В соответствии с областями документа он определяет измененные типы содержимого и уведомляет связанный обработчик повреждений. Результаты расчета повреждений передаются соответствующей функции исправления. Она создает описания исправлений, которые применяются для синхронизации программы просмотра и ее текущего содержимого.
Классы, входящие в состав org.eclipse.jface.text.reconciler, определяют дополнительные вспомогательные классы для синхронизации модели документа и внешних операций, выполняемых над ним.
Для каждого типа содержимого, применяемого в документе, следует указать синхронизатор оформления, а также обработчик повреждений и функцию исправления. Подходящая реализация синхронизатора оформления определяется непосредственно редактором. Однако в состав платформы входит пакет org.eclipse.jface.text.rules, предоставляющий поддержку поиска и исправления повреждений с помощью сканеров, основанных на правилах. Этот пакет содержит определения обработчиков повреждений и функций исправления по умолчанию. Их совместное применение со стандартными синхронизаторами из пакета org.eclipse.jface.text.presentation позволяет реализовать функцию выделения синтаксиса цветом, определив правила просмотра документа.
Ознакомившись с основными принципами выделения синтаксиса цветом, можно рассмотреть пример создания синхронизатора оформления. Пример редактора Java реализует сканнер JavaPartitionScanner, позволяющий разбить документ на разделы, соответствующие документации по Java, многострочным комментариями и прочему тексту.
Для каждого типа содержимого следует указать обработчик повреждений и функцию исправления. В следующем фрагменте исходного текста для этой цели применяются классы PresentationReconciler и DefaultDamagerRepairer.
JavaColorProvider provider= JavaEditorEnvironment.getJavaColorProvider(); PresentationReconciler reconciler= new PresentationReconciler(); DefaultDamagerRepairer dr= new DefaultDamagerRepairer(JavaEditorEnvironment.getJavaCodeScanner()); reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); dr= new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(JavaColorProvider.JAVADOC_DEFAULT)))); reconciler.setDamager(dr, JavaPartitionScanner.JAVA_DOC); reconciler.setRepairer(dr, JavaPartitionScanner.JAVA_DOC); dr= new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(JavaColorProvider.MULTI_LINE_COMMENT)))); reconciler.setDamager(dr, JavaPartitionScanner.JAVA_MULTILINE_COMMENT); reconciler.setRepairer(dr, JavaPartitionScanner.JAVA_MULTILINE_COMMENT); return reconciler;
Обратите внимание, что в этом примере сканеры указаны для каждого типа содержимого.
Тип содержимого по умолчанию настраивается с помощью класса JavaCodeScanner. обеспечивающего поиск и выделение цветом ключевых слов. Класс JavaCodeScanner задает правила поиска различных типов маркеров, например, однострочных комментариев, пробелов и слов. Кроме того, он описывает цвета, применяемые для выделения слов различных типов маркеров.
Остальные типы содержимого настраиваются с помощью класса SingleTokenScanner. Для них также указывается цвет выделения маркеров.
Процесс обработки повреждений и исправлений различных фрагментов документа в соответствии с правилами просмотра описывается в классе DefaultDamagerRepairer. Как правило, этот процесс реализован независимо от исходного кода модуля. Роль модуля заключается в создании набора правил просмотра содержимого редактора и разбиения его на разделы.
В примере редактора Java предусмотрен производный класс SourceViewerConfiguration , предназначенный для установки синхронизатора оформления, как это было показано выше. Кроме того, при необходимости синхронизатор можно установить в текстовом редакторе динамически с помощью протокола IPresentationReconciler. С практической точки зрения такой подход не приносит дополнительных преимуществ за исключением консолидации всех переопределений расширенных способов работы в отдельном производным классам е SourceViewerConfiguration . Динамический протокол рекомендуется применять в том случае, если с момента открытия редактора до его закрытия к программе просмотра присоединяются несколько синхронизаторов оформления.