/* 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.splitting;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.ButtonGroup;
import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

import pedviz.algorithms.Sugiyama;
import pedviz.algorithms.sugiyama.RandomSplitter;
import pedviz.algorithms.sugiyama.SicknessSplitter;
import pedviz.graph.Graph;
import pedviz.loader.RessourceGraphLoader;
import pedviz.view.DefaultEdgeView;
import pedviz.view.DefaultNodeView;
import pedviz.view.GraphView;
import pedviz.view.GraphView3D;
import pedviz.view.rules.ColorRule;
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 Splitting extends JApplet {
	private GraphView3D graphView;

	private Graph graph;

	private RessourceGraphLoader loader;

	private void updateLayout(String trait, String value) {
		graph = new Graph();
		loader.load(graph);

		DefaultEdgeView e = new DefaultEdgeView();
		e.setWidth(0.00005f);
		e.setAlphaForLongLines(0.7f);
		e.setColorForLongLines(Color.DARK_GRAY);
		e.setColor(Color.WHITE);

		DefaultNodeView n = new DefaultNodeView();
		n.setHighlightedColor(Color.green);
		n.addHintAttribute("trait1");
		n.addHintAttribute("trait2");
		n.addHintAttribute("trait3");

		Sugiyama sugiyama = new Sugiyama(graph, n, e);
		sugiyama.getRubberBands().setDepth(200);
		sugiyama.getRubberBands().setVerticalSpacing(100);
		if (trait == null)
			sugiyama.getLayout().setSplitter(new RandomSplitter());
		else
			sugiyama.getLayout().setSplitter(
					new SicknessSplitter(new String[] { trait },
							new String[] { value }));
		sugiyama.run();
		graphView.setAntialiasingEnabled(true);
		graphView.setTransparencyEnabled(true);
		graphView.setSelectionEnabled(true);
		graphView.setGraph(sugiyama.getLayoutedGraph());
	}

	public void init() {
		graph = new Graph();

		loader = new RessourceGraphLoader(getParameter("datasource"), ",");
		loader.setSettings("PID", "MOM", "DAD");

		graphView = new GraphView3D(SimpleUniverse.getPreferredConfiguration());
		graphView.setBackgroundColor(new Color(0, 0, 0));

		graphView.addRule(new ShapeRule("sex", "2", new SymbolSexFemale3d()));
		graphView.addRule(new ShapeRule("sex", "1", new SymbolSexMale3d()));
		graphView.addRule(new ShapeRule("sex", "-1",
				new SymbolSexUndesignated3d()));
		ColorRule colorRule1 = new ColorRule("trait1", "yes", Color.green);
		ColorRule colorRule2 = new ColorRule("trait2", "yes", Color.cyan);
		ColorRule colorRule3 = new ColorRule("trait3", "yes", Color.yellow);
		graphView.addRule(colorRule1);
		graphView.addRule(colorRule2);
		graphView.addRule(colorRule3);

		updateLayout(null, null);

		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, 5));
		toolBar2.setBackground(Color.WHITE);

		JLabel caption = new JLabel("split data based on: ");

		ButtonGroup bg = new ButtonGroup();
		JRadioButton trait1 = new JRadioButton("Trait 1");
		trait1.setBackground(Color.GREEN);
		trait1.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				updateLayout("trait1", "yes");
			}
		});

		JRadioButton trait2 = new JRadioButton("Trait 2");
		trait2.setBackground(Color.cyan);
		trait2.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				updateLayout("trait2", "yes");
			}
		});

		JRadioButton trait3 = new JRadioButton("Trait 3");
		trait3.setBackground(Color.yellow);
		trait3.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				updateLayout("trait3", "yes");
			}
		});

		JRadioButton random = new JRadioButton("random");
		random.setBackground(Color.lightGray);
		random.setSelected(true);
		random.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				updateLayout(null, null);
			}
		});

		bg.add(trait1);
		bg.add(trait2);
		bg.add(trait3);
		bg.add(random);

		caption.setHorizontalAlignment(JLabel.RIGHT);
		toolBar2.add(caption, BorderLayout.LINE_END);
		toolBar2.add(trait1, BorderLayout.LINE_END);
		toolBar2.add(trait2, BorderLayout.LINE_END);
		toolBar2.add(trait3, BorderLayout.LINE_END);
		toolBar2.add(random, BorderLayout.LINE_END);
		getContentPane().add(toolBar, BorderLayout.PAGE_END);

		getContentPane().add(graphView.getComponent());
		graphView.centerGraph();
	}
}

