/*******************************************************************************
 * Copyright 2005, 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.widgets;

import org.eclipse.draw2d.IFigure;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Widget;

/**
 * Provides support for property changes. All model elements extend this class.
 * Also extends the Item (Widget) class to be used inside a StructuredViewer.
 * 
 * @author Chris Callendar
 */
public abstract class GraphItem extends Item {

	public static final int GRAPH = 0;
	public static final int NODE = 1;
	public static final int CONNECTION = 2;
	public static final int CONTAINER = 3;

	/**
	 * @param parent
	 * @param style
	 */
	public GraphItem(Widget parent, int style) {
		this(parent, style | SWT.NO_BACKGROUND, null);
	}

	/**
	 * @param parent
	 * @param style
	 */
	public GraphItem(Widget parent, int style, Object data) {
		super(parent, style | SWT.NO_BACKGROUND);
		if (data != null) {
			this.setData(data);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.swt.widgets.Widget#dispose()
	 */
	public void dispose() {
		// @tag zest.bug.167132-ListenerDispose : remove all listeners.
		// pcsDelegate = new PropertyChangeSupport(this);
		super.dispose();
	}

	/**
	 * Gets the graph item type. The item type is one of: GRAPH, NODE or
	 * CONNECTION
	 * 
	 * @return
	 */
	public abstract int getItemType();

	/**
	 * Set the visibility of this item.
	 * 
	 * @param visible
	 *            whether or not this item is visible.
	 */
	public abstract void setVisible(boolean visible);

	/**
	 * Get the visibility of this item.
	 * 
	 * @return the visibility of this item.
	 */
	public abstract boolean isVisible();

	/**
	 * Gets the graph that this item is rooted on. If this item is itself a
	 * graph, then this is returned.
	 * 
	 * @return the parent graph.
	 */
	public abstract Graph getGraphModel();

	/**
	 * Highlights the current GraphItem.  A graph item is either a graph node or 
	 * graph connection, and highlighting them will set the appropriate highlight
	 * color.
	 */
	public abstract void highlight();

	/**
	 * Unhighlight sets the graphItem (either a graphNode or graphConnection) back
	 * to the unhighlight figure or color.
	 */
	public abstract void unhighlight();

	abstract IFigure getFigure();

	/**
	 * Checks a style to see if it is set on the given graph item
	 * @param styleToCheck The style to check
	 * @return
	 */
	protected boolean checkStyle(int styleToCheck) {
		return ((getStyle() & styleToCheck) > 0);
	}
}
