You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Georg Füchsle <g....@safir-wid.de> on 2008/01/17 09:42:51 UTC

tomahawk tree2 with ajax4jsf open treeitems when rendering the site

I use tree2 with ajax4jsf following the example on 

http://www.jroller.com/plainoldweblog/entry/use_tomahawk_tree2_and_ajax4jsf

 

I extended the example using checkboxes in the tree items.

 

So far it is working fine.

 

Now I would like to open the tree items whose checkboxes are checked
automatically when rendering the site, so that all checked items are
visible, when the site is shown for the first time.

 

I tried to call the function 

treeModel.getTreeState().expandPath(nodePath):

after calculating the treeData, but without success.

 

Does anybody know, how to do?

 

 

This is my code:

 

 

<t:panelGroup id="nctreePanel" forceId="true">

  <t:tree2          id="nctree" 

                        value="#{treeNodeBaseEx.treeModel}" 

                        var="node" 

                        varNodeToggler="t" 

                        clientSideToggle="false" 

                        showRootNode="false" 

                        showNav="false" 

                        showLines="true">

    <f:facet name="folder">

            <t:panelGroup id="ncfolderPanelGroup" styleClass="treepanel2"
forceIdIndex="true">

            <!-- expand collapse -->

            <a4j:commandLink        id="ncexpandCollapseLink" 

 
immediate="true" 

 
rendered="#{!node.leaf and !t.nodeExpanded}" 

 
reRender="nctreePanel" 

 
action="#{t.toggleExpanded}" 

 
actionListener="#{treeNodeBaseEx.processToggle}">

 

                        <t:graphicImage url="#{t.nodeExpanded ?
'/img/tree/nav-plus.gif' : '/img/tree/nav-minus.gif' }"

 
styleClass="keinBorder" />

 

            </a4j:commandLink>

            <t:graphicImage  

 
url="#{t.nodeExpanded ? '/img/tree/nav-plus.gif' : (node.leaf
?'/img/tree/nav-empty.gif' : '/img/tree/nav-minus.gif') }" 

 
rendered="#{!(!node.leaf and !t.nodeExpanded)}"

 
styleClass="keinBorder"/>

            <t:selectBooleanCheckbox 

 
value="#{node.checked}" 

 
id="tcb4" 

 
valueChangeListener="#{node.valueChanged}"

 
immediate="true"/>

            <h:outputText value="#{node.description}"
title="#{node.description}"/>

            </t:panelGroup>

    </f:facet>

  </t:tree2>

</t:panelGroup>

 

 

 

And the backing bean:

 

 

 

 

public class TreeModelData 

{

            static Logger log_tech = Logger.getLogger(TreeModelData.class);

            private static String FACETTYPE = "DEFAULT_NODE";

            private static String FACETTYPENACE = "folder";

 

            private TreeModel treeModel; 

            private Map<String,Boolean> checkedItems;

            private boolean showPurpose; // Purposecodes oder Nacecodes
anzeigen?

 

            public TreeModelData()

            {

                        treeModel = null;

            }

            

 

            public Map<String, Boolean> getCheckedItems() 

            {

                        return checkedItems;

            }

 

 

            public void setCheckedItems(Map<String, Boolean> checkedItems) 
            {

                        this.checkedItems = checkedItems;

            }

            

 

            public boolean isShowPurpose() {

                        return showPurpose;

            }

 

 

 

            public void setShowPurpose(boolean showPurpose) {

                        this.showPurpose = showPurpose;

            } 

            

            

 

            /** * get folder tree model * @return TreeModel */

            public TreeModel getTreeModel() 

            { 

                        if(treeModel == null) 

                        { 

                                   ArrayList<String> toopennodes = new
ArrayList<String>();

                                   

                                   IEfgCodeName [] values = null;

                                   if(showPurpose)

                                   {

                                               IPurposecodes purp =
(IPurposecodes) JsfUtils.getMbPurposecodes().getData();

                                               if(purp != null)

                                                           values =
purp.getNameValuePaare(); 

                                   }

                                   else

                                   {

                                               INacecodes nace =
(INacecodes) JsfUtils.getMbNacecodes().getData();

                                               if(nace != null)

                                                           values =
nace.getNameValuePaare(); 

                                   }

                                   if((values != null) && (values.length >
0))

                                   {

                                               TreeNode root = new
TreeNodeBaseEx(FACETTYPENACE, "rootnode","0", false,checkedItems);

                                               treeModel = new
TreeModelBase(root);

 
if(addTreeNodes((TreeNodeBaseEx)root,values,toopennodes))

                                               {

                                                           // öffnen

                                                           String nodePath[]
= new String[toopennodes.size()];

                                                           for (int ons =
0;ons<toopennodes.size();ons++)

 
nodePath[ons] = toopennodes.get(ons);

 
treeModel.getTreeState().expandPath(nodePath);

                                               }

                                   }

 

                                   

                                   

 
treeModel.getTreeState().expandPath(nodePath):

                        } 

                        return treeModel; 

            }

            

