`

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

阅读更多

JFace Text Editor是JFace里面一个功能强大,结构复杂而且非常重要的组件,要掌握它还需要花不少的功夫,下面我们将通过"Building an Eclipse Text Editor with JFace Text"的翻译来掌握它的用法
提到Text Editor,就不得不提到与之密切相关的SourceViewerConfiguration类,Text Editor的许多功能都是通过该类配置上去的,还有一个是IDocumentProvider接口,Text Editor所要编辑的文件对象就是通过该接口提供的.

Editor编辑的内容封装在IDocument这个类中,对于编辑内容的遍历,定位都是在IDocument的基础上来实现的,而文档的分割信息以及其他的元数据信息(比如高亮区域)则由Editor来保存,Document中的定位信息将使用一个Position类来加以封装.

虽然IDocument有不同的实现,但是他们都一个共同点,那就是这些内容都是可分割的,即能被分割成一块一块的互不重叠的文本块.分割(Partition)在Text Editor中是一个非常非常重要的概念,基本上Text Editor的所有功能都是建立在文档分割的基础上的.

IDocument接口并不关心文本内容的存储和加载,它的工作就是初始化一个文档对象实例,而文档的各种属性的初始化则交给IDocumentProvider来完成.

在打开一个文档的时候编辑器将同时进行文档的分割处理,其结果是得到各种不同类型的互不重叠文本块

下面我们来讲讲分割器,分割器的设置是在IDocumentProvider的createDocument()方法中实现的,如下代码所示:

java 代码
  1. protected IDocument createDocument(Object element) throws CoreException   
  2. {   
  3.     IDocument document = super.createDocument(element);   
  4.     if (document != null)   
  5.     {   
  6.         IDocumentPartitioner partitioner = new XMLPartitioner(   
  7.         new XMLPartitionScanner(), new String[]                               
  8.           {   
  9.                   XMLPartitionScanner.XML_TAG, XMLPartitionScanner.XML_COMMENT   
  10.           });   
  11.         partitioner.connect(document);   
  12.         document.setDocumentPartitioner(partitioner);   
  13.     }   
  14.     return document;   
  15. }  

 

从上面的代码我们可以看到,初始化一个IDocumentPartitioner我们需要两个参数,一个是必须指定一个IPartitionTokenScanner实例,另一个是所支持的内容类型(content type)数组.

与分割相关的还有三个概念:Scanner, Token和Rule, Scanner的任务就是将当前编辑的文档对象进行扫描并得到每一个文本块所对应的Token,对于Token需要解释一下,它是IToken的一个实现,被视为内容类型的唯一标识符.比如一个Token可能表示的是某种语言中的关键字,xml元素名,空格等.

通过下面的代码来说明Scanner是如何来查找各个Token的.

java 代码
  1. public class XMLPartitionScanner extends RuleBasedPartitionScanner   
  2. {   
  3.     public final static String XML_DEFAULT = "__xml_default";   
  4.     public final static String XML_COMMENT = "__xml_comment";   
  5.     public final static String XML_TAG = "__xml_tag";   
  6.   
  7.     public XMLPartitionScanner()   
  8.     {   
  9.   
  10.         IToken xmlComment = new Token(XML_COMMENT);   
  11.         IToken tag = new Token(XML_TAG);   
  12.   
  13.         IPredicateRule[] rules = new IPredicateRule[2];   
  14.   
  15.         rules[0] = new MultiLineRule("", xmlComment);   
  16.         rules[1] = new TagRule(tag);   
  17.   
  18.         setPredicateRules(rules);   
  19.     }   
  20. }   
  21.   

 

在一个编辑器中每一种内容类型(content type)都表示为一个字符串常量.在上面的代码中,定义了三个内容类型:默认,xml标签和xml注释.为了简化,这里我们没有对xml中的节点文本内容以及xml指令定义类型, 在XMLPartitionScanner中,每一个内容类型都和一个IToken实例相关联的,而IToken实例非常简单,仅仅只是一个内容类型标识符,用来在XMLPartitionScanner对文档进行扫描的时候,对各种Token进行识别, 由于我们的Scanner是继承RuleBasedPartitionScanner的,因此它的Token将与一系列规则对应,而分割器通过这些规则来将文档分割成所需要的结构,在XMLPartitionScanner中,我们使用了两条规则来将内容类型进行配置:一个是MultiLineRule,对应注释内容类型,一个是TagRule对应xml标签类型,在根据内容类型进行分割时,当找到一个匹配的分割片段之后将返回一个唯一的Token,这样就在内容类型,Rule 以及Token之间做到了一一对应.

使用一个基于规则的Scanner对文档进行分割的工作原理如下:

  • 1.在RuleBasedPartitionScanner构造器中配置一些规则   
  • 2.分割时调用Rule的evaluate()方法   
  • 3.在evaluate方法中根据配置的各种规则实现类将对得到的一段字符串片段进行匹配,比如用于查找XML注释的MultiLineRule只去匹配那些以注释开始并以注释结尾 结束的字符片段,这种匹配只有两种结果:成功或失败,还是拿匹配注释的MultiLineRule来说,如果匹配的字符串片段为"一般节点"那么它会马上返回,因为匹配的字符串不是以注释开头开始的,如果匹配失败,扫描器将重新定位到匹配字符串的起始位置,并返回Token.UNDEFINED,接着调用下一个rule的evaluate()方法进行匹配处理,如果找到则返回匹配的Token,而且Scanner将去获取当前字符串在整个文档中的位置以及长度,并使用TypedPosition类将这些信息与其内容类型加以封装保存到IDocument实例中.

    IDocumentPartitioner通过computePartitioning()方法将得到文档的分割信息,当然了,在得到分割信息之前,必须要将文档对象与IDocumentPartitioner实例关联起来,这个是通过IDocumentPartitioner.connect(document)来实现的.

    当使用规则对文档进行分割,可能主要的工作就是去定义IPredicateRule的各种实现类,该接口的实现包括MultiLineRule, SingleLineRule 和 PatternRule等,理解该接口的难点在于如何配置这些规则,有时候,我们可能需要提供自己的IPredicateRule实现类

    除了自定义规则之外,我们也可以提供自己的ITokenScanner实现.比如在JDT中,就实现了自己的ITokenScanner类FastJavaPartitionScanner,显然这个工作是巨大的,一般我们不这样做,除非有必要.

    对文档进行分割之后,接下来将要介绍如何显示,Text Editor的底层采用StyledText控件来显示编辑的文本内容, ITextViewer提供了一套API来封装StyledText处理IDocument模型的细节,这样Text Editor的使用者就不用再与底层的StyledText打交道了.

    ITextViewer除了对StyledText进行封装之外还提供了其他如Undo Management这样的功能,要了解更多细节可以去看看JavaDoc文档.

    为了更容易的创建一个结构化文档编辑器,Eclipse在ITextViewer的基础上又提供了一个ISourceViewer接口,它包括的功能更强大,比如错误标记, 语法高亮等,下面我们将一一进行介绍

    JFace Text Editor通过SourceViewerConfiguration类来对Source Viewer进行配置,我们需要做的就是继承SourceViewerConfiguration类来对SourceViewer进行定制,SourceViewer的很多功能比如文本格式化,语法高亮,双击选择,自动提示等等都是通过对SourceViewerConfiguration配置来实现的,足见其重要性不容忽视.

    下面将通过在一个增强版的XML编辑器来实战Text Editor的用法

    Eclipse插件开发套件提供一个向导来帮助用户创建一个简单的XML Editor,下面我们将在该编辑器的基础上来进行扩展

    该XML编辑器将实现下面五个功能:语法高亮(Syntax hightlighting),错误标识(Error marker),格式化(Formating),内容辅助(Content Assistance), 内容大纲(Content Outline)

    进行扩展的第一步就是增加新的分割模型,我们增加了下面三个分割的内容类型:XML文本, CData内容, XML处理指令.

    为了在我们的XMLPartionScanner中处理指令类型定义, 先:

    java 代码
    1. public final static String XML_PI = "__xml_pi";   

     

    然后注册到分割器中,这个是在构造IDocumentPartitioner实例时作为参数传递进去的:

    java 代码
    1. protected IDocument createDocument(Object element) throws CoreException   
    2. {   
    3.     IDocument document = super.createDocument(element);   
    4.     if (document != null)   
    5.     {   
    6.         IDocumentPartitioner partitioner = new XMLPartitioner(   
    7.          new XMLPartitionScanner(), new String[]   
    8.         {   
    9.                 XMLPartitionScanner.XML_START_TAG,   
    10.                 XMLPartitionScanner.XML_PI,   
    11.                 XMLPartitionScanner.XML_DOCTYPE,   
    12.                 XMLPartitionScanner.XML_END_TAG,   
    13.                 XMLPartitionScanner.XML_TEXT,   
    14.                 XMLPartitionScanner.XML_CDATA,   
    15.                 XMLPartitionScanner.XML_COMMENT   
    16.         });   
    17.         partitioner.connect(document);   
    18.         document.setDocumentPartitioner(partitioner);   
    19.     }   
    20.     return document;   
    21. }   

     

    接下来是创建用于标识不同类型内容的Token和Rule,由于我们使用的是基于规则的Scaner(RuleBasedPartitionScanner),因此我们需要添加一对Token和Rule,这样才能让我们的IPartitionTokenScanner实例能感知我们定义的内容类型

    根据XML定义规范,XML指令必须以<!---->结束,因此我们将这样来定义我们的Token和Rule:

    java 代码
    1. public XMLPartitionScanner()   
    2. {   
    3.   
    4.     IToken xmlComment = new Token(XML_COMMENT);   
    5.     IToken xmlPI = new Token(XML_PI);   
    6.     IToken startTag = new Token(XML_START_TAG);   
    7.     IToken endTag = new Token(XML_END_TAG);   
    8.     IToken docType = new Token(XML_DOCTYPE);   
    9.     IToken text = new Token(XML_TEXT);   
    10.   
    11.     IPredicateRule[] rules = new IPredicateRule[7];   
    12.   
    13.     rules[0] = new NonMatchingRule();   
    14.     rules[1] = new MultiLineRule("<!---->", xmlComment);   
    15.     rules[2] = new MultiLineRule("<!---->"?>", xmlPI);   
    16.     rules[3] = new MultiLineRule("">", endTag);   
    17.     rules[4] = new StartTagRule(startTag);   
    18.     rules[5] = new MultiLineRule("<!---->">", docType);   
    19.     rules[6] = new XMLTextPredicateRule(text);   
    20.   
    21.     setPredicateRules(rules);   
    22. }   
    23.   

     

    为了让SourceViewerConfiguration能知道我们添加的新的内容类型,我们还需要重载getConfiguredContentTypes方法:

    java 代码
    1. public String[] getConfiguredContentTypes(ISourceViewer sourceViewer)   
    2. {   
    3.     return new String[]   
    4.     {   
    5.             IDocument.DEFAULT_CONTENT_TYPE,   
    6.             XMLPartitionScanner.XML_COMMENT,   
    7.             XMLPartitionScanner.XML_PI,   
    8.             XMLPartitionScanner.XML_DOCTYPE,   
    9.             XMLPartitionScanner.XML_START_TAG,   
    10.             XMLPartitionScanner.XML_END_TAG,   
    11.             XMLPartitionScanner.XML_TEXT   
    12.     };   
    13. }  
  • 分享到:
    评论

    相关推荐

      swt JFace的API文档

      1. **Widgets**:这是 SWT 的核心部分,包含了各种 GUI 元素,如 Button、Label、Text、Table 等。每个元素都有对应的类,同时提供了丰富的属性和方法来定制其行为和外观。 2. **Events and Listeners**:这部分...

      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源码

      1. **取消默认补全功能**:在原版Eclipse JFace Text中,提供了对常见字符的自动补全功能,这在许多情况下非常方便。但在某些特定场景下,开发者可能希望禁用这些预设的补全,比如在编写特定格式的代码时。通过修改...

      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