`
Billy_Ao
  • 浏览: 12746 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Gef中MultiPageEditorPart中属性页和Outline的使用

阅读更多
当使用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,这两个类的实现代码如下:

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中属性页面的实现

    属性视图是数据源与用户界面之间的桥梁,确保图形模型和属性视图之间保持同步更新。本文将深入探讨如何在GEF中实现属性视图,并通过一个处理器(Processor)模型的例子来阐述具体步骤。 1. **属性视图的概述** - ...

    Eclipse开发使用GEF和EMF(IBM 红皮书)中英文对照版

    《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...

    GEF_Demo_Code20170307

    这个项目旨在演示如何利用GEF进行图形界面开发,并且特别关注了通过适配器(Adapter)扩展点来实现属性页配置以及在非Editor的ViewPart中使用GEF。 GEF是Eclipse平台下的一个开源库,专门用于构建可自定义的、图形...

    gef 转折线的相关方法实现和 GEF的API chm 格式

    在gef中,转折线的实现涉及到PathFigure和Segment类的使用。PathFigure用于定义一个图形的轮廓,而Segment则代表了轮廓中的一段线段。通过添加和调整Segment实例,我们可以构建出具有转折点的线条。 实现gef转折线...

    GEF中文帮助实例

    GEF提供了`PropertySheet`来展示属性,并且可以自定义属性页,以便根据模型类的不同属性显示不同的编辑控件。 **十二、拖放(Drag and Drop)** GEF支持拖放操作,用户可以将图形元素从一个位置拖动到另一个位置,...

    GEF中文教程+代码

    在本教程中,我们将深入探讨GEF的基本概念、设计原则以及如何使用它来开发自己的图形编辑器。 **1. GEF简介** GEF的设计目标是将图形编辑器的实现细节抽象化,让开发者能够专注于业务逻辑和模型设计,而不是底层的...

    RCP与GEF课件,介绍RCP和GEF各组成部分和工作原理

    通过RCP和GEF结合,开发者可以快速创建出功能强大的图形化应用程序,例如数据库建模工具、UML建模工具或者是软件工程中的配置管理工具。理解并掌握这两个框架的工作原理和组件,对于开发高质量的桌面应用至关重要。...

    GEF 入门版中文教程 源码

    在GEF中,模型通常由EMF(Eclipse Modeling Framework)来定义和管理,可以将业务逻辑和视图分离。 2. **视图(View)**:视图是模型的可视化表示,它将模型数据呈现为用户界面。GEF提供了基础框架来实现这一转换,...

    GEF入门学习例子

    在GEF中,模型通常由`EObject`和`EObjectImpl`实现,可以使用EMF(Eclipse Modeling Framework)来生成。 2. **视图(View)**: 视图是模型的可视化表示,将模型数据呈现给用户。GEF中的视图由`GraphicalViewer`类...

    GEF开发指南

    GEF的开发指南详细讲解了如何使用该框架进行图形编辑,内容涵盖了从创建RCP(Rich Client Platform)插件开始,到创建图形编辑器、与图形的交互、撤销/回复操作、缩放、快捷键设置、大纲视图、鸟瞰视图、环境菜单、...

    GEF快速入门教程和EMF教程

    - 添加依赖后,项目的构建路径将包含GEF库,从而可以在项目中使用GEF功能。 ### 创建Editor 接下来,我们将创建一个Editor,这是GEF应用中最核心的部分之一。通常情况下,GEF会集成到Editor中而非View中,这是...

    gef版本的helloworld

    在当前的IT技术领域中,GEF(Graphical Editing Framework)是一个广泛应用的图形编辑框架,它是基于Eclipse平台的,通常与RCP(Rich Client Platform)结合使用,用于构建图形化的应用程序。GEF允许开发者通过提供...

    GEF-Update-3.7.1.zip

    开发者可以使用这个文件来更新或安装GEF插件到他们的Eclipse环境中。 4. **plugins**:这个目录通常包含了GEF插件的具体实现。每个子目录代表一个Eclipse插件,包含了对应的JAR文件和其他资源。这些插件扩展了...

    自己下的GEF资源打包

    这个资源包可能包含了对理解、学习和使用GEF非常有帮助的材料。描述进一步说明了这个包中包含的具体内容,如“GEF_Tutorial”、“GEF实例”、“入门教程”以及“GEF-whole-upload”,这些都暗示了这是一个全面的学习...

    GEF入门必读 GEF入门系列 GEF-whole-upload

    **GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台上广泛使用,特别是在开发复杂的图形用户界面和工具时。本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF...

    GEF教程和demo源码

    6. **运行与调试**:最后,源码会教你如何在Eclipse环境中运行和测试这个简单的GEF应用。 通过这个教程和示例,你将能够掌握GEF的基本用法,从而有能力去构建更复杂的图形编辑器。同时,这也会为你打开一扇门,通向...

    GEF入门实例代码2《Eclipse插件开发》中实例

    此外,理解MVC(模型-视图-控制器)模式和MVC在GEF中的应用对于提升开发效率至关重要。 总之,通过这个"GEF入门实例代码2",开发者可以了解到如何在Eclipse中构建一个基于GEF的图形编辑器,这不仅涉及数据模型的...

    GEF_Tutorial.rar(GEF开发指南)

    本教程是针对想要学习和掌握GEF技术的开发者,通过实例教学,深入浅出地介绍GEF的使用方法和开发流程。 **1. GEF基础知识** GEF的核心概念包括模型(Model)、视图(View)和控制器(Controller)。模型是数据结构...

Global site tag (gtag.js) - Google Analytics