/*******************************************************************************
 * Copyright (c) 2006, 2008 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
 *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
 *                                                 bugfix in: 195137, 198089
 *     Fredy Dobler <fredy@dobler.net> - bug 159600
 *     Brock Janiczak <brockj@tpg.com.au> - bug 182443
 *******************************************************************************/

package org.eclipse.jface.viewers;

import org.eclipse.jface.util.Policy;
import org.eclipse.jface.window.DefaultToolTip;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;

/**
 * The ColumnViewerTooltipSupport is the class that provides tool tips for
 * ColumnViewers.
 *
 * @since 3.3
 *
 */
public class ColumnViewerToolTipSupport extends DefaultToolTip {
	private ColumnViewer viewer;

	private static final String VIEWER_CELL_KEY = Policy.JFACE
			+ "_VIEWER_CELL_KEY"; //$NON-NLS-1$

	private static final int DEFAULT_SHIFT_X = 10;

	private static final int DEFAULT_SHIFT_Y = 0;

	/**
	 * Enable ToolTip support for the viewer by creating an instance from this
	 * class. To get all necessary informations this support class consults the
	 * {@link CellLabelProvider}.
	 *
	 * @param viewer
	 *            the viewer the support is attached to
	 * @param style
	 *            style passed to control tool tip behavior
	 *
	 * @param manualActivation
	 *            <code>true</code> if the activation is done manually using
	 *            {@link #show(Point)}
	 */
	protected ColumnViewerToolTipSupport(ColumnViewer viewer, int style,
			boolean manualActivation) {
		super(viewer.getControl(), style, manualActivation);
		this.viewer = viewer;
	}

	/**
	 * Enable ToolTip support for the viewer by creating an instance from this
	 * class. To get all necessary informations this support class consults the
	 * {@link CellLabelProvider}.
	 *
	 * @param viewer
	 *            the viewer the support is attached to
	 */
	public static void enableFor(ColumnViewer viewer) {
		new ColumnViewerToolTipSupport(viewer, ToolTip.NO_RECREATE, false);
	}

	/**
	 * Enable ToolTip support for the viewer by creating an instance from this
	 * class. To get all necessary informations this support class consults the
	 * {@link CellLabelProvider}.
	 *
	 * @param viewer
	 *            the viewer the support is attached to
	 * @param style
	 *            style passed to control tool tip behavior
	 *
	 * @see ToolTip#RECREATE
	 * @see ToolTip#NO_RECREATE
	 */
	public static void enableFor(ColumnViewer viewer, int style) {
		new ColumnViewerToolTipSupport(viewer, style, false);
	}

	protected Object getToolTipArea(Event event) {
		return viewer.getCell(new Point(event.x, event.y));
	}

	/**
	 * Instead of overwriting this method subclasses should overwrite
	 * {@link #createViewerToolTipContentArea(Event, ViewerCell, Composite)}
	 */
	protected Composite createToolTipContentArea(Event event, Composite parent) {
		ViewerCell cell = (ViewerCell) getData(VIEWER_CELL_KEY);
		setData(VIEWER_CELL_KEY, null);

		return createViewerToolTipContentArea(event, cell, parent);
	}

	/**
	 * Creates the content area of the tool tip giving access to the cell the
	 * tip is shown for. Subclasses can overload this method to implement their
	 * own tool tip design.
	 *
	 * <p>
	 * This method is called from
	 * {@link #createToolTipContentArea(Event, Composite)} and by default calls
	 * the {@link DefaultToolTip#createToolTipContentArea(Event, Composite)}.
	 * </p>
	 *
	 * @param event
	 *            the event that which
	 * @param cell
	 *            the cell the tool tip is shown for
	 * @param parent
	 *            the parent of the control to create
	 * @return the control to be displayed in the tool tip area
	 */
	protected Composite createViewerToolTipContentArea(Event event,
			ViewerCell cell, Composite parent) {
		return super.createToolTipContentArea(event, parent);
	}

	protected boolean shouldCreateToolTip(Event event) {
		if (!super.shouldCreateToolTip(event)) {
			return false;
		}

		boolean rv = false;

		ViewerRow row = viewer.getViewerRow(new Point(event.x, event.y));

		viewer.getControl().setToolTipText(""); //$NON-NLS-1$
		Point point = new Point(event.x, event.y);

		if (row != null) {
			Object element = row.getItem().getData();

			ViewerCell cell = row.getCell(point);
			ViewerColumn viewPart = viewer.getViewerColumn(cell
					.getColumnIndex());

			if (viewPart == null) {
				return false;
			}

			CellLabelProvider labelProvider = viewPart.getLabelProvider();
			boolean useNative = labelProvider.useNativeToolTip(element);

			String text = labelProvider.getToolTipText(element);
			Image img = null;

			if (!useNative) {
				img = labelProvider.getToolTipImage(element);
			}

			if (useNative || (text == null && img == null)) {
				viewer.getControl().setToolTipText(text);
				rv = false;
			} else {
				setPopupDelay(labelProvider.getToolTipDisplayDelayTime(element));
				setHideDelay(labelProvider.getToolTipTimeDisplayed(element));

				Point shift = labelProvider.getToolTipShift(element);

				if (shift == null) {
					setShift(new Point(DEFAULT_SHIFT_X, DEFAULT_SHIFT_Y));
				} else {
					setShift(new Point(shift.x, shift.y));
				}

				setData(VIEWER_CELL_KEY, cell);

				setText(text);
				setImage(img);
				setStyle(labelProvider.getToolTipStyle(element));
				setForegroundColor(labelProvider
						.getToolTipForegroundColor(element));
				setBackgroundColor(labelProvider
						.getToolTipBackgroundColor(element));
				setFont(labelProvider.getToolTipFont(element));

				// Check if at least one of the values is set
				rv = getText(event) != null || getImage(event) != null;
			}
		}

		return rv;
	}

	protected void afterHideToolTip(Event event) {
		super.afterHideToolTip(event);
		// Clear the restored value else this could be a source of a leak
		setData(VIEWER_CELL_KEY, null);
		if (event != null && event.widget != viewer.getControl()) {
			viewer.getControl().setFocus();
		}
	}
}
