////////////////////////////////////////////////////////////////
// PieChartDemo.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 pie chart component.
 *
 * @author Bjorn J. Kvande.
 */
public class PieChartDemo extends Applet {

	// The pie chart
	private PieChart chart;

	// the selected pie segment
	private ChartSample selectedSegment;
	
	// the number of decimals for the value and percent labels
	private int sampleDecimalCount;
	private int percentDecimalCount;
	
	// the application frame of the window
	private Frame parentFrame;

	// The control panel gui components
	private TextField titleField;
	private TextField valueField;
	private TextField labelField;
	private TextField decimalField;
	private TextField percentDecimalField;
	private Checkbox titleCheck;
	private Checkbox legendCheck;
	private Checkbox look3dCheck;
	private Checkbox sampleLabelsCheck;
	private Checkbox valueLabelsCheck;
	private Checkbox percentLabelsCheck;
	private Checkbox frameCheck;
	private Choice legendPositionChoice;
	private Choice angleChoice;
	private Choice depthChoice;
	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;
		
		// create the chart
		chart = new PieChart();
		double[] values = new double[] {3.5, 1.5, 1.5, 1.5, 3.5};
		String[] labels = new String[] {"one", "two", "three", "four", "five"};
		chart.setTitle("Pie Chart");
		chart.setSampleValues(values);
		chart.setSampleLabels(labels);
		chart.setSampleDecimalCount(0);
		chart.setPercentDecimalCount(0);

