Search in sources :

Example 1 with KeyBindingDispatcher

use of org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher in project eclipse.platform.ui by eclipse-platform.

the class PartRenderingEngine method run.

@Override
@Inject
@Optional
public Object run(final MApplicationElement uiRoot, final IEclipseContext runContext) {
    final Display display;
    if (runContext.get(Display.class) != null) {
        display = runContext.get(Display.class);
    } else {
        display = Display.getDefault();
        runContext.set(Display.class, display);
    }
    Realm.runWithDefault(DisplayRealm.getRealm(display), new Runnable() {

        @Override
        public void run() {
            initializeStyling(display, runContext);
            // Register an SWT resource handler
            runContext.set(IResourceUtilities.class, new ResourceUtility());
            // set up the keybinding manager
            KeyBindingDispatcher dispatcher = ContextInjectionFactory.make(KeyBindingDispatcher.class, runContext);
            runContext.set(KeyBindingDispatcher.class, dispatcher);
            keyListener = dispatcher.getKeyDownFilter();
            display.addFilter(SWT.KeyDown, keyListener);
            display.addFilter(SWT.Traverse, keyListener);
            // Show the initial UI
            // Create a 'limbo' shell (used to host controls that shouldn't
            // be in the current layout)
            Shell limbo = getLimboShell();
            runContext.set("limbo", limbo);
            // HACK!! we should loop until the display gets disposed...
            // ...then we listen for the last 'main' window to get disposed
            // and dispose the Display
            testShell = null;
            theApp = null;
            boolean spinOnce = true;
            if (uiRoot instanceof MApplication) {
                ShellActivationListener shellDialogListener = new ShellActivationListener((MApplication) uiRoot);
                display.addFilter(SWT.Activate, shellDialogListener);
                display.addFilter(SWT.Deactivate, shellDialogListener);
                // loop until the app closes
                spinOnce = false;
                theApp = (MApplication) uiRoot;
                // long startTime = System.currentTimeMillis();
                for (MWindow window : theApp.getChildren()) {
                    createGui(window);
                }
                // long endTime = System.currentTimeMillis();
                // System.out.println("Render: " + (endTime - startTime));
                // tell the app context we are starting so the splash is
                // torn down
                IApplicationContext ac = appContext.get(IApplicationContext.class);
                if (ac != null) {
                    ac.applicationRunning();
                    if (eventBroker != null) {
                        eventBroker.post(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, theApp);
                    }
                }
            } else if (uiRoot instanceof MUIElement) {
                if (uiRoot instanceof MWindow) {
                    testShell = (Shell) createGui((MUIElement) uiRoot);
                } else {
                    // Special handling for partial models (for testing...)
                    testShell = new Shell(display, SWT.SHELL_TRIM);
                    createGui((MUIElement) uiRoot, testShell, null);
                }
            }
            // allow any early startup extensions to run
            Runnable earlyStartup = (Runnable) runContext.get(EARLY_STARTUP_HOOK);
            if (earlyStartup != null) {
                earlyStartup.run();
            }
            TestableObject testableObject = runContext.get(TestableObject.class);
            if (testableObject instanceof E4Testable) {
                ((E4Testable) testableObject).init(display, runContext.get(IWorkbench.class));
            }
            IEventLoopAdvisor advisor = runContext.getActiveLeaf().get(IEventLoopAdvisor.class);
            if (advisor == null) {
                advisor = new IEventLoopAdvisor() {

                    @Override
                    public void eventLoopIdle(Display display) {
                        display.sleep();
                    }

                    @Override
                    public void eventLoopException(Throwable exception) {
                        StatusReporter statusReporter = appContext.get(StatusReporter.class);
                        if (statusReporter != null) {
                            statusReporter.show(StatusReporter.ERROR, "Internal Error", exception);
                        } else if (logger != null) {
                            logger.error(exception);
                        }
                    }
                };
            }
            final IEventLoopAdvisor finalAdvisor = advisor;
            display.setErrorHandler(e -> {
                // recoverable, hand it to the event loop advisor
                if (e instanceof LinkageError || e instanceof AssertionError) {
                    handle(e, finalAdvisor);
                } else {
                    // Otherwise, rethrow it
                    throw e;
                }
            });
            display.setRuntimeExceptionHandler(e -> handle(e, finalAdvisor));
            // Spin the event loop until someone disposes the display
            while (((testShell != null && !testShell.isDisposed()) || (theApp != null && someAreVisible(theApp.getChildren()))) && !display.isDisposed()) {
                try {
                    if (!display.readAndDispatch()) {
                        runContext.processWaiting();
                        if (spinOnce) {
                            return;
                        }
                        advisor.eventLoopIdle(display);
                    }
                } catch (ThreadDeath th) {
                    throw th;
                } catch (Exception | Error err) {
                    handle(err, advisor);
                }
            }
            if (!spinOnce) {
                cleanUp();
            }
        }

        private void handle(Throwable ex, IEventLoopAdvisor advisor) {
            try {
                advisor.eventLoopException(ex);
            } catch (Throwable t) {
                if (t instanceof ThreadDeath) {
                    throw (ThreadDeath) t;
                }
                // couldn't handle the exception, print to console
                t.printStackTrace();
            }
        }
    });
    return IApplication.EXIT_OK;
}
Also used : ContextInjectionFactory(org.eclipse.e4.core.contexts.ContextInjectionFactory) UIEvents(org.eclipse.e4.ui.workbench.UIEvents) LogService(org.osgi.service.log.LogService) MApplicationElement(org.eclipse.e4.ui.model.application.MApplicationElement) IResourceUtilities(org.eclipse.e4.ui.workbench.IResourceUtilities) URL(java.net.URL) EventHandler(org.osgi.service.event.EventHandler) SWTKeySupport(org.eclipse.jface.bindings.keys.SWTKeySupport) CSSSWTEngineImpl(org.eclipse.e4.ui.css.swt.engine.CSSSWTEngineImpl) IScopeContext(org.eclipse.core.runtime.preferences.IScopeContext) MPartStack(org.eclipse.e4.ui.model.application.ui.basic.MPartStack) OSGiResourceLocator(org.eclipse.e4.ui.css.core.util.impl.resources.OSGiResourceLocator) IExtensionRegistry(org.eclipse.core.runtime.IExtensionRegistry) Composite(org.eclipse.swt.widgets.Composite) CSSStyleDeclaration(org.w3c.dom.css.CSSStyleDeclaration) Map(java.util.Map) IEclipsePreferences(org.eclipse.core.runtime.preferences.IEclipsePreferences) IThemeManager(org.eclipse.e4.ui.css.swt.theme.IThemeManager) Focus(org.eclipse.e4.ui.di.Focus) Widget(org.eclipse.swt.widgets.Widget) IRendererFactory(org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory) MApplication(org.eclipse.e4.ui.model.application.MApplication) MElementContainer(org.eclipse.e4.ui.model.application.ui.MElementContainer) Realm(org.eclipse.core.databinding.observable.Realm) IStylingEngine(org.eclipse.e4.ui.services.IStylingEngine) KeyBindingDispatcher(org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher) Activator(org.eclipse.e4.ui.internal.workbench.Activator) NLS(org.eclipse.osgi.util.NLS) CTabFolder(org.eclipse.swt.custom.CTabFolder) TestableObject(org.eclipse.ui.testing.TestableObject) Set(java.util.Set) EObject(org.eclipse.emf.ecore.EObject) Optional(org.eclipse.e4.core.di.annotations.Optional) MToolBar(org.eclipse.e4.ui.model.application.ui.menu.MToolBar) Display(org.eclipse.swt.widgets.Display) DefaultScope(org.eclipse.core.runtime.preferences.DefaultScope) List(java.util.List) InstanceScope(org.eclipse.core.runtime.preferences.InstanceScope) DisplayRealm(org.eclipse.jface.databinding.swt.DisplayRealm) IWorkbench(org.eclipse.e4.ui.workbench.IWorkbench) MTrimmedWindow(org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow) SWT(org.eclipse.swt.SWT) Entry(java.util.Map.Entry) PostConstruct(javax.annotation.PostConstruct) IApplicationContext(org.eclipse.equinox.app.IApplicationContext) PersistState(org.eclipse.e4.ui.di.PersistState) EclipseContextFactory(org.eclipse.e4.core.contexts.EclipseContextFactory) MPerspective(org.eclipse.e4.ui.model.application.ui.advanced.MPerspective) SafeRunner(org.eclipse.core.runtime.SafeRunner) MContribution(org.eclipse.e4.ui.model.application.MContribution) StatusReporter(org.eclipse.e4.core.services.statusreporter.StatusReporter) IContributionFactory(org.eclipse.e4.core.services.contributions.IContributionFactory) HashMap(java.util.HashMap) Logger(org.eclipse.e4.core.services.log.Logger) MUIElement(org.eclipse.e4.ui.model.application.ui.MUIElement) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Inject(javax.inject.Inject) KeyFormatterFactory(org.eclipse.jface.bindings.keys.formatting.KeyFormatterFactory) MPlaceholder(org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder) MPart(org.eclipse.e4.ui.model.application.ui.basic.MPart) EclipsePreferencesHelper(org.eclipse.e4.ui.css.swt.helpers.EclipsePreferencesHelper) IEclipseContext(org.eclipse.e4.core.contexts.IEclipseContext) Listener(org.eclipse.swt.widgets.Listener) IConfigurationElement(org.eclipse.core.runtime.IConfigurationElement) IApplication(org.eclipse.equinox.app.IApplication) MWindow(org.eclipse.e4.ui.model.application.ui.basic.MWindow) Named(javax.inject.Named) Shell(org.eclipse.swt.widgets.Shell) ISafeRunnable(org.eclipse.core.runtime.ISafeRunnable) MMenu(org.eclipse.e4.ui.model.application.ui.menu.MMenu) E4Workbench(org.eclipse.e4.ui.internal.workbench.E4Workbench) ShellEvent(org.eclipse.swt.events.ShellEvent) MContext(org.eclipse.e4.ui.model.application.ui.MContext) IOException(java.io.IOException) IThemeEngine(org.eclipse.e4.ui.css.swt.theme.IThemeEngine) InjectionException(org.eclipse.e4.core.di.InjectionException) IPresentationEngine(org.eclipse.e4.ui.workbench.IPresentationEngine) ShellAdapter(org.eclipse.swt.events.ShellAdapter) MGenericStack(org.eclipse.e4.ui.model.application.ui.MGenericStack) InvalidRegistryObjectException(org.eclipse.core.runtime.InvalidRegistryObjectException) FileLocator(org.eclipse.core.runtime.FileLocator) WidgetElement(org.eclipse.e4.ui.css.swt.dom.WidgetElement) EModelService(org.eclipse.e4.ui.workbench.modeling.EModelService) Element(org.w3c.dom.Element) EventTopic(org.eclipse.e4.core.di.extensions.EventTopic) Platform(org.eclipse.core.runtime.Platform) IEventBroker(org.eclipse.e4.core.services.events.IEventBroker) Event(org.osgi.service.event.Event) Control(org.eclipse.swt.widgets.Control) InputStream(java.io.InputStream) IApplicationContext(org.eclipse.equinox.app.IApplicationContext) MWindow(org.eclipse.e4.ui.model.application.ui.basic.MWindow) TestableObject(org.eclipse.ui.testing.TestableObject) KeyBindingDispatcher(org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher) Shell(org.eclipse.swt.widgets.Shell) ISafeRunnable(org.eclipse.core.runtime.ISafeRunnable) IResourceUtilities(org.eclipse.e4.ui.workbench.IResourceUtilities) MUIElement(org.eclipse.e4.ui.model.application.ui.MUIElement) Display(org.eclipse.swt.widgets.Display) MApplication(org.eclipse.e4.ui.model.application.MApplication) StatusReporter(org.eclipse.e4.core.services.statusreporter.StatusReporter) Inject(javax.inject.Inject) Optional(org.eclipse.e4.core.di.annotations.Optional)

