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

基于EMF.EDIT实现GEF编辑器属性页

阅读更多

GEF配合EMF是很常用的eclipse可视化应用的解决方案,用EMF的好处就是可以根据uml,schema等生成应用模型代码,并且emf生成的模型代码包含模型的监听机制,省去了很多代码量。同样EMF.EDIT框架包含了模型的content,label provider和property source的支持,应用可以方便使用使用,你可以看到EMF.EDIT框架为每个模型生成了命名形式为 ****ProviderAdapter的类,继承自ItemProviderAdapter,又实现了诸如IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource的接口,看出来了吧,这个了还是干了很多事儿的。今天主要讨论如何利用EMF.EDIT提供的对模型property source的支持,实现gef编辑器属性页(又省了N多代码啊,实现属性页支持一般要实现自己的IPropertySource和IPropertyDescriptor,很多代码啊)。先看一下实现后的样子,使用了eclipse tabbed property page:

Category tab:

A to Z tab:

咋实现的呢?由于俺也有2年多没摸gef/emf了,于是乎想起了当年作为入门学习的八进制同学的blog(http://www.cnblogs.com/bjzhanghao)借鉴了关于利用emf实现属性页的那篇文章,有兴趣的可以看一下。但是使用EMF.EDIT实现属性也还是有点问题。主要有:

1. 没有实现属性分类的可配置化,只能a-z的排列

2. 由于emf属性页改变模型使用emf自己的command框架,和gef的command框架不同,这就造成emf属性页修改模型后,undo有点问题。这个问题八进制也提过,不过现在我看了一下,似乎没当时那么严重了,gef/emf也在发展,dirty可以显示,就是undo完了值有问题。一会儿详细说明原因和解决办法。

下面就谈谈俺如何解决上面这两个问题的,不知道各位大侠有否更好的解决方法,希望指教点化。

先说第2点吧,导致undo问题的原因是在ItemPropertyDescriptor中的setPropertyValue(Object object, Object value)方法,第二个参数value不是真正要改变的值,而是PropertyValueWrapper对象,这个要归功于ItemPropertyDescriptor中的getPropertyValue方法把原本的属性值包装成了PropertyValueWrapper对象,于是乎SetValueCommand中保存的需要undo的属性值是PropertyValueWrapper类型,于是乎在undo是调用setPropertyValue就会出错。

解决办法很简单,实现自己的ItemPropertyDescriptor覆盖setPropertyValue方法:

public class KulItemPropertyDescriptor extends ItemPropertyDescriptor {

	public KulItemPropertyDescriptor(AdapterFactory adapterFactory,
		      ResourceLocator resourceLocator,
		      String displayName,
		      String description,
		      EStructuralFeature feature, 
		      boolean isSettable,
		      boolean multiLine,
		      boolean sortChoices,
		      Object staticImage,
		      String category,
		      String [] filterFlags) {
		super(adapterFactory, resourceLocator, displayName, description, feature, isSettable, multiLine, sortChoices, staticImage, category, filterFlags);
		
	}
	@Override
	public void setPropertyValue(Object object, Object value) {
		Object validValue = null;
		if(value instanceof PropertyValueWrapper) {
			validValue = ((PropertyValueWrapper) value).getEditableValue(null);
		} else {
			validValue = value;
		}
		super.setPropertyValue(object, validValue);
	}
}
 

要使用自己的ItemPropertyDescriptor,需要做的就是实现自己ItemProviderAdapter,让所有**PropertyAdapter继承它,参考代码:

 

public class CustomItemProviderAdapter extends ItemProviderAdapter {

	public CustomItemProviderAdapter(AdapterFactory adapterFactory) {
		super(adapterFactory);
		
	}
	protected ItemPropertyDescriptor createItemPropertyDescriptor(
		    AdapterFactory adapterFactory,
		    ResourceLocator resourceLocator,
		    String displayName,
		    String description,
		    EStructuralFeature feature,
		    boolean isSettable,
		    boolean multiLine,
		    boolean sortChoices,
		    Object staticImage,
		    String category,
		    String[] filterFlags) {
		
		    return new KulItemPropertyDescriptor(
		      adapterFactory,
		      resourceLocator,
		      displayName,
		      description,
		      feature,
		      isSettable,
		      multiLine,
		      sortChoices,
		      staticImage,
		      category,
		      filterFlags);
		  }
}
 

 

好,现在第2个问题解决了,第一个问题其实也好解决。应为EMF.EDIT生成的代码,默认每个属性的category是null,可以看一下**ProviderAdapter中的创建PropertyDescriptor的方法,要给属性赋予一个category于是乎实现自己的PropertySource在覆盖createPropertyDescriptor方法,返回自己的IPropertyDescriptor,在自己的IPropertyDescriptor中重写getCategory方法就ok了,参考代码:

private class KulPropertySource extends PropertySource {
		private PropertyHolderType propertyHolder = null;

		public KulPropertySource(Object object,
				IItemPropertySource itemPropertySource) {
			super(object, itemPropertySource);
			propertyHolder = PropertyConfigLoader.getInstance()
					.getPropertyHolder(((EObject) object).eClass().getName());
		}

		public IPropertyDescriptor[] getPropertyDescriptors() {
			Collection<IPropertyDescriptor> result = new ArrayList<IPropertyDescriptor>();
			List<IItemPropertyDescriptor> itemPropertyDescriptors = itemPropertySource
					.getPropertyDescriptors(object);
			if (itemPropertyDescriptors != null) {
				for (IItemPropertyDescriptor itemPropertyDescriptor : itemPropertyDescriptors) {
					result.add(createPropertyDescriptor(itemPropertyDescriptor));
				}
			}

			return result.toArray(new IPropertyDescriptor[result.size()]);
		}
		
		protected IPropertyDescriptor createPropertyDescriptor(
				IItemPropertyDescriptor itemPropertyDescriptor) {
			return new PropertyDescriptor(object, itemPropertyDescriptor) {
				public String getCategory() {
					CategoryType ct = PropertyConfigLoader.getInstance()
							.getCategory(propertyHolder,itemPropertyDescriptor.getDisplayName(object));
					if(ct != null) {
						return ct.getId();
					}
					return "Other";
				}
				
			};
		}

	}

这个KulPropertySource类是啥?怎么用?其实这个就是你自己的IPropertySourceProvider中getPropertySource要返回的PropertySource对象。那IPropertySourceProvider又是啥?这个就是UndoablePropertySheetEntry.setPropertySourceProvider()方法要传入的参数,UndoablePropertySheetEntry是啥?就是PropertySheetPage.setRootEntry()要传入的参数,PropertySheetPage是啥?你因该了解吧。

 

  • 大小: 6.6 KB
  • 大小: 7.6 KB
分享到:
评论

相关推荐

    org.eclipse.emf.ant_2.1.0.jar

    org.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jar

    org.eclipse.emf.transaction-1.8.0.201405281451.jar

    解决4.7.2版本eclipse不能在线安装activiti插件的问题

    swing的三个插件(emf-sdo-runtime-2.2.0.zip,GEF-runtime-3.2.zip,VE-runtime-1.2.2_jem.zip)

    GEF是Eclipse中的一个图形编辑框架,主要用于创建可定制的图形编辑器。它提供了一系列的抽象类和接口,使得开发者可以快速构建出交互式的图表编辑工具。在Swing应用中,GEF Runtime可以帮助创建复杂的图形用户界面...

    eclipse的emf插件

    4. **图形用户界面(GUI)编辑器**:EMF提供了一个框架,可以快速构建基于模型的图形编辑器。这些编辑器可以让用户通过拖放操作直观地创建和修改模型。 5. **生态集成**:EMF与Eclipse的其他组件,如GMF(Graphical...

    Eclipse-EMF-GEF资料.rar

    通过学习和实践这些资料,开发者可以掌握构建基于 EMF 的模型,使用 GEF 创建图形编辑器,以及如何将 XML Schema 数据与模型集成。这些技术在现代软件工程,尤其是企业级应用和工具开发中,都有着广泛的应用。

    requires 'org.eclipse.emf.transaction 1.4.0' but it could not be found 问题处理

    eclipse安装Activiti Designer 5.14.1插件失败后,把这上述压缩包中的jar文件拷贝到自己的eclipse的plugin文件夹下面,重启eclipse再次安装activiti插件就可以了。

    EMF模型文件对比/比较(emf.compare)

    EMF(Eclipse Modeling Framework)模型文件对比/比较(emf.compare)是针对基于EMF构建的模型文件进行差异分析的工具。EMF是Eclipse项目中的一个子项目,它提供了一种创建、操作和共享复杂的领域特定语言(DSL)...

    EMF_GEF_入门系列

    1. **EMF基础**:首先会讲解EMF的核心概念,包括模型、包、类和属性,以及如何使用EMF的建模工具(如EMF Edit或EMF Modeler)创建和管理数据模型。 2. **EMF代码生成**:学习如何利用EMF自动生成Java代码,包括数据...

    eclipse-emf for activiti 插件 jar包

    org.eclipse.emf.transaction_1.4.0.v20100331-1738.jar org.eclipse.emf.validation_1.7.0.201306111341.jar org.eclipse.emf.workspace_1.5.1.v20120328-0001.jar

    GEF快速入门教程和EMF教程

    - 在`gef.tutorial.step.ui`包中实现编辑器类,该类继承自`org.eclipse.ui.part.EditorPart`。 - 实现编辑器的`createPartControl`方法,以设置编辑器的内容。 - 在编辑器中集成`Viewer`以显示图形。 ### 总结 ...

    GEF_Tutorial.rar(GEF开发指南)

    **GEF(Graphical Editing Framework)开发指南*...总之,"GEF_Tutorial.rar"是一个宝贵的资源,它将引导你踏入GEF开发的世界,通过实例学习,你将能够熟练地创建出功能丰富的图形编辑器,实现各种复杂的图形用户界面。

    eclipse Activiti 流程图创建缺少 emf jar

    requires 'org.eclipse.emf.transaction 1.4.0' but it could not be found 解决办法:将下载解压后的这三个文件拷贝到eclipse的plugin文件夹下即可解决上述问题 org.eclipse.emf.transaction_1.4.0.v201003 31-1738...

    eclipse emf&gef

    通过将GEF与EMF结合使用,可以轻松创建高度可定制的图形化编辑器,用于编辑由EMF生成的模型。 **3.3 GEF编辑器开发流程** 1. **定义模型**:首先使用EMF定义模型。 2. **创建视图**:使用GEF创建一个图形化的视图...

    EMF、GEF、VE 适合于Eclipse 3.2.0

    一旦安装成功,你就可以利用EMF创建和管理模型,使用GEF构建图形编辑器,而VE则可以帮助你实现可视化编程。 总结一下,EMF、GEF和VE是Eclipse平台上用于模型驱动开发的重要组成部分。EMF负责模型的定义和数据管理,...

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

    3. 图形编辑器的构建:详细步骤指导如何使用GEF创建可交互的图形编辑器,包括图元的创建、布局管理、编辑操作的实现等。 4. EMF模型的生成与使用:讲解如何定义XML Schema,由EMF自动生成Java类,以及如何在代码中...

    emf swt runtime gef

    GEF 是一个用于构建图形编辑器的框架,它基于EMF和SWT,提供了创建可定制的、图形化编辑环境所需的基础设施。开发者可以使用 GEF 创建各种图表、流程图和其他图形表示形式,用于数据建模、软件设计等场景。GEF 提供...

    org.eclipse.emf.validation-1.7.0.201306111341.jar

    Activiti2.0安装所需插件

    org.eclipse.emf.validation_1.8.0.201405281429.jar

    实际测试,有效,实际测试,有效,

    EMF.rar_emf

    **EMF(Eclipse Modeling Framework)详解** EMF(Eclipse Modeling Framework)是Eclipse基金会下的一个...通过EMF.docx文档的学习,你可以更深入地了解EMF的工作原理和实际应用,为你的编程生涯添加一项强大的工具。

    GEF-whole-upload.rar_gef_whole

    这个框架提供了一套完整的工具和接口,帮助开发者创建基于模型的图形用户界面,尤其适用于开发复杂的可视化编辑器。在【标题】"GEF-whole-upload.rar_gef_whole" 中,“GEF-whole”暗示了这是一个关于GEF全面介绍的...

Global site tag (gtag.js) - Google Analytics