自定义 RCP 编辑器跟视图标题菜单关闭操作
编辑器和视图标题的关闭操作特指标题栏 最右方的关闭按钮操作。一般来说编辑器的关闭事件都是自己默认的实现,比如继承了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 。