		// create the control panel components
		titleField = new TextField(chart.getTitle());
		valueField = new TextField();
		labelField = new TextField();
		decimalField = new TextField("0");
		percentDecimalField = new TextField("0");
		titleCheck = new Checkbox();
		legendCheck = new Checkbox();
		look3dCheck = new Checkbox();
		sampleLabelsCheck = new Checkbox();
		valueLabelsCheck = new Checkbox();
		percentLabelsCheck = 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);

		angleChoice = new Choice();
		angleChoice.add("10");
		angleChoice.add("20");
		angleChoice.add("30");
		angleChoice.add("40");
		angleChoice.add("50");
		angleChoice.add("60");
		angleChoice.add("70");
		angleChoice.add("80");
		angleChoice.select("20");

		depthChoice = new Choice();
		depthChoice.add("0.1");
		depthChoice.add("0.2");
		depthChoice.add("0.3");
		depthChoice.add("0.4");
		depthChoice.add("0.5");
		depthChoice.add("0.6");
		depthChoice.add("0.7");
		depthChoice.add("0.8");
		depthChoice.add("0.9");
		depthChoice.select("0.4");

		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 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("Pie value", Label.RIGHT));
		controlPanel.add(valueField);
		controlPanel.add(new Label("Pie label", Label.RIGHT));
		controlPanel.add(labelField);
		controlPanel.add(new Label("Pie color", Label.RIGHT));
		controlPanel.add(colorChoice);
		controlPanel.add(new Label("Sample labels", Label.RIGHT));
		controlPanel.add(sampleLabelsCheck);
		controlPanel.add(new Label("Value labels", Label.RIGHT));
		controlPanel.add(valueLabelsCheck);
		controlPanel.add(new Label("Value decimals", Label.RIGHT));
		controlPanel.add(decimalField);
		controlPanel.add(new Label("Percent labels", Label.RIGHT));
		controlPanel.add(percentLabelsCheck);
		controlPanel.add(new Label("Percent decimals", Label.RIGHT));
		controlPanel.add(percentDecimalField);
		controlPanel.add(new Label("Legend on", Label.RIGHT));
		controlPanel.add(legendCheck);
		controlPanel.add(new Label("Legend position", Label.RIGHT));
		controlPanel.add(legendPositionChoice);
		controlPanel.add(new Label("Frame", Label.RIGHT));
		controlPanel.add(frameCheck);
		controlPanel.add(new Label("3D look", Label.RIGHT));
		controlPanel.add(look3dCheck);
		controlPanel.add(new Label("Pie angle", Label.RIGHT));
		controlPanel.add(angleChoice);
		controlPanel.add(new Label("Pie depth", Label.RIGHT));
		controlPanel.add(depthChoice);
		controlPanel.add(new Panel());
		controlPanel.add(printButton);

		// create the event handler and set it
		EventHandler eventHandler = new EventHandler();
		chart.addItemListener(eventHandler);
		titleField.addActionListener(eventHandler);
		valueField.addActionListener(eventHandler);
		labelField.addActionListener(eventHandler);
		titleCheck.addItemListener(eventHandler);
		legendCheck.addItemListener(eventHandler);
		look3dCheck.addItemListener(eventHandler);
		legendPositionChoice.addItemListener(eventHandler);
		sampleLabelsCheck.addItemListener(eventHandler);
		valueLabelsCheck.addItemListener(eventHandler);
		percentLabelsCheck.addItemListener(eventHandler);
		angleChoice.addItemListener(eventHandler);
		depthChoice.addItemListener(eventHandler);
		decimalField.addActionListener(eventHandler);
		percentDecimalField.addActionListener(eventHandler);
		colorChoice.addItemListener(eventHandler);
		printButton.addActionListener(eventHandler);
		frameCheck.addItemListener(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 == look3dCheck) {
					chart.set3DModeOn(state);
					angleChoice.setEnabled(state);
					depthChoice.setEnabled(state);
				} else if (source == sampleLabelsCheck) {
					chart.setSampleLabelsOn(state);
				} else if (source == valueLabelsCheck) {
					chart.setValueLabelsOn(state);
				} else if (source == percentLabelsCheck) {
					chart.setPercentLabelsOn(state);
				} else if (source == frameCheck) {
					chart.setFrameOn(state);
				}
			}

			// legend position, chart angle, or chart depth changed
			if (source instanceof Choice) {
				Choice c = (Choice) source;
				if (c == legendPositionChoice) {
					String alignment = c.getSelectedItem();
					if (alignment.equals("Left")) {
						chart.setLegendPosition(Chart.LEFT);
					} else if (alignment.equals("Right")) {
						chart.setLegendPosition(Chart.RIGHT);
					} else if (alignment.equals("Top")) {
						chart.setLegendPosition(Chart.TOP);
					} else if (alignment.equals("Bottom")) {
						chart.setLegendPosition(Chart.BOTTOM);
					}
				} else if (c == angleChoice) {
					String s = c.getSelectedItem();
					chart.setAngle(Integer.parseInt(s.substring(0, 2)));
				} else if (c == depthChoice) {
					String s = c.getSelectedItem();
					chart.setDepth((new Float(s.substring(0, 3))).floatValue());
				}
			}
			
			// we 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 (selectedSegment != null) {
					chart.setSampleColor(selectedSegment.getIndex(), col);
				}
			}
		

			// we selected a pie segment in the chart
			if (source == chart) {
				switch (e.getStateChange()) {
					case ItemEvent.SELECTED:
						ChartSample sample = (ChartSample) e.getItem();
						String s = ChartSample.formatNumber(sample.getFloatValue(), sampleDecimalCount);
						valueField.setText(s);
						valueField.setEnabled(true);
						labelField.setText(sample.getLabel());
						labelField.setEnabled(true);
						selectedSegment = sample;
						break;
					case ItemEvent.DESELECTED:
						valueField.setText("");
						valueField.setEnabled(false);
						labelField.setText("");
						labelField.setEnabled(false);
						selectedSegment = null;
						break;
				}
			}
		}

		// a text field changed value
		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 value of a sample
			if (source == valueField && selectedSegment != null) {
				int index = selectedSegment.getIndex();
				double value = selectedSegment.getFloatValue();
				try {
					double new_value = (new Double(s)).doubleValue();
					chart.setSampleValue(index, new_value);
				} catch (NumberFormatException ex) {
					chart.setSampleValue(index, value);
				}
			}

			// change the label of a sample
			if (source == labelField && selectedSegment != null) {
				int index = selectedSegment.getIndex();
				String label = selectedSegment.getLabel();
				try {
					chart.setSampleLabel(index, s);
				} catch (NumberFormatException ex) {
					chart.setSampleLabel(index, label);
				}
				chart.repaint();
			}

			// the value decimals were set
			if (source == decimalField) {
				try {
					int value = Integer.parseInt(s);
					sampleDecimalCount = value;
					chart.setSampleDecimalCount(value);
					if (selectedSegment != null) {
						s = ChartSample.formatNumber(selectedSegment.getFloatValue(), sampleDecimalCount);
						valueField.setText(s);
					}
				} catch (NumberFormatException ex) {}
			}

			// the percent decimals were set
			if (source == percentDecimalField) {
				try {
					int value = Integer.parseInt(s);
					percentDecimalCount = value;
					chart.setPercentDecimalCount(value);
				} 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);
		PieChartDemo demo = new PieChartDemo();
		demo.setParentFrame(f);
		demo.init();
		f.add("Center", demo);
		f.show();
		f.pack();
	}
}