/* 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.transparency;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.util.ArrayList;

import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import pedviz.algorithms.Highlighter;
import pedviz.algorithms.Sugiyama;
import pedviz.graph.Graph;
import pedviz.graph.Node;
import pedviz.loader.RessourceGraphLoader;
import pedviz.view.DefaultEdgeView;
import pedviz.view.DefaultNodeView;
import pedviz.view.GraphView;
import pedviz.view.GraphView2D;

import pedviz.view.NodeEvent;
import pedviz.view.NodeListener;
import pedviz.view.rules.ColorRule;
import pedviz.view.rules.HighlightedColorRule;
import pedviz.view.rules.ShapeRule;
import pedviz.view.symbols.SymbolDeceased;
import pedviz.view.symbols.SymbolSexFemale;
import pedviz.view.symbols.SymbolSexMale;

public class Transparency extends JApplet {
	private GraphView graphView;

	private Graph graph;

	public void init() {

		graph = new Graph();

		RessourceGraphLoader loader = new RessourceGraphLoader(
				getParameter("datasource"), ",");

		loader.setSettings("PID", "MOM", "DAD");
		loader.load(graph);

		DefaultEdgeView e = new DefaultEdgeView();
		e.setConnectChildren(true);
		e.setColor(new Color(50, 50, 50));
		e.setHighlightedColor(new Color(255, 0, 0));
		e.setGapBottom(5);

		DefaultNodeView n = new DefaultNodeView();
		n.setColor(new Color(255, 255, 255));
		n.setHighlightedColor(new Color(200, 200, 200));
		n.addHintAttribute("pid");
		n.addHintAttribute("mom");
		n.addHintAttribute("dad");

		Sugiyama sugiyama = new Sugiyama(graph, n, e);
		sugiyama.run();

		graphView = new GraphView2D(sugiyama.getLayoutedGraph());
		graphView.addRule(new ShapeRule("sex", "1", new SymbolSexFemale()));
		graphView.addRule(new HighlightedColorRule("sex", "1", new Color(250,
				200, 200)));

		graphView.addRule(new ShapeRule("sex", "2", new SymbolSexMale()));
		graphView.addRule(new HighlightedColorRule("sex", "2", new Color(250,
				200, 200)));

		graphView.addRule(new ShapeRule("dead", "1", new SymbolDeceased()));

		ColorRule colorRule = new ColorRule("adopted", "1", Color.red);
		colorRule.addRule("fam", "1", Color.cyan);
		colorRule.addRule("sex", "1", Color.yellow);
		colorRule.addRule("dead", "1", Color.green);

		graphView.addRule(colorRule);

		graphView.setAlpha(0.2f);

		// set a listener
		graphView.setSelectionEnabled(true);
		graphView.addNodeListener(new NodeListener() {
			public void onNodeEvent(NodeEvent event) {
				switch (event.getType()) {
				case NodeEvent.SELECTED:
					graphView.hideAll();
					graphView.show(event.getNode());
					for (Node _node : event.getNode().getParentsAndChilds()) {
						graphView.show(_node);
					}
					break;
				}
			}
		});

		graphView.hideAll();
		Node selectedNode = graph.getNode(36395);
		if (selectedNode != null) {
			graphView.hideAll();
			graphView.show(selectedNode);
			for (Node _node : selectedNode.getParentsAndChilds())
				graphView.show(_node);

		}
		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 JLabel label = new JLabel("Transparency:");
		label.setHorizontalAlignment(JLabel.RIGHT);

		final JSlider slider = new JSlider(0, 100);
		slider.setValue(20);
		slider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent evt) {
				graphView.setAlpha(slider.getValue() / 100f);
				graphView.updateGraphView();
			}
		});

		toolBar2.add(label);
		toolBar2.add(slider);
		getContentPane().add(toolBar, BorderLayout.PAGE_END);
		getContentPane().add(graphView.getComponent());

	}
}

