在SWT / JFace中缺少PreSelection事件的任何变通方法?

时间:2010-06-02 13:46:53

标签: java swt jface

在我的应用程序中,我希望用户在离开选项卡之前保存所有更改(实现为CTabFolder)。

我尝试处理SelectionEvent,但在标签更改后触发了(为什么它还有doit字段?是否在更改之前触发一些其他控件?)

在Bugzilla上,我找到https://bugs.eclipse.org/bugs/show_bug.cgi?id=193453https://bugs.eclipse.org/bugs/show_bug.cgi?id=193064,但两者都没有修复。

由于这个要求可能很常见,有没有人有解决方法?

1 个答案:

答案 0 :(得分:1)

我有一个与org.eclipse.ui.part.MultiPageEditorPart一起使用的解决方法,它由CTabFolder支持。我将其用于直接的CTabFolder实现。

首先使用选择监听器:

tabFolder.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
        pageChange(tabFolder.indexOf((CTabItem) e.item));
    }
});

然后我像这样实现pageChange():

protected void pageChange(int newPageIndex) {
    boolean changingPages = this.changingPages;
    this.changingPages = true;
    int oldPageIndex = tabFolder.getSelectionIndex();

    if (isDirty() && !changingPages) {
        tabFolder.setSelection(oldPageIndex);

        if (canChangePages()) {
            tabFolder.setSelection(newPageIndex);
        }
    }

    this.changingPages = false;
}

在canChangePages()中,我弹出一个你想要保存的对话框,并让用户有机会选择是,否或取消。是保存信息并返回true。不将信息恢复为上次保存的状态并返回true。取消只是返回false。您可能只想尝试保存并仅在保存失败时返回false。

在调用canChangePages()之前切换回旧页面可能看起来很奇怪。此调用快速执行,因此它给出了从不切换选项卡的错觉。无论canChangePages()花多长时间,用户都不会看到标签更改,除非它被该方法批准。