]> source.dussan.org Git - vaadin-framework.git/commitdiff
Moved Expand/Collapse method references to listener class and added Tree listener...
authorArtur Signell <artur.signell@itmill.com>
Fri, 19 Feb 2010 12:18:01 +0000 (12:18 +0000)
committerArtur Signell <artur.signell@itmill.com>
Fri, 19 Feb 2010 12:18:01 +0000 (12:18 +0000)
svn changeset:11401/svn branch:6.3

src/com/vaadin/ui/Tree.java
tests/src/com/vaadin/tests/server/component/tree/TestListeners.java [new file with mode: 0644]

index 28a410fa137f851ff715f53339def3161c09c461..7b1dad391122cbc1e3a9d20106340e19cb255575 100644 (file)
@@ -32,6 +32,7 @@ import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.ui.VTree;
+import com.vaadin.tools.ReflectTools;
 
 /**
  * Tree component. A Tree can be used to select an item (or multiple items) from
@@ -47,29 +48,12 @@ import com.vaadin.terminal.gwt.client.ui.VTree;
 public class Tree extends AbstractSelect implements Container.Hierarchical,
         Action.Container, ItemClickSource {
 
-    private static final Method EXPAND_METHOD;
-
-    private static final Method COLLAPSE_METHOD;
-
-    static {
-        try {
-            EXPAND_METHOD = ExpandListener.class.getDeclaredMethod(
-                    "nodeExpand", new Class[] { ExpandEvent.class });
-            COLLAPSE_METHOD = CollapseListener.class.getDeclaredMethod(
-                    "nodeCollapse", new Class[] { CollapseEvent.class });
-        } catch (final java.lang.NoSuchMethodException e) {
-            // This should never happen
-            throw new java.lang.RuntimeException(
-                    "Internal error finding methods in Tree");
-        }
-    }
-
     /* Private members */
 
     /**
      * Set of expanded nodes.
      */
