Search in sources :

Example 1 with TestableObject

use of org.eclipse.ui.testing.TestableObject 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 TestableObject

use of org.eclipse.ui.testing.TestableObject in project reddeer by eclipse.

the class UITestApplication method start.

/**
 * Starts UI Test application from context.
 *
 * @param context
 *            context to start
 */
public Object start(IApplicationContext context) throws Exception {
    String[] args = (String[]) context.getArguments().get(IApplicationContext.APPLICATION_ARGS);
    Object app = getApplication(args);
    Assert.isNotNull(app, "The application " + getApplicationToRun(args) + " could not be found.");
    Object testableObject = Activator.getDefault().getTestableObject();
    if (testableObject != null) {
        fTestableObject = (TestableObject) testableObject;
    } else {
        try {
            fTestableObject = PlatformUI.getTestableObject();
        } catch (NoClassDefFoundError e) {
        // null check follows
        }
    }
    if (fTestableObject == null) {
        throw new RedDeerException("Could not find testable object");
    }
    fTestableObject.setTestHarness(this);
    if (app instanceof IApplication) {
        fApplication = (IApplication) app;
        return fApplication.start(context);
    }
    throw new IllegalArgumentException("Could not execute application " + getApplicationToRun(args));
}
Also used : RedDeerException(org.eclipse.reddeer.common.exception.RedDeerException) IApplication(org.eclipse.equinox.app.IApplication) TestableObject(org.eclipse.ui.testing.TestableObject)

Example 3 with TestableObject

use of org.eclipse.ui.testing.TestableObject in project eclipse.platform.ui by eclipse-platform.

the class WorkbenchPlugin method getTestableObject.

/**
 * Returns a {@link TestableObject} provided by a TestableObject service or
 * <code>null</code> if a service implementation cannot be found. The
 * TestableObject is used to hook tests into the application lifecycle.
 * <p>
 * It is recommended the testable object is obtained via service over
 * {@link Workbench#getWorkbenchTestable()} to avoid the tests having a
 * dependency on the Workbench.
 * </p>
 *
 * @see PlatformUI#getTestableObject()
 * @return TestableObject provided via service or <code>null</code>
 */
public TestableObject getTestableObject() {
    if (bundleContext == null)
        return null;
    if (testableTracker == null) {
        testableTracker = new ServiceTracker(bundleContext, TestableObject.class.getName(), null);
        testableTracker.open();
    }
    return (TestableObject) testableTracker.getService();
}
Also used : ServiceTracker(org.osgi.util.tracker.ServiceTracker) TestableObject(org.eclipse.ui.testing.TestableObject)

Aggregations

TestableObject (org.eclipse.ui.testing.TestableObject)2 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 IConfigurationElement (org.eclipse.core.runtime.IConfigurationElement)1 IExtensionRegistry (org.eclipse.core.runtime.IExtensionRegistry)1 ISafeRunnable (org.eclipse.core.runtime.ISafeRunnable)1 InvalidRegistryObjectException (org.eclipse.core.runtime.InvalidRegistryObjectException)1