////////////////////////////////////////////////////////////////
// LineChartDemo.java
//
// Copyright (C) 1998, 1999 by ObjectPlanet AS
// All rights reserved. 
// Confidential, unpublished property of ObjectPlanet AS
////////////////////////////////////////////////////////////////

package com.objectplanet.chart.demo;

import com.objectplanet.chart.*;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;


/**
 * This tests the line chart component.
 *
 * @author Bjorn J. Kvande.
 */
public class LineChartDemo extends Applet {

	// The line chart
	private LineChart chart;
	
	// The currently selected sample
	private ChartSample selectedSample;
	
	// the number of decimals in the range values
	private int rangeDecimalCount;
	
	// The application frame of the chart
	private Frame parentFrame;

	// The control panel gui components
	private TextField titleField;
	private TextField upperRangeField;
	private TextField lowerRangeField;
	private TextField decimalField;
	private Checkbox titleCheck;
	private Checkbox legendCheck;
	private Checkbox valueLinesCheck;
	private Checkbox adjusterCheck;
	private Checkbox sampleLabelsCheck;
	private Checkbox frameCheck;
	private Choice legendPositionChoice;
	private Choice colorChoice;
	private Button printButton;


// construction


	/**
	 * Called when the applet is created.
	 */
	public void init() {
		setBackground(Color.lightGray);
		setLayout(new BorderLayout(5,5));
		this.parentFrame = parentFrame;
		
		chart = new LineChart(4, 12, 1000);
		chart.setTitle("Fruit sales 1999");
		double[] samples1 = new double[] {200, 300, 100, 400, 600, 500, 1000, 800, 700, 900, 850, 800};
		double[] samples2 = new double[] {500, 200, 500, 300, 700, 300, 800, 900, 700, 600, 650, 700};
		double[] samples3 = new double[] {100, 300, 900, 600, 500, 400, 300, 200, 100, 200, 150, 50};
		double[] samples4 = new double[] {600, 700, 900, 800, 400, 700, 400, 500, 300, 500, 200, 150};
		chart.setSampleValues(0, samples1);
		chart.setSampleValues(1, samples2);
		chart.setSampleValues(2, samples3);
		chart.setSampleValues(3, samples4);
		chart.setSeriesLabel(0, "Apples");
		chart.setSeriesLabel(1, "Oranges");
		chart.setSeriesLabel(2, "Bananas");
		chart.setSeriesLabel(3, "Melons");
		String[] labels = new String[] {"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};
		chart.setSampleLabels(labels);
		
		// create the control panel components
		titleField = new TextField(chart.getTitle());
		upperRangeField = new TextField(chart.getRange()+"");
		lowerRangeField = new TextField(chart.getLowerRange()+"");
		decimalField = new TextField("0");
		titleCheck = new Checkbox();
		legendCheck = new Checkbox();
		valueLinesCheck = new Checkbox();
		adjusterCheck = new Checkbox();
		sampleLabelsCheck = new Checkbox();
		frameCheck = new Checkbox();
		
		legendPositionChoice = new Choice();
		legendPositionChoice.add("Right");
		legendPositionChoice.add("Left");
		legendPositionChoice.add("Top");
		legendPositionChoice.add("Bottom");
		legendPositionChoice.select("Right");
		legendPositionChoice.setEnabled(false);

		colorChoice = new Choice();
		colorChoice.add("black");
		colorChoice.add("blue");
		colorChoice.add("cyan");
		colorChoice.add("darkGray");
		colorChoice.add("gray");
		colorChoice.add("green");
		colorChoice.add("lightGray");
		colorChoice.add("magenta");
		colorChoice.add("orange");
		colorChoice.add("pink");
		colorChoice.add("red");
		colorChoice.add("white");
		colorChoice.add("yellow");
		colorChoice.select("red");

		printButton = new Button("Print");

		// create the control panel and add in the components
		Panel controlPanel = new Panel();
		controlPanel.setLayout(new GridLayout(0,2,5,0));
		controlPanel.add(new Label("Title on", Label.RIGHT));
		controlPanel.add(titleCheck);
		controlPanel.add(new Label("Title", Label.RIGHT));
		controlPanel.add(titleField);
		controlPanel.add(new Label("Upper range", Label.RIGHT));
		controlPanel.add(upperRangeField);
		controlPanel.add(new Label("Lower range", Label.RIGHT));
		controlPanel.add(lowerRangeField);
		controlPanel.add(new Label("Range decimals", Label.RIGHT));
		controlPanel.add(decimalField);
		controlPanel.add(new Label("Series color", Label.RIGHT));
		controlPanel.add(colorChoice);
		controlPanel.add(new Label("Legend", Label.RIGHT));
		controlPanel.add(legendCheck);
		controlPanel.add(new Label("Legend position", Label.RIGHT));
		controlPanel.add(legendPositionChoice);
		controlPanel.add(new Label("Range adjuster", Label.RIGHT));
		controlPanel.add(adjusterCheck);
		controlPanel.add(new Label("Value lines", Label.RIGHT));
		controlPanel.add(valueLinesCheck);
		controlPanel.add(new Label("Sample labels", Label.RIGHT));
		controlPanel.add(sampleLabelsCheck);
		controlPanel.add(new Label("Frame", Label.RIGHT));
		controlPanel.add(frameCheck);
		controlPanel.add(new Panel());
		controlPanel.add(printButton);

		// create the event handler
		EventHandler eventHandler = new EventHandler();
		chart.addItemListener(eventHandler);
		titleField.addActionListener(eventHandler);
		upperRangeField.addActionListener(eventHandler);
		lowerRangeField.addActionListener(eventHandler);
		titleCheck.addItemListener(eventHandler);
		legendCheck.addItemListener(eventHandler);
		valueLinesCheck.addItemListener(eventHandler);
		legendPositionChoice.addItemListener(eventHandler);
		adjusterCheck.addItemListener(eventHandler);
		sampleLabelsCheck.addItemListener(eventHandler);
		colorChoice.addItemListener(eventHandler);
		frameCheck.addItemListener(eventHandler);
		decimalField.addActionListener(eventHandler);
		printButton.addActionListener(eventHandler);

		Panel p = new NonFlickerPanel(new BorderLayout());
		p.add("Center", chart);
		add("Center", p);
		add("East", controlPanel);
	}


	/**
	 * Sets the parent frame, used for printing.
	 * @param frame The application parent frame.
	 */
	public void setParentFrame(Frame frame) {
		this.parentFrame = frame;
	}


// event handling


	class EventHandler implements ItemListener, ActionListener {
		public void itemStateChanged(ItemEvent e) {
			Object source = e.getSource();

			// a checkbox changed state
			if (source instanceof Checkbox) {
				Checkbox box = (Checkbox) source;
				boolean state = box.getState();
				if (source == titleCheck) {
					chart.setTitleOn(state);
					titleField.setEnabled(state);
					if (state == true) {
						titleField.setText(chart.getTitle());
					} else {
						titleField.setText("");
					}
				} else if (source == legendCheck) {
					chart.setLegendOn(state);
					legendPositionChoice.setEnabled(state);
				} else if (source == valueLinesCheck) {
					chart.setValueLinesOn(state);
				} else if (source == adjusterCheck) {
					chart.setRangeAdjusterOn(state);
				} else if (source == sampleLabelsCheck) {
					chart.setSampleLabelsOn(state);
				} else if (source == frameCheck) {
					chart.setFrameOn(state);
				}
			}

			// legend position changed
			if (source == legendPositionChoice) {
				Choice c = (Choice) source;
				if (c == legendPositionChoice) {
					String position = c.getSelectedItem();
					if (position.equals("Left")) {
						chart.setLegendPosition(Chart.LEFT);
					} else if (position.equals("Right")) {
						chart.setLegendPosition(Chart.RIGHT);
					} else if (position.equals("Top")) {
						chart.setLegendPosition(Chart.TOP);
					} else if (position.equals("Bottom")) {
						chart.setLegendPosition(Chart.BOTTOM);
					}
				}
			}
			
			// selected a color
			if (source == colorChoice) {
				String color = ((Choice)source).getSelectedItem();
				Color col = null;
				if (color.equals("black")) { col = Color.black; } 
				else if (color.equals("blue")) { col = Color.blue; }
				else if (color.equals("cyan")) { col = Color.cyan; }
				else if (color.equals("darkGray")) { col = Color.darkGray; }
				else if (color.equals("gray")) { col = Color.gray; }
				else if (color.equals("green")) { col = Color.green; }
				else if (color.equals("lightGray")) { col = Color.lightGray; }
				else if (color.equals("magenta")) { col = Color.magenta; }
				else if (color.equals("orange")) { col = Color.orange; }
				else if (color.equals("pink")) { col = Color.pink; }
				else if (color.equals("red")) { col = Color.red; }
				else if (color.equals("white")) { col = Color.white; }
				else if (color.equals("yellow")) { col = Color.yellow;	}
				if (chart.getSeriesCount() > 1 && selectedSample != null) {
					chart.setSampleColor(selectedSample.getIndex(), col);
				} else if (chart.getSeriesCount() == 1) {
					chart.setSampleColor(0, col);
				}
			}
			
			// we selected a line in the chart
			if (source == chart) {
				switch (e.getStateChange()) {
					case ItemEvent.SELECTED:
						selectedSample = (ChartSample) e.getItem();
						break;
					case ItemEvent.DESELECTED:
						selectedSample = null;
						break;
				}
			}
		}

		// the title or range field changed
		public void actionPerformed(ActionEvent e) {
			Object source = e.getSource();
			String s = e.getActionCommand();

			// change the chart title
			if (source == titleField) {
				chart.setTitle(s);
			}

			// change the chart range
			if (source == upperRangeField) {
				try {
					chart.setRange((new Double(s)).doubleValue());
				} catch (NumberFormatException ex) {}
			}

			// change the lower chart range
			if (source == lowerRangeField) {
				try {
					chart.setLowerRange((new Double(s)).doubleValue());
				} catch (NumberFormatException ex) {}
			}

			// changed the decimal count
			if (source == decimalField) {
				try {
					int value = Integer.parseInt(s);
					chart.setRangeDecimalCount(value);
					rangeDecimalCount = value;
					upperRangeField.setText(ChartSample.formatNumber(chart.getFloatRange(), rangeDecimalCount));
					lowerRangeField.setText(ChartSample.formatNumber(chart.getFloatLowerRange(), rangeDecimalCount));
				} catch (NumberFormatException ex) {}
			}

			// print the chart
			if (source == printButton) {
				Toolkit t = parentFrame.getToolkit();
				PrintJob job = t.getPrintJob(parentFrame, "ChartPrinting", null);
				if (job != null) {
					Graphics g = job.getGraphics();
					if (g != null) {
						chart.print(g);
						g.dispose();
					}
					job.end();
				} else {
					System.out.println("No print job");
				}
			}
		}
	}


// entry point


	/** Used to test the bar chart.*/
	public static void main(String[] argv) {
		Frame f = new Frame();
		f.setBackground(Color.lightGray);
		LineChartDemo demo = new LineChartDemo();
		demo.setParentFrame(f);
		demo.init();
		f.add("Center", demo);
		f.show();
		f.pack();
	}
}