/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.ui.actions;

import java.net.URL;

import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.widgets.Display;

import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;

import org.eclipse.jdt.internal.ui.JavaPlugin;


public class OpenBrowserUtil {

	/**
	 * Opens the given url in the browser as choosen in the preferences.
	 *
	 * @param url the URL
	 * @param display the display
	 * @since 3.6
	 */
	public static void open(final URL url, Display display) {
		display.syncExec(() -> internalOpen(url, false));
	}

	/**
	 * Opens the given URL in an external browser.
	 *
	 * @param url the URL
	 * @param display the display
	 * @since 3.6
	 */
	public static void openExternal(final URL url, Display display) {
		display.syncExec(() -> internalOpen(url, true));
	}

	private static void internalOpen(final URL url, final boolean useExternalBrowser) {
		BusyIndicator.showWhile(null, () -> {
			URL helpSystemUrl= PlatformUI.getWorkbench().getHelpSystem().resolve(url.toExternalForm(), true);
			if (helpSystemUrl == null) { // can happen if org.eclipse.help.ui is not available
				return; // the resolve() method already wrote "Unable to instantiate help UI" to the log
			}
			try {
				IWorkbenchBrowserSupport browserSupport= PlatformUI.getWorkbench().getBrowserSupport();
				IWebBrowser browser;
				if (useExternalBrowser)
					browser= browserSupport.getExternalBrowser();
				else
					browser= browserSupport.createBrowser(null);
				browser.openURL(helpSystemUrl);
			} catch (PartInitException ex) {
				// XXX: show dialog?
				JavaPlugin.logErrorStatus("Opening Javadoc failed", ex.getStatus()); //$NON-NLS-1$
			}
		});
	}

	/**
	 * DO NOT REMOVE, used in a product.
	 *
	 * @param url the URL
	 * @param display the display
	 * @param title the title
	 * @deprecated As of 3.6, replaced by {@link #open(URL, Display)}
	 */
	@Deprecated
	public static void open(final URL url, Display display, String title) {
		open(url, display);
	}

	private OpenBrowserUtil() {
	}

}
