`

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

阅读更多

错误标识(Error Marking)
Error Marking用来对编辑的文档根据一定的规则进行验证,比如对于XML文档来说,可能是XML DTD或者XML Schema.其实现跟内容大纲比较类似,首先在解析文档的时候对error加以标识.这里我们使用了SAX ErrorHandler来收集和定位所有的error, 接着在生成内容大纲的同时进行验证和error marking,这个工作在文档被加载和文档保存的时候都会进行.

Support for error marking in the enhanced XML editor 
在XMLEditor的validateAndMark()方法中完成对error marking的初始化:

java 代码
  1. protected void validateAndMark()   
  2. {   
  3.   
  4.     IDocument document = getInputDocument();   
  5.     MarkingErrorHandler markingErrorHandler =    
  6.      new MarkingErrorHandler(getInputFile(), document);   
  7.     markingErrorHandler.removeExistingMarkers();   
  8.   
  9.     XMLParser parser = new XMLParser();   
  10.     parser.setErrorHandler(markingErrorHandler);   
  11.   
  12.     String text = document.get();   
  13.     parser.doParse(text);   
  14.   
  15. }  

MarkingErrorHandler的实例化需要两个参数:一个是IFile实例,用来执行marking(Eclipse Marker API将通过IFile来引用底层的Resource对象),另一个是编辑的IDocument实例(用来确定插入到文档中的marker的位置)

在文档被解析之前,已有的error marker都必须先清掉, 在解析文档的时候如果发现错误,将调用MarkingErrorHandler的handleError()方法:

java 代码
  1. protected void handleError(SAXParseException e, boolean isFatal)   
  2. {   
  3.   
  4.     int lineNumber = e.getLineNumber();   
  5.     int columnNumber = e.getColumnNumber();   
  6.   
  7.     Map map = new HashMap();   
  8.     MarkerUtilities.setLineNumber(map, lineNumber);   
  9.     MarkerUtilities.setMessage(map, e.getMessage());   
  10.     map.put(IMarker.MESSAGE, e.getMessage());   
  11.     map.put(IMarker.LOCATION, file.getFullPath().toString());   
  12.   
  13.     Integer charStart = getCharStart(lineNumber, columnNumber);   
  14.     if (charStart != null)   
  15.         map.put(IMarker.CHAR_START, charStart);   
  16.   
  17.     Integer charEnd = getCharEnd(lineNumber, columnNumber);   
  18.     if (charEnd != null)   
  19.         map.put(IMarker.CHAR_END, charEnd);   
  20.   
  21.     map.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));   
  22.   
  23.     try  
  24.     {   
  25.         MarkerUtilities.createMarker(file, map, ERROR_MARKER_ID);   
  26.     }   
  27.     catch (CoreException ee)   
  28.     {   
  29.         ee.printStackTrace();   
  30.     }   
  31. }   
  32.   

这里我们的编辑器通过XML解析器(Xerces)不仅取得了error信息,而且还得到了发生错误的位置信息,因此上面的代码看起来非常的清晰:首先取得错误信息的行号和列号,然后使用Eclipse Marker API创建一个Error Marker

内容辅助
最后我们将要介绍的一个功能是内容辅助, 下图是我们的实现效果, 这里我们只是一个简单的实现,对于一个商业的XML编辑器来说,更强悍的就是能够根据当前光标的位置以及定义的DTD做更精确的内容辅助

Support for content assist in the enhanced XML editor 

为了让我们的内容辅助功能做的更智能,我们需要知道当前文档的结构以及当前光标在文档结构中的位置

跟其他功能类似,内容辅助功能也是通过SourceViewerConfiguration来提供的,下面是我们的实现代码:

java 代码
  1. public IContentAssistant getContentAssistant(ISourceViewer sourceViewer)   
  2. {   
  3.   
  4.     ContentAssistant assistant = new ContentAssistant();   
  5.   
  6.     IContentAssistProcessor tagContentAssistProcessor    
  7.         = new TagContentAssistProcessor(getXMLTagScanner());   
  8.     assistant.setContentAssistProcessor(tagContentAssistProcessor,   
  9.             XMLPartitionScanner.XML_START_TAG);   
  10.     assistant.enableAutoActivation(true);   
  11.     assistant.setAutoActivationDelay(500);   
  12.     assistant.setProposalPopupOrientation(IContentAssistant.CONTEXT_INFO_BELOW);   
  13.     assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_BELOW);   
  14.     return assistant;   
  15.   
  16. }   
  17.   

上面的代码比较简单,首先创建一个ContentAssistant实例,然后设置一些UI属性,这里主要注意IContentAssistProcessor的实现,我们实现的内容辅助只是针对节点,而且内容辅助也是建立在对编辑文档的分割处理的基础上.分割处理我们前面已经讲的够多了,这里我们就不再做说明

内容辅助的UI处理都在ContentAssistant中实现,一般情况下我们不需要子类化,除非当前的功能无法满足我们的要求

内容辅助的智能之处主要体现IContentAssistProcessor的实现上,而一般我们最感兴趣的就是ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset);方法,内容辅助的提示内容列表就是在该方法中提供,这里是我们的代码实现:

java 代码
  1. public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset)   
  2. {   
  3.   
  4.     IDocument document = viewer.getDocument();   
  5.     boolean isAttribute = isAttribute(offset, document);   
  6.   
  7.     TextInfo currentText = currentText(document, offset);   
  8.   
  9.     if (!isAttribute)   
  10.     {   
  11.   
  12.         List allElements = dtdTree.getAllElements();   
  13.   
  14.         ICompletionProposal[] result = new ICompletionProposal[allElements.size()];   
  15.         int i = 0;   
  16.         for (Iterator iter = allElements.iterator(); iter.hasNext();)   
  17.         {   
  18.             XMLElement element = (XMLElement) iter.next();   
  19.             String name = element.getName();   
  20.   
  21.             String text = "" + name + ">" + "</" + name + ">";   
  22.             }   
  23.   
  24.             result[i++] = new CompletionProposal(text,    
  25.              currentText.documentOffset,    
  26.              currentText.text.length(),    
  27.              text.length());   
  28.   
  29.         }   
  30.         return result;   
  31.   
  32.     }   
  33.     else  
  34.     {   
  35.   
  36.         List allAttributes = dtdTree.getAllAttributes();   
  37.   
  38.         ICompletionProposal[] result = new ICompletionProposal[allAttributes.size()];   
  39.         int i = 0;   
  40.         for (Iterator iter = allAttributes.iterator(); iter.hasNext();)   
  41.         {   
  42.             String name = (String) iter.next();   
  43.   
  44.             String text = name + "= \"\" ";   
  45.                
  46.             result[i++] = new CompletionProposal(text,    
  47.              currentText.documentOffset,    
  48.              currentText.text.length(),    
  49.              text.length());   
  50.         }   
  51.         return result;   
  52.     }   
  53.   
  54. }   
  55.   

上面的代码非常的简单,首先根据当前位置是否为属性,是则列出已知的所有属性名,否则列出所有的节点名.
当然这里我们的做法非常简单,更高级的实现是对整个文档进行扫描来确定当前光标在整个文档结构中所处的位置, 然后使用DTD验证计算当前需要提示的更精确的内容列表, 这就需要根据DTD来理解我们的文档

总结
构建一个强大的文本编辑器在Eclipse插件开发中常常会碰到, 而JFace Text Editor是我们展开工作的基础, 它是Eclipse非常强大,非常重要的一套API, 同时也是非常复杂的一套API.
这里我们从Eclipse PDE提供的XML Editor向导例子入手,通过对其进行扩展, 演示了高亮显示, 内容格式化, 内容大纲, 错误标记, 内容辅助几个功能的实现, 希望这篇文章对你来实现自己强大的文本编辑器能有所帮助

分享到:
评论
3 楼 macrochen 2011-11-02  
很久以前翻译的, 木有源码:(
2 楼 单眼皮大娘 2011-10-27  
可以的话发我邮箱
fay19880111@yeah.net
谢谢啦~~~~
1 楼 单眼皮大娘 2011-10-27  
求源代码大神~~~~

相关推荐

    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...

    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