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"