From ccea5194ed39e0e3111e7e83ac9d460f2165be8d Mon Sep 17 00:00:00 2001
From: Alex Nugent <i@alexnugent.name>
Date: Sat, 9 Jul 2011 11:58:28 -0600
Subject: [PATCH] added QuickXChart

---
 dist/xchart-1.0.0.jar                         | Bin 50976 -> 54152 bytes
 src/com/xeiam/swing/QuickXChart.java          | 154 ++++++++++++++++++
 src/com/xeiam/swing/SwingHelper.java          |  38 ++---
 .../xeiam/xcharts/example/SwingChart5.java    |  68 ++++----
 4 files changed, 198 insertions(+), 62 deletions(-)
 create mode 100644 src/com/xeiam/swing/QuickXChart.java

diff --git a/dist/xchart-1.0.0.jar b/dist/xchart-1.0.0.jar
index 975bb4a371b0e9f5d73755946336444a7e9f1b5d..2daab78ba513d870852ff4ead846fa40ac904b95 100644
GIT binary patch
delta 13611
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

delta 10362
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
S!Dqx^#K0-Qz`(d2qyhlHja=OT

diff --git a/src/com/xeiam/swing/QuickXChart.java b/src/com/xeiam/swing/QuickXChart.java
new file mode 100644
index 00000000..47c78698
--- /dev/null
+++ b/src/com/xeiam/swing/QuickXChart.java
@@ -0,0 +1,154 @@
+package com.xeiam.swing;
+
+import java.awt.GridLayout;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+import com.xeiam.xcharts.Chart;
+import com.xeiam.xcharts.JChartPanel;
+import com.xeiam.xcharts.series.Series;
+import com.xeiam.xcharts.series.SeriesMarker;
+
+public class QuickXChart {
+
+    Chart[] charts;
+    int numRows;
+    int numCols;
+
+    int chartIdx = 0;
+
+    int height = 300;
+    int width = 600;
+
+    SeriesMarker seriesMarker = SeriesMarker.NONE;
+
+    boolean chartTitleVisible = true;
+    boolean chartLegendVisible = true;
+    boolean axisTitlesVisible = true;
+
+    public QuickXChart(int numRows, int numCols) {
+        charts = new Chart[numRows * numCols];
+        this.numRows = numRows;
+        this.numCols = numCols;
+    }
+
+    public void setChartPosition(int row, int col) {
+        chartIdx = row * numCols + col;
+        System.out.println("chartIdx set=" + chartIdx);
+    }
+
+    public void setChartSize(int width, int height) {
+        this.height = height;
+        this.width = width;
+    }
+
+    public void setSeriesMarker(SeriesMarker seriesMarker) {
+        this.seriesMarker = seriesMarker;
+    }
+
+    public void setChart(String chartTitle, String xTitle, String yTitle, double[] x, double[] y, String legend) {
+        // Create Chart
+        Chart chart = new Chart(width, height);
+
+        // Customize Chart
+        chart.setChartTitle(chartTitle);
+        chart.setXAxisTitle(xTitle);
+        chart.setYAxisTitle(yTitle);
+        chart.setChartTitleVisible(chartTitleVisible);
+        chart.setChartLegendVisible(chartLegendVisible);
+        chart.setAxisTitlesVisible(axisTitlesVisible);
+        // Series
+        Series series;
+        if (legend != null) {
+            series = chart.addSeries(legend, x, y);
+        } else {
+            chart.setChartLegendVisible(false);
+            series = chart.addSeries(" ", x, y);
+        }
+
+        series.setMarker(seriesMarker);
+
+        charts[chartIdx] = chart;
+    }
+
+    public void setChart(String chartTitle, String xTitle, String yTitle, double[] x, double[][] y, String[] legend) {
+        // Create Chart
+        Chart chart = new Chart(width, height);
+
+        // Customize Chart
+        chart.setChartTitle(chartTitle);
+        chart.setXAxisTitle(xTitle);
+        chart.setYAxisTitle(yTitle);
+        chart.setChartTitleVisible(chartTitleVisible);
+        chart.setChartLegendVisible(chartLegendVisible);
+        chart.setAxisTitlesVisible(axisTitlesVisible);
+        // Series
+        for (int i = 0; i < y.length; i++) {
+            Series series;
+            if (legend != null) {
+                series = chart.addSeries(legend[i], x, y[i]);
+            } else {
+                chart.setChartLegendVisible(false);
+                series = chart.addSeries(" " + i, x, y[i]);
+            }
+            series.setMarker(seriesMarker);
+        }
+
+        charts[chartIdx] = chart;
+    }
+
+    public void display() {
+        // Schedule a job for the event-dispatching thread:
+        // creating and showing this application's GUI.
+        javax.swing.SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                // Create and set up the window.
+                JFrame frame = new JFrame("XChart");
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                frame.getContentPane().setLayout(new GridLayout(numRows, numCols));
+
+                for (int i = 0; i < charts.length; i++) {
+
+                    if (charts[i] != null) {
+                        JPanel chartPanel = new JChartPanel(charts[i]);
+                        frame.getContentPane().add(chartPanel);
+                    } else {
+                        JPanel chartPanel = new JPanel();
+                        frame.getContentPane().add(chartPanel);
+                    }
+
+                }
+
+                // frame.setContentPane(newContentPane);
+
+                // Display the window.
+                frame.pack();
+                frame.setVisible(true);
+            }
+        });
+    }
+
+    /**
+     * @param chartTitleVisible the chartTitleVisible to set
+     */
+    public void setChartTitleVisible(boolean chartTitleVisible) {
+        this.chartTitleVisible = chartTitleVisible;
+    }
+
+    /**
+     * @param chartLegendVisible the chartLegendVisible to set
+     */
+    public void setChartLegendVisible(boolean chartLegendVisible) {
+        this.chartLegendVisible = chartLegendVisible;
+    }
+
+    /**
+     * @param axisTitlesVisible the axisTitlesVisible to set
+     */
+    public void setAxisTitlesVisible(boolean axisTitlesVisible) {
+        this.axisTitlesVisible = axisTitlesVisible;
+    }
+
+}
diff --git a/src/com/xeiam/swing/SwingHelper.java b/src/com/xeiam/swing/SwingHelper.java
index 8ec2783d..09076b76 100644
--- a/src/com/xeiam/swing/SwingHelper.java
+++ b/src/com/xeiam/swing/SwingHelper.java
@@ -20,35 +20,27 @@ public class SwingHelper {
         this.charts = charts;
     }
 
