/* ===========================================================
* Orson Charts : a 3D chart library for the Java(tm) platform
* ===========================================================
*
* (C)opyright 2013-2016, by Object Refinery Limited. All rights reserved.
*
* http://www.object-refinery.com/orsoncharts/index.html
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
* Other names may be trademarks of their respective owners.]
*
* If you do not wish to be bound by the terms of the GPL, an alternative
* commercial license can be purchased. For details, please see visit the
* Orson Charts home page:
*
* http://www.object-refinery.com/orsoncharts/index.html
*
*/
package com.orsoncharts.style;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Stroke;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
import javax.swing.event.EventListenerList;
import com.orsoncharts.ChartBox3D;
import com.orsoncharts.Colors;
import com.orsoncharts.table.RectanglePainter;
import com.orsoncharts.table.StandardRectanglePainter;
import com.orsoncharts.util.ArgChecks;
import com.orsoncharts.util.SerialUtils;
/**
* A standard implementation of the {@link ChartStyle} interface.
* <br><br>
* NOTE: This class is serializable, but the serialization format is subject
* to change in future releases and should not be relied upon for persisting
* instances of this class.
*
* @since 1.2
*/
@SuppressWarnings("serial")
public class StandardChartStyle implements ChartStyle, Cloneable, Serializable {
/** The first font family to try (usually found on Windows). */
private static final String FONT_FAMILY_1 = "Palatino Linotype";
/** The second font family to try (usually found on MacOSX). */
private static final String FONT_FAMILY_2 = "Palatino";
/**
* Creates a default font with the specified {@code style} and
* {@code size}. The method attempts to use 'Palatino Linotype'
* ('Palatino' on MacOSX) but if it is not found it falls back to the
* {@code Font.SERIF} font family.
*
* @param style the style (see java.awt.Font).
* @param size the size.
*
* @return The font.
*
* @since 1.3
*/
public static Font createDefaultFont(int style, int size) {
Font f = new Font(FONT_FAMILY_1, style, size);
if ("Dialog".equals(f.getFamily())) {
f = new Font(FONT_FAMILY_2, style, size);
if ("Dialog".equals(f.getFamily())) {
f = new Font(Font.SERIF, style, size);
}
}
return f;
}
/**
* The default background color for the title and subtitle, and legend
* header and footer.
*/
public static final Color DEFAULT_TEXT_BACKGROUND_COLOR
= new Color(255, 255, 255, 100);
/** The default title font. */
public static final Font DEFAULT_TITLE_FONT
= createDefaultFont(Font.PLAIN, 32);
/** The default subtitle font. */
public static final Font DEFAULT_SUBTITLE_FONT
= createDefaultFont(Font.PLAIN, 18);
/** The default chartbox color. */
public static final Color DEFAULT_CHARTBOX_COLOR = new Color(255, 255, 255,
100);
/** The default visibility for gridlines perpendicular to the row-axis. */
public static final boolean DEFAULT_ROW_GRIDLINES_VISIBLE = false;
/** The default visibility for gridlines perpendicular to the column-axis. */
public static final boolean DEFAULT_COLUMN_GRIDLINES_VISIBLE = false;
/** The default visibility for gridlines perpendicular to the x-axis. */
public static final boolean DEFAULT_X_GRIDLINES_VISIBLE = true;
/** The default visibility for gridlines perpendicular to the y-axis. */
public static final boolean DEFAULT_Y_GRIDLINES_VISIBLE = true;
/** The default visibility for gridlines perpendicular to the z-axis. */
public static final boolean DEFAULT_Z_GRIDLINES_VISIBLE = true;
/** The default gridline color. */
public static final Color DEFAULT_GRIDLINE_COLOR = Color.GRAY;
/** The default gridline stroke. */
public static final Stroke DEFAULT_GRIDLINE_STROKE = new BasicStroke(0f);
/** The default font for pie section labels. */
public static final Font DEFAULT_SECTION_LABEL_FONT = createDefaultFont(
Font.PLAIN, 14);
/** The default color for pie section labels. */
public static final Color DEFAULT_SECTION_LABEL_COLOR = Color.BLACK;
/** The default font for axis labels. */
public static final Font DEFAULT_AXIS_LABEL_FONT
= createDefaultFont(Font.BOLD, 12);
/** The default foreground color for axis labels. */
public static final Color DEFAULT_AXIS_LABEL_COLOR = Color.BLACK;
/** The default font for axis tick labels. */
public static final Font DEFAULT_AXIS_TICK_LABEL_FONT
= createDefaultFont(Font.PLAIN, 12);
/** The default foreground color for axis tick labels. */
public static final Color DEFAULT_AXIS_TICK_LABEL_COLOR = Color.BLACK;
/** The default font for legend headers. */
public static final Font DEFAULT_LEGEND_HEADER_FONT = createDefaultFont(
Font.BOLD, 14);
/** The default foreground color for the legend header if there is one. */
public static final Color DEFAULT_LEGEND_HEADER_COLOR = Color.BLACK;
/** The default legend item shape. */
public static final Shape DEFAULT_LEGEND_ITEM_SHAPE
= new Rectangle2D.Double(-6, -4, 12, 8);
/** The default font for legend item text. */
public static final Font DEFAULT_LEGEND_ITEM_FONT = createDefaultFont(
Font.PLAIN, 12);
/** The default legend item color. */
public static final Color DEFAULT_LEGEND_ITEM_COLOR = Color.BLACK;
/** The default legend item background color. */
public static final Color DEFAULT_LEGEND_ITEM_BACKGROUND_COLOR
= new Color(255, 255, 255, 100);
/** The default font for legend footers. */
public static final Font DEFAULT_LEGEND_FOOTER_FONT = createDefaultFont(
Font.PLAIN, 10);
/** The default foreground color for the legend footer if there is one. */
public static final Color DEFAULT_LEGEND_FOOTER_COLOR = Color.BLACK;
public static final Font DEFAULT_MARKER_LABEL_FONT = createDefaultFont(
Font.PLAIN, 10);
public static final Color DEFAULT_MARKER_LABEL_COLOR = Color.DARK_GRAY;
public static final Stroke DEFAULT_MARKER_LINE_STROKE = new BasicStroke(
2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
public static final Color DEFAULT_MARKER_LINE_COLOR = Color.DARK_GRAY;
public static final Color DEFAULT_MARKER_FILL_COLOR
= new Color(127, 127, 127, 63);
/** The background painter. */
private RectanglePainter backgroundPainter;
/** The chart title font. */
private Font titleFont;
/** The foreground color for the chart title. */
private Color titleColor;
/** The background color for the chart title. */
private Color titleBackgroundColor;
/** The chart subtitle font. */
private Font subtitleFont;
/** The foreground color for the chart subtitle. */
private Color subtitleColor;
/** The background color for the chart subtitle. */
private Color subtitleBackgroundColor;
/** The color for the chart box, if there is one. */
private Color chartBoxColor;
/** Are gridlines visible for the row-axis? */
private boolean rowAxisGridlinesVisible;
/** Are gridlines visible for the column-axis? */
private boolean columnAxisGridlinesVisible;
/** Are gridlines visible for the x-axis? */
private boolean xAxisGridlinesVisible;
/** Are gridlines visible for the y-axis? */
private boolean yAxisGridlinesVisible;
/** Are gridlines visible for the z-axis? */
private boolean zAxisGridlinesVisible;
/** The gridline color. */
private Color gridlineColor;
/** The gridline stroke. */
private transient Stroke gridlineStroke;
/** The font for pie section labels. */
private Font sectionLabelFont;
/** The foreground color for pie section labels. */
private Color sectionLabelColor;
/** The standard colors (to color pie sections or data series). */
private Color[] standardColors;
/** The axis label font. */
private Font axisLabelFont;
/** The color for the axis label. */
private Color axisLabelColor;
/** The axis tick label font. */
private Font axisTickLabelFont;
/** The color used to draw axis tick labels. */
private Color axisTickLabelColor;
/** The legend header font. */
private Font legendHeaderFont;
/** The legend header foreground color. */
private Color legendHeaderColor;
/** The legend header background color. */
private Color legendHeaderBackgroundColor;
/** The legend item shape. */
private Shape legendItemShape;
/** The legend item font. */
private Font legendItemFont;
/** The legend item color. */
private Color legendItemColor;
/** The legend item background color. */
private Color legendItemBackgroundColor;
/** The legend footer font. */
private Font legendFooterFont;
/** The foreground color for the legend footer if there is one. */
private Color legendFooterColor;
/** The background color for the legend footer if there is one. */
private Color legendFooterBackgroundColor;
/** The font used to draw marker labels. */
private Font markerLabelFont;
/** The color used to draw marker labels. */
private Color markerLabelColor;
/** The stroke used to draw marker lines. */
private transient Stroke markerLineStroke;
/** The color used to draw marker lines. */
private Color markerLineColor;
/** The color used to fill the band representing the marker range. */
private Color markerFillColor;
/** Storage for registered change listeners. */
private transient EventListenerList listenerList;
/**
* A flag that controls whether or not the chart will notify listeners
* of changes (defaults to {@code true}, but sometimes it is useful
* to disable this).
*/
private boolean notify;
/**
* Creates a new instance with default attributes.
*/
public StandardChartStyle() {
this.backgroundPainter = new StandardRectanglePainter(Color.WHITE);
this.titleFont = DEFAULT_TITLE_FONT;
this.titleColor = Color.BLACK;
this.titleBackgroundColor = DEFAULT_TEXT_BACKGROUND_COLOR;
this.subtitleColor = Color.BLACK;
this.subtitleBackgroundColor = DEFAULT_TEXT_BACKGROUND_COLOR;
this.subtitleFont = DEFAULT_SUBTITLE_FONT;
this.chartBoxColor = DEFAULT_CHARTBOX_COLOR;
this.rowAxisGridlinesVisible = DEFAULT_ROW_GRIDLINES_VISIBLE;
this.columnAxisGridlinesVisible = DEFAULT_COLUMN_GRIDLINES_VISIBLE;
this.xAxisGridlinesVisible = DEFAULT_X_GRIDLINES_VISIBLE;
this.yAxisGridlinesVisible = DEFAULT_Y_GRIDLINES_VISIBLE;
this.zAxisGridlinesVisible = DEFAULT_Z_GRIDLINES_VISIBLE;
this.gridlineColor = DEFAULT_GRIDLINE_COLOR;
this.gridlineStroke = DEFAULT_GRIDLINE_STROKE;
this.sectionLabelFont = DEFAULT_SECTION_LABEL_FONT;
this.sectionLabelColor = DEFAULT_SECTION_LABEL_COLOR;
this.standardColors = Colors.getDefaultColors();
this.axisLabelFont = DEFAULT_AXIS_LABEL_FONT;
this.axisLabelColor = DEFAULT_AXIS_LABEL_COLOR;
this.axisTickLabelFont = DEFAULT_AXIS_TICK_LABEL_FONT;
this.axisTickLabelColor = DEFAULT_AXIS_TICK_LABEL_COLOR;
this.legendHeaderFont = DEFAULT_LEGEND_HEADER_FONT;
this.legendHeaderColor = DEFAULT_LEGEND_HEADER_COLOR;
this.legendHeaderBackgroundColor = DEFAULT_TEXT_BACKGROUND_COLOR;
this.legendItemShape = DEFAULT_LEGEND_ITEM_SHAPE;
this.legendItemFont = DEFAULT_LEGEND_ITEM_FONT;
this.legendItemColor = DEFAULT_LEGEND_ITEM_COLOR;
this.legendItemBackgroundColor = DEFAULT_LEGEND_ITEM_BACKGROUND_COLOR;
this.legendFooterFont = DEFAULT_LEGEND_FOOTER_FONT;
this.legendFooterColor = DEFAULT_LEGEND_FOOTER_COLOR;
this.legendFooterBackgroundColor = DEFAULT_TEXT_BACKGROUND_COLOR;
this.markerLabelFont = DEFAULT_MARKER_LABEL_FONT;
this.markerLabelColor = DEFAULT_MARKER_LABEL_COLOR;
this.markerLineStroke = DEFAULT_MARKER_LINE_STROKE;
this.markerLineColor = DEFAULT_MARKER_LINE_COLOR;
this.markerFillColor = DEFAULT_MARKER_FILL_COLOR;
this.listenerList = new EventListenerList();
this.notify = true;
}
/**
* A copy constructor that creates a new style that is a copy of an
* existing style (note that the existing style listeners are not copied).
*
* @param source the source style to copy ({@code null} not
* permitted).
*/
public StandardChartStyle(StandardChartStyle source) {
ArgChecks.nullNotPermitted(source, "source");
this.backgroundPainter = source.getBackgroundPainter();
this.titleFont = source.getTitleFont();
this.titleColor = source.getTitleColor();
this.titleBackgroundColor = source.getTitleBackgroundColor();
this.subtitleFont = source.getSubtitleFont();
this.subtitleColor = source.getSubtitleColor();
this.subtitleBackgroundColor = source.getSubtitleBackgroundColor();
this.chartBoxColor = source.getChartBoxColor();
this.xAxisGridlinesVisible = source.getXAxisGridlinesVisible();
this.yAxisGridlinesVisible = source.getYAxisGridlinesVisible();
this.zAxisGridlinesVisible = source.getZAxisGridlinesVisible();
this.sectionLabelFont = source.getSectionLabelFont();
this.sectionLabelColor = source.getSectionLabelColor();
this.standardColors = source.getStandardColors();
this.gridlineColor = source.getGridlineColor();
this.gridlineStroke = source.getGridlineStroke();
this.axisLabelFont = source.getAxisLabelFont();
this.axisLabelColor = source.getAxisLabelColor();
this.axisTickLabelFont = source.getAxisTickLabelFont();
this.axisTickLabelColor = source.getAxisTickLabelColor();
this.legendHeaderFont = source.getLegendHeaderFont();
this.legendHeaderColor = source.getLegendHeaderColor();
this.legendHeaderBackgroundColor
= source.getLegendHeaderBackgroundColor();
this.legendItemShape = source.getLegendItemShape();
this.legendItemFont = source.getLegendItemFont();
this.legendItemColor = source.getLegendItemColor();
this.legendItemBackgroundColor = source.getLegendItemBackgroundColor();
this.legendFooterFont = source.getLegendFooterFont();
this.legendFooterColor = source.getLegendFooterColor();
this.legendFooterBackgroundColor
= source.getLegendFooterBackgroundColor();
this.markerLabelFont = source.getMarkerLabelFont();
this.markerLabelColor = source.getMarkerLabelColor();
this.markerLineStroke = source.getMarkerLineStroke();
this.markerLineColor = source.getMarkerLineColor();
this.markerFillColor = source.getMarkerFillColor();
this.listenerList = new EventListenerList();
this.notify = true;
}
/**
* Returns the background painter.
*
* @return The background painter (never {@code null}).
*/
@Override
public RectanglePainter getBackgroundPainter() {
return this.backgroundPainter;
}
/**
* Sets the background painter.
*
* @param painter the painter ({@code null} not permitted).
*/
public void setBackgroundPainter(RectanglePainter painter) {
ArgChecks.nullNotPermitted(painter, "painter");
this.backgroundPainter = painter;
fireChangeEvent();
}
/**
* Returns the chart title font. The default value is
* {@link #DEFAULT_TITLE_FONT}.
*
* @return The chart title font (never {@code null}).
*/
@Override
public Font getTitleFont() {
return this.titleFont;
}
/**
* Sets the font used for the chart title and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param font the font ({@code null} not permitted).
*/
public void setTitleFont(Font font) {
ArgChecks.nullNotPermitted(font, "font");
this.titleFont = font;
fireChangeEvent();
}
/**
* Returns the title color. The default value is {@link Color#BLACK}.
*
* @return The title color (never {@code null}).
*/
@Override
public Color getTitleColor() {
return this.titleColor;
}
/**
* Sets the foreground color for the chart title and sends a
* change event to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setTitleColor(Color color) {
this.titleColor = color;
fireChangeEvent();
}
/**
* Returns the background color for the title. The default value is
* {@link #DEFAULT_TEXT_BACKGROUND_COLOR}.
*
* @return The background color (never {@code null}).
*/
@Override
public Color getTitleBackgroundColor() {
return this.titleBackgroundColor;
}
/**
* Sets the background color for the title and sends a
* change event to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setTitleBackgroundColor(Color color) {
this.titleBackgroundColor = color;
fireChangeEvent();
}
/**
* Returns the font used for the chart subtitle. The default value
* is {@link #DEFAULT_SUBTITLE_FONT}.
*
* @return The chart subtitle font (never {@code null}).
*/
@Override
public Font getSubtitleFont() {
return this.subtitleFont;
}
/**
* Sets the font used for the chart subtitle and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param font the font ({@code null} not permitted).
*/
public void setSubtitleFont(Font font) {
ArgChecks.nullNotPermitted(font, "font");
this.subtitleFont = font;
fireChangeEvent();
}
/**
* Returns the color for the chart subtitle. The default value is
* {@link Color#BLACK}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getSubtitleColor() {
return this.subtitleColor;
}
/**
* Sets the color for the chart subtitle and sends a
* change event to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setSubtitleColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.subtitleColor = color;
fireChangeEvent();
}
/**
* Returns the background color for the chart subtitle. The default value
* is {@link #DEFAULT_TEXT_BACKGROUND_COLOR}.
*
* @return The background color (never {@code null}).
*/
@Override
public Color getSubtitleBackgroundColor() {
return this.subtitleBackgroundColor;
}
/**
* Sets the background color for the chart subtitle and sends a
* change event to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setSubtitleBackgroundColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.subtitleBackgroundColor = color;
fireChangeEvent();
}
/**
* Returns the color used for the {@link ChartBox3D} (for those charts that
* have one). The default value is {@link #DEFAULT_CHARTBOX_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getChartBoxColor() {
return this.chartBoxColor;
}
/**
* Sets the color used for the chart box and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setChartBoxColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.chartBoxColor = color;
fireChangeEvent();
}
/**
* Returns the flag that controls whether or not gridlines are drawn
* perpendicular to the column axis in category plots.
*
* @return A boolean.
*/
@Override
public boolean getColumnAxisGridlinesVisible() {
return this.columnAxisGridlinesVisible;
}
/**
* Returns the flag that controls whether or not gridlines are drawn
* perpendicular to the row axis in category plots.
*
* @return A boolean.
*/
@Override
public boolean getRowAxisGridlinesVisible() {
return this.rowAxisGridlinesVisible;
}
/**
* Returns the flag that specifies whether or not gridlines are drawn for
* the x-axis. The default value is {@code false}.
*
* @return A boolean.
*/
@Override
public boolean getXAxisGridlinesVisible() {
return this.xAxisGridlinesVisible;
}
/**
* Sets the flag that controls whether or not gridlines are drawn for
* the x-axis and sends a {@link ChartStyleChangeEvent} to all
* registered listeners.
*
* @param visible the new flag value.
*/
public void setXAxisGridlinesVisible(boolean visible) {
this.xAxisGridlinesVisible = visible;
fireChangeEvent();
}
/**
* Returns the flag that specifies whether or not gridlines are drawn for
* the y-axis. The default value is {@code true}.
*
* @return A boolean.
*/
@Override
public boolean getYAxisGridlinesVisible() {
return this.yAxisGridlinesVisible;
}
/**
* Sets the flag that controls whether or not gridlines are drawn for
* the y-axis and sends a {@link ChartStyleChangeEvent} to all
* registered listeners.
*
* @param visible the new flag value.
*/
public void setYAxisGridlinesVisible(boolean visible) {
this.yAxisGridlinesVisible = visible;
fireChangeEvent();
}
/**
* Returns the flag that specifies whether or not gridlines are drawn for
* the z-axis. The default value is {@code true}.
*
* @return A boolean.
*/
@Override
public boolean getZAxisGridlinesVisible() {
return this.zAxisGridlinesVisible;
}
/**
* Sets the flag that controls whether or not gridlines are drawn for
* the z-axis and sends a {@link ChartStyleChangeEvent} to all
* registered listeners.
*
* @param visible the new flag value.
*/
public void setZAxisGridlinesVisible(boolean visible) {
this.zAxisGridlinesVisible = visible;
fireChangeEvent();
}
/**
* Returns the color used for the gridlines. The default value is
* {@link #DEFAULT_GRIDLINE_STROKE}.
*
* @return The color used for the gridlines (never {@code null}).
*/
@Override
public Color getGridlineColor() {
return this.gridlineColor;
}
/**
* Sets the color for the gridlines and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setGridlineColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.gridlineColor = color;
fireChangeEvent();
}
/**
* Returns the stroke used to draw the gridlines. The default value is
* {@link #DEFAULT_GRIDLINE_STROKE}.
*
* @return The stroke (never {@code null}).
*/
@Override
public Stroke getGridlineStroke() {
return this.gridlineStroke;
}
/**
* Sets the stroke used for gridlines and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param stroke the stroke ({@code null} not permitted).
*/
public void setGridlineStroke(Stroke stroke) {
ArgChecks.nullNotPermitted(stroke, "stroke");
this.gridlineStroke = stroke;
fireChangeEvent();
}
/**
* Returns the font used for pie section labels. The default value is
* {@link #DEFAULT_SECTION_LABEL_FONT}.
*
* @return The font used for pie section labels (never {@code null}).
*/
@Override
public Font getSectionLabelFont() {
return this.sectionLabelFont;
}
/**
* Sets the font used for the pie section labels and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param font the font ({@code null} not permitted).
*/
public void setSectionLabelFont(Font font) {
ArgChecks.nullNotPermitted(font, "font");
this.sectionLabelFont = font;
fireChangeEvent();
}
/**
* Returns the color used to display pie section labels. The default
* value is {@link #DEFAULT_SECTION_LABEL_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getSectionLabelColor() {
return this.sectionLabelColor;
}
/**
* Sets the color used for the pie section labels and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setSectionLabelColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.sectionLabelColor = color;
fireChangeEvent();
}
/**
* Returns the standard colors for the style. The default value is
* initialised by calling {@link Colors#getDefaultColors()}.
*
* @return The standard colors (never {@code null}).
*/
@Override
public Color[] getStandardColors() {
return this.standardColors;
}
/**
* Sets the standard colors for the chart and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param colors the colors ({@code null} not permitted).
*/
public void setStandardColors(Color... colors) {
this.standardColors = colors;
fireChangeEvent();
}
/**
* Returns the font used for the axis label. The default value is
* {@link #DEFAULT_AXIS_LABEL_FONT}.
*
* @return The font used for the axis label.
*/
@Override
public Font getAxisLabelFont() {
return this.axisLabelFont;
}
/**
* Sets the font used for the axis label and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param font the font ({@code null} not permitted).
*/
public void setAxisLabelFont(Font font) {
ArgChecks.nullNotPermitted(font, "font");
this.axisLabelFont = font;
fireChangeEvent();
}
/**
* Returns the foreground color for the axis label (the main label, not
* the tick labels). The default value is
* {@link #DEFAULT_AXIS_LABEL_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getAxisLabelColor() {
return this.axisLabelColor;
}
/**
* Sets the foreground color for the axis label and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setAxisLabelColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.axisLabelColor = color;
fireChangeEvent();
}
/**
* Returns the font used for the axis tick labels. The default value
* is {@link #DEFAULT_AXIS_TICK_LABEL_FONT}.
*
* @return The font (never {@code null}).
*/
@Override
public Font getAxisTickLabelFont() {
return this.axisTickLabelFont;
}
/**
* Sets the font used for the axis tick labels and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param font the font ({@code null} not permitted).
*/
public void setAxisTickLabelFont(Font font) {
ArgChecks.nullNotPermitted(font, "font");
this.axisTickLabelFont = font;
fireChangeEvent();
}
/**
* Returns the color used to draw the tick labels on the axis. The
* default value is {@link #DEFAULT_AXIS_TICK_LABEL_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getAxisTickLabelColor() {
return this.axisTickLabelColor;
}
/**
* Sets the foreground color for the axis tick labels and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setAxisTickLabelColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.axisTickLabelColor = color;
fireChangeEvent();
}
/**
* Returns the font used to display the legend header. The default
* value is {@link #DEFAULT_LEGEND_HEADER_FONT}.
*
* @return The font (never {@code null}).
*/
@Override
public Font getLegendHeaderFont() {
return this.legendHeaderFont;
}
/**
* Sets the legend header font and sends a {@link ChartStyleChangeEvent} to
* all registered listeners.
*
* @param font the font ({@code null} not permitted).
*/
public void setLegendHeaderFont(Font font) {
ArgChecks.nullNotPermitted(font, "font");
this.legendHeaderFont = font;
fireChangeEvent();
}
/**
* Returns the foreground color for the legend header. The default value
* is {@link #DEFAULT_LEGEND_HEADER_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getLegendHeaderColor() {
return this.legendHeaderColor;
}
/**
* Sets the foreground color for the legend header and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setLegendHeaderColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.legendHeaderColor = color;
fireChangeEvent();
}
/**
* Returns the background color for the legend header. The default value
* is {@link #DEFAULT_TEXT_BACKGROUND_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getLegendHeaderBackgroundColor() {
return this.legendHeaderBackgroundColor;
}
/**
* Sets the background color for the legend header and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setLegendHeaderBackgroundColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.legendHeaderBackgroundColor = color;
fireChangeEvent();
}
/**
* Returns the standard shape for legend items. The default value
* is {@link #DEFAULT_LEGEND_ITEM_SHAPE}.
*
* @return The legend shape (never {@code null}).
*/
@Override
public Shape getLegendItemShape() {
return this.legendItemShape;
}
/**
* Sets the default shape for legend items and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param shape the shape ({@code null} not permitted).
*/
public void setLegendItemShape(Shape shape) {
ArgChecks.nullNotPermitted(shape, "shape");
this.legendItemShape = shape;
fireChangeEvent();
}
/**
* Returns the font used for legend item text. The default value is
* {@link #DEFAULT_LEGEND_ITEM_FONT}.
*
* @return The font used for legend item text (never {@code null}).
*/
@Override
public Font getLegendItemFont() {
return this.legendItemFont;
}
/**
* Sets the legend item font and sends a {@link ChartStyleChangeEvent} to
* all registered listeners.
*
* @param font the font ({@code null} not permitted).
*/
public void setLegendItemFont(Font font) {
ArgChecks.nullNotPermitted(font, "font");
this.legendItemFont = font;
fireChangeEvent();
}
/**
* Returns the foreground color used for the legend items. The default
* value is {@link #DEFAULT_LEGEND_ITEM_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getLegendItemColor() {
return this.legendItemColor;
}
/**
* Sets the foreground color used for legend item text and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setLegendItemColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.legendItemColor = color;
fireChangeEvent();
}
/**
* Returns the background color for legend items. The default value is
* {@link #DEFAULT_LEGEND_ITEM_BACKGROUND_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getLegendItemBackgroundColor() {
return this.legendItemBackgroundColor;
}
/**
* Sets the background color for legend items and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setLegendItemBackgroundColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.legendItemBackgroundColor = color;
fireChangeEvent();
}
/**
* Returns the font for the legend footer. The default value is
* {@link #DEFAULT_LEGEND_FOOTER_FONT}.
*
* @return The font (never {@code null}).
*/
@Override
public Font getLegendFooterFont() {
return this.legendFooterFont;
}
/**
* Sets the legend footer font and sends a {@link ChartStyleChangeEvent} to
* all registered listeners.
*
* @param font the font ({@code null} not permitted).
*/
public void setLegendFooterFont(Font font) {
ArgChecks.nullNotPermitted(font, "font");
this.legendFooterFont = font;
fireChangeEvent();
}
/**
* Returns the foreground color for the legend footer. The default
* value is {@link #DEFAULT_LEGEND_FOOTER_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getLegendFooterColor() {
return this.legendFooterColor;
}
/**
* Sets the foreground color for the legend footer and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setLegendFooterColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.legendFooterColor = color;
fireChangeEvent();
}
/**
* Returns the background color for the legend footer. The default
* value is {@link #DEFAULT_TEXT_BACKGROUND_COLOR}.
*
* @return The color (never {@code null}).
*/
@Override
public Color getLegendFooterBackgroundColor() {
return this.legendFooterBackgroundColor;
}
/**
* Sets the background color for the legend footer and sends a
* {@link ChartStyleChangeEvent} to all registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setLegendFooterBackgroundColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.legendFooterBackgroundColor = color;
fireChangeEvent();
}
/**
* Returns the font used to draw marker labels.
*
* @return The font used to draw marker labels (never {@code null}).
*/
@Override
public Font getMarkerLabelFont() {
return this.markerLabelFont;
}
/**
* Sets the marker label font and sends a change event to all registered
* listeners.
*
* @param font the font ({@code null} not permitted).
*/
public void setMarkerLabelFont(Font font) {
ArgChecks.nullNotPermitted(font, "font");
this.markerLabelFont = font;
fireChangeEvent();
}
/**
* Returns the color for the marker labels.
*
* @return The color for the marker labels (never {@code null}).
*/
@Override
public Color getMarkerLabelColor() {
return this.markerLabelColor;
}
/**
* Sets the color for the marker labels and sends a change event to all
* registered listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setMarkerLabelColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.markerLabelColor = color;
fireChangeEvent();
}
/**
* Returns the stroke used to draw marker lines.
*
* @return The stroke used to draw marker lines (never {@code null}).
*/
@Override
public Stroke getMarkerLineStroke() {
return this.markerLineStroke;
}
/**
* Sets the stroke for the marker lines and sends a change event to all
* registered listeners.
*
* @param stroke the stroke ({@code null} not permitted).
*/
public void setMarkerLineStroke(Stroke stroke) {
ArgChecks.nullNotPermitted(stroke, "stroke");
this.markerLineStroke = stroke;
fireChangeEvent();
}
/**
* Returns the color used to draw marker lines.
*
* @return The color used to draw marker lines (never {@code null}).
*/
@Override
public Color getMarkerLineColor() {
return markerLineColor;
}
/**
* Sets the marker line color and sends a change event to all registered
* listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setMarkerLineColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.markerLineColor = color;
fireChangeEvent();
}
/**
* Returns the color used to fill the band representing the marker range.
*
* @return The fill color (never {@code null}).
*/
@Override
public Color getMarkerFillColor() {
return markerFillColor;
}
/**
* Sets the marker fill color and sends a change event to all registered
* listeners.
*
* @param color the color ({@code null} not permitted).
*/
public void setMarkerFillColor(Color color) {
ArgChecks.nullNotPermitted(color, "color");
this.markerFillColor = color;
fireChangeEvent();
}
/**
* Registers a listener to receive notification of changes to the chart.
* When a style is added to a chart, the chart will register as a listener
* on the style.
*
* @param listener the listener.
*/
@Override
public void addChangeListener(ChartStyleChangeListener listener) {
this.listenerList.add(ChartStyleChangeListener.class, listener);
}
/**
* Deregisters a listener so that it no longer receives notification of
* changes to the chart.
*
* @param listener the listener.
*/
@Override
public void removeChangeListener(ChartStyleChangeListener listener) {
this.listenerList.remove(ChartStyleChangeListener.class, listener);
}
/**
* Notifies all registered listeners that the chart style has been modified.
*
* @param event information about the change event.
*/
public void notifyListeners(ChartStyleChangeEvent event) {
// if the 'notify' flag has been switched to false, we don't notify
// the listeners
if (!this.notify) {
return;
}
Object[] listeners = this.listenerList.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ChartStyleChangeListener.class) {
((ChartStyleChangeListener) listeners[i + 1]).styleChanged(event);
}
}
}
/**
* Returns a flag that controls whether or not change events are sent to
* registered listeners.
*
* @return A boolean.
*
* @see #setNotify(boolean)
*/
public boolean isNotify() {
return this.notify;
}
/**
* Sets a flag that controls whether or not listeners receive
* {@link ChartStyleChangeEvent} notifications. This can be useful when
* updating multiple style attributes, you can call setNotify(false) first,
* update the styles, then call setNotify(true) at the end.
*
* @param notify a boolean.
*
* @see #isNotify()
*/
public void setNotify(boolean notify) {
this.notify = notify;
// if the flag is being set to true, there may be queued up changes...
if (notify) {
fireChangeEvent();
}
}
/**
* Sends a {@link ChartStyleChangeEvent} to all registered listeners.
*/
protected void fireChangeEvent() {
notifyListeners(new ChartStyleChangeEvent(this, this));
}
/**
* Returns a clone of the chart style (note that the change listeners
* are not cloned).
*
* @return A clone (never {@code null}).
*/
@Override
public ChartStyle clone() {
try {
return (ChartStyle) super.clone();
} catch (CloneNotSupportedException e) {
throw new IllegalStateException(
"If we get here, a bug needs fixing.");
}
}
/**
* Tests this instance for equality with an arbitrary object.
*
* @param obj the object ({@code null} permitted).
*
* @return A boolean.
*/
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof StandardChartStyle)) {
return false;
}
StandardChartStyle that = (StandardChartStyle) obj;
if (!this.backgroundPainter.equals(that.backgroundPainter)) {
return false;
}
if (!this.titleFont.equals(that.titleFont)) {
return false;
}
if (!this.titleColor.equals(that.titleColor)) {
return false;
}
if (!this.titleBackgroundColor.equals(that.titleBackgroundColor)) {
return false;
}
if (!this.subtitleFont.equals(that.subtitleFont)) {
return false;
}
if (!this.subtitleColor.equals(that.subtitleColor)) {
return false;
}
if (!this.subtitleBackgroundColor.equals(
that.subtitleBackgroundColor)) {
return false;
}
if (!this.chartBoxColor.equals(that.chartBoxColor)) {
return false;
}
if (this.rowAxisGridlinesVisible!= that.rowAxisGridlinesVisible) {
return false;
}
if (this.columnAxisGridlinesVisible
!= that.columnAxisGridlinesVisible) {
return false;
}
if (this.xAxisGridlinesVisible != that.xAxisGridlinesVisible) {
return false;
}
if (this.yAxisGridlinesVisible != that.yAxisGridlinesVisible) {
return false;
}
if (this.zAxisGridlinesVisible != that.zAxisGridlinesVisible) {
return false;
}
if (!this.gridlineColor.equals(that.gridlineColor)) {
return false;
}
if (!this.gridlineStroke.equals(that.gridlineStroke)) {
return false;
}
if (!this.sectionLabelFont.equals(that.sectionLabelFont)) {
return false;
}
if (!this.sectionLabelColor.equals(that.sectionLabelColor)) {
return false;
}
if (!Arrays.equals(this.standardColors, that.standardColors)) {
return false;
}
if (!this.axisLabelFont.equals(that.axisLabelFont)) {
return false;
}
if (!this.axisLabelColor.equals(that.axisLabelColor)) {
return false;
}
if (!this.axisTickLabelFont.equals(that.axisTickLabelFont)) {
return false;
}
if (!this.axisTickLabelColor.equals(that.axisTickLabelColor)) {
return false;
}
if (!this.legendHeaderFont.equals(that.legendHeaderFont)) {
return false;
}
if (!this.legendHeaderColor.equals(that.legendHeaderColor)) {
return false;
}
if (!this.legendHeaderBackgroundColor.equals(
that.legendHeaderBackgroundColor)) {
return false;
}
if (!this.legendItemShape.equals(that.legendItemShape)) {
return false;
}
if (!this.legendItemFont.equals(that.legendItemFont)) {
return false;
}
if (!this.legendItemColor.equals(that.legendItemColor)) {
return false;
}
if (!this.legendItemBackgroundColor.equals(
that.legendItemBackgroundColor)) {
return false;
}
if (!this.legendFooterFont.equals(that.legendFooterFont)) {
return false;
}
if (!this.legendFooterColor.equals(that.legendFooterColor)) {
return false;
}
if (!this.legendFooterBackgroundColor.equals(
that.legendFooterBackgroundColor)) {
return false;
}
if (!this.markerLabelFont.equals(that.markerLabelFont)) {
return false;
}
if (!this.markerLabelColor.equals(that.markerLabelColor)) {
return false;
}
if (!this.markerLineColor.equals(that.markerLineColor)) {
return false;
}
if (!this.markerLineStroke.equals(that.markerLineStroke)) {
return false;
}
if (!this.markerFillColor.equals(that.markerFillColor)) {
return false;
}
return true;
}
/**
* Provides serialization support.
*
* @param stream the output stream.
*
* @throws IOException if there is an I/O error.
*/
private void writeObject(ObjectOutputStream stream) throws IOException {
stream.defaultWriteObject();
SerialUtils.writeStroke(this.gridlineStroke, stream);
SerialUtils.writeStroke(this.markerLineStroke, stream);
}
/**
* Provides serialization support.
*
* @param stream the input stream.
*
* @throws IOException if there is an I/O error.
* @throws ClassNotFoundException if there is a classpath problem.
*/
private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
this.gridlineStroke = SerialUtils.readStroke(stream);
this.markerLineStroke = SerialUtils.readStroke(stream);
}
}