Как определить, что диалог JFace или SWT в настоящее время открыт?

В нашем приложении RCP нам нужно прибегнуть к использованию глобального обработчика ключевых событий (через Display.addFilter()) для более продвинутой обработки/маршрутизации ключевых событий независимо от текущего фокуса. Нам нужно иметь возможность определить, открыто ли в настоящее время диалоговое окно для какой-либо логики маршрутизации.

Кажется, что это довольно тривиальный вопрос, но я продолжаю заходить в тупик, уходя от иерархии виджетов, оболочек, оконных менеджеров.

Я ищу надежное решение, которое не потребует дополнительной работы со стороны разработчиков Dialog или клиентского кода, использующего стандартные диалоги фреймворка.


person Andrei Lissovski    schedule 16.08.2010    source источник


Ответы (1)


В приведенном ниже примере shell — это определенная оболочка в области. Вы можете изменить код, чтобы сравнить activeShell со списком оболочек.

shell.getDisplay().addFilter(SWT.KeyDown, new Listener() {
    public void handleEvent(final Event event) {
        if (shell.isDisposed()) {
            return;
        }
        final Shell activeShell = shell.getDisplay().getActiveShell();
        if (activeShell != null && activeShell.equals(shell)) {
            if (event.stateMask == SWT.MOD1 && event.character == 'w') {
                shell.dispose();
            }
        }
    }
});

Этот пример кода закрывает shell при нажатии +W на Mac.

person Paul Lammertsma    schedule 16.08.2010
comment
getActiveShell() был ключевой частью информации, которую я искал. В нашем конкретном случае мы можем сравнить с ним оболочки для всех окон верстака. Спасибо! - person Andrei Lissovski; 17.08.2010