Author: knopp
Date: Sun Apr 20 13:06:50 2008
New Revision: 649964

URL: http://svn.apache.org/viewvc?rev=649964&view=rev
Log:
WICKET-1555

Added:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java
   (with props)
Modified:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java
 Sun Apr 20 13:06:50 2008
@@ -18,7 +18,6 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -109,7 +108,7 @@
                 * @param level
                 *            current level
                 */
-               public TreeItem(String id, final TreeNode node, int level)
+               public TreeItem(String id, final Object node, int level)
                {
                        super(id, new Model((Serializable)node));
 
@@ -143,6 +142,7 @@
                /**
                 * @see org.apache.wicket.Component#getMarkupId()
                 */
+               @Override
                public String getMarkupId()
                {
                        // this is overridden to produce id that begins with id 
of tree
@@ -156,7 +156,7 @@
                 */
                public TreeItem getParentItem()
                {
-                       return 
(TreeItem)nodeToItemMap.get(getParentNode((TreeNode)getModelObject()));
+                       return 
(TreeItem)nodeToItemMap.get(getParentNode(getModelObject()));
                }
 
                /**
@@ -183,6 +183,7 @@
                /**
                 * @see 
org.apache.wicket.MarkupContainer#onRender(org.apache.wicket.markup.MarkupStream)
                 */
+               @Override
                protected void onRender(final MarkupStream markupStream)
                {
                        // is this root and tree is in rootless mode?
@@ -229,6 +230,7 @@
                        }
                }
 
+               @Override
                public void renderHead(final HtmlHeaderContainer container)
                {
                        super.renderHead(container);
@@ -266,6 +268,7 @@
                        setFlag(FLAG_RENDER_CHILDREN, value);
                }
 
+               @Override
                protected void onDetach()
                {
                        super.onDetach();
@@ -291,6 +294,7 @@
                        setRenderChildren(false);
                }
 
+               @Override
                protected void onBeforeRender()
                {
                        onBeforeRenderInternal();
@@ -309,6 +313,7 @@
                        }
                }
 