            private boolean addTreeNodes(TreeNodeBaseEx
rootnode,IEfgCodeName []values,ArrayList<String> toopennodes)

            {

                        boolean checked = false;

                        if((values != null))

                        {

                                   List<TreeNodeBaseEx> li =
rootnode.getChildren();

                                   boolean subchecked = false;

                                   

                                   for(int i=0; i<values.length;i++)

                                   {

                                               subchecked = false;

                                               boolean blatt =
(values[i].getChildren() == null);

                                               String sid = "1";

                                               try

                                               {

                                                           sid =
Integer.toString(values[i].getId().getValue());

                                               }

                                               catch (Exception e) 

                                               {

 
log_tech.error("ungültige Nacecode-ID von Nacecode: " +
values[i].getName());

                                               }

                                               TreeNodeBaseEx item =  new
TreeNodeBaseEx(FACETTYPENACE, values[i].getName(),sid, blatt,checkedItems);

                                               toopennodes.add(sid);

                                               // jetzt der rekursive
Aufruf:

                                               subchecked =
addTreeNodes(item,values[i].getChildren(),toopennodes);

                                               li.add(item);

 

                                               if(item.isChecked() ||
subchecked)

                                               {

                                                           checked = true;

                                               }

                                               else

 
toopennodes.remove(sid);

                                   }

                        }

                        

                        return checked;

            }

            

            

            

            /** * This method listens to expand and collapse folder events.
* @param p_event */ 

            public void processToggle(ActionEvent p_event) 

            { 

                        UIComponent component = (UIComponent)
p_event.getSource();

                        while (!(component != null && component instanceof
HtmlTree))

                        { 

                                   component = component.getParent(); 

                        } 

                        

                        if (component != null) 

                        { 

                                   // hier alle (sichtbaren!)
checkButton-Werte speichern!

//                                 UIComponent cb =
component.findComponent("__treecb");

//
cb.processUpdates(FacesContext.getCurrentInstance());

                                   HtmlTree tree = (HtmlTree) component; 
                                   TreeNodeBaseEx node =
(TreeNodeBaseEx)tree.getNode();

                                   boolean expanded = tree.isNodeExpanded();

                                   if(!expanded)

                                   {

                                               // vor dem serverseitigem
öffnen eines Astes:

                                               // wenn ein tree aufgemacht
wird, muss ich prüfen ob evtl. vorher das Kreuzchen eines Vaters entfernt
worden ist!

                                                if(!node.isChecked())

                                                {

                                                            // dann
sicherstellen, dass auch die Kreuzchen der Kinder entfernt werden!

 
node.uncheckChildren();

                                                }

                                   }

                                   

                                   

                                   if (expanded) 

                                   { 

                                               loadChildren(node); 

                                   } 

                                   else 

                                   {

                                               // das Löschen der Kinder ist
nicht notwendig; sie können am Client bleiben!

                                               // wenn ja, muss ich dann
hier die Daten speichern?

                                               //unloadChildren(node); 

                                   } 

                        } 

            } 

            

            /** * when tree node is expanded, this method will load its
children * @param p_parentNode */

            public void loadChildren(TreeNode p_parentNode) 

            {

            } 

            

            /** 

             * * if you have large tree data you might want to clear out to
prevent out of memory 

             * * @param p_parentNode */ 

            private void unloadChildren(TreeNode p_parentNode) 

            { 

            }

            

}

 

 

 

Georg Füchsle

Tel.: 030 577 981 32

g.fuechsle@safir-wid.de

 

 



__________________________________________________
safir-Wirtschaftsinformationsdienst GmbH
Möllendorffstr. 49
10367 Berlin
Tel.: ++49 30 577981 - 0
Fax: ++49 30 577981 - 18
E-Mail: info@safir-wid.de
Internet: www.safir-wid.de

Handelsregister: Amtsgericht Charlottenburg HRB 66681
USt-ID: DE 193584747
Geschäftsführer: Thilo Kind