/* 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.abstr;

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.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;

import pedviz.algorithms.HierarchieUpDown;
import pedviz.algorithms.*;
import pedviz.algorithms.SameParents;
import pedviz.algorithms.sugiyama.SugiyamaLayout;
import pedviz.graph.Graph;
import pedviz.graph.Hierarchy;
import pedviz.graph.LayoutedGraph;
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.rules.AbstractionRule;
import pedviz.view.rules.ColorRule;
import pedviz.view.rules.ShapeRule;
import pedviz.view.symbols.SymbolAdopted;
import pedviz.view.symbols.SymbolDeceased;
import pedviz.view.symbols.SymbolSexFemale;
import pedviz.view.symbols.SymbolSexMale;
import pedviz.view.symbols.SymbolSexUndesignated;

public class Abstr extends JApplet {
	private GraphView graphView;

	private Graph graph;

	private AbstractionRule abstr;

	private String[] data = { "no caption", "total", "male | female" };

	public void init() {

		graph = new Graph();

		String file = getParameter("datasource");
		RessourceGraphLoader loader = new RessourceGraphLoader(file, ",");
		loader.setSettings("PID", "MOM", "DAD");
		loader.load(graph);

		DefaultNodeView d = new DefaultNodeView();
		d.setColor(new Color(255, 255, 255));
		d.addHintAttribute("pid");
		d.addHintAttribute("sex");

		SameParents sameParents = new SameParents(graph);
		sameParents.run();

		graph.buildHierarchie(new HierarchieUpDown());

		// runs sugiyama
		SugiyamaLayout l = new SugiyamaLayout(graph, d, new DefaultEdgeView());
		l.run();

		// Add flag
		for (Node node : graph.getAllNodes()) {
			if (node.getLevel() < 2) {
				l.getLayoutGraph().getNodeView(node).setExpand(false);
			}
		}

		// RubberBands2 ingores nodes with flag="1"
		RubberBands rubberBands = new RubberBands(l.getLayoutGraph());
		rubberBands.run();

		// for 2d:
		graphView = new GraphView2D(l.getLayoutGraph());
		graphView.setBackgroundColor(new Color(255, 255, 255));

		// color rules
		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);

		// symbols
		graphView.addRule(new ShapeRule("sex", "2", new SymbolSexMale()));
		graphView.addRule(new ShapeRule("sex", "1", new SymbolSexFemale()));
		graphView.addRule(new ShapeRule("dead", "1", new SymbolDeceased()));
		graphView.addRule(new ShapeRule("adopted", "1", new SymbolAdopted()));

		// draws abstract nodes
		abstr = new AbstractionRule();
		graphView.addRule(abstr);

		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);

		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])) {
					abstr.setSymbolMode(AbstractionRule.NONE);
				}
				if (selectedChoice.getSelectedItem().equals(data[1])) {
					abstr.setSymbolMode(AbstractionRule.NUMBER);
				}
				if (selectedChoice.getSelectedItem().equals(data[2])) {
					abstr.setSymbolMode(AbstractionRule.NUMBER_2);
				}
				graphView.updateRules();
			}
		});

		JLabel caption = new JLabel("Caption: ");
		caption.setHorizontalAlignment(JLabel.RIGHT);
		toolBar2.add(caption, BorderLayout.LINE_END);
		toolBar2.add(dataList, BorderLayout.LINE_END);
		getContentPane().add(toolBar, BorderLayout.PAGE_END);
		getContentPane().add(graphView.getComponent());
	}

}