+               @Override
                protected void onAfterRender()
                {
                        super.onAfterRender();
@@ -348,6 +353,7 @@
                /**
                 * @see 
org.apache.wicket.MarkupContainer#remove(org.apache.wicket.Component)
                 */
+               @Override
                public void remove(Component component)
                {
                        // when a treeItem is removed, remove reference to it 
from
@@ -364,6 +370,7 @@
                 * 
                 * @param markupStream
                 */
+               @Override
                protected void onRender(final MarkupStream markupStream)
                {
                        // Save position in markup stream
@@ -406,36 +413,6 @@
                }
        }
 
-       /**
-        * Returns an iterator that iterates trough the enumeration.
-        * 
-        * @param enumeration
-        *            The enumeration to iterate through
-        * @return The iterator
-        */
-       private static final Iterator toIterator(final Enumeration enumeration)
-       {
-               return new Iterator()
-               {
-                       private final Enumeration e = enumeration;
-
-                       public boolean hasNext()
-                       {
-                               return e.hasMoreElements();
-                       }
-
-                       public Object next()
-                       {
-                               return e.nextElement();
-                       }
-
-                       public void remove()
-                       {
-                               throw new UnsupportedOperationException("Remove 
is not supported on enumeration.");
-                       }
-               };
-       }
-
        private boolean attached = false;
 
        /** comma separated list of ids of elements to be deleted. */
@@ -574,7 +551,7 @@
                        // has been called
                        if (rootItem == null)
                        {
-                               TreeNode rootNode = 
(TreeNode)((TreeModel)getModelObject()).getRoot();
+                               Object rootNode = 
((TreeModel)getModelObject()).getRoot();
                                if (rootNode != null)
                                {
                                        if (isRootLess())
@@ -598,6 +575,7 @@
         * Called at the beginning of the request (not ajax request, unless we 
are rendering the entire
         * component)
         */
+       @Override
        public void onBeforeRender()
        {
                onBeforeRenderInternal();
@@ -607,10 +585,15 @@
        /**
         * @see org.apache.wicket.MarkupContainer#onDetach()
         */
+       @Override
        public void onDetach()
        {
                attached = false;
                super.onDetach();
+               if (getTreeState() instanceof IDetachable)
+               {
+                       ((IDetachable)getTreeState()).detach();
+               }
        }
 
        /**
@@ -634,7 +617,7 @@
        /**
         * @see 
org.apache.wicket.markup.html.tree.ITreeStateListener#nodeCollapsed(javax.swing.tree.TreeNode)
         */
-       public final void nodeCollapsed(TreeNode node)
+       public final void nodeCollapsed(Object node)
        {
                if (isNodeVisible(node) == true)
                {
@@ -645,7 +628,7 @@
        /**
         * @see 
org.apache.wicket.markup.html.tree.ITreeStateListener#nodeExpanded(javax.swing.tree.TreeNode)
         */
-       public final void nodeExpanded(TreeNode node)
+       public final void nodeExpanded(Object node)
        {
                if (isNodeVisible(node) == true)
                {
@@ -656,7 +639,7 @@
        /**
         * @see 
org.apache.wicket.markup.html.tree.ITreeStateListener#nodeSelected(javax.swing.tree.TreeNode)
         */
-       public final void nodeSelected(TreeNode node)
+       public final void nodeSelected(Object node)
        {
                if (isNodeVisible(node))
                {
@@ -667,7 +650,7 @@
        /**
         * @see 
org.apache.wicket.markup.html.tree.ITreeStateListener#nodeUnselected(javax.swing.tree.TreeNode)
         */
-       public final void nodeUnselected(TreeNode node)
+       public final void nodeUnselected(Object node)
        {
                if (isNodeVisible(node))
                {
@@ -702,7 +685,7 @@
                        // expanded
                        if (rootLess == true && getModelObject() != null)
                        {
-                               
getTreeState().expandNode((TreeNode)((TreeModel)getModelObject()).getRoot());
+                               
getTreeState().expandNode(((TreeModel)getModelObject()).getRoot());
                        }
                }
        }
@@ -717,7 +700,7 @@
                {
                        if (rootItem != null)
                        {
-                               
invalidateNode((TreeNode)rootItem.getModelObject(), true);
+                               invalidateNode(rootItem.getModelObject(), true);
                        }
                }
                else
@@ -728,7 +711,7 @@
                        {
                                for (int i = 0; i < children.length; i++)
                                {
-                                       TreeNode node = (TreeNode)children[i];
+                                       Object node = children[i];
                                        if (isNodeVisible(node))
                                        {
                                                // if the nodes is visible 
invalidate it
@@ -761,7 +744,7 @@
 
                                // invalidate the node and it's children, so 
that they are
                                // redrawn
-                               
invalidateNodeWithChildren((TreeNode)item.getModelObject());
+                               
invalidateNodeWithChildren(item.getModelObject());
 
                        }
                }
@@ -773,20 +756,20 @@
        public final void treeNodesInserted(TreeModelEvent e)
        {
                // get the parent node of inserted nodes
-               TreeNode parent = 
(TreeNode)e.getTreePath().getLastPathComponent();
+               Object parent = e.getTreePath().getLastPathComponent();
 
                if (isNodeVisible(parent) && isNodeExpanded(parent))
                {
                        TreeItem parentItem = 
(TreeItem)nodeToItemMap.get(parent);
-                       
-                       if (parentItem.getChildren().isEmpty()) 
+
+                       if (parentItem.getChildren().isEmpty())
                        {
                                invalidateNode(parent, true);
                        }
-                       
+
                        for (int i = 0; i < e.getChildren().length; ++i)
                        {
-                               TreeNode node = (TreeNode)e.getChildren()[i];
+                               Object node = e.getChildren()[i];
                                int index = e.getChildIndices()[i];
                                TreeItem item = newTreeItem(node, 
parentItem.getLevel() + 1);
                                itemContainer.add(item);
@@ -794,8 +777,11 @@
 
                                markTheLastButOneChildDirty(parentItem, item);
 
-                               dirtyItems.add(item);
-                               dirtyItemsCreateDOM.add(item);
+                               if (!dirtyItems.contains(item))
+                                       dirtyItems.add(item);
+
+                               if (!dirtyItemsCreateDOM.contains(item))
+                                       dirtyItemsCreateDOM.add(item);
                        }
                }
        }
@@ -806,7 +792,7 @@
        public final void treeNodesRemoved(TreeModelEvent e)
        {
                // get the parent node of inserted nodes
-               TreeNode parent = 
(TreeNode)e.getTreePath().getLastPathComponent();
+               Object parent = e.getTreePath().getLastPathComponent();
                TreeItem parentItem = (TreeItem)nodeToItemMap.get(parent);
 
                if (isNodeVisible(parent) && isNodeExpanded(parent))
@@ -814,7 +800,7 @@
                        boolean nonEmpty = !parentItem.getChildren().isEmpty();
                        for (int i = 0; i < e.getChildren().length; ++i)
                        {
-                               TreeNode node = (TreeNode)e.getChildren()[i];
+                               Object node = e.getChildren()[i];
 
                                TreeItem item = 
(TreeItem)nodeToItemMap.get(node);
                                if (item != null)
@@ -831,7 +817,7 @@
                                                        removeItem(item);
 
                                                        // deselect the node
-                                                       
getTreeState().selectNode((TreeNode)item.getModelObject(), false);
+                                                       
getTreeState().selectNode(item.getModelObject(), false);
                                                }
                                        });
 
@@ -851,7 +837,7 @@
        public final void treeStructureChanged(TreeModelEvent e)
        {
                // get the parent node of changed nodes
-               TreeNode node = 
(TreeNode)e.getTreePath().getLastPathComponent();
+               Object node = e.getTreePath().getLastPathComponent();
 
                // has the tree root changed?
                if (e.getTreePath().getPathCount() == 1)
@@ -983,6 +969,7 @@
                        for (Iterator i = dirtyItems.iterator(); i.hasNext();)
                        {
                                TreeItem item = (TreeItem)i.next();
+
                                // does the item need to rebuild children?
                                if (item.getChildren() == null)
                                {
@@ -996,6 +983,7 @@
 
                                // add the component to target
                                addComponent(target, item);
+
                        }
 
                        // clear dirty flags
@@ -1010,7 +998,7 @@
         *            The node to inspect
         * @return true if the node is expanded, false otherwise
         */
-       protected final boolean isNodeExpanded(TreeNode node)
+       protected final boolean isNodeExpanded(Object node)
        {
                // In root less mode the root node is always expanded
                if (isRootLess() && rootItem != null && 
rootItem.getModelObject().equals(node))
@@ -1035,6 +1023,7 @@
        /**
         * Called after the rendering of tree is complete. Here we clear the 
dirty flags.
         */
+       @Override
        protected void onAfterRender()
        {
                super.onAfterRender();
@@ -1066,11 +1055,10 @@
                List items;
 
                // if the node is expanded
-               if (isNodeExpanded((TreeNode)item.getModelObject()))
+               if (isNodeExpanded(item.getModelObject()))
                {
                        // build the items for children of the items' treenode.
-                       items = 
buildTreeItems(nodeChildren((TreeNode)item.getModelObject()),
-                               item.getLevel() + 1);
+                       items = 
buildTreeItems(nodeChildren(item.getModelObject()), item.getLevel() + 1);
                }
                else
                {
@@ -1097,7 +1085,7 @@
                // for each node
                while (nodes.hasNext())
                {
-                       TreeNode node = (TreeNode)nodes.next();
+                       Object node = nodes.next();
                        // create tree item
                        TreeItem item = newTreeItem(node, level);
                        itemContainer.add(item);
@@ -1230,7 +1218,7 @@
         * 
         * @param node
         */
-       public final void markNodeDirty(TreeNode node)
+       public final void markNodeDirty(Object node)
        {
                invalidateNode(node, false);
        }
@@ -1243,7 +1231,7 @@
         *            The node to invalidate
         * @param forceRebuild
         */
-       private final void invalidateNode(TreeNode node, boolean forceRebuild)
+       private final void invalidateNode(Object node, boolean forceRebuild)
        {
                if (dirtyAll == false)
                {
@@ -1290,8 +1278,10 @@
                                        }
                                }
 
-                               dirtyItems.add(item);
-                               if (createDOM)
+                               if (!dirtyItems.contains(item))
+                                       dirtyItems.add(item);
+
+                               if (createDOM && 
!dirtyItemsCreateDOM.contains(item))
                                {
                                        dirtyItemsCreateDOM.add(item);
                                }
@@ -1306,7 +1296,7 @@
         * @param node
         *            The node to invalidate
         */
-       private final void invalidateNodeWithChildren(TreeNode node)
+       private final void invalidateNodeWithChildren(Object node)
        {
                if (dirtyAll == false)
                {
@@ -1328,8 +1318,11 @@
                                // set children to null so that they get rebuild
                                item.setChildren(null);
 
-                               // add item to dirty items
-                               dirtyItems.add(item);
+                               if (!dirtyItems.contains(item))
+                               {
+                                       // add item to dirty items
+                                       dirtyItems.add(item);
+                               }
                        }
                }
        }
@@ -1341,27 +1334,41 @@
         *            The node to inspect
         * @return true if the node is visible, false otherwise
         */
-       private final boolean isNodeVisible(TreeNode node)
+       private final boolean isNodeVisible(Object node)
        {
-               while (getParentNode(node) != null)
+               Object parent = getParentNode(node);
+               while (parent != null)
                {
-                       if (isNodeExpanded(node.getParent()) == false)
+                       if (isNodeExpanded(parent) == false)
                        {
                                return false;
                        }
-                       node = node.getParent();
+                       parent = getParentNode(parent);
                }
                return true;
        }
-       
+
        /**
         * Returns parent node of given node.
+        * 
         * @param node
         * @return
         */
-       protected TreeNode getParentNode(TreeNode node)
+       public Object getParentNode(Object node)
        {
-               return node.getParent();
+               if (getModelObject() instanceof ExtendedTreeModel)
+               {
+                       return 
((ExtendedTreeModel)getModelObject()).getParent(node);
+               }
+               else if (node instanceof TreeNode)
+               {
+                       return ((TreeNode)node).getParent();
+               }
+               else
+               {
+                       throw new IllegalStateException(
+                               "Couldn't determine node parent. Either the 
tree model must implement ParentTreeModel or Node must implement TreeNode.");
+               }
        }
 
        /**
@@ -1373,7 +1380,7 @@
         *            The level
         * @return The new tree item
         */
-       private final TreeItem newTreeItem(TreeNode node, int level)
+       private final TreeItem newTreeItem(Object node, int level)
        {
                return new TreeItem("" + idCounter++, node, level);
        }
@@ -1389,7 +1396,7 @@
         *            the component id
         * @return The new tree item
         */
-       private final TreeItem newTreeItem(TreeNode node, int level, String id)
+       private final TreeItem newTreeItem(Object node, int level, String id)
        {
                return new TreeItem(id, node, level);
        }
@@ -1401,9 +1408,36 @@
         *            The tree node
         * @return iterable presentation of node children
         */
-       private final Iterator nodeChildren(TreeNode node)
+       public final Iterator<Object> nodeChildren(Object node)
+       {
+               TreeModel model = getTreeModel();
+               int count = model.getChildCount(node);
+               List<Object> nodes = new ArrayList<Object>(count);
+               for (int i = 0; i < count; ++i)
+               {
+                       nodes.add(model.getChild(node, i));
+               }
+               return nodes.iterator();
+       }
+
+       public final Object getChildAt(Object parent, int index)
+       {
+               return getTreeModel().getChild(parent, index);
+       }
+
+       public final boolean isLeaf(Object node)
+       {
+               return getTreeModel().isLeaf(node);
+       }
+
+       public final int getChildCount(Object parent)
+       {
+               return getTreeModel().getChildCount(parent);
+       }
+
+       private TreeModel getTreeModel()
        {
-               return toIterator(node.children());
+               return (TreeModel)getModelObject();
        }
 
        /**
@@ -1509,7 +1543,7 @@
         *            Tree node
         * @return Component associated with given node, or null if node is not 
visible.
         */
-       public Component getNodeComponent(TreeNode node)
+       public Component getNodeComponent(Object node)
        {
                return (Component)nodeToItemMap.get(node);
        }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java
 Sun Apr 20 13:06:50 2008
@@ -16,8 +16,6 @@
  */
 package org.apache.wicket.markup.html.tree;
 
-import javax.swing.tree.TreeNode;
-
 import org.apache.wicket.Component;
 import org.apache.wicket.IClusterable;
 import org.apache.wicket.IComponentBorder;
@@ -98,10 +96,11 @@
         * @see 
org.apache.wicket.markup.html.tree.AbstractTree#populateTreeItem(org.apache.wicket.markup.html.WebMarkupContainer,
         *      int)
         */
+       @Override
        protected void populateTreeItem(WebMarkupContainer item, int level)
        {
                // add junction link
-               TreeNode node = (TreeNode)item.getModelObject();
+               Object node = item.getModelObject();
                Component junctionLink = newJunctionLink(item, 
JUNCTION_LINK_ID, node);
                junctionLink.setComponentBorder(new JunctionBorder(node, 
level));
                item.add(junctionLink);
@@ -115,9 +114,10 @@
                {
                        private static final long serialVersionUID = 1L;
 
+                       @Override
                        public void onComponentTag(Component component, 
ComponentTag tag)
                        {
-                               TreeNode node = 
(TreeNode)component.getModelObject();
+                               Object node = component.getModelObject();
                                if (getTreeState().isNodeSelected(node))
                                {
                                        CharSequence oldClass = 
tag.getString("class");
@@ -162,16 +162,16 @@
         *            The node
         * @return whether the provided node is the last child
         */
-       private static boolean isNodeLast(TreeNode node)
+       private boolean isNodeLast(Object node)
        {
-               TreeNode parent = node.getParent();
+               Object parent = getParentNode(node);
                if (parent == null)
                {
                        return true;
                }
                else
                {
-                       return parent.getChildAt(parent.getChildCount() - 
1).equals(node);
+                       return getChildAt(parent, getChildCount(parent) - 
1).equals(node);
                }
        }
 
@@ -180,11 +180,11 @@
         * 
         * @author Matej Knopp
         */
-       private static class JunctionBorder implements IComponentBorder
+       private class JunctionBorder implements IComponentBorder
        {
                private static final long serialVersionUID = 1L;
 
-               private final TreeNode node;
+               private final Object node;
                private final int level;
 
                /**
@@ -193,7 +193,7 @@
                 * @param node
                 * @param level
                 */
-               public JunctionBorder(TreeNode node, int level)
+               public JunctionBorder(Object node, int level)
                {
                        this.node = node;
                        this.level = level;
@@ -207,7 +207,7 @@
                public void renderBefore(Component component)
                {
                        Response response = RequestCycle.get().getResponse();
-                       TreeNode parent = node.getParent();
+                       Object parent = getParentNode(node);
 
                        CharSequence classes[] = new CharSequence[level];
                        for (int i = 0; i < level; ++i)
@@ -221,7 +221,7 @@
                                        classes[i] = "line";
                                }
 
-                               parent = parent.getParent();
+                               parent = getParentNode(parent);
                        }
 
                        for (int i = level - 1; i >= 0; --i)
@@ -252,11 +252,11 @@
         *            tree node for which the link should be created.
         * @return The link component
         */
-       protected Component newJunctionLink(MarkupContainer parent, final 
String id, final TreeNode node)
+       protected Component newJunctionLink(MarkupContainer parent, final 
String id, final Object node)
        {
                final MarkupContainer junctionLink;
 
-               if (node.isLeaf() == false)
+               if (isLeaf(node) == false)
                {
                        junctionLink = newLink(id, new ILinkCallback()
                        {
@@ -280,6 +280,7 @@
                        {
                                private static final long serialVersionUID = 1L;
 
+                               @Override
                                public void onComponentTag(Component component, 
ComponentTag tag)
                                {
                                        if (isNodeExpanded(node))
@@ -302,6 +303,7 @@
                                /**
                                 * @see 
org.apache.wicket.Component#onComponentTag(org.apache.wicket.markup.ComponentTag)
                                 */
+                               @Override
                                protected void onComponentTag(ComponentTag tag)
                                {
                                        super.onComponentTag(tag);
@@ -325,7 +327,7 @@
         * @param node
         *            Node for which this callback is relevant
         */
-       protected void onJunctionLinkClicked(AjaxRequestTarget target, TreeNode 
node)
+       protected void onJunctionLinkClicked(AjaxRequestTarget target, Object 
node)
        {
        }
 
@@ -409,6 +411,7 @@
                                /**
                                 * @see 
org.apache.wicket.markup.html.link.Link#onClick()
                                 */
+                               @Override
                                public void onClick()
                                {
                                        callback.onClick(null);
@@ -424,6 +427,7 @@
                                /**
                                 * @see 
org.apache.wicket.ajax.markup.html.AjaxLink#onClick(org.apache.wicket.ajax.AjaxRequestTarget)
                                 */
+                               @Override
                                public void onClick(AjaxRequestTarget target)
                                {
                                        callback.onClick(target);
@@ -439,6 +443,7 @@
                                /**
                                 * @see 
org.apache.wicket.ajax.markup.html.AjaxFallbackLink#onClick(org.apache.wicket.ajax.AjaxRequestTarget)
                                 */
+                               @Override
                                public void onClick(AjaxRequestTarget target)
                                {
                                        callback.onClick(target);
@@ -458,8 +463,8 @@
        }
 
        /**
-        * Sets the type of links on tree items. After the link type is 
changed, the whole tree is
-        * rebuild and re-rendered.
+        * Sets the type of links on tree items. After the link type is 
changed, the whole tree must be
+        * rebuilt (call invalidateAll).
         * 
         * @param linkType
         *            type of links
@@ -469,13 +474,13 @@
                if (this.linkType != linkType)
                {
                        this.linkType = linkType;
-                       invalidateAll();
                }
        }
 
        /**
         * @see 
org.apache.wicket.markup.html.tree.AbstractTree#isForceRebuildOnSelectionChange()
         */
+       @Override
        protected boolean isForceRebuildOnSelectionChange()
        {
                return false;

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
 Sun Apr 20 13:06:50 2008
@@ -24,9 +24,8 @@
 import java.util.List;
 import java.util.Set;
 
-import javax.swing.tree.TreeNode;
-
 import org.apache.wicket.IClusterable;
+import org.apache.wicket.model.IDetachable;
 
 /**
  * Default implementation of TreeState.
@@ -35,7 +34,7 @@
  * 
  * @author Matej Knopp
  */
-public class DefaultTreeState implements ITreeState, IClusterable
+public class DefaultTreeState implements ITreeState, IClusterable, IDetachable
 {
        private static final long serialVersionUID = 1L;
 
@@ -91,10 +90,7 @@
                }
        }
 
-       /**
-        * @see 
org.apache.wicket.markup.html.tree.ITreeState#collapseNode(javax.swing.tree.TreeNode)
-        */
-       public void collapseNode(TreeNode node)
+       public void collapseNode(Object node)
        {
                if (nodesCollapsed == true)
                {
@@ -137,10 +133,7 @@
                }
        }
 
-       /**
-        * @see 
org.apache.wicket.markup.html.tree.ITreeState#expandNode(javax.swing.tree.TreeNode)
-        */
-       public void expandNode(TreeNode node)
+       public void expandNode(Object node)
        {
                if (nodesCollapsed == false)
                {
@@ -175,10 +168,7 @@
                return allowSelectMultiple;
        }
 
-       /**
-        * @see 
org.apache.wicket.markup.html.tree.ITreeState#isNodeExpanded(javax.swing.tree.TreeNode)
-        */
-       public boolean isNodeExpanded(TreeNode node)
+       public boolean isNodeExpanded(Object node)
        {
                if (nodesCollapsed == false)
                {
@@ -190,10 +180,7 @@
                }
        }
 
-       /**
-        * @see 
org.apache.wicket.markup.html.tree.ITreeState#isNodeSelected(javax.swing.tree.TreeNode)
-        */
-       public boolean isNodeSelected(TreeNode node)
+       public boolean isNodeSelected(Object node)
        {
                return selectedNodes.contains(node);
        }
@@ -206,17 +193,13 @@
                listeners.remove(l);
        }
 
-       /**
-        * @see 
org.apache.wicket.markup.html.tree.ITreeState#selectNode(javax.swing.tree.TreeNode,
-        *      boolean)
-        */
-       public void selectNode(TreeNode node, boolean selected)
+       public void selectNode(Object node, boolean selected)
        {
                if (isAllowSelectMultiple() == false && selectedNodes.size() > 
0)
                {
                        for (Iterator i = selectedNodes.iterator(); 
i.hasNext();)
                        {
-                               TreeNode current = (TreeNode)i.next();
+                               Object current = i.next();
                                if (current.equals(node) == false)
                                {
                                        i.remove();
@@ -259,5 +242,23 @@
        public void setAllowSelectMultiple(boolean value)
        {
                allowSelectMultiple = value;
+       }
+
+       public void detach()
+       {
+               for (Object node : nodes)
+               {
+                       if (node instanceof IDetachable)
+                       {
+                               ((IDetachable)node).detach();
+                       }
+               }
+               for (Object node : selectedNodes)
+               {
+                       if (node instanceof IDetachable)
+                       {
+                               ((IDetachable)node).detach();
+                       }
+               }
        }
 }

Added: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java?rev=649964&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java
 (added)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java
 Sun Apr 20 13:06:50 2008
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.tree;
+
+import javax.swing.tree.TreeModel;
+
+/**
+ * Tree model that can provide parent for a tree node.
+ * 
+ * @author Matej Knopp
+ */
+public interface ExtendedTreeModel extends TreeModel
+{
+       /**
+        * Returns parent of the given node or <code>null</code> if the node is 
a root node.
+        * 
+        * @param node
+        * @return node parent or <code>null</code>
+        */
+       public Object getParent(Object node);
+}

Propchange: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java
 Sun Apr 20 13:06:50 2008
@@ -18,8 +18,6 @@
 
 import java.util.Collection;
 
-import javax.swing.tree.TreeNode;
-
 /**
  * Tree state holds information about a tree such as which nodes are expanded 
/ collapsed and which
  * nodes are selected, It can also fire callbacks on listener in case any of 
the information
@@ -48,7 +46,7 @@
         * @param node
         *            Node to collapse
         */
-       void collapseNode(TreeNode node);
+       void collapseNode(Object node);
 
        /**
         * Expands all nodes of the tree.
@@ -61,7 +59,7 @@
         * @param node
         *            Node to expand
         */
-       void expandNode(TreeNode node);
+       void expandNode(Object node);
 
        /**
         * Returns the collection of all selected nodes.
@@ -84,7 +82,7 @@
         *            The node to inspect
         * @return True if the node is expanded
         */
-       boolean isNodeExpanded(TreeNode node);
+       boolean isNodeExpanded(Object node);
 
        /**
         * Returns true if the given node is selected, false otherwise.
@@ -93,7 +91,7 @@
         *            The node to inspect
         * @return True if the node is selected
         */
-       boolean isNodeSelected(TreeNode node);
+       boolean isNodeSelected(Object node);
 
        /**
         * Removes a tree state listener.
@@ -115,7 +113,7 @@
         * @param selected
         *            If true, the node will be selected, otherwise, the node 
will be unselected
         */
-       void selectNode(TreeNode node, boolean selected);
+       void selectNode(Object node, boolean selected);
 
        /**
         * Sets whether multiple nodes can be selected.

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java
 Sun Apr 20 13:06:50 2008
@@ -16,11 +16,10 @@
  */
 package org.apache.wicket.markup.html.tree;
 
-import javax.swing.tree.TreeNode;
 
 /**
  * Methods this interface are called when tree state is changing.
- * 
+ *
  * @author Matej Knopp
  */
 public interface ITreeStateListener
@@ -37,32 +36,32 @@
 
        /**
         * Fired when given node is collapsed.
-        * 
+        *
         * @param node
         *            The node that was collapsed
         */
-       void nodeCollapsed(TreeNode node);
+       void nodeCollapsed(Object node);
 
        /**
         * Fired when given node is expanded.
-        * 
+        *
         * @param node
         */
-       void nodeExpanded(TreeNode node);
+       void nodeExpanded(Object node);
 
        /**
         * Fired when given node gets selected.
-        * 
+        *
         * @param node
         *            The node that was selected
         */
-       void nodeSelected(TreeNode node);
+       void nodeSelected(Object node);
 
        /**
         * Fired when given node gets unselected.
-        * 
+        *
         * @param node
         *            The node that was unselected
         */
-       void nodeUnselected(TreeNode node);
+       void nodeUnselected(Object node);
 }


Reply via email to