package org.marketcetera.photon; import java.net.URL; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.*; import org.eclipse.ui.application.IWorkbenchConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchAdvisor; import org.eclipse.ui.application.WorkbenchWindowAdvisor; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.internal.WorkbenchPage; import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.marketcetera.client.ClientInitException; import org.marketcetera.client.ClientManager; import org.marketcetera.photon.ui.EquityPerspectiveFactory; import org.osgi.framework.Bundle; /* $License$ */ /** * Initializes the workbench. * * Note, we are using internal IDE classes because Eclipse has not provided a better way to * initialize things like standard workbench images. See https://bugs.eclipse.org/186891. * * @author gmiller * @author andrei@lissovski.org * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: ApplicationWorkbenchAdvisor.java 16841 2014-02-20 19:59:04Z colin $ * @since 1.0.0 */ @SuppressWarnings("restriction") public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { @Override public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { return new ApplicationWorkbenchWindowAdvisor(configurer); } @Override public String getInitialWindowPerspectiveId() { return EquityPerspectiveFactory.ID; } /** * Creates a new PhotonConsole and adds it to the ConsoleManager * * @see org.eclipse.ui.application.WorkbenchAdvisor#initialize(org.eclipse.ui.application.IWorkbenchConfigurer) */ @Override public void initialize(IWorkbenchConfigurer configurer) { // make sure we always save and restore workspace state configurer.setSaveAndRestore(true); // register workspace adapters IDE.registerAdapters(); // register shared images declareWorkbenchImages(); } @Override public void postStartup() { /* * Hides Editor area when leaving Strategy perspective so editor-related * toolbar items will disappear. */ PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPerspectiveListener( new PerspectiveAdapter() { @Override public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) { IWorkbenchPartReference reference = page.getReference(page.getActiveEditor()); if (reference != null) { if (perspective.getId().equals( "org.marketcetera.photon.StrategyPerspective")) //$NON-NLS-1$ page.setPartState(reference, IWorkbenchPage.STATE_RESTORED); else page.setPartState(reference, IWorkbenchPage.STATE_MINIMIZED); /* * The above code minimizes the editor area, but * sometimes leaves UI artifacts. This seems to work * around it. */ ((WorkbenchPage) page).getActivePerspective().refreshEditorAreaVisibility(); } } }); } @Override public void postShutdown() { stopClient(); try { // todo: Eclipse's IDEWorkbenchAdvisor.disconnectFromWorkspace uses // a progress monitor in a IRunnableWithProgress during the final save. // Is such a thing useful here during shutdown? ResourcesPlugin.getWorkspace().save(true, null); } catch (Exception anyException) { org.marketcetera.photon.PhotonPlugin.getMainConsoleLogger().warn( "Failed to save workspace during workbench shutdown. Cause: " //$NON-NLS-1$ + anyException.getMessage(), anyException); } } private void stopClient() { try { ClientManager.getInstance().close(); } catch (ClientInitException e) { // already closed } } /** * Declares shared images IDE images that Strategy perspective relies on. * <p> * In the context of the IDE, this is done by the * <code>IDEWorkbenchAdvisor.declareWorkbenchImages()</code>. In Photon, however, we have our * own workbench advisor and we must make sure these images are still registered. */ private void declareWorkbenchImages() { final String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$ // Model object icons final String PATH_OBJECT = ICONS_PATH + "obj16/"; //$NON-NLS-1$ // Wizard icons final String PATH_WIZBAN = ICONS_PATH + "wizban/"; //$NON-NLS-1$ Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH); // Used by save as dialog in unititled text editor. declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG, PATH_WIZBAN + "saveas_wiz.png", false); //$NON-NLS-1$ // Used by project explorer/common navigator declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT, PATH_OBJECT + "prj_obj.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT + "cprj_obj.gif", true); //$NON-NLS-1$ // used by RDT in problems view (I think) declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH, PATH_OBJECT + "error_tsk.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH, PATH_OBJECT + "warn_tsk.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH, PATH_OBJECT + "info_tsk.gif", true); //$NON-NLS-1$ } /** * Declares an IDE-specific workbench image. Copied from IDEWorkbenchAdvisor in the * org.eclipse.ui.ide.application plugin. * * @param symbolicName * the symbolic name of the image * @param path * the path of the image file; this path is relative to the base of the IDE plug-in * @param shared * <code>true</code> if this is a shared image, and <code>false</code> if this is not * a shared image * @see IWorkbenchConfigurer#declareImage */ private void declareWorkbenchImage(Bundle ideBundle, String symbolicName, String path, boolean shared) { URL url = FileLocator.find(ideBundle, new Path(path), null); ImageDescriptor desc = ImageDescriptor.createFromURL(url); getWorkbenchConfigurer().declareImage(symbolicName, desc, shared); } @Override public IAdaptable getDefaultPageInput() { IWorkspace workspace = ResourcesPlugin.getWorkspace(); return workspace.getRoot(); } }