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.axis.CategoryAxis;
037 import org.jfree.chart.plot.CategoryPlot;
038 import org.jfree.chart.plot.PlotOrientation;
039 import org.jfree.chart.renderer.category.BarRenderer;
040 import org.jfree.data.category.CategoryDataset;
041 import org.jfree.data.category.DefaultCategoryDataset;
042 import org.jfree.ui.RectangleInsets;
043
044 /**
045 * A JavaBean that displays a bar chart.
046 */
047 public 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 }