For our tree, we render the entire tree on every request, so that the
user could expand/collapse it as far as they like w/o a reload.

Originally, we built flags into the model such that you could declare
certain leaves to reload the page if expanded.  This way, if you had a
huge tree, you didn't have to render it all at once.  It was sort of a
compromise between a strictly server-side and client-side tree.


On Mon, 07 Feb 2005 00:47:14 +0100, Oliver Rossmueller
<[EMAIL PROTECTED]> wrote:
> Sean,
> 
> maintaining the expanded state adds a requirement to the node objects
> that is not necessary from my POV. This is pure presentation stuff so
> why should we annoy the implementer of the model with that kind of
> things. In fact it would be nice to use the 'rendered' attribute. But if
> the consequence is that I have to deal with presentation stuff in the
> model than it's a -1 for me. Just because it's in Bergsten's book makes
> this no better to me.
> 
> The condition part of a rendering rule as proposed is just optional and
> can be used for more complex rendering logic. I think the rule syntax is
> quite straightforward and even more explicit than the proposed facet
> naming scheme. Even if you are not familiar with the tree component you
> will get an understanding of what happens.
> 
> Besides, if you don't like IconProvider and don't like rules and
> conditions, too, so where in the new tree should I place my icon logic?
> I'm also currious about how the client-side node expansion will work. I
> suppose we have to render the complete tree from the root node down to
> any leaf to some kind of javascript datastructure you can deal with in
> the browser. So how does the icon logic fit in there? And how will the
> client-side tree state be synchronized with the server-side tree
> component state?
> 
> Oliver
> 
> 
> Sean Schofield wrote:
> 
> >Oliver,
> >
> >The rendering rule is an interesting concept.  This idea (or a
> >variation of it) might work.  I still find myself wondering if we
> >can't make this simpler by avoiding introducing these rules and
> >conditions into the mix.
> >
> >Take this simple example:
> >
> ><f:facet name="foo-folder">
> >  <h:panelGroup>
> >    <h:commandLink immediate="true" action="#{t.toggleExpanded}">
> >      <h:graphicImage value="folder-open.png"
> >rendered="#{node.expanded}" border="0"/>
> >      <h:graphicImage value="folder-closed.png"
> >rendered="#{!node.expanded}" border="0"/>
> >    </h:commandLink>
> >    <h:outputText value="#{node.description}" styleClass="nodeFolder"/>
> >  </h:panelGroup>
> ></f:facet>
> >
> >Now I know you mentioned that you are not wild about having info on
> >the nodes expansion state in the node.  I thought the same thing but I
> >changed my mind slightly after thinking about it and reading up on
> >Bergsten's O'Reilly example.
> >
> >What I've done so far is to have setExpanded and isExpanded as part of
> >the TreeNode interface.  This makes the JSF *much* simpler to code,
> >plus you can take advantage of the existing rendered attribute which
> >is already well known to users.
> >
> >The reason why I feel this is ok is because the end user only is
> >responsible for populating the nodes other data.  They do not have to
> >(nor should they) specify the node expansion state.
> >
> >In my initial pass of the HtmlTree code I store the expand/collapse
> >info in a HashSet that is part of the HtlmTree component.  HtmlTree
> >calls setExpanded on each node before its rendered by checking this
> >information.  You can continually update your data model on each post
> >(assuming its a request scope bean) and expand/collapse status of each
> >of the nodes is restored along with the component tree.
> >
> >What do you think about this approach?  I think it simplifies things
> >without requiring the node to maintain the expand/collapse info
> >between requests.  These methods are just there to assist in
> >rendering.  We could consider something along the lines you are
> >proposing but I am not sure it will be necessary.
> >
> >sean
> >
> >
> >On Sun, 06 Feb 2005 15:26:32 +0100, Oliver Rossmueller
> ><[EMAIL PROTECTED]> wrote:
> >
> >
> >>Sean,
> >>
> >>I don't like to have information like if a node is expanded or not in
> >>the tree data. I was reflecting on that topic and following idea came to
> >>my mind: what about introducing a rendering rule component.
> >>
> >>  <x:tree value="#{treeData}" var="node">
> >>    <x:treeRenderingRule branch="true" expanded="true">
> >>        <h:graphicImage value="open-folder.gif"/>
> >>        <h:outputText value="#{node.description}"/>
> >>    </x:treeRenderingRule>
> >>    <x:treeRenderingRule branch="true" expanded="false">
> >>        <h:graphicImage value="closed-folder.gif"/>
> >>        <h:outputText value="#{node.description}"/>
> >>    </x:treeRenderingRule>
> >>    <x:treeRenderingRule branch="false">
> >>        <h:graphicImage value="document.gif"/>
> >>        <h:commandLink immediate="true" value="#{node.description}"/>
> >>    </x:treeRenderingRule>
> >>  </x:tree>
> >>
> >>This way we don't have to expose the expanded/collapsed state. And we
> >>can make the rules even more flexible:
> >>
> >>  <x:tree value="#{treeData}" var="node">
> >>    <x:treeRenderingRule branch="true" expanded="true" 
> >> condition="#{node.locked}">
> >>        <h:graphicImage value="open-folder-locked.gif"/>
> >>        <h:outputText value="#{node.description}"/>
> >>    </x:treeRenderingRule>
> >>    <x:treeRenderingRule branch="true" expanded="false" 
> >> condition="#{node.locked}">
> >>        <h:graphicImage value="closed-folder-locked.gif"/>
> >>        <h:outputText value="#{node.description}"/>
> >>    </x:treeRenderingRule>
> >>    <x:treeRenderingRule branch="true" expanded="true">
> >>        <h:graphicImage value="open-folder.gif"/>
> >>        <h:outputText value="#{node.description}"/>
> >>    </x:treeRenderingRule>
> >>    <x:treeRenderingRule branch="true" expanded="false">
> >>        <h:graphicImage value="closed-folder.gif"/>
> >>        <h:outputText value="#{node.description}"/>
> >>    </x:treeRenderingRule>
> >>    <x:treeRenderingRule leaf="true">
> >>        <h:graphicImage value="document.gif"/>
> >>        <h:commandLink immediate="true" value="#{node.description}"/>
> >>    </x:treeRenderingRule>
> >>  </x:tree>
> >>
> >>Logic is that a rule with a condition is evaluated before a rule without
> >>a condition, and rules with a condition are evaluated in the order they
> >>are defined. I guess most use cases can be handled this way, even the
> >>ones I need an IconProvider for at the moment.
> >>
> >>Oliver
> >>
> >>
> >>Sean Schofield wrote:
> >>
> >>
> >>
> >>>I wanted to start a new thread concerning some of the progress I have
> >>>been making with the new tree component.
> >>>
> >>>The first bit of news is that I discovered that Hans Bergsten, author
> >>>of the  O'Reilly JSF book, has a fairly complete example of a custom
> >>>tree component.  Its been simplified somewhat but it did manage to
> >>>solve a few of the problems I was grappling with.  Also, it used a
> >>>similar approach to some of the ideas that I have proposed on this
> >>>list.  I contacted Hans and he gave me permission to use portions of
> >>>his code in the new component.
> >>>
> >>>I've also given some more thought to how the JSF tags should work.
> >>>Here is a revised example.
> >>>
> >>> <x:tree value="#{treeData}" var="node">
> >>>   <f:facet name="branch">
> >>>     <h:panelGroup>
> >>>       <h:graphicImage value="open-folder.gif"
> >>>rendered="#{treeData.nodeExpanded}"/>
> >>>       <h:graphicImage value="closed-folder.gif"
> >>>rendered="#{!treeData.nodeExpanded}"/>
> >>>       <h:outputText value="#{node.description}"/>
> >>>     </h:panelGroup>
> >>>   </f:facet>
> >>>   <f:facet name="leaf">
> >>>     <h:panelGroup>
> >>>       <h:graphicImage value="document.gif"/>
> >>>       <h:commandLink immediate="true" value="#{node.description}"/>
> >>>     </h:panelGroup>
> >>>   </f:facet>
> >>> </x:tree>
> >>>
> >>>The major change is that I've consolidated the "open" and "close"
> >>>graphic images into a single panel group.  I've added a
> >>>getNodeExpanded method to the the TreeModel so that you can render the
> >>>appropriate image.  I also enclose everything in the facet inside a
> >>>panel group.  I discovered this was necessary after some testing (I
> >>>guess facet can only handle a single child).
> >>>
> >>>If you look at all of the options this gives you, it doesn't seem like
> >>>an IconProvider is necessary.  You've go the "var" attribute which you
> >>>can combine with existing attributes like "rendered" and "disabled".
> >>>You should be able to use backing beans and/or subclass of TreeNode to
> >>>get all of the behavior that Oliver mentioned in his use case (locked
> >>>node, etc.)
> >>>
> >>>I personally like specifying the image file and location right on the
> >>>jsp page.  I am not really wild about burying the details of the
> >>>images in some class somewhere.  It seems like we could avoid this
> >>>with the solution I am proposing.
> >>>
> >>>I am working on an initial version of the tree to check in (see
> >>>earlier email on the dev list).  It should be ready by the end of next
> >>>week.  It will contain a very solid starting point for people to
> >>>evaluate and make suggestions.  It probably will not have any of the
> >>>expand collapse features for another few weeks but it will be coming
> >>>shortly.
> >>>
> >>>I think this is going to be a sweet little JSF component.  I already
> >>>know it works and looks great in its current incarnation as a Tiles
> >>>component.  Now I am starting to get excited about how it will work in
> >>>JSF.  Also, I am getting an increasing appreciation for how powerful
> >>>of a framework JSF really is.
> >>>
> >>>Looking forward to your feedback,
> >>>
> >>>sean
> >>>
> >>>
> >>>
> >>>
> >>--
> >>Oliver Rossmueller
> >>Software Engineer and IT-Consultant
> >>Hamburg, Germany
> >>http://www.rossmueller.com
> >>
> >>
> >>
> >>
> 
> --
> Oliver Rossmueller
> Software Engineer and IT-Consultant
> Hamburg, Germany
> http://www.rossmueller.com
> 
> 


-- 
-Heath Borders-Wing
[EMAIL PROTECTED]

Reply via email to