Fixing a bug in CellBrowser where losing an open node causes an exception the next time the CellBrowser is clicked. The code that nullifies the focusedKey in a node should be in the loop the trimes the tree down to size.
Review at http://gwt-code-reviews.appspot.com/1012801
Review by: pdr@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9080 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
index 7ab531e..8dcd61d 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
@@ -968,7 +968,7 @@
/**
* Set the open state of a tree node.
- *
+ *
* @param cellList the CellList that changed state.
* @param value the value to open
* @param open true to open, false to close
@@ -1029,12 +1029,9 @@
}
// Close the node.
- TreeNode closedNode = cellList.isFocusedOpen
+ TreeNode closedNode = (cellList.isFocusedOpen && (treeNodes.size() > cellList.level + 1))
? treeNodes.get(cellList.level + 1) : null;
trimToLevel(cellList.level);
- cellList.focusedKey = null;
- cellList.focusedValue = null;
- cellList.isFocusedOpen = false;
// Refresh the display to update the styles for this node.
if (redraw) {
@@ -1065,5 +1062,13 @@
removed.destroy();
curLevel--;
}
+
+ // Nullify the focused key at the level.
+ if (level < treeNodes.size()) {
+ TreeNodeImpl<?> node = treeNodes.get(level);
+ node.display.focusedKey = null;
+ node.display.focusedValue = null;
+ node.display.isFocusedOpen = false;
+ }
}
}
diff --git a/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java b/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java
index 1f57b59..18bc2cc 100644
--- a/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java
+++ b/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java
@@ -387,6 +387,9 @@
// Verify the node is destroyed.
assertTrue(b.isDestroyed());
+
+ // True to open a new node.
+ assertNotNull(root.setChildOpen(0, true));
}
/**