Mercurial > hg > release > thermostat-2.0
changeset 2304:846831e69547
Rename SingleValueChartPanel to ThermostatChartPanel
Reviewed-by: jerboaa
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2016-May/018887.html
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();