/** * */ package goko; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang3.StringUtils; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.ProgressProvider; import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.internal.workbench.swt.IEventLoopAdvisor; import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.e4.ui.services.IServiceConstants; import org.eclipse.e4.ui.workbench.IWorkbench; import org.eclipse.e4.ui.workbench.UIEvents; import org.eclipse.e4.ui.workbench.lifecycle.PostContextCreate; import org.eclipse.e4.ui.workbench.modeling.IWindowCloseHandler; import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.wb.swt.ResourceManager; import org.goko.core.common.exception.GkException; import org.goko.core.config.GokoPreference; import org.goko.core.internal.TargetBoardTracker; import org.osgi.service.event.Event; import org.osgi.service.event.EventHandler; import goko.dialog.GokoProgressDialog; import goko.splashscreen.GokoSplashscreen; /** * Life cycle manager * * @author PsyKo * */ public class GokoLifeCycleManager { /** * Post context creation method * @param eventBroker the event broker * @param context the eclipse context * @throws GkException GkException */ @PostContextCreate public void postContextCreate(final IEventBroker eventBroker, final IEclipseContext context, IApplicationContext appContext) throws GkException { final GokoSplashscreen splash = new GokoSplashscreen(); splash.open(); String[] args = (String[]) appContext.getArguments().get(IApplicationContext.APPLICATION_ARGS); enableDevModeIfRequired(args); IWindowCloseHandler closeHandler = new ExitHandlerManager(); context.set(IWindowCloseHandler.class, closeHandler); /* * Performing model update if required */ if(GokoPreference.getInstance().isSystemClearPersistedState()){ GokoPreference.getInstance().setSystemClearPersistedState(false); System.getProperties().put(IWorkbench.CLEAR_PERSISTED_STATE, "true"); } /* ******************************************** */ /* Setting event advisor */ /* ******************************************** */ GokoEventLoopAdvisor advisor = ContextInjectionFactory.make(GokoEventLoopAdvisor.class, context); context.set(IEventLoopAdvisor.class, advisor); final GokoProgressDialog dialog = ContextInjectionFactory.make(GokoProgressDialog.class, context); // Create target board tracker TargetBoardTracker tracker = ContextInjectionFactory.make(TargetBoardTracker.class, context); tracker.checkTargetBoardDefined(context); context.set(TargetBoardTracker.class, tracker); // Create auto update check AutomaticUpdateCheck updater = ContextInjectionFactory.make(AutomaticUpdateCheck.class, context); eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, updater); eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, new EventHandler() { @Override public void handleEvent(Event event) { // Activate progress dialog dialog.open(); dialog.getShell().setVisible(false); Job.getJobManager().setProgressProvider(new ProgressProvider() { @Override public IProgressMonitor createMonitor(Job job) { return dialog.addJob(job); } }); // Close splashscreen splash.close(); } }); } private void enableDevModeIfRequired(String[] args){ GokoPreference.getInstance().setDeveloperMode(false); if(args != null && args.length > 0){ for (String key : args) { if(StringUtils.equals(key, "-goko.devMode=true")){ GokoPreference.getInstance().setDeveloperMode(true); } } } GokoPreference.getInstance().setDevEnvironment(false); if(args != null && args.length > 0){ for (String key : args) { if(StringUtils.equals(key, "-goko.devEnvironment=true")){ GokoPreference.getInstance().setDevEnvironment(true); } } } } /** * Sets the JFace dialog default image to the icon of the main shell * @param shell the active shell */ @Inject @Optional public void updateIcons(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell){ if(shell != null){ Dialog.setDefaultImage(shell.getImage()); } } } class ExitHandlerManager implements IWindowCloseHandler{ @Inject @Optional private MWindow window; /** (inheritDoc) * @see org.eclipse.e4.ui.workbench.modeling.IWindowCloseHandler#close(org.eclipse.e4.ui.model.application.ui.basic.MWindow) */ @Override public boolean close(MWindow window) { // Probably not the best location for this "dispoe".... ResourceManager.dispose(); return true; } }