changeset 530:261373495057

Show the actual GC duration if user clicks on chart Show the GC duration for the gc cycle closest to the point where the user clicked on the chart. Reviewed-by: neugens Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-August/002646.html PR960
author Omair Majid <omajid@redhat.com>
date Fri, 10 Aug 2012 19:12:50 -0400
parents 2e73d3ad800e
children 1afd8713fc6f
files client/core/src/main/java/com/redhat/thermostat/client/ui/RecentTimeSeriesChartPanel.java client/core/src/main/java/com/redhat/thermostat/client/ui/VmGcPanel.java distribution/config/osgi-export.properties
diffstat 3 files changed, 91 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/client/core/src/main/java/com/redhat/thermostat/client/ui/RecentTimeSeriesChartPanel.java	Wed Aug 08 15:32:23 2012 -0400
+++ b/client/core/src/main/java/com/redhat/thermostat/client/ui/RecentTimeSeriesChartPanel.java	Fri Aug 10 19:12:50 2012 -0400
@@ -38,18 +38,23 @@
 
 import java.awt.BorderLayout;
 import java.awt.Component;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.concurrent.TimeUnit;
 
+import javax.swing.DefaultComboBoxModel;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
+import javax.swing.text.JTextComponent;
 
 import org.jfree.chart.ChartPanel;
 
@@ -63,12 +68,15 @@
 
     private final RecentTimeSeriesChartController controller;
 
+    private JPanel labelContainer;
+    private JTextComponent label;
+
     public RecentTimeSeriesChartPanel(RecentTimeSeriesChartController controller) {
         this.controller = controller;
 
         this.setLayout(new BorderLayout());
 
-        ChartPanel cp = controller.getChartPanel();
+        final ChartPanel cp = controller.getChartPanel();
 
         cp.setDisplayToolTips(false);
         cp.setDoubleBuffered(true);
@@ -86,15 +94,28 @@
         cp.setMinimumDrawWidth(MINIMUM_DRAW_SIZE);
         cp.setMaximumDrawWidth(Integer.MAX_VALUE);
 
-        add(cp);
-        add(getChartControls(), BorderLayout.SOUTH);
+        add(getControlsAndAdditionalDisplay(), BorderLayout.SOUTH);
+
+        add(cp, BorderLayout.CENTER);
+    }
+
+    private Component getControlsAndAdditionalDisplay() {
+        JPanel container = new JPanel();
+
+        container.setLayout(new BorderLayout());
+
+        container.add(getChartControls(), BorderLayout.LINE_START);
+        container.add(getAdditionalDataDisplay(), BorderLayout.LINE_END);
+
+        return container;
     }
 
     private Component getChartControls() {
         JPanel container = new JPanel();
 
         final JTextField durationSelector = new JTextField(5);
-        final JComboBox<TimeUnit> unitSelector = new JComboBox<>(controller.getTimeUnits());
+        final JComboBox<TimeUnit> unitSelector = new JComboBox<>();
+        unitSelector.setModel(new DefaultComboBoxModel<>(controller.getTimeUnits()));
 
         int defaultValue = controller.getTimeValue();
         TimeUnit defaultUnit = controller.getTimeUnit();
@@ -114,6 +135,30 @@
         return container;
     }
 
