tapestry-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Josh Canfield <joshcanfi...@gmail.com>
Subject Re: svn commit: r1142070 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/ main/java/org/apache/tapestry5/corelib/components/ main/java/org/apache/tapestry5/tree/ main/resources/org/apache/tapestry5/ test/groovy/org/ap
Date Tue, 05 Jul 2011 17:13:35 GMT
> In general, I've been attempting to not attach new properties to
> existing DOM objects.  However, I've already bent that rule one (the
> t5pubsub properties, to indicate if there are publishers to cleanup
> for an element).
>
> In any case, adding a t5treenodeid property toa DOM element would
> likely not cause the world to come crumbling down.

I'm not thinking about attaching anything to the DOM. I'm thinking
that we move the component id to the container and use
${componentId}_${nodeId} as the id of the <li>.

This puts data into the DOM that the component user can know allowing
easier client side manipulation. For instance, clicking a node might
refresh a zone which contains a form that causes some tree structure
to change. The result of the form includes some javascript that
containst he nodeId so I can pinpoint the branch that needs updating
and reload it with a call to Tree.refresh(nodeId) (or something)

<div id="tree" class="t-tree-container test-hook">
<ul>
<li id="tree_0a096a88-5c80-40d9-abba-d2b57a544b8b">
  <span class="t-tree-icon"></span>
  <span class="t-tree-label">Pets</span>
</li>
<li id="tree_7fd814c4-fd6a-4a33-90ab-3dadf7e1c97a">
  <span class="t-tree-icon t-tree-expanded"></span>
  <span class="t-tree-label">Games</span>
  <ul>
    <li id="tree_f6b47558-2011-40b0-9446-89ab9db52cd0">
      <span class="t-tree-icon"></span>
      <span class="t-tree-label">Board Games</span>
    </li>
    <li id=""tree_19f5d1f6-addf-4dbb-a3c0-c2e42a844d37" class="t-last">
      <span class="t-tree-icon"></span>
      <span class="t-tree-label">Card Games</span>
    </li>
  </ul>
</li>
<li id="tree_b7e7965d-8bb0-4022-931f-dafeddc8d716" class="t-last">
<span class="t-tree-icon"></span><span class="t-tree-label">Numbers</span>
</li>
</ul>

</div>

> Maybe its
> different as we transition to a loosey-goosey HTML5 world, but I've
> made a lot of effort over the years to have Tapestry render out
> property HTML and XHTML, which is why I typically render out a unique
> client id, with companion JS to take it from there.

I totally agree here. Since nodes have to provide a unique id anyway I
think it makes a good value for the actual id.

> Maybe its time to
> experiment with directly rendering extra DOM attributes for these
> kinds of purposes, which would make the HTML markup a bit easier to
> follow, and make both markup and JavaScript more concise.

I'll let someone else break that seal ;)