Example 2 with KeyBindingDispatcher

use of org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher in project eclipse.platform.ui by eclipse-platform.

the class KeyDispatcherTest method testExecuteOneCommand.

@Test
public void testExecuteOneCommand() {
    KeyBindingDispatcher dispatcher = new KeyBindingDispatcher();
    ContextInjectionFactory.inject(dispatcher, workbenchContext);
    final Listener listener = dispatcher.getKeyDownFilter();
    display.addFilter(SWT.KeyDown, listener);
    display.addFilter(SWT.Traverse, listener);
    assertFalse(handler.q2);
    Shell shell = new Shell(display, SWT.NONE);
    Event event = new Event();
    event.type = SWT.KeyDown;
    event.keyCode = SWT.CTRL;
    shell.notifyListeners(SWT.KeyDown, event);
    event = new Event();
    event.type = SWT.KeyDown;
    event.stateMask = SWT.CTRL;
    event.keyCode = 'A';
    shell.notifyListeners(SWT.KeyDown, event);
    assertTrue(handler.q2);
}
Also used : Shell(org.eclipse.swt.widgets.Shell) Listener(org.eclipse.swt.widgets.Listener) Event(org.eclipse.swt.widgets.Event) KeyBindingDispatcher(org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher) Test(org.junit.Test)

