的关闭操作特指标题栏最右方的关闭按钮操作。一般来说编辑器的关闭事件都是自己默认的实现,比如继承了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。
本文介绍了如何自定义Eclipse RCP应用中编辑器和视图标题的关闭操作,特别是在用户点击关闭按钮时,无论是否需要保存,都能显示提示。通过监听TabFolder的EVENT_CLOSE事件并覆盖默认行为,实现了自定义的关闭逻辑。同时,文章提到了其他可重写的TabFolderEvent事件,可用于扩展更多功能。
2083

被折叠的 条评论
为什么被折叠?



