You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by dr...@apache.org on 2011/07/07 20:51:19 UTC

svn commit: r1143969 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/corelib/components/ main/java/org/apache/tapestry5/tree/ test/groovy/org/apache/tapestry5/integration/app1/

Author: drobiazko
Date: Thu Jul  7 18:51:18 2011
New Revision: 1143969

URL: http://svn.apache.org/viewvc?rev=1143969&view=rev
Log:
TAP5-1562: Introduced TreeSelectionModel.

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeSelectionModel.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeSelectionModel.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Tree.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeExpansionModel.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeExpansionModel.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/TreeTests.groovy

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Tree.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Tree.java?rev=1143969&r1=1143968&r2=1143969&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Tree.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Tree.java Thu Jul  7 18:51:18 2011
@@ -30,16 +30,13 @@ import org.apache.tapestry5.json.JSONObj
 import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 import org.apache.tapestry5.services.javascript.JavaScriptSupport;
-import org.apache.tapestry5.tree.DefaultTreeExpansionModel;
-import org.apache.tapestry5.tree.TreeExpansionModel;
-import org.apache.tapestry5.tree.TreeModel;
-import org.apache.tapestry5.tree.TreeNode;
+import org.apache.tapestry5.tree.*;
 
 /**
- * A component used to render a recursive tree structure, with expandable/collapsable nodes. The data that is displayed
+ * A component used to render a recursive tree structure, with expandable/collapsable/selectable nodes. The data that is displayed
  * by the component is provided as a {@link TreeModel}. A secondary model, the {@link TreeExpansionModel}, is used
- * to track which nodes have been expanded. The Tree component uses special tricks to support recursive rendering
- * of the Tree as necessary.
+ * to track which nodes have been expanded. The {@link TreeSelectionModel} is used to track node selections.
+ * The Tree component uses special tricks to support recursive rendering of the Tree as necessary.
  * 
  * @since 5.3
  */
