GEF 学习系列之五:给图元添加DirectEdit功能

给图元添加 DirectEdit 功能

DirectEdit (也称 In-Place-Edit ),就是允许用户在原本显示内容的地方直接对内容进行修改,例如在 Windows 资源管理器里选中一个文件,然后按 F2 键就可以开始修改文件名。实现 DirectEdit 的原理很直接:当用户发出修改请求( REQ_DIRECT_EDIT )时,就在文字内容所在位置覆盖一个文本框(也可以是下拉框)作为编辑器,编辑结束后,再将编辑器中的内容应用到模型里即可。

需要新建如下类文件:

1)      CustomDirectEditManager DirectEditManager 继承而来。在 GEF 里这样的弹出编辑器由 DirectEditManager 来管理,需要覆盖其中的方法 initCellEditor() 来初始化编辑器(如:默认将文字全选等);

2)      CustomCellEditorLocator CellEditorLocator 继承而来。这是一个编辑器的定位器,其关键方法是: relocate(CellEditor celleditor) ,用来将编辑器组件放置在适当的位置(如:刚好覆盖文字信息)。

3)      CustomDirectEditPolicy DirectEditPolicy 继承而来, DirectEditPolicy GEF 提供的一个抽象实现,因为 GEF 不知道用户应用程序的具体实现细节,所以这些细节需要由用户来提供。此处的做法是覆盖方法 getDirectEditCommand(DirectEditRequest request) 并返回一个编辑命令;

4)      DirectEditCommand Command 继承而来,封装了模型的编辑信息。

需要对控制器( HelloEditPart )做如下修改 :

1)      覆盖父类方法: performRequest(Request req) 。此处是对请求的预处理,默认没有做任何实现,我们可以在此处实例化一个 DirectEditManager 对象,并调用 directManager.show();

2)      需要在方法 createEditPolicies() 中为控制器安装 DirectEdit 的策略,如下:

     installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,

new CustomDirectEditPolicy()) ,注意如果不为控制器安装对应请求处理策略的话,将不会产生 Command ,也就是说在编辑器里做的任何修改都不会应用到模型。

至此,给图元添加 DirectEdit 功能完成。效果如图:


 

下面将尝试将编辑器从文本框换成下拉框,需要做如下修改:

1)      修改 HelloEditPart 中的方法 performRequest(Request req) 将编辑器类型更改为 CheckboxCellEditor

2)      修改 CustomDirectEditManager 中的方法 initCellEditor() ,获取编辑器的可见组件,并为其设置初始值,此处为下拉框设置了 4 个可选值;

3)      覆盖方法 CellEditor createCellEditorOn(Composite composite) ,此方法的作用是在 composite 上创建一个 CellEditor 。因为此处需要的是 ComboxCellEditor ,所以直接 return new ComboxCellEditor(compisite,..) 即可。此处有一点需要注意:在 DirectEditManager 类的此方法中采用的是 Java reflect 来生成相应的编辑器对象,按理来说,不需要用户再去实现这个方法,但是在运行是总是在这个方法里面抛出异常,所以就重写了此方法。

修改完毕,效果如下图所示:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值