- 浏览: 2467342 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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查询
错误标识(Error Marking)
Error Marking用来对编辑的文档根据一定的规则进行验证,比如对于XML文档来说,可能是XML DTD或者XML Schema.其实现跟内容大纲比较类似,首先在解析文档的时候对error加以标识.这里我们使用了SAX ErrorHandler来收集和定位所有的error, 接着在生成内容大纲的同时进行验证和error marking,这个工作在文档被加载和文档保存的时候都会进行.
在XMLEditor的validateAndMark()方法中完成对error marking的初始化:
- protected void validateAndMark()
- {
- IDocument document = getInputDocument();
- MarkingErrorHandler markingErrorHandler =
- new MarkingErrorHandler(getInputFile(), document);
- markingErrorHandler.removeExistingMarkers();
- XMLParser parser = new XMLParser();
- parser.setErrorHandler(markingErrorHandler);
- String text = document.get();
- parser.doParse(text);
- }
MarkingErrorHandler的实例化需要两个参数:一个是IFile实例,用来执行marking(Eclipse Marker API将通过IFile来引用底层的Resource对象),另一个是编辑的IDocument实例(用来确定插入到文档中的marker的位置)
在文档被解析之前,已有的error marker都必须先清掉, 在解析文档的时候如果发现错误,将调用MarkingErrorHandler的handleError()方法:
- protected void handleError(SAXParseException e, boolean isFatal)
- {
- int lineNumber = e.getLineNumber();
- int columnNumber = e.getColumnNumber();
- Map map = new HashMap();
- MarkerUtilities.setLineNumber(map, lineNumber);
- MarkerUtilities.setMessage(map, e.getMessage());
- map.put(IMarker.MESSAGE, e.getMessage());
- map.put(IMarker.LOCATION, file.getFullPath().toString());
- Integer charStart = getCharStart(lineNumber, columnNumber);
- if (charStart != null)
- map.put(IMarker.CHAR_START, charStart);
- Integer charEnd = getCharEnd(lineNumber, columnNumber);
- if (charEnd != null)
- map.put(IMarker.CHAR_END, charEnd);
- map.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));
- try
- {
- MarkerUtilities.createMarker(file, map, ERROR_MARKER_ID);
- }
- catch (CoreException ee)
- {
- ee.printStackTrace();
- }
- }
这里我们的编辑器通过XML解析器(Xerces)不仅取得了error信息,而且还得到了发生错误的位置信息,因此上面的代码看起来非常的清晰:首先取得错误信息的行号和列号,然后使用Eclipse Marker API创建一个Error Marker
内容辅助
最后我们将要介绍的一个功能是内容辅助, 下图是我们的实现效果, 这里我们只是一个简单的实现,对于一个商业的XML编辑器来说,更强悍的就是能够根据当前光标的位置以及定义的DTD做更精确的内容辅助
为了让我们的内容辅助功能做的更智能,我们需要知道当前文档的结构以及当前光标在文档结构中的位置
跟其他功能类似,内容辅助功能也是通过SourceViewerConfiguration来提供的,下面是我们的实现代码:
- public IContentAssistant getContentAssistant(ISourceViewer sourceViewer)
- {
- ContentAssistant assistant = new ContentAssistant();
- IContentAssistProcessor tagContentAssistProcessor
- = new TagContentAssistProcessor(getXMLTagScanner());
- assistant.setContentAssistProcessor(tagContentAssistProcessor,
- XMLPartitionScanner.XML_START_TAG);
- assistant.enableAutoActivation(true);
- assistant.setAutoActivationDelay(500);
- assistant.setProposalPopupOrientation(IContentAssistant.CONTEXT_INFO_BELOW);
- assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_BELOW);
- return assistant;
- }
上面的代码比较简单,首先创建一个ContentAssistant实例,然后设置一些UI属性,这里主要注意IContentAssistProcessor的实现,我们实现的内容辅助只是针对节点,而且内容辅助也是建立在对编辑文档的分割处理的基础上.分割处理我们前面已经讲的够多了,这里我们就不再做说明
内容辅助的UI处理都在ContentAssistant中实现,一般情况下我们不需要子类化,除非当前的功能无法满足我们的要求
内容辅助的智能之处主要体现IContentAssistProcessor的实现上,而一般我们最感兴趣的就是ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset);方法,内容辅助的提示内容列表就是在该方法中提供,这里是我们的代码实现:
- public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset)
- {
- IDocument document = viewer.getDocument();
- boolean isAttribute = isAttribute(offset, document);
- TextInfo currentText = currentText(document, offset);
- if (!isAttribute)
- {
- List allElements = dtdTree.getAllElements();
- ICompletionProposal[] result = new ICompletionProposal[allElements.size()];
- int i = 0;
- for (Iterator iter = allElements.iterator(); iter.hasNext();)
- {
- XMLElement element = (XMLElement) iter.next();
- String name = element.getName();
- String text = "" + name + ">" + "</" + name + ">";
- }
- result[i++] = new CompletionProposal(text,
- currentText.documentOffset,
- currentText.text.length(),
- text.length());
- }
- return result;
- }
- else
- {
- List allAttributes = dtdTree.getAllAttributes();
- ICompletionProposal[] result = new ICompletionProposal[allAttributes.size()];
- int i = 0;
- for (Iterator iter = allAttributes.iterator(); iter.hasNext();)
- {
- String name = (String) iter.next();
- String text = name + "= \"\" ";
- result[i++] = new CompletionProposal(text,
- currentText.documentOffset,
- currentText.text.length(),
- text.length());
- }
- return result;
- }
- }
上面的代码非常的简单,首先根据当前位置是否为属性,是则列出已知的所有属性名,否则列出所有的节点名.
当然这里我们的做法非常简单,更高级的实现是对整个文档进行扫描来确定当前光标在整个文档结构中所处的位置, 然后使用DTD验证计算当前需要提示的更精确的内容列表, 这就需要根据DTD来理解我们的文档
总结
构建一个强大的文本编辑器在Eclipse插件开发中常常会碰到, 而JFace Text Editor是我们展开工作的基础, 它是Eclipse非常强大,非常重要的一套API, 同时也是非常复杂的一套API.
这里我们从Eclipse PDE提供的XML Editor向导例子入手,通过对其进行扩展, 演示了高亮显示, 内容格式化, 内容大纲, 错误标记, 内容辅助几个功能的实现, 希望这篇文章对你来实现自己强大的文本编辑器能有所帮助
评论
fay19880111@yeah.net
谢谢啦~~~~
发表评论
-
Java程序员25个必备的Eclipse插件
2012-01-12 22:36 21923原文:http://www.fromdev.com/2012/ ... -
关于插件更新安装的错误
2007-12-21 20:12 2205在更新插件的时候出现这样的错误: Unable to comp ... -
最近做eclipse branding, features的一些经验
2007-12-16 01:24 4522知道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 5199Object Action 这种Action是跟弹出的上下文菜 ... -
Eclipse Action 深入学习笔记(1)
2007-11-25 17:07 7656以前做插件用到的ActionSet都只是依葫芦画瓢,没有真正理 ... -
JFace Text Editor完全掌握之终极指南(3)
2007-11-24 16:56 5492内容大纲 之所以要给编 ... -
JFace Text Editor完全掌握之终极指南(2)
2007-11-24 16:53 6719最后一步就是实现各种功能 语法高亮 首先我们要实现的是语法高亮 ... -
JFace Text Editor完全掌握之终极指南(1)
2007-11-24 16:17 9976JFace Text Editor是JFace里面一个功能强大 ... -
最近的Eclipse plugin开发总结
2007-11-24 11:30 4933List控件没有提供addDblClickListener方法 ... -
eclipse3.3关于JavaFileEditorInput兼容性问题的解决
2007-11-24 11:22 4666在eclipse3.3中,JavaFileEditor ... -
Eclipse WTP Projects Facets实战指南(2)
2007-11-21 21:13 5245修饰工作 给facet在选择列表中添加图标 格式如下: xml ... -
Eclipse WTP Projects Facets实战指南(1)
2007-11-21 20:21 9580这个文章基本是"Building Project F ... -
也说关于WizardPage的动态生成
2007-11-05 14:26 5149在Eclipse中一个Wizard=Wiza ... -
关于多页编辑器中不同Editor之间的Redo&Undo冲突的解决
2007-09-03 15:17 4053在我们的插件工具的开 ... -
TextEditor原理分析笔记
2007-08-23 15:48 3374Editor的语法着色原理:Eclipse使用damage , ... -
最近的Eclipse开发总结
2007-08-23 15:46 2098java.lang.IllegalAccessError: t ... -
如何判断一个eclipse的版本的代码
2007-08-23 15:41 2952java 代码 String version = ...
相关推荐
JFace 是建立在 SWT 之上的更高层次的抽象,它简化了 GUI 开发,使代码更加简洁和易于理解。JFace 提供了诸如视图、编辑器、对话框、表和树等高级控件,同时也包括数据绑定和模型视图控制器(MVC)设计模式的支持。...
**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时的插件 ...
其中,Eclipse JFace是其核心组件之一,提供了一组高级用户界面工具,用于构建基于Swing的图形用户界面。本文将探讨"org.eclipse.jface.text_3.8.2.v20121126-164145源码",分析其内部结构以及如何进行自定义功能的...
最新版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源码。可直接修改该版本的内容。实现自己想要的功能。