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:  not-yet-released
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    
029    package org.jfree.beans;
030    
031    import java.awt.Color;
032    import java.beans.PropertyChangeEvent;
033    
034    import org.jfree.chart.ChartFactory;
035    import org.jfree.chart.JFreeChart;
036    import org.jfree.chart.plot.XYPlot;
037    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
038    import org.jfree.data.time.Day;
039    import org.jfree.data.time.RegularTimePeriod;
040    import org.jfree.data.time.TimeSeries;
041    import org.jfree.data.time.TimeSeriesCollection;
042    import org.jfree.data.xy.XYDataset;
043    import org.jfree.ui.RectangleInsets;
044    
045    /**
046     * A JavaBean that displays a time series chart.
047     */
048    public 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    }