/* ===========================================================
* 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.Color;
import java.awt.Font;
import java.util.HashMap;
import java.util.Map;
import com.orsoncharts.Chart3D;
import com.orsoncharts.ChartElement;
import com.orsoncharts.ChartElementVisitor;
import com.orsoncharts.axis.Axis3D;
import com.orsoncharts.axis.CategoryAxis3D;
import com.orsoncharts.axis.ValueAxis3D;
import com.orsoncharts.marker.CategoryMarker;
import com.orsoncharts.marker.Marker;
import com.orsoncharts.marker.NumberMarker;
import com.orsoncharts.marker.RangeMarker;
import com.orsoncharts.plot.CategoryPlot3D;
import com.orsoncharts.plot.PiePlot3D;
import com.orsoncharts.plot.Plot3D;
import com.orsoncharts.plot.XYZPlot;
import com.orsoncharts.renderer.Renderer3D;
import com.orsoncharts.renderer.category.CategoryRenderer3D;
import com.orsoncharts.renderer.xyz.XYZRenderer;
import com.orsoncharts.table.TableElement;
import com.orsoncharts.table.TableElementStyler;
/**
* A {@link ChartElementVisitor} that applies a chart style to the elements
* of a chart.
*
* @since 1.2
*/
public class ChartStyler implements ChartElementVisitor {
/** The chart style. */
private ChartStyle style;
/**
* Creates a new instance.
*
* @param style the style ({@code null} not permitted).
*/
public ChartStyler(ChartStyle style) {
this.style = style;
}
/**
* Visits a chart element and applies the current style to that element.
*
* @param element the chart element (never {@code null}).
*/
@Override
public void visit(ChartElement element) {
if (element instanceof Chart3D) {
Chart3D chart = (Chart3D) element;
styleChart(chart);
}
if (element instanceof Plot3D) {
Plot3D plot = (Plot3D) element;
stylePlot(plot);
}
if (element instanceof Axis3D) {
Axis3D axis = (Axis3D) element;
styleAxis(axis);
}
if (element instanceof Renderer3D) {
Renderer3D renderer = (Renderer3D) element;
styleRenderer(renderer);
}
if (element instanceof Marker) {
Marker marker = (Marker) element;
styleMarker(marker);
}
}
/**
* Applies the current style to a chart.
*
* @param chart the chart ({@code null} not permitted).
*/
protected void styleChart(Chart3D chart) {
chart.setBackground(this.style.getBackgroundPainter());
// if the chart title font changed, visit all table elements in the
// chart title and change the font for any element that is tagged as
// "CHART_TITLE"
TableElement chartTitle = chart.getTitle();
if (chartTitle != null) {
Map<String, Font> fontChanges = new HashMap<String, Font>();
fontChanges.put("CHART_TITLE", this.style.getTitleFont());
fontChanges.put("CHART_SUBTITLE", this.style.getSubtitleFont());
Map<String, Color> bgChanges = new HashMap<String, Color>();
bgChanges.put("CHART_TITLE", this.style.getTitleBackgroundColor());
bgChanges.put("CHART_SUBTITLE",
this.style.getSubtitleBackgroundColor());
Map<String, Color> fgChanges = new HashMap<String, Color>();
fgChanges.put("CHART_TITLE", this.style.getTitleColor());
fgChanges.put("CHART_SUBTITLE", this.style.getSubtitleColor());
TableElementStyler m1 = new TableElementStyler(fontChanges,
fgChanges, bgChanges);
chartTitle.receive(m1);
}
chart.setChartBoxColor(this.style.getChartBoxColor());
}
/**
* Applies the current style to the plot.
*
* @param plot the plot ({@code null} not permitted).
*/
protected void stylePlot(Plot3D plot) {
if (plot instanceof PiePlot3D) {
PiePlot3D p = (PiePlot3D) plot;
p.getSectionLabelFontSource().style(
this.style.getSectionLabelFont());
p.getSectionLabelColorSource().style(
this.style.getSectionLabelColor());
p.getSectionColorSource().style(
this.style.getStandardColors());
}
if (plot instanceof CategoryPlot3D) {
CategoryPlot3D p = (CategoryPlot3D) plot;
// gridline paint and stroke for rows, columns and values
p.setGridlinesVisibleForColumns(
this.style.getColumnAxisGridlinesVisible());
p.setGridlinesVisibleForRows(
this.style.getRowAxisGridlinesVisible());
p.setGridlinesVisibleForValues(
this.style.getYAxisGridlinesVisible());
p.setGridlinePaintForRows(this.style.getGridlineColor());
p.setGridlinePaintForColumns(this.style.getGridlineColor());
p.setGridlinePaintForValues(this.style.getGridlineColor());
p.setGridlineStrokeForColumns(this.style.getGridlineStroke());
p.setGridlineStrokeForRows(this.style.getGridlineStroke());
p.setGridlineStrokeForValues(this.style.getGridlineStroke());
}
if (plot instanceof XYZPlot) {
XYZPlot p = (XYZPlot) plot;
p.setGridlinesVisibleX(this.style.getXAxisGridlinesVisible());
p.setGridlinesVisibleY(this.style.getYAxisGridlinesVisible());
p.setGridlinesVisibleZ(this.style.getZAxisGridlinesVisible());
p.setGridlinePaintX(this.style.getGridlineColor());
p.setGridlinePaintY(this.style.getGridlineColor());
p.setGridlinePaintZ(this.style.getGridlineColor());
p.setGridlineStrokeX(this.style.getGridlineStroke());
p.setGridlineStrokeY(this.style.getGridlineStroke());
p.setGridlineStrokeZ(this.style.getGridlineStroke());
}
}
/**
* Applies the current style to the axis.
*
* @param axis the axis ({@code null} not permitted).
*/
protected void styleAxis(Axis3D axis) {
// axis line visible, stroke and paint TODO
// tick marks visible, stroke and paint TODO
axis.setLabelFont(this.style.getAxisLabelFont());
axis.setLabelColor(this.style.getAxisLabelColor());
axis.setTickLabelFont(this.style.getAxisTickLabelFont());
axis.setTickLabelColor(this.style.getAxisTickLabelColor());
if (axis instanceof CategoryAxis3D) {
styleCategoryAxis((CategoryAxis3D) axis);
}
if (axis instanceof ValueAxis3D) {
styleValueAxis((ValueAxis3D) axis);
}
}
protected void styleCategoryAxis(CategoryAxis3D axis) {
}
protected void styleValueAxis(ValueAxis3D axis) {
}
protected void styleRenderer(Renderer3D renderer) {
if (renderer instanceof CategoryRenderer3D) {
styleCategoryRenderer3D((CategoryRenderer3D) renderer);
}
if (renderer instanceof XYZRenderer) {
styleXYZRenderer((XYZRenderer) renderer);
}
}
protected void styleCategoryRenderer3D(CategoryRenderer3D renderer) {
renderer.getColorSource().style(this.style.getStandardColors());
}
protected void styleXYZRenderer(XYZRenderer renderer) {
renderer.getColorSource().style(this.style.getStandardColors());
}
protected void styleMarker(Marker marker) {
if (marker instanceof CategoryMarker) {
CategoryMarker cm = (CategoryMarker) marker;
cm.setFont(this.style.getMarkerLabelFont());
cm.setLabelColor(this.style.getMarkerLabelColor());
cm.setLineColor(this.style.getMarkerLineColor());
cm.setLineStroke(this.style.getMarkerLineStroke());
cm.setFillColor(this.style.getMarkerFillColor());
} else if (marker instanceof NumberMarker) {
NumberMarker nm = (NumberMarker) marker;
nm.setFont(this.style.getMarkerLabelFont());
nm.setLabelColor(this.style.getMarkerLabelColor());
nm.setLineColor(this.style.getMarkerLineColor());
nm.setLineStroke(this.style.getMarkerLineStroke());
} else if (marker instanceof RangeMarker) {
RangeMarker rm = (RangeMarker) marker;
rm.setFont(this.style.getMarkerLabelFont());
rm.setLabelColor(this.style.getMarkerLabelColor());
rm.setFillColor(this.style.getMarkerFillColor());
rm.getStart().setFont(this.style.getMarkerLabelFont());
rm.getStart().setLabelColor(this.style.getMarkerLabelColor());
rm.getStart().setLineColor(this.style.getMarkerLineColor());
rm.getStart().setLineStroke(this.style.getMarkerLineStroke());
rm.getEnd().setFont(this.style.getMarkerLabelFont());
rm.getEnd().setLabelColor(this.style.getMarkerLabelColor());
rm.getEnd().setLineColor(this.style.getMarkerLineColor());
rm.getEnd().setLineStroke(this.style.getMarkerLineStroke());
}
}
}