Какие-либо обходные пути к отсутствию событий предварительного выбора в SWT / JFace?

#java #swt #jface

#java #swt #jface

Вопрос:

В моем приложении я хочу, чтобы пользователь сохранял любые изменения, прежде чем он покинет вкладку (реализовано как CTabFolder ).

Я пытался обработать SelectionEvent , но он срабатывает после изменения вкладки (так почему у него вообще есть doit поле? Запускается ли он перед изменением для некоторых других элементов управления?)

Просматривая Bugzilla, я обнаружил https://bugs.eclipse.org/bugs/show_bug.cgi?id=193453 и https://bugs.eclipse.org/bugs/show_bug.cgi?id=193064, ни одно из которых не исправлено.

Поскольку это требование, вероятно, распространено, есть ли у кого-нибудь обходной путь?

Ответ №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() amp;amp; !changingPages) {
        tabFolder.setSelection(oldPageIndex);

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

    this.changingPages = false;
}
  

В canChangePages() Я открываю диалоговое окно «Вы хотите сохранить» и даю пользователю возможность выбрать «да», «нет» или «отмена». Да сохраняет информацию и возвращает true. No возвращает информацию к последнему сохраненному состоянию и возвращает true. Отмена просто возвращает false. Возможно, вы просто захотите попробовать сохранить и вернуть false только в том случае, если сохранение завершится неудачей.

Может показаться странным, что я переключаюсь обратно на старую страницу перед вызовом canChangePages(). Этот вызов выполняется быстро, поэтому создается иллюзия, что вкладка никогда не переключалась. Независимо от того, сколько времени занимает canChangePages(), пользователь не увидит изменение вкладки, если оно не одобрено этим методом.

Комментарии:

1. Я придумал один и тот же обходной путь как для CTabFolders, так и для деревьев 🙂 Я ожидал некоторого мерцания, но ничего не увидел. И, к счастью, CTabFolder действительно запускает событие перед закрытием вкладки 🙂

2. Начиная с 2015 года, tabFolder.getSelectionIndex() всегда будет возвращать то же значение, что и tabFolder.indexOf((CTabItem) e.item) . Таким образом, newPageIndex всегда будет равно oldPageIndex внутри SelectionListener . Если у кого-то возникли проблемы с этим, сохраните старый индекс страницы для себя, чтобы преодолеть эту проблему.