/* * Carrot2 project. * * Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński. * All rights reserved. * * Refer to the full license file "carrot2.LICENSE" * in the root folder of the repository checkout or at: * http://www.carrot2.org/carrot2.LICENSE */ package org.carrot2.workbench.core; import java.util.Arrays; import java.util.List; import java.util.Stack; import org.carrot2.core.ProcessingComponentDescriptor; import org.carrot2.workbench.core.helpers.Utils; import org.carrot2.workbench.core.ui.actions.DisplayWelcomeView; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.ICoolBarManager; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.preference.IPreferenceNode; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Monitor; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IPerspectiveRegistry; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.application.ActionBarAdvisor; import org.eclipse.ui.application.IActionBarConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchWindowAdvisor; import org.eclipse.ui.views.IViewDescriptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Configures various aspects of the main application's window. */ final class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { private final static Logger logger = LoggerFactory.getLogger(ApplicationWorkbenchWindowAdvisor.class); /* * */ public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { super(configurer); } /* * */ public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) { return new ApplicationActionBarAdvisor(configurer); } /* * */ public void preWindowOpen() { final IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); final Monitor primary = Display.getDefault().getPrimaryMonitor(); /* * Get the bounds of the primary monitor, not its client area. * * Client area on multi-monitor desktops in Linux (Xinerama) spans across all monitors, * but the window manager won't allow the window to take all that space immediately * (at least that's the effect I'm observing on my desktop). * * What's funny is that the window still opens on monitor[0], but is shifted * outside of its bounds (and thus spills to monitor[1]). Seems like getPrimaryMonitor() * is not used when creating the Workbench shell. */ final Rectangle fullScreenSize = primary.getBounds(); int width = calculateInitialSize(fullScreenSize.width, 800); int height = calculateInitialSize(fullScreenSize.height, 600); configurer.setInitialSize(new Point(width, height)); configurer.setShowStatusLine(true); configurer.setShowMenuBar(true); configurer.setShowPerspectiveBar(true); configurer.setShowProgressIndicator(true); configurer.setShowCoolBar(true); } /* * */ @Override public void postWindowCreate() { /* * Log contribution identifiers in case we need to remove them using the * activities API (declarative extension point in plugin.xml). */ logContributionIdentifiers(); // Hack for CARROT-1088 (perspective switcher ignores previous setting of // org.eclipse.ui/PERSPECTIVE_BAR_EXTRAS IWorkbenchWindow window = getWindowConfigurer().getWindow(); IPerspectiveRegistry perspectiveRegistry = window.getWorkbench().getPerspectiveRegistry(); for (String perspectiveId : new String [] { "org.carrot2.workbench.core.perspective.visualization", "org.carrot2.workbench.core.perspective.tuning", "org.carrot2.workbench.core.perspective.search", }) { window.getActivePage().setPerspective( perspectiveRegistry.findPerspectiveWithId(perspectiveId)); } } /** * Log contribution identifiers from various extension points (that we may wish to * hide using the activities API). */ @SuppressWarnings("unchecked") private void logContributionIdentifiers() { final StringBuilder b = new StringBuilder(); /* * Toolbar contributions. */ final ICoolBarManager cm = getWindowConfigurer().getActionBarConfigurer() .getCoolBarManager(); b.append("Toolbar contributions:\n"); for (IContributionItem item : cm.getItems()) { b.append(item.getId() + " (" + item.getClass().getSimpleName() + ")"); b.append("\n"); } logger.debug(b.toString()); b.setLength(0); /* * Menu contributions. */ final Stack<IContributionItem> mms = new Stack<IContributionItem>(); mms.push(getWindowConfigurer().getActionBarConfigurer().getMenuManager()); b.append("Menu contributions:\n"); while (!mms.isEmpty()) { final IContributionItem item = mms.pop(); b.append(item.getId() + " (" + item.getClass().getSimpleName() + ")"); b.append("\n"); if (item instanceof IMenuManager) { IMenuManager mmgr = (IMenuManager) item; mms.addAll(Arrays.asList(mmgr.getItems())); } } logger.debug(b.toString()); b.setLength(0); /* * Preference pages. */ b.append("Preference page contributions:\n"); final PreferenceManager pm = PlatformUI.getWorkbench().getPreferenceManager(); List<?> elements = pm.getElements(PreferenceManager.PRE_ORDER); for (IPreferenceNode pref : (List<IPreferenceNode>) elements) { b.append(pref.getId() + " (" + pref.getLabelText() + ")\n"); } logger.debug(b.toString()); b.setLength(0); /* * Views. */ b.append("View contributions:\n"); for (IViewDescriptor view : getWindowConfigurer().getWorkbenchConfigurer() .getWorkbench().getViewRegistry().getViews()) { b.append(view.getId() + " (" + view.getLabel() + ")"); b.append("\n"); } logger.debug(b.toString()); b.setLength(0); } /* * */ @Override public void postWindowOpen() { super.postWindowOpen(); /* * After the Workbench window is opened we eagerly re-activate editors to * initialize tab icons. */ for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows()) { for (IEditorReference editor : window.getActivePage().getEditorReferences()) { editor.getEditor(true); } } /* * In case of component loading errors, display an error message and open the error log. */ WorkbenchCorePlugin wbCore = WorkbenchCorePlugin.getDefault(); final List<ProcessingComponentDescriptor> failed = wbCore.getFailed(); if (!failed.isEmpty()) { final StringBuilder errorMessages = new StringBuilder(); for (ProcessingComponentDescriptor p : failed) { Throwable t = p.getInitializationFailure(); errorMessages.append(p.getTitle() + ": " + t.getClass().getName()); if (t.getMessage() != null && t.getMessage().length() > 0) errorMessages.append("\n " + t.getMessage()); errorMessages.append("\n\n"); } Utils.showView("org.eclipse.pde.runtime.LogView"); ErrorDialog.openError( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Fatal errors", "Plugin loading errors. See the error log for details.", new Status(Status.ERROR, WorkbenchCorePlugin.PLUGIN_ID, errorMessages.toString())); } /* * Open the welcome view on first execution. */ if (!WorkbenchCorePlugin.getPreferences().getBoolean( DisplayWelcomeView.ALREADY_DISPLAYED, false)) { new DisplayWelcomeView().execute(); } } /** * Calculates specified ratio of fullScreenSize (currently 80%) in such a way, that * result is not smaller than minSize. Calculates one coordinate only. * * @param fullScreenSize size of full screen * @param minSize minimal wanted size * @return initial size for the workbench window */ private int calculateInitialSize(int fullScreenSize, int minSize) { int size; final double ratio = 0.9; if ((int) (fullScreenSize * ratio) >= minSize) { size = (int) (fullScreenSize * ratio); } else { if (fullScreenSize >= minSize) { size = minSize; } else { size = fullScreenSize; } } return size; } }