/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved.
* http://www.jaspersoft.com
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is part of JasperReports.
*
* JasperReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JasperReports is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.jasperreports.engine.base;
import java.awt.Color;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
import net.sf.jasperreports.charts.JRCategoryAxisFormat;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartPlot;
import net.sf.jasperreports.engine.JRConstants;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.design.events.JRChangeEventsSupport;
import net.sf.jasperreports.engine.design.events.JRPropertyChangeSupport;
import net.sf.jasperreports.engine.util.JRStyleResolver;
import org.jfree.chart.plot.PlotOrientation;
/**
* @author Teodor Danciu (teodord@users.sourceforge.net)
* @version $Id: JRBaseChartPlot.java 3939 2010-08-20 09:52:00Z teodord $
*/
public abstract class JRBaseChartPlot implements JRChartPlot, Serializable, JRChangeEventsSupport
{
/**
*
*/
private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
public static final String PROPERTY_BACKCOLOR = "backcolor";
public static final String PROPERTY_BACKGROUND_ALPHA = "backgroundAlpha";
public static final String PROPERTY_FOREGROUND_ALPHA = "foregroundAlpha";
public static final String PROPERTY_LABEL_ROTATION = "labelRotation";
public static final String PROPERTY_ORIENTATION = "orientation";
public static final String PROPERTY_SERIES_COLORS = "seriesColors";
protected JRChart chart;
protected Color backcolor;
protected PlotOrientation orientation = PlotOrientation.VERTICAL;
protected Float backgroundAlphaFloat;
protected Float foregroundAlphaFloat;
protected Double labelRotationDouble;
protected SortedSet seriesColors;
/**
*
*/
protected JRBaseChartPlot(JRChartPlot plot, JRChart chart)
{
this.chart = chart;
if (plot != null)
{
backcolor = plot.getOwnBackcolor();
orientation = plot.getOrientation();
backgroundAlphaFloat = plot.getBackgroundAlphaFloat();
foregroundAlphaFloat = plot.getForegroundAlphaFloat();
labelRotationDouble = plot.getLabelRotationDouble();
seriesColors = new TreeSet(plot.getSeriesColors());
}
else
{
seriesColors = new TreeSet();
}
}
/**
*
*/
protected JRBaseChartPlot(JRChartPlot plot, JRBaseObjectFactory factory)
{
factory.put(plot, this);
chart = (JRChart)factory.getVisitResult(plot.getChart());
backcolor = plot.getOwnBackcolor();
orientation = plot.getOrientation();
backgroundAlphaFloat = plot.getBackgroundAlphaFloat();
foregroundAlphaFloat = plot.getForegroundAlphaFloat();
labelRotationDouble = plot.getLabelRotationDouble();
seriesColors = new TreeSet(plot.getSeriesColors());
}
/**
*
*/
public JRChart getChart()
{
return chart;
}
/**
*
*/
public Color getBackcolor()
{
return JRStyleResolver.getBackcolor(this);
}
/**
*
*/
public Color getOwnBackcolor()
{
return this.backcolor;
}
/**
*
*/
public void setBackcolor(Color backcolor)
{
Object old = this.backcolor;
this.backcolor = backcolor;
getEventSupport().firePropertyChange(PROPERTY_BACKCOLOR, old, this.backcolor);
}
/**
*
*/
public PlotOrientation getOrientation()
{
return orientation;
}
/**
*
*/
public void setOrientation(PlotOrientation orientation)
{
Object old = this.orientation;
this.orientation = orientation;
getEventSupport().firePropertyChange(PROPERTY_ORIENTATION, old, this.orientation);
}
/**
* @deprecated Replaced by {@link #getBackgroundAlphaFloat()}
*/
public float getBackgroundAlpha()
{
return backgroundAlphaFloat == null ? 1f : backgroundAlphaFloat.floatValue();
}
/**
* @deprecated Replaced by {@link #setBackgroundAlpha(Float)}
*/
public void setBackgroundAlpha(float backgroundAlpha)
{
setBackgroundAlpha(new Float(backgroundAlpha));
}
/**
* @deprecated Replaced by {@link #getForegroundAlphaFloat()}
*/
public float getForegroundAlpha()
{
return foregroundAlphaFloat == null ? 1f : foregroundAlphaFloat.floatValue();
}
/**
* @deprecated Replaced by {@link #setForegroundAlpha(Float)}
*/
public void setForegroundAlpha(float foregroundAlpha)
{
setForegroundAlpha(new Float(foregroundAlpha));
}
/**
* @deprecated Replaced by {@link #getLabelRotationDouble()}
*/
public double getLabelRotation()
{
return labelRotationDouble == null ? 0d : labelRotationDouble.doubleValue();
}
/**
* @deprecated Replaced by {@link #setLabelRotation(Double)}
*/
public void setLabelRotation(double labelRotation)
{
setLabelRotation(new Double(labelRotation));
}
/**
*
*/
public Float getBackgroundAlphaFloat()
{
return backgroundAlphaFloat;
}
/**
*
*/
public void setBackgroundAlpha(Float backgroundAlpha)
{
Float old = this.backgroundAlphaFloat;
this.backgroundAlphaFloat = backgroundAlpha;
getEventSupport().firePropertyChange(PROPERTY_BACKGROUND_ALPHA, old, this.backgroundAlphaFloat);
}
/**
*
*/
public Float getForegroundAlphaFloat()
{
return foregroundAlphaFloat;
}
/**
*
*/
public void setForegroundAlpha(Float foregroundAlpha)
{
Float old = this.foregroundAlphaFloat;
this.foregroundAlphaFloat = foregroundAlpha;
getEventSupport().firePropertyChange(PROPERTY_FOREGROUND_ALPHA, old, this.foregroundAlphaFloat);
}
/**
* Gets the angle in degrees to rotate the data axis labels. The range is -360 to 360. A positive value angles
* the label so it reads downwards wile a negative value angles the label so it reads upwards. Only charts that
* use a category based axis (such as line or bar charts) support label rotation.
* @deprecated Replaced by {@link JRCategoryAxisFormat#getCategoryAxisTickLabelRotation()}.
*/
public Double getLabelRotationDouble()
{
return labelRotationDouble;
}
/**
* Sets the angle in degrees to rotate the data axis labels. The range is -360 to 360. A positive value angles
* the label so it reads downwards wile a negative value angles the label so it reads upwards. Only charts that
* use a category based axis (such as line or bar charts) support label rotation.
* @deprecated Replaced by {@link JRCategoryAxisFormat#setCategoryAxisTickLabelRotation(Double)}.
*/
public void setLabelRotation(Double labelRotation)
{
Double old = this.labelRotationDouble;
this.labelRotationDouble = labelRotation;
getEventSupport().firePropertyChange(PROPERTY_LABEL_ROTATION, old, this.labelRotationDouble);
}
/**
* Returns a list of all the defined series colors. Every entry in the list is of type JRChartPlot.JRSeriesColor.
* If there are no defined series colors this method will return an empty list, not null.
*/
public SortedSet getSeriesColors()
{
return seriesColors;
}
/**
* Removes all defined series colors.
*/
public void clearSeriesColors()
{
setSeriesColors(null);
}
/**
* Adds the specified series color to the plot.
*/
public void addSeriesColor(JRSeriesColor seriesColor)
{
seriesColors.add(seriesColor);
getEventSupport().fireCollectionElementAddedEvent(PROPERTY_SERIES_COLORS,
seriesColor, seriesColors.size() - 1);
}
public void setSeriesColors(Collection colors)
{
Object old = new TreeSet(seriesColors);
seriesColors.clear();
if (colors != null)
{
seriesColors.addAll(colors);
}
getEventSupport().firePropertyChange(PROPERTY_SERIES_COLORS, old, seriesColors);
}
public static class JRBaseSeriesColor implements JRChartPlot.JRSeriesColor, Serializable, Comparable
{
/**
*
*/
private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
protected int seriesOrder = -1;
protected Color color;
public JRBaseSeriesColor(int seriesOrder, Color color)
{
this.seriesOrder = seriesOrder;
this.color = color;
}
/**
* Returns the series number (0 based) that this color applies to.
*/
public int getSeriesOrder()
{
return seriesOrder;
}
/**
* Returns the color to use for this series.
*/
public Color getColor()
{
return color;
}
public int compareTo(Object obj) {
if (obj == null)
{
throw new IllegalArgumentException();
}
return seriesOrder - ((JRBaseSeriesColor)obj).getSeriesOrder();
}
public Object clone()
{
try
{
return super.clone();
}
catch (CloneNotSupportedException e)
{
throw new JRRuntimeException(e);
}
}
}
/**
*
*/
public Object clone()
{
JRBaseChartPlot clone = null;
try
{
clone = (JRBaseChartPlot)super.clone();
}
catch (CloneNotSupportedException e)
{
throw new JRRuntimeException(e);
}
if (seriesColors != null)
{
clone.seriesColors = new TreeSet();
for(Iterator it = seriesColors.iterator(); it.hasNext();)
{
clone.seriesColors.add(((JRChartPlot.JRSeriesColor)it.next()).clone());
}
}
return clone;
}
/**
*
*/
public Object clone(JRChart parentChart)
{
JRBaseChartPlot clone = (JRBaseChartPlot)this.clone();
clone.chart = parentChart;
return clone;
}
private transient JRPropertyChangeSupport eventSupport;
public JRPropertyChangeSupport getEventSupport()
{
synchronized (this)
{
if (eventSupport == null)
{
eventSupport = new JRPropertyChangeSupport(this);
}
}
return eventSupport;
}
/*
* These fields are only for serialization backward compatibility.
*/
private int PSEUDO_SERIAL_VERSION_UID = JRConstants.PSEUDO_SERIAL_VERSION_UID; //NOPMD
/**
* @deprecated
*/
private float backgroundAlpha = 1;
/**
* @deprecated
*/
private float foregroundAlpha = 1;
/**
* @deprecated
*/
private double labelRotation = 0.0;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
in.defaultReadObject();
if (PSEUDO_SERIAL_VERSION_UID < JRConstants.PSEUDO_SERIAL_VERSION_UID_3_1_3)
{
backgroundAlphaFloat = new Float(backgroundAlpha);
foregroundAlphaFloat = new Float(foregroundAlpha);
labelRotationDouble = new Double(labelRotation);
}
}
}