ChartOptionsImpl.java

  1. /*
  2.  * Copyright 2010-2025 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. import org.dussan.vaadin.dcharts.base.elements.XYaxis;
  21. import org.dussan.vaadin.dcharts.metadata.DataLabels;
  22. import org.dussan.vaadin.dcharts.metadata.LegendPlacements;
  23. import org.dussan.vaadin.dcharts.metadata.SeriesToggles;
  24. import org.dussan.vaadin.dcharts.metadata.TooltipAxes;
  25. import org.dussan.vaadin.dcharts.metadata.XYaxes;
  26. import org.dussan.vaadin.dcharts.metadata.locations.LegendLocations;
  27. import org.dussan.vaadin.dcharts.metadata.locations.TooltipLocations;
  28. import org.dussan.vaadin.dcharts.metadata.renderers.AxisRenderers;
  29. import org.dussan.vaadin.dcharts.metadata.renderers.LegendRenderers;
  30. import org.dussan.vaadin.dcharts.metadata.renderers.SeriesRenderers;
  31. import org.dussan.vaadin.dcharts.options.Axes;
  32. import org.dussan.vaadin.dcharts.options.Cursor;
  33. import org.dussan.vaadin.dcharts.options.Grid;
  34. import org.dussan.vaadin.dcharts.options.Highlighter;
  35. import org.dussan.vaadin.dcharts.options.Legend;
  36. import org.dussan.vaadin.dcharts.options.Options;
  37. import org.dussan.vaadin.dcharts.options.Series;
  38. import org.dussan.vaadin.dcharts.options.SeriesDefaults;
  39. import org.dussan.vaadin.dcharts.renderers.legend.EnhancedLegendRenderer;
  40. import org.dussan.vaadin.dcharts.renderers.series.DonutRenderer;
  41. import org.dussan.vaadin.dcharts.renderers.series.PieRenderer;
  42. import org.dussan.vaadin.dcharts.renderers.tick.AxisTickRenderer;
  43. import org.springframework.stereotype.Component;

  44. import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.ChartOptions;

  45. /**
  46.  * The Class ChartOptionsImpl.
  47.  */
  48. @Component
  49. public final class ChartOptionsImpl implements ChartOptions {

  50.     /** The Constant BACKGROUND_COLOR. */
  51.     private static final String BACKGROUND_COLOR = "#13303f";

  52.     /** The Constant BORDER_COLOR. */
  53.     private static final String BORDER_COLOR = "#83898c";

  54.     /** The Constant FLOAT_FORMAT. */
  55.     private static final String FLOAT_FORMAT = "%.2f";

  56.     /** The Constant FONT_FAMILY. */
  57.     private static final String FONT_FAMILY = "Arial";

  58.     /** The Constant FONT_SIZE. */
  59.     private static final String FONT_SIZE = "8px";

  60.     /** The Constant GRIDLINE_COLOR. */
  61.     private static final String GRIDLINE_COLOR = "#213f49";

  62.     /** The Constant LEGEND_COLUMNS. */
  63.     private static final int LEGEND_COLUMNS = 3;

  64.     /** The Constant LEGEND_FONT_SIZE. */
  65.     private static final String LEGEND_FONT_SIZE = "10px";

  66.     /** The Constant LEGEND_ROWS. */
  67.     private static final int LEGEND_ROWS = 20;

  68.     /** The Constant NUMBER_TICKS. */
  69.     private static final int NUMBER_TICKS = 5;

  70.     /** The Constant NUMBER_TICKS_DATE. */
  71.     public static final int NUMBER_TICKS_DATE = 8;

  72.     /** The Constant ONE_COLUMN_NUMBER_OF_COLUMNS. */
  73.     private static final int ONE_COLUMN_NUMBER_OF_COLUMNS = 1;

  74.     /** The Constant ONE_COLUMN_NUMBER_OF_ROWS. */
  75.     private static final int ONE_COLUMN_NUMBER_OF_ROWS = 12;

  76.     /** The Constant ONE_ROW_NUMBER_OF_COLUMNS. */
  77.     private static final int ONE_ROW_NUMBER_OF_COLUMNS = 10;

  78.     /** The Constant ONE_ROW_NUMBER_OF_ROWS. */
  79.     private static final int ONE_ROW_NUMBER_OF_ROWS = 1;

  80.     /** The Constant SLICE_MARGIN. */
  81.     private static final int SLICE_MARGIN = 3;

  82.     /** The Constant START_ANGLE. */
  83.     private static final int START_ANGLE = -90;

  84.     /** The Constant TEXT_COLOR. */
  85.     private static final String TEXT_COLOR = "#ffffff";

  86.     /** The Constant YEAR_MONTH_DAY_FORMAT. */
  87.     public static final String YEAR_MONTH_DAY_FORMAT = "%F";

  88.     /**
  89.      * Instantiates a new chart options impl.
  90.      */
  91.     private ChartOptionsImpl() {
  92.         super();
  93.     }

  94.     /**
  95.      * Creates the axes XY date float.
  96.      *
  97.      * @return the axes
  98.      */
  99.     private static Axes createAxesXYDateFloat() {
  100.         return new Axes()
  101.                 .addAxis(new XYaxis().setRenderer(AxisRenderers.DATE)
  102.                         .setTickOptions(new AxisTickRenderer().setFormatString(YEAR_MONTH_DAY_FORMAT).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE))
  103.                         .setNumberTicks(NUMBER_TICKS_DATE))
  104.                 .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));
  105.     }

  106.     /**
  107.      * Creates the axes XY date float log.
  108.      *
  109.      * @return the axes
  110.      */
  111.     private static Axes createAxesXYDateFloatLog() {
  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.LOG).setTickOptions(new AxisTickRenderer().setFormatString(FLOAT_FORMAT).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE)).setNumberTicks(NUMBER_TICKS));
  117.     }


  118.     /**
  119.      * Creates the cursor.
  120.      *
  121.      * @return the cursor
  122.      */
  123.     private static Cursor createCursor() {
  124.         return new Cursor().setZoom(true).setLooseZoom(true).setShow(true);
  125.     }

  126.     /**
  127.      * Creates the default grid.
  128.      *
  129.      * @return the grid
  130.      */
  131.     private static Grid createDefaultGrid() {
  132.         final Grid grid = new Grid();
  133.         grid.setBackground(BACKGROUND_COLOR);
  134.         grid.setGridLineColor(GRIDLINE_COLOR);
  135.         grid.setBorderColor(BORDER_COLOR);
  136.         return grid;
  137.     }

  138.     /**
  139.      * Created legend enhanced inside north west.
  140.      *
  141.      * @return the legend
  142.      */
  143.     private static Legend createdLegendEnhancedInsideNorthWest() {
  144.         return setLegendStyling(new Legend().setShow(true)
  145.                 .setRendererOptions(
  146.                         new EnhancedLegendRenderer().setSeriesToggle(SeriesToggles.NORMAL).setSeriesToggleReplot(true).setNumberColumns(LEGEND_COLUMNS).setNumberRows(LEGEND_ROWS))
  147.                 .setPlacement(LegendPlacements.INSIDE_GRID).setLocation(LegendLocations.NORTH_WEST));
  148.     }

  149.     /**
  150.      * Created legend enhanced inside west.
  151.      *
  152.      * @return the legend
  153.      */
  154.     private static Legend createdLegendEnhancedInsideWest() {
  155.         return setLegendStyling(
  156.                 new Legend().setShow(true).setPlacement(LegendPlacements.INSIDE_GRID).setLocation(LegendLocations.WEST)
  157.                         .setRenderer(LegendRenderers.ENHANCED).setRendererOptions(new EnhancedLegendRenderer()
  158.                                 .setSeriesToggle(SeriesToggles.NORMAL).setSeriesToggleReplot(true).setNumberColumns(LEGEND_COLUMNS).setNumberRows(LEGEND_ROWS)));
  159.     }

  160.     /**
  161.      * Creates the donout series default.
  162.      *
  163.      * @return the series defaults
  164.      */
  165.     private static SeriesDefaults createDonoutSeriesDefault() {
  166.         return new SeriesDefaults().setRenderer(SeriesRenderers.DONUT)
  167.                 .setRendererOptions(new DonutRenderer().setSliceMargin(SLICE_MARGIN).setStartAngle(START_ANGLE).setShowDataLabels(true)
  168.                         .setDataLabels(DataLabels.VALUE));
  169.     }

  170.     /**
  171.      * Creates the high lighter.
  172.      *
  173.      * @return the highlighter
  174.      */
  175.     private static Highlighter createHighLighter() {
  176.         return new Highlighter().setShow(true).setShowTooltip(true).setTooltipAlwaysVisible(true)
  177.                 .setKeepTooltipInsideChart(true);
  178.     }

  179.     /**
  180.      * Creates the high lighter north.
  181.      *
  182.      * @return the highlighter
  183.      */
  184.     private static Highlighter createHighLighterNorth() {
  185.         return new Highlighter().setShow(true).setShowTooltip(true).setTooltipAlwaysVisible(true)
  186.                 .setKeepTooltipInsideChart(true).setTooltipLocation(TooltipLocations.NORTH)
  187.                 .setTooltipAxes(TooltipAxes.XY_BAR).setShowMarker(true).setBringSeriesToFront(true);
  188.     }

  189.     /**
  190.      * Creates the legend outside.
  191.      *
  192.      * @return the legend
  193.      */
  194.     private static Legend createLegendInsideOneRow() {
  195.         return setLegendStyling(new Legend().setShow(true)
  196.                 .setRendererOptions(
  197.                         new EnhancedLegendRenderer().setSeriesToggle(SeriesToggles.NORMAL).setSeriesToggleReplot(true).setNumberColumns(ONE_ROW_NUMBER_OF_COLUMNS).setNumberRows(ONE_ROW_NUMBER_OF_ROWS))
  198.                 .setPlacement(LegendPlacements.INSIDE_GRID));
  199.     }

  200.     /**
  201.      * Creates the legend outside.
  202.      *
  203.      * @return the legend
  204.      */
  205.     private static Legend createLegendOutside() {
  206.         return setLegendStyling(new Legend().setShow(true)
  207.                 .setRendererOptions(
  208.                         new EnhancedLegendRenderer().setSeriesToggle(SeriesToggles.NORMAL).setSeriesToggleReplot(true).setNumberColumns(LEGEND_COLUMNS).setNumberRows(LEGEND_ROWS))
  209.                 .setPlacement(LegendPlacements.OUTSIDE_GRID));
  210.     }

  211.     /**
  212.      * Creates the legend outside one column.
  213.      *
  214.      * @return the legend
  215.      */
  216.     private static Legend createLegendOutsideOneColumn() {
  217.         return setLegendStyling(new Legend().setShow(true)
  218.                 .setRendererOptions(
  219.                         new EnhancedLegendRenderer().setSeriesToggle(SeriesToggles.NORMAL).setSeriesToggleReplot(true).setNumberColumns(ONE_COLUMN_NUMBER_OF_COLUMNS).setNumberRows(ONE_COLUMN_NUMBER_OF_ROWS))
  220.                 .setPlacement(LegendPlacements.OUTSIDE_GRID));
  221.     }


  222.     /**
  223.      * Creates the series default pie chart.
  224.      *
  225.      * @return the series defaults
  226.      */
  227.     private static SeriesDefaults createSeriesDefaultPieChart() {
  228.         return new SeriesDefaults().setRenderer(SeriesRenderers.PIE)
  229.                 .setRendererOptions(new PieRenderer().setShowDataLabels(true)).setShadow(true);
  230.     }

  231.     /**
  232.      * Sets the legend styling.
  233.      *
  234.      * @param legend
  235.      *            the legend
  236.      * @return the legend
  237.      */
  238.     private static Legend setLegendStyling(final Legend legend) {
  239.         legend.setBackground(BACKGROUND_COLOR).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(LEGEND_FONT_SIZE);
  240.         return legend;
  241.     }

  242.     /**
  243.      * Creates the options country line chart.
  244.      *
  245.      * @param chartSeries the chart series
  246.      * @return the options
  247.      */
  248.     @Override
  249.     public Options createOptionsCountryLineChart(final Series chartSeries) {
  250.         final Axes chartAxes = new Axes().addAxis(new XYaxis().setRenderer(AxisRenderers.DATE)
  251.                 .setTickOptions(new AxisTickRenderer().setFormatString(YEAR_MONTH_DAY_FORMAT).setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE))
  252.                 .setNumberTicks(NUMBER_TICKS_DATE)).addAxis(new XYaxis(XYaxes.Y).setTickOptions(new AxisTickRenderer().setFontFamily(FONT_FAMILY).setTextColor(TEXT_COLOR).setFontSize(FONT_SIZE)).setNumberTicks(NUMBER_TICKS));

  253.         return new Options().addOption(new SeriesDefaults()).addOption(chartAxes)
  254.                 .addOption(createHighLighterNorth()).addOption(chartSeries).addOption(createLegendInsideOneRow())
  255.                 .addOption(createDefaultGrid()).addOption(createCursor());
  256.     }

  257.     /**
  258.      * Creates the options donout chart.
  259.      *
  260.      * @return the options
  261.      */
  262.     @Override
  263.     public Options createOptionsDonoutChart() {
  264.         return new Options().setSeriesDefaults(createDonoutSeriesDefault()).setLegend(createdLegendEnhancedInsideNorthWest())
  265.                 .setHighlighter(createHighLighter()).addOption(createDefaultGrid()).addOption(createCursor());
  266.     }

  267.     /**
  268.      * Creates the options donout chart with series.
  269.      *
  270.      * @param chartSeries the chart series
  271.      * @return the options
  272.      */
  273.     @Override
  274.     public Options createOptionsDonoutChartWithSeries(final Series chartSeries) {
  275.         return new Options().setSeriesDefaults(createDonoutSeriesDefault()).setLegend(createdLegendEnhancedInsideNorthWest())
  276.                 .setHighlighter(createHighLighter()).addOption(chartSeries).addOption(createDefaultGrid()).addOption(createCursor());
  277.     }

  278.     /**
  279.      * Creates the options party line chart.
  280.      *
  281.      * @param chartSeries the chart series
  282.      * @return the options
  283.      */
  284.     @Override
  285.     public Options createOptionsPartyLineChart(final Series chartSeries) {
  286.         return new Options().addOption(new SeriesDefaults()).addOption(createAxesXYDateFloat())
  287.                 .addOption(createHighLighterNorth()).addOption(createCursor()).addOption(chartSeries)
  288.                 .addOption(createLegendOutside()).addOption(createDefaultGrid());
  289.     }

  290.     /**
  291.      * Creates the options person line chart.
  292.      *
  293.      * @param chartSeries the chart series
  294.      * @return the options
  295.      */
  296.     @Override
  297.     public Options createOptionsPersonLineChart(final Series chartSeries) {
  298.         return new Options().addOption(new SeriesDefaults()).addOption(createAxesXYDateFloat())
  299.                 .addOption(createHighLighterNorth()).addOption(createCursor()).addOption(chartSeries)
  300.                 .addOption(createLegendOutside()).addOption(createDefaultGrid());
  301.     }

  302.     /**
  303.      * Creates the options pie chart.
  304.      *
  305.      * @return the options
  306.      */
  307.     @Override
  308.     public Options createOptionsPieChart() {
  309.         return new Options().setSeriesDefaults(createSeriesDefaultPieChart())
  310.                 .setLegend(createdLegendEnhancedInsideWest()).setHighlighter(createHighLighter())
  311.                 .addOption(createDefaultGrid()).addOption(createCursor());
  312.     }

  313.     /**
  314.      * Creates the options XY date float legend inside one column.
  315.      *
  316.      * @param chartSeries the chart series
  317.      * @return the options
  318.      */
  319.     @Override
  320.     public Options createOptionsXYDateFloatLegendInsideOneColumn(final Series chartSeries) {
  321.         return new Options().addOption(new SeriesDefaults()).addOption(createAxesXYDateFloat())
  322.                 .addOption(createHighLighterNorth()).addOption(chartSeries).addOption(createLegendOutsideOneColumn())
  323.                 .addOption(createDefaultGrid()).addOption(createCursor());
  324.     }

  325.     /**
  326.      * Creates the options XY date float log Y axis legend outside.
  327.      *
  328.      * @param chartSeries the chart series
  329.      * @return the options
  330.      */
  331.     @Override
  332.     public Options createOptionsXYDateFloatLogYAxisLegendOutside(final Series chartSeries) {
  333.         return new Options().addOption(new SeriesDefaults()).addOption(chartSeries).addOption(createAxesXYDateFloatLog())
  334.                 .addOption(createHighLighterNorth()).addOption(createLegendOutside())
  335.                 .addOption(createDefaultGrid()).addOption(createCursor());
  336.     }

  337. }