changeset 1973:4e64d7dccbcc

Unify processAndDrawTreeMap and redrawTreeMap PR3059 Reviewed-by: jkang Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2016-June/019844.html Original-thread: http://icedtea.classpath.org/pipermail/thermostat/2015-September/016378.html
author James Aziz <jaziz@redhat.com>
date Wed, 29 Jun 2016 12:22:58 -0400
parents 4bd90c506cf2
children 77eefdc8a901
files client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/TreeMapComponent.java client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/TreeMapComponentTest.java vm-heap-analysis/client-swing/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/swing/internal/SwingHeapTreeMapView.java
diffstat 3 files changed, 62 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/TreeMapComponent.java	Wed Jun 29 12:22:58 2016 -0400
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/TreeMapComponent.java	Wed Jun 29 12:22:58 2016 -0400
@@ -200,23 +200,10 @@
 
         if (tree != null) {
             this.zoomStack.push(this.tree);
-            processAndDrawTreeMap();
+            processAndDrawTreeMap(this.tree);
         }
-    }
-
-    public void processAndDrawTreeMap() {
-        Objects.requireNonNull(this.dimension);
-        Objects.requireNonNull(this.tree);
-        // assign a rectangle to the tree's root in order to process the tree.
-        Rectangle2D.Double area = new Rectangle2D.Double(0, 0, this.dimension.width, this.dimension.height);
-
-        // calculate rectangles of tree's subtrees
-        TreeProcessor.processTreeMap(tree, area);
-
-        drawTreeMap(tree);
 
         addResizeListener(this);
-        repaint();
     }
 
     /**
@@ -362,7 +349,7 @@
                     Dimension newDim = container.getSize();
 
                     if (isChangedSize(newDim)) {
-                        redrawTreeMap(Objects.requireNonNull(tree));
+                        processAndDrawTreeMap(Objects.requireNonNull(tree));
                     }
                 } 
             }            
@@ -403,15 +390,8 @@
         return null;
     }
 
-
-    /**
-     * This method recalculates and redraws the TreeMap in according to the size
-     * of this component and the actual {@link TreeMapNode} object.
-     *
-     * Package-private for testing only.
-     */
-    void redrawTreeMap(TreeMapNode newRoot) {
-        tree = Objects.requireNonNull(newRoot);
+    public void processAndDrawTreeMap(TreeMapNode root) {
+        tree = Objects.requireNonNull(root);
         Rectangle2D.Double newArea = tree.getRectangle();
         // give to the root node the size of this object so it can be recalculated
         newArea.width = getSize().width;
@@ -421,7 +401,7 @@
         TreeProcessor.processTreeMap(tree, newArea);
 
         removeAll();
-        drawTreeMap(tree);        
+        drawTreeMap(tree);
     }
 
     boolean isZoomInEnabled(TreeMapNode node) {
@@ -433,7 +413,7 @@
     public void zoomIn(TreeMapNode node) {
         if (isZoomInEnabled(node)) {
             fillZoomStack(node.getAncestors());
-            redrawTreeMap(node);
+            processAndDrawTreeMap(node);
             notifyZoomInToObservers(zoomStack.peek());
         } 
     }
@@ -449,7 +429,7 @@
         // if the actual root element is not the tree's original root
         if (zoomStack.size() > 1) {
             zoomStack.pop();
-            redrawTreeMap(zoomStack.peek());
+            processAndDrawTreeMap(zoomStack.peek());
             notifyZoomOutToObservers();
         }
     }
@@ -460,7 +440,7 @@
     public void zoomFull() {
         if (zoomStack.size() > 1) {
             clearZoomCallsStack();
-            redrawTreeMap(zoomStack.peek());
+            processAndDrawTreeMap(zoomStack.peek());
             notifyZoomFullToObservers();
         }
     }
--- a/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/TreeMapComponentTest.java	Wed Jun 29 12:22:58 2016 -0400
+++ b/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/TreeMapComponentTest.java	Wed Jun 29 12:22:58 2016 -0400
@@ -43,9 +43,13 @@
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.lang.reflect.InvocationTargetException;
 
+import javax.swing.JButton;
 import javax.swing.JFrame;
+import javax.swing.JPanel;
 import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
 
@@ -129,32 +133,6 @@
     }
 
     @Test
