core/com.nokia.cpp.utils.ui/src/com/nokia/cpp/internal/api/utils/ui/WorkbenchUtils.java
changeset 0 fb279309251b
child 1612 ead82fb31f27
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/com.nokia.cpp.utils.ui/src/com/nokia/cpp/internal/api/utils/ui/WorkbenchUtils.java	Fri Apr 03 23:33:03 2009 +0100
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.cpp.internal.api.utils.ui;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.*;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+import org.eclipse.ui.internal.ide.IDEInternalPreferences;
+import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
+import org.eclipse.ui.testing.TestableObject;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import com.nokia.cpp.internal.api.utils.core.Check;
+import com.nokia.cpp.utils.ui.noexport.UtilsUIPlugin;
+
+@SuppressWarnings("restriction")
+public abstract class WorkbenchUtils {
+
+	/**
+	 * Return true if running JUnit tests, false if normal interactive run
+	 */
+	public static boolean isJUnitRunning() {
+		boolean result = false;
+		TestableObject testableObject = PlatformUI.getTestableObject();
+		if (testableObject != null) {
+			result = testableObject.getTestHarness() != null;
+		}
+		return result;
+	}
+	
+	/**
+	 * Get the active workbench shell.
+	 * This can return null if the shell is in the background!
+	 * @return current foreground workbench window shell
+	 */
+	public static Shell getActiveShell() {
+		if (!Platform.isRunning())
+			return null;
+		
+		final Shell[] shell = { null };
+		
+		Display.getDefault().syncExec(new Runnable() {
+
+			public void run() {
+				final IWorkbench workbench;
+				try {
+					workbench = PlatformUI.getWorkbench();
+				} catch (IllegalStateException e) {
+					return;
+				}
+				
+				final IWorkbenchWindow[] activeWorkbenchWindow = { null };
+				Display.getDefault().syncExec(new Runnable() {
+					public void run() {
+						activeWorkbenchWindow[0] = workbench.getActiveWorkbenchWindow();
+					}
+				}); 
+				if (activeWorkbenchWindow[0] == null)
+					return;
+				
+				shell[0] = activeWorkbenchWindow[0].getShell();
+				
+			}
+		});
+		
+		return shell[0];
+	}
+	
+	/**
+	 * Get a shell that is preferably the active workbench window,
+	 * but pick some other workbench shell or even a random SWT
+	 * shell if none is active.  Fail if no shells are available.
+	 * @return shell, never null
+	 * @throws IllegalStateException if no shells visible
+	 */
+	public static Shell getSafeShell() {
+		Shell shell = getActiveShell();
+		if (shell != null)
+			return shell;
+		
+		try {
+			IWorkbench workbench = PlatformUI.getWorkbench();
+			IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
+			if (activeWorkbenchWindow != null) {
+				shell = activeWorkbenchWindow.getShell();
+			}
+			if (shell == null) {
+				for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
+					shell = window.getShell();
+					if (shell != null)
+						return shell;
+				}
+			}
+		} catch (IllegalStateException e) {
+			// platform not running
+		}
+
+		// resort to SWT
+		final Shell[] shellEntry = { null };
+		
+		Display.getDefault().syncExec(new Runnable() {
+			public void run() {
+				Shell[] shells = PlatformUI.getWorkbench().getDisplay().getShells();
+				if (shells.length > 0) {
+					shellEntry[0] = shells[0];
+				}
+			}
+		});
+		shell = shellEntry[0];
+		
+		Check.checkState(shell != null);
+		return shell;
+	}
+	
+	/**
+	 * This should be called in IWorkbenchPart.createPartControl(Composite parent)
+	 * to set the help context id for that IViewPart or IEditorPart. 
+	 * 
+	 * @param control the control on which to register the context id
+	 * @param contextId the context id to use when F1 help is invoked
+	 */
+	public static void setHelpContextId(Control control, String contextId) {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(control, contextId);
+	}
+	
+	/**
+	 * Reads the General > Workspace > Save automatically before build option and, if true,
+	 * saves all open editor windows
+	 *
+	 */
+	public static void saveOpenEditorsIfRequired(){
+		IPreferenceStore store = IDEWorkbenchPlugin.getDefault().getPreferenceStore();
+		if (store != null && store.getBoolean(IDEInternalPreferences.SAVE_ALL_BEFORE_BUILD)){
+			PlatformUI.getWorkbench().saveAllEditors(false);
+		}
+	}
+
+	/**
+	 * Load and provide a view part with the given id.
+	 * @param viewID
+	 * @return IViewPart
+	 * @throws PartInitException
+	 */
+	public static IViewPart getView(final String viewID) throws PartInitException {		
+		final IViewPart[] parts = { null } ;
+		final PartInitException ex[] = { null };
+		Display.getDefault().syncExec(new Runnable() {
+
+			public void run() {
+				IWorkbench workbench = PlatformUI.getWorkbench();
+				IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+				if (workbenchWindow == null) {
+					if (workbench.getWorkbenchWindowCount() == 0)
+						return;
+					workbenchWindow = workbench.getWorkbenchWindows()[0];
+				}
+				IWorkbenchPage page = workbenchWindow.getActivePage();
+				if (page == null) {
+					if (workbenchWindow.getPages().length == 0)
+						return;
+					page = workbenchWindow.getPages()[0];
+				}
+				IViewPart view;
+				try {
+					view = page.showView(viewID);
+				} catch (PartInitException e) {
+					ex[0] = e;
+					return;
+				}
+				parts[0] = view;				
+			}
+			
+		});
+		if (ex[0] != null)
+			throw ex[0];
+		return parts[0];
+	}
+
+	/**
+	 * Open an external browser and go to the given URL.
+	 * Note this function must be called in UI thread.
+	 * 
+	 * @param address
+	 */
+	static public void showWebPageInExternalBrowser(String address) {
+		IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
+		// use external browser since internal one which opens in an editor has no UI
+		// and somehow seems to ignore proxy settings
+		
+		try {
+			URL url = new URL(address);
+			browserSupport.getExternalBrowser().openURL(url);
+		} catch (MalformedURLException e) {
+			UtilsUIPlugin.log(e, "Malformed URL: " + address);
+		} catch (PartInitException e) {
+			UtilsUIPlugin.log(e, "Cannot launch browser to navigate to the URL.");
+		}
+	}	
+}