| /******************************************************************************* |
| * Copyright (c) 2005 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ui.internal.browser; |
| |
| import java.util.HashMap; |
| import java.util.Observable; |
| import java.util.Observer; |
| |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.browser.AbstractWorkbenchBrowserSupport; |
| import org.eclipse.ui.browser.IWebBrowser; |
| import org.eclipse.ui.browser.IWorkbenchBrowserSupport; |
| |
| /** |
| * Implementation of the workbench browser support. |
| */ |
| public class DefaultBrowserSupport extends AbstractWorkbenchBrowserSupport { |
| static final String SHARED_ID = "org.eclipse.ui.browser"; //$NON-NLS-1$ |
| |
| protected HashMap browserIdMap = new HashMap(); |
| |
| protected static DefaultBrowserSupport instance; |
| |
| public DefaultBrowserSupport() { |
| // do nothing |
| instance = this; |
| BrowserManager.getInstance().addObserver(new Observer() { |
| public void update(Observable o, Object arg) { |
| // TODO I am not sure what we should do here |
| // The preferences have changed so maybe we should |
| // close the opened browsers in addition to clearing |
| // the table |
| browserIdMap.clear(); |
| } |
| }); |
| } |
| |
| protected static DefaultBrowserSupport getInstance() { |
| return instance; |
| } |
| |
| protected IWebBrowser getExistingWebBrowser(String browserId) { |
| try { |
| Object obj = browserIdMap.get(browserId); |
| IWebBrowser browser = null; |
| if (obj instanceof IWebBrowser) |
| browser = (IWebBrowser) obj; |
| else if (obj instanceof HashMap) { |
| HashMap wmap = (HashMap) obj; |
| IWorkbenchWindow window = PlatformUI.getWorkbench() |
| .getActiveWorkbenchWindow(); |
| if (window != null) { |
| browser = (IWebBrowser) wmap.get(getWindowKey(window)); |
| } |
| } |
| if (browser != null) |
| return browser; |
| } catch (Exception e) { |
| // ignore |
| } |
| return null; |
| } |
| |
| private Integer getWindowKey(IWorkbenchWindow window) { |
| return new Integer(window.hashCode()); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#createBrowser(int, |
| * java.lang.String, java.lang.String, java.lang.String) |
| */ |
| public IWebBrowser createBrowser(int style, String browserId, String name, |
| String tooltip) throws PartInitException { |
| if (browserId == null) |
| browserId = SHARED_ID; |
| IWebBrowser browser = getExistingWebBrowser(browserId); |
| if (browser != null) { |
| if (browser instanceof InternalBrowserInstance) { |
| InternalBrowserInstance instance2 = (InternalBrowserInstance) browser; |
| instance2.setName(name); |
| instance2.setTooltip(tooltip); |
| } |
| return browser; |
| } |
| |
| IWebBrowser webBrowser = null; |
| |
| // AS_EXTERNAL will force the external browser regardless of the user |
| // preference |
| if ((style & AS_EXTERNAL) != 0 |
| || WebBrowserPreference.getBrowserChoice() != WebBrowserPreference.INTERNAL) { |
| IBrowserDescriptor ewb = BrowserManager.getInstance() |
| .getCurrentWebBrowser(); |
| if (ewb == null) |
| throw new PartInitException(Messages.errorNoBrowser); |
| |
| if (ewb instanceof SystemBrowserDescriptor) |
| webBrowser = new SystemBrowserInstance(browserId); |
| else { |
| IBrowserExt ext = null; |
| if (ewb != null) |
| ext = WebBrowserUIPlugin.findBrowsers(ewb.getLocation()); |
| if (ext != null) |
| webBrowser = ext.createBrowser(browserId, |
| ewb.getLocation(), ewb.getParameters()); |
| if (webBrowser == null) |
| webBrowser = new ExternalBrowserInstance(browserId, ewb); |
| } |
| } else { |
| if ((style & IWorkbenchBrowserSupport.AS_VIEW) != 0) |
| webBrowser = new InternalBrowserViewInstance(browserId, style, |
| name, tooltip); |
| else |
| webBrowser = new InternalBrowserEditorInstance(browserId, |
| style, name, tooltip); |
| } |
| |
| if (webBrowser instanceof InternalBrowserInstance) { |
| // we should only share internal browsers within one |
| // workbench window. Each workbench window can have |
| // a shared browser with the same id |
| IWorkbenchWindow window = PlatformUI.getWorkbench() |
| .getActiveWorkbenchWindow(); |
| Integer key = getWindowKey(window); |
| HashMap wmap = (HashMap) browserIdMap.get(browserId); |
| if (wmap == null) { |
| wmap = new HashMap(); |
| browserIdMap.put(browserId, wmap); |
| } |
| wmap.put(key, webBrowser); |
| } else { |
| // external and system browsers are shared |
| // for the entire workbench |
| browserIdMap.put(browserId, webBrowser); |
| } |
| return webBrowser; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#createBrowser(java.lang.String) |
| */ |
| public IWebBrowser createBrowser(String browserId) throws PartInitException { |
| return createBrowser(0, browserId, null, null); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#isInternalWebBrowserAvailable() |
| */ |
| public boolean isInternalWebBrowserAvailable() { |
| return WebBrowserUtil.canUseInternalWebBrowser(); |
| } |
| |
| protected void removeBrowser(IWebBrowser browser) { |
| String baseId = WebBrowserUtil.decodeId(browser.getId()); |
| if (browser instanceof InternalBrowserInstance) { |
| // Remove it from the window map and |
| // also remove the window map itself if it is empty. |
| Integer key = ((InternalBrowserInstance) browser).getWindowKey(); |
| HashMap wmap = (HashMap) browserIdMap.get(baseId); |
| if (wmap != null) { |
| wmap.remove(key); |
| if (wmap.isEmpty()) |
| browserIdMap.remove(baseId); |
| } |
| } else |
| browserIdMap.remove(baseId); |
| } |
| } |