/* ===========================================================

 * JFreeChart : a free chart library for the Java(tm) platform

 * ===========================================================

 *

 * (C) Copyright 2000-2004, by Object Refinery Limited and Contributors.

 *

 * Project Info:  http://www.jfree.org/jfreechart/index.html

 *

 * This library is free software; you can redistribute it and/or modify it under the terms

 * of the GNU Lesser General Public License as published by the Free Software Foundation;

 * either version 2.1 of the License, or (at your option) any later version.

 *

 * This library 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 Lesser General Public License for more details.

 *

 * You should have received a copy of the GNU Lesser General Public License along with this

 * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,

 * Boston, MA 02111-1307, USA.

 *

 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 

 * in the United States and other countries.]

 *

 * -----------------

 * JThermometer.java

 * -----------------

 * A plot that displays a single value in a thermometer type display.

 *

 * (C) Copyright 2000-2004, Australian Antarctic Division and Contributors.

 *

 * Original Author:  Bryan Scott.

 * Contributor(s):   David Gilbert (for Object Refinery Limited);

 *                   Irv Thomae;

 *

 * Changes (from 17-Sep-2002)

 * --------------------------

 * 17-Sep-2002 : Reviewed with Checkstyle utility (DG);

 * 18-Sep-2003 : Integrated new methods contributed by Irv Thomae (DG);

 * 08-Jan-2004 : Renamed AbstractTitle --> Title and moved to new package (DG);

 *

 */



package org.jfree.chart.plot;



import java.awt.CardLayout;

import java.awt.Color;

import java.awt.Font;

import java.awt.Insets;

import java.awt.Paint;

import java.io.Serializable;

import java.text.DecimalFormat;



import javax.swing.JPanel;



import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.axis.ValueAxis;

import org.jfree.chart.title.Title;

import org.jfree.chart.title.TextTitle;

import org.jfree.data.general.DefaultValueDataset;



/**

 * An initial quick and dirty.  The concept behind this class would be to

 * generate a gui bean that could be used within JBuilder, Netbeans etc...

 *

 * Copyright (c) 2002

 * Australian Antarctic Division

 *

 * @author Bryan Scott

 *

 */

public class JThermometer extends JPanel implements Serializable {



    /** The dataset. */

    private DefaultValueDataset data;



    /** The chart. */

    private JFreeChart chart;



    /** The chart panel. */

    private ChartPanel panel;



    /** The thermometer plot. */

    private ThermometerPlot plot = new ThermometerPlot();



    /**

     * Default constructor.

     */

    public JThermometer() {

        super(new CardLayout());

        this.plot.setInsets(new Insets(5, 5, 5, 5));

        this.data = new DefaultValueDataset();

        //data.setRange(new Double(-60000), new Double(60000));

        this.plot.setDataset(this.data);

        this.chart = new JFreeChart(null, JFreeChart.DEFAULT_TITLE_FONT, this.plot, false);

        this.panel = new ChartPanel(this.chart);

        add(this.panel, "Panel");

        setBackground(getBackground());

    }



    /**

     * Adds a subtitle to the chart.

     *

     * @param subtitle  the subtitle.

     */

    public void addSubitle(Title subtitle) {

        this.chart.addSubtitle(subtitle);

    }



    /**

     * Adds a subtitle to the chart.

     *

     * @param subtitle  the subtitle.

     */

    public void addSubtitle(String subtitle) {

        this.chart.addSubtitle(new TextTitle(subtitle));

    }



    /**

     * Adds a subtitle to the chart.

     *

     * @param subtitle  the subtitle.

     * @param font  the subtitle font.

     */

    public void addSubtitle(String subtitle, Font font) {

        this.chart.addSubtitle(new TextTitle(subtitle, font));

    }



    /**

     * Sets the value format for the thermometer.

     *

     * @param df  the formatter.

     */

    public void setValueFormat(DecimalFormat df) {

        this.plot.setValueFormat(df);

    }



    /**

     * Sets the lower and upper bounds for the thermometer.

     *

     * @param lower  the lower bound.

     * @param upper  the upper bound.

     */

    public void setRange(double lower, double upper) {

        this.plot.setRange(lower, upper);

    }



    /**

     * Sets the range.

     *

     * @param range  the range type.

     * @param displayLow  the low value.

     * @param displayHigh  the high value.

     */

    public void setSubrangeInfo(int range, double displayLow, double displayHigh) {

        this.plot.setSubrangeInfo(range, displayLow, displayHigh);

    }



