001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2005, 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-2005, 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     * Copyright (c) 2002
071     * Australian Antarctic Division
072     *
073     * @author Bryan Scott
074     */
075    public class JThermometer extends JPanel implements Serializable {
076    
077        /** For serialization. */
078        private static final long serialVersionUID = 1079905665515589820L;
079        
080        /** The dataset. */
081        private DefaultValueDataset data;
082    
083        /** The chart. */
084        private JFreeChart chart;
085    
086        /** The chart panel. */
087        private ChartPanel panel;
088    
089        /** The thermometer plot. */
090        private ThermometerPlot plot = new ThermometerPlot();
091    
092        /**
093         * Default constructor.
094         */
095        public JThermometer() {
096            super(new CardLayout());
097            this.plot.setInsets(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
098            this.data = new DefaultValueDataset();
099            //data.setRange(new Double(-60000), new Double(60000));
100            this.plot.setDataset(this.data);
101            this.chart = new JFreeChart(
102                null, JFreeChart.DEFAULT_TITLE_FONT, this.plot, false
103            );
104            this.panel = new ChartPanel(this.chart);
105            add(this.panel, "Panel");
106            setBackground(getBackground());
107        }
108    
109        /**
110         * Adds a subtitle to the chart.
111         *
112         * @param subtitle  the subtitle.
113         */
114        public void addSubtitle(Title subtitle) {
115            this.chart.addSubtitle(subtitle);
116        }
117    
118        /**
119         * Adds a subtitle to the chart.
120         *
121         * @param subtitle  the subtitle.
122         */
123        public void addSubtitle(String subtitle) {
124            this.chart.addSubtitle(new TextTitle(subtitle));
125        }
126    
127        /**
128         * Adds a subtitle to the chart.
129         *
130         * @param subtitle  the subtitle.
131         * @param font  the subtitle font.
132         */
133        public void addSubtitle(String subtitle, Font font) {
134            this.chart.addSubtitle(new TextTitle(subtitle, font));
135        }
136    
137        /**
138         * Sets the value format for the thermometer.
139         *
140         * @param df  the formatter.
141         */
142        public void setValueFormat(DecimalFormat df) {
143            this.plot.setValueFormat(df);
144        }
145    
146        /**
147         * Sets the lower and upper bounds for the thermometer.
148         *
149         * @param lower  the lower bound.
150         * @param upper  the upper bound.
151         */
152        public void setRange(double lower, double upper) {
153            this.plot.setRange(lower, upper);
154        }
155    
156        /**
157         * Sets the range.
158         *
159         * @param range  the range type.
160         * @param displayLow  the low value.
161         * @param displayHigh  the high value.
162         */
163        public void setSubrangeInfo(int range, double displayLow, 
164                                    double displayHigh) {
165            this.plot.setSubrangeInfo(range, displayLow, displayHigh);
166        }
167    
168        /**
169         * Sets the range.
170         *
171         * @param range  the range type.
172         * @param rangeLow  the low value for the range.
173         * @param rangeHigh  the high value for the range.
174         * @param displayLow  the low value for display.
175         * @param displayHigh  the high value for display.
176         */
177        public void setSubrangeInfo(int range,
178                                 double rangeLow, double rangeHigh,
179                                 double displayLow, double displayHigh) {
180    
181            this.plot.setSubrangeInfo(range, rangeLow, rangeHigh, displayLow, 
182                    displayHigh);
183    
184        }
185    
186        /**
187         * Sets the location at which the temperature value is displayed.
188         *
189         * @param loc  the location.
190         */
191        public void setValueLocation(int loc) {
192            this.plot.setValueLocation(loc);
193            this.panel.repaint();
194        }
195    
196        /**
197         * Sets the value paint.
198         *
199         * @param paint  the paint.
200         */
201        public void setValuePaint(Paint paint) {
202            this.plot.setValuePaint(paint);
203        }
204    
205        /**
206         * Returns the value of the thermometer.
207         *
208         * @return The value.
209         */
210        public Number getValue() {
211            if (this.data != null) {
212                return this.data.getValue();
213            }
214            else {
215                return null;
216            }
217        }
218    
219        /**
220         * Sets the value of the thermometer.
221         *
222         * @param value  the value.
223         */
224        public void setValue(double value) {
225            setValue(new Double(value));
226        }
227    
228        /**
229         * Sets the value of the thermometer.
230         *
231         * @param value  the value.
232         */
233        public void setValue(Number value) {
234            if (this.data != null) {
235                this.data.setValue(value);
236            }
237        }
238    
239        /**
240         * Sets the unit type.
241         *
242         * @param i  the unit type.
243         */
244        public void setUnits(int i) {
245            if (this.plot != null) {
246                this.plot.setUnits(i);
247            }
248        }
249    
250        /**
251         * Sets the outline paint.
252         *
253         * @param p  the paint.
254         */
255        public void setOutlinePaint(Paint p) {
256            if (this.plot != null) {
257                this.plot.setOutlinePaint(p);
258            }
259        }
260    
261        /**
262         * Sets the foreground color.
263         *
264         * @param fg  the foreground color.
265         */
266        public void setForeground(Color fg) {
267            super.setForeground(fg);
268            if (this.plot != null) {
269                this.plot.setThermometerPaint(fg);
270            }
271        }
272    
273        /**
274         * Sets the background color.
275         *
276         * @param bg  the background color.
277         */
278        public void setBackground(Color bg) {
279            super.setBackground(bg);
280            if (this.plot != null) {
281                this.plot.setBackgroundPaint(bg);
282            }
283            if (this.chart != null) {
284                this.chart.setBackgroundPaint(bg);
285            }
286            if (this.panel != null) {
287                this.panel.setBackground(bg);
288            }
289        }
290    
291        /**
292         * Sets the value font.
293         *
294         * @param f  the font.
295         */
296        public void setValueFont(Font f) {
297            if (this.plot != null) {
298                this.plot.setValueFont(f);
299            }
300        }
301    
302        /**
303         * Returns the tick label font.
304         *
305         * @return The tick label font.
306         */
307        public Font getTickLabelFont() {
308            ValueAxis axis = this.plot.getRangeAxis();
309            return axis.getTickLabelFont();
310        }
311    
312        /**
313         * Sets the tick label font.
314         *
315         * @param font  the font.
316         */
317        public void setTickLabelFont(Font font) {
318            ValueAxis axis = this.plot.getRangeAxis();
319            axis.setTickLabelFont(font);
320        }
321    
322        /**
323         * Increases or decreases the tick font size.
324         *
325         * @param delta  the change in size.
326         */
327        public void changeTickFontSize(int delta) {
328            Font f = getTickLabelFont();
329            String fName = f.getFontName();
330            Font newFont = new Font(fName, f.getStyle(), (f.getSize() + delta));
331            setTickLabelFont(newFont);
332        }
333    
334        /**
335         * Sets the tick font style.
336         *
337         * @param style  the style.
338         */
339        public void setTickFontStyle(int style) {
340            Font f = getTickLabelFont();
341            String fName = f.getFontName();
342            Font newFont = new Font(fName, style, f.getSize());
343            setTickLabelFont(newFont);
344        }
345    
346        /**
347         * Sets the flag that controls whether or not the display range follows the
348         * data value.
349         *
350         * @param flag  the new value of the flag.
351         */
352        public void setFollowDataInSubranges(boolean flag) {
353            this.plot.setFollowDataInSubranges(flag);
354        }
355    
356        /**
357         * Sets the flag that controls whether or not value lines are displayed.
358         *
359         * @param b  the new flag value.
360         */
361        public void setShowValueLines(boolean b) {
362            this.plot.setShowValueLines(b);
363        }
364    
365        /**
366         * Sets the location for the axis.
367         * 
368         * @param location  the location.
369         */
370        public void setShowAxisLocation(int location) {
371            this.plot.setAxisLocation(location);
372        }
373    
374        /**
375         * Returns the location for the axis.
376         * 
377         * @return The location.
378         */
379        public int getShowAxisLocation() {
380          return this.plot.getAxisLocation();
381        }
382    
383    }