自定义 RCP 编辑器和视图标题关闭操作

本文介绍了如何自定义Eclipse RCP应用中编辑器和视图标题的关闭操作,特别是在用户点击关闭按钮时,无论是否需要保存,都能显示提示。通过监听TabFolder的EVENT_CLOSE事件并覆盖默认行为,实现了自定义的关闭逻辑。同时,文章提到了其他可重写的TabFolderEvent事件,可用于扩展更多功能。

 

    的关闭操作特指标题栏最右方的关闭按钮操作。一般来说编辑器的关闭事件都是自己默认的实现,比如继承了ISavePart2 的编辑器在Dirty 属性为true 时点击这个按钮会出现确定信息框,这个是由ISavePart2 .promptToSaveOnClose()实现的,一般情况下重写这个函数即可。这种情况下编辑器标题上会出现一个“*”号代表当前编辑器有未保存的修改。

    多讲一下编辑器默认的保存机制,在工具栏和菜单中有个菜单“Save”,这个菜单可以自动根据当前编辑器是否需要保存来切换状态。若不需要保存,则不可用,反之则可以使用。这个菜单的状态与编辑器的Ditry 属性密切相关联。同时ISaveablePart ISaveablePart2 中的一些Save 方法都与它相关。

假如用户点击关闭按钮时需要始终出现退出提示,这种情况下promptToSaveOnClose()就不能用了,因为它也与Dirty属性相关。

这里提供一个可选方案,还是与PresentationFactory 有关。

  关闭按钮位于TabFolder上,可以考虑给它添加一个监听器——TabFolderListener,它负责对TabFolderEvent.EVENT_CLOSE时间进行监听。

    private static void hookTabFolder(final IStackPresentationSite site,

                     TabbedStackPresentation result) {

              AbstractTabFolder tabFolder = result.getTabFolder();

              Object objOldTabFolderListener = null;

              try {

                     Field[] fields = result.getClass().getDeclaredFields();

                     for (int i = 0; i < fields.length; i++) {

                            if (fields[i].getName().equals("tabFolderListener")) {

                                   fields[i].setAccessible(true);

                                   objOldTabFolderListener = fields[i].get(result);

                                   break;

                            }

                     }

              } catch (IllegalAccessException e) {

              }

              final TabFolderListener oldTabFolderListener = (TabFolderListener) objOldTabFolderListener;

              TabFolderListener tabFolderListener = new TabFolderListener() {

                     @Override

                     public void handleEvent(TabFolderEvent e) {

                            switch (e.type) {

                            case TabFolderEvent.EVENT_CLOSE:

                                   IPresentablePart part = (IPresentablePart) e.tab.getData();

                                   boolean confirm = handleClose(site, part);

                                   if (confirm) {

                                          if (oldTabFolderListener != null)

                                                 oldTabFolderListener.handleEvent(e);

                                   }

                                   break;

 

                            default:

                                   if (oldTabFolderListener != null)

                                          oldTabFolderListener.handleEvent(e);

                                   break;

                            }

                     }

              };

              tabFolder.removeListener(oldTabFolderListener);

              tabFolder.addListener(tabFolderListener);

       }

调用hookTabFolder()方法:

public StackPresentation createViewPresentation(Composite parent,

                     IStackPresentationSite site) {

              TabbedStackPresentation result = (TabbedStackPresentation) super

                            .createEditorPresentation(parent, site);

              hookTabFolder(site, result);

              return result;

       }

除了EVENT_CLOSE 事件以外,其他事件都照旧处理,具体怎么提示自己实现handleClose()函数。类推一下,TabFolderEvent还有其他的事件,理论上这些事件都可以按照这种方法重写。

    public static final int EVENT_PANE_MENU = 1;

    public static final int EVENT_HIDE_TOOLBAR = 2;

    public static final int EVENT_SHOW_TOOLBAR = 3;

    public static final int EVENT_RESTORE = 4;

    public static final int EVENT_MINIMIZE = 5;

    public static final int EVENT_CLOSE = 6;

    public static final int EVENT_MAXIMIZE = 7;

    public static final int EVENT_TAB_SELECTED = 8;

    public static final int EVENT_GIVE_FOCUS_TO_PART = 9;

    public static final int EVENT_DRAG_START = 10;

    public static final int EVENT_SHOW_LIST = 11;

    public static final int EVENT_SYSTEM_MENU = 12;

    public static final int EVENT_PREFERRED_SIZE = 13;

最后别忘了使用自定义的PresentationFactory

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值