/* Copyright © 2007 by Christian Fuchsberger and Lukas Forer info@pedvizapi.org.
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License <http://www.pedvizapi.org/gpl.txt>
 * for more details. 
 */

package applets.example3d;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;

import javax.swing.JApplet;
import javax.swing.JCheckBox;
import javax.swing.JPanel;

import pedviz.algorithms.Highlighter;
import pedviz.algorithms.Sugiyama;
import pedviz.algorithms.sugiyama.RandomSplitter;
import pedviz.graph.Graph;
import pedviz.graph.Node;
import pedviz.loader.RessourceGraphLoader;
import pedviz.view.DefaultEdgeView;
import pedviz.view.DefaultNodeView;
import pedviz.view.GraphView3D;
import pedviz.view.NodeEvent;
import pedviz.view.NodeListener;
import pedviz.view.rules.ColorRule;
import pedviz.view.rules.PositionZRule;
import pedviz.view.rules.ShapeRule;
import pedviz.view.symbols3d.SymbolSexFemale3d;
import pedviz.view.symbols3d.SymbolSexMale3d;
import pedviz.view.symbols3d.SymbolSexUndesignated3d;

import com.sun.j3d.utils.universe.SimpleUniverse;

public class Example3D extends JApplet {

	private GraphView3D graphView;

	private Graph graph;

	private ColorRule colorRule;

	public void init() {

		graph = new Graph();

		String file = getParameter("datasource");
		RessourceGraphLoader loader = new RessourceGraphLoader(file, ",");
		loader.setSettings("PID", "MOM", "DAD");
		loader.load(graph);

		DefaultEdgeView e = new DefaultEdgeView();
		e.setWidth(0.005f);

		DefaultNodeView n = new DefaultNodeView();
		n.addHintAttribute("pid");
		n.addHintAttribute("mom");
		n.addHintAttribute("dad");

		Sugiyama s = new Sugiyama(graph, n, e, new RandomSplitter());
		s.run();

		graphView = new GraphView3D(s.getLayoutedGraph());
		graphView.setSelectionEnabled(true);
		graphView.setMultiselection(true);
		graphView.setBackgroundColor(new Color(0, 0, 0));

		graphView.addRule(new ShapeRule("SEX", "1", new SymbolSexFemale3d(2)));
		graphView.addRule(new ShapeRule("SEX", "2", new SymbolSexMale3d(2)));
		graphView.addRule(new ShapeRule("SEX", "-1",
				new SymbolSexUndesignated3d(2)));
		graphView.addRule(new PositionZRule(s.getRubberBands().getDepth() / 2f,
				new Color(255, 200, 100)));

		graphView.addNodeListener(new NodeListener() {

			public void onNodeEvent(NodeEvent event) {
				switch (event.getType()) {
				case NodeEvent.MOUSE_ENTER:
					graphView.unHighlightAll();
					ArrayList<Node> nodes = Highlighter
							.findParentsAndChilds(event.getNode());
					graphView.highlight(nodes);
					break;
				case NodeEvent.MOUSE_LEAVE:
					graphView.unHighlightAll();
					break;
				}
			}
		});

		colorRule = new ColorRule("dead", "1", Color.green);
		colorRule.addRule("fam", "1", Color.cyan);
		graphView.addRule(colorRule);

		JPanel toolBar = new JPanel();
		toolBar.setLayout(new BorderLayout());
		toolBar.setBackground(Color.WHITE);
		JPanel toolBar2 = new JPanel();
		toolBar.add(toolBar2, BorderLayout.LINE_END);
		toolBar2.setLayout(new GridLayout(1, 3));
		toolBar2.setBackground(Color.WHITE);

		final JCheckBox trait1 = new JCheckBox("Trait 1", true);
		trait1.setBackground(Color.GREEN);
		trait1.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				colorRule.setEnabled(0, trait1.isSelected());
				graphView.updateRules();
			}
		});

		final JCheckBox trait2 = new JCheckBox("Trait 2", true);
		trait2.setBackground(Color.cyan);
		trait2.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				colorRule.setEnabled(1, trait2.isSelected());
				graphView.updateRules();
			}
		});

		toolBar2.add(trait1, BorderLayout.LINE_END);
		toolBar2.add(trait2, BorderLayout.LINE_END);
		getContentPane().add(toolBar, BorderLayout.PAGE_END);
		getContentPane().add(graphView.getComponent());

	}
}

