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的属性页问题,如需转载请自行联系原博主。

相关文章
|
SQL 分布式计算 Ubuntu
【Hive】Hive开启远程连接及访问方法
【Hive】Hive开启远程连接及访问方法
4090 0
|
设计模式 Java Spring
依赖注入(DI)及其三个类
【8月更文挑战第24天】
201 0
|
SQL 关系型数据库 MySQL
【MySQL系列】ALTER语句详解,以及UPDATE,DELECT,TRUNCATE语句的使用+区别
上一篇博客讲解了字符集,数据类型,还有简单的数据库的创建与删除。本篇博客将讲解MySQL的修改更新删除等操作 文章目录
|
机器学习/深度学习 监控 安全
云端守护:云计算环境下的网络安全策略与实践
【5月更文挑战第29天】 随着企业数字化转型的加速,云计算服务已成为支撑现代业务架构的关键。然而,数据和服务的云端迁移也带来了前所未有的安全挑战。本文深入探讨了云计算环境中的网络安全问题,分析了当前主流的云服务模型(IaaS, PaaS, SaaS)面临的安全风险,并提出了一系列创新的安全措施和最佳实践。通过综合运用加密技术、身份管理、访问控制以及实时监控等手段,构建了一个多层次的安全防护体系,旨在为云服务提供商和使用者提供指导,确保在享受云计算带来的便利同时,信息安全得到充分保护。
|
存储 网络协议 Unix
Linux C socket API 介绍
Socket英文愿意是“插孔”或“插座”,作为BSD UNIX的进程通信机制后,取后一种意思,通常也被称为套接字。使用TCP/IP协议的应用程序通常采用的应用编程是使用UNIX BSD的套接字Socket,来实现网络进程之间的通信。
157 0
|
存储 关系型数据库 MySQL
技术原理,Hologres Binlog技术原理揭秘
详细介绍Hologres Binlog技术原理以及最佳实践。
2954 4
技术原理,Hologres Binlog技术原理揭秘
|
NoSQL Java API
分布式锁主动续期的入门级实现-自省 | 简约而不简单
分布式锁主动续期的入门级实现-自省 | 简约而不简单
326 0
分布式锁主动续期的入门级实现-自省 | 简约而不简单
|
Python
中文LLM测评
下面是针对 Modelscope 的代码相关;写作创作;中文游戏三个方面的问题,并附上一段测评内容。
212 0
|
SQL 编解码 运维
一款SQL全自动化检查神器!再也不用担心 SQL 出错了,还带自动补全、回滚等等【开源项目】
Yearning MYSQL 是一个SQL语句审核平台。提供查询审计,SQL审核等多种功能,支持Mysql,可以在一定程度上解决运维与开发之间的那一环,功能丰富,代码开源,安装部署容易!
一款SQL全自动化检查神器!再也不用担心 SQL 出错了,还带自动补全、回滚等等【开源项目】
|
存储 人工智能 弹性计算
如何使用云原生数据湖,助力线上教育行业逐步智能化
阿里云基于对象存储OSS构建的数据湖解决方案,帮助企业有效消除数据孤岛的现象,让数据的价值真正被利用起来。
4382 0
如何使用云原生数据湖,助力线上教育行业逐步智能化