    /**

     * Sets the range.

     *

     * @param range  the range type.

     * @param rangeLow  the low value for the range.

     * @param rangeHigh  the high value for the range.

     * @param displayLow  the low value for display.

     * @param displayHigh  the high value for display.

     */

    public void setSubrangeInfo(int range,

                             double rangeLow, double rangeHigh,

                             double displayLow, double displayHigh) {



        this.plot.setSubrangeInfo(range, rangeLow, rangeHigh, displayLow, displayHigh);



    }



    /**

     * Sets the location at which the temperature value is displayed.

     *

     * @param loc  the location.

     */

    public void setValueLocation(int loc) {

        this.plot.setValueLocation(loc);

        this.panel.repaint();

    }



    /**

     * Sets the value paint.

     *

     * @param paint  the paint.

     */

    public void setValuePaint(Paint paint) {

        this.plot.setValuePaint(paint);

    }



    /**

     * Returns the value of the thermometer.

     *

     * @return the value.

     */

    public Number getValue() {

        if (this.data != null) {

            return this.data.getValue();

        }

        else {

            return null;

        }

    }



    /**

     * Sets the value of the thermometer.

     *

     * @param value  the value.

     */

    public void setValue(double value) {

        setValue(new Double(value));

    }



    /**

     * Sets the value of the thermometer.

     *

     * @param value  the value.

     */

    public void setValue(Number value) {

        if (this.data != null) {

            this.data.setValue(value);

        }

    }



    /**

     * Sets the unit type.

     *

     * @param i  the unit type.

     */

    public void setUnits(int i) {

        if (this.plot != null) {

            this.plot.setUnits(i);

        }

    }



    /**

     * Sets the outline paint.

     *

     * @param p  the paint.

     */

    public void setOutlinePaint(Paint p) {

        if (this.plot != null) {

            this.plot.setOutlinePaint(p);

        }

    }



    /**

     * Sets the foreground color.

     *

     * @param fg  the foreground color.

     */

    public void setForeground(Color fg) {

        super.setForeground(fg);

        if (this.plot != null) {

            this.plot.setThermometerPaint(fg);

        }

    }



    /**

     * Sets the background color.

     *

     * @param bg  the background color.

     */

    public void setBackground(Color bg) {

        super.setBackground(bg);

        if (this.plot != null) {

            this.plot.setBackgroundPaint(bg);

        }

        if (this.chart != null) {

            this.chart.setBackgroundPaint(bg);

        }

        if (this.panel != null) {

            this.panel.setBackground(bg);

        }

    }



    /**

     * Sets the value font.

     *

     * @param f  the font.

     */

    public void setValueFont(Font f) {

        if (this.plot != null) {

            this.plot.setValueFont(f);

        }

    }



    /**

     * Returns the tick label font.

     *

     * @return The tick label font.

     */

    public Font getTickLabelFont() {

        ValueAxis axis = this.plot.getVerticalValueAxis();

        return axis.getTickLabelFont();

    }



    /**

     * Sets the tick label font.

     *

     * @param font  the font.

     */

    public void setTickLabelFont(Font font) {

        ValueAxis axis = this.plot.getVerticalValueAxis();

        axis.setTickLabelFont(font);

    }



    /**

     * Increases or decreases the tick font size.

     *

     * @param delta  the change in size.

     */

    public void changeTickFontSize(int delta) {

        Font f = getTickLabelFont();

        String fName = f.getFontName();

        Font newFont = new Font(fName, f.getStyle(), (f.getSize() + delta));

        setTickLabelFont(newFont);

    }



    /**

     * Sets the tick font style.

     *

     * @param style  the style.

     */

    public void setTickFontStyle(int style) {

        Font f = getTickLabelFont();

        String fName = f.getFontName();

        Font newFont = new Font(fName, style, f.getSize());

        setTickLabelFont(newFont);

    }



    /**

     * Sets the flag that controls whether or not the display range follows the data value.

     *

     * @param flag  the new value of the flag.

     */

    public void setFollowDataInSubranges(boolean flag) {

        this.plot.setFollowDataInSubranges(flag);

    }



    /**

     * Sets the flag that controls whether or not value lines are displayed.

     *

     * @param b  the new flag value.

     */

    public void setShowValueLines(boolean b) {

        this.plot.setShowValueLines(b);

    }



    /**

     * Sets the location for the axis.

     * 

     * @param location  the location.

     */

    public void setShowAxisLocation(int location) {

        this.plot.setAxisLocation(location);

    }



    /**

     * Returns the location for the axis.

     * 

     * @return the location.

     */

    public int getShowAxisLocation() {

      return this.plot.getAxisocation();

    }



}