Example 3 with KeyBindingDispatcher

use of org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher in project eclipse.platform.ui by eclipse-platform.

the class KeyDispatcherTest method TODOtestKeyDispatcherReset.

@Test
@Ignore
public void TODOtestKeyDispatcherReset() throws Exception {
    KeyBindingDispatcher dispatcher = new KeyBindingDispatcher();
    ContextInjectionFactory.inject(dispatcher, workbenchContext);
    final Listener listener = dispatcher.getKeyDownFilter();
    display.addFilter(SWT.KeyDown, listener);
    display.addFilter(SWT.Traverse, listener);
    assertFalse(twoStrokeHandler.q2);
    Shell shell = new Shell(display, SWT.NONE);
    Event event = new Event();
    event.type = SWT.KeyDown;
    event.keyCode = SWT.CTRL;
    shell.notifyListeners(SWT.KeyDown, event);
    event = new Event();
    event.type = SWT.KeyDown;
    event.stateMask = SWT.CTRL;
    event.keyCode = '5';
    shell.notifyListeners(SWT.KeyDown, event);
    assertFalse(twoStrokeHandler.q2);
    Thread.sleep(2000L);
    processEvents();
    event = new Event();
    event.type = SWT.KeyDown;
    event.keyCode = SWT.CTRL;
    shell.notifyListeners(SWT.KeyDown, event);
    event = new Event();
    event.type = SWT.KeyDown;
    event.stateMask = SWT.CTRL;
    event.keyCode = 'A';
    shell.notifyListeners(SWT.KeyDown, event);
    processEvents();
    assertFalse(twoStrokeHandler.q2);
    assertTrue(handler.q2);
}
Also used : Shell(org.eclipse.swt.widgets.Shell) Listener(org.eclipse.swt.widgets.Listener) Event(org.eclipse.swt.widgets.Event) KeyBindingDispatcher(org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 4 with KeyBindingDispatcher

use of org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher in project eclipse.platform.ui by eclipse-platform.

the class KeyDispatcherTest method testExecuteMultiStrokeBinding.

@Test
public void testExecuteMultiStrokeBinding() {
    KeyBindingDispatcher dispatcher = new KeyBindingDispatcher();
    ContextInjectionFactory.inject(dispatcher, workbenchContext);
    final Listener listener = dispatcher.getKeyDownFilter();
    display.addFilter(SWT.KeyDown, listener);
    display.addFilter(SWT.Traverse, listener);
    assertFalse(twoStrokeHandler.q2);
    Shell shell = new Shell(display, SWT.NONE);
    Event event = new Event();
    event.type = SWT.KeyDown;
    event.keyCode = SWT.CTRL;
    shell.notifyListeners(SWT.KeyDown, event);
    event = new Event();
    event.type = SWT.KeyDown;
    event.stateMask = SWT.CTRL;
    event.keyCode = '5';
    shell.notifyListeners(SWT.KeyDown, event);
    assertFalse(twoStrokeHandler.q2);
    event = new Event();
    event.type = SWT.KeyDown;
    event.keyCode = SWT.CTRL;
    shell.notifyListeners(SWT.KeyDown, event);
    event = new Event();
    event.type = SWT.KeyDown;
    event.stateMask = SWT.CTRL;
    event.keyCode = 'A';
    shell.notifyListeners(SWT.KeyDown, event);
    processEvents();
    assertTrue(twoStrokeHandler.q2);
    assertFalse(handler.q2);
}
Also used : Shell(org.eclipse.swt.widgets.Shell) Listener(org.eclipse.swt.widgets.Listener) Event(org.eclipse.swt.widgets.Event) KeyBindingDispatcher(org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher) Test(org.junit.Test)

Example 5 with KeyBindingDispatcher

use of org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher in project eclipse.platform.ui by eclipse-platform.

the class KeyDispatcherTest method testSendKeyStroke.

@Test
public void testSendKeyStroke() {
    KeyBindingDispatcher dispatcher = ContextInjectionFactory.make(KeyBindingDispatcher.class, workbenchContext);
    final Listener listener = dispatcher.getKeyDownFilter();
    display.addFilter(SWT.KeyDown, listener);
    display.addFilter(SWT.Traverse, listener);
    Shell shell = new Shell(display, SWT.NONE);
    shell.setLayout(new FillLayout());
    StyledText text = new StyledText(shell, SWT.WRAP | SWT.MULTI);
    shell.setBounds(100, 100, 100, 100);
    shell.layout();
    processEvents();
    assertEquals("", text.getText());
    Event event = new Event();
    event.type = SWT.KeyDown;
    event.stateMask = SWT.SHIFT;
    event.keyCode = '(';
    event.character = '(';
    text.notifyListeners(SWT.KeyDown, event);
    event = new Event();
    event.type = SWT.KeyUp;
    event.stateMask = SWT.SHIFT;
    event.keyCode = '(';
    event.character = '(';
    text.notifyListeners(SWT.KeyUp, event);
    processEvents();
    assertEquals("(", text.getText());
}
Also used : Shell(org.eclipse.swt.widgets.Shell) Listener(org.eclipse.swt.widgets.Listener) StyledText(org.eclipse.swt.custom.StyledText) Event(org.eclipse.swt.widgets.Event) FillLayout(org.eclipse.swt.layout.FillLayout) KeyBindingDispatcher(org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher) Test(org.junit.Test)

Aggregations

KeyBindingDispatcher (org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher)5 Listener (org.eclipse.swt.widgets.Listener)5 Shell (org.eclipse.swt.widgets.Shell)5 Event (org.eclipse.swt.widgets.Event)4 Test (org.junit.Test)4 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 URL (java.net.URL)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 List (java.util.List)1 Map (java.util.Map)1 Entry (java.util.Map.Entry)1 Set (java.util.Set)1 PostConstruct (javax.annotation.PostConstruct)1 Inject (javax.inject.Inject)1 Named (javax.inject.Named)1 Realm (org.eclipse.core.databinding.observable.Realm)1 FileLocator (org.eclipse.core.runtime.FileLocator)1