EMF+GEF的属性页问题

简介: 最近有朋友问使用EMF作为GEF模型时,如何在选中editpart时在属性页里显示属性的问题。是的,因为GEF是这样判断是否填充属性 页的: public Object getAdapter(Class key) {     if (IPropertySource.

最近有朋友问使用EMF作为GEF模型时,如何在选中editpart时在属性页里显示属性的问题。是的,因为GEF是这样判断是否填充属性 页的:

public  Object getAdapter(Class key) {
    
if  (IPropertySource. class   ==  key) {
        
if  (getModel()  instanceof  IPropertySource)
            
return  getModel();
        
if  (getModel()  instanceof  IAdaptable)
            
return  ((IAdaptable)getModel()).getAdapter(key);
    }
    
if  (AccessibleEditPart. class   ==  key)
        
return  getAccessibleEditPart();
    
return   null ;
}

所以,一般(不使用EMF)我们让模型类实现IPropertySource接口即可看到属性。而用EMF生成的模型类是不实现这个接口的,因此用户在界面上选中 editpart时属性页里只能是空白。

要解决这个问题,一种方式是覆盖editpart的getAdapter()方法,返回一个自定义的PropertySource, 这个办法比较直接,但那么多属性写起来很麻烦,更重要的是当ecore模型改变后这些属性是不会跟着变的;另一种方式是在editor类里作文章,工作量 比较小,具体办法如下:

ModelItemProviderAdapterFactory adapterFactory;
AdapterFactoryContentProvider adapterFactoryConentProvider;

// Constructor of the editor
public  TobeEditor() {
    setEditDomain(
new  DefaultEditDomain( this ));
    
// For getting propertysource from emf.edit
    adapterFactory  =   new  ModelItemProviderAdapterFactory();
    adapterFactoryConentProvider 
=   new  AdapterFactoryContentProvider(adapterFactory);
}

public  Object getAdapter(Class type) {
    
if  (type  ==  IContentOutlinePage. class )
        
return   new  OutlinePage();
    
if  (type  ==  org.eclipse.ui.views.properties.IPropertySheetPage. class ) {
        PropertySheetPage page 
=   new  PropertySheetPage();
        UndoablePropertySheetEntry root 
=   new  UndoablePropertySheetEntry(getCommandStack());
        root.setPropertySourceProvider(
new  IPropertySourceProvider() {
            
public  IPropertySource getPropertySource(Object object) {
                
if  (object  instanceof  EditPart) {
                    Object model 
=  ((EditPart) object).getModel();
                    
return   new  PropertySource(model, (IItemPropertySource) adapterFactory.adapt(model,
                            IItemPropertySource.
class ));
                } 
else  {
                    
return  adapterFactoryConentProvider.getPropertySource(object);
                }
            }
        });
        page.setRootEntry(root);
        
return  page;
    }
    
return   super .getAdapter(type);
}

也就是对UndoablePropertySheetEntry做一些处理,让它能够适应editpart的选择(GEF里选中元素的都是 editpart而非model本身)。这个方法在显示属性方面没有什么问题,但在属性页里修改属性值后,是不能undo的,而且不会显示表示dirty 的*号,所以还有待改进。

EMF+GEF里像这种别扭的地方还远不只这一处,不过我相信大部分都是可以适当修改一些代码解决的,希望它们之间增加一些合作,同时继续期待GMF

本文转自博客园八进制的博客,原文链接:EMF+GEF的属性页问题,如需转载请自行联系原博主。

相关文章
|
12月前
|
存储 Android开发
Eclipse安装Flowable Eclipse Designer插件实现图形建模BPMN 2.0流程图
Eclipse安装Flowable Eclipse Designer插件实现图形建模BPMN 2.0流程图
339 0
|
Android开发
eclipse awt包在图片上显示文字
eclipse awt包在图片上显示文字
118 0
eclipse awt包在图片上显示文字
|
Java Go Android开发
让您的Eclipse具有千变万化的外观
让您的Eclipse具有千变万化的外观
124 0
|
Android开发
[Eclipse]GEF入门系列(六、添加菜单和工具条)
我发现一旦稍稍体会到GEF的妙处,就会很自然的被它吸引住。不仅是因为用它做出的图形界面好看,更重要的是,UI中最复杂和细微的问题,在GEF的设计中无不被周到的考虑并以适当的模式解决,当你了解了这些,完全可以把这些解决方法加以转换,用来解决其他领域的设计问题。
1633 0
|
Java Android开发 数据格式
[Eclipse]GEF入门系列(八、使用EMF构造GEF的模型)
GEF的设计没有对模型部分做任何限制,也就是说,我们可以任意构造自己的模型,唯一须要保证的就是模型具有某种消息机制,以便在发生变化时能够通 知GEF(通过EditPart)。在以前的几个例子里,我们都是利用java.beans包中的PropertyChangeSupport和 PropertyChangeListener来实现消息机制的,这里将介绍一下如何让GEF利用EMF构造的模型(下载例子,可编辑.emfsubject文件,请对比之前功能相同的非EMF例子),假设你对EMF是什么已经有所了解。
1515 0
|
Android开发 开发者 图形学
[Eclipse]GEF入门系列(十、表格的一个实现)
在目前的GEF版本(3.1M6)里,可用的LayoutManager还不是很多,在新闻组里经常会看到要求增加更多布局的帖子,有人也提供了自己的实现,例如这个GridLayout,相当于SWT中GridLayout的Draw2D实现,等等。
1279 0
|
前端开发 Shell Android开发
[Eclipse]GEF入门系列(一、Draw2D)
鸡年第一天,首先向大家拜个年——恭祝新春快乐,万事如意。一年之计在于春,你对新的一年有什么安排呢?好的,下面还是进入正题吧。 关于Java2D相信大家都不会陌生,它是基于AWT/Swing的二维图形处理包, JDK附带的示例程序向我们展示了Java2D十分强大的图形处理能力。
1772 0
|
Android开发
[Eclipse]GEF入门系列(五、浅谈布局)
虽然很多GEF应用程序里都会用到连接(Connection),但也有一些应用是不需要用连接来表达关系的,我们目前正在做的这个项目就是这样一个例子。在这类应用中,模型对象间的关系主要通过图形的包含来表达,所以大多是一对多关系。
1548 0