/* 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.traits;

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.HashMap;

import javax.swing.JApplet;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;

import pedviz.algorithms.Sugiyama;
import pedviz.graph.Graph;
import pedviz.graph.LayoutedGraph;
import pedviz.loader.RessourceGraphLoader;
import pedviz.view.DefaultEdgeView;
import pedviz.view.DefaultNodeView;
import pedviz.view.GraphView;
import pedviz.view.GraphView2D;
import pedviz.view.NodeView;
import pedviz.view.rules.GradientRule;
import pedviz.view.rules.Rule;
import pedviz.view.rules.ShapeRule;
import pedviz.view.symbols.SymbolQualitativeTrait;
import pedviz.view.symbols.SymbolSexFemale;
import pedviz.view.symbols.SymbolSexMale;
import pedviz.view.symbols.SymbolSexUndesignated;
import pedviz.view.symbols.SymbolText;

public class Traits extends JApplet {
	private GraphView graphView;

	private Graph graph;

	public void init() {

		graph = new Graph();

		RessourceGraphLoader loader = new RessourceGraphLoader(
				getParameter("datasource"), ",");

		// sets columnnames for id, mom-id and dad-id
		loader.setSettings("PID", "MOM", "DAD");
		loader.load(graph);

		DefaultNodeView n = new DefaultNodeView();
		n.setColor(new Color(255, 255, 255));
		n.setBorderColor(new Color(0, 0, 0));
		n.addHintAttribute("Energie");

		DefaultEdgeView e = new DefaultEdgeView();
		e.setColor(new Color(50, 50, 50));
		e.setColorForLongLines(new Color(200, 200, 200));
		e.setGapBottom(5);
		e.setConnectChildren(true);

		Sugiyama sugiyama = new Sugiyama(graph, n, e);
		sugiyama.run();
		LayoutedGraph layoutedGraph = sugiyama.getLayoutedGraph();

		// for 2d:
		graphView = new GraphView2D();
		graphView.addRule(new ShapeRule("sex", "2", new SymbolSexFemale()));
		graphView.addRule(new ShapeRule("sex", "1", new SymbolSexMale()));
		graphView.addRule(new ShapeRule("sex", "-1",
				new SymbolSexUndesignated()));

		final Rule ruleBar = new ShapeRule(new SymbolQualitativeTrait(
				"Energie", 0, 13, 6, 0));
		graphView.addRule(ruleBar);

		HashMap<Double, Color> colors = new HashMap<Double, Color>();
		colors.put(0.0, Color.blue);
		colors.put(6.0, Color.green);
		colors.put(13.0, Color.red);
		final Rule ruleFull = new GradientRule("Energie", colors);
		ruleFull.setMode(Rule.BOTH);
		ruleFull.setEnabled(false);
		graphView.addRule(ruleFull);

		final Rule ruleText = new Rule() {
			@Override
			public void applyRule(NodeView nodeview) {
				if (nodeview.getNode().getUserData("Energie") != null) {
					String energie = nodeview.getNode().getUserData("Energie")
							.toString();
					if (energie != null) {
						SymbolText symbol = new SymbolText(energie);
						symbol.setSize(0.5);
						nodeview.getSymbols().add(symbol);
					}
				}
			}
		};
		ruleText.setEnabled(false);
		graphView.addRule(ruleText);

		graphView.setSelectionEnabled(true);

		graphView.setGraph(layoutedGraph);

		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, 2));
		toolBar2.setBackground(Color.WHITE);

		final String[] data = { "Bar", "Full", "Text" };
		JComboBox dataList = new JComboBox(data);
		dataList.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				JComboBox selectedChoice = (JComboBox) e.getSource();
				if (selectedChoice.getSelectedItem().equals(data[0])) {
					ruleFull.setEnabled(false);
					ruleBar.setEnabled(true);
					ruleText.setEnabled(false);
					graphView.updateRules();
				}
				if (selectedChoice.getSelectedItem().equals(data[1])) {
					ruleFull.setEnabled(true);
					ruleBar.setEnabled(false);
					ruleText.setEnabled(false);
					graphView.updateRules();
				}
				if (selectedChoice.getSelectedItem().equals(data[2])) {
					ruleFull.setEnabled(false);
					ruleBar.setEnabled(false);
					ruleText.setEnabled(true);
					graphView.updateRules();
				}
			}
		});

		toolBar2.add(new JLabel("Style: "), BorderLayout.LINE_END);
		toolBar2.add(dataList, BorderLayout.LINE_END);
		getContentPane().add(toolBar, BorderLayout.PAGE_END);
		getContentPane().add(graphView.getComponent());

	}
}

