Folks,
         I have developed a Tapestry app (4.0.1) that uses the Tree in four 
places. It works great in three of those places but not in the one that 
includes a checkbox on each node of the tree. The problem is that it loses 
track of the indent and gives all nodes of the tree the same indent as the 
right-most node. So, as the user opens each node, the tree marches from left to 
right. In short, it looks like hell. I've looked at the generated source but it 
just piles on divs and spans to get the indent. The margin indent, in short, is 
broken when you have to enclose a tree in a FORM. Any suggestions? Here is my 
code. 
                                                              Thank you,
                                                                          Ty


Files included:

userEnterprises.page
userEnterprises.html
UserEnterprises.java

-------------------------------------------------------------------
userEnterprises.page
-------------------------------------------------------------------

<page-specification class="com.tyco.web.pages.authorization.UserEnterprises">
  
    <description>Tree</description>
      <property name="item" />
        <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/>
        
        <component id="tree" type="tacos:Tree">
          <binding name="value"               value="item"/>
          <binding name="nodeLinkAjax"   value="ognl:false" />
          <binding name="evenOdd"          value="ognl:page.beans.evenOdd" />
          <binding name="rowStyle"          value="ognl:beans.evenOdd"/>   
          <binding name="state"                value="enterpriseTreeState"/>
        </component>
        
  <component id="submitEditUserUpdateEnterprises" type="ClickSubmit">
    <binding name="selected" value="submitAction"/>
    <binding name="tag" value='"EDIT_USER_UPDATE_ENTERPRISES"'/>
  </component>
  
  <component id="submitCancel" type="ClickSubmit">
    <binding name="selected" value="submitAction"/>
    <binding name="tag" value='"CANCEL"'/>
  </component>

</page-specification>


-------------------------------------------------------------------
userEnterprises.html
-------------------------------------------------------------------

              <table width="90%" class="body" border="1">  
                <TR>
                  <TD>
                    <div 
                      jwcid="tree" 
                      id="tree" 
                      keyProvider="ognl:keyProvider"
                      contentProvider="ognl:contentProvider"                    
                                      
                      style="overflow: auto; width: auto; height: auto;">
                      <span jwcid="@If" condition="ognl:item.id" 
conditionValue="true">
                        <input jwcid="[EMAIL PROTECTED]" 
value="ognl:item.checked" />
                      </span>
                      <span jwcid="@If" condition="ognl:item.active" 
conditionValue="ognl:true">
                        <span style="color:black"><span jwcid="@Insert" 
value="ognl:item.name"/></span>
                      </span>
                      <span jwcid="@Else">
                        <span style="color:gray"><span jwcid="@Insert" 
value="ognl:item.name"/></span>
                      </span>
                    </div>
                  </TD>
                </TR>                            
              </TABLE>


-------------------------------------------------------------------
UserEnterprises.java

     (I doubt this class will we useful in solving this problem
     but just in case I am doing so for completeness.)
-------------------------------------------------------------------

/*
 * Created on Jan 17, 2006
 *
 * Copyright 2005 Ingenix, Inc. All rights reserved.
 * This file contains CONFIDENTIAL and PROPRIETARY information
 * and should not be distributed without prior written permission.
 */
package com.ingenix.freya.web.pages.authorization;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.annotations.InjectState;
import org.apache.tapestry.event.PageBeginRenderListener;
import org.apache.tapestry.event.PageEvent;

import com.tyco.api.authorization.AuthorizationFactory;
import com.tyco.api.authorization.User;
import com.tyco.api.enterprise.Enterprise;
import com.tyco.web.components.authorization.AuthenticationListComponentBase;
import com.tyco.web.components.enterprise.EnterpriseTreeContentProvider;
import com.tyco.web.components.enterprise.Folder;
import com.tyco.web.components.enterprise.Item;

