| /******************************************************************************* |
| * Copyright (c) 2000, 2015 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.help.internal.browser; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.preferences.DefaultScope; |
| import org.eclipse.core.runtime.preferences.IEclipsePreferences; |
| import org.eclipse.help.browser.IBrowser; |
| import org.eclipse.help.browser.IBrowserFactory; |
| import org.eclipse.help.internal.base.BaseHelpSystem; |
| import org.eclipse.help.internal.base.HelpBasePlugin; |
| import org.eclipse.help.internal.base.HelpBaseResources; |
| import org.eclipse.help.internal.base.IHelpBaseConstants; |
| import org.eclipse.osgi.service.environment.Constants; |
| import org.eclipse.osgi.util.NLS; |
| |
| /** |
| * Creates browser by delegating to appropriate browser adapter |
| */ |
| public class BrowserManager { |
| public static final String DEFAULT_BROWSER_ID_KEY = "default_browser"; //$NON-NLS-1$ |
| |
| public static final String BROWSER_ID_CUSTOM = HelpBasePlugin.PLUGIN_ID |
| + ".custombrowser"; //$NON-NLS-1$ |
| |
| public static final String BROWSER_ID_FIREFOX = HelpBasePlugin.PLUGIN_ID |
| + ".firefox"; //$NON-NLS-1$ |
| |
| public static final String BROWSER_ID_MOZILLA = HelpBasePlugin.PLUGIN_ID |
| + ".mozilla"; //$NON-NLS-1$ |
| |
| public static final String BROWSER_ID_NETSCAPE = HelpBasePlugin.PLUGIN_ID |
| + ".netscape"; //$NON-NLS-1$ |
| |
| public static final String BROWSER_ID_MAC_SYSTEM = HelpBasePlugin.PLUGIN_ID |
| + ".defaultBrowserMacOSX"; //$NON-NLS-1$ |
| |
| public static final String BROWSER_ID_EMBEDDED = "org.eclipse.help.ui.embeddedbrowser"; //$NON-NLS-1$ |
| |
| public static final String BROWSER_ID_SYSTEM = "org.eclipse.help.ui.systembrowser"; //$NON-NLS-1$ |
| |
| private static BrowserManager instance; |
| |
| private boolean initialized = false; |
| |
| private BrowserDescriptor currentBrowserDesc; |
| |
| private BrowserDescriptor defaultBrowserDesc; |
| |
| private BrowserDescriptor[] browsersDescriptors; |
| |
| private BrowserDescriptor internalBrowserDesc; |
| |
| private Collection<IBrowser> browsers = new ArrayList<>(); |
| |
| private boolean alwaysUseExternal = false; |
| |
| /** |
| * Private Constructor |
| */ |
| private BrowserManager() { |
| } |
| |
| /** |
| * Initialize |
| */ |
| private void init() { |
| initialized = true; |
| // Find all available browsers |
| browsersDescriptors = createBrowserDescriptors(); |
| // 1. set default browser from preferences |
| IEclipsePreferences defaultPreferences = DefaultScope.INSTANCE.getNode(HelpBasePlugin.PLUGIN_ID); |
| String defBrowserID = defaultPreferences.get(DEFAULT_BROWSER_ID_KEY, null); |
| if (defBrowserID != null && (!"".equals(defBrowserID))) { //$NON-NLS-1$ |
| setDefaultBrowserID(defBrowserID); |
| } |
| // 2. set default browser to embedded |
| // if (defaultBrowserDesc == null) { |
| // setDefaultBrowserID(BROWSER_ID_EMBEDDED); |
| // } |
| // 3. set default browser to help implementation of system specific |
| // browser |
| String os = Platform.getOS(); |
| if (defaultBrowserDesc == null) { |
| if (Constants.WS_WIN32.equalsIgnoreCase(os)) { |
| setDefaultBrowserID(BROWSER_ID_SYSTEM); |
| } else if (Constants.OS_AIX.equalsIgnoreCase(os) |
| || (Constants.OS_HPUX.equalsIgnoreCase(os)) |
| || (Constants.OS_LINUX.equalsIgnoreCase(os)) |
| || (Constants.OS_SOLARIS.equalsIgnoreCase(os))) { |
| setDefaultBrowserID(BROWSER_ID_MOZILLA); |
| if (defaultBrowserDesc == null) { |
| setDefaultBrowserID(BROWSER_ID_FIREFOX); |
| } |
| if (defaultBrowserDesc == null) { |
| setDefaultBrowserID(BROWSER_ID_NETSCAPE); |
| } |
| } else if (Constants.OS_MACOSX.equalsIgnoreCase(os)) { |
| setDefaultBrowserID(BROWSER_ID_MAC_SYSTEM); |
| } |
| } |
| // 4. set browser to one of externally contributed |
| if (defaultBrowserDesc == null) { |
| for (int i = 0; i < browsersDescriptors.length; i++) { |
| if (BROWSER_ID_CUSTOM.equals(browsersDescriptors[i].getID())) { |
| defaultBrowserDesc = browsersDescriptors[i]; |
| } |
| } |
| } |
| // 5. let user specify program |
| if (defaultBrowserDesc == null) { |
| setDefaultBrowserID(BROWSER_ID_CUSTOM); |
| } |
| // 6. use null browser |
| if (defaultBrowserDesc == null) { |
| // If no browsers at all, use the Null Browser Adapter |
| defaultBrowserDesc = new BrowserDescriptor("", "Null Browser", //$NON-NLS-1$ //$NON-NLS-2$ |
| new IBrowserFactory() { |
| @Override |
| public boolean isAvailable() { |
| return true; |
| } |
| |
| @Override |
| public IBrowser createBrowser() { |
| return new IBrowser() { |
| @Override |
| public void close() { |
| } |
| |
| @Override |
| public void displayURL(String url) { |
| HelpBasePlugin |
| .logError( |
| "There is no browser adapter configured to display " //$NON-NLS-1$ |
| + url |
| + ". Ensure that you have a required browser and adapter installed, and that the browser program is available on the system path.", //$NON-NLS-1$ |
| null); |
| String msg = NLS.bind(HelpBaseResources.no_browsers, url); |
| BaseHelpSystem.getDefaultErrorUtil() |
| .displayError(msg); |
| } |
| |
| @Override |
| public boolean isCloseSupported() { |
| return false; |
| } |
| |
| @Override |
| public boolean isSetLocationSupported() { |
| return false; |
| } |
| |
| @Override |
| public boolean isSetSizeSupported() { |
| return false; |
| } |
| |
| @Override |
| public void setLocation(int width, int height) { |
| } |
| |
| @Override |
| public void setSize(int x, int y) { |
| } |
| }; |
| } |
| }); |
| } |
| // initialize current browser |
| String curBrowserID = |
| Platform.getPreferencesService().getString(HelpBasePlugin.PLUGIN_ID, DEFAULT_BROWSER_ID_KEY, null, null); |
| if (curBrowserID != null && (!"".equals(curBrowserID))) { //$NON-NLS-1$ |
| setCurrentBrowserID(curBrowserID); |
| // may fail if such browser does not exist |
| } |
| if (currentBrowserDesc == null) { |
| setCurrentBrowserID(getDefaultBrowserID()); |
| } |
| setAlwaysUseExternal( |
| Platform.getPreferencesService().getBoolean(HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_ALWAYS_EXTERNAL_BROWSER, false, null)); |
| } |
| |
| /** |
| * Obtains singleton instance. |
| */ |
| public static BrowserManager getInstance() { |
| if (instance == null) |
| instance = new BrowserManager(); |
| return instance; |
| } |
| |
| /** |
| * Creates all adapters, and returns available ones. |
| */ |
| private BrowserDescriptor[] createBrowserDescriptors() { |
| if (this.browsersDescriptors != null) |
| return this.browsersDescriptors; |
| Collection<BrowserDescriptor> bDescriptors = new ArrayList<>(); |
| IConfigurationElement configElements[] = Platform |
| .getExtensionRegistry().getConfigurationElementsFor( |
| HelpBasePlugin.PLUGIN_ID, "browser"); //$NON-NLS-1$ |
| for (int i = 0; i < configElements.length; i++) { |
| if (!configElements[i].getName().equals("browser")) //$NON-NLS-1$ |
| continue; |
| String id = configElements[i].getAttribute("id"); //$NON-NLS-1$ |
| if (id == null) |
| continue; |
| String label = configElements[i].getAttribute("name"); //$NON-NLS-1$ |
| if (label == null) |
| continue; |
| try { |
| Object adapter = configElements[i] |
| .createExecutableExtension("factoryclass"); //$NON-NLS-1$ |
| if (!(adapter instanceof IBrowserFactory)) |
| continue; |
| if (((IBrowserFactory) adapter).isAvailable()) { |
| BrowserDescriptor descriptor = new BrowserDescriptor(id, |
| label, (IBrowserFactory) adapter); |
| if (descriptor.isExternal()) { |
| bDescriptors.add(descriptor); |
| } else { |
| internalBrowserDesc = descriptor; |
| } |
| } |
| } catch (CoreException ce) { |
| } |
| } |
| this.browsersDescriptors = bDescriptors |
| .toArray(new BrowserDescriptor[bDescriptors.size()]); |
| return this.browsersDescriptors; |
| } |
| |
| /** |
| * Obtains browsers descriptors. |
| */ |
| public BrowserDescriptor[] getBrowserDescriptors() { |
| if (!initialized) { |
| init(); |
| } |
| return this.browsersDescriptors; |
| } |
| |
| /** |
| * Gets the currentBrowserID. |
| * |
| * @return Returns a String or null if not set |
| */ |
| public String getCurrentBrowserID() { |
| if (!initialized) { |
| init(); |
| } |
| if (currentBrowserDesc == null) |
| return null; |
| return currentBrowserDesc.getID(); |
| } |
| |
| /** |
| * Gets the currentBrowserID. |
| * |
| * @return Returns a String or null if not set |
| */ |
| public String getCurrentInternalBrowserID() { |
| if (!initialized) { |
| init(); |
| } |
| if (isEmbeddedBrowserPresent() && !alwaysUseExternal) { |
| return internalBrowserDesc.getID(); |
| } |
| return getCurrentBrowserID(); |
| } |
| |
| /** |
| * Gets the currentBrowserID. |
| * |
| * @return Returns a String or null if not set |
| */ |
| public String getDefaultBrowserID() { |
| if (!initialized) { |
| init(); |
| } |
| if (defaultBrowserDesc == null) |
| return null; |
| return defaultBrowserDesc.getID(); |
| } |
| |
| /** |
| * Sets the currentBrowserID. If browser of given ID does not exists, the |
| * method does nothing |
| * |
| * @param currentAdapterID |
| * The ID of the adapter to to set as current |
| */ |
| public void setCurrentBrowserID(String currentAdapterID) { |
| if (!initialized) { |
| init(); |
| } |
| for (int i = 0; i < browsersDescriptors.length; i++) { |
| if (browsersDescriptors[i].getID().equals(currentAdapterID)) { |
| currentBrowserDesc = browsersDescriptors[i]; |
| return; |
| } |
| } |
| } |
| |
| /** |
| * Sets the defaultBrowserID. If browser of given ID does not exists, the |
| * method does nothing |
| * |
| * @param defaultAdapterID |
| * The ID of the adapter to to set as default |
| */ |
| private void setDefaultBrowserID(String defaultAdapterID) { |
| if (!initialized) { |
| init(); |
| } |
| for (int i = 0; i < browsersDescriptors.length; i++) { |
| if (browsersDescriptors[i].getID().equals(defaultAdapterID)) { |
| defaultBrowserDesc = browsersDescriptors[i]; |
| return; |
| } |
| } |
| } |
| |
| /** |
| * Creates web browser If preferences specify to always use external, the |
| * parameter will not be honored |
| */ |
| public IBrowser createBrowser(boolean external) { |
| if (!initialized) { |
| init(); |
| } |
| //external = external || alwaysUseExternal; |
| //return createBrowserAdapter(forceExternal); |
| if (external) { |
| return new CurrentBrowser(createBrowserAdapter(true), |
| getCurrentBrowserID(), true); |
| } |
| return new CurrentBrowser(createBrowserAdapter(alwaysUseExternal), |
| getCurrentInternalBrowserID(), false); |
| } |
| |
| /** |
| * Creates web browser |
| */ |
| public IBrowser createBrowser() { |
| return createBrowser(true); |
| } |
| |
| /** |
| * Creates web browser for external == false, if no internal browsers are |
| * present it will create external one |
| */ |
| private IBrowser createBrowserAdapter(boolean external) { |
| if (!initialized) { |
| init(); |
| } |
| IBrowser browser = null; |
| if (!external && isEmbeddedBrowserPresent()) { |
| browser = internalBrowserDesc.getFactory().createBrowser(); |
| } else { |
| browser = currentBrowserDesc.getFactory().createBrowser(); |
| } |
| browsers.add(browser); |
| return browser; |
| } |
| |
| /** |
| * Closes all browsers created |
| */ |
| public void closeAll() { |
| if (!initialized) { |
| // nothing to do, do not initialize |
| return; |
| } |
| for (Iterator<IBrowser> it = browsers.iterator(); it.hasNext();) { |
| IBrowser browser = it.next(); |
| browser.close(); |
| } |
| } |
| |
| public boolean isEmbeddedBrowserPresent() { |
| if (!initialized) { |
| init(); |
| } |
| return internalBrowserDesc != null; |
| } |
| |
| public void setAlwaysUseExternal(boolean alwaysExternal) { |
| if (!initialized) { |
| init(); |
| } |
| alwaysUseExternal = alwaysExternal || !isEmbeddedBrowserPresent(); |
| } |
| |
| public boolean isAlwaysUseExternal() { |
| if (!isEmbeddedBrowserPresent()) { |
| return true; |
| } |
| return alwaysUseExternal; |
| } |
| } |