Author: mgrigorov
Date: Sun Sep 19 15:21:04 2010
New Revision: 998680
URL: http://svn.apache.org/viewvc?rev=998680&view=rev
Log:
WICKET-3057 NPE when deleting a TreeNode with visible children
Modified:
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
Modified:
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
URL:
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java?rev=998680&r1=998679&r2=998680&view=diff
==============================================================================
---
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
(original)
+++
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
Sun Sep 19 15:21:04 2010
@@ -20,7 +20,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -198,46 +197,76 @@ public class DefaultTreeState implements
listeners.remove(l);
}
- public void selectNode(Object node, boolean selected)
+ /**
+ * If <code>node</code> is currently selected, it will be deselected
and the
+ * <code>nodeUnselected</code> method will be called on all registered
+ * <code>ITreeStateListeners</code>.
+ *
+ * @param node
+ * the node to be deselected
+ */
+ private void deselectNode(Object node)
{
- if (isAllowSelectMultiple() == false && selectedNodes.size() >
0)
+ if (selectedNodes.remove(node))
{
- for (Iterator<Object> i = selectedNodes.iterator();
i.hasNext();)
+ for (ITreeStateListener listener :
listeners.toArray(new ITreeStateListener[listeners.size()]))
{
- Object current = i.next();
- if (current.equals(node) == false)
+ listener.nodeUnselected(node);
+ }
+ }
+ }
+
+ /**
+ * Selects <code>node</code> and calls the <code>nodeSelected</code>
method on all registered
+ * <code>ITreeStateListeners</code>. If
<code>isAllowSelectMultiple</code> is <code>false</code>
+ * , any currently selected nodes are deselected.
+ *
+ * @param node
+ * the node to be selected
+ */
+ private void selectNode(Object node)
+ {
+ // if multiple selections are not allowed, deselect current
selections
+ if (selectedNodes.size() > 0 && !isAllowSelectMultiple())
+ {
+ for (Object currentlySelectedNode :
selectedNodes.toArray())
+ {
+ if (!currentlySelectedNode.equals(node))
{
- i.remove();
- Object[] listenersCopy =
listeners.toArray();
- for (int j = 0; j <
listenersCopy.length; j++)
- {
- ITreeStateListener l =
(ITreeStateListener)listenersCopy[j];
- l.nodeUnselected(current);
- }
+ deselectNode(currentlySelectedNode);
}
}
}
- if (selected == true && selectedNodes.contains(node) == false)
+ if (!selectedNodes.contains(node))
{
-
selectedNodes.add(node);
- Object[] listenersCopy = listeners.toArray();
- for (int i = 0; i < listenersCopy.length; i++)
+ for (ITreeStateListener listener :
listeners.toArray(new ITreeStateListener[listeners.size()]))
{
- ITreeStateListener l =
(ITreeStateListener)listenersCopy[i];
- l.nodeSelected(node);
+ listener.nodeSelected(node);
}
}
- else if (selected == false && selectedNodes.contains(node) ==
true)
+ }
+
+ /**
+ * Selects or deselects <code>node</code> and calls the corresponding
method on all registered
+ * <code>ITreeStateListeners</code>. If
<code>isAllowSelectMultiple</code> is <code>false</code>
+ * , any currently selected nodes are deselected.
+ *
+ * @param node
+ * the node to be selected
+ * @param selected
+ * true if node is to be selected, false if node is to be
deselected
+ */
+ public void selectNode(Object node, boolean selected)
+ {
+ if (selected)
{
- selectedNodes.remove(node);
- Object[] listenersCopy = listeners.toArray();
- for (int i = 0; i < listenersCopy.length; i++)
- {
- ITreeStateListener l =
(ITreeStateListener)listenersCopy[i];
- l.nodeUnselected(node);
- }
+ selectNode(node);
+ }
+ else
+ {
+ deselectNode(node);
}
}