>
>
> On Mon, Jul 4, 2011 at 1:37 PM, Josh Canfield <joshcanfield@gmail.com> wrote:
>> Yes, pub sub is definitely on my to-do list. I want the tree to publish
>> click, expand and collapse events and listen for refresh events. I think
>> this will require adding the node ID to the client elements. Is there a
>> reason not to do that?
>>
>> I'm also contemplating a generic way to send parameterized links to the
>> client. With something like T5.eventLink(link, context) to mirror a server
>> side API. Context would be hash of name/values to replace in the event link.
>>
>> The point would be to allow things like the tree to have one event link that
>> serviced all the nodes configured once removing the need to send the event
>> links down with every node.
>> On Jul 4, 2011 10:27 AM, "Howard Lewis Ship" <hlship@gmail.com> wrote:
>>> I suspect leveraging the new pubsub infrastructure will help. I'm
>>> going to be looking at refactoring a good number of the mega
>>> components that way.
>>>
>>> On Sun, Jul 3, 2011 at 1:00 PM, Josh Canfield <joshcanfield@gmail.com>
>> wrote:
>>>> Ok, thanks.
>>>>
>>>> A previously said it was 1000 items, but it's really 10 times as many
>>>> elements. Makes the memory issue less significant, I'm still going to see
>> if
>>>> can get it to come down.
>>>> On Jul 3, 2011 12:35 PM, "Igor Drobiazko" <igor.drobiazko@gmail.com>
>> wrote:
>>>>> I'm planning to refactor Tree.java by moving selected nodes from
>>>>> TreeExpansionModel into TreeSelectionModel. No changes in tree.js are
>>>>> expected. Please go ahead.
>>>>>
>>>>> On Sun, Jul 3, 2011 at 6:55 PM, Josh Canfield <joshcanfield@gmail.com
>>>>>wrote:
>>>>>
>>>>>> Igor or Howard (or anyone else) are you actively working on the tree
>>>>>> component? I'd like to refactor the javascript a bit but I don't
want
>>>>>> to make a merge for you difficult.
>>>>>>
>>>>>> Currently all of the javascript closures are being copied for every
>>>>>> node. In the TreeDemo integration test expanding the Numbers node,
>>>>>> which has 1000 elements , Chrome is reporting ~11.5MB added to the
>>>>>> total memory usage of the page. 4.78MB of that is in closures. (I
>>>>>> haven't tried profiling Firefox)
>>>>>>
>>>>>> I'm working on a project that will likely have a large number of
>>>>>> nodes, probably not all under one branch, but since the Tree component
>>>>>> is caching the objects opening and closing the branches is going
to
>>>>>> make the total number of nodes pile up quickly. I'd like to try and
>>>>>> get it down to only increasing the memory usage by html elements
and
>>>>>> the equivalent of the spec objects.
>>>>>>
>>>>>>
>>>>>> Josh
>>>>>>
>>>>>>
>>>>>> On Fri, Jul 1, 2011 at 5:32 PM, Igor Drobiazko <
>> igor.drobiazko@gmail.com>
>>>>>> wrote:
>>>>>> > You think we should add TreeSelectionModel?
>>>>>> >
>>>>>> > On Sat, Jul 2, 2011 at 2:02 AM, Howard Lewis Ship <hlship@gmail.com>
>>>>>> wrote:
>>>>>> >
>>>>>> >> I'm not sure that we want the TreeExpansionModel to also
be the
>> Tree's
>>>>>> >> selection model; I think of those as separate and possibly
>> orthogonal.
>>>>>> >>
>>>>>> >> On Fri, Jul 1, 2011 at 1:24 PM, <drobiazko@apache.org>
wrote:
>>>>>> >> > Author: drobiazko
>>>>>> >> > Date: Fri Jul 1 20:24:03 2011
>>>>>> >> > New Revision: 1142070
>>>>>> >> >
>>>>>> >> > URL: http://svn.apache.org/viewvc?rev=1142070&view=rev
>>>>>> >> > Log:
>>>>>> >> > TAP5-1562: Made tree leafs selectable
>>>>>> >> >
>>>>>> >> > Modified:
>>>>>> >> >
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java
>>>>>> >> >
>>>>>> >>
>>>>>>
>>>>
>> 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/main/resources/org/apache/tapestry5/tree.css
>>>>>> >> >
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tree.js
>>>>>> >> >
>>>>>> >>
>>>>>>
>>>>
>> 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/EventConstants.java
>>>>>> >> > URL:
>>>>>> >>
>>>>>>
>>>>
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java?rev=1142070&r1=1142069&r2=1142070&view=diff
>>>>>> >> >
>>>>>> >>
>>>>>>
>>>>
>> ==============================================================================
>>>>>> >> > ---
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java
>>>>>> >> (original)
>>>>>> >> > +++
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java
>>>>>> >> Fri Jul 1 20:24:03 2011
>>>>>> >> > @@ -209,4 +209,20 @@ public class EventConstants
>>>>>> >> > */
>>>>>> >> > public static final String PREALLOCATE_FORM_CONTROL_NAMES
=
>>>>>> >> "preallocateFormControlNames";
>>>>>> >> >
>>>>>> >> > + /**
>>>>>> >> > + * Event triggered by the {@link
>>>>>> >> org.apache.tapestry5.corelib.components.Tree}
>>>>>> >> > + * component when a leaf node is selected.
>>>>>> >> > + *
>>>>>> >> > + * @since 5.3.1
>>>>>> >> > + */
>>>>>> >> > + public static final String NODE_SELECTED = "nodeSelected";
>>>>>> >> > +
>>>>>> >> > + /**
>>>>>> >> > + * Event triggered by the {@link
>>>>>> >> org.apache.tapestry5.corelib.components.Tree}
>>>>>> >> > + * component when a leaf node is unselected.
>>>>>> >> > + *
>>>>>> >> > + * @since 5.3.1
>>>>>> >> > + */
>>>>>> >> > + public static final String NODE_UNSELECTED = "nodeUnselected";
>>>>>> >> > +
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > 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=1142070&r1=1142069&r2=1142070&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
>>>>>> >> Fri Jul 1 20:24:03 2011
>>>>>> >> > @@ -14,21 +14,17 @@
>>>>>> >> >
>>>>>> >> > package org.apache.tapestry5.corelib.components;
>>>>>> >> >
>>>>>> >> > +import java.util.Arrays;
>>>>>> >> > import java.util.List;
>>>>>> >> >
>>>>>> >> > -import org.apache.tapestry5.BindingConstants;
>>>>>> >> > -import org.apache.tapestry5.Block;
>>>>>> >> > -import org.apache.tapestry5.ComponentResources;
>>>>>> >> > -import org.apache.tapestry5.Link;
>>>>>> >> > -import org.apache.tapestry5.MarkupWriter;
>>>>>> >> > -import org.apache.tapestry5.annotations.Environmental;
>>>>>> >> > -import org.apache.tapestry5.annotations.Parameter;
>>>>>> >> > -import org.apache.tapestry5.annotations.Persist;
>>>>>> >> > -import org.apache.tapestry5.annotations.Property;
>>>>>> >> > +import org.apache.tapestry5.*;
>>>>>> >> > +import org.apache.tapestry5.annotations.*;
>>>>>> >> > +import org.apache.tapestry5.corelib.internal.InternalFormSupport;
>>>>>> >> > import org.apache.tapestry5.dom.Element;
>>>>>> >> > import org.apache.tapestry5.func.F;
>>>>>> >> > import org.apache.tapestry5.func.Flow;
>>>>>> >> > import org.apache.tapestry5.func.Worker;
>>>>>> >> > +import org.apache.tapestry5.internal.util.CaptureResultCallback;
>>>>>> >> > import org.apache.tapestry5.ioc.annotations.Inject;
>>>>>> >> > import org.apache.tapestry5.json.JSONObject;
>>>>>> >> > import org.apache.tapestry5.runtime.RenderCommand;
>>>>>> >> > @@ -49,6 +45,7 @@ import org.apache.tapestry5.tree.TreeNod
>>>>>> >> > */
>>>>>> >> > @SuppressWarnings(
>>>>>> >> > { "rawtypes", "unchecked", "unused" })
>>>>>> >> > +@Events({EventConstants.NODE_SELECTED,
>>>>>> EventConstants.NODE_UNSELECTED})
>>>>>> >> > public class Tree
>>>>>> >> > {
>>>>>> >> > /**
>>>>>> >> > @@ -162,30 +159,34 @@ public class Tree
>>>>>> >> > boolean hasChildren = !node.isLeaf() &&
>>>>>> >> node.getHasChildren();
>>>>>> >> > boolean expanded = hasChildren &&
>>>>>> >> expansionModel.isExpanded(node);
>>>>>> >> >
>>>>>> >> > - if (hasChildren)
>>>>>> >> > - {
>>>>>> >> > - String clientId =
>>>>>> jss.allocateClientId(resources);
>>>>>> >> > + String clientId = jss.allocateClientId(resources);
>>>>>> >> >
>>>>>> >> > - e.attribute("id", clientId);
>>>>>> >> > + JSONObject spec = new JSONObject("clientId",
>>>>>> clientId);
>>>>>> >> >
>>>>>> >> > + e.attribute("id", clientId);
>>>>>> >> > +
>>>>>> >> > + if (hasChildren)
>>>>>> >> > + {
>>>>>> >> > Link expandChildren =
>>>>>> >> resources.createEventLink("expandChildren", node.getId());
>>>>>> >> > Link markExpanded =
>>>>>> >> resources.createEventLink("markExpanded", node.getId());
>>>>>> >> > Link markCollapsed =
>>>>>> >> resources.createEventLink("markCollapsed", node.getId());
>>>>>> >> >
>>>>>> >> > - JSONObject spec = new JSONObject("clientId",
>>>>>> >> clientId,
>>>>>> >> > -
>>>>>> >> > - "expandChildrenURL", expandChildren.toString(),
>>>>>> >> > -
>>>>>> >> > - "markExpandedURL", markExpanded.toString(),
>>>>>> >> > -
>>>>>> >> > - "markCollapsedURL", markCollapsed.toString());
>>>>>> >> > + spec.put("expandChildrenURL",
>>>>>> >> expandChildren.toString())
>>>>>> >> > + .put( "markExpandedURL",
>>>>>> >> markExpanded.toString())
>>>>>> >> > + .put("markCollapsedURL",
>>>>>> >> markCollapsed.toString());
>>>>>> >> >
>>>>>> >> > if (expanded)
>>>>>> >> > spec.put("expanded", true);
>>>>>> >> > + }
>>>>>> >> > + else
>>>>>> >> > + {
>>>>>> >> > + Link toggleLeaf =
>>>>>> >> resources.createEventLink("toggleLeaf", node.getId());
>>>>>> >> >
>>>>>> >> > - jss.addInitializerCall("treeNode", spec);
>>>>>> >> > + spec.put("toggleLeafURL", toggleLeaf.toString());
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > + jss.addInitializerCall("treeNode", spec);
>>>>>> >> > +
>>>>>> >> > writer.end(); // span.tx-tree-icon
>>>>>> >> >
>>>>>> >> > // From here on in, we're pushing things onto the
>>>>>> queue.
>>>>>> >> Remember that
>>>>>> >> > @@ -263,6 +264,37 @@ public class Tree
>>>>>> >> > return new JSONObject();
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > + Object onToggleLeaf(String nodeId)
>>>>>> >> > + {
>>>>>> >> > + TreeNode node = model.getById(nodeId);
>>>>>> >> > +
>>>>>> >> > + String event;
>>>>>> >> > +
>>>>>> >> > + if(expansionModel.isSelected(node))
>>>>>> >> > + {
>>>>>> >> > + expansionModel.unselect(node);
>>>>>> >> > +
>>>>>> >> > + event = EventConstants.NODE_UNSELECTED;
>>>>>> >> > + }
>>>>>> >> > + else
>>>>>> >> > + {
>>>>>> >> > + expansionModel.select(node);
>>>>>> >> > +
>>>>>> >> > + event = EventConstants.NODE_SELECTED;
>>>>>> >> > + }
>>>>>> >> > +
>>>>>> >> > + CaptureResultCallback<Object> callback =
>>>>>> >> CaptureResultCallback.create();
>>>>>> >> > +
>>>>>> >> > + resources.triggerEvent(event, new Object [] { nodeId
},
>>>>>> >> callback);
>>>>>> >> > +
>>>>>> >> > + final Object result = callback.getResult();
>>>>>> >> > +
>>>>>> >> > + if(result != null)
>>>>>> >> > + return result;
>>>>>> >> > +
>>>>>> >> > + return new JSONObject();
>>>>>> >> > + }
>>>>>> >> > +
>>>>>> >> > public TreeExpansionModel getDefaultTreeExpansionModel()
>>>>>> >> > {
>>>>>> >> > if (defaultTreeExpansionModel == null)
>>>>>> >> >
>>>>>> >> > 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=1142070&r1=1142069&r2=1142070&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
>>>>>> >> Fri Jul 1 20:24:03 2011
>>>>>> >> > @@ -30,34 +30,73 @@ public class DefaultTreeExpansionModel<T
>>>>>> >> > {
>>>>>> >> > private final Set<String> expandedIds =
>>>>>> CollectionFactory.newSet();
>>>>>> >> >
>>>>>> >> > + private final Set<String> selectedIds =
>>>>>> CollectionFactory.newSet();
>>>>>> >> > +
>>>>>> >> > public boolean isExpanded(TreeNode<T> node)
>>>>>> >> > {
>>>>>> >> > - assert node != null;
>>>>>> >> > -
>>>>>> >> > - return expandedIds.contains(node.getId());
>>>>>> >> > + 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 (expandedIds.add(node.getId()))
>>>>>> >> > + if (ids.add(node.getId()))
>>>>>> >> > markDirty();
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > - public void markCollapsed(TreeNode<T> node)
>>>>>> >> > + private void remove(Set<String> ids, TreeNode<T>
node)
>>>>>> >> > {
>>>>>> >> > assert node != null;
>>>>>> >> >
>>>>>> >> > - if (expandedIds.remove(node.getId()))
>>>>>> >> > + if (ids.remove(node.getId()))
>>>>>> >> > markDirty();
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > - public void clear()
>>>>>> >> > + private boolean contains(Set<String> ids, TreeNode<T>
node)
>>>>>> >> > + {
>>>>>> >> > + assert node != null;
>>>>>> >> > +
>>>>>> >> > + return ids.contains(node.getId());
>>>>>> >> > + }
>>>>>> >> > +
>>>>>> >> > + private void clearSet(Set<String> set)
>>>>>> >> > {
>>>>>> >> > - if (!expandedIds.isEmpty())
>>>>>> >> > + if (!set.isEmpty())
>>>>>> >> > {
>>>>>> >> > - expandedIds.clear();
>>>>>> >> > + set.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=1142070&r1=1142069&r2=1142070&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
>>>>>> >> Fri Jul 1 20:24:03 2011
>>>>>> >> > @@ -42,6 +42,12 @@ 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();
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > Modified:
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tree.css
>>>>>> >> > URL:
>>>>>> >>
>>>>>>
>>>>
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tree.css?rev=1142070&r1=1142069&r2=1142070&view=diff
>>>>>> >> >
>>>>>> >>
>>>>>>
>>>>
>> ==============================================================================
>>>>>> >> > ---
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tree.css
>>>>>> >> (original)
>>>>>> >> > +++
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tree.css
>>>>>> >> Fri Jul 1 20:24:03 2011
>>>>>> >> > @@ -51,6 +51,10 @@ SPAN.t-tree-icon.t-leaf-node {
>>>>>> >> > background-position: -32px -16px;
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > +SPAN.t-tree-label.t-selected-leaf-node-label {
>>>>>> >> > + font-weight: bold;
>>>>>> >> > +}
>>>>>> >> > +
>>>>>> >> > SPAN.t-tree-icon.t-empty-node {
>>>>>> >> > cursor: default;
>>>>>> >> > background-position: -32px 0px !important;
>>>>>> >> >
>>>>>> >> > Modified:
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tree.js
>>>>>> >> > URL:
>>>>>> >>
>>>>>>
>>>>
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tree.js?rev=1142070&r1=1142069&r2=1142070&view=diff
>>>>>> >> >
>>>>>> >>
>>>>>>
>>>>
>> ==============================================================================
>>>>>> >> > ---
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tree.js
>>>>>> >> (original)
>>>>>> >> > +++
>>>>>> >>
>>>>>>
>>>>
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tree.js
>>>>>> >> Fri Jul 1 20:24:03 2011
>>>>>> >> > @@ -63,6 +63,8 @@ T5.extendInitializer(function() {
>>>>>> >> > function initializer(spec) {
>>>>>> >> > var loaded = spec.expanded;
>>>>>> >> > var expanded = spec.expanded;
>>>>>> >> > + var selected = false;
>>>>>> >> > +
>>>>>> >> > if (expanded) {
>>>>>> >> >
>>>>>> $(spec.clientId).addClassName("t-tree-expanded")
>>>>>> >> > }
>>>>>> >> > @@ -95,16 +97,41 @@ T5.extendInitializer(function()
{
>>>>>> >> >
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > + function toggleLeafHandler(reply) {
>>>>>> >> > + var response = reply.responseJSON;
>>>>>> >> > +
>>>>>> >> > + $(spec.clientId).update("");
>>>>>> >> > +
>>>>>> >> > + Tapestry.loadScriptsInReply(response, function()
{
>>>>>> >> > + loading = false;
>>>>>> >> > + loaded = true;
>>>>>> >> > + expanded = true;
>>>>>> >> > + selected = !selected;
>>>>>> >> > + });
>>>>>> >> > + }
>>>>>> >> > +
>>>>>> >> > function doLoad() {
>>>>>> >> > if (loading)
>>>>>> >> > return;
>>>>>> >> >
>>>>>> >> > loading = true;
>>>>>> >> >
>>>>>> >> > - $(spec.clientId).addClassName("t-empty-node");
>>>>>> >> > + if(spec.expandChildrenURL)
>>>>>> >> > + {
>>>>>> >> > +
>>>>>> >> $(spec.clientId).addClassName("t-empty-node");
>>>>>> >> > + }
>>>>>> >> > + else
>>>>>> >> > + {
>>>>>> >> > +
>>>>>> >>
>>>>>>
>>>>
>> $(spec.clientId).next("span.t-tree-label").addClassName("t-selected-leaf-node-label");
>>>>>> >> > + }
>>>>>> >> > $(spec.clientId).update("<span
>>>>>> >> class='t-ajax-wait'/>");
>>>>>> >> >
>>>>>> >> > - Tapestry.ajaxRequest(spec.expandChildrenURL,
>>>>>> >> successHandler);
>>>>>> >> > + var requestURL = spec.expandChildrenURL?
>>>>>> >> spec.expandChildrenURL:spec.toggleLeafURL;
>>>>>> >> > +
>>>>>> >> > + var handler = spec.expandChildrenURL? successHandler:
>>>>>> >> toggleLeafHandler;
>>>>>> >> > +
>>>>>> >> > + Tapestry.ajaxRequest(requestURL, handler);
>>>>>> >> > +
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > $(spec.clientId).observe("click", function(event) {
>>>>>> >> > @@ -117,6 +144,25 @@ T5.extendInitializer(function()
{
>>>>>> >> > return;
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> > + if(spec.toggleLeafURL)
>>>>>> >> > + {
>>>>>> >> > + var label =
>>>>>> $(spec.clientId).next("span.t-tree-label");
>>>>>> >> > +
>>>>>> >> > + if(selected)
>>>>>> >> > + {
>>>>>> >> > +
>>>>>> label.removeClassName("t-selected-leaf-node-label");
>>>>>> >> > + }
>>>>>> >> > + else
>>>>>> >> > + {
>>>>>> >> > +
>>>>>> label.addClassName("t-selected-leaf-node-label");
>>>>>> >> > + }
>>>>>> >> > + selected = !selected;
>>>>>> >> > +
>>>>>> >> > + Tapestry.ajaxRequest(spec.toggleLeafURL, {});
>>>>>> >> > +
>>>>>> >> > + return;
>>>>>> >> > + }
>>>>>> >> > +
>>>>>> >> > // Children have been loaded, just a matter of
>>>>>> >> toggling
>>>>>> >> > // between showing or hiding the children.
>>>>>> >> >
>>>>>> >> >
>>>>>> >> > 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=1142070&r1=1142069&r2=1142070&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
>>>>>> >> Fri Jul 1 20:24:03 2011
>>>>>> >> > @@ -19,10 +19,6 @@ import org.testng.annotations.Test
>>>>>> >> >
>>>>>> >> > class TreeTests extends SeleniumTestCase
>>>>>> >> > {
>>>>>> >> > - /**
>>>>>> >> > - * Haven't figured out how to get Selenium to click
the actual
>>>>>> >> elements, never mine
>>>>>> >> > - * coordinate the wait for the Ajax. So far its just
been manual
>>>>>> >> testing.
>>>>>> >> > - */
>>>>>> >> > @Test
>>>>>> >> > void basics() {
>>>>>> >> >
>>>>>> >> > @@ -32,20 +28,41 @@ class TreeTests extends SeleniumTestCase
>>>>>> >> >
>>>>>> >> > clickAndWait "link=clear expansions"
>>>>>> >> >
>>>>>> >> > - if (false) {
>>>>>> >> > - click "//span[@class='t-tree-icon'][2]"
>>>>>> >> > + //Click on Games
>>>>>> >> > + click "//div[@class='t-tree-container
>>>>>> >> test-hook']/ul/li[2]/span[@class='t-tree-icon']"
>>>>>> >> >
>>>>>> >> > - sleep 100
>>>>>> >> > + waitForCSSSelectedElementToAppear "span.t-tree-expanded"
>>>>>> >> >
>>>>>> >> > - click "//span[@class='t-tree-icon'][3]"
>>>>>> >> > + assertTextPresent "Board Games"
>>>>>> >> >
>>>>>> >> > - sleep 100
>>>>>> >> > + //Click on Board Games
>>>>>> >> > + click "//div[@class='t-tree-container
>>>>>> >> test-hook']/ul/li[2]/ul/li/span[@class='t-tree-icon']"
>>>>>> >> >
>>>>>> >> > - assertTextPresent "Agricola"
>>>>>> >> > + //Assert the leafs are displayed
>>>>>> >> > + waitForCondition "window.\$\$(\"span.t-leaf-node\").size()
>=
>>>>>> >> 5", "45000"
>>>>>> >> >
>>>>>> >> > - clickAndWait "link=Redraw"
>>>>>> >> > + clickAndWait "link=Redraw"
>>>>>> >> >
>>>>>> >> > - assertTextPresent "Agricola"
>>>>>> >> > - }
>>>>>> >> > + assertTextPresent "Settlers of Catan", "Agricola"
>>>>>> >> > + }
>>>>>> >> > +
>>>>>> >> > + @Test
>>>>>> >> > + void selectLeaf() {
>>>>>> >> > +
>>>>>> >> > + openBaseURL()
>>>>>> >> > +
>>>>>> >> > + clickAndWait "link=Tree Component Demo"
>>>>>> >> > +
>>>>>> >> > + clickAndWait "link=clear expansions"
>>>>>> >> > +
>>>>>> >> > + click "//span[@class='t-tree-icon']"
>>>>>> >> > +
>>>>>> >> > + waitForCSSSelectedElementToAppear "span.t-leaf-node"
>>>>>> >> > +
>>>>>> >> > + assertTextPresent "Oscar", "Gromit", "Max", "Roger",
"Cooper"
>>>>>> >> > +
>>>>>> >> > + click "//span[@class='t-tree-icon t-leaf-node']"
>>>>>> >> > +
>>>>>> >> > + waitForCSSSelectedElementToAppear
>>>>>> >> "span.t-selected-leaf-node-label"
>>>>>> >> > }
>>>>>> >> > }
>>>>>> >> >
>>>>>> >> >
>>>>>> >> >
>>>>>> >>
>>>>>> >>
>>>>>> >>
>>>>>> >> --
>>>>>> >> Howard M. Lewis Ship
>>>>>> >>
>>>>>> >> Creator of Apache Tapestry
>>>>>> >>
>>>>>> >> The source for Tapestry training, mentoring and support.
Contact me
>> to
>>>>>> >> learn how I can get you up and productive in Tapestry fast!
>>>>>> >>
>>>>>> >> (971) 678-5210
>>>>>> >> http://howardlewisship.com
>>>>>> >>
>>>>>> >>
>> ---------------------------------------------------------------------
>>>>>> >> To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
>>>>>> >> For additional commands, e-mail: dev-help@tapestry.apache.org
>>>>>> >>
>>>>>> >>
>>>>>> >
>>>>>> >
>>>>>> > --
>>>>>> > Best regards,
>>>>>> >
>>>>>> > Igor Drobiazko
>>>>>> > http://tapestry5.de
>>>>>> >
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
>>>>>> For additional commands, e-mail: dev-help@tapestry.apache.org
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Best regards,
>>>>>
>>>>> Igor Drobiazko
>>>>> http://tapestry5.de
>>>>
>>>
>>>
>>>
>>> --
>>> Howard M. Lewis Ship
>>>
>>> Creator of Apache Tapestry
>>>
>>> The source for Tapestry training, mentoring and support. Contact me to
>>> learn how I can get you up and productive in Tapestry fast!
>>>
>>> (971) 678-5210
>>> http://howardlewisship.com
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: dev-help@tapestry.apache.org
>>>
>>
>
>
>
> --
> Howard M. Lewis Ship
>
> Creator of Apache Tapestry
>
> The source for Tapestry training, mentoring and support. Contact me to
> learn how I can get you up and productive in Tapestry fast!
>
> (971) 678-5210
> http://howardlewisship.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: dev-help@tapestry.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org


Mime
View raw message