Hi all,
 
We have tried to extend x:tree2 to:
- insert x:tree2 in a tiles layout of Struts (using struts-faces)
- invoke Struts action
- hold focus on the node selected
- select a specified node on re-init (commented)
- manage dynamic model (add/remove node) (commented)
 
We don't understand why all runs very well with Mozilla Firefox and
NOT with MS-IExplore.
 
We obtain or a java.lang.IllegalArgumentException: Node with id 0:6. Failed to parse 0:6
or a NullPointerException on UITreeData.setNodeId.
 
Thanks in advance!
 
Pier Paolo.
 
Here is the code implemented:
 
  <x:tree2 value="#{presentationData.treeData}" id="server-tree" var="node"
           varNodeToggler="t" clientSideToggle="false" showRootNode="false">
    <f:facet name="base">
      <h:panelGroup>
        <h:outputText value="#{node.description}"/>
      </h:panelGroup>
    </f:facet>
    <f:facet name="root">
      <h:panelGroup>
        <h:commandLink action="" immediate="true" actionListener="#{t.setNodeSelected}">
          <h:graphicImage value="/images/root.gif" border="0"/>
          <h:outputText value="#{node.description}" styleClass="#{t.nodeSelected ? 'nodeFolderSelected':''}"/>
        </h:commandLink>
      </h:panelGroup>
    </f:facet>
    <f:facet name="folder">
      <h:panelGroup>
        <h:commandLink action="" immediate="true" actionListener="#{t.setNodeSelected}">
          <h:graphicImage value="/images/folder-open.gif" rendered="#{t.nodeExpanded}" border="0"/>
          <h:graphicImage value="/images/folder-closed.gif" rendered="#{!t.nodeExpanded}" border="0"/>
          <h:outputText value="#{node.description}" styleClass="#{t.nodeSelected ? 'nodeFolderSelected':''}"/>
        </h:commandLink>
      </h:panelGroup>
    </f:facet>
  </x:tree2>
--------------------------------------------------------------------------------
 
package it.noema.faces.custom.tree2;
 
import it.noema.faces.bean.PresentationDTO;
import it.noema.faces.controller.TreeController;
import it.noema.faces.util.PresentationUtil;
import it.noema.ged.model.Composite;
 
