- 浏览: 12749 次
- 性别:
最新评论
当使用Eclipse的多页签Editor时,如果按照单个Editor的Property页和Outline的设计,会出现两个Editor使用同一个CommandStack和多页签的Outline不能切换的问题,经过试验以两个页签为例使用下面的解决方案:建立在于MultPageEditorPart级别的IPropertySheetPage和IContentOutlinePage然后通过获取MultiPageEditorPart的pageChange(int index)方法来动态的设置相应的Property和Outline。具体是先步骤:
1.建立MultiPageEditorPart的子类FormEditor,主要实现CreatePages方法,在这个方法里边具体是的实现相应两个子Editor的初始化工作,并且使用阿addPage(Editor,EditorInput)方法把它们加入到MultiPageEditorPart中
2.实现相应的getAdapter(Class)方法,当传入的Class是IPropertySheetPage和IContentOutlinePage的时候,初始化相应的MultiPageEditorPart级别的PropertySheetPage和ContentOutlinePage,这两个类的实现代码如下:
OutlinePage:
在MultiPageEditorPart的 protected void pageChange(int newPageIndex);方法中进行更新当前的激活Editor的PropertySheetPage和OutlinePage,方法如下:
更新PropertySheet:
更新OutlinePage:
具体的子Editor中的获得PropertySheet和OutlinePage的方法可以参照Gef例子中的编写,在子Editor中初始化Outline的时候由于同一使用MultiPageEditorPart中的OutlinePage的Action,所以在子Editor的OutlinePage中不能去设定Action按钮,具体的参照FormContentOutline的Action的初始化,这点是与gef例子中给的不同的!
1.建立MultiPageEditorPart的子类FormEditor,主要实现CreatePages方法,在这个方法里边具体是的实现相应两个子Editor的初始化工作,并且使用阿addPage(Editor,EditorInput)方法把它们加入到MultiPageEditorPart中
2.实现相应的getAdapter(Class)方法,当传入的Class是IPropertySheetPage和IContentOutlinePage的时候,初始化相应的MultiPageEditorPart级别的PropertySheetPage和ContentOutlinePage,这两个类的实现代码如下:
import java.util.HashMap; import java.util.Map; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.SubActionBars; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.views.properties.IPropertySheetPage; import org.eclipse.ui.views.properties.PropertySheetPage; /** * @author kang.ao * * */ public class FormPropertySheetPage extends PropertySheetPage implements IPropertySheetPage { private PageBook pagebook; private Map recMap = new HashMap(); private PropertySheetPage defaultPage; private IActionBars actionBars; private IPropertySheetPage currentPage; private boolean disposed = false; class PageRec { IPropertySheetPage page; SubActionBars bars; void setBarsActive(boolean active) { if (active) bars.activate(); else bars.deactivate(); } } public FormPropertySheetPage() { defaultPage = new PropertySheetPage(); } public void createControl(Composite parent) { pagebook = new PageBook(parent, SWT.NULL); defaultPage.createControl(pagebook); if (currentPage != null) setPageActive(currentPage); } private PageRec createPageRec(IPropertySheetPage page) { if (actionBars == null) return null; PageRec rec = new PageRec(); rec.page = page; rec.bars = new SubActionBars(actionBars); getPageControl(page); page.setActionBars(rec.bars); recMap.put(page, rec); return rec; } public void dispose() { updateActionBars(); if (pagebook != null && !pagebook.isDisposed()) pagebook.dispose(); pagebook = null; disposed = true; super.dispose(); } public boolean isDisposed() { return disposed; } public Control getControl() { return pagebook; } private Control getPageControl(IPropertySheetPage page) { Control control = page.getControl(); if (control == null || control.isDisposed()) { // first time page.createControl(pagebook); control = page.getControl(); } return control; } public void selectionChanged(IWorkbenchPart part, ISelection sel) { if (currentPage != null) currentPage.selectionChanged(part, sel); } public void setActionBars(IActionBars bars) { this.actionBars = bars; createPageRec(defaultPage); if (currentPage != null) { PageRec rec = createPageRec(currentPage); setPageActive(rec); updateActionBars(); } } public void setDefaultPageActive() { setPageActive(defaultPage); } public void setFocus() { if (currentPage != null) currentPage.setFocus(); } private void setPageActive(PageRec pageRec) { IPropertySheetPage page = pageRec.page; Control control = getPageControl(page); pagebook.showPage(control); pageRec.setBarsActive(true); } public void setPageActive(IPropertySheetPage page) { IPropertySheetPage oldPage = currentPage; this.currentPage = page; if (pagebook == null) { return; } if (oldPage != null) { PageRec oldRec = (PageRec) recMap.get(oldPage); if (oldRec != null) { oldRec.setBarsActive(false); } } PageRec rec = (PageRec) recMap.get(page); if (rec == null) { rec = createPageRec(page); } if (rec != null) { setPageActive(rec); updateActionBars(); } } private void updateActionBars() { actionBars.updateActionBars(); } }
OutlinePage:
/* * 创建日期 Oct 31, 2005 * */ package com.kenoah.kde.formdesignerX; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.ui.parts.ContentOutlinePage; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IActionBars; import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import com.kenoah.kde.formdesignerX.utils.FormdesignerImages; /** * @author kang.ao * * */ public class FormContentOutline extends ContentOutlinePage implements IContentOutlinePage { private PageBook pagebook; private IContentOutlinePage currentPage; private boolean disposed; private IAction showOutlineAction, showOverviewAction; public static final int ID_OUTLINE = 0; public static final int ID_OVERVIEW = 1; public FormContentOutline(EditPartViewer viewer) { super(viewer); } /** * @see org.eclipse.ui.part.IPage#createControl(Composite) */ public void createControl(Composite parent) { pagebook = new PageBook(parent, SWT.NONE); configureOutlineViewer(); if (currentPage != null) setPageActive(currentPage); showPage(ID_OUTLINE); } private void configureOutlineViewer() { IToolBarManager tbm = getSite().getActionBars().getToolBarManager(); showOutlineAction = new Action() { public void run() { showPage(ID_OUTLINE); } }; showOutlineAction.setImageDescriptor(FormdesignerImages.getImageDescriptor(FormdesignerImages.OUTLINE)); tbm.add(showOutlineAction); showOverviewAction = new Action() { public void run() { showPage(ID_OVERVIEW); } }; showOverviewAction.setImageDescriptor(FormdesignerImages .getImageDescriptor(FormdesignerImages.OVERVIEW)); tbm.add(showOverviewAction); } protected void showPage(int id_outline2) { if(currentPage instanceof IOutlinePageShowPage){ ((IOutlinePageShowPage)currentPage).showPage(id_outline2); if(id_outline2==ID_OVERVIEW){ showOutlineAction.setChecked(false); showOverviewAction.setChecked(true); }else{ showOutlineAction.setChecked(true); showOverviewAction.setChecked(false); } } } private int getCurrentPageId(){ if(showOverviewAction!=null && showOutlineAction!=null){ if(showOverviewAction.isChecked()) return ID_OVERVIEW; if(showOutlineAction.isChecked()){ return ID_OUTLINE; } } return ID_OUTLINE; } /** * @see org.eclipse.ui.part.IPage#dispose() */ public void dispose() { if (pagebook != null && !pagebook.isDisposed()) pagebook.dispose(); pagebook = null; disposed = true; } public boolean isDisposed() { return disposed; } /** * @see org.eclipse.ui.part.IPage#getControl() */ public Control getControl() { return pagebook; } /** * @see org.eclipse.ui.part.IPage#setActionBars(IActionBars) */ public void setActionBars(IActionBars actionBars) { } /** * @see org.eclipse.ui.part.IPage#setFocus() */ public void setFocus() { if (currentPage != null) currentPage.setFocus(); } /** * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(ISelectionChangedListener) */ public void addSelectionChangedListener(ISelectionChangedListener listener) { if (currentPage != null) currentPage.addSelectionChangedListener(listener); } /** * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() */ public ISelection getSelection() { return (currentPage != null) ? currentPage.getSelection() : null; } /** * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(ISelectionChangedListener) */ public void removeSelectionChangedListener(ISelectionChangedListener listener) { if (currentPage != null) currentPage.removeSelectionChangedListener(listener); } /** * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(ISelection) */ public void setSelection(ISelection selection) { if (currentPage != null) currentPage.setSelection(selection); } public void setPageActive(IContentOutlinePage page) { this.currentPage = page; if (pagebook == null) { return; } if(getSite()!=null){ if(page instanceof ContentOutlinePage){ ((ContentOutlinePage)page).init(getSite()); } Control control = page.getControl(); if (control == null || control.isDisposed()) { page.createControl(pagebook); control = page.getControl(); } pagebook.showPage(control); showPage(getCurrentPageId()); } } public void init(IPageSite pageSite) { super.init(pageSite); } }
在MultiPageEditorPart的 protected void pageChange(int newPageIndex);方法中进行更新当前的激活Editor的PropertySheetPage和OutlinePage,方法如下:
更新PropertySheet:
void updatePropertySheet(IEditorPageBase part) { if (part != null) { IPropertySheetPage propertySheetPage = part.getPropertySheetPage(); if (propertySheetPage != null) { propertySheet.setPageActive(propertySheetPage); } else { propertySheet.setDefaultPageActive(); } } }
更新OutlinePage:
void updateOutline(IEditorPageBase part) { IContentOutlinePage page = null; if (part != null) { page = ((IEditorPageBase) part).getOutlinePage(); if (page != null && contentOutline!=null) contentOutline.setPageActive(page); } }
具体的子Editor中的获得PropertySheet和OutlinePage的方法可以参照Gef例子中的编写,在子Editor中初始化Outline的时候由于同一使用MultiPageEditorPart中的OutlinePage的Action,所以在子Editor的OutlinePage中不能去设定Action按钮,具体的参照FormContentOutline的Action的初始化,这点是与gef例子中给的不同的!
相关推荐
属性视图是数据源与用户界面之间的桥梁,确保图形模型和属性视图之间保持同步更新。本文将深入探讨如何在GEF中实现属性视图,并通过一个处理器(Processor)模型的例子来阐述具体步骤。 1. **属性视图的概述** - ...
《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...
这个项目旨在演示如何利用GEF进行图形界面开发,并且特别关注了通过适配器(Adapter)扩展点来实现属性页配置以及在非Editor的ViewPart中使用GEF。 GEF是Eclipse平台下的一个开源库,专门用于构建可自定义的、图形...
在gef中,转折线的实现涉及到PathFigure和Segment类的使用。PathFigure用于定义一个图形的轮廓,而Segment则代表了轮廓中的一段线段。通过添加和调整Segment实例,我们可以构建出具有转折点的线条。 实现gef转折线...
GEF提供了`PropertySheet`来展示属性,并且可以自定义属性页,以便根据模型类的不同属性显示不同的编辑控件。 **十二、拖放(Drag and Drop)** GEF支持拖放操作,用户可以将图形元素从一个位置拖动到另一个位置,...
在本教程中,我们将深入探讨GEF的基本概念、设计原则以及如何使用它来开发自己的图形编辑器。 **1. GEF简介** GEF的设计目标是将图形编辑器的实现细节抽象化,让开发者能够专注于业务逻辑和模型设计,而不是底层的...
通过RCP和GEF结合,开发者可以快速创建出功能强大的图形化应用程序,例如数据库建模工具、UML建模工具或者是软件工程中的配置管理工具。理解并掌握这两个框架的工作原理和组件,对于开发高质量的桌面应用至关重要。...
在GEF中,模型通常由EMF(Eclipse Modeling Framework)来定义和管理,可以将业务逻辑和视图分离。 2. **视图(View)**:视图是模型的可视化表示,它将模型数据呈现为用户界面。GEF提供了基础框架来实现这一转换,...
在GEF中,模型通常由`EObject`和`EObjectImpl`实现,可以使用EMF(Eclipse Modeling Framework)来生成。 2. **视图(View)**: 视图是模型的可视化表示,将模型数据呈现给用户。GEF中的视图由`GraphicalViewer`类...
GEF的开发指南详细讲解了如何使用该框架进行图形编辑,内容涵盖了从创建RCP(Rich Client Platform)插件开始,到创建图形编辑器、与图形的交互、撤销/回复操作、缩放、快捷键设置、大纲视图、鸟瞰视图、环境菜单、...
- 添加依赖后,项目的构建路径将包含GEF库,从而可以在项目中使用GEF功能。 ### 创建Editor 接下来,我们将创建一个Editor,这是GEF应用中最核心的部分之一。通常情况下,GEF会集成到Editor中而非View中,这是...
在当前的IT技术领域中,GEF(Graphical Editing Framework)是一个广泛应用的图形编辑框架,它是基于Eclipse平台的,通常与RCP(Rich Client Platform)结合使用,用于构建图形化的应用程序。GEF允许开发者通过提供...
开发者可以使用这个文件来更新或安装GEF插件到他们的Eclipse环境中。 4. **plugins**:这个目录通常包含了GEF插件的具体实现。每个子目录代表一个Eclipse插件,包含了对应的JAR文件和其他资源。这些插件扩展了...
这个资源包可能包含了对理解、学习和使用GEF非常有帮助的材料。描述进一步说明了这个包中包含的具体内容,如“GEF_Tutorial”、“GEF实例”、“入门教程”以及“GEF-whole-upload”,这些都暗示了这是一个全面的学习...
**GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台上广泛使用,特别是在开发复杂的图形用户界面和工具时。本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF...
6. **运行与调试**:最后,源码会教你如何在Eclipse环境中运行和测试这个简单的GEF应用。 通过这个教程和示例,你将能够掌握GEF的基本用法,从而有能力去构建更复杂的图形编辑器。同时,这也会为你打开一扇门,通向...
此外,理解MVC(模型-视图-控制器)模式和MVC在GEF中的应用对于提升开发效率至关重要。 总之,通过这个"GEF入门实例代码2",开发者可以了解到如何在Eclipse中构建一个基于GEF的图形编辑器,这不仅涉及数据模型的...
本教程是针对想要学习和掌握GEF技术的开发者,通过实例教学,深入浅出地介绍GEF的使用方法和开发流程。 **1. GEF基础知识** GEF的核心概念包括模型(Model)、视图(View)和控制器(Controller)。模型是数据结构...