Search in sources :

Example 1 with StatusReporter

use of org.eclipse.e4.core.services.statusreporter.StatusReporter 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 StatusReporter

use of org.eclipse.e4.core.services.statusreporter.StatusReporter in project eclipse.platform.ui by eclipse-platform.

the class PartRenderingEngineTests method addRuntimeExceptionHandler.

/**
 * Sets a temporary RuntimeException handler, that doesn't show an error dialog
 * when an exception occurs. The handler is reset by calling
 * resetRuntimeExceptionHandler() in the finally block of handler code.
 */
private void addRuntimeExceptionHandler() {
    Display display = Display.getDefault();
    runtimeExceptionHandler = display.getRuntimeExceptionHandler();
    display.setRuntimeExceptionHandler(e -> handle(e, 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.report(statusReporter.newStatus(StatusReporter.ERROR, "Internal Error", exception), StatusReporter.LOG, exception);
            }
        }
    }));
}
Also used : IEventLoopAdvisor(org.eclipse.e4.ui.internal.workbench.swt.IEventLoopAdvisor) Display(org.eclipse.swt.widgets.Display) StatusReporter(org.eclipse.e4.core.services.statusreporter.StatusReporter)

Example 3 with StatusReporter

use of org.eclipse.e4.core.services.statusreporter.StatusReporter in project eclipse.platform.ui by eclipse-platform.

the class ShowInSystemExplorerHandler method execute.

@Override
public Object execute(final ExecutionEvent event) {
    final IResource item = getResource(event);
    if (item == null) {
        return null;
    }
    final StatusReporter statusReporter = HandlerUtil.getActiveWorkbenchWindow(event).getService(StatusReporter.class);
    Job job = Job.create(IDEWorkbenchMessages.ShowInSystemExplorerHandler_jobTitle, monitor -> {
        String logMsgPrefix;
        try {
            // $NON-NLS-1$
            logMsgPrefix = event.getCommand().getName() + ": ";
        } catch (NotDefinedException e1) {
            // will used id instead...
            // $NON-NLS-1$
            logMsgPrefix = event.getCommand().getId() + ": ";
        }
        try {
            File canonicalPath = getSystemExplorerPath(item);
            if (canonicalPath == null) {
                return statusReporter.newStatus(IStatus.ERROR, logMsgPrefix + IDEWorkbenchMessages.ShowInSystemExplorerHandler_notDetermineLocation, null);
            }
            String launchCmd = formShowInSytemExplorerCommand(canonicalPath);
            if ("".equals(launchCmd)) {
                // $NON-NLS-1$
                return statusReporter.newStatus(IStatus.ERROR, logMsgPrefix + IDEWorkbenchMessages.ShowInSystemExplorerHandler_commandUnavailable, null);
            }
            File dir = item.getWorkspace().getRoot().getLocation().toFile();
            Process p;
            if (Util.isLinux() || Util.isMac()) {
                // $NON-NLS-1$ //$NON-NLS-2$
                p = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", launchCmd }, null, dir);
            } else {
                p = Runtime.getRuntime().exec(launchCmd, null, dir);
            }
            int retCode = p.waitFor();
            if (retCode != 0 && !Util.isWindows()) {
                return statusReporter.newStatus(IStatus.ERROR, // $NON-NLS-1$
                "Execution of '" + launchCmd + "' failed with return code: " + retCode, // $NON-NLS-1$
                null);
            }
        } catch (IOException | InterruptedException e2) {
            // $NON-NLS-1$
            return statusReporter.newStatus(IStatus.ERROR, logMsgPrefix + "Unhandled failure.", e2);
        }
        return Status.OK_STATUS;
    });
    job.schedule();
    return null;
}
Also used : NotDefinedException(org.eclipse.core.commands.common.NotDefinedException) IOException(java.io.IOException) Job(org.eclipse.core.runtime.jobs.Job) File(java.io.File) IResource(org.eclipse.core.resources.IResource) StatusReporter(org.eclipse.e4.core.services.statusreporter.StatusReporter)

Aggregations

StatusReporter (org.eclipse.e4.core.services.statusreporter.StatusReporter)3 IOException (java.io.IOException)2 Display (org.eclipse.swt.widgets.Display)2 File (java.io.File)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 NotDefinedException (org.eclipse.core.commands.common.NotDefinedException)1 Realm (org.eclipse.core.databinding.observable.Realm)1 IResource (org.eclipse.core.resources.IResource)1 FileLocator (org.eclipse.core.runtime.FileLocator)1