/*******************************************************************************
 * Copyright 2005-2006, CHISEL Group, University of Victoria, Victoria, BC,
 * Canada. 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: The Chisel Group, University of Victoria
 ******************************************************************************/
package org.eclipse.zest.core.viewers;

import org.eclipse.draw2d.IFigure;
import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.services.IDisposable;

/**
 * An extension to Label providers for graphs. Gets specific details about the
 * style of an entity before it is created. This style provider offers:
 * 
 * -Background and forground colours -Hilighted and unhighlighted colours
 * (colours defined by selections). -Border color. -Highlighted and
 * unhighlighted colours for borders. -Border width -Font for text inside the
 * entity.
 * 
 * Any method may return null if the Zest defaults are preferred.
 * 
 * NOTE: It is up to the implementors of this interface to dispose of any Colors
 * or Fonts that are created by this class. The dispose() method will be called
 * at the end of the entity's life-cycle so that this class may dispose of its
 * resources.
 * 
 * @author Del Myers
 * @see org.eclipse.jface.viewers.IColorProvider
 * @tag bug(151327-Styles) : created to solve this bug
 */
public interface IEntityStyleProvider extends IDisposable {

	/**
	 * Returns the forground colour of this entity. May return null for
	 * defaults. Any resources created by this class must be disposed by this
	 * class.
	 * 
	 * @param entity
	 *            the entity to be styled.
	 * @return the forground colour of this entity.
	 * @see #dispose()
	 */
	public Color getNodeHighlightColor(Object entity);

	/**
	 * Returns the background colour for this entity. May return null for
	 * defaults. Any resources created by this class must be disposed by this
	 * class.
	 * 
	 * @param entity
	 *            the entity to be styled.
	 * @return the background colour for this entity.
	 * @see #dispose()
	 */
	public Color getBorderColor(Object entity);

	/**
	 * Returns the border highlight colour for this entity. May return null for
	 * defaults. Any resources created by this class must be disposed by this
	 * class.
	 * 
	 * @param entity
	 *            the entity to be styled.
	 * @return the border highlight colour for this entity.
	 * @see #dispose()
	 */
	public Color getBorderHighlightColor(Object entity);

	/**
	 * Returns the border width for this entity. May return -1 for defaults.
	 * 
	 * @param entity
	 *            the entity to be styled.
	 * @return the border width, or -1 for defaults.
	 */
	public int getBorderWidth(Object entity);

	/**
	 * Returns true iff the adjacent entities should be highlighted when this
	 * node is selected. Zest's default action is true.
	 * 
	 * @return true iff the adjacent entities should be highlighted when this
	 *         node is selected.
	 */
	// @tag ADJACENT : Removed highlight adjacent
	//public boolean highlightAdjacentEntities(Object entity);
	/**
	 * Returns the color that adjacent entities will be drawn when this entity
	 * is selected. Will be ignored if HighlightAdjacentEntities() returns
	 * false. May return null for defaults. Any resources created by this class
	 * must be disposed by this class.
	 * 
	 * @param entity
	 *            the entity to be styled.
	 * @return the color for adjacent entities.
	 * @see #highlightAdjacentEntities(Object entity)
	 * @see #dispose()
	 */
	// @tag ADJACENT : Removed highlight adjacent
	//public Color getAdjacentEntityHighlightColor(Object entity);
	/**
	 * Returns the colour that this node should be coloured. This will be
	 * ignored if getNodeColour returns null. Any resources created by this
	 * class must be diposed by this class.
	 * 
	 * @param entity
	 *            The entity to be styled
	 * @return The colour for the node
	 * @see #dispose()
	 */
	public Color getBackgroundColour(Object entity);

	public Color getForegroundColour(Object entity);

	/**
	 * Returns the tooltop for this node. If null is returned Zest will simply
	 * use the default tooltip.
	 * 
	 * @param entity
	 * @return
	 */
	public IFigure getTooltip(Object entity);

	public boolean fisheyeNode(Object entity);

}
