package applets.haplotype;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.Rectangle2D.Float;
import java.util.Vector;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import pedviz.algorithms.Sugiyama;
import pedviz.graph.Graph;
import pedviz.graph.Node;
import pedviz.haplotype.*;
import pedviz.loader.*;
import pedviz.view.DefaultEdgeView;
import pedviz.view.DefaultNodeView;
import pedviz.view.GraphView2D;
import pedviz.view.NodeView;
import pedviz.view.rules.*;
import pedviz.view.symbols.*;

public class Haplotype extends JApplet {

	private static MerlinHaplotypes haplotypes;

	private static JList list;

	private static Sugiyama s;

	private static GraphView2D view;

	public void init() {

		// Step 1
		Graph graph = new Graph();
		RessourceGraphLoader loader = new RessourceGraphLoader(
				getParameter("datasource"), " ");
		loader.setSettings("Id", "MOM", "DAD");
		loader.load(graph);

		// Step 2 - register symbol
		DefaultNodeView nodeview = new DefaultNodeView();
		haplotypes = new MerlinHaplotypes("/luki_error.chr", "/luki_error.map",
				true);
		MerlinErrorChecking merlinErrorChecking = new MerlinErrorChecking(
				"/luki_error.err", true);

		haplotypes.setErrors(merlinErrorChecking.getErrors());
		nodeview.addSymbol(new SymbolHaplotypes(haplotypes));

		nodeview.addHintAttribute("Id");
		nodeview.addHintAttribute("Sex");
		nodeview.addHintAttribute("Mom");
		nodeview.addHintAttribute("Dad");
		nodeview.setColor(Color.WHITE);

		// In the current version of the pedvizapi you must adapt the spacing
		// between the nodes by hand.
		DefaultEdgeView edgeview = new DefaultEdgeView();
		// edgeview.setGapTop(20);

		s = new Sugiyama(graph, nodeview, edgeview);
		s.getRubberBands().setHorizontalGap(10);
		s.run();

		// Creates a frame
		// Step 3
		view = new GraphView2D(s.getLayoutedGraph());
		getContentPane().add(view.getComponent());

		list = new JList();
		ListModel model = new DefaultComboBoxModel(haplotypes.getMarkers());
		list.setModel(model);

		list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

		getContentPane().add(new JScrollPane(list), BorderLayout.EAST);

		JButton button = new JButton("Update");
		button.addActionListener(new ActionListener() {

			// @Override
			public void actionPerformed(ActionEvent arg0) {
				haplotypes.hideAllMarkers();
				for (Integer i : list.getSelectedIndices()) {
					haplotypes.showMarker(i);
				}
				s.getRubberBands().updateYPosition();
				view.centerGraph();
				view.updateGraphView();
			}

		});

		getContentPane().add(button, BorderLayout.SOUTH);

		// Step 4
		view.addRule(new ShapeRule("sex", "1", new SymbolSexMale()));
		view.addRule(new ShapeRule("sex", "2", new SymbolSexFemale()));
		view.addRule(new ColorRule("aff", "2", Color.BLACK));

	}

}

