001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors.
006     *
007     * Project Info:  http://www.jfree.org/jfreechart/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it
010     * under the terms of the GNU Lesser General Public License as published by
011     * the Free Software Foundation; either version 2.1 of the License, or
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
022     * USA.
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025     * in the United States and other countries.]
026     *
027     * -----------------
028     * JThermometer.java
029     * -----------------
030     * A plot that displays a single value in a thermometer type display.
031     *
032     * (C) Copyright 2000-2008, Australian Antarctic Division and Contributors.
033     *
034     * Original Author:  Bryan Scott.
035     * Contributor(s):   David Gilbert (for Object Refinery Limited);
036     *                   Irv Thomae;
037     *
038     * Changes (from 17-Sep-2002)
039     * --------------------------
040     * 17-Sep-2002 : Reviewed with Checkstyle utility (DG);
041     * 18-Sep-2003 : Integrated new methods contributed by Irv Thomae (DG);
042     * 08-Jan-2004 : Renamed AbstractTitle --> Title and moved to new package (DG);
043     * 31-May-2005 : Fixed typo in method name (DG);
044     *
045     */
046    
047    package org.jfree.chart.plot;
048    
049    import java.awt.CardLayout;
050    import java.awt.Color;
051    import java.awt.Font;
052    import java.awt.Paint;
053    import java.io.Serializable;
054    import java.text.DecimalFormat;
055    
056    import javax.swing.JPanel;
057    
058    import org.jfree.chart.ChartPanel;
059    import org.jfree.chart.JFreeChart;
060    import org.jfree.chart.axis.ValueAxis;
061    import org.jfree.chart.title.TextTitle;
062    import org.jfree.chart.title.Title;
063    import org.jfree.data.general.DefaultValueDataset;
064    import org.jfree.ui.RectangleInsets;
065    
066    /**
067     * An initial quick and dirty.  The concept behind this class would be to
068     * generate a gui bean that could be used within JBuilder, Netbeans etc...
069     */
070    public class JThermometer extends JPanel implements Serializable {
071    
072        /** For serialization. */
073        private static final long serialVersionUID = 1079905665515589820L;
074    
075        /** The dataset. */
076        private DefaultValueDataset data;
077    
078        /** The chart. */
079        private JFreeChart chart;
080    
081        /** The chart panel. */
082        private ChartPanel panel;
083    
084        /** The thermometer plot. */
085        private ThermometerPlot plot = new ThermometerPlot();
086    
087        /**
088         * Default constructor.
089         */
090        public JThermometer() {
091            super(new CardLayout());
092            this.plot.setInsets(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
093            this.data = new DefaultValueDataset();
094            this.plot.setDataset(this.data);
095            this.chart = new JFreeChart(null, JFreeChart.DEFAULT_TITLE_FONT,
096                    this.plot, false);
097            this.panel = new ChartPanel(this.chart);
098            add(this.panel, "Panel");
099            setBackground(getBackground());
100        }
101    
102        /**
103         * Adds a subtitle to the chart.
104         *
105         * @param subtitle  the subtitle.
106         */
107        public void addSubtitle(Title subtitle) {
108            this.chart.addSubtitle(subtitle);
109        }
110    
111        /**
112         * Adds a subtitle to the chart.
113         *
114         * @param subtitle  the subtitle.
115         */
116        public void addSubtitle(String subtitle) {
117            this.chart.addSubtitle(new TextTitle(subtitle));
118        }
119    
120        /**
121         * Adds a subtitle to the chart.
122         *
123         * @param subtitle  the subtitle.
124         * @param font  the subtitle font.
125         */
126        public void addSubtitle(String subtitle, Font font) {
127            this.chart.addSubtitle(new TextTitle(subtitle, font));
128        }
129    
130        /**
131         * Sets the value format for the thermometer.
132         *
133         * @param df  the formatter.
134         */
135        public void setValueFormat(DecimalFormat df) {
136            this.plot.setValueFormat(df);
137        }
138    
139        /**
140         * Sets the lower and upper bounds for the thermometer.
141         *
142         * @param lower  the lower bound.
143         * @param upper  the upper bound.
144         */
145        public void setRange(double lower, double upper) {
146            this.plot.setRange(lower, upper);
147        }
148    
149        /**
150         * Sets the range.
151         *
152         * @param range  the range type.
153         * @param displayLow  the low value.
154         * @param displayHigh  the high value.
155         */
156        public void setSubrangeInfo(int range, double displayLow,
157                                    double displayHigh) {
158            this.plot.setSubrangeInfo(range, displayLow, displayHigh);
159        }
160    
161        /**
162         * Sets the range.
163         *
164         * @param range  the range type.
165         * @param rangeLow  the low value for the range.
166         * @param rangeHigh  the high value for the range.
167         * @param displayLow  the low value for display.
168         * @param displayHigh  the high value for display.
169         */
170        public void setSubrangeInfo(int range,
171                                 double rangeLow, double rangeHigh,
172                                 double displayLow, double displayHigh) {
173    
174            this.plot.setSubrangeInfo(range, rangeLow, rangeHigh, displayLow,
175                    displayHigh);
176    
177        }
178    
179        /**
180         * Sets the location at which the temperature value is displayed.
181         *
182         * @param loc  the location.
183         */
184        public void setValueLocation(int loc) {
185            this.plot.setValueLocation(loc);
186            this.panel.repaint();
187        }
188    
189        /**
190         * Sets the value paint.
191         *
192         * @param paint  the paint.
193         */
194        public void setValuePaint(Paint paint) {
195            this.plot.setValuePaint(paint);
196        }
197    
198        /**
199         * Returns the value of the thermometer.
200         *
201         * @return The value.
202         */
203        public Number getValue() {
204            if (this.data != null) {
205                return this.data.getValue();
206            }
207            else {
208                return null;
209            }
210        }
211    
212        /**
213         * Sets the value of the thermometer.
214         *
215         * @param value  the value.
216         */
217        public void setValue(double value) {
218            setValue(new Double(value));
219        }
220    
221        /**
222         * Sets the value of the thermometer.
223         *
224         * @param value  the value.
225         */
226        public void setValue(Number value) {
227            if (this.data != null) {
228                this.data.setValue(value);
229            }
230        }
231    
232        /**
233         * Sets the unit type.
234         *
235         * @param i  the unit type.
236         */
237        public void setUnits(int i) {
238            if (this.plot != null) {
239                this.plot.setUnits(i);
240            }
241        }
242    
243        /**
244         * Sets the outline paint.
245         *
246         * @param p  the paint.
247         */
248        public void setOutlinePaint(Paint p) {
249            if (this.plot != null) {
250                this.plot.setOutlinePaint(p);
251            }
252        }
253    
254        /**
255         * Sets the foreground color.
256         *
257         * @param fg  the foreground color.
258         */
259        public void setForeground(Color fg) {
260            super.setForeground(fg);
261            if (this.plot != null) {
262                this.plot.setThermometerPaint(fg);
263            }
264        }
265    
266        /**
267         * Sets the background color.
268         *
269         * @param bg  the background color.
270         */
271        public void setBackground(Color bg) {
272            super.setBackground(bg);
273            if (this.plot != null) {
274                this.plot.setBackgroundPaint(bg);
275            }
276            if (this.chart != null) {
277                this.chart.setBackgroundPaint(bg);
278            }
279            if (this.panel != null) {
280                this.panel.setBackground(bg);
281            }
282        }
283    
284        /**
285         * Sets the value font.
286         *
287         * @param f  the font.
288         */
289        public void setValueFont(Font f) {
290            if (this.plot != null) {
291                this.plot.setValueFont(f);
292            }
293        }
294    
295        /**
296         * Returns the tick label font.
297         *
298         * @return The tick label font.
299         */
300        public Font getTickLabelFont() {
301            ValueAxis axis = this.plot.getRangeAxis();
302            return axis.getTickLabelFont();
303        }
304    
305        /**
306         * Sets the tick label font.
307         *
308         * @param font  the font.
309         */
310        public void setTickLabelFont(Font font) {
311            ValueAxis axis = this.plot.getRangeAxis();
312            axis.setTickLabelFont(font);
313        }
314    
315        /**
316         * Increases or decreases the tick font size.
317         *
318         * @param delta  the change in size.
319         */
320        public void changeTickFontSize(int delta) {
321            Font f = getTickLabelFont();
322            String fName = f.getFontName();
323            Font newFont = new Font(fName, f.getStyle(), (f.getSize() + delta));
324            setTickLabelFont(newFont);
325        }
326    
327        /**
328         * Sets the tick font style.
329         *
330         * @param style  the style.
331         */
332        public void setTickFontStyle(int style) {
333            Font f = getTickLabelFont();
334            String fName = f.getFontName();
335            Font newFont = new Font(fName, style, f.getSize());
336            setTickLabelFont(newFont);
337        }
338    
339        /**
340         * Sets the flag that controls whether or not the display range follows the
341         * data value.
342         *
343         * @param flag  the new value of the flag.
344         */
345        public void setFollowDataInSubranges(boolean flag) {
346            this.plot.setFollowDataInSubranges(flag);
347        }
348    
349        /**
350         * Sets the flag that controls whether or not value lines are displayed.
351         *
352         * @param b  the new flag value.
353         */
354        public void setShowValueLines(boolean b) {
355            this.plot.setShowValueLines(b);
356        }
357    
358        /**
359         * Sets the location for the axis.
360         *
361         * @param location  the location.
362         */
363        public void setShowAxisLocation(int location) {
364            this.plot.setAxisLocation(location);
365        }
366    
367        /**
368         * Returns the location for the axis.
369         *
370         * @return The location.
371         */
372        public int getShowAxisLocation() {
373          return this.plot.getAxisLocation();
374        }
375    
376    }