/*******************************************************************************
 * 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.internal;

import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphConnection;
import org.eclipse.zest.core.widgets.GraphItem;
import org.eclipse.zest.core.widgets.GraphNode;

/**
 * A Graph model factory that supports the structural and visual refreshing of
 * graph elements based on the content provider and label provider in the viewer
 * that this factory is associated with. Model elements are created using the
 * content provider supplied by getContentProvider(), and styled using the label
 * provider supplied by getLabelProvider(). By the end of creation and
 * refreshing, the graph model elements are expected to be styled according to
 * the given label provider, however, default styles are dependant on the
 * particular implementation of IStylingGraphModelFactory. Unless otherwise
 * documented, clients should expect that the implementation of
 * IStylingGraphModelFactory adheres to the general defaults found in
 * {@link IZestGraphDefaults}.
 * 
 * @author Del Myers
 */

public interface IStylingGraphModelFactory {
	/**
	 * Returns the label provider used in this factory.
	 * 
	 * @return the label provider used in this factory.
	 */
	public IBaseLabelProvider getLabelProvider();

	/**
	 * Returns the content provider used in this factory.
	 * 
	 * @return the content provider used in this factory.
	 */
	public IStructuredContentProvider getContentProvider();

	/**
	 * Creates and returns the graph model from this factory based on the label
	 * provider and the label provider returned in getContentProvider() and
	 * getLabelProvider().
	 * 
	 * @return the created graph model.
	 */
	public Graph createGraphModel(Graph model);

	/**
	 * Creates and returns a node on the given graph based on the user model
	 * data, "data", using the content provider returned by
	 * getContentProvider(). They node will also be styled according to the
	 * information given by the label provider. If the node already exists in
	 * the graph, it is restyled and returned; no new node is created.
	 * 
	 * @param graph
	 *            the graph to create or retrieve the node on.
	 * @param element
	 *            the user model data to use in the node.
	 * @return the node created or retrieved for the given graph.
	 */
	public GraphNode createNode(Graph graph, Object element);

	/**
	 * Creates and returns a connection with the given source and destination
	 * objects from the user model. If the source and destination nodes don't
	 * exist for the given user model objects, they are created using
	 * createNode(GraphModel, Object). If a connection already exists for the
	 * given user data, but with different source or destinations, it is
	 * disconnected and reconnected to the given source and destination. It is
	 * always styled according to the label provider provided by
	 * getLabelProvider().
	 * 
	 * @param graph
	 *            the graph to create or retrieve the connection on.
	 * @param element
	 *            the user model data to use in this connection.
	 * @param source
	 *            the user model data used for the source node.
	 * @param dest
	 *            the user model data used for the destination node.
	 * @return the created or retrieved connection for the given graph.
	 */
	public GraphConnection createConnection(Graph graph, Object element, Object source, Object dest);

	/**
	 * Restyles the given graph items according to the label provider supplied
	 * by getLabelProvider().
	 * 
	 * @param items
	 *            the items to update.
	 */
	public void update(GraphItem[] items);

	/**
	 * Restyles the given graph item according to the label provider supplied by
	 * getLabelProvider().
	 * 
	 * @param item
	 *            the item to update.
	 */
	public void update(GraphItem item);

	/**
	 * Structurally refreshes the graph model nodes and connections associated
	 * with the given user model element. Does nothing if the element does not
	 * currently exist in the view. No restyling is done by default.
	 * 
	 * @param graph
	 * @param element
	 *            the element to restructure.
	 */
	public void refresh(Graph graph, Object element);

	/**
	 * Structurally refreshes the graph model nodes and connections associated
	 * with the given user model element. If updateLabels is true, then the
	 * labels are updated as well. Does nothing if the element does not
	 * currently exist in the view.
	 * 
	 * @param graph
	 *            the graph to find the element on.
	 * @param element
	 *            the user model element.
	 * @param updateLabels
	 *            true if the labels should be updated as well.
	 */
	public void refresh(Graph graph, Object element, boolean updateLabels);

	/**
	 * Structurally refreshes the entire graph.
	 * 
	 * @param graph
	 *            the graph to refresh;
	 */
	public void refreshGraph(Graph graph);

	/**
	 * Returns the viewer that this factory is building the model for.
	 * 
	 * @return the viewer that this factory is building the model for.
	 */
	public StructuredViewer getViewer();

	public void setConnectionStyle(int style);

	/**
	 * @return the connectionStyle
	 */
	public int getConnectionStyle();

	public void setNodeStyle(int style);

	/**
	 * @return the nodeStyle
	 */
	public int getNodeStyle();

}
