001/* ======================================================
002 * Orson : a free chart beans library based on JFreeChart
003 * ======================================================
004 *
005 * (C) Copyright 2007, by Object Refinery Limited.
006 *
007 * Project Info:  http://www.jfree.org/orson/
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
029package org.jfree.beans;
030
031import java.awt.Color;
032import java.beans.PropertyChangeEvent;
033
034import org.jfree.chart.ChartFactory;
035import org.jfree.chart.JFreeChart;
036import org.jfree.chart.plot.XYPlot;
037import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
038import org.jfree.data.time.Day;
039import org.jfree.data.time.RegularTimePeriod;
040import org.jfree.data.time.TimeSeries;
041import org.jfree.data.time.TimeSeriesCollection;
042import org.jfree.data.xy.XYDataset;
043import org.jfree.ui.RectangleInsets;
044
045/**
046 * A JavaBean that displays a time series chart.
047 */
048public class JTimeSeriesChart extends AbstractXYChart {
049
050    /**
051     * Creates a new pie chart bean.
052     */
053    public JTimeSeriesChart() {
054        super();
055    }
056    
057    /**
058     * Creates a default chart.
059     * 
060     * @return The default chart.
061     */
062    protected JFreeChart createDefaultChart() {
063        TimeSeriesCollection dataset = new TimeSeriesCollection();
064        TimeSeries s1 = new TimeSeries("Series 1");
065        RegularTimePeriod t = new Day();
066        double y = 100.0;
067        for (int i = 0; i < 20; i++) {
068            s1.add(t, y); t = t.next();
069            y = y * (1.0 + (Math.random() / 45.0));
070        }
071        dataset.addSeries(s1);
072        JFreeChart chart = ChartFactory.createTimeSeriesChart(
073                "JTimeSeriesChart - Title", "Date/Time", "Value", dataset, true, 
074                true, false);
075        XYPlot plot = (XYPlot) chart.getPlot();
076        plot.setBackgroundPaint(Color.lightGray);
077        plot.setDomainGridlinePaint(Color.white);
078        plot.setRangeGridlinePaint(Color.white);
079        plot.setAxisOffset(new RectangleInsets(4, 4, 4, 4));
080        XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
081        r.setUseFillPaint(true);
082        r.setBaseFillPaint(Color.white);
083        return chart;
084    }
085    
086    /**
087     * Returns the dataset used by the chart.
088     * 
089     * @return The dataset (possibly <code>null</code>).
090     * 
091     * @see #setDataset(XYDataset)
092     */
093    public XYDataset getDataset() {
094        XYDataset result = null;
095        XYPlot plot = (XYPlot) this.chart.getPlot();
096        if (plot != null) {
097            result = plot.getDataset();
098        }
099        return result;
100    }
101    
102    /**
103     * Sets the dataset used by the chart and fires a 
104     * {@link PropertyChangeEvent} for the <code>dataset</code> property.
105     * 
106     * @param dataset  the dataset (<code>null</code> permitted).
107     * 
108     * @see #getDataset()
109     */
110    public void setDataset(XYDataset dataset) {
111        XYPlot plot = (XYPlot) this.chart.getPlot();
112        if (plot != null) {
113            XYDataset old = plot.getDataset();
114            plot.setDataset(dataset);
115            firePropertyChange("dataset", old, dataset);
116        }
117    }
118    
119    /**
120     * Returns <code>true</code> if a shape is drawn to indicate each data 
121     * item, and <code>false</code> otherwise.
122     * 
123     * @return A boolean.
124     * 
125     * @see #setShapesVisible(boolean)
126     */
127    public boolean getShapesVisible() {
128        XYPlot plot = (XYPlot) this.chart.getPlot();
129        if (plot == null) {
130            return false;
131        }
132        XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
133        if (r == null)  {
134            return false;
135        }
136        return r.getBaseShapesVisible();
137    }
138    
139    /**
140     * Sets a flag that controls whether or not shapes are drawn to highlight
141     * each data item and fires a {@link PropertyChangeEvent} for the 
142     * <code>shapesVisible</code> property.
143     * 
144     * @param visible  the new flag value.
145     * 
146     * @see #getShapesVisible()
147     */
148    public void setShapesVisible(boolean visible) {
149        XYPlot plot = (XYPlot) this.chart.getPlot();
150        if (plot == null) {
151            return;
152        }
153        XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
154        if (r == null)  {
155            return;
156        }
157        boolean old = r.getBaseShapesVisible();
158        r.setBaseShapesVisible(visible);       
159        firePropertyChange("shapesVisible", old, visible);
160    }
161    
162}