-    /**
-     * Create the GUI and show it. For thread safety, this method should be invoked from the event-dispatching thread.
-     */
-    private void createAndShowGUI() {
-
-        // Create and set up the window.
-        JFrame frame = new JFrame("XChart");
-        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-        frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
-
-        for (int i = 0; i < charts.length; i++) {
-            JPanel chartPanel = new JChartPanel(charts[i]);
-            frame.getContentPane().add(chartPanel);
-        }
-
-        // frame.setContentPane(newContentPane);
-
-        // Display the window.
-        frame.pack();
-        frame.setVisible(true);
-    }
-
     public void displayChart() {
         // Schedule a job for the event-dispatching thread:
         // creating and showing this application's GUI.
         javax.swing.SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {
-                createAndShowGUI();
+                // Create and set up the window.
+                JFrame frame = new JFrame("XChart");
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
+
+                for (int i = 0; i < charts.length; i++) {
+                    JPanel chartPanel = new JChartPanel(charts[i]);
+                    frame.getContentPane().add(chartPanel);
+                }
+
+                // frame.setContentPane(newContentPane);
+
+                // Display the window.
+                frame.pack();
+                frame.setVisible(true);
             }
         });
     }
diff --git a/src/com/xeiam/xcharts/example/SwingChart5.java b/src/com/xeiam/xcharts/example/SwingChart5.java
index 97297f2e..edd12ae4 100644
--- a/src/com/xeiam/xcharts/example/SwingChart5.java
+++ b/src/com/xeiam/xcharts/example/SwingChart5.java
@@ -15,10 +15,7 @@
  */
 package com.xeiam.xcharts.example;
 
-import com.xeiam.swing.SwingHelper;
-import com.xeiam.xcharts.Chart;
-import com.xeiam.xcharts.series.Series;
-import com.xeiam.xcharts.series.SeriesMarker;
+import com.xeiam.swing.QuickXChart;
 
 /**
  * Demonstrated/Tests plotting horizontal and vertical lines
@@ -27,53 +24,46 @@ import com.xeiam.xcharts.series.SeriesMarker;
  */
 public class SwingChart5 {
 
-    private static void createAndShowGUI() {
-
-        Chart[] charts = new Chart[3];
-        for (int i = 0; i < charts.length; i++) {
-            charts[i] = getRandomWalkChart(1000);
-        }
-
-        SwingHelper swingHelper = new SwingHelper(charts);
-        swingHelper.displayChart();
-
-    }
-
-    private static Chart getRandomWalkChart(int N) {
+    private static double[] getRandomWalk(int N) {
 
         double[] y = new double[N];
         for (int i = 1; i < y.length; i++) {
             y[i] = y[i - 1] + Math.random() - .5;
         }
 
-        // Create Chart
-        Chart chart = new Chart(600, 300);
+        return y;
+
+    }
 
-        // Customize Chart
-        chart.setChartTitle("Random Walk");
-        chart.setXAxisTitle("X");
-        chart.setYAxisTitle("Y");
-        chart.setChartTitleVisible(true);
-        chart.setChartLegendVisible(true);
-        chart.setAxisTitlesVisible(true);
+    public static void main(String[] args) {
 
-        // Series
-        Series series1 = chart.addSeries("y=0", null, y);
-        series1.setMarker(SeriesMarker.NONE);
+        int numRows = 2;
+        int numCols = 2;
 
-        return chart;
+        QuickXChart quickChart = new QuickXChart(2, 2);
 
-    }
+        for (int i = 0; i < numRows; i++) {
+            for (int j = 0; j < numCols; j++) {
+                quickChart.setChartPosition(i, j);
+                if (i == 1 && j == 1) {
 
-    public static void main(String[] args) {
+                    double[][] y = new double[10][1000];
+                    String[] legend = new String[10];
+                    for (int k = 0; k < y.length; k++) {
+                        y[k] = getRandomWalk(1000);
+                        legend[k] = "" + k;
+                    }
+                    quickChart.setChart(i + "," + j, "X", "Y", null, y, legend);
+                } else if (i == 0 && j == 1) {
+                    // nothing
+                } else {
+                    quickChart.setChart(i + "," + j, "X", "Y", null, getRandomWalk(1000), null);
+                }
 
-        // Schedule a job for the event-dispatching thread:
-        // creating and showing this application's GUI.
-        javax.swing.SwingUtilities.invokeLater(new Runnable() {
-            @Override
-            public void run() {
-                createAndShowGUI();
             }
-        });
+        }
+
+        quickChart.display();
+
     }
 }
-- 
GitLab