-    private final HashSet expanded = new HashSet();
+    private final HashSet<Object> expanded = new HashSet<Object>();
 
     /**
      * List of action handlers.
@@ -743,6 +727,9 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
      */
     public interface ExpandListener extends Serializable {
 
+        public static final Method EXPAND_METHOD = ReflectTools.findMethod(
+                ExpandListener.class, "nodeExpand", ExpandEvent.class);
+
         /**
          * A node has been expanded.
          * 
@@ -759,7 +746,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
      *            the Listener to be added.
      */
     public void addListener(ExpandListener listener) {
-        addListener(ExpandEvent.class, listener, EXPAND_METHOD);
+        addListener(ExpandEvent.class, listener, ExpandListener.EXPAND_METHOD);
     }
 
     /**
@@ -769,7 +756,8 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
      *            the Listener to be removed.
      */
     public void removeListener(ExpandListener listener) {
-        removeListener(ExpandEvent.class, listener, EXPAND_METHOD);
+        removeListener(ExpandEvent.class, listener,
+                ExpandListener.EXPAND_METHOD);
     }
 
     /**
@@ -828,6 +816,9 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
      */
     public interface CollapseListener extends Serializable {
 
+        public static final Method COLLAPSE_METHOD = ReflectTools.findMethod(
+                CollapseListener.class, "nodeCollapse", CollapseEvent.class);
+
         /**
          * A node has been collapsed.
          * 
@@ -844,7 +835,8 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
      *            the Listener to be added.
      */
     public void addListener(CollapseListener listener) {
-        addListener(CollapseEvent.class, listener, COLLAPSE_METHOD);
+        addListener(CollapseEvent.class, listener,
+                CollapseListener.COLLAPSE_METHOD);
     }
 
     /**
@@ -854,7 +846,8 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
      *            the Listener to be removed.
      */
     public void removeListener(CollapseListener listener) {
-        removeListener(CollapseEvent.class, listener, COLLAPSE_METHOD);
+        removeListener(CollapseEvent.class, listener,
+                CollapseListener.COLLAPSE_METHOD);
     }
 
     /**
diff --git a/tests/src/com/vaadin/tests/server/component/tree/TestListeners.java b/tests/src/com/vaadin/tests/server/component/tree/TestListeners.java
new file mode 100644 (file)
index 0000000..06d0b65
--- /dev/null
@@ -0,0 +1,137 @@
+package com.vaadin.tests.server.component.tree;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import junit.framework.TestCase;\r
+\r
+import com.vaadin.ui.Tree;\r
+import com.vaadin.ui.Tree.CollapseEvent;\r
+import com.vaadin.ui.Tree.CollapseListener;\r
+import com.vaadin.ui.Tree.ExpandEvent;\r
+import com.vaadin.ui.Tree.ExpandListener;\r
+\r
+public class TestListeners extends TestCase implements ExpandListener,\r
+        CollapseListener {\r
+    private int expandCalled;\r
+    private int collapseCalled;\r
+    private Object lastExpanded;\r
+    private Object lastCollapsed;\r
+\r
+    @Override\r
+    protected void setUp() {\r
+        expandCalled = 0;\r
+    }\r
+\r
+    public void testExpandListener() {\r
+        Tree tree = createTree(10, 20, false);\r
+        tree.addListener((ExpandListener) this);\r
+        List<String> rootIds = new ArrayList<String>(tree.rootItemIds());\r
+\r
+        assertEquals(10, rootIds.size());\r
+        assertEquals(10 + 10 * 20 + 10, tree.size());\r
+\r
+        // Expanding should send one expand event for the root item id\r
+        tree.expandItem(rootIds.get(0));\r
+        assertEquals(1, expandCalled);\r
+        assertEquals(rootIds.get(0), lastExpanded);\r
+\r
+        // Expand should send one event for each expanded item id.\r
+        // In this case root + child 4\r
+        expandCalled = 0;\r
+        tree.expandItemsRecursively(rootIds.get(1));\r
+        assertEquals(2, expandCalled);\r
+        List<Object> c = new ArrayList<Object>(tree.getChildren(rootIds.get(1)));\r
+\r
+        assertEquals(c.get(4), lastExpanded);\r
+\r
+        // Expanding an already expanded item should send no expand event\r
+        expandCalled = 0;\r
+        tree.expandItem(rootIds.get(0));\r
+        assertEquals(0, expandCalled);\r
+    }\r
+\r
+    /**\r
+     * Creates a tree with "rootItems" roots, each with "children" children,\r
+     * each with 1 child.\r
+     * \r
+     * @param rootItems\r
+     * @param children\r
+     * @param expand\r
+     * @return\r
+     */\r
+    private Tree createTree(int rootItems, int children, boolean expand) {\r
+        Tree tree = new Tree();\r
+        for (int i = 0; i < rootItems; i++) {\r
+            String rootId = "root " + i;\r
+            tree.addItem(rootId);\r
+            if (expand) {\r
+                tree.expandItemsRecursively(rootId);\r
+            } else {\r
+                tree.collapseItemsRecursively(rootId);\r
+\r
+            }\r
+            for (int j = 0; j < children; j++) {\r
+                String childId = "child " + i + "/" + j;\r
+                tree.addItem(childId);\r
+                tree.setParent(childId, rootId);\r
+                tree.setChildrenAllowed(childId, false);\r
+                if (j == 4) {\r
+                    tree.setChildrenAllowed(childId, true);\r
+                    Object grandChildId = tree.addItem();\r
+                    tree.setParent(grandChildId, childId);\r
+                    tree.setChildrenAllowed(grandChildId, false);\r
+                    if (expand) {\r
+                        tree.expandItemsRecursively(childId);\r
+                    } else {\r
+                        tree.collapseItemsRecursively(childId);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        return tree;\r
+    }\r
+\r
+    public void testCollapseListener() {\r
+        Tree tree = createTree(7, 15, true);\r
+        tree.addListener((CollapseListener) this);\r
+\r
+        List<String> rootIds = new ArrayList<String>(tree.rootItemIds());\r
+\r
+        assertEquals(7, rootIds.size());\r
+        assertEquals(7 + 7 * 15 + 7, tree.size());\r
+\r
+        // Expanding should send one expand event for the root item id\r
+        tree.collapseItem(rootIds.get(0));\r
+        assertEquals(1, collapseCalled);\r
+        assertEquals(rootIds.get(0), lastCollapsed);\r
+\r
+        // Collapse sends one event for each collapsed node.\r
+        // In this case root + child 4\r
+        collapseCalled = 0;\r
+        tree.collapseItemsRecursively(rootIds.get(1));\r
+        assertEquals(2, collapseCalled);\r
+        List<Object> c = new ArrayList<Object>(tree.getChildren(rootIds.get(1)));\r
+        assertEquals(c.get(4), lastCollapsed);\r
+\r
+        // Collapsing an already expanded item should send no expand event\r
+        collapseCalled = 0;\r
+        tree.collapseItem(rootIds.get(0));\r
+        assertEquals(0, collapseCalled);\r
+    }\r
+\r
+    @Override\r
+    public void nodeExpand(ExpandEvent event) {\r
+        lastExpanded = event.getItemId();\r
+        expandCalled++;\r
+\r
+    }\r
+\r
+    @Override\r
+    public void nodeCollapse(CollapseEvent event) {\r
+        lastCollapsed = event.getItemId();\r
+        collapseCalled++;\r
+\r
+    }\r
+}\r