/*******************************************************************************
 * Copyright (c) 2005 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.draw2d.examples.graph;

import java.lang.reflect.Method;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.ConnectionLocator;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.Panel;
import org.eclipse.draw2d.PolygonDecoration;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.XYAnchor;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.graph.DirectedGraph;
import org.eclipse.draw2d.graph.Edge;
import org.eclipse.draw2d.graph.Node;

/**
 * @author hudsonr
 * @since 2.1
 */
public class DirectedGraphDemo
	extends AbstractGraphDemo
{

/**
 * Builds the graph, creates Draw2d figures for all graph components.
 * @param graph the graph to build
 * @return the Figure representing the graph
 */
public static Figure buildGraph(DirectedGraph graph) {
	Figure contents = new Panel();
		
//	contents.setFont(new Font(null, "Tahoma", 10, 0));
	contents.setBackgroundColor(ColorConstants.white);
	contents.setLayoutManager(new XYLayout());
	
	for (int i = 0; i < graph.nodes.size(); i++) {
		Node node = graph.nodes.getNode(i);
		buildNodeFigure(contents, node);
	}
	
	for (int i = 0; i < graph.edges.size(); i++) {
		Edge edge = graph.edges.getEdge(i);
		buildEdgeFigure(contents, edge);
	}
//	if (buildPrime)
//		buildPrimeGraph(graph.gPrime, contents);
	return contents;
}

///**
// * Builds the prime graph, creates Draw2d figures for all prime graph components.
// * @param graph the graph to build the prime graph on top of
// * @param panel the Figure containing the Draw2d graph representation
// */
//public static void buildPrimeGraph(DirectedGraph graph, Figure panel) {
//	for (int i = 0; i < graph.edges.size(); i++) {
//		Edge e = graph.edges.getEdge(i);
//		PolylineConnection line = new PolylineConnection();
//
//		if (e.tree) {
//			PolygonDecoration dec = new PolygonDecoration();
//			dec.setLineWidth(2);
////			if (e.head() == e.target)
////				line.setSourceDecoration(dec);
////			else
////				line.setTargetDecoration(dec);
//
//			line.setLineWidth(3);
//			Label l = new Label (e.cut + "," + e.getSlack());
//			l.setOpaque(true);
//			line.add(l, new ConnectionLocator(line));
//		} else {
//			line.setLineStyle(Graphics.LINE_DOT);
////			Label l = new Label ("("+e.getSlack()+")");
////			l.setOpaque(true);
////			line.add(l, new ConnectionLocator(line));
//		}
//		panel.add(line);
//		Node n1;
//		Node n2 = (Node)e.target.data;
//		if (e.source.data instanceof NodePair) {
//			NodePair pair = (NodePair)e.source.data;
//			n1 = pair.n1;
//			if (n1 == n2)
//				n1 = pair.n2;
//		} else {
//			n1 = (Node)e.source.data;
//		}
//		ConnectionAnchor sa, ta;
//		sa = new XYAnchor(new Point(n1.x, n1.y + 20));
//		ta = new XYAnchor(new Point(n2.x, n2.y + 20));
//		if (n1.rank == n2.rank) {
//			if (n1.data instanceof Figure)
//				sa = new TopOrBottomAnchor((Figure)n1.data);
//			if (n2.data instanceof Figure)
//				ta = new TopOrBottomAnchor((Figure)n2.data);
//		} else {
//			sa =
//				new XYAnchor(
//					new Point((n1.x + n2.x) / 2 - 15, (n1.y + n2.y) / 2 + 20));
//			if (n2.data instanceof Figure)
//				ta = new TopOrBottomAnchor((Figure)n2.data);
//		}
//		line.setSourceAnchor(sa);
//		line.setTargetAnchor(ta);
//	}
//}

/**
 * Runs this demo
 * @param args command line args
 */
public static void main(String[] args) {
	new DirectedGraphDemo().run();
}

/**
 * @see org.eclipse.graph.demo.GraphDemo#getGraphMethods()
 */
protected String[] getGraphMethods() {
	Method[] methods = GraphTests.class.getMethods();
	String[] methodNames = new String[methods.length];
	
	int nameIndex = 0;
	for (int i = 0; i < methods.length; i++) {
		if (methods[i].getReturnType().equals(DirectedGraph.class)) {
			methodNames[nameIndex] = methods[i].getName();
			nameIndex++;
		}
	}
	return methodNames;
}

/**
 * @see org.eclipse.draw2d.examples.AbstractExample#getContents()
 */
protected IFigure getContents() {
	DirectedGraph graph = null;
	try {
		graph =
			(DirectedGraph) (GraphTests
				.class
				.getMethod(graphMethod, null)
				.invoke(null, null));
	} catch (Exception e) {
		System.out.println("Could not build graph");
		e.printStackTrace();
	}
	Figure contents = buildGraph(graph);
	return contents;
}

}
