`
xblia
  • 浏览: 82584 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

为RCP的XML编辑器创建

 
阅读更多
为RCP的XML编辑器创建OutlinePage 2007.12.12阅读(187)下一篇:CCTV,你让我怎么... |返回日志列表 赞赞赞取消赞转载分享评论(7)复制地址更多 
 
这两天所做的RCP项目需要实现XMLEditor的Outline同步显示。 
查了古今中外的资料也没发现一篇真正有用的教程。 
所以在解决问题后记录下来,以供有需要的朋友参考。 


效果如图所示
完成此项任务,我们需要编写以下几个Class: 
1、XMLEditor:extends TextEditor 
2、XMLContentOutlinePage:extends ContentOutlinePage 
3、OutlineContentProvider:implements ITreeContentProvider 
4、OutlineLabelProvider:extends LabelProvider 
其中2、3、4为1的innerClass。 


Step1:创建Editor。 
如何创建没啥好说的,地球人都知道。 
这里就说两个和outlinePage有关的接口。 
1、 
public Object getAdapter(Class key) { 
    if (key.equals(IContentOutlinePage.class)) { 
        IEditorInput input = getEditorInput(); 
        if (input instanceof IFileEditorInput) { 
            if (outlinePage == null) 
                outlinePage = new XMLContentOutlinePage(input); 
            return outlinePage; 
        } 
    } 
    return super.getAdapter(key); 
} 

2、在编辑了XMLEditor内容后需要更新一次我们的outlinePage,所以重写了editorSaved方法。 
public void editorSaved() { 
    if (outlinePage != null) 
        outlinePage.update(); 
} 


Step2:创建XMLContentOutlinePage。 
class XMLContentOutlinePage extends ContentOutlinePage { 
    protected IEditorInput input; 

    public XMLContentOutlinePage(IEditorInput input) { 
        super(); 
        this.input = input; 
    } 

    public void update() { 
        TreeViewer viewer = (TreeViewer) getTreeViewer(); 
        if (viewer != null) { 
            Control control = viewer.getControl(); 
            if (control != null && !control.isDisposed()) { 
                control.setRedraw(false); 
                viewer.setInput(input); 
                viewer.expandAll(); 
                control.setRedraw(true); 
            } 
        } 
    } 

    public void createControl(Composite parent) { 
        super.createControl(parent); 
        TreeViewer viewer = (TreeViewer) getTreeViewer(); 
        viewer.setContentProvider(new OutlineContentProvider()); 
        viewer.setLabelProvider(new OutlineLabelProvider()); 
        viewer.setInput(input); 
        viewer.expandAll(); 
    } 
} 



Step3:创建OutlineContentProvider。 
这里实现了inputChanged方法,用于将Editor中的现有XMLString转换为相应的DOM 
中间绿色的部分依据你使用的DOM类型不同会有不同的实现方式 
我这里使用DOM4J来处理XMLEditor的文本内容 


class OutlineContentProvider implements ITreeContentProvider { 
    IEditorInput input; 
    Document doc; 

    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 
        input = (IEditorInput) newInput; 
        if (newInput != null) { 
            IDocument document = getDocumentProvider().getDocument(newInput); 
            if (document != null) { 
try { 
doc = DocumentHelper.parseText(document.get()); 
} catch (DocumentException e) { 
e.printStackTrace(); 
} 
} 
        } 
    } 
   
    public Object[] getChildren(Object parentElement) { 
        Element el = (Element) parentElement; 
        return el.elements().toArray(); 
    } 

    public Object getParent(Object element) { 
        Element el = (Element) element; 
        return el.getParent(); 
    } 

    public boolean hasChildren(Object element) { 
        Element el = (Element) element; 
        return el.elements() != null; 
    } 

    public Object[] getElements(Object inputElement) { 
        //在inputChanged得到新的DOM树以后ECP框架会首先调用此函数,用于获取DOM树的根节点 
        //上面的三个函数用于实现子节点们的递归 
        return doc.getRootElement().elements().toArray(); 
    } 

    public void dispose() { 
    } 
} 



Step4:创建OutlineLabelProvider。 
这个是最简单,但也是不可缺少的一部分。 
content节点们在树里面会显示成什么样全靠它咯。 
偷个懒,让它直接继承LabelProvider吧。 

class OutlineLabelProvider extends LabelProvider { 
    @Override 
    public String getText(Object element) { 
        //这里以Element的tagName为名显示在outline内 
        //如果你愿意,大可使用当前element的任何属性作为它在outline中的名字 
        Element el = (Element) element; 
        return el.getName(); 
    } 
} 



这样就算大功告成了。 
目前还没有实现outline与XMLEditor的反向绑定。 
就是说在选择outline中的节点时,编辑器的内容还不会自动跳转到相应位置。 
觉得有帮助的话,麻烦顶一下。 

 

分享到:
评论

相关推荐

    Eclipse RCP 属性编辑器实例

    创建Eclipse RCP属性编辑器主要涉及以下几个步骤: 1. **定义属性页(Property Page)**:首先,你需要定义一个继承自`org.eclipse.ui.propertyPages.PropertyPage`的类,这个类将作为属性编辑器的主体。在这个类中...

    rcp的文本编辑器的实例

    要为编辑器添加菜单项和工具栏按钮,我们需要扩展`org.eclipse.ui.menus`和`org.eclipse.ui.toolbars`点。这样可以添加如“新建”、“打开”、“保存”等标准操作,并与编辑器的业务逻辑关联起来。 7. **测试和...

    eclipse RCP开发的编辑器

    开发Eclipse RCP编辑器的第一步是创建一个新的Eclipse插件项目。在Eclipse IDE中,可以通过"File" -> "New" -> "Plug-in Project"来实现。在此过程中,你需要为项目命名,选择模板,并配置项目的依赖。确保选中"Plug...

    rcp 工具栏

    3. **创建工具栏(Creating the Toolbar)**:在工作台的视图或编辑器中,通过`IToolBarManager`接口创建工具栏实例,并添加到相应的视图或编辑器上。 4. **添加按钮(Adding Buttons)**:利用`IToolItem`类,为每...

    EclipseRcp 例子程序

    这个框架基于Java,提供了一套完整的工具集,包括插件系统、工作台管理、视图、编辑器、透视图等,使得开发者可以快速、灵活地创建功能丰富的应用程序。 在“Eclipse RCP 例子程序”中,我们可能找到一系列的示例...

    Eclipse RCP 初级入门教程

    RCP 应用程序可以利用 Eclipse 的工作台(Workbench)、视图(Views)、编辑器(Editors)和透视图(Perspectives)等核心组件,构建出功能强大且用户友好的界面。 **2. RCP应用的基本元素** - **工作台(Workbench...

    Eclipse RCP开发教程

    视图和编辑器是 RCP 应用中展示数据和执行操作的主要组件。视图通常用于显示辅助信息,而编辑器用于处理和编辑主要内容。开发者可以自定义视图和编辑器,实现特定的用户界面和功能。 **6. 对话框(Dialogs)** ...

    Eclipse RCP详细教程

    ### Eclipse RCP 详细教程 #### 1. 富客户端平台 ##### 1.1....Eclipse RCP(Rich Client Platform)是...后续章节将继续深入探讨更多高级主题和技术细节,包括如何添加组合键、系统托盘、外观设计、与编辑器交互等内容。

    Eclipse RCP培训.zip

    11. **插件开发**:开发Eclipse RCP应用涉及创建插件项目、定义插件依赖、编写插件XML配置文件,以及实现具体业务逻辑。 12. **调试与测试**:Eclipse RCP提供强大的调试工具,如插件调试器,可以帮助开发者定位和...

    通过例子学习EclipseRCP开发

    创建编辑器需要定义编辑器的类,并实现必要的接口方法来处理数据。视图和编辑器之间可以通过共享模型进行交互,这意味着数据的变化可以立即反映在多个组件中。此外,还需要实现内容提供者和标签提供者来控制视图和...

    rcp 学习资料下载,一个简单的rcp例子

    在Eclipse RCP中,开发者可以利用工作台(Workbench)、视图(View)、编辑器(Editor)、透视图(Perspective)等核心组件来构建复杂的用户界面。工作台是整个应用程序的中心,负责管理视图和编辑器;视图是显示...

    一个简单的RCP开发例子

    - **Plugin.xml**:定义插件元数据,包括视图、编辑器、菜单和命令的声明。 - **.product**文件:产品配置,描述应用的结构和启动参数。 - **Java源代码**:实现视图、编辑器和其他业务逻辑的类。 - **Manifest.MF**...

    plugin2_RCP菜单_teamcenter_

    `plugin.xml`配置文件是Eclipse插件的核心,它包含了插件的元数据、视图、编辑器、命令、快捷键、菜单和工具栏的定义。 3. **plugin.xml配置**:在`plugin.xml`文件中,开发者可以使用XML语法来声明菜单和工具栏。...

    Eclipse-RCP中文入门教程

    - **配置RCP应用**:插件清单编辑器提供了一个图形化界面来配置RCP应用的各种属性。 - **运行预览**:在插件清单编辑器的Overview页面中,可以通过点击“Launch Eclipse application”链接来预览RCP应用的运行效果。...

    Eclipse RCP 插件开发指南

    除了基本文本编辑器之外,还可以创建特定类型的编辑器,如图像编辑器、模型编辑器等。 ##### Help 帮助系统是 Eclipse RCP 的一个重要组成部分。它允许开发者提供上下文相关的帮助文档,以指导用户如何使用应用...

    RCP开发入门-PDF.7z

    5. **编辑器(Editor)**:编辑器是RCP中处理数据的核心组件,类似于IDE中的源代码编辑器。学习如何创建自定义编辑器,处理模型数据,以及与视图交互。 6. **命令(Command)与快捷键(Key Binding)**:Eclipse ...

    rcp editor实例的项目代码2

    例如,`org.eclipse.ui.editors`扩展点用于声明新的编辑器,开发者需要在`plugin.xml`文件中配置相关信息。 8. **测试(Testing)**:对于Eclipse插件,可以使用PDE Test工具进行单元测试和集成测试。测试代码通常...

    eclipse rcp应用系统开发方法与实战源代码.zip

    学习如何创建自定义视图和编辑器,以及它们之间的交互,是Eclipse RCP开发的重要环节。 5. **服务和事件模型**:Eclipse RCP使用服务导向的架构,允许插件之间通过服务接口进行通信。同时,事件模型使得插件可以...

Global site tag (gtag.js) - Google Analytics