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