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)
- 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.
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.
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>
--------------------------------------------------------------------------------
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 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 java.util.Map;
import
javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
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;
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 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;
private TreeController treeController = null;
public
HtmlTree() {
super();
treeController = new TreeController();
}
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];
}
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;
}
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);
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);
}
/* 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);
boolean b = getNodeId().equals(_selectedNodeId);
if
(logger.isDebugEnabled()) {
logger.debug("[isNodeSelected] ID[" + getNodeId() + "] selected[" + b + "]");
}
return b;
}
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);
/* **************************** */
/* 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);
}
}
//
//}
//
_selectedNodeId = nodeSelected;
if (logger.isDebugEnabled()) {
logger.debug("[encodeBegin] ID: " + _selectedNodeId);
}
}
//
//}
//
super.encodeBegin(context);
}
}
public String toggleExpanded()
{
super.toggleExpanded();
treeController.selectNode();
return null;
}
}
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();
}
super();
}
public GeDocTreeNode(String type, String description, boolean leaf)
{
super(type, description, leaf);
}
super(type, description, leaf);
}
public GeDocTreeNode(String type, String description, String
identifier, boolean leaf) {
super(type, description, identifier, 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;
}
super(type, description, identifier, leaf);
this.modelNode = modelNode;
}
public Model getModelNode() {
return modelNode;
}
return modelNode;
}
public void setModelNode(Model modelNode)
{
this.modelNode = 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;
}
}
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 javax.faces.context.FacesContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.LogFactory;
public class NavigationUtil {
private static final Log logger = LogFactory.getLog(NavigationUtil.class);
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();
}
logger.info("[forward] Forward to [" + url + "]");
}
try {
context.getExternalContext().dispatch(url);
} catch (IOException e) {
throw new FacesException(e);
} finally {
context.responseComplete();
}
}
}
}
--------------------------------------------------------------------------------

