/*******************************************************************************
 * Copyright (c) 2000, 2010 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.draw2d;

import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;

import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.rap.swt.SWT;

/**
 * Provides abstract support for classes that manage popups. Popups in Draw2d
 * consist of a LightweightSystem object with an SWT shell as its Control.
 * Desired popup behavior is attained by adding appropriate listeners to this
 * shell.
 */
public abstract class PopUpHelper {

	private Shell shell;
	private LightweightSystem lws;
	private boolean tipShowing;
	/**
	 * The Control this PopUpHelper's tooltip will belong to.
	 */
	protected Control control;

	/**
	 * These style bits should be used when creating the Shell.
	 * 
	 * @see #createShell()
	 */
	protected final int shellStyle;

	/**
	 * Constructs a PopUpHelper to assist with popups on Control c.
	 * 
	 * @param c
	 *            the Control
	 * @since 2.0
	 */
	protected PopUpHelper(Control c) {
		this(c, SWT.ON_TOP | SWT.NO_TRIM);
	}

	/**
	 * Constructs a PopUpHelper to display the given shell style popup.
	 * 
	 * @param c
	 *            the control on which the popup is active.
	 * @param shellStyle
	 *            the SWT style bits for the shell
	 * @since 3.1
	 */
	protected PopUpHelper(Control c, int shellStyle) {
		control = c;
		this.shellStyle = shellStyle | SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE;
	}

	/**
	 * Creates and returns the LightweightSystem object used by PopUpHelper to
	 * draw upon.
	 * 
	 * @return the newly created LightweightSystem
	 * @since 2.0
	 */
	protected LightweightSystem createLightweightSystem() {
		return new LightweightSystem();
	}

	/**
	 * Creates a new Shell object with the style specified for this helper.
	 * 
	 * @return the newly created Shell
	 * @since 2.0
	 */
	protected Shell createShell() {
		return new Shell(control.getShell(), shellStyle);
	}

	/**
	 * Dispose of this PopUpHelper object.
	 * 
	 * @since 2.0
	 */
	public void dispose() {
		if (isShowing())
			hide();
		if (shell != null && !shell.isDisposed())
			shell.dispose();
	}

	/**
	 * Returns this PopUpHelper's shell. If no shell exists for this
	 * PopUpHelper, a new shell is created and hookShellListeners() is called.
	 * 
	 * @return the Shell
	 * @since 2.0
	 */
	protected Shell getShell() {
		if (shell == null) {
			shell = createShell();
			hookShellListeners();
		}
		return shell;
	}

	/**
	 * Returns the size needed to display the shell's trim. This method should
	 * not be called until the shell has been created.
	 * 
	 * @return the size of the shells trim.
	 * @since 3.1
	 */
	protected Dimension getShellTrimSize() {
		Rectangle trim = shell.computeTrim(0, 0, 0, 0);
		return new Dimension(trim.width, trim.height);
	}

	/**
	 * Returns this PopUpHelper's LightweightSystem. If no LightweightSystem
	 * exists for this PopUpHelper, a new LightweightSystem is created with this
	 * PopUpHelper's Shell as its Control.
	 * 
	 * @return the LightweightSystem
	 * @since 2.0
	 */
	protected LightweightSystem getLightweightSystem() {
		if (lws == null) {
			lws = createLightweightSystem();
			lws.setControl(getShell());
		}
		return lws;
	}

	/**
	 * Hides this PopUpHelper's Shell.
	 * 
	 * @since 2.0
	 */
	protected void hide() {
		if (shell != null && !shell.isDisposed())
			shell.setVisible(false);
		tipShowing = false;
	}

	/**
	 * Desired popup helper behavior is achieved by writing listeners that
	 * manipulate the behavior of the PopUpHelper's Shell. Override this method
	 * and add these listeners here.
	 * 
	 * @since 2.0
	 */
	protected abstract void hookShellListeners();

	/**
	 * Returns <code>true</code> if this PopUpHelper's Shell is visible,
	 * <code>false</code> otherwise.
	 * 
	 * @return <code>true</code> if this PopUpHelper's Shell is visible
	 * @since 2.0
	 */
	public boolean isShowing() {
		return tipShowing;
	}

	/**
	 * Sets the background color of this PopUpHelper's Shell.
	 * 
	 * @param c
	 *            the new background color
	 * @since 2.0
	 */
	public void setBackgroundColor(Color c) {
		getShell().setBackground(c);
	}

	/**
	 * Sets the foreground color of this PopUpHelper's Shell.
	 * 
	 * @param c
	 *            the new foreground color
	 * @since 2.0
	 */
	public void setForegroundColor(Color c) {
		getShell().setForeground(c);
	}

	/**
	 * Sets the bounds on this PopUpHelper's Shell.
	 * 
	 * @param x
	 *            the x coordinate
	 * @param y
	 *            the y coordinate
	 * @param width
	 *            the width
	 * @param height
	 *            the height
	 * @since 2.0
	 */
	protected void setShellBounds(int x, int y, int width, int height) {
		getShell().setBounds(x, y, width, height);
	}

	/**
	 * Displays this PopUpHelper's Shell.
	 * 
	 * @since 2.0
	 */
	protected void show() {
		getShell().setVisible(true);
		tipShowing = true;
	}

}