-    public final void testProcessAndDrawTreeMap() throws InvocationTargetException, InterruptedException {
-        SwingUtilities.invokeAndWait(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    treeMap = new TreeMapComponent();
-                    treeMap.setModel(tree);
-                    treeMap.setToolTipRenderer(new TreeMapComponent.WeightAsSizeRenderer());
-                    treeMap.processAndDrawTreeMap();
-                } catch (NullPointerException e) {
-                    Assert.fail("Didn't expect exception.");
-                }
-
-                boolean caught = false;
-                try {
-                    treeMap = new TreeMapComponent();
-                    treeMap.processAndDrawTreeMap();
-                } catch (NullPointerException e) {
-                    caught = true;
-                }
-                assertTrue(caught);
-            }
-        });
-    }
-
-    @Test
     public final void testGetRoot() throws InvocationTargetException, InterruptedException {
         SwingUtilities.invokeAndWait(new Runnable() {
 
@@ -187,14 +165,15 @@
     }
 
     @Test
-    public final void testRedrawTreeMap() throws InvocationTargetException, InterruptedException {
+    public final void testProcessAndDrawTreeMap() throws InvocationTargetException,
+            InterruptedException {
         SwingUtilities.invokeAndWait(new Runnable() {
             @Override
             public void run() {
                 try {
                     treeMap = new TreeMapComponent(dim);
                     treeMap.setToolTipRenderer(new TreeMapComponent.WeightAsSizeRenderer());
-                    treeMap.redrawTreeMap(node1);
+                    treeMap.processAndDrawTreeMap(node1);
                 } catch (NullPointerException e) {
                     Assert.fail("Didn't expect exception.");
                 }
@@ -203,7 +182,7 @@
                 try {
                     treeMap = new TreeMapComponent(dim);
                     treeMap.setToolTipRenderer(new TreeMapComponent.WeightAsSizeRenderer());
-                    treeMap.redrawTreeMap(null);
+                    treeMap.processAndDrawTreeMap(null);
                 } catch (NullPointerException e) {
                     caught = true;
                 }
@@ -438,20 +417,57 @@
                 JFrame mainWindow = new JFrame();
                 mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
-                TreeMapNode node = new TreeMapNode("test1", 1.0);
+                final TreeMapNode modelA = new TreeMapNode("A", 1.0);
+                modelA.addChild(new TreeMapNode("AA", 2.0));
+                modelA.addChild(new TreeMapNode("AB", 3.0));
+
+                final TreeMapNode modelB = new TreeMapNode("B", 5.0);
+                modelB.addChild(new TreeMapNode("BA", 10.0));
+                modelB.addChild(new TreeMapNode("BB", 10.0));
 
                 // FIXME this hack should not be needed
                 UIManager.put("thermostat-default-font", Font.decode(Font.MONOSPACED));
 
-                TreeMapComponent treeMap = new TreeMapComponent();
+                final TreeMapComponent treeMap = new TreeMapComponent();
                 // FIXME the default renderer should not be null
                 treeMap.setToolTipRenderer(new TreeMapComponent.WeightAsSizeRenderer());
-                treeMap.setModel(node);
+                treeMap.setModel(modelA);
 
                 // FIXME no other swing component needs the following:
-                treeMap.processAndDrawTreeMap();
+                treeMap.processAndDrawTreeMap(modelA);
+
+                JPanel container = new JPanel(new BorderLayout());
+
+                JPanel buttonPanel = new JPanel();
+                JButton changeModelButton = new JButton("Change model");
+                changeModelButton.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        TreeMapNode newModel = treeMap.getTreeMapRoot() == modelA ? modelB : modelA;
+                        treeMap.setModel(newModel);
+                        treeMap.processAndDrawTreeMap(newModel);
+                    }
+                });
+                buttonPanel.add(changeModelButton);
 
-                mainWindow.add(treeMap, BorderLayout.CENTER);
+                //FIXME The following button does not actually work, adding new nodes is broken
+                JButton addNewNodeButton = new JButton("Add new node");
+                addNewNodeButton.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        TreeMapNode currentModel = treeMap.getTreeMapRoot();
+                        currentModel.addChild(new TreeMapNode("new", 10.0));
+
+                        treeMap.setModel(currentModel);
+                        treeMap.processAndDrawTreeMap(currentModel);
+                    }
+                });
+                buttonPanel.add(addNewNodeButton);
+
+                container.add(buttonPanel, BorderLayout.PAGE_START);
+                container.add(treeMap, BorderLayout.CENTER);
+
+                mainWindow.add(container, BorderLayout.CENTER);
 
                 mainWindow.setSize(400, 200);
                 mainWindow.setVisible(true);
--- a/vm-heap-analysis/client-swing/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/swing/internal/SwingHeapTreeMapView.java	Wed Jun 29 12:22:58 2016 -0400
+++ b/vm-heap-analysis/client-swing/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/swing/internal/SwingHeapTreeMapView.java	Wed Jun 29 12:22:58 2016 -0400
@@ -43,6 +43,7 @@
 
 import com.redhat.thermostat.client.swing.SwingComponent;
 import com.redhat.thermostat.client.swing.components.experimental.TreeMapComponent;
+import com.redhat.thermostat.client.swing.components.experimental.TreeMapNode;
 import com.redhat.thermostat.client.swing.components.experimental.TreeMapToolbar;
 import com.redhat.thermostat.vm.heap.analysis.client.core.HeapTreeMapView;
 import com.redhat.thermostat.vm.heap.analysis.common.ObjectHistogram;
@@ -62,8 +63,9 @@
 
     @Override
     public void display(ObjectHistogram histogram) {
-        treeMap.setModel(HistogramConverter.convertToTreeMap(histogram));
-        treeMap.processAndDrawTreeMap();
+        TreeMapNode model = HistogramConverter.convertToTreeMap(histogram);
+        treeMap.setModel(model);
+        treeMap.processAndDrawTreeMap(model);
         panel.add(treeMap, BorderLayout.CENTER);
         panel.add(new TreeMapToolbar(treeMap), BorderLayout.NORTH);
     }