我需要实现这样一种场景:
在创建节点时,从PaetteRoot中选择一个CreationEntry,然后在编辑区点击(或拖拽到编辑区),这时弹出一节点属性设置对话框。
之前在网上看到了两种实现方式,但都有一点问题。如下:
1、在Command中实现。也是就是在execute()方法中打开对话框。
问题:由于这个Command已经放入EditDomain的CommandStack中,如果用户选择了“Cancel”,这时Editor显示仍然是dirty,并且造成undo、redo等实现的复杂性(得判断Command中对话框中是否选择了ok)。
因为GEF中会一直监听鼠标事件,所以会一直触发policy事件,故而也不能在policy中打开对话框。否则只要鼠标在编辑区移动,就会不停地打开对话框。
2、使用自定义的CreationTool,在performCreation(int button)方法中打开对话框。
问题:这种方式,虽然解决了CommandStack混乱的问题,但是,如果用户要通过拖拽(非点击)方式创建节点的话,就不会打开对话框。因为拖拽方式是通过DragSourceListener和DropTargetListener来调用CommandStack的execut方法,不会使用到CreationTool。
解决方法:重写CommandStack的execute()方法。代码如下: