From ebc75d7aa168325435b1a948e3ef6968a75b8e03 Mon Sep 17 00:00:00 2001
From: Tim Molter <tim@knowm.org>
Date: Mon, 25 Jan 2016 15:46:33 +0100
Subject: [PATCH] Issue #124 - New Stick chart series render type

---
 .../org/knowm/xchart/demo/XChartDemo.java     |  8 +++
 .../demo/charts/stick/StickChart01.java       | 69 +++++++++++++++++++
 .../org/knowm/xchart/Series_Category.java     | 14 +++-
 .../org/knowm/xchart/Styler_Category.java     |  6 +-
 .../chartpart/PlotContent_Category_Bar.java   | 39 ++++++++++-
 ...lotContent_Category_Line_Area_Scatter.java | 36 +++++++---
 .../internal/chartpart/Plot_Category.java     | 17 +++--
 7 files changed, 165 insertions(+), 24 deletions(-)
 create mode 100644 xchart-demo/src/main/java/org/knowm/xchart/demo/charts/stick/StickChart01.java

diff --git a/xchart-demo/src/main/java/org/knowm/xchart/demo/XChartDemo.java b/xchart-demo/src/main/java/org/knowm/xchart/demo/XChartDemo.java
index 3d78d702..f9af8b53 100644
--- a/xchart-demo/src/main/java/org/knowm/xchart/demo/XChartDemo.java
+++ b/xchart-demo/src/main/java/org/knowm/xchart/demo/XChartDemo.java
@@ -69,6 +69,7 @@ import org.knowm.xchart.demo.charts.scatter.ScatterChart01;
 import org.knowm.xchart.demo.charts.scatter.ScatterChart02;
 import org.knowm.xchart.demo.charts.scatter.ScatterChart03;
 import org.knowm.xchart.demo.charts.scatter.ScatterChart04;
+import org.knowm.xchart.demo.charts.stick.StickChart01;
 import org.knowm.xchart.demo.charts.theme.ThemeChart01;
 import org.knowm.xchart.demo.charts.theme.ThemeChart02;
 import org.knowm.xchart.demo.charts.theme.ThemeChart03;
@@ -307,6 +308,13 @@ public class XChartDemo extends JPanel implements TreeSelectionListener {
     defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart09 - Category chart with Bar, Line and Scatter Series", new BarChart09().getChart()));
     category.add(defaultMutableTreeNode);
 
+    // Stick category
+    category = new DefaultMutableTreeNode("Stick Charts");
+    top.add(category);
+
+    defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("StickChart01 - Stick", new StickChart01().getChart()));
+    category.add(defaultMutableTreeNode);
+
     // Theme category
     category = new DefaultMutableTreeNode("Chart Themes");
     top.add(category);
diff --git a/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/stick/StickChart01.java b/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/stick/StickChart01.java
new file mode 100644
index 00000000..cd73181d
--- /dev/null
+++ b/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/stick/StickChart01.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright 2013 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.knowm.xchart.demo.charts.stick;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.knowm.xchart.ChartBuilder_Category;
+import org.knowm.xchart.Chart_Category;
+import org.knowm.xchart.Series_Category.ChartCategorySeriesRenderStyle;
+import org.knowm.xchart.SwingWrapper;
+import org.knowm.xchart.demo.charts.ExampleChart;
+import org.knowm.xchart.internal.chartpart.Chart;
+import org.knowm.xchart.internal.style.Styler.LegendPosition;
+
+/**
+ * Stick Chart
+ * <p>
+ * Demonstrates the following:
+ * <ul>
+ * <li>Stick category series render type
+ */
+public class StickChart01 implements ExampleChart {
+
+  public static void main(String[] args) {
+
+    ExampleChart exampleChart = new StickChart01();
+    Chart chart = exampleChart.getChart();
+    new SwingWrapper(chart).displayChart();
+  }
+
+  @Override
+  public Chart getChart() {
+
+    // generates Log data
+    List<Integer> xData = new ArrayList<Integer>();
+    List<Integer> yData = new ArrayList<Integer>();
+    for (int i = -3; i <= 24; i++) {
+      xData.add(i);
+      yData.add(i);
+    }
+
+    // Create Chart
+    Chart_Category chart = new ChartBuilder_Category().width(800).height(600).title("Stick").build();
+
+    // Customize Chart
+    chart.getStyler().setChartTitleVisible(true);
+    chart.getStyler().setLegendPosition(LegendPosition.InsideNW);
+    chart.getStyler().setChartCategorySeriesRenderStyle(ChartCategorySeriesRenderStyle.Stick);
+
+    // Series
+    chart.addSeries("data", xData, yData);
+
+    return chart;
+  }
+}
\ No newline at end of file
diff --git a/xchart/src/main/java/org/knowm/xchart/Series_Category.java b/xchart/src/main/java/org/knowm/xchart/Series_Category.java
index 2e7194da..ee1f5fd7 100644
--- a/xchart/src/main/java/org/knowm/xchart/Series_Category.java
+++ b/xchart/src/main/java/org/knowm/xchart/Series_Category.java
@@ -20,13 +20,13 @@ import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
-import org.knowm.xchart.internal.chartpart.Axis.AxisDataType;
 import org.knowm.xchart.internal.Series_AxesChart;
+import org.knowm.xchart.internal.chartpart.Axis.AxisDataType;
 import org.knowm.xchart.internal.chartpart.RenderableSeries;
 import org.knowm.xchart.internal.chartpart.RenderableSeries.LegendRenderType;
 
 /**
- * A Series containing X and Y data to be plotted on a Chart
+ * A Series containing category data to be plotted on a Chart
  *
  * @author timmolter
  */
@@ -34,7 +34,15 @@ public class Series_Category extends Series_AxesChart {
 
   public enum ChartCategorySeriesRenderStyle implements RenderableSeries {
 
-    Line(LegendRenderType.Line), Area(LegendRenderType.Line), Scatter(LegendRenderType.Scatter), Bar(LegendRenderType.Box);
+    Line(LegendRenderType.Line),
+
+    Area(LegendRenderType.Line),
+
+    Scatter(LegendRenderType.Scatter),
+
+    Bar(LegendRenderType.Box),
+
+    Stick(LegendRenderType.Line);
 
     private final LegendRenderType legendRenderType;
 
diff --git a/xchart/src/main/java/org/knowm/xchart/Styler_Category.java b/xchart/src/main/java/org/knowm/xchart/Styler_Category.java
index fc180b13..a5a0bd0c 100644
--- a/xchart/src/main/java/org/knowm/xchart/Styler_Category.java
+++ b/xchart/src/main/java/org/knowm/xchart/Styler_Category.java
@@ -39,7 +39,7 @@ public class Styler_Category extends Styler_AxesChart {
   @Override
   protected void setAllStyles() {
 
-    chartCategorySeriesRenderStyle = ChartCategorySeriesRenderStyle.Bar; // set default to bar
+    this.chartCategorySeriesRenderStyle = ChartCategorySeriesRenderStyle.Bar; // set default to bar
   }
 
   public ChartCategorySeriesRenderStyle getChartCategorySeriesRenderStyle() {
@@ -48,9 +48,9 @@ public class Styler_Category extends Styler_AxesChart {
   }
 
   /**
-   * Sets the default series render style for the chart (line, scatter, area, etc.) You can override the series render style individually on each Series object.
+   * Sets the default series render style for the chart (bar, stick, line, scatter, area, etc.) You can override the series render style individually on each Series object.
    *
-   * @param chartXYSeriesRenderStyle
+   * @param chartCategorySeriesRenderStyle
    */
   public void setChartCategorySeriesRenderStyle(ChartCategorySeriesRenderStyle chartCategorySeriesRenderStyle) {
 
diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Bar.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Bar.java
index 5166fe84..2364f2fc 100644
--- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Bar.java
+++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Bar.java
@@ -43,7 +43,7 @@ public class PlotContent_Category_Bar<ST extends Styler, S extends Series> exten
   /**
    * Constructor
    *
-   * @param plot
+   * @param chart
    */
   protected PlotContent_Category_Bar(Chart<Styler_Category, Series_Category> chart) {
 
@@ -173,13 +173,23 @@ public class PlotContent_Category_Bar<ST extends Styler, S extends Series> exten
           double barWidthPercentage = stylerCategory.getBarWidthPercentage();
           barWidth = gridStep * barWidthPercentage;
           double barMargin = gridStep * (1 - barWidthPercentage) / 2;
-          xOffset = bounds.getX() + xLeftMargin + gridStep * categoryCounter++ + barMargin;
+          if (ChartCategorySeriesRenderStyle.Stick.equals(series.getChartCategorySeriesRenderStyle())) {
+            xOffset = bounds.getX() + xLeftMargin + categoryCounter++ * gridStep + gridStep / 2;
+          }
+          else {
+            xOffset = bounds.getX() + xLeftMargin + gridStep * categoryCounter++ + barMargin;
+          }
         }
         else {
           double barWidthPercentage = stylerCategory.getBarWidthPercentage();
           barWidth = gridStep / chart.getSeriesMap().size() * barWidthPercentage;
           double barMargin = gridStep * (1 - barWidthPercentage) / 2;
-          xOffset = bounds.getX() + xLeftMargin + gridStep * categoryCounter++ + seriesCounter * barWidth + barMargin;
+          if (ChartCategorySeriesRenderStyle.Stick.equals(series.getChartCategorySeriesRenderStyle())) {
+            xOffset = bounds.getX() + xLeftMargin + categoryCounter++ * gridStep + seriesCounter * barMargin + gridStep / chart.getSeriesMap().size() / 2;
+          }
+          else {
+            xOffset = bounds.getX() + xLeftMargin + gridStep * categoryCounter++ + seriesCounter * barWidth + barMargin;
+          }
         }
 
         // paint series
@@ -200,6 +210,29 @@ public class PlotContent_Category_Bar<ST extends Styler, S extends Series> exten
             g.draw(path);
           }
         }
+        else if (ChartCategorySeriesRenderStyle.Stick.equals(series.getChartCategorySeriesRenderStyle())) {
+
+          // paint line
+          if (series.getLineStyle() != SeriesLines.NONE) {
+
+            g.setColor(series.getLineColor());
+            g.setStroke(series.getLineStyle());
+            Shape line = new Line2D.Double(xOffset, zeroOffset, xOffset, yOffset);
+            g.draw(line);
+          }
+
+          // paint marker
+          if (series.getMarker() != null) {
+            g.setColor(series.getMarkerColor());
+
+            if (y <= 0) {
+              series.getMarker().paint(g, xOffset, zeroOffset, stylerCategory.getMarkerSize());
+            }
+            else {
+              series.getMarker().paint(g, xOffset, yOffset, stylerCategory.getMarkerSize());
+            }
+          }
+        }
         else {
 
           // paint line
diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Line_Area_Scatter.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Line_Area_Scatter.java
index 10c5452b..45b04879 100644
--- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Line_Area_Scatter.java
+++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Line_Area_Scatter.java
@@ -48,7 +48,7 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends
   protected PlotContent_Category_Line_Area_Scatter(Chart<Styler_Category, Series_Category> chart) {
 
     super(chart);
-    this.stylerCategory = stylerCategory;
+    this.stylerCategory = chart.getStyler();
   }
 
   @Override
@@ -106,13 +106,15 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends
       yMin = Math.log10(yMin);
       yMax = Math.log10(yMax);
     }
+    System.out.println("yMin = " + yMin);
+    System.out.println("yMax = " + yMax);
 
-    Map<String, Series_Category> map = chart.getSeriesMap();
+    Map<String, Series_Category> seriesMap = chart.getSeriesMap();
 
-    int numCategories = map.size();
+    int numCategories = seriesMap.values().iterator().next().getXData().size();
     double gridStep = xTickSpace / numCategories;
 
-    for (Series_Category series : map.values()) {
+    for (Series_Category series : seriesMap.values()) {
 
       // data points
       Collection<? extends Number> yData = series.getYData();
@@ -154,7 +156,7 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends
         else {
           y = yOrig;
         }
-        // System.out.println(y);
+        System.out.println(y);
 
         double yTransform = bounds.getHeight() - (yTopMargin + (y - yMin) / (yMax - yMin) * yTickSpace);
 
@@ -165,11 +167,10 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends
 
         double xOffset = bounds.getX() + xLeftMargin + categoryCounter++ * gridStep + gridStep / 2;
         double yOffset = bounds.getY() + yTransform;
-        // System.out.println(xTransform);
-        // System.out.println(xOffset);
-        // System.out.println(yTransform);
-        // System.out.println(yOffset);
-        // System.out.println("---");
+        System.out.println(xOffset);
+        System.out.println(yTransform);
+        System.out.println(yOffset);
+        System.out.println("---");
 
         // paint line
         if (ChartCategorySeriesRenderStyle.Line.equals(series.getChartCategorySeriesRenderStyle()) || ChartCategorySeriesRenderStyle.Area.equals(series.getChartCategorySeriesRenderStyle())) {
@@ -205,6 +206,21 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends
           }
         }
 
+        // paint stick
+        if (ChartCategorySeriesRenderStyle.Stick.equals(series.getChartCategorySeriesRenderStyle())) {
+
+          if (series.getLineStyle() != SeriesLines.NONE) {
+
+            double yBottomOfArea = bounds.getY() + bounds.getHeight() - yTopMargin;
+
+            g.setColor(series.getLineColor());
+            g.setStroke(series.getLineStyle());
+            Shape line = new Line2D.Double(xOffset, yBottomOfArea, xOffset, yOffset);
+            g.draw(line);
+          }
+
+        }
+
         previousX = xOffset;
         previousY = yOffset;
 
diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Plot_Category.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Plot_Category.java
index 19754072..e90da768 100644
--- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Plot_Category.java
+++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Plot_Category.java
@@ -16,17 +16,21 @@
  */
 package org.knowm.xchart.internal.chartpart;
 
+import java.awt.Graphics2D;
+
 import org.knowm.xchart.Series_Category;
 import org.knowm.xchart.Series_Category.ChartCategorySeriesRenderStyle;
+import org.knowm.xchart.Styler_Category;
 import org.knowm.xchart.internal.Series;
 import org.knowm.xchart.internal.style.Styler_AxesChart;
-import org.knowm.xchart.Styler_Category;
 
 /**
  * @author timmolter
  */
 public class Plot_Category<ST extends Styler_AxesChart, S extends Series> extends Plot_AxesChart {
 
+  Styler_Category stylerCategory;
+
   /**
    * Constructor
    *
@@ -35,19 +39,22 @@ public class Plot_Category<ST extends Styler_AxesChart, S extends Series> extend
   public Plot_Category(Chart<Styler_Category, Series_Category> chart) {
 
     super(chart);
+    stylerCategory = chart.getStyler();
+  }
 
-    Styler_Category stylerCategory = chart.getStyler();
+  @Override
+  public void paint(Graphics2D g) {
 
-    if (ChartCategorySeriesRenderStyle.Bar.equals(stylerCategory.getChartCategorySeriesRenderStyle())) {
+    if (ChartCategorySeriesRenderStyle.Bar.equals(stylerCategory.getChartCategorySeriesRenderStyle()) || ChartCategorySeriesRenderStyle.Stick.equals(stylerCategory
+        .getChartCategorySeriesRenderStyle())) {
 
       this.plotContent = new PlotContent_Category_Bar<Styler_Category, Series_Category>(chart);
-
     }
     else {
       this.plotContent = new PlotContent_Category_Line_Area_Scatter<Styler_Category, Series_Category>(chart);
-
     }
 
+    super.paint(g);
   }
 
 }
-- 
GitLab