自定义 RCP 编辑器跟视图标题菜单关闭操作

自定义 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