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.axis.CategoryAxis;
037import org.jfree.chart.plot.CategoryPlot;
038import org.jfree.chart.plot.PlotOrientation;
039import org.jfree.chart.renderer.category.BarRenderer;
040import org.jfree.data.category.CategoryDataset;
041import org.jfree.data.category.DefaultCategoryDataset;
042import org.jfree.ui.RectangleInsets;
043
044/**
045 * A JavaBean that displays a bar chart.
046 */
047public class JBarChart extends AbstractCategoryChart {
048   
049    /**
050     * Creates a new bar chart bean.
051     */
052    public JBarChart() {
053        super();
054    }
055
056    /**
057     * Creates a default chart.
058     * 
059     * @return The default chart.
060     */
061    protected JFreeChart createDefaultChart() {
062        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
063        dataset.setValue(5.0, "Series 1", "Category A");
064        dataset.setValue(6.0, "Series 1", "Category B");
065        dataset.setValue(7.0, "Series 2", "Category A");
066        dataset.setValue(4.0, "Series 2", "Category B");
067        dataset.setValue(3.0, "Series 3", "Category A");
068        dataset.setValue(9.0, "Series 3", "Category B");
069        JFreeChart chart = ChartFactory.createBarChart("JBarChart - Title", 
070                "Category", "Value", dataset, PlotOrientation.VERTICAL, true, 
071                true, false);
072        CategoryPlot plot = (CategoryPlot) chart.getPlot();
073        plot.setBackgroundPaint(Color.lightGray);
074        plot.setDomainGridlinePaint(Color.white);
075        plot.setRangeGridlinePaint(Color.white);
076        plot.setAxisOffset(new RectangleInsets(4, 4, 4, 4));
077        
078        CategoryAxis axis = plot.getDomainAxis();
079        axis.setCategoryMargin(0.05);
080        
081        BarRenderer renderer = (BarRenderer) plot.getRenderer();
082        renderer.setItemMargin(0.0);
083        renderer.setDrawBarOutline(false);
084        return chart;
085    }
086    
087    /**
088     * Returns the dataset used by the chart.
089     * 
090     * @return The dataset (possibly <code>null</code>).
091     * 
092     * @see #setDataset(CategoryDataset)
093     */
094    public CategoryDataset getDataset() {
095        CategoryDataset result = null;
096        CategoryPlot plot = (CategoryPlot) this.chart.getPlot();
097        if (plot != null) {
098            result = plot.getDataset();
099        }
100        return result;
101    }
102    
103    /**
104     * Sets the dataset used by the chart and fires a 
105     * {@link PropertyChangeEvent} for the <code>dataset</code> property.
106     * 
107     * @param dataset  the dataset (<code>null</code> permitted).
108     * 
109     * @see #getDataset()
110     */
111    public void setDataset(CategoryDataset dataset) {
112        CategoryPlot plot = (CategoryPlot) this.chart.getPlot();
113        if (plot != null) {
114            CategoryDataset old = plot.getDataset();
115            plot.setDataset(dataset);
116            firePropertyChange("dataset", old, dataset);
117        }
118    }
119    
120    /**
121     * Returns the flag that controls whether or not the bar outlines are
122     * drawn.
123     * 
124     * @return A boolean.
125     * 
126     * @see #setBarOutlineVisible(boolean)
127     */
128    public boolean isBarOutlineVisible() {
129        CategoryPlot plot = (CategoryPlot) this.chart.getPlot();
130        if (plot == null) {
131            return false;
132        }
133        BarRenderer renderer = (BarRenderer) plot.getRenderer();
134        if (renderer == null) {
135            return false;
136        }
137        return renderer.isDrawBarOutline();
138    }
139    
140    /**
141     * Sets the flag that controls whether or not the bar outlines are drawn 
142     * and fires a {@link PropertyChangeEvent} for the 
143     * <code>barOutlineVisible</code> property.
144     * 
145     * @param visible  the new flag value.
146     * 
147     * @see #isBarOutlineVisible()
148     */
149    public void setBarOutlineVisible(boolean visible) {
150        CategoryPlot plot = (CategoryPlot) this.chart.getPlot();
151        if (plot == null) {
152            return;
153        }
154        BarRenderer renderer = (BarRenderer) plot.getRenderer();
155        if (renderer == null) {
156            return;
157        }
158        boolean old = renderer.isDrawBarOutline();
159        renderer.setDrawBarOutline(visible);
160        firePropertyChange("barOutlineVisible", old, visible);
161    }
162
163    /**
164     * Returns the overall margin between bars within each category.
165     * 
166     * @return The item margin.
167     * 
168     * @see #setBarItemMargin(double)
169     */
170    public double getBarItemMargin() {
171        CategoryPlot plot = (CategoryPlot) this.chart.getPlot();
172        if (plot == null) {
173            return 0.0;
174        }
175        BarRenderer renderer = (BarRenderer) plot.getRenderer();
176        if (renderer == null) {
177            return 0.0;
178        }
179        return renderer.getItemMargin();
180    }
181    
182    /**
183     * Sets the margin between items within each category and fires a 
184     * {@link PropertyChangeEvent} for the <code>barItemMargin</code> property.
185     * 
186     * @param margin  the new margin value.
187     * 
188     * @see #getBarItemMargin()
189     */
190    public void setBarItemMargin(double margin) {
191        CategoryPlot plot = (CategoryPlot) this.chart.getPlot();
192        if (plot == null) {
193            return;
194        }
195        BarRenderer renderer = (BarRenderer) plot.getRenderer();
196        if (renderer == null) {
197            return;
198        }
199        double old = renderer.getItemMargin();
200        renderer.setItemMargin(margin);
201        firePropertyChange("barItemMargin", old, margin);
202    }
203    
204    /**
205     * Returns the base value for the bars.
206     * 
207     * @return The item margin.
208     * 
209     * @see #setBarBaseValue(double)
210     */
211    public double getBarBaseValue() {
212        CategoryPlot plot = (CategoryPlot) this.chart.getPlot();
213        if (plot == null) {
214            return 0.0;
215        }
216        BarRenderer renderer = (BarRenderer) plot.getRenderer();
217        if (renderer == null) {
218            return 0.0;
219        }
220        return renderer.getBase();
221    }
222    
223    /**
224     * Sets the bar base value and fires a {@link PropertyChangeEvent} for 
225     * the <code>barBaseValue</code> property.
226     * 
227     * @param base  the new base value.
228     * 
229     * @see #getBarBaseValue()
230     */
231    public void setBarBaseValue(double base) {
232        CategoryPlot plot = (CategoryPlot) this.chart.getPlot();
233        if (plot == null) {
234            return;
235        }
236        BarRenderer renderer = (BarRenderer) plot.getRenderer();
237        if (renderer == null) {
238            return;
239        }
240        double old = renderer.getBase();
241        renderer.setBase(base);
242        firePropertyChange("barBaseValue", old, base);
243    }
244
245}