@Override
 public boolean performFinish() {
   jrm = new JRMeterInterval();
   jrm.setLabel(page0.getLabel());
   RGB rgb = page0.getBackgroundColor().getRgb();
   Color color = new Color(rgb.red, rgb.green, rgb.blue);
   jrm.setBackgroundColor(color);
   jrm.setAlpha(page0.getBackgroundColor().getAlfa() / 255.0d);
   JRDesignDataRange dataRange = new JRDesignDataRange(null);
   dataRange.setHighExpression(page0.getHighExpresion());
   dataRange.setLowExpression(page0.getLowExpression());
   jrm.setDataRange(dataRange);
   return true;
 }
  protected JFreeChart createMeterChart() throws JRException {
    // Start by creating the plot that will hold the meter
    MeterPlot chartPlot = new MeterPlot((ValueDataset) getDataset());
    JRMeterPlot jrPlot = (JRMeterPlot) getPlot();

    // Set the shape
    MeterShapeEnum shape =
        jrPlot.getShapeValue() == null ? MeterShapeEnum.DIAL : jrPlot.getShapeValue();

    switch (shape) {
      case CHORD:
        chartPlot.setDialShape(DialShape.CHORD);
        break;
      case PIE:
        chartPlot.setDialShape(DialShape.PIE);
        break;
      case CIRCLE:
        chartPlot.setDialShape(DialShape.CIRCLE);
        break;
      case DIAL:
      default:
        return createDialChart();
    }

    chartPlot.setDialOutlinePaint(Color.BLACK);
    int meterAngle =
        jrPlot.getMeterAngleInteger() == null ? 180 : jrPlot.getMeterAngleInteger().intValue();
    // Set the size of the meter
    chartPlot.setMeterAngle(meterAngle);

    // Set the spacing between ticks.  I hate the name "tickSize" since to me it
    // implies I am changing the size of the tick, not the spacing between them.
    double tickInterval =
        jrPlot.getTickIntervalDouble() == null
            ? 10.0
            : jrPlot.getTickIntervalDouble().doubleValue();
    chartPlot.setTickSize(tickInterval);

    JRFont tickLabelFont = jrPlot.getTickLabelFont();
    Integer defaultBaseFontSize =
        (Integer) getDefaultValue(defaultChartPropertiesMap, ChartThemesConstants.BASEFONT_SIZE);
    Font themeTickLabelFont =
        getFont(
            (JRFont)
                getDefaultValue(
                    defaultPlotPropertiesMap, ChartThemesConstants.PLOT_TICK_LABEL_FONT),
            tickLabelFont,
            defaultBaseFontSize);
    chartPlot.setTickLabelFont(themeTickLabelFont);

    Color tickColor = jrPlot.getTickColor() == null ? Color.BLACK : jrPlot.getTickColor();
    chartPlot.setTickPaint(tickColor);
    int dialUnitScale = 1;
    Range range = convertRange(jrPlot.getDataRange());
    if (range != null) {
      // Set the meter's range
      chartPlot.setRange(range);
      double bound = Math.max(Math.abs(range.getUpperBound()), Math.abs(range.getLowerBound()));
      dialUnitScale = ChartThemesUtilities.getScale(bound);
      if ((range.getLowerBound() == (int) range.getLowerBound()
              && range.getUpperBound() == (int) range.getUpperBound()
              && tickInterval == (int) tickInterval)
          || dialUnitScale > 1) {
        chartPlot.setTickLabelFormat(new DecimalFormat("#,##0"));
      } else if (dialUnitScale == 1) {
        chartPlot.setTickLabelFormat(new DecimalFormat("#,##0.0"));
      } else if (dialUnitScale <= 0) {
        chartPlot.setTickLabelFormat(new DecimalFormat("#,##0.00"));
      }
    }
    chartPlot.setTickLabelsVisible(true);

    // Set all the colors we support
    Paint backgroundPaint =
        jrPlot.getOwnBackcolor() == null
            ? ChartThemesConstants.TRANSPARENT_PAINT
            : jrPlot.getOwnBackcolor();
    chartPlot.setBackgroundPaint(backgroundPaint);

    GradientPaint gp =
        new GradientPaint(new Point(), Color.LIGHT_GRAY, new Point(), Color.BLACK, false);

    if (jrPlot.getMeterBackgroundColor() != null) {
      chartPlot.setDialBackgroundPaint(jrPlot.getMeterBackgroundColor());
    } else {
      chartPlot.setDialBackgroundPaint(gp);
    }
    // chartPlot.setForegroundAlpha(1f);
    Paint needlePaint =
        jrPlot.getNeedleColor() == null ? new Color(191, 48, 0) : jrPlot.getNeedleColor();
    chartPlot.setNeedlePaint(needlePaint);

    JRValueDisplay display = jrPlot.getValueDisplay();
    if (display != null) {
      Color valueColor = display.getColor() == null ? Color.BLACK : display.getColor();
      chartPlot.setValuePaint(valueColor);
      String pattern = display.getMask() != null ? display.getMask() : "#,##0.####";
      if (pattern != null) chartPlot.setTickLabelFormat(new DecimalFormat(pattern));
      JRFont displayFont = display.getFont();
      Font themeDisplayFont =
          getFont(
              (JRFont)
                  getDefaultValue(defaultPlotPropertiesMap, ChartThemesConstants.PLOT_DISPLAY_FONT),
              displayFont,
              defaultBaseFontSize);

      if (themeDisplayFont != null) {
        chartPlot.setValueFont(themeDisplayFont);
      }
    }
    String label =
        getChart().hasProperties()
            ? getChart().getPropertiesMap().getProperty(DefaultChartTheme.PROPERTY_DIAL_LABEL)
            : null;

    if (label != null) {
      if (dialUnitScale < 0)
        label =
            new MessageFormat(label)
                .format(new Object[] {String.valueOf(Math.pow(10, dialUnitScale))});
      else if (dialUnitScale < 3) label = new MessageFormat(label).format(new Object[] {"1"});
      else
        label =
            new MessageFormat(label)
                .format(new Object[] {String.valueOf((int) Math.pow(10, dialUnitScale - 2))});
    }

    // Set the units - this is just a string that will be shown next to the
    // value
    String units = jrPlot.getUnits() == null ? label : jrPlot.getUnits();
    if (units != null && units.length() > 0) chartPlot.setUnits(units);

    chartPlot.setTickPaint(Color.BLACK);

    // Now define all of the intervals, setting their range and color
    List intervals = jrPlot.getIntervals();
    if (intervals != null && intervals.size() > 0) {
      int size = Math.min(3, intervals.size());

      int colorStep = 0;
      if (size > 3) colorStep = 255 / (size - 3);

      for (int i = 0; i < size; i++) {
        JRMeterInterval interval = (JRMeterInterval) intervals.get(i);
        Color color =
            i < 3
                ? (Color) ChartThemesConstants.AEGEAN_INTERVAL_COLORS.get(i)
                : new Color(255 - colorStep * (i - 3), 0 + colorStep * (i - 3), 0);

        interval.setBackgroundColor(color);
        interval.setAlpha(new Double(1.0));
        chartPlot.addInterval(convertInterval(interval));
      }
    }

    // Actually create the chart around the plot
    JFreeChart jfreeChart =
        new JFreeChart(
            (String) evaluateExpression(getChart().getTitleExpression()),
            null,
            chartPlot,
            getChart().getShowLegend() == null ? false : getChart().getShowLegend().booleanValue());

    // Set all the generic options
    configureChart(jfreeChart, getPlot());

    return jfreeChart;
  }