+    private Component getAdditionalDataDisplay() {
+        JPanel panel = new JPanel(new GridBagLayout());
+        labelContainer = new JPanel();
+        GridBagConstraints constraints = new GridBagConstraints();
+        constraints.fill = GridBagConstraints.BOTH;
+        constraints.anchor = GridBagConstraints.CENTER;
+        panel.add(labelContainer, constraints);
+        return panel;
+    }
+
+    public void setDataInformationLabel(final String text) {
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                if (label == null) {
+                    label = new ValueField(text);
+                    labelContainer.add(label);
+                }
+
+                label.setText(text);
+            }
+        });
+    }
+
     private static class TimeUnitChangeListener implements DocumentListener, ActionListener {
 
         private final RecentTimeSeriesChartController controller;
--- a/client/core/src/main/java/com/redhat/thermostat/client/ui/VmGcPanel.java	Wed Aug 08 15:32:23 2012 -0400
+++ b/client/core/src/main/java/com/redhat/thermostat/client/ui/VmGcPanel.java	Fri Aug 10 19:12:50 2012 -0400
@@ -54,7 +54,10 @@
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.axis.DateAxis;
 import org.jfree.chart.axis.NumberAxis;
+import org.jfree.chart.event.ChartProgressEvent;
+import org.jfree.chart.event.ChartProgressListener;
 import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.chart.plot.XYPlot;
 import org.jfree.chart.renderer.xy.StandardXYBarPainter;
 import org.jfree.chart.renderer.xy.XYBarRenderer;
 import org.jfree.data.RangeType;
@@ -66,7 +69,7 @@
 import com.redhat.thermostat.common.model.IntervalTimeData;
 
 public class VmGcPanel extends VmGcView implements SwingComponent {
-    
+
     private JPanel visiblePanel;
 
     private final Map<String, SampledDataset> dataset = new HashMap<>();
@@ -118,7 +121,7 @@
         visiblePanel.setLayout(new GridBagLayout());
     }
 
-    private JPanel createCollectorDetailsPanel(IntervalXYDataset timeSeriesCollection, String title, String units) {
+    private JPanel createCollectorDetailsPanel(IntervalXYDataset collectorData, String title, String units) {
         JPanel detailsPanel = new JPanel();
         detailsPanel.setBorder(Components.smallBorder());
         detailsPanel.setLayout(new BorderLayout());
@@ -129,27 +132,56 @@
             null,
             localize(LocaleResources.VM_GC_COLLECTOR_CHART_REAL_TIME_LABEL),
             localize(LocaleResources.VM_GC_COLLECTOR_CHART_GC_TIME_LABEL, units),
-            timeSeriesCollection,
+            collectorData,
             PlotOrientation.VERTICAL,
             false,
             false,
             false);
 
         ((XYBarRenderer)(chart.getXYPlot().getRenderer())).setBarPainter(new StandardXYBarPainter());
-        chart.getXYPlot().setDomainAxis(new DateAxis());
-        JPanel chartPanel = new RecentTimeSeriesChartPanel(new RecentTimeSeriesChartController(chart));
+
+        setupPlotAxes(chart.getXYPlot());
+
+        chart.getXYPlot().setDomainCrosshairLockedOnData(true);
+        chart.getXYPlot().setDomainCrosshairVisible(true);
+
+        final RecentTimeSeriesChartPanel chartPanel = new RecentTimeSeriesChartPanel(new RecentTimeSeriesChartController(chart));
+
+        chart.addProgressListener(new ChartProgressListener() {
 
-        NumberAxis axis = (NumberAxis) chart.getXYPlot().getRangeAxis();
+            @Override
+            public void chartProgress(ChartProgressEvent event) {
+                if (event.getType() != ChartProgressEvent.DRAWING_FINISHED) {
+                    return;
+                }
 
-        axis.setRangeType(RangeType.POSITIVE);
-        axis.setAutoRange(true);
-        axis.setAutoRangeMinimumSize(1);
+                double rangeCrossHairValue = event.getChart().getXYPlot().getRangeCrosshairValue();
+                chartPanel.setDataInformationLabel(String.valueOf(rangeCrossHairValue));
+            }
+        });
 
         detailsPanel.add(chartPanel, BorderLayout.CENTER);
 
         return detailsPanel;
     }
 
+    private void setupPlotAxes(XYPlot plot) {
+        setupDomainAxis(plot);
+        setupRangeAxis(plot);
+    }
+
+    private void setupDomainAxis(XYPlot plot) {
+        plot.setDomainAxis(new DateAxis());
+    }
+
+    private void setupRangeAxis(XYPlot plot) {
+        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
+
+        rangeAxis.setRangeType(RangeType.POSITIVE);
+        rangeAxis.setAutoRange(true);
+        rangeAxis.setAutoRangeMinimumSize(1);
+    }
+
     @Override
     public void addChart(final String tag, final String title, final String units) {
         SwingUtilities.invokeLater(new Runnable() {
--- a/distribution/config/osgi-export.properties	Wed Aug 08 15:32:23 2012 -0400
+++ b/distribution/config/osgi-export.properties	Fri Aug 10 19:12:50 2012 -0400
@@ -40,6 +40,7 @@
 org.bson.types
 org.jfree.chart
 org.jfree.chart.axis
+org.jfree.chart.event
 org.jfree.chart.labels
 org.jfree.chart.plot
 org.jfree.chart.renderer.xy