import java.awt.Color;
import javax.swing.JFrame;
import y.base.Edge;
import y.base.Node;
import y.view.Arrow;
import y.view.Graph2D;
import y.view.ShapeNodeRealizer;
import y25.base.LayerEdge;
import y25.graphics.BoundingBox;
import y25.graphics.Point3D;
import y25.view.Graph25D;
import y25.view.Graph25DView;
import y25.view.LayerEdgeRealizer25D;
import y25.view.ViewMode25D;
import y25.view.realizer.PolyLineEdgeRealizer25D;
import y25.view.realizer.PolyLineLayerEdgeRealizer25D;
import y25.view.realizer.ShapeNodeRealizer25D;
import y25.view.realizer.TransparentLayerRealizer25D;
import y25.view.viewmodes.NavigationMode25D;

public class Y25Test {

	public static void main(String[] args) {
		new Y25Test();
	}

	public Y25Test() {
	
		//   S E T   U P   A   G R A P H   V I E W
		
		// Create a new Frame
		JFrame frame = new JFrame("Y25Test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize( 600, 600 );
			
		// Create a new Graph25DView and set the view mode
		Graph25DView view25d = new Graph25DView();
		ViewMode25D navigationMode = new NavigationMode25D();
		view25d.addViewMode25D(navigationMode);
		view25d.getCamera().setRotation(-90,0,0); // view from top
		view25d.getCamera().setPerspective(30);
		
		// Add the view to the frame
		frame.getContentPane().add(view25d.getGLCanvas());
		
		// Show the frame
		frame.setVisible(true);
		
		
		
		//   C R E A T E   A   S A M P L E   G R A P H 
		
		// Create a Graph25D
		Graph25D graph25d = new Graph25D();
		
		
		// a --- SET DEFAULT APPEARANCE OF NODES/EDGES/LAYEREDGES/LAYERS
		
		// Set default visual appearance of nodes
		ShapeNodeRealizer25D snr = new ShapeNodeRealizer25D();
		snr.setShapeType(ShapeNodeRealizer.ELLIPSE);
		snr.setHeight(30);
		snr.setWidth(30);
		snr.setDepth(30);
		graph25d.setDefaultNodeRealizer25D(snr);

		// Set default visual appearance of edges
		PolyLineEdgeRealizer25D er = new PolyLineEdgeRealizer25D();
	    er.setArrow(Arrow.STANDARD);
	    er.setLineDisplayMode(PolyLineEdgeRealizer25D.MODE_2D);
	    er.setLineColor(new Color(0,200,0));
	    graph25d.setDefaultEdgeRealizer25D(er);
		
		// Set default visual appearance of layer edges
		LayerEdgeRealizer25D ler = new PolyLineLayerEdgeRealizer25D();
		ler.setArrow(Arrow.STANDARD);
		ler.setLineColor(new Color(255,0,0));
		graph25d.setDefaultLayerEdgeRealizer25D(ler);
		
		// Set default visual appearance of layers
		TransparentLayerRealizer25D lr = new TransparentLayerRealizer25D();
	    lr.setRelativeBoundingBox(new BoundingBox(new Point3D(-200,-200,0), new Point3D(200,200,0) ));
		lr.setOpacity(0.4f);
		lr.setRGB(250,250,250);
		lr.setZ(0);
		graph25d.setDefaultLayerRealizer25D(lr);
		

		// b --- BUILD THE GRAPH
		
		// Create first layer with some nodes and edges
		Graph2D graph1 = (Graph2D) graph25d.createGraph();
		Node n1 = graph1.createNode(0,0);
		Node n2 = graph1.createNode(100,0);
		Node n3 = graph1.createNode(0,100);
		Edge e1 = graph1.createEdge(n1,n2);
		Edge e2 = graph1.createEdge(n1,n3);
		
		// Create a second layer
		Graph2D graph2 = (Graph2D) graph25d.createGraph();
		Node n4 = graph2.createNode(0,0);
		Node n5 = graph2.createNode(-100,-100);
		Edge e3 = graph2.createEdge(n4,n5);
		
		// Set heights of layers
		graph25d.setZ(graph1, 0);
		graph25d.setZ(graph2, 100);

		// Create some layer edges
		LayerEdge le1 = graph25d.createLayerEdge(n1,n4);
		LayerEdge le2 = graph25d.createLayerEdge(n5,n1);
		
		
		
		// c --- DISPLAY THE GRAPH
		
		view25d.setGraph25D(graph25d);
	}
}