语法着色是在使用损坏、修复和协调模型的平台文本框架中提供的。对于应用于文档的每个更改,表示协调程序确定可视表示的哪个区域应是失效的以及如何修复它。可以将不同的策略用于文档中的不同内容类型。
是否实现语法着色(以及使用表示协调程序来实现)是可选的。缺省情况下,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(它将文档分成表示 javadoc、多行注释和其它内容的内容类型)。
对于每种这些内容类型,都必须指定损坏程序/修复程序对。这是在下面使用 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 的子类中具有将所有行为覆盖合并到同一个位置的优点。在编辑器有效期间,当不同的表示协调程序与一个查看器相连时,动态协议可能就很有用。