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
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.
*/
public interface ExpandListener extends Serializable {
+ public static final Method EXPAND_METHOD = ReflectTools.findMethod(
+ ExpandListener.class, "nodeExpand", ExpandEvent.class);
+
/**
* A node has been expanded.
*
* the Listener to be added.
*/
public void addListener(ExpandListener listener) {
- addListener(ExpandEvent.class, listener, EXPAND_METHOD);
+ addListener(ExpandEvent.class, listener, ExpandListener.EXPAND_METHOD);
}
/**
* the Listener to be removed.
*/
public void removeListener(ExpandListener listener) {
- removeListener(ExpandEvent.class, listener, EXPAND_METHOD);
+ removeListener(ExpandEvent.class, listener,
+ ExpandListener.EXPAND_METHOD);
}
/**
*/
public interface CollapseListener extends Serializable {
+ public static final Method COLLAPSE_METHOD = ReflectTools.findMethod(
+ CollapseListener.class, "nodeCollapse", CollapseEvent.class);
+
/**
* A node has been collapsed.
*
* the Listener to be added.
*/
public void addListener(CollapseListener listener) {
- addListener(CollapseEvent.class, listener, COLLAPSE_METHOD);
+ addListener(CollapseEvent.class, listener,
+ CollapseListener.COLLAPSE_METHOD);
}
/**
* the Listener to be removed.
*/
public void removeListener(CollapseListener listener) {
- removeListener(CollapseEvent.class, listener, COLLAPSE_METHOD);
+ removeListener(CollapseEvent.class, listener,
+ CollapseListener.COLLAPSE_METHOD);
}
/**
--- /dev/null
+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