changeset 2304:846831e69547

Rename SingleValueChartPanel to ThermostatChartPanel Reviewed-by: jerboaa Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2016-May/018887.html
author Jie Kang <jkang@redhat.com>
date Fri, 20 May 2016 09:38:54 -0400
parents 45d5c99c88bb
children 361993822317
files client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/SingleValueChartPanel.java client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/ThermostatChartPanel.java client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/RecentTimeControlPanelTest.java client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/SingleValueChartPanelTest.java client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/ThermostatChartPanelTest.java numa/client-swing/src/main/java/com/redhat/thermostat/numa/client/swing/internal/NumaPanel.java vm-cpu/client-swing/src/main/java/com/redhat/thermostat/vm/cpu/client/swing/internal/VmCpuPanel.java vm-gc/client-swing/src/main/java/com/redhat/thermostat/vm/gc/client/swing/internal/VmGcPanel.java vm-numa/client-swing/src/main/java/com/redhat/thermostat/vm/numa/client/swing/internal/VmNumaPanel.java
diffstat 9 files changed, 465 insertions(+), 465 deletions(-) [+]
line wrap: on
line diff
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/SingleValueChartPanel.java	Fri May 20 09:38:17 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,234 +0,0 @@
-/*
- * Copyright 2012-2016 Red Hat, Inc.
- *
- * This file is part of Thermostat.
- *
- * Thermostat is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation; either version 2, or (at your
- * option) any later version.
- *
- * Thermostat is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Thermostat; see the file COPYING.  If not see
- * <http://www.gnu.org/licenses/>.
- *
- * Linking this code with other modules is making a combined work
- * based on this code.  Thus, the terms and conditions of the GNU
- * General Public License cover the whole combination.
- *
- * As a special exception, the copyright holders of this code give
- * you permission to link this code with independent modules to
- * produce an executable, regardless of the license terms of these
- * independent modules, and to copy and distribute the resulting
- * executable under terms of your choice, provided that you also
- * meet, for each linked independent module, the terms and conditions
- * of the license of that module.  An independent module is a module
- * which is not derived from or based on this code.  If you modify
- * this code, you may extend this exception to your version of the
- * library, but you are not obligated to do so.  If you do not wish
- * to do so, delete this exception statement from your version.
- */
-
-package com.redhat.thermostat.client.swing.components.experimental;
-
-import java.awt.BasicStroke;
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.BoxLayout;
-import javax.swing.JPanel;
-import javax.swing.SwingUtilities;
-import javax.swing.text.JTextComponent;
-
-import org.jfree.chart.ChartMouseEvent;
-import org.jfree.chart.ChartMouseListener;
-import org.jfree.chart.ChartPanel;
-import org.jfree.chart.JFreeChart;
-import org.jfree.chart.axis.ValueAxis;
-import org.jfree.chart.panel.CrosshairOverlay;
-import org.jfree.chart.plot.Crosshair;
-import org.jfree.chart.plot.XYPlot;
-import org.jfree.ui.RectangleEdge;
-
-import com.redhat.thermostat.client.swing.components.ValueField;
-import com.redhat.thermostat.client.ui.SampledDataset;
-import com.redhat.thermostat.common.Duration;
-
-
-public class SingleValueChartPanel extends JPanel {
-
-    public static final String PROPERTY_VISIBLE_TIME_RANGE = "visibleTimeRange";
-
-    private static final Color WHITE = new Color(255,255,255,0);
-    private static final Color BLACK = new Color(0,0,0,0);
-    private static final float TRANSPARENT = 0.0f;
-
-    private static final int MINIMUM_DRAW_SIZE = 100;
-
-    private JPanel chartsPanel;
-    private List<ChartPanel> charts;
-
-    private RecentTimeControlPanel recentTimeControlPanel;
-    private JTextComponent label;
-
-    private Duration initialDuration;
-
-    private ChartPanel chartPanel;
-    private Crosshair xCrosshair;
-
-    public SingleValueChartPanel(JFreeChart chart, Duration initialDuration) {
-        this(initialDuration);
-
-        addChart(chart);
-    }
-
-    public SingleValueChartPanel(Duration initialDuration) {
-        this.initialDuration = initialDuration;
-        this.chartsPanel = new JPanel();
-        this.charts = new ArrayList<>();
-
-        chartsPanel.setLayout(new BoxLayout(chartsPanel, BoxLayout.Y_AXIS));
-
-        this.setLayout(new BorderLayout());
-
-        recentTimeControlPanel = new RecentTimeControlPanel(initialDuration);
-        recentTimeControlPanel.addPropertyChangeListener(RecentTimeControlPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
-            @Override
-            public void propertyChange(final PropertyChangeEvent evt) {
-                Duration d = (Duration) evt.getNewValue();
-                SingleValueChartPanel.this.firePropertyChange(RecentTimeControlPanel.PROPERTY_VISIBLE_TIME_RANGE, null, d);
-            }
-        });
-
-        add(chartsPanel, BorderLayout.CENTER);
-        add(recentTimeControlPanel, BorderLayout.SOUTH);
-
-        revalidate();
-    }
-
-    public void addChart(JFreeChart chart) {
-        // jfreechart still generates tooltips when disabled, prevent generation as well
-        if (chart.getPlot() instanceof XYPlot) {
-            chart.getXYPlot().getRenderer().setBaseToolTipGenerator(null);
-        }
-
-        chart.getXYPlot().getRangeAxis().setAutoRange(true);
-
-        chart.getXYPlot().getDomainAxis().setAutoRange(true);
-        chart.getXYPlot().getDomainAxis().setFixedAutoRange(initialDuration.asMilliseconds());
-
-        chart.getPlot().setBackgroundPaint(WHITE);
-        chart.getPlot().setBackgroundImageAlpha(TRANSPARENT);
-        chart.getPlot().setOutlinePaint(BLACK);
-
-        chartPanel = new ChartPanel(chart);
-
-        chartPanel.setDisplayToolTips(false);
-        chartPanel.setDoubleBuffered(true);
-        chartPanel.setMouseZoomable(false);
-        chartPanel.setPopupMenu(null);
-
-        /*
-         * By default, ChartPanel scales itself instead of redrawing things when
-         * it's resized. To have it resize automatically, we need to set minimum
-         * and maximum sizes. Lets constrain the minimum, but not the maximum
-         * size.
-         */
-        chartPanel.setMinimumDrawHeight(MINIMUM_DRAW_SIZE);
-        chartPanel.setMaximumDrawHeight(Integer.MAX_VALUE);
-        chartPanel.setMinimumDrawWidth(MINIMUM_DRAW_SIZE);
-        chartPanel.setMaximumDrawWidth(Integer.MAX_VALUE);
-
-        chartsPanel.add(chartPanel);
-        chartsPanel.revalidate();
-        charts.add(chartPanel);
-
-    }
-
-    public void setTimeRangeToShow(Duration duration) {
-        for (ChartPanel cp : charts) {
-            XYPlot plot = cp.getChart().getXYPlot();
-
-            // Don't drop old data; just dont' show it.
-            plot.getDomainAxis().setAutoRange(true);
-            plot.getDomainAxis().setFixedAutoRange(duration.asMilliseconds());
-        }
-    }
-
-    public void setDataInformationLabel(final String text) {
-        SwingUtilities.invokeLater(new Runnable() {
-            @Override
-            public void run() {
-                if (label == null) {
-                    label = new ValueField(text);
-                    recentTimeControlPanel.addTextComponent(label);
-                }
-
-                label.setName("crossHair");
-                label.setText(text);
-            }
-        });
-    }
-    
-    public void enableDynamicCrosshairs() {
-        CrosshairOverlay crosshairOverlay = new CrosshairOverlay();
-        xCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f));
-        crosshairOverlay.addDomainCrosshair(xCrosshair);
-        chartPanel.addOverlay(crosshairOverlay);
-
-        chartPanel.addChartMouseListener(new ChartMouseListener() {
-            @Override
-            public void chartMouseClicked(ChartMouseEvent chartMouseEvent) {
-                //do nothing
-            }
-
-            @Override
-            public void chartMouseMoved(ChartMouseEvent event) {
-                XYPlot plot = (XYPlot) event.getChart().getPlot();
-                ValueAxis xAxis = plot.getDomainAxis();
-                SampledDataset dataset = (SampledDataset) plot.getDataset();
-                double xVal = xAxis.java2DToValue(event.getTrigger().getX(), chartPanel.getScreenDataArea(), RectangleEdge.BOTTOM);
-                int item = findNearestItem(dataset, xVal);
-                int series = dataset.getSeriesCount() - 1;
-                if (item >= 0) {
-                    double x = ((dataset.getStartXValue(series, item) + dataset.getEndXValue(series, item)) / 2) ;
-                    double y = dataset.getYValue(series, item);
-                    xCrosshair.setValue(x);
-                    setDataInformationLabel(String.valueOf(y));
-                } else {
-                    xCrosshair.setValue(Double.NaN);
-                    setDataInformationLabel("");
-                }
-            }
-        });
-    }
-    
-    private int findNearestItem(SampledDataset dataset, double xValue) {
-        int series = dataset.getSeriesCount() - 1;
-        int item = -1;
-        double currDiff = Math.abs(((dataset.getStartXValue(series, 0) + dataset.getEndXValue(series, 0)) / 2) - xValue);
-
-        for (int i = 0; i < dataset.getItemCount(series); i++) {
-            double newXVal = (dataset.getStartXValue(series, i) + dataset.getEndXValue(series, i)) / 2;
-            double newDiff = Math.abs(newXVal - xValue);
-            double yVal = dataset.getYValue(series, i);
-            if (newDiff <= currDiff && yVal > 0) {
-                item = i;
-                currDiff = newDiff;
-            }
-        }
-
-        return item;
-    }
-
-}
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/ThermostatChartPanel.java	Fri May 20 09:38:54 2016 -0400
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2012-2016 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.client.swing.components.experimental;
+
+import java.awt.BasicStroke;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.text.JTextComponent;
+
+import org.jfree.chart.ChartMouseEvent;
+import org.jfree.chart.ChartMouseListener;
+import org.jfree.chart.ChartPanel;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.axis.ValueAxis;
+import org.jfree.chart.panel.CrosshairOverlay;
+import org.jfree.chart.plot.Crosshair;
+import org.jfree.chart.plot.XYPlot;
+import org.jfree.ui.RectangleEdge;
+
+import com.redhat.thermostat.client.swing.components.ValueField;
+import com.redhat.thermostat.client.ui.SampledDataset;
+import com.redhat.thermostat.common.Duration;
+
+
+public class ThermostatChartPanel extends JPanel {
+
+    public static final String PROPERTY_VISIBLE_TIME_RANGE = "visibleTimeRange";
+
+    private static final Color WHITE = new Color(255,255,255,0);
+    private static final Color BLACK = new Color(0,0,0,0);
+    private static final float TRANSPARENT = 0.0f;
+
+    private static final int MINIMUM_DRAW_SIZE = 100;
+
+    private JPanel chartsPanel;
+    private List<ChartPanel> charts;
+
+    private RecentTimeControlPanel recentTimeControlPanel;
+    private JTextComponent label;
+
+    private Duration initialDuration;
+
+    private ChartPanel chartPanel;
+    private Crosshair xCrosshair;
+
+    public ThermostatChartPanel(JFreeChart chart, Duration initialDuration) {
+        this(initialDuration);
+
+        addChart(chart);
+    }
+
+    public ThermostatChartPanel(Duration initialDuration) {
+        this.initialDuration = initialDuration;
+        this.chartsPanel = new JPanel();
+        this.charts = new ArrayList<>();
+
+        chartsPanel.setLayout(new BoxLayout(chartsPanel, BoxLayout.Y_AXIS));
+
+        this.setLayout(new BorderLayout());
+
+        recentTimeControlPanel = new RecentTimeControlPanel(initialDuration);
+        recentTimeControlPanel.addPropertyChangeListener(RecentTimeControlPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
+            @Override
+            public void propertyChange(final PropertyChangeEvent evt) {
+                Duration d = (Duration) evt.getNewValue();
+                ThermostatChartPanel.this.firePropertyChange(RecentTimeControlPanel.PROPERTY_VISIBLE_TIME_RANGE, null, d);
+            }
+        });
+
+        add(chartsPanel, BorderLayout.CENTER);
+        add(recentTimeControlPanel, BorderLayout.SOUTH);
+
+        revalidate();
+    }
+
+    public void addChart(JFreeChart chart) {
+        // jfreechart still generates tooltips when disabled, prevent generation as well
+        if (chart.getPlot() instanceof XYPlot) {
+            chart.getXYPlot().getRenderer().setBaseToolTipGenerator(null);
+        }
+
+        chart.getXYPlot().getRangeAxis().setAutoRange(true);
+
+        chart.getXYPlot().getDomainAxis().setAutoRange(true);
+        chart.getXYPlot().getDomainAxis().setFixedAutoRange(initialDuration.asMilliseconds());
+
+        chart.getPlot().setBackgroundPaint(WHITE);
+        chart.getPlot().setBackgroundImageAlpha(TRANSPARENT);
+        chart.getPlot().setOutlinePaint(BLACK);
+
+        chartPanel = new ChartPanel(chart);
+
+        chartPanel.setDisplayToolTips(false);
+        chartPanel.setDoubleBuffered(true);
+        chartPanel.setMouseZoomable(false);
+        chartPanel.setPopupMenu(null);
+
+        /*
+         * By default, ChartPanel scales itself instead of redrawing things when
+         * it's resized. To have it resize automatically, we need to set minimum
+         * and maximum sizes. Lets constrain the minimum, but not the maximum
+         * size.
+         */
+        chartPanel.setMinimumDrawHeight(MINIMUM_DRAW_SIZE);
+        chartPanel.setMaximumDrawHeight(Integer.MAX_VALUE);
+        chartPanel.setMinimumDrawWidth(MINIMUM_DRAW_SIZE);
+        chartPanel.setMaximumDrawWidth(Integer.MAX_VALUE);
+
+        chartsPanel.add(chartPanel);
+        chartsPanel.revalidate();
+        charts.add(chartPanel);
+
+    }
+
+    public void setTimeRangeToShow(Duration duration) {
+        for (ChartPanel cp : charts) {
+            XYPlot plot = cp.getChart().getXYPlot();
+
+            // Don't drop old data; just dont' show it.
+            plot.getDomainAxis().setAutoRange(true);
+            plot.getDomainAxis().setFixedAutoRange(duration.asMilliseconds());
+        }
+    }
+
+    public void setDataInformationLabel(final String text) {
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                if (label == null) {
+                    label = new ValueField(text);
+                    recentTimeControlPanel.addTextComponent(label);
+                }
+
+                label.setName("crossHair");
+                label.setText(text);
+            }
+        });
+    }
+    
+    public void enableDynamicCrosshairs() {
+        CrosshairOverlay crosshairOverlay = new CrosshairOverlay();
+        xCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f));
+        crosshairOverlay.addDomainCrosshair(xCrosshair);
+        chartPanel.addOverlay(crosshairOverlay);
+
+        chartPanel.addChartMouseListener(new ChartMouseListener() {
+            @Override
+            public void chartMouseClicked(ChartMouseEvent chartMouseEvent) {
+                //do nothing
+            }
+
+            @Override
+            public void chartMouseMoved(ChartMouseEvent event) {
+                XYPlot plot = (XYPlot) event.getChart().getPlot();
+                ValueAxis xAxis = plot.getDomainAxis();
+                SampledDataset dataset = (SampledDataset) plot.getDataset();
+                double xVal = xAxis.java2DToValue(event.getTrigger().getX(), chartPanel.getScreenDataArea(), RectangleEdge.BOTTOM);
+                int item = findNearestItem(dataset, xVal);
+                int series = dataset.getSeriesCount() - 1;
+                if (item >= 0) {
+                    double x = ((dataset.getStartXValue(series, item) + dataset.getEndXValue(series, item)) / 2) ;
+                    double y = dataset.getYValue(series, item);
+                    xCrosshair.setValue(x);
+                    setDataInformationLabel(String.valueOf(y));
+                } else {
+                    xCrosshair.setValue(Double.NaN);
+                    setDataInformationLabel("");
+                }
+            }
+        });
+    }
+    
+    private int findNearestItem(SampledDataset dataset, double xValue) {
+        int series = dataset.getSeriesCount() - 1;
+        int item = -1;
+        double currDiff = Math.abs(((dataset.getStartXValue(series, 0) + dataset.getEndXValue(series, 0)) / 2) - xValue);
+
+        for (int i = 0; i < dataset.getItemCount(series); i++) {
+            double newXVal = (dataset.getStartXValue(series, i) + dataset.getEndXValue(series, i)) / 2;
+            double newDiff = Math.abs(newXVal - xValue);
+            double yVal = dataset.getYValue(series, i);
+            if (newDiff <= currDiff && yVal > 0) {
+                item = i;
+                currDiff = newDiff;
+            }
+        }
+
+        return item;
+    }
+
+}
+
--- a/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/RecentTimeControlPanelTest.java	Fri May 20 09:38:17 2016 -0400
+++ b/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/RecentTimeControlPanelTest.java	Fri May 20 09:38:54 2016 -0400
@@ -134,7 +134,7 @@
     public void testTextFieldUpdatingFiresTimeChangeListener() {
         final boolean[] b = new boolean[] {false};
 
-        recentTimeControlPanel.addPropertyChangeListener(SingleValueChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
+        recentTimeControlPanel.addPropertyChangeListener(ThermostatChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
             @Override
             public void propertyChange(final PropertyChangeEvent evt) {
               Duration d = (Duration) evt.getNewValue();
@@ -158,7 +158,7 @@
     public void testComboBoxUpdatingFiresTimeChangeListener() {
         final boolean[] b = new boolean[] {false};
 
-        recentTimeControlPanel.addPropertyChangeListener(SingleValueChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
+        recentTimeControlPanel.addPropertyChangeListener(ThermostatChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
             @Override
             public void propertyChange(final PropertyChangeEvent evt) {
               Duration d = (Duration) evt.getNewValue();
--- a/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/SingleValueChartPanelTest.java	Fri May 20 09:38:17 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-/*
- * Copyright 2012-2016 Red Hat, Inc.
- *
- * This file is part of Thermostat.
- *
- * Thermostat is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation; either version 2, or (at your
- * option) any later version.
- *
- * Thermostat is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Thermostat; see the file COPYING.  If not see
- * <http://www.gnu.org/licenses/>.
- *
- * Linking this code with other modules is making a combined work
- * based on this code.  Thus, the terms and conditions of the GNU
- * General Public License cover the whole combination.
- *
- * As a special exception, the copyright holders of this code give
- * you permission to link this code with independent modules to
- * produce an executable, regardless of the license terms of these
- * independent modules, and to copy and distribute the resulting
- * executable under terms of your choice, provided that you also
- * meet, for each linked independent module, the terms and conditions
- * of the license of that module.  An independent module is a module
- * which is not derived from or based on this code.  If you modify
- * this code, you may extend this exception to your version of the
- * library, but you are not obligated to do so.  If you do not wish
- * to do so, delete this exception statement from your version.
- */
-
-package com.redhat.thermostat.client.swing.components.experimental;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.concurrent.TimeUnit;
-
-import javax.swing.JFrame;
-
-import org.fest.swing.annotation.GUITest;
-import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
-import org.fest.swing.edt.GuiActionRunner;
-import org.fest.swing.edt.GuiTask;
-import org.fest.swing.fixture.FrameFixture;
-import org.jfree.chart.ChartFactory;
-import org.jfree.chart.JFreeChart;
-import org.jfree.data.time.TimeSeriesCollection;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-
-import com.redhat.thermostat.annotations.internal.CacioTest;
-import com.redhat.thermostat.common.Duration;
-
-import net.java.openjdk.cacio.ctc.junit.CacioFESTRunner;
-
-@Category(CacioTest.class)
-@RunWith(CacioFESTRunner.class)
-public class SingleValueChartPanelTest {
-
-    private SingleValueChartPanel singleValueChartPanel;
-    private final TimeSeriesCollection dataset = new TimeSeriesCollection();
-    private Duration duration;
-    private JFreeChart chart;
-    private static final int DEFAULT_VALUE = 10;
-    private static final TimeUnit DEFAULT_UNIT = TimeUnit.MINUTES;
-    private final int ESCAPE = 27;
-
-    private JFrame frame;
-    private FrameFixture frameFixture;
-
-    @BeforeClass
-    public static void setupOnce() {
-        FailOnThreadViolationRepaintManager.install();
-    }
-
-    @Before
-    public void setUp() {
-        chart = ChartFactory.createTimeSeriesChart(
-                null,
-                "Time Label",
-                "Value Label",
-                dataset,
-                false, false, false);
-        duration = new Duration(DEFAULT_VALUE, DEFAULT_UNIT);
-        GuiActionRunner.execute(new GuiTask() {
-            @Override
-            protected void executeInEDT() throws Throwable {
-                singleValueChartPanel = new SingleValueChartPanel(chart, duration);
-                frame = new JFrame();
-                frame.add(singleValueChartPanel);
-            }
-        });
-        frameFixture = new FrameFixture(frame);
-        frameFixture.show();
-    }
-
-    @After
-    public void tearDown() {
-        singleValueChartPanel = null;
-        duration = null;
-        frameFixture.cleanUp();
-        frameFixture = null;
-    }
-
-    @GUITest
-    @Test
-    public void testDurationChangeFiresPropertyChange() {
-
-        final boolean[] b = new boolean[] {false};
-
-        singleValueChartPanel.addPropertyChangeListener(SingleValueChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
-            @Override
-            public void propertyChange(final PropertyChangeEvent evt) {
-                Duration d = (Duration) evt.getNewValue();
-                Duration expected = new Duration(5, TimeUnit.MINUTES);
-                if (d.equals(expected)) {
-                    b[0] = true;
-                }
-            }
-        });
-
-        frameFixture.textBox("durationSelector").selectAll();
-        frameFixture.textBox("durationSelector").enterText("5");
-        frameFixture.textBox("durationSelector").pressKey(ESCAPE);
-        assertTrue(b[0]);
-    }
-
-    @GUITest
-    @Test
-    public void testTimeUnitChangeFiresPropertyChange() {
-
-        final boolean[] b = new boolean[] {false};
-
-        singleValueChartPanel.addPropertyChangeListener(SingleValueChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
-            @Override
-            public void propertyChange(final PropertyChangeEvent evt) {
-                Duration d = (Duration) evt.getNewValue();
-                Duration expected = new Duration(10, TimeUnit.HOURS);
-                if (d.equals(expected)) {
-                    b[0] = true;
-                }
-            }
-        });
-
-        frameFixture.comboBox("unitSelector").selectItem(1);
-
-        assertTrue(b[0]);
-    }
-
-    @GUITest
-    @Test
-    public void testTimeRangeToShow() {
-        Duration time = new Duration(20, TimeUnit.MINUTES);
-        singleValueChartPanel.setTimeRangeToShow(time);
-        assertEquals(time.asMilliseconds(), (long) chart.getXYPlot().getDomainAxis().getRange().getLength());
-    }
-
-    @GUITest
-    @Test
-    public void testMultipleChartTimeRangeToShow() {
-        final JFreeChart chart2 = ChartFactory.createTimeSeriesChart(
-                null,
-                "Time Label",
-                "Value Label",
-                dataset,
-                false, false, false);
-        final JFreeChart chart3 = ChartFactory.createTimeSeriesChart(
-                null,
-                "Time Label",
-                "Value Label",
-                dataset,
-                false, false, false);
-        GuiActionRunner.execute(new GuiTask() {
-            @Override
-            protected void executeInEDT() throws Throwable {
-                singleValueChartPanel.addChart(chart2);
-                singleValueChartPanel.addChart(chart3);
-            }
-        });
-
-        Duration time = new Duration(20, TimeUnit.MINUTES);
-        singleValueChartPanel.setTimeRangeToShow(time);
-
-        assertEquals(time.asMilliseconds(), (long) chart.getXYPlot().getDomainAxis().getRange().getLength());
-        assertEquals(time.asMilliseconds(), (long) chart2.getXYPlot().getDomainAxis().getRange().getLength());
-        assertEquals(time.asMilliseconds(), (long) chart3.getXYPlot().getDomainAxis().getRange().getLength());
-    }
-
-    @GUITest
-    @Test
-    public void testInitialTimeValue() {
-        Duration time = new Duration(10, TimeUnit.MINUTES);
-        assertEquals(time.asMilliseconds(), (long) chart.getXYPlot().getDomainAxis().getRange().getLength());
-    }
-
-    @GUITest
-    @Test
-    public void testSetDataInformationLabel() {
-        singleValueChartPanel.setDataInformationLabel("15");
-        assertEquals("15", frameFixture.textBox("crossHair").text());
-    }
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/ThermostatChartPanelTest.java	Fri May 20 09:38:54 2016 -0400
@@ -0,0 +1,215 @@
+/*
+ * Copyright 2012-2016 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.client.swing.components.experimental;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.concurrent.TimeUnit;
+
+import javax.swing.JFrame;
+
+import org.fest.swing.annotation.GUITest;
+import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
+import org.fest.swing.edt.GuiActionRunner;
+import org.fest.swing.edt.GuiTask;
+import org.fest.swing.fixture.FrameFixture;
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.JFreeChart;
+import org.jfree.data.time.TimeSeriesCollection;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import com.redhat.thermostat.annotations.internal.CacioTest;
+import com.redhat.thermostat.common.Duration;
+
+import net.java.openjdk.cacio.ctc.junit.CacioFESTRunner;
+
+@Category(CacioTest.class)
+@RunWith(CacioFESTRunner.class)
+public class ThermostatChartPanelTest {
+
+    private ThermostatChartPanel thermostatChartPanel;
+    private final TimeSeriesCollection dataset = new TimeSeriesCollection();
+    private Duration duration;
+    private JFreeChart chart;
+    private static final int DEFAULT_VALUE = 10;
+    private static final TimeUnit DEFAULT_UNIT = TimeUnit.MINUTES;
+    private final int ESCAPE = 27;
+
+    private JFrame frame;
+    private FrameFixture frameFixture;
+
+    @BeforeClass
+    public static void setupOnce() {
+        FailOnThreadViolationRepaintManager.install();
+    }
+
+    @Before
+    public void setUp() {
+        chart = ChartFactory.createTimeSeriesChart(
+                null,
+                "Time Label",
+                "Value Label",
+                dataset,
+                false, false, false);
+        duration = new Duration(DEFAULT_VALUE, DEFAULT_UNIT);
+        GuiActionRunner.execute(new GuiTask() {
+            @Override
+            protected void executeInEDT() throws Throwable {
+                thermostatChartPanel = new ThermostatChartPanel(chart, duration);
+                frame = new JFrame();
+                frame.add(thermostatChartPanel);
+            }
+        });
+        frameFixture = new FrameFixture(frame);
+        frameFixture.show();
+    }
+
+    @After
+    public void tearDown() {
+        thermostatChartPanel = null;
+        duration = null;
+        frameFixture.cleanUp();
+        frameFixture = null;
+    }
+
+    @GUITest
+    @Test
+    public void testDurationChangeFiresPropertyChange() {
+
+        final boolean[] b = new boolean[] {false};
+
+        thermostatChartPanel.addPropertyChangeListener(ThermostatChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
+            @Override
+            public void propertyChange(final PropertyChangeEvent evt) {
+                Duration d = (Duration) evt.getNewValue();
+                Duration expected = new Duration(5, TimeUnit.MINUTES);
+                if (d.equals(expected)) {
+                    b[0] = true;
+                }
+            }
+        });
+
+        frameFixture.textBox("durationSelector").selectAll();
+        frameFixture.textBox("durationSelector").enterText("5");
+        frameFixture.textBox("durationSelector").pressKey(ESCAPE);
+        assertTrue(b[0]);
+    }
+
+    @GUITest
+    @Test
+    public void testTimeUnitChangeFiresPropertyChange() {
+
+        final boolean[] b = new boolean[] {false};
+
+        thermostatChartPanel.addPropertyChangeListener(ThermostatChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
+            @Override
+            public void propertyChange(final PropertyChangeEvent evt) {
+                Duration d = (Duration) evt.getNewValue();
+                Duration expected = new Duration(10, TimeUnit.HOURS);
+                if (d.equals(expected)) {
+                    b[0] = true;
+                }
+            }
+        });
+
+        frameFixture.comboBox("unitSelector").selectItem(1);
+
+        assertTrue(b[0]);
+    }
+
+    @GUITest
+    @Test
+    public void testTimeRangeToShow() {
+        Duration time = new Duration(20, TimeUnit.MINUTES);
+        thermostatChartPanel.setTimeRangeToShow(time);
+        assertEquals(time.asMilliseconds(), (long) chart.getXYPlot().getDomainAxis().getRange().getLength());
+    }
+
+    @GUITest
+    @Test
+    public void testMultipleChartTimeRangeToShow() {
+        final JFreeChart chart2 = ChartFactory.createTimeSeriesChart(
+                null,
+                "Time Label",
+                "Value Label",
+                dataset,
+                false, false, false);
+        final JFreeChart chart3 = ChartFactory.createTimeSeriesChart(
+                null,
+                "Time Label",
+                "Value Label",
+                dataset,
+                false, false, false);
+        GuiActionRunner.execute(new GuiTask() {
+            @Override
+            protected void executeInEDT() throws Throwable {
+                thermostatChartPanel.addChart(chart2);
+                thermostatChartPanel.addChart(chart3);
+            }
+        });
+
+        Duration time = new Duration(20, TimeUnit.MINUTES);
+        thermostatChartPanel.setTimeRangeToShow(time);
+
+        assertEquals(time.asMilliseconds(), (long) chart.getXYPlot().getDomainAxis().getRange().getLength());
+        assertEquals(time.asMilliseconds(), (long) chart2.getXYPlot().getDomainAxis().getRange().getLength());
+        assertEquals(time.asMilliseconds(), (long) chart3.getXYPlot().getDomainAxis().getRange().getLength());
+    }
+
+    @GUITest
+    @Test
+    public void testInitialTimeValue() {
+        Duration time = new Duration(10, TimeUnit.MINUTES);
+        assertEquals(time.asMilliseconds(), (long) chart.getXYPlot().getDomainAxis().getRange().getLength());
+    }
+
+    @GUITest
+    @Test
+    public void testSetDataInformationLabel() {
+        thermostatChartPanel.setDataInformationLabel("15");
+        assertEquals("15", frameFixture.textBox("crossHair").text());
+    }
+
+}
--- a/numa/client-swing/src/main/java/com/redhat/thermostat/numa/client/swing/internal/NumaPanel.java	Fri May 20 09:38:17 2016 -0400
+++ b/numa/client-swing/src/main/java/com/redhat/thermostat/numa/client/swing/internal/NumaPanel.java	Fri May 20 09:38:54 2016 -0400
@@ -63,7 +63,7 @@
 
 import com.redhat.thermostat.client.swing.SwingComponent;
 import com.redhat.thermostat.client.swing.components.HeaderPanel;
-import com.redhat.thermostat.client.swing.components.experimental.SingleValueChartPanel;
+import com.redhat.thermostat.client.swing.components.experimental.ThermostatChartPanel;
 import com.redhat.thermostat.client.swing.experimental.ComponentVisibilityNotifier;
 import com.redhat.thermostat.common.ActionListener;
 import com.redhat.thermostat.common.ActionNotifier;
@@ -88,7 +88,7 @@
     private Map<String, TimeSeriesCollection> collections = new HashMap<>();
     private Map<String, JFreeChart> charts = new HashMap<>();
 
-    private SingleValueChartPanel chartPanel;
+    private ThermostatChartPanel chartPanel;
     private Duration duration;
 
     private ActionNotifier<UserAction> userActionNotifier = new ActionNotifier<>(this);
@@ -117,9 +117,9 @@
 
 
         duration = new Duration(10, TimeUnit.MINUTES);
-        chartPanel = new SingleValueChartPanel(duration);
+        chartPanel = new ThermostatChartPanel(duration);
 
-        chartPanel.addPropertyChangeListener(SingleValueChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
+        chartPanel.addPropertyChangeListener(ThermostatChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
             @Override
             public void propertyChange(PropertyChangeEvent evt) {
                 duration = (Duration) evt.getNewValue();
--- a/vm-cpu/client-swing/src/main/java/com/redhat/thermostat/vm/cpu/client/swing/internal/VmCpuPanel.java	Fri May 20 09:38:17 2016 -0400
+++ b/vm-cpu/client-swing/src/main/java/com/redhat/thermostat/vm/cpu/client/swing/internal/VmCpuPanel.java	Fri May 20 09:38:54 2016 -0400
@@ -45,7 +45,7 @@
 
 import javax.swing.SwingUtilities;
 
-import com.redhat.thermostat.client.swing.components.experimental.SingleValueChartPanel;
+import com.redhat.thermostat.client.swing.components.experimental.ThermostatChartPanel;
 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.axis.NumberAxis;
@@ -81,7 +81,7 @@
     private final TimeSeriesCollection data = new TimeSeriesCollection();
     private final TimeSeries cpuTimeSeries = new TimeSeries("cpu-stats");
 
-    private SingleValueChartPanel chartPanel;
+    private ThermostatChartPanel chartPanel;
 
     private ActionNotifier<UserAction> userActionNotifier = new ActionNotifier<VmCpuView.UserAction>(this);
 
@@ -116,11 +116,11 @@
         rangeAxis.setLowerBound(0.0);
         rangeAxis.setRangeType(RangeType.POSITIVE);
 
-        chartPanel = new SingleValueChartPanel(chart, duration);
+        chartPanel = new ThermostatChartPanel(chart, duration);
 
         visiblePanel.setContent(chartPanel);
 
-        chartPanel.addPropertyChangeListener(SingleValueChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
+        chartPanel.addPropertyChangeListener(ThermostatChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
             @Override
             public void propertyChange(PropertyChangeEvent evt) {
                 duration = (Duration) evt.getNewValue();
--- a/vm-gc/client-swing/src/main/java/com/redhat/thermostat/vm/gc/client/swing/internal/VmGcPanel.java	Fri May 20 09:38:17 2016 -0400
+++ b/vm-gc/client-swing/src/main/java/com/redhat/thermostat/vm/gc/client/swing/internal/VmGcPanel.java	Fri May 20 09:38:54 2016 -0400
@@ -94,7 +94,7 @@
 import com.redhat.thermostat.client.swing.components.SectionHeader;
 import com.redhat.thermostat.client.swing.components.ThermostatScrollPane;
 import com.redhat.thermostat.client.swing.components.experimental.RecentTimeControlPanel;
-import com.redhat.thermostat.client.swing.components.experimental.SingleValueChartPanel;
+import com.redhat.thermostat.client.swing.components.experimental.ThermostatChartPanel;
 import com.redhat.thermostat.client.swing.experimental.ComponentVisibilityNotifier;
 import com.redhat.thermostat.client.ui.RecentTimeSeriesChartController;
 import com.redhat.thermostat.client.ui.SampledDataset;
@@ -308,7 +308,7 @@
 
         Duration defaultDuration = new Duration(DEFAULT_VALUE, DEFAULT_UNIT);
         final RecentTimeSeriesChartController chartController = new RecentTimeSeriesChartController(chart);
-        final SingleValueChartPanel chartPanel = new SingleValueChartPanel(chart, defaultDuration);
+        final ThermostatChartPanel chartPanel = new ThermostatChartPanel(chart, defaultDuration);
         subPanelDurations.put(tag, defaultDuration);
         chartPanel.enableDynamicCrosshairs();
 
--- a/vm-numa/client-swing/src/main/java/com/redhat/thermostat/vm/numa/client/swing/internal/VmNumaPanel.java	Fri May 20 09:38:17 2016 -0400
+++ b/vm-numa/client-swing/src/main/java/com/redhat/thermostat/vm/numa/client/swing/internal/VmNumaPanel.java	Fri May 20 09:38:54 2016 -0400
@@ -61,7 +61,7 @@
 
 import com.redhat.thermostat.client.swing.SwingComponent;
 import com.redhat.thermostat.client.swing.components.HeaderPanel;
-import com.redhat.thermostat.client.swing.components.experimental.SingleValueChartPanel;
+import com.redhat.thermostat.client.swing.components.experimental.ThermostatChartPanel;
 import com.redhat.thermostat.client.swing.experimental.ComponentVisibilityNotifier;
 import com.redhat.thermostat.common.ActionListener;
 import com.redhat.thermostat.common.ActionNotifier;
@@ -86,7 +86,7 @@
 
     private final Map<String, TimeSeriesCollection> datasets = new HashMap<>();
 
-    private SingleValueChartPanel chartPanel;
+    private ThermostatChartPanel chartPanel;
 
     public VmNumaPanel() {
         super();
@@ -105,9 +105,9 @@
 
     private JPanel initializeChartsPanel() {
         duration = new Duration(DEFAULT_VALUE, DEFAULT_UNIT);
-        chartPanel = new SingleValueChartPanel(duration);
+        chartPanel = new ThermostatChartPanel(duration);
 
-        chartPanel.addPropertyChangeListener(SingleValueChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
+        chartPanel.addPropertyChangeListener(ThermostatChartPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
             @Override
             public void propertyChange(PropertyChangeEvent evt) {
                 duration = (Duration) evt.getNewValue();