`
liugang594
  • 浏览: 981832 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GEF中Palette项的属性页显示

    博客分类:
  • GEF
阅读更多

一般来说我们只需要在GraphicalViewer部分显示在Property页即可。

 

要支持GraphicalViewer和PaletteViewer都能对属性页有支持,就有点复杂。

 

每个Site只能有一个SelectionProvider,正是这个SelectionProvider里选中的对象才有可能显示在属性页。在GEF中,情况下,GraphicalViewer被设置为这个EditorSite的SelectionProvider。因为只能有一个SelectionProvider,因此我们不能同时设置PaletteViewer为SelectionProvider。

 

所以,首先我们就需要自定义一个SelectionProvider,它聚合这两部分的Provider,并且在这两者之间切换,如下:

 

 

public class CustomSelectionProvider implements ISelectionProvider,
		FocusListener {

	private GraphicalViewer graphicalViewer;
	private PaletteViewer paletteViewer;

	private Widget focusControl;

	public CustomSelectionProvider(GraphicalViewer graphicalViewer,
			PaletteViewer paletteViewer) {
		super();
		this.graphicalViewer = graphicalViewer;
		this.paletteViewer = paletteViewer;
		this.graphicalViewer.getControl().addFocusListener(this);
		this.paletteViewer.getControl().addFocusListener(this);
	}

	public void addSelectionChangedListener(ISelectionChangedListener listener) {
		graphicalViewer.addSelectionChangedListener(listener);
		paletteViewer.addSelectionChangedListener(listener);
	}

	public ISelection getSelection() {
		if (focusControl == graphicalViewer.getControl())
			return graphicalViewer.getSelection();
		else if (focusControl == paletteViewer.getControl()) {
			return paletteViewer.getSelection();
		}
		return null;
	}

	public void removeSelectionChangedListener(
			ISelectionChangedListener listener) {
		graphicalViewer.removeSelectionChangedListener(listener);
		paletteViewer.removeSelectionChangedListener(listener);
	}

	public void setSelection(ISelection selection) {
		if (focusControl == graphicalViewer.getControl())
			graphicalViewer.setSelection(selection);
		else if (focusControl == paletteViewer.getControl())
			paletteViewer.setSelection(selection);
	}

	public void focusGained(FocusEvent e) {
		focusControl = e.widget;
		if (paletteViewer.getControl() == focusControl) {
			ISelection selection = paletteViewer.getSelection();
			setSelection(null);
			setSelection(selection);
		} else if (graphicalViewer.getControl() == focusControl) {
			ISelection selection = graphicalViewer.getSelection();
			setSelection(null);
			setSelection(selection);
		}
	}

	public void focusLost(FocusEvent e) {
	}
}

 

有了这个自定义的SelectionProvider,我们就可以用它来替换Editor中缺省的GraphicalViewer,重写Editor的createPartControl()方法:

 

 

	@Override
	public void createPartControl(Composite parent) {
		super.createPartControl(parent);
		PaletteViewer paletteViewer = ((CustomPaletteViewerProvider) getPaletteViewerProvider())
				.getPaletteViewer();
		CustomSelectionProvider selectionProvider = new CustomSelectionProvider(
				getGraphicalViewer(), paletteViewer);
		getSite().setSelectionProvider(selectionProvider);
	}

 

这里的CustomPaletteViewerProvider也是一个自定义的PaletterViewerProvider,因为缺省的PaletterViewerProvider没有提供方法返回对象的PaletteViewer。自定义一个也很简单,增加一个返回PaletteViewer的方法即可:

 

public class CustomPaletteViewerProvider extends PaletteViewerProvider {

	private PaletteViewer paletteViewer;

	public CustomPaletteViewerProvider(EditDomain graphicalViewerDomain) {
		super(graphicalViewerDomain);
	}

	@Override
	public PaletteViewer createPaletteViewer(Composite parent) {
		paletteViewer = super.createPaletteViewer(parent);
		return paletteViewer;
	}
	
	public PaletteViewer getPaletteViewer() {
		return paletteViewer;
	}
}

 

然后用这个PaletteViewerProvider替换缺省的,重写Editor中的方法:

 

	@Override
	protected PaletteViewerProvider createPaletteViewerProvider() {
		return new CustomPaletteViewerProvider(getEditDomain());
	}

 

这样,一个可以左右切换的SelectionProvider就准备好了,它可以同时支持Palette和Graphical两个部分。

 

最后一个步骤就是怎么让Property View感知他们。每次一个Site上的SelectionProvider选项发生变动的时候,Property View都会被通知,去检查当前选中对象是否支持在Property页上显示。一个能够在Property页上显示的对象有两种实现方式:

 

1.对象实现IPropertySource接口

2.对象实现IAdaptable接口,在方法getAdater(Class)里,实现IPropertySource.class的支持。

 

如果用第一种方法,那显示我们需要重写所有的Palette部分,那比较复杂。因此我们选择第二种方法。

对于第二种方式,如果在每种节点类型的getAdapter(Class)方法里追加IPropertySource的实现,那最终结果和使用方法一一样,得把整个Palette都重写一次。

 

对于方法2,我们还有第二个选项,扩展“org.eclipse.core.runtime.adapters”扩展点。

 

所有的Palette上的对象,也都是一个AbstractEditPart,这个对象的getAdapter(Class)的实现是:如果没有找着匹配的实现,则最后会查找Eclipse里所有已经注册的adapter对。例如:

 

public Object getAdapter(Class key) {
	if (AccessibleEditPart.class == key)
		return getAccessibleEditPart();
	return Platform.getAdapterManager().getAdapter(this, key);
}

 因此我们可以通过扩展“org.eclipse.core.runtime.adapters”扩展点来达到目的,可以如下扩展:

 

        <extension
              point="org.eclipse.core.runtime.adapters">
           <factory
                 adaptableType="org.eclipse.gef.ui.palette.editparts.PaletteEditPart"
                 class="。。。.PaletteAdapterFactory">
              <adapter
                    type="org.eclipse.ui.views.properties.IPropertySourceProvider">
              </adapter>
           </factory>
        </extension>

 其中adaptableType表示对哪种类型的结点应用,adapter里的type表示这个adapter应该返回一个什么类型的对象,class就是具体的实现类。例如一个简单的实现如下:

 

public class PaletteAdapterFactory implements IAdapterFactory {

	public Object getAdapter(Object adaptableObject, Class adapterType) {
		return new CustomPropertySourceProvider(
				(PaletteEditPart) adaptableObject);
	}

	public Class<PaletteEditPart>[] getAdapterList() {
		return new Class[] { PaletteEditPart.class };
	}
}

class CustomPropertySourceProvider implements IPropertySourceProvider {

	private PaletteEditPart editPart;

	public CustomPropertySourceProvider(PaletteEditPart editPart) {
		this.editPart = editPart;
	}
	public IPropertySource getPropertySource(Object object) {
		return new CustomPropertySource(editPart);
	}
}

class CustomPropertySource implements IPropertySource {

	private PaletteEditPart editPart;

	public CustomPropertySource(PaletteEditPart editPart) {
		this.editPart = editPart;
	}

	public Object getEditableValue() {
		return null;
	}

	public IPropertyDescriptor[] getPropertyDescriptors() {
		IPropertyDescriptor[] descriptors = new IPropertyDescriptor[1];
		descriptors[0] = new TextPropertyDescriptor("TEXT", "ToString");
		return descriptors;
	}

	public Object getPropertyValue(Object id) {
		return editPart.toString();
	}

	public boolean isPropertySet(Object id) {
		return true;
	}

	public void resetPropertyValue(Object id) {

	}

	public void setPropertyValue(Object id, Object value) {

	}
}

 这个实现的效果就是,每次选中Palette中的一个结点,则把它的toString()结果显示在Property上。

分享到:
评论

相关推荐

    GEF中属性页面的实现

    在GEF(Graphical Editing Framework)中,属性视图(Property View)的实现是一个关键功能,它允许用户查看和编辑图形模型的属性。属性视图是数据源与用户界面之间的桥梁,确保图形模型和属性视图之间保持同步更新...

    GEF中文帮助实例

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

    RCP 视图显示GEF图

    用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);

    GEF_Demo_Code20170307

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

    GEF入门学习资料,简单地介绍了GEF使用过程中用到的基本类和函数的用法

    GEF 入门学习资料,简单地介绍了 GEF 使用过程中用到的基本类和函数的用法。 GEF(Graphical Editor Framework)是一种图形化编辑框架,能够提供图形化编辑模型的功能,提高用户体验。典型的应用包括图形化的流程...

    GEF中文教程+代码

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

    GEF入门学习例子

    2. **属性栏**: 属性栏用于显示和编辑选定图形元素的属性。这可以通过实现`PropertySheetPage`和`IPropertySource`接口来完成,将模型的属性映射到可编辑的表单控件。 3. **图形绘制**: GEF提供了一系列类来支持...

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

    在本篇文章中,我们将深入探讨gef转折线的相关方法实现以及GEF的API。 首先,让我们理解一下什么是转折线。在图形编辑中,转折线通常指的是具有多个折点的线条,这些折点可以由用户交互式地调整,以改变线条的形状...

    gef布局显示学习

    Gef布局显示学习是针对Linux系统调试工具Gef(GDB Enhanced Features)的一种深入探究,它主要涉及如何在GDB(GNU Debugger)中有效地利用Gef的各种功能来优化代码调试过程。Gef是一款强大的GDB插件,提供了丰富的...

    GEF 入门版中文教程 源码

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

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

    **GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的...对于希望在Java和Eclipse环境中提升图形界面开发技能的程序员来说,"GEF入门必读 GEF入门系列 GEF-whole-upload"是一个不可多得的学习资源。

    自己下的GEF资源打包

    标题中的“GEF资源打包”指的是一个集合了关于GEF(Graph Edit Framework)的各种学习资料的压缩文件。这个资源包可能包含了对理解、学习和使用GEF非常有帮助的材料。描述进一步说明了这个包中包含的具体内容,如...

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

    GEF(Graphical Editing Framework)是Eclipse平台中的一个核心组件,主要用于构建图形化编辑工具。这个实例代码2是《Eclipse插件开发》教程中的一部分,旨在帮助初学者理解如何利用GEF来创建自定义的图形编辑器。在...

    GEF锚点鼠标定位

    在图形编辑框架(GEF,Graphical Editing Framework)中,锚点(Anchor)是一个关键概念,它是连接模型元素之间的连接线在元素上的固定点。在GEF中,锚点的定位直接影响到连接线的形状和行为,特别是当用户通过鼠标...

    eclipse的GEF插件

    Eclipse的GEF(Graphical Editing Framework)插件是一个强大的工具,用于在Eclipse集成开发环境中创建、编辑和展示图形用户界面。它为开发者提供了一种框架,支持创建可定制的、交互式的图形编辑器,使得开发人员...

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

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

    GEF教程及demo源码GEF_RCP_DEMO.zip

    在本教程中,GEF_RCP_DEMO展示了如何在RCP应用中集成GEF图形编辑功能。 8. **DEMO源码分析** GEF_RCP_DEMO的源码包含了各种GEF特性的实例,如图元创建、连接线绘制、拖放操作等。通过分析这些示例代码,开发者可以...

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

    例如,一个资源视图可以显示项目的文件结构,而一个Outline视图可以显示当前编辑器中的结构。 4. **Editor**:编辑器是用来打开和编辑文件的组件。它们可以是文本编辑器,也可以是富文本或者图形化的编辑器,如代码...

    GEF中文教程笔记1

    可能涵盖了模型-视图-控制器(MVC)设计模式的应用,这是GEF的基础,以及如何通过GEF提供的API来创建、编辑和显示图形元素。 【标签】"源码"和"工具"表明这篇教程可能包含了源代码示例和关于如何利用GEF作为开发...

    GEF_Tutorial.rar(GEF开发指南)

    在GEF中,你需要首先定义你的数据模型,这可能涉及使用EMF(Eclipse Modeling Framework)来创建Ecore模型。Ecore模型是元模型的一种表示,可以用于生成Java类,这些类将成为你的数据模型的基础。 **4. 实现图元和...

Global site tag (gtag.js) - Google Analytics