`

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

阅读更多

内容大纲
之所以要给编辑器提供内容大纲主要基于两点:一是让用户更好的总览文档全局,二个是能更方便的定位到指定的文档位置
如下图所示

The enhanced XML editor with content outline view 
内容大纲能做的三件事:
1.对结构性文档内容的解析,在XML编辑器中,我们需要显示节点的名称,属性名与值,但是不显示节点文档内容
2.能通过内容大纲进行更新,在内容大纲中直接对编辑器内容进行修改,这里我们不做实现
3.导航功能的支持,当在内容大纲中选中了一个节点,那么在编辑器中对应的部分应该立即高亮显示
首先我们要做的工作就是把内容大纲与编辑器关联起来,Eclipse提供了一个接口IContentOutlinePage, 但是我们最简单的做法是直接从ContentOutlinePage继承.而通过编辑器的getAdapter方法可以将其与内容大纲关联起来,如下代码所示:

java 代码
  1. public Object getAdapter(Class required)   
  2. {   
  3.     if (IContentOutlinePage.class.equals(required))   
  4.     {   
  5.         if (outlinePage == null)   
  6.         {   
  7.             outlinePage = new XMLContentOutlinePage(this);   
  8.             ...   
  9.         }   
  10.         return outlinePage;   
  11.     }   
  12.     return super.getAdapter(required);   
  13. }   

在OutlineContentHandler类中来对文档进行解析,该类主要实现了SAX ContentHandler接口,它的工作就是根据XML文档构造一棵XML树,在这棵树上包含了内容大纲所需要的节点名,属性名,属性值以及在节点在文档中的位置(行号和列号),这些内容我们将通过XMLTree, XMLElement, XMLAttribute类来处理, 在我们的实现类XMLContentOutlinePage 中,通过一个ITreeViewer类将树状内容展示给用户,因此我们必须同时实现ITreeContentProvider 和ITreeLabelProvider 接口来提供内容,以及告诉TreeViewer如何展示内容,这里我们的实现类分别是OutlineContentProvider 和OutlineLabelProvider,OutlineContentProvider部分代码实现如下:

java 代码
  1. public void inputChanged(Viewer viewer, Object oldInput, Object newInput)   
  2. {   
  3.   
  4.     ...   
  5.   
  6.     input = (IEditorInput) newInput;   
  7.   
  8.     if (newInput != null)   
  9.     {   
  10.         IDocument document = documentProvider.getDocument(newInput);   
  11.         if (document != null)   
  12.         {   
  13.             ...   
  14.                
  15.             XMLElement rootElement = parseRootElement(document);   
  16.             if (rootElement != null)   
  17.             {   
  18.                 root = rootElement;   
  19.             }   
  20.         }   
  21.     }   
  22. }   
  23.   

从上面的代码中,我们可以看出OutlineContentHandler的工作就是将XML文档内容转换成XMLTree给OutlineContentProvider使用

大纲视图的更新

使用视图大纲来更新编辑内容主要有两种策略:一种就是在大纲视图中做出修改之后能实时更新文档,一种是在保存文档的时候进行更新,为了简单起见,这里我们采用后者

前面我们已经看到当调用OutlineContentProvider.inputChanged()方法时,内容大纲将被更新,根据我们的使用策略,该方法的调用只会出现在两个地方,一个是文档加载时,一个是文档保存时

前面我们已经知道,编辑器在加载文档的时候,它会通过getAdapter()方法来获得内容大纲对象,代码如下所示:

java 代码
  1. public Object getAdapter(Class required)   
  2. {   
  3.     if (IContentOutlinePage.class.equals(required))   
  4.     {   
  5.         if (outlinePage == null)   
  6.         {   
  7.             outlinePage = new XMLContentOutlinePage(this);   
  8.             if (getEditorInput() != null)   
  9.                 outlinePage.setInput(getEditorInput());   
  10.         }   
  11.         return outlinePage;   
  12.     }   
  13.     return super.getAdapter(required);   
  14. }   

这里我们将当前编辑的内容通过getInput()方法传递给内容大纲,此时将导致内容大纲的update()方法被调用,其实现代码如下:

java 代码
  1. public void update()   
  2. {   
  3.        
  4.     TreeViewer viewer = getTreeViewer();   
  5.     if (viewer != null)   
  6.     {   
  7.         Control control = viewer.getControl();   
  8.         if (control != null && !control.isDisposed())   
  9.         {   
  10.             control.setRedraw(false);   
  11.             viewer.setInput(input);   
  12.             viewer.expandAll();   
  13.             control.setRedraw(true);   
  14.         }   
  15.     }   
  16. }   

当编辑器保存时对内容大纲进行更新只需要复写编辑器的editorSaved()方法即可,代码如下:

java 代码
  1. if (outlinePage != null)   
  2. outlinePage.update();   

内容的导航

为了对编辑的文档一目了然,我们将文档内容使用XMLTree进行封装,为了进行导航,一方面我们需要将当前编辑器中的位置映射到内容大纲的相应节点,另一方面就是将我们在内容大纲中选中的节点的同时让编辑器中相应的文本也被选中

为了得到文档的行列信息, 在SAX ContentHandler中我们使用了DocumentLocator类来构建XMLTree结构

java 代码
  1. private XMLElement parseRootElement(IDocument document)   
  2. {   
  3.     String text = document.get();   
  4.     XMLParser xmlParser = new XMLParser();   
  5.     OutlineContentHandler contentHandler = new OutlineContentHandler();   
  6.     contentHandler.setDocument(document);   
  7.     ...   
  8.     contentHandler.setDocumentLocator(new LocatorImpl());   
  9.     xmlParser.setContentHandler(contentHandler);   
  10.     xmlParser.doParse(text);   
  11.     XMLElement root = contentHandler.getRootElement();   
  12.     return root;   
  13. }   

为了让对内容大纲选择更迭的处理反应到编辑器中,我们使用了下面的代码:

java 代码
  1. public void selectionChanged(SelectionChangedEvent event)   
  2. {   
  3.     super.selectionChanged(event);   
  4.     // find out which item in tree viewer we have selected, and set   
  5.     // highlight range accordingly   
  6.   
  7.     ISelection selection = event.getSelection();   
  8.     if (selection.isEmpty())   
  9.         editor.resetHighlightRange();   
  10.     else  
  11.     {   
  12.         IStructuredSelection sel = (IStructuredSelection) selection;   
  13.         XMLElement element = (XMLElement) sel.getFirstElement();   
  14.   
  15.         int start = element.getPosition().getOffset();   
  16.         int length = element.getPosition().getLength();   
  17.         try  
  18.         {   
  19.             editor.setHighlightRange(start, length, true);   
  20.         }   
  21.         catch (IllegalArgumentException x)   
  22.         {   
  23.             editor.resetHighlightRange();   
  24.         }   
  25.     }   
  26. }   
  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)

    3. **版本不兼容**:可能是因为`org.eclipse.jface.text`这个组件与Eclipse或MyEclipse的基础版本存在兼容性问题。升级或降级这个组件到适合当前IDE版本的版本可能会修复问题。 4. **系统或IDE设置**:操作系统级别...

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

    3. **源码结构分析**:Eclipse JFace Text的源码结构复杂而严谨,包括了多个层次的类和接口,如`ITextViewer`、`ITextModel`、`IRegion`等,它们协同工作,实现文本编辑、高亮显示、查找替换等功能。开发者在修改...

    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