`

JFace Text Editor完全掌握之终极指南(2)

XML 
阅读更多

最后一步就是实现各种功能

语法高亮

首先我们要实现的是语法高亮.如下图所示:

The enhanced XML editor in action 

从本质上来说,语法高亮就是给分割后的Token指定相应的显示属性,在语法高亮的处理机制里面也需要用到Token, Scanner和Rule这些东西.通过复写SourceViewerConfiguration的getPresentationReconciler()方法来给指定的内容类型添加语法高亮的特性:

 

java 代码
  1. public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer)   
  2. {   
  3.     PresentationReconciler reconciler = new PresentationReconciler();   
  4.   
  5.     DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getXMLTagScanner());   
  6.     reconciler.setDamager(dr, XMLPartitionScanner.XML_TAG);   
  7.     reconciler.setRepairer(dr, XMLPartitionScanner.XML_TAG);   
  8.   
  9.     dr = new DefaultDamagerRepairer(getXMLScanner());   
  10.     reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);   
  11.     reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);   
  12.        
  13.     ...   
  14.   
  15.     return reconciler;   
  16. }   
  17.   

在上面的代码中有一个IPresentationReconciler实例,他是用来监听底层的IDocument实例的变动,一个内容类型会跟一个IPresentationDamager和IPresentationRepairer实例相关联,当编辑文档时,将会给受影响的文档区域对应内容类型的IPresentationDamager实例发送消息,接着IPresentationDamager会返回一个IRegion实例,并将这些信息传递给IPresentationRepairer实例,该实例会对发生改变的区域重新设置显示属性.

上述过程听起来可能比较复杂,不过万幸的是我们并不需要自己去实现这些东西, JFace提供了一个DefaultDamagerRepairer来处理IPresentationDamager和IPresentationRepairer要做的事情,同时还提供了一个PresentationReconciler类用来将二者关联起来,而我们要做的就是告诉编辑器在使用给定的内容类型对文档进行分割之后的结构是怎样的,以及每一种文档类型的显示属性

DefaultDamagerRepairer的构造器需要一个ITokenScanner 参数,该接口跟分割Token Scanner非常类似,两种Scanner得到的Token都是IToken的一种实现,不同之处在于Token粒度不同,分割Token Scanner得到的Token是一个具有某种内容类型的文档区域,而使用语法高亮Scanner得到的Token是一段具有相同文本格式的字符串序列,显然后者的粒度更细

这里我们拿XMLTagScanner来说,该Scanner主要针对XML_TAG内容类型, 因此它得到的Token表示的是位于XML标识符之间的文本内容

  1. public class XMLTagScanner extends RuleBasedScanner   
  2. {   
  3.     public XMLTagScanner(ColorManager manager)   
  4.     {   
  5.         Color color = manager.getColor(IXMLColorConstants.STRING);   
  6.         TextAttribute textAttribute = new TextAttribute(color);   
  7.         IToken string = new Token(textAttribute);   
  8.        
  9.         IRule[] rules = new IRule[3];   
  10.        
  11.         // Add rule for double quotes   
  12.         rules[0] = new SingleLineRule("\"""\"", string, '\\');   
  13.         // Add a rule for single quotes   
  14.         rules[1] = new SingleLineRule("'""'", string, '\\');   
  15.         // Add generic whitespace rule.   
  16.         rules[2] = new WhitespaceRule(new XMLWhitespaceDetector());   
  17.        
  18.         setRules(rules);   
  19.     }   
  20. }  

XMLTagScanner继承了RuleBasedScanner,因此和我们在RuleBasedPartitionScanner中看到的一样,它也是使用某种规则处理机制来识别Token的

这里我们定义了三个规则:一个用于匹配双引号中的字符,一个用于匹配单引号中的字符,还有一个则用来匹配空格

为了给XML的标签名显示为蓝色,我们使用以下的代码,即给Token设置一个默认的颜色值:

java 代码
  1. protected XMLTagScanner getXMLTagScanner()   
  2. {   
  3.     if (tagScanner == null)   
  4.     {   
  5.         tagScanner = new XMLTagScanner(colorManager);   
  6.         Color color = colorManager.getColor(IXMLColorConstants.TAG);   
  7.         TextAttribute textAttribute = new TextAttribute(color);   
  8.         Token token = new Token(textAttribute);   
  9.         tagScanner.setDefaultReturnToken(token);   
  10.     }   
  11.     return tagScanner;   
  12. }   

内容格式化

格式化就是通过使用缩进和空格使文档结构化,从而更具有可读性, 格式化处理包括两个步骤:
第一步,为即将格式化的内容定义格式化策略,这些策略可以是全局性的,也可以是针对某个分割区域的.通过IFormattingStrategy接口来实现.
第二步,通过SourceViewerConfiguration实现类给ISourceViewer添加这些策略

格式化也会使用到分割处理,这让我们再一次体会到了掌握以及正确使用文档分割的重要性.下面我们就以最简单的TextFormattingStrategy来进行说明,该格式化策略用于处理嵌套在XML元素中的文本内容

java 代码
  1. public class TextFormattingStrategy extends DefaultFormattingStrategy   
  2. {   
  3.     private static final String lineSeparator = System.getProperty("line.separator");   
  4.   
  5.     public String format(String content,    
  6.         boolean isLineStart,    
  7.         String indentation,    
  8.         int[] positions)   
  9.     {   
  10.         if (indentation.length() == 0)   
  11.             return content;   
  12.         return lineSeparator + content.trim() + lineSeparator + indentation;   
  13.     }   
  14. }   
  15.   

这里我们通过继承DefaultFormattingStrategy并复写format方法来实现, 其具体做法是对文本内容进行trim处理,然后在文本前后加上换行符

上面的介绍可能太简单,在我们的实现类XMLFormattingStrategy中包含了更复杂的格式化处理代码,这里我们对其细节不再一一展开,有兴趣的读者可以自己去加以体会,可以说格式化处理是一项非常有挑战性的活儿,因为它还涉及到对选择的文本进行智能识别的处理,这个需要反复的实验才能得到理想的结果

通过重载SourceViewerConfiguration.getContentFormatter()方法可以非常容易的将格式化操作添加到编辑器中

java 代码
  1. public IContentFormatter getContentFormatter(ISourceViewer sourceViewer)   
  2. {   
  3.     ContentFormatter formatter = new ContentFormatter();   
  4.     XMLFormattingStrategy formattingStrategy = new XMLFormattingStrategy();   
  5.     DefaultFormattingStrategy defaultStrategy = new DefaultFormattingStrategy();   
  6.     TextFormattingStrategy textStrategy = new TextFormattingStrategy();   
  7.     DocTypeFormattingStrategy doctypeStrategy = new DocTypeFormattingStrategy();   
  8.     PIFormattingStrategy piStrategy = new PIFormattingStrategy();   
  9.     formatter.setFormattingStrategy(defaultStrategy, IDocument.DEFAULT_CONTENT_TYPE);   
  10.     formatter.setFormattingStrategy(textStrategy, XMLPartitionScanner.XML_TEXT);   
  11.     formatter.setFormattingStrategy(doctypeStrategy, XMLPartitionScanner.XML_DOCTYPE);   
  12.     formatter.setFormattingStrategy(piStrategy, XMLPartitionScanner.XML_PI);   
  13.     formatter.setFormattingStrategy(textStrategy, XMLPartitionScanner.XML_CDATA);   
  14.     formatter.setFormattingStrategy(formattingStrategy, XMLPartitionScanner.XML_START_TAG);   
  15.     formatter.setFormattingStrategy(formattingStrategy, XMLPartitionScanner.XML_END_TAG);   
  16.   
  17.     return formatter;   
  18. }   
  19.   

上述代码首选创建了一个formatter,然后通过formatter的setFormattingStrategy()方法给我们的每一个内容类型指定一个个格式化策略即可.

分享到:
评论

相关推荐

    swt JFace的API文档

    JFace 是建立在 SWT 之上的更高层次的抽象,它简化了 GUI 开发,使代码更加简洁和易于理解。JFace 提供了诸如视图、编辑器、对话框、表和树等高级控件,同时也包括数据绑定和模型视图控制器(MVC)设计模式的支持。...

    JFace Text Framework教程

    **JFace Text Framework 教程概述** JFace Text Framework是Eclipse平台中的一个核心组件,它为构建基于文本的应用提供了高级服务。这个框架是面向Java开发者设计的,主要用于创建具有高级功能的文本编辑器,例如...

    org.eclipse.jface.text_3.12.2.v20180112-1341.zip

    标题中的"org.eclipse.jface.text_3.12.2.v20180112-1341.zip"是Eclipse插件的一个版本,它专注于文本编辑功能。Eclipse是一个开源的集成开发环境(IDE),而JFace是Eclipse的一部分,提供了面向用户的界面组件。...

    基于_JFace_Text_Framework_构建全功能代码编辑器

    JFace Text Framework是一个高级UI库的一部分,该库建立在SWT(Simple Widget Toolkit)之上。JTF的核心功能包括但不限于语法高亮、内容提示、文本装饰等功能,这些都是基于SWT中的StyledText组件实现的。这意味着JTF...

    SWT/Jface 开发入门指南

    SWT/Jface开发入门指南是一篇专为初学者编写的教程,旨在帮助他们快速搭建开发环境并掌握使用SWT和JFace编写图形化应用程序的基本技巧。以下是该教程所涵盖的关键知识点: 1. **SWT和JFace简介**: - SWT全称...

    org.eclipse.jface.text_3.12.2.v20180112-1341.jar

    标题中的"org.eclipse.jface.text_3.12.2.v20180112-1341.jar"是一个具体的Java库文件,属于Eclipse JFace Text组件的版本3.12.2,发布于2018年1月12日。Eclipse JFace Text是Eclipse IDE中的一个核心组件,它提供了...

    jface.text 3.12.1.zip

    标签"Java 代码补全"揭示了jface.text插件的核心功能之一,即为Java开发提供智能代码补全支持。这种特性能够根据上下文自动填充可能的代码片段,极大地提高了开发效率。代码补全不仅包括关键字、类名、方法名,还...

    org.eclipse.jface.text_3.11.2.v20170220-1911最新修改版

    《Eclipse JFace Text 3.11.2.v20170220-1911:代码上屏优化与修改详解》 在软件开发领域,Eclipse是一款广受欢迎的开源集成开发环境(IDE),其强大的功能和丰富的插件系统使其成为Java开发者的重要工具。在...

    org.eclipse.jface.text

    将现有JAR文件直接替换对应的org.eclipse.jface.text_*(后面的是版本号),只能提示增强,能在abcdef....等输入时提示,解决空格和=不能输入的问题(第一次自己编译的插件 嘎嘎)只能提示增强方法自己搜,这个是解决...

    eclipse与MyEclipse代码提示上屏修改后jar包(org.eclipse.jface.text_3.8.101.v20130802-1147)

    `org.eclipse.jface.text`是Eclipse JFace库的一部分,JFace是构建用户界面的高级API,它基于SWT(Standard Widget Toolkit)并简化了与Eclipse平台的交互。这个特定的版本号(3.8.101.v20130802-1147)表示的是该...

    org.eclipse.jface.text_3.14.0.v20180824-1140

    最新版Eclipse代码上屏jar包,取消空格、点以及分号的代码自动补全上屏,增加tab键上屏,将jar包复制到eclipse根目录下的plugins文件夹,替换源文件即可。

    MyEclipse10.7.1代码补全vs风格 jface.text修正版

    因为10.7.1已经完美破解(修正了war文件到处问题),故放上该版本修改过的org.eclipse.jface.text_3.7.2.v20111213-1208.jar 代码补全空格不上屏,适合习惯使用vs等工具的用户 详细描述参见10.0时的插件 ...

    org.eclipse.jface.text_3.8.2.v20121126-164145源码

    其中,Eclipse JFace是其核心组件之一,提供了一组高级用户界面工具,用于构建基于Swing的图形用户界面。本文将探讨"org.eclipse.jface.text_3.8.2.v20121126-164145源码",分析其内部结构以及如何进行自定义功能的...

    org.eclipse.jface.text_3.13.0.v20180516-1339

    最新版Eclipse代码自动补全,替换Eclipse安装目录下制定jar包,实现只有tab下智能提示代码上屏,回车空格状态下正常!

    jface.text - Jar [去掉 空格 + 等号的提示]

    jface.text - Jar [去掉 空格 + 等号的提示] by 970655147

    org.eclipse.jface.text_3.9.2.v20141003-1326.jar-修改版

    eclipse 取消 "=",空格,“.”的自动补全。org.eclipse.jface.text_3.9.2.v20141003-1326.jar修改版。 使用方法:解压复制到安装目录的同级目录替换即可。安全起见,可以先备份原文件。

    org.eclipse.jface.text_3.9.2.v20141003-1326.zip

    标题中的"org.eclipse.jface.text_3.9.2.v20141003-1326.zip"是一个Eclipse插件的压缩包,主要用于增强Eclipse集成开发环境(IDE)的文本编辑功能。这个插件是JFace Text组件的一部分,JFace是Eclipse工作台...

    org.eclipse.jface.text_3.7.2.v20111213-1208源码

    这个是针对Eclipse SDK Version: 3.7 jface.text._3.7.2源码。可直接修改该版本的内容。实现自己想要的功能。

    org.eclipse.jface.text_3.16.300.v20200526-0811

    org.eclipse.jface.text_3.16.300.v20200526-0811.jar

    org.eclipse.jface.text.3.8.101.v20130802源码Eclipse4.3

    这个是针对Eclipse SDK Version: 4.3. jface.text._3.8.1源码。可直接修改该版本的内容。实现自己想要的功能。

Global site tag (gtag.js) - Google Analytics