Как перенаправить нажатия клавиш на другую оболочку в приложении на основе Eclipse?

#eclipse #swt #eclipse-rcp

#eclipse #swt #eclipse-rcp

Вопрос:

Я работаю над тем, чтобы максимально увеличить область редактирования в моем приложении RCP на основе Eclipse, чтобы она была абсолютно полноэкранной, без обрезки, без меню и так далее. На самом деле, это редактор GEF. Это немного халтурно, но вроде как работает:

 GraphicalViewer viewer = (GraphicalViewer)getWorkbenchPart().getAdapter(GraphicalViewer.class);
        Control control = viewer.getControl();
        Composite oldParent = control.getParent();

        Shell shell = new Shell(SWT.APPLICATION_MODAL);
        shell.setFullScreen(true);
        shell.setMaximized(true);

        // Some code here to listen to Esc key to dispose Shell and return...

        shell.setLayout(new FillLayout());
        control.setParent(shell);
        shell.open();
  

По сути, это устанавливает родительский элемент управления GraphicalViewer во вновь созданную развернутую оболочку. Нажатие escape вернет элемент управления к его исходному родительскому элементу (код не показан для краткости).

Единственное, что не работает, — это получение глобальных нажатий клавиш (Del, Ctrl Z, Ctrl A), которые объявлены для Workbench и перенаправлены в EditorPart. Есть ли какой-либо способ, которым я могу подключиться к ним или перенаправить их из EditorPart, чтобы перенаправить их в GraphicalViewer?

Заранее спасибо

Ответ №1:

Короткий ответ — вы не можете этого сделать. Как только вы повторно создаете этот составной элемент из окна workbench, он полностью отключается. Система не будет корректно обрабатывать часть, поскольку события (такие как активация, фокус, установленные границы (*)) не обрабатываются.

Единственным поддерживаемым способом было бы открыть новое окно Workbench с перспективой, содержащей только область редактора, и расширить ваш org.eclipse.ui.application.WorkbenchWindowAdvisor.createWindowContents(Shell) метод для этой комбинации окно перспектива, чтобы скрыть всю ненужную обрезку, используя org.eclipse.ui.application.IWorkbenchWindowConfigurer .

например, в MyWorkbenchWindowAdvisor:

 public void createWindowContents(Shell shell) {
    if (isCreatingSpecialPerspective()) {
        final IWorkbenchWindowConfigurer config = getWindowConfigurer();
        config.setShowCoolBar(false);
        config.setShowFastViewBars(false);
        config.setShowMenuBar(false);
        config.setShowPerspectiveBar(false);
        config.setShowProgressIndicator(false);
        config.setShowStatusLine(false);
    }
    super.createWindowContents(shell);
}
  

Также ознакомьтесь http://code.google.com/p/eclipse-fullscreen / в котором есть расширенный код, связанный с запуском программы RCP с поддержкой полноэкранного режима.

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

1. Спасибо за предупреждение, я посмотрю на новую идею Workbench. (Полноэкранный плагин на самом деле не избавляет от всего содержимого trim.)

Ответ №2:

Мое предложение — попытаться подойти к этой проблеме с другой стороны. Вместо того, чтобы прослушивать нажатия клавиш в своем коде и действовать в соответствии с ними, определите свою собственную схему привязки клавиш, а затем создавайте команды и заставляйте их использовать эту схему. Это означало бы, что вам больше не нужно прослушивать нажатия клавиш в вашем коде, а вместо этого выполнять все, что необходимо, с помощью команд, выполняемых этими нажатиями клавиш.

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

1. Спасибо, у меня уже есть своя система привязки ключей, но я не использую ее для обычных команд (Удалить и т.д.). Интересующие меня нажатия клавиш на самом деле являются глобальными действиями переназначения. Поскольку моя новая оболочка на самом деле не связана с редактором, из которого она была перенесена, она не получает уведомлений о нажатиях клавиш.