From b524bcb8d68ec1aafc00ebc23b79506c292fc83c Mon Sep 17 00:00:00 2001
From: Tim Molter <tim@knowm.org>
Date: Sat, 2 Jan 2016 21:55:40 +0100
Subject: [PATCH] clean up AxisTickCategoryChartCalculator

---
 .../knowm/xchart/internal/chartpart/Axis.java |  7 ++--
 .../AxisTickCategoryChartCalculator.java      | 32 ++++++-------------
 .../internal/chartpart/ChartInternal.java     |  8 +++++
 3 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Axis.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Axis.java
index 9059f611..06a290d4 100644
--- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Axis.java
+++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Axis.java
@@ -22,6 +22,7 @@ import java.awt.font.FontRenderContext;
 import java.awt.font.TextLayout;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
+import java.util.List;
 
 import org.knowm.xchart.StyleManager.LegendPosition;
 import org.knowm.xchart.internal.chartpart.ChartInternal.ChartInternalType;
@@ -349,13 +350,13 @@ public class Axis implements ChartPart {
 
       if (getChartInternal().getChartInternalType() == ChartInternalType.Category) {
 
-        // No need to pass in min and max
         // pass in axis type instead of ChartInternal
-        return new AxisTickCategoryChartCalculator(getDirection(), workingSpace, getChartInternal());
+        List<?> categories = (List<?>) getChartInternal().getSeriesMap().values().iterator().next().getXData();
+        AxisType axisType = getChartInternal().getAxisPair().getXAxis().getAxisType();
+        return new AxisTickCategoryChartCalculator(getDirection(), workingSpace, categories, axisType, getChartInternal().getStyleManager());
       }
       else if (getChartInternal().getChartInternalType() == ChartInternalType.XY && getAxisType() == AxisType.Date) {
 
-        // TODO don't pass in style manager
         return new AxisTickDateCalculator(getDirection(), workingSpace, getChartInternal().getxAxisMin(), getChartInternal().getxAxisMax(), getChartInternal().getStyleManager());
       }
       else if (getChartInternal().getStyleManager().isXAxisLogarithmic()) {
diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/AxisTickCategoryChartCalculator.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/AxisTickCategoryChartCalculator.java
index 6620c729..ec2019af 100644
--- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/AxisTickCategoryChartCalculator.java
+++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/AxisTickCategoryChartCalculator.java
@@ -21,7 +21,7 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 
-import org.knowm.xchart.Series;
+import org.knowm.xchart.StyleManager;
 import org.knowm.xchart.internal.Utils;
 import org.knowm.xchart.internal.chartpart.Axis.AxisType;
 import org.knowm.xchart.internal.chartpart.Axis.Direction;
@@ -42,14 +42,14 @@ public class AxisTickCategoryChartCalculator extends AxisTickCalculator {
    * @param maxValue
    * @param styleManager
    */
-  public AxisTickCategoryChartCalculator(Direction axisDirection, double workingSpace, ChartInternal chart) {
+  public AxisTickCategoryChartCalculator(Direction axisDirection, double workingSpace, List<?> categories, AxisType axisType, StyleManager styleManager) {
 
-    super(axisDirection, workingSpace, Double.NaN, Double.NaN, chart.getStyleManager());
+    super(axisDirection, workingSpace, Double.NaN, Double.NaN, styleManager);
 
-    calculate(chart);
+    calculate(categories, axisType);
   }
 
-  private void calculate(ChartInternal chartInternal) {
+  private void calculate(List<?> categories, AxisType axisType) {
 
     // tick space - a percentage of the working space available for ticks
     int tickSpace = (int) (styleManager.getAxisTickSpacePercentage() * workingSpace); // in plot space
@@ -57,18 +57,6 @@ public class AxisTickCategoryChartCalculator extends AxisTickCalculator {
     // where the tick should begin in the working space in pixels
     double margin = Utils.getTickStartOffset(workingSpace, tickSpace);
 
-    List<?> categories = (List<?>) chartInternal.getSeriesMap().values().iterator().next().getXData();
-
-    // verify all series have exactly the same xAxis
-    if (chartInternal.getSeriesMap().size() > 1) {
-
-      for (Series series : chartInternal.getSeriesMap().values()) {
-        if (!series.getXData().equals(categories)) {
-          throw new IllegalArgumentException("X-Axis data must exactly match all other Series X-Axis data for Bar Charts!!");
-        }
-      }
-    }
-
     // generate all tickLabels and tickLocations from the first to last position
     double gridStep = (tickSpace / (double) categories.size());
     double firstPosition = gridStep / 2.0;
@@ -76,10 +64,10 @@ public class AxisTickCategoryChartCalculator extends AxisTickCalculator {
     // set up String formatters that may be encountered
     NumberFormatter numberFormatter = null;
     SimpleDateFormat simpleDateformat = null;
-    if (chartInternal.getAxisPair().getXAxis().getAxisType() == AxisType.Number) {
+    if (axisType == AxisType.Number) {
       numberFormatter = new NumberFormatter(styleManager);
     }
-    else if (chartInternal.getAxisPair().getXAxis().getAxisType() == AxisType.Date) {
+    else if (axisType == AxisType.Date) {
       if (styleManager.getDatePattern() == null) {
         throw new RuntimeException("You need to set the Date Formatting Pattern!!!");
       }
@@ -90,15 +78,15 @@ public class AxisTickCategoryChartCalculator extends AxisTickCalculator {
     int counter = 0;
 
     for (Object category : categories) {
-      if (chartInternal.getAxisPair().getXAxis().getAxisType() == AxisType.String) {
+      if (axisType == AxisType.String) {
         tickLabels.add(category.toString());
         double tickLabelPosition = margin + firstPosition + gridStep * counter++;
         tickLocations.add(tickLabelPosition);
       }
-      else if (chartInternal.getAxisPair().getXAxis().getAxisType() == AxisType.Number) {
+      else if (axisType == AxisType.Number) {
         tickLabels.add(numberFormatter.formatNumber(new BigDecimal(category.toString()), minValue, maxValue, axisDirection));
       }
-      else if (chartInternal.getAxisPair().getXAxis().getAxisType() == AxisType.Date) {
+      else if (axisType == AxisType.Date) {
 
         tickLabels.add(simpleDateformat.format((((Date) category).getTime())));
       }
diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/ChartInternal.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/ChartInternal.java
index 6701d7ea..332d7ab8 100644
--- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/ChartInternal.java
+++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/ChartInternal.java
@@ -163,6 +163,13 @@ public class ChartInternal {
     if (xData.size() != yData.size()) {
       throw new IllegalArgumentException("X and Y-Axis sizes are not the same!!!");
     }
+    // verify all series have exactly the same xAxis
+    if (seriesMap.size() > 0) { // there was already a series added
+      if (!seriesMap.entrySet().iterator().next().getValue().getXData().equals(xData)) {
+        throw new IllegalArgumentException("X-Axis data must exactly match all other Series X-Axis data for Category Charts!!");
+      }
+    }
+    // TODO make sure pie charts only have one series!
 
     // inspect the series to see what kind of data it contains (Number, Date, String)
     setXAxisType(xData);
@@ -304,6 +311,7 @@ public class ChartInternal {
     if (getSeriesMap().isEmpty()) {
       throw new RuntimeException("No series defined for Chart!!!");
     }
+
     xAxisMin = axisPair.getXAxis().getMin();
     xAxisMax = axisPair.getXAxis().getMax();
     yAxisMin = axisPair.getYAxis().getMin();
-- 
GitLab