View Javadoc
1   /*
2    * Copyright 2014 James Pether Sörling
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   *
16   *	$Id$
17   *  $HeadURL$
18   */
19  package com.hack23.cia.web.impl.ui.application.views.common.chartfactory.impl;
20  
21  import org.dussan.vaadin.dcharts.base.elements.XYaxis;
22  import org.dussan.vaadin.dcharts.metadata.DataLabels;
23  import org.dussan.vaadin.dcharts.metadata.LegendPlacements;
24  import org.dussan.vaadin.dcharts.metadata.SeriesToggles;
25  import org.dussan.vaadin.dcharts.metadata.TooltipAxes;
26  import org.dussan.vaadin.dcharts.metadata.XYaxes;
27  import org.dussan.vaadin.dcharts.metadata.locations.LegendLocations;
28  import org.dussan.vaadin.dcharts.metadata.locations.TooltipLocations;
29  import org.dussan.vaadin.dcharts.metadata.renderers.AxisRenderers;
30  import org.dussan.vaadin.dcharts.metadata.renderers.LegendRenderers;
31  import org.dussan.vaadin.dcharts.metadata.renderers.SeriesRenderers;
32  import org.dussan.vaadin.dcharts.options.Axes;
33  import org.dussan.vaadin.dcharts.options.Cursor;
34  import org.dussan.vaadin.dcharts.options.Grid;
35  import org.dussan.vaadin.dcharts.options.Highlighter;
36  import org.dussan.vaadin.dcharts.options.Legend;
37  import org.dussan.vaadin.dcharts.options.Options;
38  import org.dussan.vaadin.dcharts.options.Series;
39  import org.dussan.vaadin.dcharts.options.SeriesDefaults;
40  import org.dussan.vaadin.dcharts.renderers.legend.EnhancedLegendRenderer;
41  import org.dussan.vaadin.dcharts.renderers.series.DonutRenderer;
42  import org.dussan.vaadin.dcharts.renderers.series.PieRenderer;
43  import org.dussan.vaadin.dcharts.renderers.tick.AxisTickRenderer;
44  import org.springframework.stereotype.Component;
45  
46  import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.ChartOptions;
47  
48  /**
49   * The Class ChartOptionsImpl.
50   */
51  @Component
52  public final class ChartOptionsImpl implements ChartOptions {
53  
54  	/** The Constant SLICE_MARGIN. */
55  	private static final int SLICE_MARGIN = 3;
56  
57  	/** The Constant START_ANGLE. */
58  	private static final int START_ANGLE = -90;
59  
60  	/** The Constant FLOAT_FORMAT. */
61  	private static final String FLOAT_FORMAT = "%.2f";
62  
63  	/** The Constant NUMBER_TICKS. */
64  	private static final int NUMBER_TICKS = 5;
65  
66  	/** The Constant LEGEND_COLUMNS. */
67  	private static final int LEGEND_COLUMNS = 3;
68  
69  	/** The Constant LEGEND_ROWS. */
70  	private static final int LEGEND_ROWS = 20;
71  
72  	/** The Constant LEGEND_FONT_SIZE. */
73  	private static final String LEGEND_FONT_SIZE = "10px";
74  
75  	/** The Constant BORDER_COLOR. */
76  	private static final String BORDER_COLOR = "#83898c";
77  
78  	/** The Constant GRIDLINE_COLOR. */
79  	private static final String GRIDLINE_COLOR = "#213f49";
80  
81  	/** The Constant BACKGROUND_COLOR. */
82  	private static final String BACKGROUND_COLOR = "#13303f";
83  
84  	/** The Constant TEXT_COLOR. */
85  	private static final String TEXT_COLOR = "#ffffff";
86  
87  	/** The Constant FONT_SIZE. */
88  	private static final String FONT_SIZE = "8px";
89  
90  	/** The Constant FONT_FAMILY. */
91  	private static final String FONT_FAMILY = "Inconsolata";
92  
93  	/** The Constant NUMBER_TICKS_DATE. */
94  	public static final int NUMBER_TICKS_DATE = 8;
95  
96  	/** The Constant YEAR_MONTH_DAY_FORMAT. */
97  	public static final String YEAR_MONTH_DAY_FORMAT = "%Y-%#m-%#d";
98  
99  	/**
100 	 * Instantiates a new chart options impl.
101 	 */
102 	private ChartOptionsImpl() {
103 		super();
104 	}
105 
106 	/**
107 	 * Creates the axes XY date float.
108 	 *
109 	 * @return the axes
110 	 */
111 	private static Axes createAxesXYDateFloat() {
112 		return new Axes()
113 				.addAxis(new XYaxis().setRenderer(AxisRenderers.DATE)
114 						.setTickOptions(new AxisTickRenderer().setFormatString(YEAR_MONTH_DAY_FORMAT).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE))
115 						.setNumberTicks(NUMBER_TICKS_DATE))
116 				.addAxis(new XYaxis(XYaxes.Y).setRenderer(AxisRenderers.LINEAR).setTickOptions(new AxisTickRenderer().setFormatString(FLOAT_FORMAT).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE)).setNumberTicks(NUMBER_TICKS));
117 	}
118 
119 	/**
120 	 * Creates the axes XY date float log.
121 	 *
122 	 * @return the axes
123 	 */
124 	private static Axes createAxesXYDateFloatLog() {
125 		return new Axes()
126 				.addAxis(new XYaxis().setRenderer(AxisRenderers.DATE)
127 						.setTickOptions(new AxisTickRenderer().setFormatString(YEAR_MONTH_DAY_FORMAT).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE))
128 						.setNumberTicks(NUMBER_TICKS_DATE))
129 				.addAxis(new XYaxis(XYaxes.Y).setRenderer(AxisRenderers.LOG).setTickOptions(new AxisTickRenderer().setFormatString(FLOAT_FORMAT).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE)).setNumberTicks(NUMBER_TICKS));
130 	}
131 
132 
133 	/**
134 	 * Creates the default grid.
135 	 *
136 	 * @return the grid
137 	 */
138 	private static Grid createDefaultGrid() {
139 		final Grid grid = new Grid();
140 		grid.setBackground(BACKGROUND_COLOR);
141 		grid.setGridLineColor(GRIDLINE_COLOR);
142 		grid.setBorderColor(BORDER_COLOR);
143 		return grid;
144 	}
145 
146 	/**
147 	 * Created legend enhanced inside north west.
148 	 *
149 	 * @return the legend
150 	 */
151 	private static Legend createdLegendEnhancedInsideNorthWest() {
152 		return setLegendStyling(new Legend().setShow(true)
153 				.setRendererOptions(
154 						new EnhancedLegendRenderer().setSeriesToggle(SeriesToggles.NORMAL).setSeriesToggleReplot(true).setNumberColumns(LEGEND_COLUMNS).setNumberRows(LEGEND_ROWS))
155 				.setPlacement(LegendPlacements.INSIDE_GRID).setLocation(LegendLocations.NORTH_WEST));
156 	}
157 
158 	/**
159 	 * Created legend enhanced inside west.
160 	 *
161 	 * @return the legend
162 	 */
163 	private static Legend createdLegendEnhancedInsideWest() {
164 		return setLegendStyling(
165 				new Legend().setShow(true).setPlacement(LegendPlacements.INSIDE_GRID).setLocation(LegendLocations.WEST)
166 						.setRenderer(LegendRenderers.ENHANCED).setRendererOptions(new EnhancedLegendRenderer()
167 								.setSeriesToggle(SeriesToggles.NORMAL).setSeriesToggleReplot(true).setNumberColumns(LEGEND_COLUMNS).setNumberRows(LEGEND_ROWS)));
168 	}
169 
170 	/**
171 	 * Creates the legend outside.
172 	 *
173 	 * @return the legend
174 	 */
175 	private static Legend createLegendOutside() {
176 		return setLegendStyling(new Legend().setShow(true)
177 				.setRendererOptions(
178 						new EnhancedLegendRenderer().setSeriesToggle(SeriesToggles.NORMAL).setSeriesToggleReplot(true).setNumberColumns(LEGEND_COLUMNS).setNumberRows(LEGEND_ROWS))
179 				.setPlacement(LegendPlacements.OUTSIDE_GRID));
180 	}
181 
182 	/**
183 	 * Sets the legend styling.
184 	 *
185 	 * @param legend
186 	 *            the legend
187 	 * @return the legend
188 	 */
189 	private static Legend setLegendStyling(final Legend legend) {
190 		legend.setBackground(BACKGROUND_COLOR).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(LEGEND_FONT_SIZE);
191 		return legend;
192 	}
193 
194 	/**
195 	 * Creates the high lighter.
196 	 *
197 	 * @return the highlighter
198 	 */
199 	private static Highlighter createHighLighter() {
200 		return new Highlighter().setShow(true).setShowTooltip(true).setTooltipAlwaysVisible(true)
201 				.setKeepTooltipInsideChart(true);
202 	}
203 
204 	/**
205 	 * Creates the high lighter north.
206 	 *
207 	 * @return the highlighter
208 	 */
209 	private static Highlighter createHighLighterNorth() {
210 		return new Highlighter().setShow(true).setShowTooltip(true).setTooltipAlwaysVisible(true)
211 				.setKeepTooltipInsideChart(true).setTooltipLocation(TooltipLocations.NORTH)
212 				.setTooltipAxes(TooltipAxes.XY_BAR);
213 	}
214 
215 	/**
216 	 * Creates the series default pie chart.
217 	 *
218 	 * @return the series defaults
219 	 */
220 	private static SeriesDefaults createSeriesDefaultPieChart() {
221 		return new SeriesDefaults().setRenderer(SeriesRenderers.PIE)
222 				.setRendererOptions(new PieRenderer().setShowDataLabels(true)).setShadow(true);
223 	}
224 
225 
226 	/**
227 	 * Creates the cursor.
228 	 *
229 	 * @return the cursor
230 	 */
231 	private static Cursor createCursor() {
232 		return new Cursor().setZoom(true).setLooseZoom(true).setShow(true);
233 	}
234 
235 	@Override
236 	public Options createOptionsCountryLineChart(final Series series) {
237 		final Axes axes = new Axes().addAxis(new XYaxis().setRenderer(AxisRenderers.DATE)
238 				.setTickOptions(new AxisTickRenderer().setFormatString(YEAR_MONTH_DAY_FORMAT).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE))
239 				.setNumberTicks(NUMBER_TICKS_DATE)).addAxis(new XYaxis(XYaxes.Y).setTickOptions(new AxisTickRenderer().setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE)).setNumberTicks(NUMBER_TICKS));
240 
241 		return new Options().addOption(new SeriesDefaults()).addOption(axes)
242 				.addOption(createHighLighterNorth()).addOption(series).addOption(createLegendOutside())
243 				.addOption(createDefaultGrid()).addOption(createCursor());
244 	}
245 
246 	@Override
247 	public Options createOptionsDonoutChart() {
248 		final Legend legend = createdLegendEnhancedInsideNorthWest();
249 
250 		final Highlighter highlighter = new Highlighter().setShow(true).setShowTooltip(true)
251 				.setTooltipAlwaysVisible(true).setKeepTooltipInsideChart(true);
252 
253 		final SeriesDefaults seriesDefaults = new SeriesDefaults().setRenderer(SeriesRenderers.DONUT)
254 				.setRendererOptions(new DonutRenderer().setSliceMargin(SLICE_MARGIN).setStartAngle(START_ANGLE).setShowDataLabels(true)
255 						.setDataLabels(DataLabels.VALUE));
256 
257 
258 		return new Options().setSeriesDefaults(seriesDefaults).setLegend(legend)
259 				.setHighlighter(highlighter).addOption(createDefaultGrid()).addOption(createCursor());
260 	}
261 
262 	@Override
263 	public Options createOptionsDonoutChartWithSeries(final Series series) {
264 		final Legend legend = createdLegendEnhancedInsideNorthWest();
265 
266 		final Highlighter highlighter = new Highlighter().setShow(true).setShowTooltip(true)
267 				.setTooltipAlwaysVisible(true).setKeepTooltipInsideChart(true);
268 
269 		final SeriesDefaults seriesDefaults = new SeriesDefaults().setRenderer(SeriesRenderers.DONUT)
270 				.setRendererOptions(new DonutRenderer().setSliceMargin(SLICE_MARGIN).setStartAngle(START_ANGLE).setShowDataLabels(true)
271 						.setDataLabels(DataLabels.VALUE));
272 
273 		return new Options().setSeriesDefaults(seriesDefaults).setLegend(legend)
274 				.setHighlighter(highlighter).addOption(series).addOption(createDefaultGrid()).addOption(createCursor());
275 	}
276 
277 	@Override
278 	public Options createOptionsPartyLineChart(final Series series) {
279 		return new Options().addOption(new SeriesDefaults()).addOption(createAxesXYDateFloat())
280 				.addOption(createHighLighterNorth()).addOption(createCursor()).addOption(series)
281 				.addOption(createLegendOutside()).addOption(createDefaultGrid());
282 	}
283 
284 	@Override
285 	public Options createOptionsPersonLineChart(final Series series) {
286 		return new Options().addOption(new SeriesDefaults()).addOption(createAxesXYDateFloat())
287 				.addOption(createHighLighterNorth()).addOption(createCursor()).addOption(series)
288 				.addOption(createLegendOutside()).addOption(createDefaultGrid());
289 	}
290 
291 	@Override
292 	public Options createOptionsPieChart() {
293 		return new Options().setSeriesDefaults(createSeriesDefaultPieChart())
294 				.setLegend(createdLegendEnhancedInsideWest()).setHighlighter(createHighLighter())
295 				.addOption(createDefaultGrid()).addOption(createCursor());
296 	}
297 
298 	@Override
299 	public Options createOptionsXYDateFloatLegendOutside(final Series series) {
300 		return new Options().addOption(new SeriesDefaults()).addOption(createAxesXYDateFloat())
301 				.addOption(createHighLighterNorth()).addOption(series).addOption(createLegendOutside())
302 				.addOption(createDefaultGrid()).addOption(createCursor());
303 	}
304 
305 	@Override
306 	public Options createOptionsXYDateFloatLogYAxisLegendOutside(final Series series) {
307 		return new Options().addOption(new SeriesDefaults()).addOption(createAxesXYDateFloatLog())
308 				.addOption(createHighLighterNorth()).addOption(series).addOption(createLegendOutside())
309 				.addOption(createDefaultGrid()).addOption(createCursor());
310 	}
311 
312 }