X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=bundles%2Forg.simantics.workbench%2Fsrc%2Forg%2Fsimantics%2Fworkbench%2Finternal%2FSimanticsWorkbenchWindowAdvisor.java;h=a6a802052d7ec9145f8d958ad72581f820cf296a;hb=e640cf916c29ece31c47d99dd6f2a4ec957638f7;hp=78c4928def89229688507f6682712956094c3d6f;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git
diff --git a/bundles/org.simantics.workbench/src/org/simantics/workbench/internal/SimanticsWorkbenchWindowAdvisor.java b/bundles/org.simantics.workbench/src/org/simantics/workbench/internal/SimanticsWorkbenchWindowAdvisor.java
index 78c4928de..a6a802052 100644
--- a/bundles/org.simantics.workbench/src/org/simantics/workbench/internal/SimanticsWorkbenchWindowAdvisor.java
+++ b/bundles/org.simantics.workbench/src/org/simantics/workbench/internal/SimanticsWorkbenchWindowAdvisor.java
@@ -1,870 +1,872 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management
- * in Industry THTH ry.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * VTT Technical Research Centre of Finland - initial API and implementation
- *******************************************************************************/
-package org.simantics.workbench.internal;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartConstants;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PerspectiveAdapter;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
-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.internal.ide.AboutInfo;
-import org.eclipse.ui.internal.ide.EditorAreaDropAdapter;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.dialogs.WelcomeEditorInput;
-import org.eclipse.ui.part.EditorInputTransfer;
-import org.eclipse.ui.part.MarkerTransfer;
-import org.eclipse.ui.part.ResourceTransfer;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.ServiceReference;
-import org.simantics.db.management.ISessionContextChangedListener;
-import org.simantics.db.management.ISessionContextProvider;
-import org.simantics.db.management.SessionContextChangedEvent;
-import org.simantics.ui.SimanticsUI;
-import org.simantics.ui.workbench.WorkbenchShutdownService;
-
-
-/**
- * System properties used to configure how this class works:
- *
- * org.simantics.workbench.application.showProgressIndicator=true|false (default=true)
- Used to initialize IWorkbenchWindowConfigurer.setShowProgressIndicator
- * org.simantics.workbench.application.showFastViewBars=true|false (default=true)
- Used to initialize IWorkbenchWindowConfigurer.setShowFastViewBars
- * org.simantics.workbench.application.showPerspectiveBar=true|false (default=true)
- Used to initialize IWorkbenchWindowConfigurer.setShowPerspectiveBar
- * org.simantics.workbench.application.excludePerspectiveFromTitle=true|false (default=false)
- Used to exclude perspective name in {@link #computeTitle()}
- *
- *
- * @author Tuukka Lehtonen
- */
-public class SimanticsWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
-
- private static final String WELCOME_EDITOR_ID = "org.eclipse.ui.internal.ide.dialogs.WelcomeEditor"; //$NON-NLS-1$
-
- protected SimanticsWorkbenchAdvisor wbAdvisor;
- protected boolean editorsAndIntrosOpened = false;
- protected IEditorPart lastActiveEditor = null;
- protected IPerspectiveDescriptor lastPerspective = null;
-
- protected IWorkbenchPage lastActivePage;
- protected String lastEditorTitle = ""; //$NON-NLS-1$
-
- private final IPropertyListener editorPropertyListener = new IPropertyListener() {
- @Override
- public void propertyChanged(Object source, int propId) {
- if (propId == IWorkbenchPartConstants.PROP_TITLE) {
- if (lastActiveEditor != null) {
- String newTitle = lastActiveEditor.getTitle();
- if (!lastEditorTitle.equals(newTitle)) {
- recomputeTitle();
- }
- }
- }
- }
- };
-
- private IAdaptable lastInput;
- private IWorkbenchAction openPerspectiveAction;
-
- /**
- * The property change listener.
- * @since 3.6.1
- */
- private IPropertyChangeListener propertyChangeListener;
-
- /**
- * Return the style bits for the shortcut bar.
- *
- * @return style bitmask
- */
- protected int perspectiveBarStyle() {
- return SWT.FLAT | SWT.WRAP | SWT.RIGHT | SWT.HORIZONTAL;
- }
-
- /**
- * Crates a new IDE workbench window advisor.
- *
- * @param wbAdvisor the workbench advisor
- * @param configurer the window configurer
- */
- public SimanticsWorkbenchWindowAdvisor(SimanticsWorkbenchAdvisor wbAdvisor, IWorkbenchWindowConfigurer configurer) {
- super(configurer);
- this.wbAdvisor = wbAdvisor;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#createActionBarAdvisor(org.eclipse.ui.application.IActionBarConfigurer)
- */
- @Override
- public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
- return new SimanticsWorkbenchActionBarAdvisor(configurer);
- }
-
- /**
- * Returns the workbench.
- *
- * @return the workbench
- */
- private IWorkbench getWorkbench() {
- return getWindowConfigurer().getWorkbenchConfigurer().getWorkbench();
- }
-
- private volatile boolean allWindowShellsClosed = false;
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.ui.application.WorkbenchAdvisor#preWindowShellClose
- */
- @Override
- public boolean preWindowShellClose() {
- if (getWorkbench().getWorkbenchWindowCount() > 1) {
- return true;
- }
-
- // WORKAROUND for a workbench problem which causes Eclipse to invoke this method twice:
- // Always return false after true has been returned.
- // Eclipse/SWT or something seems to have a bug of some sort that causes it to receive
- // See https://www.simantics.org/redmine/issues/3848.
- if (allWindowShellsClosed)
- return false;
-
- // the user has asked to close the last window, while will cause the
- // workbench to close in due course - prompt the user for confirmation
- IPreferenceStore store = IDEWorkbenchPlugin.getDefault()
- .getPreferenceStore();
- boolean promptOnExit = store
- .getBoolean(IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW);
-
- if (promptOnExit) {
- String message;
-
- String productName = null;
- IProduct product = Platform.getProduct();
- if (product != null) {
- productName = product.getName();
- }
- if (productName == null) {
- message = IDEWorkbenchMessages.PromptOnExitDialog_message0;
- } else {
- message = NLS.bind(IDEWorkbenchMessages.PromptOnExitDialog_message1, productName);
- }
-
- MessageDialogWithToggle dlg = MessageDialogWithToggle
- .openOkCancelConfirm(getWindowConfigurer().getWindow()
- .getShell(), IDEWorkbenchMessages.PromptOnExitDialog_shellTitle,
- message, IDEWorkbenchMessages.PromptOnExitDialog_choice,
- false, null, null);
- if (dlg.getReturnCode() != IDialogConstants.OK_ID) {
- return false;
- }
- if (dlg.getToggleState()) {
- store
- .setValue(
- IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW,
- false);
- IDEWorkbenchPlugin.getDefault().savePluginPreferences();
- }
- }
-
- // Make sure that it's OK to close even if there are unsaved changes.
- AtomicBoolean saveAtExit = new AtomicBoolean(false);
- if (!ApplicationUtil.allowShutdown(saveAtExit))
- return false;
- wbAdvisor.setSaveAtExit(saveAtExit.get());
-
- BundleContext context = Activator.getDefault().getBundle().getBundleContext();
- ServiceReference> ref = context.getServiceReference(WorkbenchShutdownService.class.getName());
- WorkbenchShutdownService shutdown = (WorkbenchShutdownService)context.getService(ref);
- shutdown.doShutdown();
- context.ungetService(ref);
-
- allWindowShellsClosed = true;
-
- return true;
- }
-
- /**
- * Asks the user whether the workbench should really be closed. Only asks if
- * the preference is enabled.
- *
- * @param parentShell
- * the parent shell to use for the confirmation dialog
- * @return true
if OK to exit, false
if the user
- * canceled
- * @since 3.6
- */
- static boolean promptOnExit(Shell parentShell) {
- IPreferenceStore store = IDEWorkbenchPlugin.getDefault()
- .getPreferenceStore();
- boolean promptOnExit = store
- .getBoolean(IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW);
-
- if (promptOnExit) {
- if (parentShell == null) {
- IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
- if (workbenchWindow != null) {
- parentShell = workbenchWindow.getShell();
- }
- }
- if (parentShell != null) {
- parentShell.setMinimized(false);
- parentShell.forceActive();
- }
-
- String message;
-
- String productName = null;
- IProduct product = Platform.getProduct();
- if (product != null) {
- productName = product.getName();
- }
- if (productName == null) {
- message = IDEWorkbenchMessages.PromptOnExitDialog_message0;
- } else {
- message = NLS.bind(
- IDEWorkbenchMessages.PromptOnExitDialog_message1,
- productName);
- }
-
- MessageDialogWithToggle dlg = MessageDialogWithToggle
- .openOkCancelConfirm(parentShell,
- IDEWorkbenchMessages.PromptOnExitDialog_shellTitle,
- message,
- IDEWorkbenchMessages.PromptOnExitDialog_choice,
- false, null, null);
- if (dlg.getReturnCode() != IDialogConstants.OK_ID) {
- return false;
- }
- if (dlg.getToggleState()) {
- store
- .setValue(
- IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW,
- false);
- IDEWorkbenchPlugin.getDefault().savePluginPreferences();
- }
- }
-
- return true;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.application.WorkbenchAdvisor#preWindowOpen
- */
- @Override
- public void preWindowOpen() {
- IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-
- boolean showProgressIndicator = !"false".equals(System.getProperty("org.simantics.workbench.application.showProgressIndicator", "true").toLowerCase());
- boolean showPerspectiveBar = !"false".equals(System.getProperty("org.simantics.workbench.application.showPerspectiveBar", "true").toLowerCase());
-
- // show the shortcut bar and progress indicator, which are hidden by default
- configurer.setShowProgressIndicator(showProgressIndicator);
- configurer.setShowPerspectiveBar(showPerspectiveBar);
-
- // add the drag and drop support for the editor area
- configurer.addEditorAreaTransfer(EditorInputTransfer.getInstance());
- configurer.addEditorAreaTransfer(ResourceTransfer.getInstance());
- configurer.addEditorAreaTransfer(FileTransfer.getInstance());
- configurer.addEditorAreaTransfer(MarkerTransfer.getInstance());
- configurer.configureEditorAreaDropListener(new EditorAreaDropAdapter(
- configurer.getWindow()));
-
- hookTitleUpdateListeners(configurer);
- }
-
- /**
- * Hooks the listeners needed on the window
- * @param configurer
- */
- private void hookTitleUpdateListeners(IWorkbenchWindowConfigurer configurer) {
- // hook up the listeners to update the window title
- configurer.getWindow().addPageListener(new IPageListener() {
- @Override
- public void pageActivated(IWorkbenchPage page) {
- updateTitle(false);
- }
-
- @Override
- public void pageClosed(IWorkbenchPage page) {
- updateTitle(false);
- }
-
- @Override
- public void pageOpened(IWorkbenchPage page) {
- // do nothing
- }
- });
- configurer.getWindow().addPerspectiveListener(
- new PerspectiveAdapter() {
- @Override
- public void perspectiveActivated(IWorkbenchPage page,
- IPerspectiveDescriptor perspective) {
- updateTitle(false);
- }
- @Override
- public void perspectiveSavedAs(IWorkbenchPage page,IPerspectiveDescriptor oldPerspective,IPerspectiveDescriptor newPerspective){
- updateTitle(false);
- }
- @Override
- public void perspectiveDeactivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
- updateTitle(false);
- }
- });
- configurer.getWindow().getPartService().addPartListener(
- new IPartListener2() {
- @Override
- public void partActivated(IWorkbenchPartReference ref) {
- if (ref instanceof IEditorReference) {
- updateTitle(false);
- }
- }
-
- @Override
- public void partBroughtToTop(IWorkbenchPartReference ref) {
- if (ref instanceof IEditorReference) {
- updateTitle(false);
- }
- }
-
- @Override
- public void partClosed(IWorkbenchPartReference ref) {
- updateTitle(false);
- }
-
- @Override
- public void partDeactivated(IWorkbenchPartReference ref) {
- // do nothing
- }
-
- @Override
- public void partOpened(IWorkbenchPartReference ref) {
- // do nothing
- }
-
- @Override
- public void partHidden(IWorkbenchPartReference ref) {
- if (ref.getPart(false) == lastActiveEditor
- && lastActiveEditor != null) {
- updateTitle(true);
- }
- }
-
- @Override
- public void partVisible(IWorkbenchPartReference ref) {
- if (ref.getPart(false) == lastActiveEditor
- && lastActiveEditor != null) {
- updateTitle(false);
- }
- }
-
- @Override
- public void partInputChanged(IWorkbenchPartReference ref) {
- // do nothing
- }
- });
-
- // Update the title when the active UI database session is changed.
- ISessionContextProvider provider = SimanticsUI.getSessionContextProvider(configurer.getWindow());
- provider.addContextChangedListener(new ISessionContextChangedListener() {
- @Override
- public void sessionContextChanged(SessionContextChangedEvent event) {
- IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
- IWorkbenchWindow window = configurer.getWindow();
- if (window == null)
- return;
- Shell shell = window.getShell();
- if (shell == null || shell.isDisposed())
- return;
- shell.getDisplay().asyncExec(new Runnable() {
- @Override
- public void run() {
- updateTitle(true);
- }
- });
- }
- });
-
- // Listen for changes of the workspace name.
- propertyChangeListener = new IPropertyChangeListener() {
- public void propertyChange(PropertyChangeEvent event) {
- String property = event.getProperty();
- if (IDEInternalPreferences.WORKSPACE_NAME.equals(property)
- || IDEInternalPreferences.SHOW_LOCATION.equals(property)) {
- // Make sure the title is actually updated by
- // setting last active page.
- lastActivePage = null;
- updateTitle(false);
- }
- }
- };
- IDEWorkbenchPlugin.getDefault().getPreferenceStore()
- .addPropertyChangeListener(propertyChangeListener);
- }
-
- protected String computeTitle() {
- IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
- IWorkbenchPage currentPage = configurer.getWindow().getActivePage();
- IEditorPart activeEditor = null;
- if (currentPage != null) {
- activeEditor = lastActiveEditor;
- }
-
- String title = null;
- IProduct product = Platform.getProduct();
- if (product != null) {
- title = product.getName();
- }
- if (title == null) {
- title = ""; //$NON-NLS-1$
- }
-
-// ISessionContext ctx = SimanticsUI.getSessionContext(configurer.getWindow());
-// if (ctx != null) {
-// ServerAddress addr = ctx.getAddress();
-// if (addr != null) {
-// title += " - Connected to " + addr.getAddress().getHostName();//InetAddressUtils.toHostString(addr);
-// }
-// Session session = ctx.getSession();
-// if (session != null) {
-// SessionUserSupport sessionUser = session.getService(SessionUserSupport.class);
-// final Resource user = sessionUser.getUser();
-// if (user != null) {
-// String userName;
-// try {
-// userName = session.syncRequest(new Read() {
-// @Override
-// public String perform(ReadGraph graph) throws DatabaseException {
-// try {
-// return graph.adapt(user, String.class);
-// } catch (AdaptionException e) {
-// return NameUtils.getSafeName(graph, user);
-// }
-// }
-// });
-// } catch (DatabaseException e) {
-// e.printStackTrace();
-// userName = "ERROR";
-// }
-//
-// title += " - " + userName;
-// }
-// }
-//
-// } else {
-// //title += " - Disconnected";
-// }
-
- if (currentPage != null) {
- if (activeEditor != null) {
- lastEditorTitle = activeEditor.getTitleToolTip();
- title = NLS.bind(IDEWorkbenchMessages.WorkbenchWindow_shellTitle, lastEditorTitle, title);
- }
-
- boolean excludePerspectiveFromTitle = "true".equals(System.getProperty("org.simantics.workbench.application.excludePerspectiveFromTitle", "false").toLowerCase());
- if (!excludePerspectiveFromTitle) {
- IPerspectiveDescriptor persp = currentPage.getPerspective();
- String label = ""; //$NON-NLS-1$
- if (persp != null) {
- label = persp.getLabel();
- }
- IAdaptable input = currentPage.getInput();
- if (input != null && !input.equals(wbAdvisor.getDefaultPageInput())) {
- label = currentPage.getLabel();
- }
- if (label != null && !label.equals("")) { //$NON-NLS-1$
- title = NLS.bind(IDEWorkbenchMessages.WorkbenchWindow_shellTitle, label, title);
- }
- }
- }
-
- String workspaceLocation = wbAdvisor.getWorkspaceLocation();
- if (workspaceLocation != null) {
- title = NLS.bind(IDEWorkbenchMessages.WorkbenchWindow_shellTitle, title, workspaceLocation);
- }
-
- // Bug 284447: Prepend workspace name to the title
- String workspaceName = IDEWorkbenchPlugin.getDefault()
- .getPreferenceStore().getString(
- IDEInternalPreferences.WORKSPACE_NAME);
- if (workspaceName != null && workspaceName.length() > 0) {
- title = NLS.bind(IDEWorkbenchMessages.WorkbenchWindow_shellTitle,
- workspaceName, title);
- }
-
- return title;
- }
-
- private void recomputeTitle() {
- IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
- String oldTitle = configurer.getTitle();
- String newTitle = computeTitle();
- if (!newTitle.equals(oldTitle)) {
- configurer.setTitle(newTitle);
- }
- }
-
- /**
- * Updates the window title. Format will be:
- * [pageInput -] [currentPerspective -] [editorInput -] [workspaceLocation -] productName
- */
- private void updateTitle(boolean force) {
- IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
- IWorkbenchWindow window = configurer.getWindow();
- IEditorPart activeEditor = null;
- IWorkbenchPage currentPage = window.getActivePage();
- IPerspectiveDescriptor persp = null;
- IAdaptable input = null;
-
- if (currentPage != null) {
- activeEditor = currentPage.getActiveEditor();
- persp = currentPage.getPerspective();
- input = currentPage.getInput();
- }
-
- // Nothing to do if the editor hasn't changed or change is not forced.
- if (!force && activeEditor == lastActiveEditor && currentPage == lastActivePage
- && persp == lastPerspective && input == lastInput) {
- return;
- }
-
- if (lastActiveEditor != null) {
- lastActiveEditor.removePropertyListener(editorPropertyListener );
- }
-
- lastActiveEditor = activeEditor;
- lastActivePage = currentPage;
- lastPerspective = persp;
- lastInput = input;
-
- if (activeEditor != null) {
- activeEditor.addPropertyListener(editorPropertyListener);
- }
-
- recomputeTitle();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.application.WorkbenchAdvisor#postWindowRestore
- */
- @Override
- public void postWindowRestore()
- throws WorkbenchException {
- IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
- IWorkbenchWindow window = configurer.getWindow();
-
- int index = getWorkbench().getWorkbenchWindowCount() - 1;
-
- AboutInfo[] welcomePerspectiveInfos = wbAdvisor.getWelcomePerspectiveInfos();
- if (index >= 0 && welcomePerspectiveInfos != null
- && index < welcomePerspectiveInfos.length) {
- // find a page that exist in the window
- IWorkbenchPage page = window.getActivePage();
- if (page == null) {
- IWorkbenchPage[] pages = window.getPages();
- if (pages != null && pages.length > 0) {
- page = pages[0];
- }
- }
-
- // if the window does not contain a page, create one
- String perspectiveId = welcomePerspectiveInfos[index].getWelcomePerspectiveId();
- if (page == null) {
- IAdaptable root = wbAdvisor.getDefaultPageInput();
- page = window.openPage(perspectiveId, root);
- } else {
- IPerspectiveRegistry reg = getWorkbench()
- .getPerspectiveRegistry();
- IPerspectiveDescriptor desc = reg
- .findPerspectiveWithId(perspectiveId);
- if (desc != null) {
- page.setPerspective(desc);
- }
- }
-
- // set the active page and open the welcome editor
- window.setActivePage(page);
- page.openEditor(new WelcomeEditorInput(
- welcomePerspectiveInfos[index]), WELCOME_EDITOR_ID, true);
- }
- }
-
- /**
- * Tries to open the intro, if one exists and otherwise will open the legacy
- * Welcome pages.
- *
- * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#openIntro()
- */
- @Override
- public void openIntro() {
- if (editorsAndIntrosOpened ) {
- return;
- }
-
- editorsAndIntrosOpened = true;
-
- // don't try to open the welcome editors if there is an intro
- if (wbAdvisor.hasIntro()) {
- super.openIntro();
- } else {
- openWelcomeEditors(getWindowConfigurer().getWindow());
- // save any preferences changes caused by the above actions
- IDEWorkbenchPlugin.getDefault().savePluginPreferences();
- }
- }
-
- /*
- * Open the welcome editor for the primary feature and for any newly
- * installed features.
- */
- private void openWelcomeEditors(IWorkbenchWindow window) {
- if (IDEWorkbenchPlugin.getDefault().getPreferenceStore().getBoolean(
- IDEInternalPreferences.WELCOME_DIALOG)) {
- // show the welcome page for the product the first time the
- // workbench opens
- IProduct product = Platform.getProduct();
- if (product == null) {
- return;
- }
-
- AboutInfo productInfo = new AboutInfo(product);
- URL url = productInfo.getWelcomePageURL();
- if (url == null) {
- return;
- }
-
- IDEWorkbenchPlugin.getDefault().getPreferenceStore().setValue(
- IDEInternalPreferences.WELCOME_DIALOG, false);
- openWelcomeEditor(window, new WelcomeEditorInput(productInfo), null);
- } else {
- // Show the welcome page for any newly installed features
- List welcomeFeatures = new ArrayList();
- for (Iterator> it = wbAdvisor.getNewlyAddedBundleGroups().entrySet()
- .iterator(); it.hasNext();) {
- Map.Entry,?> entry = (Map.Entry,?>) it.next();
- AboutInfo info = (AboutInfo) entry.getValue();
-
- if (info != null && info.getWelcomePageURL() != null) {
- welcomeFeatures.add(info);
- // activate the feature plug-in so it can run some install
- // code
- String pi = info.getBrandingBundleId();
- if (pi != null) {
- // Start the bundle if there is one
- Bundle bundle = Platform.getBundle(pi);
- if (bundle != null) {
- try {
- bundle.start(Bundle.START_TRANSIENT);
- } catch (BundleException exception) {
- StatusManager
- .getManager()
- .handle(
- new Status(
- IStatus.ERROR,
- Activator.PLUGIN_ID,
- "Failed to load feature", exception));//$NON-NLS-1$
- }
- }
- }
- }
- }
-
- int wCount = getWorkbench().getWorkbenchWindowCount();
- for (int i = 0; i < welcomeFeatures.size(); i++) {
- AboutInfo newInfo = (AboutInfo) welcomeFeatures.get(i);
- String id = newInfo.getWelcomePerspectiveId();
- // Other editors were already opened in postWindowRestore(..)
- if (id == null || i >= wCount) {
- openWelcomeEditor(window, new WelcomeEditorInput(newInfo),
- id);
- }
- }
- }
- }
-
- /**
- * Open a welcome editor for the given input
- */
- private void openWelcomeEditor(IWorkbenchWindow window,
- WelcomeEditorInput input, String perspectiveId) {
- if (getWorkbench().getWorkbenchWindowCount() == 0) {
- // Something is wrong, there should be at least
- // one workbench window open by now.
- return;
- }
-
- IWorkbenchWindow win = window;
- if (perspectiveId != null) {
- try {
- win = getWorkbench().openWorkbenchWindow(perspectiveId,
- wbAdvisor.getDefaultPageInput());
- if (win == null) {
- win = window;
- }
- } catch (WorkbenchException e) {
- IDEWorkbenchPlugin
- .log(
- "Error opening window with welcome perspective.", e.getStatus()); //$NON-NLS-1$
- return;
- }
- }
-
- if (win == null) {
- win = getWorkbench().getWorkbenchWindows()[0];
- }
-
- IWorkbenchPage page = win.getActivePage();
- String id = perspectiveId;
- if (id == null) {
- id = getWorkbench().getPerspectiveRegistry()
- .getDefaultPerspective();
- }
-
- if (page == null) {
- try {
- page = win.openPage(id, wbAdvisor.getDefaultPageInput());
- } catch (WorkbenchException e) {
- ErrorDialog.openError(win.getShell(),
- IDEWorkbenchMessages.Problems_Opening_Page, e
- .getMessage(), e.getStatus());
- }
- }
- if (page == null) {
- return;
- }
-
- if (page.getPerspective() == null) {
- try {
- page = getWorkbench().showPerspective(id, win);
- } catch (WorkbenchException e) {
- ErrorDialog
- .openError(
- win.getShell(),
- IDEWorkbenchMessages.Workbench_openEditorErrorDialogTitle,
- IDEWorkbenchMessages.Workbench_openEditorErrorDialogMessage,
- e.getStatus());
- return;
- }
- }
-
- page.setEditorAreaVisible(true);
-
- // see if we already have an editor
- IEditorPart editor = page.findEditor(input);
- if (editor != null) {
- page.activate(editor);
- return;
- }
-
- try {
- page.openEditor(input, WELCOME_EDITOR_ID);
- } catch (PartInitException e) {
- ErrorDialog
- .openError(
- win.getShell(),
- IDEWorkbenchMessages.Workbench_openEditorErrorDialogTitle,
- IDEWorkbenchMessages.Workbench_openEditorErrorDialogMessage,
- e.getStatus());
- }
- return;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.application.WorkbenchAdvisor#createEmptyWindowContents(org.eclipse.ui.application.IWorkbenchWindowConfigurer, org.eclipse.swt.widgets.Composite)
- */
- @Override
- public Control createEmptyWindowContents(Composite parent) {
- final IWorkbenchWindow window = getWindowConfigurer().getWindow();
- Composite composite = new Composite(parent, SWT.NONE);
- composite.setLayout(new GridLayout(2, false));
- Display display = composite.getDisplay();
- Color bgCol = display.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND);
- composite.setBackground(bgCol);
- Label label = new Label(composite, SWT.WRAP);
- label.setForeground(display.getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND));
- label.setBackground(bgCol);
- label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
- String msg = IDEWorkbenchMessages.IDEWorkbenchAdvisor_noPerspective;
- label.setText(msg);
- ToolBarManager toolBarManager = new ToolBarManager();
- openPerspectiveAction = ActionFactory.OPEN_PERSPECTIVE_DIALOG.create(window);
- toolBarManager.add(openPerspectiveAction);
- ToolBar toolBar = toolBarManager.createControl(composite);
- toolBar.setBackground(bgCol);
- return composite;
- }
-
- @Override
- public void dispose() {
- if (propertyChangeListener != null) {
- IDEWorkbenchPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(propertyChangeListener);
- propertyChangeListener = null;
- }
-
- if (openPerspectiveAction!=null) {
- openPerspectiveAction.dispose();
- openPerspectiveAction = null;
- }
- super.dispose();
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.workbench.internal;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProduct;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IPageListener;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IPerspectiveRegistry;
+import org.eclipse.ui.IPropertyListener;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPartConstants;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PerspectiveAdapter;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.WorkbenchException;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
+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.internal.ide.AboutInfo;
+import org.eclipse.ui.internal.ide.EditorAreaDropAdapter;
+import org.eclipse.ui.internal.ide.IDEInternalPreferences;
+import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
+import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
+import org.eclipse.ui.internal.ide.dialogs.WelcomeEditorInput;
+import org.eclipse.ui.part.EditorInputTransfer;
+import org.eclipse.ui.part.MarkerTransfer;
+import org.eclipse.ui.part.ResourceTransfer;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+import org.simantics.db.management.ISessionContextChangedListener;
+import org.simantics.db.management.ISessionContextProvider;
+import org.simantics.db.management.SessionContextChangedEvent;
+import org.simantics.ui.SimanticsUI;
+import org.simantics.ui.workbench.WorkbenchShutdownService;
+
+
+/**
+ * System properties used to configure how this class works:
+ *
+ * org.simantics.workbench.application.showProgressIndicator=true|false (default=true)
- Used to initialize IWorkbenchWindowConfigurer.setShowProgressIndicator
+ * org.simantics.workbench.application.showFastViewBars=true|false (default=true)
- Used to initialize IWorkbenchWindowConfigurer.setShowFastViewBars
+ * org.simantics.workbench.application.showPerspectiveBar=true|false (default=true)
- Used to initialize IWorkbenchWindowConfigurer.setShowPerspectiveBar
+ * org.simantics.workbench.application.excludePerspectiveFromTitle=true|false (default=false)
- Used to exclude perspective name in {@link #computeTitle()}
+ *
+ *
+ * @author Tuukka Lehtonen
+ */
+public class SimanticsWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
+
+ private static final String WELCOME_EDITOR_ID = "org.eclipse.ui.internal.ide.dialogs.WelcomeEditor"; //$NON-NLS-1$
+
+ protected SimanticsWorkbenchAdvisor wbAdvisor;
+ protected boolean editorsAndIntrosOpened = false;
+ protected IEditorPart lastActiveEditor = null;
+ protected IPerspectiveDescriptor lastPerspective = null;
+
+ protected IWorkbenchPage lastActivePage;
+ protected String lastEditorTitle = ""; //$NON-NLS-1$
+
+ private final IPropertyListener editorPropertyListener = new IPropertyListener() {
+ @Override
+ public void propertyChanged(Object source, int propId) {
+ if (propId == IWorkbenchPartConstants.PROP_TITLE) {
+ if (lastActiveEditor != null) {
+ String newTitle = lastActiveEditor.getTitle();
+ if (!lastEditorTitle.equals(newTitle)) {
+ recomputeTitle();
+ }
+ }
+ }
+ }
+ };
+
+ private IAdaptable lastInput;
+ private IWorkbenchAction openPerspectiveAction;
+
+ /**
+ * The property change listener.
+ * @since 3.6.1
+ */
+ private IPropertyChangeListener propertyChangeListener;
+
+ /**
+ * Return the style bits for the shortcut bar.
+ *
+ * @return style bitmask
+ */
+ protected int perspectiveBarStyle() {
+ return SWT.FLAT | SWT.WRAP | SWT.RIGHT | SWT.HORIZONTAL;
+ }
+
+ /**
+ * Crates a new IDE workbench window advisor.
+ *
+ * @param wbAdvisor the workbench advisor
+ * @param configurer the window configurer
+ */
+ public SimanticsWorkbenchWindowAdvisor(SimanticsWorkbenchAdvisor wbAdvisor, IWorkbenchWindowConfigurer configurer) {
+ super(configurer);
+ this.wbAdvisor = wbAdvisor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#createActionBarAdvisor(org.eclipse.ui.application.IActionBarConfigurer)
+ */
+ @Override
+ public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
+ return new SimanticsWorkbenchActionBarAdvisor(configurer);
+ }
+
+ /**
+ * Returns the workbench.
+ *
+ * @return the workbench
+ */
+ private IWorkbench getWorkbench() {
+ return getWindowConfigurer().getWorkbenchConfigurer().getWorkbench();
+ }
+
+ private volatile boolean allWindowShellsClosed = false;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.application.WorkbenchAdvisor#preWindowShellClose
+ */
+ @Override
+ public boolean preWindowShellClose() {
+ if (getWorkbench().getWorkbenchWindowCount() > 1) {
+ return true;
+ }
+
+ // WORKAROUND for a workbench problem which causes Eclipse to invoke this method twice:
+ // Always return false after true has been returned.
+ // Eclipse/SWT or something seems to have a bug of some sort that causes it to receive
+ // See https://www.simantics.org/redmine/issues/3848.
+ if (allWindowShellsClosed)
+ return false;
+
+ // the user has asked to close the last window, while will cause the
+ // workbench to close in due course - prompt the user for confirmation
+ IPreferenceStore store = IDEWorkbenchPlugin.getDefault()
+ .getPreferenceStore();
+ boolean promptOnExit = store
+ .getBoolean(IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW);
+
+ if (promptOnExit) {
+ String message;
+
+ String productName = null;
+ IProduct product = Platform.getProduct();
+ if (product != null) {
+ productName = product.getName();
+ }
+ if (productName == null) {
+ message = IDEWorkbenchMessages.PromptOnExitDialog_message0;
+ } else {
+ message = NLS.bind(IDEWorkbenchMessages.PromptOnExitDialog_message1, productName);
+ }
+
+ MessageDialogWithToggle dlg = MessageDialogWithToggle
+ .openOkCancelConfirm(getWindowConfigurer().getWindow()
+ .getShell(), IDEWorkbenchMessages.PromptOnExitDialog_shellTitle,
+ message, IDEWorkbenchMessages.PromptOnExitDialog_choice,
+ false, null, null);
+ if (dlg.getReturnCode() != IDialogConstants.OK_ID) {
+ return false;
+ }
+ if (dlg.getToggleState()) {
+ store
+ .setValue(
+ IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW,
+ false);
+ IDEWorkbenchPlugin.getDefault().savePluginPreferences();
+ }
+ }
+
+ // Make sure that it's OK to close even if there are unsaved changes.
+ AtomicBoolean saveAtExit = new AtomicBoolean(false);
+ if (!ApplicationUtil.allowShutdown(saveAtExit))
+ return false;
+ wbAdvisor.setSaveAtExit(saveAtExit.get());
+
+ BundleContext context = Activator.getDefault().getBundle().getBundleContext();
+ ServiceReference> ref = context.getServiceReference(WorkbenchShutdownService.class.getName());
+ WorkbenchShutdownService shutdown = (WorkbenchShutdownService)context.getService(ref);
+ shutdown.doShutdown();
+ context.ungetService(ref);
+
+ allWindowShellsClosed = true;
+
+ return true;
+ }
+
+ /**
+ * Asks the user whether the workbench should really be closed. Only asks if
+ * the preference is enabled.
+ *
+ * @param parentShell
+ * the parent shell to use for the confirmation dialog
+ * @return true
if OK to exit, false
if the user
+ * canceled
+ * @since 3.6
+ */
+ static boolean promptOnExit(Shell parentShell) {
+ IPreferenceStore store = IDEWorkbenchPlugin.getDefault()
+ .getPreferenceStore();
+ boolean promptOnExit = store
+ .getBoolean(IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW);
+
+ if (promptOnExit) {
+ if (parentShell == null) {
+ IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (workbenchWindow != null) {
+ parentShell = workbenchWindow.getShell();
+ }
+ }
+ if (parentShell != null) {
+ parentShell.setMinimized(false);
+ parentShell.forceActive();
+ }
+
+ String message;
+
+ String productName = null;
+ IProduct product = Platform.getProduct();
+ if (product != null) {
+ productName = product.getName();
+ }
+ if (productName == null) {
+ message = IDEWorkbenchMessages.PromptOnExitDialog_message0;
+ } else {
+ message = NLS.bind(
+ IDEWorkbenchMessages.PromptOnExitDialog_message1,
+ productName);
+ }
+
+ MessageDialogWithToggle dlg = MessageDialogWithToggle
+ .openOkCancelConfirm(parentShell,
+ IDEWorkbenchMessages.PromptOnExitDialog_shellTitle,
+ message,
+ IDEWorkbenchMessages.PromptOnExitDialog_choice,
+ false, null, null);
+ if (dlg.getReturnCode() != IDialogConstants.OK_ID) {
+ return false;
+ }
+ if (dlg.getToggleState()) {
+ store
+ .setValue(
+ IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW,
+ false);
+ IDEWorkbenchPlugin.getDefault().savePluginPreferences();
+ }
+ }
+
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.application.WorkbenchAdvisor#preWindowOpen
+ */
+ @Override
+ public void preWindowOpen() {
+ IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+
+ boolean showProgressIndicator = !"false".equals(System.getProperty("org.simantics.workbench.application.showProgressIndicator", "true").toLowerCase());
+ boolean showPerspectiveBar = !"false".equals(System.getProperty("org.simantics.workbench.application.showPerspectiveBar", "true").toLowerCase());
+
+ // show the shortcut bar and progress indicator, which are hidden by default
+ configurer.setShowProgressIndicator(showProgressIndicator);
+ configurer.setShowPerspectiveBar(showPerspectiveBar);
+
+ // add the drag and drop support for the editor area
+ configurer.addEditorAreaTransfer(EditorInputTransfer.getInstance());
+ configurer.addEditorAreaTransfer(ResourceTransfer.getInstance());
+ configurer.addEditorAreaTransfer(FileTransfer.getInstance());
+ configurer.addEditorAreaTransfer(MarkerTransfer.getInstance());
+ configurer.configureEditorAreaDropListener(new EditorAreaDropAdapter(
+ configurer.getWindow()));
+
+ hookTitleUpdateListeners(configurer);
+ }
+
+ /**
+ * Hooks the listeners needed on the window
+ * @param configurer
+ */
+ private void hookTitleUpdateListeners(IWorkbenchWindowConfigurer configurer) {
+ // hook up the listeners to update the window title
+ configurer.getWindow().addPageListener(new IPageListener() {
+ @Override
+ public void pageActivated(IWorkbenchPage page) {
+ updateTitle(false);
+ }
+
+ @Override
+ public void pageClosed(IWorkbenchPage page) {
+ updateTitle(false);
+ }
+
+ @Override
+ public void pageOpened(IWorkbenchPage page) {
+ // do nothing
+ }
+ });
+ configurer.getWindow().addPerspectiveListener(
+ new PerspectiveAdapter() {
+ @Override
+ public void perspectiveActivated(IWorkbenchPage page,
+ IPerspectiveDescriptor perspective) {
+ updateTitle(false);
+ }
+ @Override
+ public void perspectiveSavedAs(IWorkbenchPage page,IPerspectiveDescriptor oldPerspective,IPerspectiveDescriptor newPerspective){
+ updateTitle(false);
+ }
+ @Override
+ public void perspectiveDeactivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ updateTitle(false);
+ }
+ });
+ configurer.getWindow().getPartService().addPartListener(
+ new IPartListener2() {
+ @Override
+ public void partActivated(IWorkbenchPartReference ref) {
+ if (ref instanceof IEditorReference) {
+ updateTitle(false);
+ }
+ }
+
+ @Override
+ public void partBroughtToTop(IWorkbenchPartReference ref) {
+ if (ref instanceof IEditorReference) {
+ updateTitle(false);
+ }
+ }
+
+ @Override
+ public void partClosed(IWorkbenchPartReference ref) {
+ updateTitle(false);
+ }
+
+ @Override
+ public void partDeactivated(IWorkbenchPartReference ref) {
+ // do nothing
+ }
+
+ @Override
+ public void partOpened(IWorkbenchPartReference ref) {
+ // do nothing
+ }
+
+ @Override
+ public void partHidden(IWorkbenchPartReference ref) {
+ if (ref.getPart(false) == lastActiveEditor
+ && lastActiveEditor != null) {
+ updateTitle(true);
+ }
+ }
+
+ @Override
+ public void partVisible(IWorkbenchPartReference ref) {
+ if (ref.getPart(false) == lastActiveEditor
+ && lastActiveEditor != null) {
+ updateTitle(false);
+ }
+ }
+
+ @Override
+ public void partInputChanged(IWorkbenchPartReference ref) {
+ // do nothing
+ }
+ });
+
+ // Update the title when the active UI database session is changed.
+ ISessionContextProvider provider = SimanticsUI.getSessionContextProvider(configurer.getWindow());
+ provider.addContextChangedListener(new ISessionContextChangedListener() {
+ @Override
+ public void sessionContextChanged(SessionContextChangedEvent event) {
+ IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+ IWorkbenchWindow window = configurer.getWindow();
+ if (window == null)
+ return;
+ Shell shell = window.getShell();
+ if (shell == null || shell.isDisposed())
+ return;
+ shell.getDisplay().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ updateTitle(true);
+ }
+ });
+ }
+ });
+
+ // Listen for changes of the workspace name.
+ propertyChangeListener = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ String property = event.getProperty();
+ if (IDEInternalPreferences.WORKSPACE_NAME.equals(property)
+ || IDEInternalPreferences.SHOW_LOCATION.equals(property)) {
+ // Make sure the title is actually updated by
+ // setting last active page.
+ lastActivePage = null;
+ updateTitle(false);
+ }
+ }
+ };
+ IDEWorkbenchPlugin.getDefault().getPreferenceStore()
+ .addPropertyChangeListener(propertyChangeListener);
+ }
+
+ protected String computeTitle() {
+ IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+ IWorkbenchPage currentPage = configurer.getWindow().getActivePage();
+ IEditorPart activeEditor = null;
+ if (currentPage != null) {
+ activeEditor = lastActiveEditor;
+ }
+
+ String title = null;
+ IProduct product = Platform.getProduct();
+ if (product != null) {
+ title = product.getName();
+ }
+ if (title == null) {
+ title = ""; //$NON-NLS-1$
+ }
+
+// ISessionContext ctx = SimanticsUI.getSessionContext(configurer.getWindow());
+// if (ctx != null) {
+// ServerAddress addr = ctx.getAddress();
+// if (addr != null) {
+// title += " - Connected to " + addr.getAddress().getHostName();//InetAddressUtils.toHostString(addr);
+// }
+// Session session = ctx.getSession();
+// if (session != null) {
+// SessionUserSupport sessionUser = session.getService(SessionUserSupport.class);
+// final Resource user = sessionUser.getUser();
+// if (user != null) {
+// String userName;
+// try {
+// userName = session.syncRequest(new Read() {
+// @Override
+// public String perform(ReadGraph graph) throws DatabaseException {
+// try {
+// return graph.adapt(user, String.class);
+// } catch (AdaptionException e) {
+// return NameUtils.getSafeName(graph, user);
+// }
+// }
+// });
+// } catch (DatabaseException e) {
+// e.printStackTrace();
+// userName = "ERROR";
+// }
+//
+// title += " - " + userName;
+// }
+// }
+//
+// } else {
+// //title += " - Disconnected";
+// }
+
+ if (currentPage != null) {
+ if (activeEditor != null) {
+ lastEditorTitle = activeEditor.getTitleToolTip();
+ //IDEWorkbenchMessages.WorkbenchWindow_shellTitle == "{0} - {1}"
+ title = NLS.bind("{0} - {1}", lastEditorTitle, title);
+ }
+
+ boolean excludePerspectiveFromTitle = "true".equals(System.getProperty("org.simantics.workbench.application.excludePerspectiveFromTitle", "false").toLowerCase());
+ if (!excludePerspectiveFromTitle) {
+ IPerspectiveDescriptor persp = currentPage.getPerspective();
+ String label = ""; //$NON-NLS-1$
+ if (persp != null) {
+ label = persp.getLabel();
+ }
+ IAdaptable input = currentPage.getInput();
+ if (input != null && !input.equals(wbAdvisor.getDefaultPageInput())) {
+ label = currentPage.getLabel();
+ }
+ if (label != null && !label.equals("")) { //$NON-NLS-1$
+ //IDEWorkbenchMessages.WorkbenchWindow_shellTitle == "{0} - {1}"
+ title = NLS.bind("{0} - {1}", label, title);
+ }
+ }
+ }
+
+ String workspaceLocation = wbAdvisor.getWorkspaceLocation();
+ if (workspaceLocation != null) {
+ title = NLS.bind("{0} - {1}", title, workspaceLocation);
+ }
+
+ // Bug 284447: Prepend workspace name to the title
+ String workspaceName = IDEWorkbenchPlugin.getDefault()
+ .getPreferenceStore().getString(
+ IDEInternalPreferences.WORKSPACE_NAME);
+ if (workspaceName != null && workspaceName.length() > 0) {
+ //IDEWorkbenchMessages.WorkbenchWindow_shellTitle == "{0} - {1}"
+ title = NLS.bind("{0} - {1}", workspaceName, title);
+ }
+
+ return title;
+ }
+
+ private void recomputeTitle() {
+ IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+ String oldTitle = configurer.getTitle();
+ String newTitle = computeTitle();
+ if (!newTitle.equals(oldTitle)) {
+ configurer.setTitle(newTitle);
+ }
+ }
+
+ /**
+ * Updates the window title. Format will be:
+ * [pageInput -] [currentPerspective -] [editorInput -] [workspaceLocation -] productName
+ */
+ private void updateTitle(boolean force) {
+ IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+ IWorkbenchWindow window = configurer.getWindow();
+ IEditorPart activeEditor = null;
+ IWorkbenchPage currentPage = window.getActivePage();
+ IPerspectiveDescriptor persp = null;
+ IAdaptable input = null;
+
+ if (currentPage != null) {
+ activeEditor = currentPage.getActiveEditor();
+ persp = currentPage.getPerspective();
+ input = currentPage.getInput();
+ }
+
+ // Nothing to do if the editor hasn't changed or change is not forced.
+ if (!force && activeEditor == lastActiveEditor && currentPage == lastActivePage
+ && persp == lastPerspective && input == lastInput) {
+ return;
+ }
+
+ if (lastActiveEditor != null) {
+ lastActiveEditor.removePropertyListener(editorPropertyListener );
+ }
+
+ lastActiveEditor = activeEditor;
+ lastActivePage = currentPage;
+ lastPerspective = persp;
+ lastInput = input;
+
+ if (activeEditor != null) {
+ activeEditor.addPropertyListener(editorPropertyListener);
+ }
+
+ recomputeTitle();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.application.WorkbenchAdvisor#postWindowRestore
+ */
+ @Override
+ public void postWindowRestore()
+ throws WorkbenchException {
+ IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+ IWorkbenchWindow window = configurer.getWindow();
+
+ int index = getWorkbench().getWorkbenchWindowCount() - 1;
+
+ AboutInfo[] welcomePerspectiveInfos = wbAdvisor.getWelcomePerspectiveInfos();
+ if (index >= 0 && welcomePerspectiveInfos != null
+ && index < welcomePerspectiveInfos.length) {
+ // find a page that exist in the window
+ IWorkbenchPage page = window.getActivePage();
+ if (page == null) {
+ IWorkbenchPage[] pages = window.getPages();
+ if (pages != null && pages.length > 0) {
+ page = pages[0];
+ }
+ }
+
+ // if the window does not contain a page, create one
+ String perspectiveId = welcomePerspectiveInfos[index].getWelcomePerspectiveId();
+ if (page == null) {
+ IAdaptable root = wbAdvisor.getDefaultPageInput();
+ page = window.openPage(perspectiveId, root);
+ } else {
+ IPerspectiveRegistry reg = getWorkbench()
+ .getPerspectiveRegistry();
+ IPerspectiveDescriptor desc = reg
+ .findPerspectiveWithId(perspectiveId);
+ if (desc != null) {
+ page.setPerspective(desc);
+ }
+ }
+
+ // set the active page and open the welcome editor
+ window.setActivePage(page);
+ page.openEditor(new WelcomeEditorInput(
+ welcomePerspectiveInfos[index]), WELCOME_EDITOR_ID, true);
+ }
+ }
+
+ /**
+ * Tries to open the intro, if one exists and otherwise will open the legacy
+ * Welcome pages.
+ *
+ * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#openIntro()
+ */
+ @Override
+ public void openIntro() {
+ if (editorsAndIntrosOpened ) {
+ return;
+ }
+
+ editorsAndIntrosOpened = true;
+
+ // don't try to open the welcome editors if there is an intro
+ if (wbAdvisor.hasIntro()) {
+ super.openIntro();
+ } else {
+ openWelcomeEditors(getWindowConfigurer().getWindow());
+ // save any preferences changes caused by the above actions
+ IDEWorkbenchPlugin.getDefault().savePluginPreferences();
+ }
+ }
+
+ /*
+ * Open the welcome editor for the primary feature and for any newly
+ * installed features.
+ */
+ private void openWelcomeEditors(IWorkbenchWindow window) {
+ if (IDEWorkbenchPlugin.getDefault().getPreferenceStore().getBoolean(
+ IDEInternalPreferences.WELCOME_DIALOG)) {
+ // show the welcome page for the product the first time the
+ // workbench opens
+ IProduct product = Platform.getProduct();
+ if (product == null) {
+ return;
+ }
+
+ AboutInfo productInfo = new AboutInfo(product);
+ URL url = productInfo.getWelcomePageURL();
+ if (url == null) {
+ return;
+ }
+
+ IDEWorkbenchPlugin.getDefault().getPreferenceStore().setValue(
+ IDEInternalPreferences.WELCOME_DIALOG, false);
+ openWelcomeEditor(window, new WelcomeEditorInput(productInfo), null);
+ } else {
+ // Show the welcome page for any newly installed features
+ List welcomeFeatures = new ArrayList();
+ for (Iterator> it = wbAdvisor.getNewlyAddedBundleGroups().entrySet()
+ .iterator(); it.hasNext();) {
+ Map.Entry,?> entry = (Map.Entry,?>) it.next();
+ AboutInfo info = (AboutInfo) entry.getValue();
+
+ if (info != null && info.getWelcomePageURL() != null) {
+ welcomeFeatures.add(info);
+ // activate the feature plug-in so it can run some install
+ // code
+ String pi = info.getBrandingBundleId();
+ if (pi != null) {
+ // Start the bundle if there is one
+ Bundle bundle = Platform.getBundle(pi);
+ if (bundle != null) {
+ try {
+ bundle.start(Bundle.START_TRANSIENT);
+ } catch (BundleException exception) {
+ StatusManager
+ .getManager()
+ .handle(
+ new Status(
+ IStatus.ERROR,
+ Activator.PLUGIN_ID,
+ "Failed to load feature", exception));//$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+
+ int wCount = getWorkbench().getWorkbenchWindowCount();
+ for (int i = 0; i < welcomeFeatures.size(); i++) {
+ AboutInfo newInfo = (AboutInfo) welcomeFeatures.get(i);
+ String id = newInfo.getWelcomePerspectiveId();
+ // Other editors were already opened in postWindowRestore(..)
+ if (id == null || i >= wCount) {
+ openWelcomeEditor(window, new WelcomeEditorInput(newInfo),
+ id);
+ }
+ }
+ }
+ }
+
+ /**
+ * Open a welcome editor for the given input
+ */
+ private void openWelcomeEditor(IWorkbenchWindow window,
+ WelcomeEditorInput input, String perspectiveId) {
+ if (getWorkbench().getWorkbenchWindowCount() == 0) {
+ // Something is wrong, there should be at least
+ // one workbench window open by now.
+ return;
+ }
+
+ IWorkbenchWindow win = window;
+ if (perspectiveId != null) {
+ try {
+ win = getWorkbench().openWorkbenchWindow(perspectiveId,
+ wbAdvisor.getDefaultPageInput());
+ if (win == null) {
+ win = window;
+ }
+ } catch (WorkbenchException e) {
+ IDEWorkbenchPlugin
+ .log(
+ "Error opening window with welcome perspective.", e.getStatus()); //$NON-NLS-1$
+ return;
+ }
+ }
+
+ if (win == null) {
+ win = getWorkbench().getWorkbenchWindows()[0];
+ }
+
+ IWorkbenchPage page = win.getActivePage();
+ String id = perspectiveId;
+ if (id == null) {
+ id = getWorkbench().getPerspectiveRegistry()
+ .getDefaultPerspective();
+ }
+
+ if (page == null) {
+ try {
+ page = win.openPage(id, wbAdvisor.getDefaultPageInput());
+ } catch (WorkbenchException e) {
+ ErrorDialog.openError(win.getShell(),
+ IDEWorkbenchMessages.Problems_Opening_Page, e
+ .getMessage(), e.getStatus());
+ }
+ }
+ if (page == null) {
+ return;
+ }
+
+ if (page.getPerspective() == null) {
+ try {
+ page = getWorkbench().showPerspective(id, win);
+ } catch (WorkbenchException e) {
+ ErrorDialog
+ .openError(
+ win.getShell(),
+ IDEWorkbenchMessages.Workbench_openEditorErrorDialogTitle,
+ IDEWorkbenchMessages.Workbench_openEditorErrorDialogMessage,
+ e.getStatus());
+ return;
+ }
+ }
+
+ page.setEditorAreaVisible(true);
+
+ // see if we already have an editor
+ IEditorPart editor = page.findEditor(input);
+ if (editor != null) {
+ page.activate(editor);
+ return;
+ }
+
+ try {
+ page.openEditor(input, WELCOME_EDITOR_ID);
+ } catch (PartInitException e) {
+ ErrorDialog
+ .openError(
+ win.getShell(),
+ IDEWorkbenchMessages.Workbench_openEditorErrorDialogTitle,
+ IDEWorkbenchMessages.Workbench_openEditorErrorDialogMessage,
+ e.getStatus());
+ }
+ return;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.application.WorkbenchAdvisor#createEmptyWindowContents(org.eclipse.ui.application.IWorkbenchWindowConfigurer, org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public Control createEmptyWindowContents(Composite parent) {
+ final IWorkbenchWindow window = getWindowConfigurer().getWindow();
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ Display display = composite.getDisplay();
+ Color bgCol = display.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND);
+ composite.setBackground(bgCol);
+ Label label = new Label(composite, SWT.WRAP);
+ label.setForeground(display.getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND));
+ label.setBackground(bgCol);
+ label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ String msg = IDEWorkbenchMessages.IDEWorkbenchAdvisor_noPerspective;
+ label.setText(msg);
+ ToolBarManager toolBarManager = new ToolBarManager();
+ openPerspectiveAction = ActionFactory.OPEN_PERSPECTIVE_DIALOG.create(window);
+ toolBarManager.add(openPerspectiveAction);
+ ToolBar toolBar = toolBarManager.createControl(composite);
+ toolBar.setBackground(bgCol);
+ return composite;
+ }
+
+ @Override
+ public void dispose() {
+ if (propertyChangeListener != null) {
+ IDEWorkbenchPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(propertyChangeListener);
+ propertyChangeListener = null;
+ }
+
+ if (openPerspectiveAction!=null) {
+ openPerspectiveAction.dispose();
+ openPerspectiveAction = null;
+ }
+ super.dispose();
+ }
+
+}