给图元添加 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 来生成相应的编辑器对象,按理来说,不需要用户再去实现这个方法,但是在运行是总是在这个方法里面抛出异常,所以就重写了此方法。
修改完毕,效果如下图所示: