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
分享到:
- 2009-11-29 11:43
- 浏览 1594
- 评论(0)
- 论坛回复 / 浏览 (0 / 2707)
- 查看更多
相关推荐
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
解决4.7.2版本eclipse不能在线安装activiti插件的问题
GEF是Eclipse中的一个图形编辑框架,主要用于创建可定制的图形编辑器。它提供了一系列的抽象类和接口,使得开发者可以快速构建出交互式的图表编辑工具。在Swing应用中,GEF Runtime可以帮助创建复杂的图形用户界面...
4. **图形用户界面(GUI)编辑器**:EMF提供了一个框架,可以快速构建基于模型的图形编辑器。这些编辑器可以让用户通过拖放操作直观地创建和修改模型。 5. **生态集成**:EMF与Eclipse的其他组件,如GMF(Graphical...
通过学习和实践这些资料,开发者可以掌握构建基于 EMF 的模型,使用 GEF 创建图形编辑器,以及如何将 XML Schema 数据与模型集成。这些技术在现代软件工程,尤其是企业级应用和工具开发中,都有着广泛的应用。
eclipse安装Activiti Designer 5.14.1插件失败后,把这上述压缩包中的jar文件拷贝到自己的eclipse的plugin文件夹下面,重启eclipse再次安装activiti插件就可以了。
EMF(Eclipse Modeling Framework)模型文件对比/比较(emf.compare)是针对基于EMF构建的模型文件进行差异分析的工具。EMF是Eclipse项目中的一个子项目,它提供了一种创建、操作和共享复杂的领域特定语言(DSL)...
1. **EMF基础**:首先会讲解EMF的核心概念,包括模型、包、类和属性,以及如何使用EMF的建模工具(如EMF Edit或EMF Modeler)创建和管理数据模型。 2. **EMF代码生成**:学习如何利用EMF自动生成Java代码,包括数据...
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.tutorial.step.ui`包中实现编辑器类,该类继承自`org.eclipse.ui.part.EditorPart`。 - 实现编辑器的`createPartControl`方法,以设置编辑器的内容。 - 在编辑器中集成`Viewer`以显示图形。 ### 总结 ...
**GEF(Graphical Editing Framework)开发指南*...总之,"GEF_Tutorial.rar"是一个宝贵的资源,它将引导你踏入GEF开发的世界,通过实例学习,你将能够熟练地创建出功能丰富的图形编辑器,实现各种复杂的图形用户界面。
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...
通过将GEF与EMF结合使用,可以轻松创建高度可定制的图形化编辑器,用于编辑由EMF生成的模型。 **3.3 GEF编辑器开发流程** 1. **定义模型**:首先使用EMF定义模型。 2. **创建视图**:使用GEF创建一个图形化的视图...
一旦安装成功,你就可以利用EMF创建和管理模型,使用GEF构建图形编辑器,而VE则可以帮助你实现可视化编程。 总结一下,EMF、GEF和VE是Eclipse平台上用于模型驱动开发的重要组成部分。EMF负责模型的定义和数据管理,...
3. 图形编辑器的构建:详细步骤指导如何使用GEF创建可交互的图形编辑器,包括图元的创建、布局管理、编辑操作的实现等。 4. EMF模型的生成与使用:讲解如何定义XML Schema,由EMF自动生成Java类,以及如何在代码中...
GEF 是一个用于构建图形编辑器的框架,它基于EMF和SWT,提供了创建可定制的、图形化编辑环境所需的基础设施。开发者可以使用 GEF 创建各种图表、流程图和其他图形表示形式,用于数据建模、软件设计等场景。GEF 提供...
Activiti2.0安装所需插件
实际测试,有效,实际测试,有效,
**EMF(Eclipse Modeling Framework)详解** EMF(Eclipse Modeling Framework)是Eclipse基金会下的一个...通过EMF.docx文档的学习,你可以更深入地了解EMF的工作原理和实际应用,为你的编程生涯添加一项强大的工具。
这个框架提供了一套完整的工具和接口,帮助开发者创建基于模型的图形用户界面,尤其适用于开发复杂的可视化编辑器。在【标题】"GEF-whole-upload.rar_gef_whole" 中,“GEF-whole”暗示了这是一个关于GEF全面介绍的...