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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值