@@ -81,6 +78,15 @@ public class Tree
     private TreeExpansionModel expansionModel;
 
     /**
+     * Used to control the Tree's selections. By default, a persistent field inside the Tree
+     * component stores a {@link DefaultTreeSelectionModel}. This parameter may be bound when more
+     * control over the implementation of the selection model, or how it is stored, is
+     * required.
+     */
+    @Parameter(allowNull = false, value = "defaultTreeSelectionModel")
+    private TreeSelectionModel selectionModel;
+
+    /**
      * Optional parameter used to inform the container about the value of the currently rendering TreeNode; this
      * is often preferable to the TreeNode, and like the node parameter, is primarily used when the label parameter
      * it bound.
@@ -105,6 +111,9 @@ public class Tree
     @Persist
     private TreeExpansionModel defaultTreeExpansionModel;
 
+    @Persist
+    private TreeSelectionModel defaultTreeSelectionModel;
+
     private static RenderCommand RENDER_CLOSE_TAG = new RenderCommand()
     {
         public void render(MarkupWriter writer, RenderQueue queue)
@@ -270,15 +279,15 @@ public class Tree
 
         String event;
 
-        if(expansionModel.isSelected(node))
+        if(selectionModel.isSelected(node))
         {
-            expansionModel.unselect(node);
+            selectionModel.unselect(node);
 
             event = EventConstants.NODE_UNSELECTED;
         }
         else
         {
-            expansionModel.select(node);
+            selectionModel.select(node);
 
             event = EventConstants.NODE_SELECTED;
         }
@@ -303,6 +312,14 @@ public class Tree
         return defaultTreeExpansionModel;
     }
 
+    public TreeSelectionModel getDefaultTreeSelectionModel()
+    {
+        if(defaultTreeSelectionModel == null)
+            defaultTreeSelectionModel = new DefaultTreeSelectionModel();
+
+        return defaultTreeSelectionModel;
+    }
+
     /**
      * Returns the actual {@link TreeExpansionModel} in use for this Tree component,
      * as per the expansionModel parameter. This is often, but not always, the same
@@ -313,6 +330,16 @@ public class Tree
         return expansionModel;
     }
 
+    /**
+     * Returns the actual {@link TreeSelectionModel} in use for this Tree component,
+     * as per the {@link #selectionModel} parameter. This is often, but not always, the same
+     * as {@link #getDefaultTreeSelectionModel()}.
+     */
+    public TreeSelectionModel getSelectionModel()
+    {
+        return selectionModel;
+    }
+
     public Object getRenderRootNodes()
     {
         return new RenderNodes(model.getRootNodes());

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeExpansionModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeExpansionModel.java?rev=1143969&r1=1143968&r2=1143969&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeExpansionModel.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeExpansionModel.java Thu Jul  7 18:51:18 2011
@@ -30,73 +30,34 @@ public class DefaultTreeExpansionModel<T
 {
     private final Set<String> expandedIds = CollectionFactory.newSet();
 
-    private final Set<String> selectedIds = CollectionFactory.newSet();
-
     public boolean isExpanded(TreeNode<T> node)
     {
-        return contains(expandedIds, node);
-    }
-
-    public void markExpanded(TreeNode<T> node)
-    {
-        add(expandedIds, node);
-    }
-
-    public void markCollapsed(TreeNode<T> node)
-    {
-        remove(expandedIds, node);
-    }
-
-    public boolean isSelected(TreeNode<T> node)
-    {
-        return contains(selectedIds, node);
-    }
-
-    public void select(TreeNode<T> node)
-    {
-         add(selectedIds, node);
-    }
-
-    public void unselect(TreeNode<T> node)
-    {
-        remove(selectedIds, node);
-    }
-
-    public void clear()
-    {
-        clearSet(expandedIds);
-
-        clearSet(selectedIds);
-    }
-
-    private void add(Set<String> ids, TreeNode<T> node)
-    {
         assert node != null;
 
-        if (ids.add(node.getId()))
-            markDirty();
+        return expandedIds.contains(node.getId());
     }
 
-    private void remove(Set<String> ids, TreeNode<T> node)
+    public void markExpanded(TreeNode<T> node)
     {
         assert node != null;
 
-        if (ids.remove(node.getId()))
+        if (expandedIds.add(node.getId()))
             markDirty();
     }
 
-    private boolean contains(Set<String> ids, TreeNode<T> node)
+    public void markCollapsed(TreeNode<T> node)
     {
         assert node != null;
 
-        return ids.contains(node.getId());
+        if (expandedIds.remove(node.getId()))
+            markDirty();
     }
 
-    private void clearSet(Set<String> set)
+    public void clear()
     {
-        if (!set.isEmpty())
+        if (!expandedIds.isEmpty())
         {
-            set.clear();
+            expandedIds.clear();
             markDirty();
         }
     }

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeSelectionModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeSelectionModel.java?rev=1143969&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeSelectionModel.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/DefaultTreeSelectionModel.java Thu Jul  7 18:51:18 2011
@@ -0,0 +1,62 @@
+// Copyright 2011 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.tree;
+
+import org.apache.tapestry5.BaseOptimizedSessionPersistedObject;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+
+import java.util.Set;
+
+/**
+ * Default implementation of {@link TreeSelectionModel}.
+ *
+ * @param <T> type of node
+ */
+public class DefaultTreeSelectionModel<T> extends BaseOptimizedSessionPersistedObject implements TreeSelectionModel<T>
+{
+    private final Set<String> selectedIds = CollectionFactory.newSet();
+
+    public boolean isSelected(TreeNode<T> node)
+    {
+        assert node != null;
+
+        return selectedIds.contains(node.getId());
+    }
+
+    public void select(TreeNode<T> node)
+    {
+        assert node != null;
+
+        if (selectedIds.add(node.getId()))
+            markDirty();
+    }
+
+    public void unselect(TreeNode<T> node)
+    {
+        assert node != null;
+
+        if (selectedIds.remove(node.getId()))
+            markDirty();
+    }
+
+    public void clear()
+    {
+        if (!selectedIds.isEmpty())
+        {
+            selectedIds.clear();
+            markDirty();
+        }
+    }
+}

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeExpansionModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeExpansionModel.java?rev=1143969&r1=1143968&r2=1143969&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeExpansionModel.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeExpansionModel.java Thu Jul  7 18:51:18 2011
@@ -42,12 +42,6 @@ public interface TreeExpansionModel<T>
     /** Marks the node as collapsed (not expanded). */
     void markCollapsed(TreeNode<T> node);
 
-    boolean isSelected(TreeNode<T> node);
-
-    void select(TreeNode<T> node);
-
-    void unselect(TreeNode<T> node);
-
     /** Marks all nodes as collapsed. */
     void clear();
 }

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeSelectionModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeSelectionModel.java?rev=1143969&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeSelectionModel.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/tree/TreeSelectionModel.java Thu Jul  7 18:51:18 2011
@@ -0,0 +1,54 @@
+// Copyright 2011 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.tree;
+
+/**
+ * Tracks which nodes of a {@link TreeModel} are currently selected. The {@linkplain DefaultTreeExpansionModel default
+ * implementation} simply stores a set of {@linkplain TreeNode#getId() unique node
+ * ids} to identify expanded nodes. The expansion model is updated whenever folders are expanded or
+ * collapsed on the client side.
+ *
+ * @param <T> type of node
+ *
+ * @since 5.3
+ * @see org.apache.tapestry5.corelib.components.Tree
+ */
+public interface TreeSelectionModel<T>
+{
+
+    /**
+     * Returns {@code true}, if the given node is selected.
+     *
+     * @param node node to check
+     */
+    boolean isSelected(TreeNode<T> node);
+
+    /**
+     * Selects a node.
+     *
+     * @param node node to select
+     */
+    void select(TreeNode<T> node);
+
+    /**
+     * Unselects a node.
+     *
+     * @param node node to unselect
+     */
+    void unselect(TreeNode<T> node);
+
+    /** Clears the selection. */
+    void clear();
+}

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/TreeTests.groovy
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/TreeTests.groovy?rev=1143969&r1=1143968&r2=1143969&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/TreeTests.groovy (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/TreeTests.groovy Thu Jul  7 18:51:18 2011
@@ -31,7 +31,7 @@ class TreeTests extends SeleniumTestCase
         //Click on Games
         click "//div[@class='t-tree-container test-hook']/ul/li[2]/span[@class='t-tree-icon']"
 
-        waitForCondition "selenium.browserbot.getCurrentWindow().Ajax.activeRequestCount == 0", PAGE_LOAD_TIMEOUT
+        waitForAjaxRequestsToComplete  PAGE_LOAD_TIMEOUT
 
         assertTextPresent "Board Games"
 
@@ -39,7 +39,7 @@ class TreeTests extends SeleniumTestCase
         click "//div[@class='t-tree-container test-hook']/ul/li[2]/ul/li/span[@class='t-tree-icon']"
 
         //Assert the leafs are displayed
-        waitForCondition "window.\$\$(\"span.t-leaf-node\").size() >= 5", "45000"
+        waitForAjaxRequestsToComplete  PAGE_LOAD_TIMEOUT
 
         clickAndWait "link=Redraw"