public abstract class UserEnterprises extends UserControllerPage implements 
PageBeginRenderListener
{
  private List mPermissions;
  private Enterprise mEnterprise;  

  @InjectState( "contentProvider" )
  public abstract EnterpriseTreeContentProvider getContentProvider();
  public abstract void setContentProvider( EnterpriseTreeContentProvider 
pEnterpriseTreeContentProvider );    
    
  @InjectState( "enterpriseTreeState" )
  public abstract Set<Long> getEnterpriseTreeState();
  public abstract void setEnterpriseTreeState( Set pEnterpriseTreeState );
  
  @InjectState("newUser")
  public abstract User getNewUser();
  public abstract void setNewUser(User val);
  
  public abstract Long getID();
  
  protected Log mLog = LogFactory.getLog(this.getClass().getName());
  
  public void pageBeginRender(PageEvent pEvent)
  {
    detectCheckedEnterprises( getNewUser() );
  }
  
  public void activate(IRequestCycle pCycle) 
  {     
       Object[] parameters = pCycle.getListenerParameters();
            
       if (parameters.length >= 2)
      {      
          Long userID = (Long) parameters[1];
          User user         = getAuthorizationService().getUserByID(userID);
          setNewUser(user);
          List permissionList = getUserPermissions(user);
          setPermissions(permissionList);
      }
      // If Errors found then we need to keep user data with the error for 
redisplay
      else if ((getErrorMessage() == null)  && (getPasswordError() == null))
     {
        setNewUser(AuthorizationFactory.newUser());
     }  
}
        
  /**
   * Although the superclass has its own save() method, 
   * we need to override it here so that we can get capture
   * the checked enterprises. It is critical that we do not
   * execute the superclass save().
   */
  public void save()
  {
    IRequestCycle pCycle = this.getRequestCycle();
    
    if( ACTION_EDIT_USER_UPDATE_ENTERPRISES.equals( getSubmitAction() ) )
    {
      EnterpriseTreeContentProvider contentProvider = getContentProvider();
      List treeRoots = contentProvider.getTreeRoots();
      List<Long> enterpriseIds = determineCheckedEnterprises( treeRoots );
      
      if( this.getRequestCycle().isRewinding() )
      {
        getAuthorizationService().assignEnterprisesToUser( enterpriseIds, 
getNewUser().getID() );
        Long idOfUpdatedUser = getNewUser().getID();
        User updatedUser = getAuthorizationService().getUserByID( 
idOfUpdatedUser );
        setNewUser( updatedUser );
        
        pCycle.activate( AuthenticationListComponentBase.TARGET_EDIT_USER );
      }
    }
    else if( ACTION_CANCEL.equals( getSubmitAction() ) )
    {
      pCycle.activate( AuthenticationListComponentBase.TARGET_EDIT_USER );
    }
 
  }
  
  public List<Long> determineCheckedEnterprises( List pTreeRoots )
  {
    List<Long> checkedEnterprises = new ArrayList<Long>();
    
    addChildNodes( pTreeRoots, checkedEnterprises );
    
    return checkedEnterprises;
  }
  
  
  public void addChildNodes( List pFolderItems, List<Long> pCheckedEnterprises )
  {
    Iterator iterator = pFolderItems.iterator();
    while( iterator.hasNext() )
    {
      Object obj = iterator.next();
      if( obj instanceof Folder )
      {
        Folder folder = (Folder) obj;
        if( folder.isChecked() )
        { 
          String stringID = folder.getId();
          pCheckedEnterprises.add( new Long( stringID ) );
        }
        List folderItems = folder.getItems();
        List folderFolders = folder.getFolders();
        
        if( folderItems.size() > 0 )
        {
          addChildNodes( folderItems, pCheckedEnterprises );
        }
        if( folderFolders.size() > 0 )
        {
          addChildNodes( folderFolders, pCheckedEnterprises );
        }
      }
      else if( obj instanceof Item )
      {
        Item item = (Item) obj;
        if( item.isChecked() )
        {
          String stringID = item.getId();
          pCheckedEnterprises.add(  new Long( stringID ) );
        }
      }
    }
  }
 
  
  public Enterprise getEnterprise()
  {
    return mEnterprise;
  }  
  public void setEnterprise( Enterprise pEnterprise )
  {
    mEnterprise = pEnterprise;
  }  
      
  public List getPermissions()
  {
    if (mPermissions == null)
    {
      mPermissions = new ArrayList();
    }
    return mPermissions;
  }
  public void setPermissions(List pPermissions)
  {
    mPermissions = pPermissions;
  }  

  
  
  public void detectCheckedEnterprises( User pUser )
  {
    EnterpriseTreeContentProvider tree = getContentProvider();
    if( tree == null )
    {
      initializeEnterpriseTreeContentProvider( getNewUser() );   
      tree = getContentProvider();
    }    
    
    // First, compile a Set of the user's enterprises
    List userEnts = pUser.getEnterprises();
    if( userEnts == null || userEnts.size() == 0)
    {
      return;
    }
    
    Iterator userIt = userEnts.iterator();
    Set<String> userEntSet = new HashSet<String>();
    while( userIt.hasNext() )
    {
      Enterprise userEnt = (Enterprise) userIt.next();
      userEntSet.add( userEnt.getName() );
    }
    
    // Next, go through the entepriseTree and display the user's checked 
enteprises
    List treeRoots = tree.getTreeRoots();
    Iterator it = treeRoots.iterator();
    
    while( it.hasNext() )
    {
      Object obj = it.next();
      
      if( obj instanceof Folder )
      {
        Folder aFolder = (Folder) obj;
        String folderName = aFolder.getName();
        
        if( userEntSet.contains( folderName ) )
        {
          aFolder.setChecked( true );
        }
        checkChildNodes( aFolder, userEntSet );
        
      }
      else if( obj instanceof Item )
      {
        Item anItem = (Item) obj;
        String itemName = anItem.getName();
        
        if( userEntSet.contains( itemName ) )
        {
          anItem.setChecked( true );
        }
      }      
    }
  }
  
  public void checkChildNodes( Folder pFolder, Set pUserEntSet )
  {
    List items = pFolder.getItems();
    Iterator it = items.iterator();
    
    while( it.hasNext() )
    {
      Item anItem = (Item) it.next();
      if( pUserEntSet.contains( anItem.getName() ) )
      {
        anItem.setChecked( true );
      }
    }
    
    List folders = pFolder.getFolders();
    Iterator itF = folders.iterator();
    
    while( itF.hasNext() )
    {
      Folder aFolder = (Folder) itF.next();
      if( pUserEntSet.contains( aFolder.getName() ) )
      {
        aFolder.setChecked( true );
      }
      checkChildNodes( aFolder, pUserEntSet );
    }    
  }
  
  /** This method added to assist mock testing. */
  public User getUserByID( Long pUserID )
  {
    return getAuthorizationService().getUserByID( pUserID );
  }
}





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to