/*******************************************************************************
 * 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.gef.internal.ui.palette.editparts;

import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

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

class EditPartTipHelper extends org.eclipse.draw2d.PopUpHelper {

	private static EditPartTipHelper currentHelper;
	private ShellListener shellListener;

	private static void setHelper(EditPartTipHelper helper) {
		if (currentHelper != null && currentHelper != helper
				&& currentHelper.isShowing())
			currentHelper.hide();
		currentHelper = helper;
	}

	public EditPartTipHelper(Control c) {
		super(c, SWT.ON_TOP | SWT.TOOL | SWT.NO_TRIM);
	}

	/**
	 * Sets the LightWeightSystem object's contents to the passed tooltip, and
	 * displays the tip at the coordianates specified by tipPosX and tipPosY.
	 * The given coordinates will be adjusted if the tip cannot be completely
	 * visible on the screen.
	 * 
	 * @param tip
	 *            The tool tip to be displayed.
	 * @param tipPosX
	 *            X coordiante of tooltip to be displayed
	 * @param tipPosY
	 *            Y coordinate of tooltip to be displayed
	 */
	public void displayToolTipAt(IFigure tip, int tipPosX, int tipPosY) {
		if (tip != null) {
			// Adjust the position if the tip will not be completely visible on
			// the screen
			int shiftX = 0;
			int shiftY = 0;
			Dimension tipSize = tip.getPreferredSize();
			getShell();
			tipSize = tipSize.getExpanded(getShellTrimSize());
			org.eclipse.swt.graphics.Rectangle area = control.getDisplay()
					.getClientArea();
			org.eclipse.swt.graphics.Point end = new org.eclipse.swt.graphics.Point(
					tipPosX + tipSize.width, tipPosY + tipSize.height);
			if (!area.contains(end)) {
				shiftX = end.x - (area.x + area.width);
				shiftY = end.y - (area.y + area.height);
				shiftX = shiftX < 0 ? 0 : shiftX;
				shiftY = shiftY < 0 ? 0 : shiftY;
			}
			tipPosX -= shiftX;
			tipPosY -= shiftY;

			// Display the tip
			EditPartTipHelper.setHelper(this);
			getLightweightSystem().setContents(tip);
			setShellBounds(tipPosX, tipPosY, tipSize.width, tipSize.height);
			show();
			// UNSUPPORTED - api not implemented in RAP
			// getShell().setCapture(true);
		}
	}

	public void dispose() {
		if (shellListener != null) {
			control.getShell().removeShellListener(shellListener);
			shellListener = null;
		}
		super.dispose();
	}

	/**
	 * @see org.eclipse.draw2d.PopUpHelper#hide()
	 */
	protected void hide() {
		super.hide();
		currentHelper = null;
	}

	protected void hookShellListeners() {

		/*
		 * If the cursor leaves the tip window, hide the tooltip and dispose of
		 * its shell
		 */
		// UNSUPPORTED - api not implemented in RAP
		// getShell().addMouseTrackListener(new MouseTrackAdapter() {
		// public void mouseExit(MouseEvent e) {
		// getShell().setCapture(false);
		// dispose();
		// }
		// });
		/*
		 * If the mouseExit listener does not get called, dispose of the shell
		 * if the cursor is no longer in the tooltip. This occurs in the rare
		 * case that a mouseEnter is not received on the tooltip when it
		 * appears.
		 */
		// UNSUPPORTED - api not implemented in RAP
		// getShell().addMouseMoveListener(new MouseMoveListener() {
		// public void mouseMove(MouseEvent e) {
		// Point eventPoint = getShell().toDisplay(new Point(e.x, e.y));
		// if (!getShell().getBounds().contains(eventPoint)) {
		// if (isShowing())
		// getShell().setCapture(false);
		// dispose();
		// }
		// }
		// });

		// This is to dispose of the tooltip when the user ALT-TABs to another
		// window.
		if (shellListener == null) {
			shellListener = new ShellAdapter() {
				public void shellDeactivated(ShellEvent event) {
					Display.getCurrent().asyncExec(new Runnable() {
						public void run() {
							Shell active = Display.getCurrent()
									.getActiveShell();
							if (getShell() == active
									|| control.getShell() == active
									|| getShell().isDisposed())
								return;
							// UNSUPPORTED - api not implemented in RAP
							// if (isShowing())
							// getShell().setCapture(false);
							dispose();
						}
					});
				}
			};
			control.getShell().addShellListener(shellListener);
			getShell().addShellListener(shellListener);
		}

		/*
		 * Workaround for GTK Bug - Control.setCapture(boolean) not implemented:
		 * If the cursor is not over the shell when it is first painted, hide
		 * the tooltip and dispose of the shell.
		 */
		if (SWT.getPlatform().equals("gtk")) { //$NON-NLS-1$
			getShell().addPaintListener(new PaintListener() {
				public void paintControl(PaintEvent event) {
					Point cursorLoc = Display.getCurrent().getCursorLocation();
					if (!getShell().getBounds().contains(cursorLoc)) {
						// This must be run asynchronously. If not, other paint
						// listeners may attempt to paint on a disposed control.
						Display.getCurrent().asyncExec(new Runnable() {
							public void run() {
								// UNSUPPORTED - api not implemented in RAP
								// if (isShowing())
								// getShell().setCapture(false);
								dispose();
							}
						});
					}
				}
			});
		}
	}

	public static boolean isCurrent(EditPartTipHelper helper) {
		return currentHelper != null && helper == currentHelper;
	}

}
