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