- 浏览: 2467288 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
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()方法中实现的,如下代码所示:
- protected IDocument createDocument(Object element) throws CoreException
- {
- IDocument document = super.createDocument(element);
- if (document != null)
- {
- IDocumentPartitioner partitioner = new XMLPartitioner(
- new XMLPartitionScanner(), new String[]
- {
- XMLPartitionScanner.XML_TAG, XMLPartitionScanner.XML_COMMENT
- });
- partitioner.connect(document);
- document.setDocumentPartitioner(partitioner);
- }
- return document;
- }
从上面的代码我们可以看到,初始化一个IDocumentPartitioner我们需要两个参数,一个是必须指定一个IPartitionTokenScanner实例,另一个是所支持的内容类型(content type)数组.
与分割相关的还有三个概念:Scanner, Token和Rule, Scanner的任务就是将当前编辑的文档对象进行扫描并得到每一个文本块所对应的Token,对于Token需要解释一下,它是IToken的一个实现,被视为内容类型的唯一标识符.比如一个Token可能表示的是某种语言中的关键字,xml元素名,空格等.
通过下面的代码来说明Scanner是如何来查找各个Token的.
- public class XMLPartitionScanner extends RuleBasedPartitionScanner
- {
- public final static String XML_DEFAULT = "__xml_default";
- public final static String XML_COMMENT = "__xml_comment";
- public final static String XML_TAG = "__xml_tag";
- public XMLPartitionScanner()
- {
- IToken xmlComment = new Token(XML_COMMENT);
- IToken tag = new Token(XML_TAG);
- IPredicateRule[] rules = new IPredicateRule[2];
- rules[0] = new MultiLineRule("", xmlComment);
- rules[1] = new TagRule(tag);
- setPredicateRules(rules);
- }
- }
在一个编辑器中每一种内容类型(content type)都表示为一个字符串常量.在上面的代码中,定义了三个内容类型:默认,xml标签和xml注释.为了简化,这里我们没有对xml中的节点文本内容以及xml指令定义类型, 在XMLPartitionScanner中,每一个内容类型都和一个IToken实例相关联的,而IToken实例非常简单,仅仅只是一个内容类型标识符,用来在XMLPartitionScanner对文档进行扫描的时候,对各种Token进行识别, 由于我们的Scanner是继承RuleBasedPartitionScanner的,因此它的Token将与一系列规则对应,而分割器通过这些规则来将文档分割成所需要的结构,在XMLPartitionScanner中,我们使用了两条规则来将内容类型进行配置:一个是MultiLineRule,对应注释内容类型,一个是TagRule对应xml标签类型,在根据内容类型进行分割时,当找到一个匹配的分割片段之后将返回一个唯一的Token,这样就在内容类型,Rule 以及Token之间做到了一一对应.
使用一个基于规则的Scanner对文档进行分割的工作原理如下:
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中处理指令类型定义, 先:
- public final static String XML_PI = "__xml_pi";
然后注册到分割器中,这个是在构造IDocumentPartitioner实例时作为参数传递进去的:
- protected IDocument createDocument(Object element) throws CoreException
- {
- IDocument document = super.createDocument(element);
- if (document != null)
- {
- IDocumentPartitioner partitioner = new XMLPartitioner(
- new XMLPartitionScanner(), new String[]
- {
- XMLPartitionScanner.XML_START_TAG,
- XMLPartitionScanner.XML_PI,
- XMLPartitionScanner.XML_DOCTYPE,
- XMLPartitionScanner.XML_END_TAG,
- XMLPartitionScanner.XML_TEXT,
- XMLPartitionScanner.XML_CDATA,
- XMLPartitionScanner.XML_COMMENT
- });
- partitioner.connect(document);
- document.setDocumentPartitioner(partitioner);
- }
- return document;
- }
接下来是创建用于标识不同类型内容的Token和Rule,由于我们使用的是基于规则的Scaner(RuleBasedPartitionScanner),因此我们需要添加一对Token和Rule,这样才能让我们的IPartitionTokenScanner实例能感知我们定义的内容类型
根据XML定义规范,XML指令必须以<!---->结束,因此我们将这样来定义我们的Token和Rule:
- public XMLPartitionScanner()
- {
- IToken xmlComment = new Token(XML_COMMENT);
- IToken xmlPI = new Token(XML_PI);
- IToken startTag = new Token(XML_START_TAG);
- IToken endTag = new Token(XML_END_TAG);
- IToken docType = new Token(XML_DOCTYPE);
- IToken text = new Token(XML_TEXT);
- IPredicateRule[] rules = new IPredicateRule[7];
- rules[0] = new NonMatchingRule();
- rules[1] = new MultiLineRule("<!---->", xmlComment);
- rules[2] = new MultiLineRule("<!---->, "?>", xmlPI);
- rules[3] = new MultiLineRule(", ">", endTag);
- rules[4] = new StartTagRule(startTag);
- rules[5] = new MultiLineRule("<!---->, ">", docType);
- rules[6] = new XMLTextPredicateRule(text);
- setPredicateRules(rules);
- }
为了让SourceViewerConfiguration能知道我们添加的新的内容类型,我们还需要重载getConfiguredContentTypes方法:
- public String[] getConfiguredContentTypes(ISourceViewer sourceViewer)
- {
- return new String[]
- {
- IDocument.DEFAULT_CONTENT_TYPE,
- XMLPartitionScanner.XML_COMMENT,
- XMLPartitionScanner.XML_PI,
- XMLPartitionScanner.XML_DOCTYPE,
- XMLPartitionScanner.XML_START_TAG,
- XMLPartitionScanner.XML_END_TAG,
- XMLPartitionScanner.XML_TEXT
- };
- }
发表评论
-
Java程序员25个必备的Eclipse插件
2012-01-12 22:36 21923原文:http://www.fromdev.com/2012/ ... -
关于插件更新安装的错误
2007-12-21 20:12 2204在更新插件的时候出现这样的错误: Unable to comp ... -
最近做eclipse branding, features的一些经验
2007-12-16 01:24 4521知道eclipse的splash怎么做 ... -
GEF学习笔记
2007-12-07 20:20 4146GEF以前学习过, 而且还 ... -
SWT布局深入学习
2007-11-30 23:00 7932以下内容是学习"The Definitive Gui ... -
Eclipse Action 深入学习笔记(3)
2007-11-25 17:59 4075filter元素是用来指定当 ... -
Eclipse Action 深入学习笔记(2)
2007-11-25 17:14 5198Object Action 这种Action是跟弹出的上下文菜 ... -
Eclipse Action 深入学习笔记(1)
2007-11-25 17:07 7655以前做插件用到的ActionSet都只是依葫芦画瓢,没有真正理 ... -
JFace Text Editor完全掌握之终极指南(4)
2007-11-24 17:08 5665错误标识(Error Marking) Error Marki ... -
JFace Text Editor完全掌握之终极指南(3)
2007-11-24 16:56 5491内容大纲 之所以要给编 ... -
JFace Text Editor完全掌握之终极指南(2)
2007-11-24 16:53 6717最后一步就是实现各种功能 语法高亮 首先我们要实现的是语法高亮 ... -
最近的Eclipse plugin开发总结
2007-11-24 11:30 4932List控件没有提供addDblClickListener方法 ... -
eclipse3.3关于JavaFileEditorInput兼容性问题的解决
2007-11-24 11:22 4666在eclipse3.3中,JavaFileEditor ... -
Eclipse WTP Projects Facets实战指南(2)
2007-11-21 21:13 5244修饰工作 给facet在选择列表中添加图标 格式如下: xml ... -
Eclipse WTP Projects Facets实战指南(1)
2007-11-21 20:21 9579这个文章基本是"Building Project F ... -
也说关于WizardPage的动态生成
2007-11-05 14:26 5149在Eclipse中一个Wizard=Wiza ... -
关于多页编辑器中不同Editor之间的Redo&Undo冲突的解决
2007-09-03 15:17 4052在我们的插件工具的开 ... -
TextEditor原理分析笔记
2007-08-23 15:48 3373Editor的语法着色原理:Eclipse使用damage , ... -
最近的Eclipse开发总结
2007-08-23 15:46 2096java.lang.IllegalAccessError: t ... -
如何判断一个eclipse的版本的代码
2007-08-23 15:41 2951java 代码 String version = ...
相关推荐
1. **Widgets**:这是 SWT 的核心部分,包含了各种 GUI 元素,如 Button、Label、Text、Table 等。每个元素都有对应的类,同时提供了丰富的属性和方法来定制其行为和外观。 2. **Events and Listeners**:这部分...
**JFace Text Framework 教程概述** JFace Text Framework是Eclipse平台中的一个核心组件,它为构建基于文本的应用提供了高级服务。这个框架是面向Java开发者设计的,主要用于创建具有高级功能的文本编辑器,例如...
标题中的"org.eclipse.jface.text_3.12.2.v20180112-1341.zip"是Eclipse插件的一个版本,它专注于文本编辑功能。Eclipse是一个开源的集成开发环境(IDE),而JFace是Eclipse的一部分,提供了面向用户的界面组件。...
JFace Text Framework是一个高级UI库的一部分,该库建立在SWT(Simple Widget Toolkit)之上。JTF的核心功能包括但不限于语法高亮、内容提示、文本装饰等功能,这些都是基于SWT中的StyledText组件实现的。这意味着JTF...
标题中的"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中的一个核心组件,它提供了...
标签"Java 代码补全"揭示了jface.text插件的核心功能之一,即为Java开发提供智能代码补全支持。这种特性能够根据上下文自动填充可能的代码片段,极大地提高了开发效率。代码补全不仅包括关键字、类名、方法名,还...
《Eclipse JFace Text 3.11.2.v20170220-1911:代码上屏优化与修改详解》 在软件开发领域,Eclipse是一款广受欢迎的开源集成开发环境(IDE),其强大的功能和丰富的插件系统使其成为Java开发者的重要工具。在...
将现有JAR文件直接替换对应的org.eclipse.jface.text_*(后面的是版本号),只能提示增强,能在abcdef....等输入时提示,解决空格和=不能输入的问题(第一次自己编译的插件 嘎嘎)只能提示增强方法自己搜,这个是解决...
`org.eclipse.jface.text`是Eclipse JFace库的一部分,JFace是构建用户界面的高级API,它基于SWT(Standard Widget Toolkit)并简化了与Eclipse平台的交互。这个特定的版本号(3.8.101.v20130802-1147)表示的是该...
最新版Eclipse代码上屏jar包,取消空格、点以及分号的代码自动补全上屏,增加tab键上屏,将jar包复制到eclipse根目录下的plugins文件夹,替换源文件即可。
因为10.7.1已经完美破解(修正了war文件到处问题),故放上该版本修改过的org.eclipse.jface.text_3.7.2.v20111213-1208.jar 代码补全空格不上屏,适合习惯使用vs等工具的用户 详细描述参见10.0时的插件 ...
1. **取消默认补全功能**:在原版Eclipse JFace Text中,提供了对常见字符的自动补全功能,这在许多情况下非常方便。但在某些特定场景下,开发者可能希望禁用这些预设的补全,比如在编写特定格式的代码时。通过修改...
最新版Eclipse代码自动补全,替换Eclipse安装目录下制定jar包,实现只有tab下智能提示代码上屏,回车空格状态下正常!
jface.text - Jar [去掉 空格 + 等号的提示] by 970655147
eclipse 取消 "=",空格,“.”的自动补全。org.eclipse.jface.text_3.9.2.v20141003-1326.jar修改版。 使用方法:解压复制到安装目录的同级目录替换即可。安全起见,可以先备份原文件。
标题中的"org.eclipse.jface.text_3.9.2.v20141003-1326.zip"是一个Eclipse插件的压缩包,主要用于增强Eclipse集成开发环境(IDE)的文本编辑功能。这个插件是JFace Text组件的一部分,JFace是Eclipse工作台...
这个是针对Eclipse SDK Version: 3.7 jface.text._3.7.2源码。可直接修改该版本的内容。实现自己想要的功能。
org.eclipse.jface.text_3.16.300.v20200526-0811.jar
这个是针对Eclipse SDK Version: 4.3. jface.text._3.8.1源码。可直接修改该版本的内容。实现自己想要的功能。