001/* =========================================================== 002 * Orson Charts : a 3D chart library for the Java(tm) platform 003 * =========================================================== 004 * 005 * (C)opyright 2013-2022, by David Gilbert. All rights reserved. 006 * 007 * https://github.com/jfree/orson-charts 008 * 009 * This program is free software: you can redistribute it and/or modify 010 * it under the terms of the GNU General Public License as published by 011 * the Free Software Foundation, either version 3 of the License, or 012 * (at your option) any later version. 013 * 014 * This program is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 017 * GNU General Public License for more details. 018 * 019 * You should have received a copy of the GNU General Public License 020 * along with this program. If not, see <http://www.gnu.org/licenses/>. 021 * 022 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. 023 * Other names may be trademarks of their respective owners.] 024 * 025 * If you do not wish to be bound by the terms of the GPL, an alternative 026 * commercial license can be purchased. For details, please see visit the 027 * Orson Charts home page: 028 * 029 * http://www.object-refinery.com/orsoncharts/index.html 030 * 031 */ 032 033package org.jfree.chart3d.style; 034 035import java.awt.Color; 036import java.awt.Font; 037import java.util.HashMap; 038import java.util.Map; 039import org.jfree.chart3d.Chart3D; 040import org.jfree.chart3d.ChartElement; 041import org.jfree.chart3d.ChartElementVisitor; 042import org.jfree.chart3d.axis.Axis3D; 043import org.jfree.chart3d.axis.CategoryAxis3D; 044import org.jfree.chart3d.axis.ValueAxis3D; 045import org.jfree.chart3d.marker.CategoryMarker; 046import org.jfree.chart3d.marker.Marker; 047import org.jfree.chart3d.marker.NumberMarker; 048import org.jfree.chart3d.marker.RangeMarker; 049import org.jfree.chart3d.plot.CategoryPlot3D; 050import org.jfree.chart3d.plot.PiePlot3D; 051import org.jfree.chart3d.plot.Plot3D; 052import org.jfree.chart3d.plot.XYZPlot; 053import org.jfree.chart3d.renderer.Renderer3D; 054import org.jfree.chart3d.renderer.category.CategoryRenderer3D; 055import org.jfree.chart3d.renderer.xyz.XYZRenderer; 056import org.jfree.chart3d.table.TableElement; 057import org.jfree.chart3d.table.TableElementStyler; 058 059/** 060 * A {@link ChartElementVisitor} that applies a chart style to the elements 061 * of a chart. 062 * 063 * @since 1.2 064 */ 065public class ChartStyler implements ChartElementVisitor { 066 067 /** The chart style. */ 068 private final ChartStyle style; 069 070 /** 071 * Creates a new instance. 072 * 073 * @param style the style ({@code null} not permitted). 074 */ 075 public ChartStyler(ChartStyle style) { 076 this.style = style; 077 } 078 079 /** 080 * Visits a chart element and applies the current style to that element. 081 * 082 * @param element the chart element (never {@code null}). 083 */ 084 @Override 085 public void visit(ChartElement element) { 086 if (element instanceof Chart3D) { 087 Chart3D chart = (Chart3D) element; 088 styleChart(chart); 089 } 090 if (element instanceof Plot3D) { 091 Plot3D plot = (Plot3D) element; 092 stylePlot(plot); 093 } 094 if (element instanceof Axis3D) { 095 Axis3D axis = (Axis3D) element; 096 styleAxis(axis); 097 } 098 if (element instanceof Renderer3D) { 099 Renderer3D renderer = (Renderer3D) element; 100 styleRenderer(renderer); 101 } 102 if (element instanceof Marker) { 103 Marker marker = (Marker) element; 104 styleMarker(marker); 105 } 106 } 107 108 /** 109 * Applies the current style to a chart. 110 * 111 * @param chart the chart ({@code null} not permitted). 112 */ 113 protected void styleChart(Chart3D chart) { 114 chart.setBackground(this.style.getBackgroundPainter()); 115 116 // if the chart title font changed, visit all table elements in the 117 // chart title and change the font for any element that is tagged as 118 // "CHART_TITLE" 119 TableElement chartTitle = chart.getTitle(); 120 if (chartTitle != null) { 121 Map<String, Font> fontChanges = new HashMap<>(); 122 fontChanges.put("CHART_TITLE", this.style.getTitleFont()); 123 fontChanges.put("CHART_SUBTITLE", this.style.getSubtitleFont()); 124 Map<String, Color> bgChanges = new HashMap<>(); 125 bgChanges.put("CHART_TITLE", this.style.getTitleBackgroundColor()); 126 bgChanges.put("CHART_SUBTITLE", 127 this.style.getSubtitleBackgroundColor()); 128 Map<String, Color> fgChanges = new HashMap<>(); 129 fgChanges.put("CHART_TITLE", this.style.getTitleColor()); 130 fgChanges.put("CHART_SUBTITLE", this.style.getSubtitleColor()); 131 TableElementStyler m1 = new TableElementStyler(fontChanges, 132 fgChanges, bgChanges); 133 chartTitle.receive(m1); 134 } 135 chart.setChartBoxColor(this.style.getChartBoxColor()); 136 } 137 138 /** 139 * Applies the current style to the plot. 140 * 141 * @param plot the plot ({@code null} not permitted). 142 */ 143 protected void stylePlot(Plot3D plot) { 144 if (plot instanceof PiePlot3D) { 145 PiePlot3D p = (PiePlot3D) plot; 146 p.getSectionLabelFontSource().style( 147 this.style.getSectionLabelFont()); 148 p.getSectionLabelColorSource().style( 149 this.style.getSectionLabelColor()); 150 p.getSectionColorSource().style( 151 this.style.getStandardColors()); 152 } 153 if (plot instanceof CategoryPlot3D) { 154 CategoryPlot3D p = (CategoryPlot3D) plot; 155 156 // gridline paint and stroke for rows, columns and values 157 p.setGridlinesVisibleForColumns( 158 this.style.getColumnAxisGridlinesVisible()); 159 p.setGridlinesVisibleForRows( 160 this.style.getRowAxisGridlinesVisible()); 161 p.setGridlinesVisibleForValues( 162 this.style.getYAxisGridlinesVisible()); 163 p.setGridlinePaintForRows(this.style.getGridlineColor()); 164 p.setGridlinePaintForColumns(this.style.getGridlineColor()); 165 p.setGridlinePaintForValues(this.style.getGridlineColor()); 166 p.setGridlineStrokeForColumns(this.style.getGridlineStroke()); 167 p.setGridlineStrokeForRows(this.style.getGridlineStroke()); 168 p.setGridlineStrokeForValues(this.style.getGridlineStroke()); 169 } 170 if (plot instanceof XYZPlot) { 171 XYZPlot p = (XYZPlot) plot; 172 p.setGridlinesVisibleX(this.style.getXAxisGridlinesVisible()); 173 p.setGridlinesVisibleY(this.style.getYAxisGridlinesVisible()); 174 p.setGridlinesVisibleZ(this.style.getZAxisGridlinesVisible()); 175 p.setGridlinePaintX(this.style.getGridlineColor()); 176 p.setGridlinePaintY(this.style.getGridlineColor()); 177 p.setGridlinePaintZ(this.style.getGridlineColor()); 178 p.setGridlineStrokeX(this.style.getGridlineStroke()); 179 p.setGridlineStrokeY(this.style.getGridlineStroke()); 180 p.setGridlineStrokeZ(this.style.getGridlineStroke()); 181 } 182 } 183 184 /** 185 * Applies the current style to the axis. 186 * 187 * @param axis the axis ({@code null} not permitted). 188 */ 189 protected void styleAxis(Axis3D axis) { 190 // axis line visible, stroke and paint TODO 191 // tick marks visible, stroke and paint TODO 192 axis.setLabelFont(this.style.getAxisLabelFont()); 193 axis.setLabelColor(this.style.getAxisLabelColor()); 194 axis.setTickLabelFont(this.style.getAxisTickLabelFont()); 195 axis.setTickLabelColor(this.style.getAxisTickLabelColor()); 196 if (axis instanceof CategoryAxis3D) { 197 styleCategoryAxis((CategoryAxis3D) axis); 198 } 199 if (axis instanceof ValueAxis3D) { 200 styleValueAxis((ValueAxis3D) axis); 201 } 202 } 203 204 /** 205 * Applies the current style to a category axis. This implementation does 206 * nothing, it is here for overriding. 207 * 208 * @param axis the axis ({@code null} not permitted). 209 */ 210 protected void styleCategoryAxis(CategoryAxis3D axis) { 211 // for overriding 212 } 213 214 /** 215 * Applies the current style to a value axis. This implementation does 216 * nothing, it is here for overriding. 217 * 218 * @param axis the axis ({@code null} not permitted). 219 */ 220 protected void styleValueAxis(ValueAxis3D axis) { 221 // for overriding 222 } 223 224 /** 225 * Applies the current style to the renderer. 226 * 227 * @param renderer the renderer ({@code null} not permitted). 228 */ 229 protected void styleRenderer(Renderer3D renderer) { 230 if (renderer instanceof CategoryRenderer3D) { 231 styleCategoryRenderer3D((CategoryRenderer3D) renderer); 232 } 233 if (renderer instanceof XYZRenderer) { 234 styleXYZRenderer((XYZRenderer) renderer); 235 } 236 } 237 238 /** 239 * Applies the current style to a category renderer. 240 * 241 * @param renderer the renderer ({@code null} not permitted). 242 */ 243 protected void styleCategoryRenderer3D(CategoryRenderer3D renderer) { 244 renderer.getColorSource().style(this.style.getStandardColors()); 245 } 246 247 /** 248 * Applies the current style to an XYZ renderer. 249 * 250 * @param renderer the renderer ({@code null} not permitted). 251 */ 252 protected void styleXYZRenderer(XYZRenderer renderer) { 253 renderer.getColorSource().style(this.style.getStandardColors()); 254 } 255 256 /** 257 * Applies the current style to a marker. 258 * 259 * @param marker the marker ({@code null} not permitted). 260 */ 261 protected void styleMarker(Marker marker) { 262 if (marker instanceof CategoryMarker) { 263 CategoryMarker cm = (CategoryMarker) marker; 264 cm.setFont(this.style.getMarkerLabelFont()); 265 cm.setLabelColor(this.style.getMarkerLabelColor()); 266 cm.setLineColor(this.style.getMarkerLineColor()); 267 cm.setLineStroke(this.style.getMarkerLineStroke()); 268 cm.setFillColor(this.style.getMarkerFillColor()); 269 } else if (marker instanceof NumberMarker) { 270 NumberMarker nm = (NumberMarker) marker; 271 nm.setFont(this.style.getMarkerLabelFont()); 272 nm.setLabelColor(this.style.getMarkerLabelColor()); 273 nm.setLineColor(this.style.getMarkerLineColor()); 274 nm.setLineStroke(this.style.getMarkerLineStroke()); 275 } else if (marker instanceof RangeMarker) { 276 RangeMarker rm = (RangeMarker) marker; 277 rm.setFont(this.style.getMarkerLabelFont()); 278 rm.setLabelColor(this.style.getMarkerLabelColor()); 279 rm.setFillColor(this.style.getMarkerFillColor()); 280 281 rm.getStart().setFont(this.style.getMarkerLabelFont()); 282 rm.getStart().setLabelColor(this.style.getMarkerLabelColor()); 283 rm.getStart().setLineColor(this.style.getMarkerLineColor()); 284 rm.getStart().setLineStroke(this.style.getMarkerLineStroke()); 285 rm.getEnd().setFont(this.style.getMarkerLabelFont()); 286 rm.getEnd().setLabelColor(this.style.getMarkerLabelColor()); 287 rm.getEnd().setLineColor(this.style.getMarkerLineColor()); 288 rm.getEnd().setLineStroke(this.style.getMarkerLineStroke()); 289 } 290 } 291}