/** * Copyright (c) 2014 Codetrails GmbH. * 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: * Johannes Dorn - initial API and implementation. */ package org.eclipse.recommenders.utils.rcp; import static java.text.MessageFormat.format; import java.net.MalformedURLException; import java.net.URL; import java.text.MessageFormat; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.recommenders.internal.utils.rcp.BrowserDialog; import org.eclipse.recommenders.internal.utils.rcp.l10n.LogMessages; import org.eclipse.recommenders.internal.utils.rcp.l10n.Messages; import org.eclipse.recommenders.utils.Logs; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.browser.IWebBrowser; import org.osgi.framework.Bundle; public final class Browsers { private static final Bundle BUNDLE = Logs.getBundle(Browsers.class); private static final String BUNDLE_SYMBOLIC_NAME = BUNDLE.getSymbolicName(); private Browsers() { // Not meant to be instantiated } /** * Tries to open an URL with the web browser configured in the Eclipse preferences (General > Web Browser). By * default, this will open a new editor to display the URL within the Eclipse IDE. * <p> * If that fails, this method will try the following fallbacks in order: * <ol> * <li>An external web browser, as configured in the Eclipse preferences</li> * <li>An external web browser, as determined by the OS</li> * <li>A web browser embedded in a dialog</li> * </ol> * * @return {@code true} if any browser could be opened successfully, {@code false} if not. * * @since 2.2.6 */ public static boolean tryOpenInDefaultBrowser(URL url) { MultiStatus multiStatus = new MultiStatus(BUNDLE_SYMBOLIC_NAME, 0, MessageFormat.format(Messages.LOG_ERROR_FAILED_TO_OPEN_DEFAULT_BROWSER, url), null); try { Status defaultBrowserStatus = doOpenInDefaultBrowser(url); multiStatus.add(defaultBrowserStatus); if (defaultBrowserStatus.isOK()) { return true; } Status externalBrowserStatus = doOpenInExternalBrowser(url); multiStatus.add(externalBrowserStatus); if (externalBrowserStatus.isOK()) { return true; } Status osBrowserStatus = doOpenInOsBrowser(url); multiStatus.add(osBrowserStatus); if (osBrowserStatus.isOK()) { return true; } Status dialogBrowserStatus = doOpenInDialogBrowser(url, SWT.DEFAULT, SWT.DEFAULT); multiStatus.add(dialogBrowserStatus); if (dialogBrowserStatus.isOK()) { return true; } return false; } finally { if (!multiStatus.isOK()) { Platform.getLog(BUNDLE).log(multiStatus); } } } /** * @deprecated Use {@link #tryOpenInDefaultBrowser(URL)} instead */ @Deprecated public static void openInDefaultBrowser(URL url) { tryOpenInDefaultBrowser(url); } public static boolean tryOpenInDefaultBrowser(String url) { try { return tryOpenInDefaultBrowser(new URL(url)); } catch (MalformedURLException e) { Logs.log(LogMessages.ERROR_MALFORMED_URI, e, url); return false; } } /** * @deprecated Use {@link #tryOpenInDefaultBrowser(String)} instead */ @Deprecated public static void openInDefaultBrowser(String url) { tryOpenInDefaultBrowser(url); } /** * Tries to open an URL with an external web browser configured in the Eclipse preferences (General > Web * Browser). * <p> * If that fails, this method will try the following fallbacks in order: * <ol> * <li>An external web browser, as determined by the OS</li> * <li>The default web browser, as configured in the Eclipse preferences</li> * <li>A web browser embedded in a dialog</li> * </ol> * * @return {@code true} if any browser could be opened successfully, {@code false} if not. * * @since 2.2.6 */ public static boolean tryOpenInExternalBrowser(URL url) { MultiStatus multiStatus = new MultiStatus(BUNDLE_SYMBOLIC_NAME, 0, MessageFormat.format(Messages.LOG_ERROR_FAILED_TO_OPEN_EXTERNAL_BROWSER, url), null); try { Status externalBrowserStatus = doOpenInExternalBrowser(url); multiStatus.add(externalBrowserStatus); if (externalBrowserStatus.isOK()) { return true; } Status osBrowserStatus = doOpenInOsBrowser(url); multiStatus.add(osBrowserStatus); if (osBrowserStatus.isOK()) { return true; } Status defaultBrowserStatus = doOpenInDefaultBrowser(url); multiStatus.add(defaultBrowserStatus); if (defaultBrowserStatus.isOK()) { return true; } Status dialogBrowserStatus = doOpenInDialogBrowser(url, SWT.DEFAULT, SWT.DEFAULT); multiStatus.add(dialogBrowserStatus); if (dialogBrowserStatus.isOK()) { return true; } return false; } finally { if (!multiStatus.isOK()) { Platform.getLog(BUNDLE).log(multiStatus); } } } /** * @deprecated Use {@link #tryOpenInExternalBrowser(URL)} instead */ @Deprecated public static void openInExternalBrowser(URL url) { tryOpenInExternalBrowser(url); } public static boolean tryOpenInExternalBrowser(String url) { try { return tryOpenInExternalBrowser(new URL(url)); } catch (MalformedURLException e) { Logs.log(LogMessages.ERROR_MALFORMED_URI, e, url); return false; } } /** * @deprecated Use {@link #tryOpenInExternalBrowser(String)} instead */ @Deprecated public static void openInExternalBrowser(String url) { tryOpenInExternalBrowser(url); } /** * Tries to open an URL with a web browser embedded in a dialog. * <p> * If that fails, this method will try the following fallbacks in order: * <ol> * <li>An external web browser, as configured in the Eclipse preferences</li> * <li>An external web browser, as determined by the OS</li> * <li>The default web browser, as configured in the Eclipse preferences</li> * </ol> * * @return {@code true} if any browser could be opened successfully, {@code false} if not. * * @since 2.2.6 */ public static boolean tryOpenInDialogBrowser(URL url, int width, int height) { MultiStatus multiStatus = new MultiStatus(BUNDLE_SYMBOLIC_NAME, 0, MessageFormat.format(Messages.LOG_ERROR_FAILED_TO_OPEN_DIALOG_BROWSER, url), null); try { Status dialogBrowserStatus = doOpenInDialogBrowser(url, width, height); multiStatus.add(dialogBrowserStatus); if (dialogBrowserStatus.isOK()) { return true; } Status externalBrowserStatus = doOpenInExternalBrowser(url); multiStatus.add(externalBrowserStatus); if (externalBrowserStatus.isOK()) { return true; } Status osBrowserStatus = doOpenInOsBrowser(url); multiStatus.add(osBrowserStatus); if (osBrowserStatus.isOK()) { return true; } Status defaultBrowserStatus = doOpenInDefaultBrowser(url); multiStatus.add(defaultBrowserStatus); if (defaultBrowserStatus.isOK()) { return true; } return false; } finally { if (!multiStatus.isOK()) { Platform.getLog(BUNDLE).log(multiStatus); } } } /** * @deprecated Use {@link #tryOpenInDialogBrowser(URL, int, int)} instead */ @Deprecated public static void openInDialogBrowser(URL url, int width, int height) { tryOpenInDialogBrowser(url, width, height); } public static boolean tryOpenInDialogBrowser(URL url) { return tryOpenInDialogBrowser(url, SWT.DEFAULT, SWT.DEFAULT); } /** * @deprecated Use {@link #tryOpenInDialogBrowser(URL)} instead */ @Deprecated public static void openInDialogBrowser(URL url) { tryOpenInDialogBrowser(url); } public static boolean tryOpenInDialogBrowser(String url) { return tryOpenInDialogBrowser(url, SWT.DEFAULT, SWT.DEFAULT); } /** * @deprecated Use {@link #tryOpenInDialogBrowser(String)} instead */ @Deprecated public static void openInDialogBrowser(String url) { tryOpenInDialogBrowser(url); } public static boolean tryOpenInDialogBrowser(String url, int width, int height) { try { return tryOpenInDialogBrowser(new URL(url), width, height); } catch (MalformedURLException e) { Logs.log(LogMessages.ERROR_MALFORMED_URI, e, url); return false; } } /** * @deprecated Use {@link #tryOpenInDialogBrowser(String, int, int)} instead */ @Deprecated public static void openInDialogBrowser(String url, int width, int height) { tryOpenInDialogBrowser(url, width, height); } private static Status doOpenInDefaultBrowser(URL url) { try { IWebBrowser defaultBrowser = PlatformUI.getWorkbench().getBrowserSupport().createBrowser(null); defaultBrowser.openURL(url); return new Status(Status.OK, BUNDLE_SYMBOLIC_NAME, format(Messages.LOG_INFO_SUCESSFULLY_OPENED_DEFAULT_BROWSER, url)); } catch (PartInitException e) { return new Status(Status.ERROR, BUNDLE_SYMBOLIC_NAME, format(Messages.LOG_ERROR_FAILED_TO_OPEN_DEFAULT_BROWSER, url), e); } } private static Status doOpenInExternalBrowser(URL url) { try { IWebBrowser externalBrowser = PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser(); externalBrowser.openURL(url); return new Status(Status.OK, BUNDLE_SYMBOLIC_NAME, format(Messages.LOG_INFO_SUCESSFULLY_OPENED_EXTERNAL_BROWSER, url)); } catch (PartInitException e) { return new Status(Status.ERROR, BUNDLE_SYMBOLIC_NAME, format(Messages.LOG_ERROR_FAILED_TO_OPEN_EXTERNAL_BROWSER, url), e); } } private static Status doOpenInOsBrowser(URL url) { boolean success = Program.launch(url.toExternalForm()); if (success) { return new Status(Status.OK, BUNDLE_SYMBOLIC_NAME, format(Messages.LOG_INFO_SUCESSFULLY_OPENED_OS_BROWSER, url)); } else { return new Status(Status.ERROR, BUNDLE_SYMBOLIC_NAME, format(Messages.LOG_ERROR_FAILED_TO_OPEN_OS_BROWSER, url)); } } private static Status doOpenInDialogBrowser(URL url, int width, int height) { try { Shell activeShell = PlatformUI.getWorkbench().getDisplay().getActiveShell(); BrowserDialog browserDialog; if (width == SWT.DEFAULT || height == SWT.DEFAULT) { browserDialog = new BrowserDialog(activeShell, url.toExternalForm()); } else { browserDialog = new BrowserDialog(activeShell, url.toExternalForm(), width, height); } browserDialog.open(); return new Status(Status.OK, BUNDLE_SYMBOLIC_NAME, format(Messages.LOG_INFO_SUCESSFULLY_OPENED_DIALOG_BROWSER, url)); } catch (SWTError e) { if (e.code == SWT.ERROR_NO_HANDLES) { return new Status(Status.ERROR, BUNDLE_SYMBOLIC_NAME, format(Messages.LOG_ERROR_FAILED_TO_OPEN_DIALOG_BROWSER, url), e); } else { throw e; } } } /** Augments the supplied link to open it in a web browser when clicked on. */ public static void addOpenBrowserAction(Link link) { link.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { tryOpenInExternalBrowser(event.text); } }); } }