/*******************************************************************************
 * Copyright (c) 2000, 2015 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.help.internal.browser;
import org.eclipse.help.browser.*;
/**
 * Wrapper for individual browsers contributed through extension point.
 */
public class CurrentBrowser implements IBrowser {
	private IBrowser browserAdapter;
	private String browserAdapterId;
	/**
	 * new adapter selected in preferences but not yet shown
	 */
	private IBrowser newBrowserAdapter = null;
	private String newBrowserAdapterId = null;
	private boolean locationSet = false;
	private boolean sizeSet = false;
	private int x;
	private int y;
	private int width;
	private int height;
	boolean external;
	public CurrentBrowser(IBrowser browserImpl, String browserAdapterId,
			boolean externalBrowser) {
		this.browserAdapter = browserImpl;
		this.browserAdapterId = browserAdapterId;
		this.external = externalBrowser;
	}
	/**
	 * @see org.eclipse.help.browser.IBrowser#close()
	 */
	@Override
	public void close() {
		browserAdapter.close();
	}
	/**
	 * @see org.eclipse.help.browser.IBrowser#isCloseSupported()
	 */
	@Override
	public boolean isCloseSupported() {
		return browserAdapter.isCloseSupported();
	}
	/**
	 * @see org.eclipse.help.browser.IBrowser#displayURL(java.lang.String)
	 */
	@Override
	public void displayURL(String url) throws Exception {
		checkDefaultAdapter();
		if (newBrowserAdapter != null) {
			browserAdapter.close();
			browserAdapter = newBrowserAdapter;
			newBrowserAdapter = null;
			browserAdapterId = newBrowserAdapterId;
			newBrowserAdapterId = null;
			if (locationSet) {
				browserAdapter.setLocation(x, y);
			}
			if (sizeSet) {
				browserAdapter.setSize(width, height);
			}
		}
		browserAdapter.displayURL(url);
	}
	/**
	 * @see org.eclipse.help.browser.IBrowser#isSetLocationSupported()
	 */
	@Override
	public boolean isSetLocationSupported() {
		checkDefaultAdapter();
		if (newBrowserAdapterId == null) {
			return browserAdapter.isSetLocationSupported();
		}
		return browserAdapter.isSetLocationSupported()
				|| newBrowserAdapter.isSetLocationSupported();
	}
	/**
	 * @see org.eclipse.help.browser.IBrowser#isSetSizeSupported()
	 */
	@Override
	public boolean isSetSizeSupported() {
		checkDefaultAdapter();
		if (newBrowserAdapterId == null) {
			return browserAdapter.isSetSizeSupported();
		}
		return browserAdapter.isSetSizeSupported()
				|| newBrowserAdapter.isSetSizeSupported();
	}
	/**
	 * @see org.eclipse.help.browser.IBrowser#setLocation(int, int)
	 */
	@Override
	public void setLocation(int x, int y) {
		checkDefaultAdapter();
		browserAdapter.setLocation(x, y);
		locationSet = true;
		this.x = x;
		this.y = y;
	}
	/**
	 * @see org.eclipse.help.browser.IBrowser#setSize(int, int)
	 */
	@Override
	public void setSize(int width, int height) {
		checkDefaultAdapter();
		browserAdapter.setSize(width, height);
		sizeSet = true;
		this.width = width;
		this.height = height;
	}
	/*
	 * Checks wheter default adapter has changed. If yes, sets the
	 * newBrowserAdapterId field
	 */
	private void checkDefaultAdapter() {
		if (external) {
			if (browserAdapterId != BrowserManager.getInstance()
					.getCurrentBrowserID()) {
				newBrowserAdapter = BrowserManager.getInstance().createBrowser(
						true);
				newBrowserAdapterId = BrowserManager.getInstance()
						.getCurrentBrowserID();
			}
		} else {
			if (browserAdapterId != BrowserManager.getInstance()
					.getCurrentInternalBrowserID()) {
				newBrowserAdapter = BrowserManager.getInstance().createBrowser(
						false);
				newBrowserAdapterId = BrowserManager.getInstance()
						.getCurrentInternalBrowserID();
			}
		}
	}
}