import java.io.IOException;
import java.util.Map;
 
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class HtmlTree extends org.apache.myfaces.custom.tree2.HtmlTree {
 
 private static final Log logger = LogFactory.getLog(HtmlTree.class);
 
 private static final String NODE_SELECTED_KEY = "org.apache.myfaces.tree.NODE_SELECTED_KEY";
 
 //
 // public static final String REINIT_KEY = "org.apache.myfaces.tree.REINIT_KEY";
 // private static final String NODE_STATE_KEY = "org.apache.myfaces.tree.NODE_STATE_KEY";
 //
 
 
 private String _selectedNodeId;
 private TreeController treeController = null;
 
 public HtmlTree() {
  super();
  treeController = new TreeController();
 }
 
 public void restoreState(FacesContext context, Object state) {
 
  Object[] values = (Object[]) state;
  if (logger.isDebugEnabled()) {
   logger.debug("[restoreState] Selected ID: " + values[3]);
  }
  super.restoreState(context, state);
  _selectedNodeId = (String) values[3];
 }
 
 public Object saveState(FacesContext context) {
  Object values[] = (Object[]) super.saveState(context);
  values[3] = _selectedNodeId;
  if (logger.isDebugEnabled()) {
   logger.debug("[saveState] Selected ID: " + values[3]);
  }
  return values;
 }
 
 public void setNodeSelected(ActionEvent event) {
  if (logger.isDebugEnabled()) {
   logger.debug("[setNodeSelected] ID: " + getNodeId());
  }
  _selectedNodeId = getNodeId();
  ExternalContext externalContext = getFacesContext().getExternalContext();
  externalContext.getSessionMap().put(NODE_SELECTED_KEY + ":" + getId(), _selectedNodeId);
 
  /* *********************************** */
  /* TEMPORARY SOLUTION                  */
  /* *********************************** */
  // TODO: FIND BETTER SOLUTION TO ABSTRACTION
  GeDocTreeNode node = (GeDocTreeNode) getNode();
  if (logger.isDebugEnabled()) {
   logger.debug("[setNodeSelected] Nodo selezionato: " + node.getDescription());
  }
  PresentationDTO presentationDTO = PresentationUtil.getPresentationData((HttpServletRequest) externalContext
    .getRequest());
  presentationDTO.setModelNodeSelected((Composite) node.getModelNode());
  presentationDTO.setSelectedRow(null);
 }
 
 public boolean isNodeSelected() {
  boolean b = getNodeId().equals(_selectedNodeId);
 
  if (logger.isDebugEnabled()) {
   logger.debug("[isNodeSelected] ID[" + getNodeId() + "] selected[" + b + "]");
  }
  return b;
 }
 
 public void encodeBegin(FacesContext context) throws IOException {
 
  Map sessionMap = context.getExternalContext().getSessionMap();
  
  /* **************************** */
  /* IS NOT BETTER SOLUTION       */
  /* **************************** */
  //ReinitTree reinitTree = (ReinitTree) sessionMap.get(REINIT_KEY);
 

  //
  //if (reinitTree != null && reinitTree.isReinit()) {
  // if (logger.isDebugEnabled()) {
  //  logger.debug("[encodeBegin] Eseguo il reinit: " + reinitTree);
  // }
        //
  // _selectedNodeId = reinitTree.getSelectedNodeId();
  // sessionMap.put(NODE_SELECTED_KEY + ":" + getId(), _selectedNodeId);
  // sessionMap.put(NODE_STATE_KEY + ":" + getId(), reinitTree.getOpenedNodeIds());
  // sessionMap.remove(REINIT_KEY);
  //} else {
  //
   String nodeSelected = (String) sessionMap.get(NODE_SELECTED_KEY + ":" + getId());
 
   if (nodeSelected != null && _selectedNodeId == null) {
    _selectedNodeId = nodeSelected;
    if (logger.isDebugEnabled()) {
     logger.debug("[encodeBegin] ID: " + _selectedNodeId);
    }
   }
  //
  //}
  //
 
  super.encodeBegin(context);
 }
 
 public String toggleExpanded() {
  super.toggleExpanded();
  treeController.selectNode();
  return null;
 }
}
 

--------------------------------------------------------------------------------
package it.noema.faces.custom.tree2;
 
import it.noema.ged.model.Model;
 
import org.apache.myfaces.custom.tree2.TreeNodeBase;
 
public class GeDocTreeNode extends TreeNodeBase {
 
 private Model modelNode;
 
 public GeDocTreeNode() {
  super();
 }
 
 public GeDocTreeNode(String type, String description, boolean leaf) {
  super(type, description, leaf);
 }
 
 public GeDocTreeNode(String type, String description, String identifier, boolean leaf) {
  super(type, description, identifier, leaf);
 }
 
 public GeDocTreeNode(String type, String description, String identifier, Model modelNode, boolean leaf) {
  super(type, description, identifier, leaf);
  this.modelNode = modelNode;
 }
 
 public Model getModelNode() {
  return modelNode;
 }
 
 public void setModelNode(Model modelNode) {
  this.modelNode = modelNode;
 }
}
--------------------------------------------------------------------------------
 
package it.noema.faces.controller;
 
import it.noema.faces.util.NavigationUtil;
 
import javax.faces.context.FacesContext;
 
public class TreeController {
 
 public String selectNode() {
  FacesContext context = FacesContext.getCurrentInstance();
  StringBuffer url = "" StringBuffer();
  url.append("/geDocSelectNode.do");
  NavigationUtil.forward(context, url.toString());
  return null;
 }
}
 
--------------------------------------------------------------------------------
 
package it.noema.faces.util;
 
import java.io.IOException;
 
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class NavigationUtil {
 private static final Log logger = LogFactory.getLog(NavigationUtil.class);
 
 public static void forward(FacesContext context, String url) {
 
  if (logger.isInfoEnabled()) {
   logger.info("[forward] Forward to [" + url + "]");
  }
  try {
   context.getExternalContext().dispatch(url);
  } catch (IOException e) {
   throw new FacesException(e);
  } finally {
   context.responseComplete();
  }
 
 }
}
 
--------------------------------------------------------------------------------

Reply via email to