Hello, I am working on a web application. Everything is working fine. I just need a simple help. I have populated a tree using JSF/trinidad tree component. However, I want to expand the tree branches by clicking (+) sign and collapse the tree branches by clicking (-) sign. It's not working properly. What's happening is that, I have to click the (+) sign and then click the root node to expand the next branch. Similarly, While collapsing, I have to click the (-) sign and then click the child node to collapse it, but I want to expand/ collapse nodes by clicking (+) or (-) sign.
My jsp side code: <trh:cellFormat valign="top"> <tr:panelHeader> <script type="text/javascript" src="CollapsibleLists.js"></script> <tr:tree var="node" value="#{fileTreeHandler.treeModel}"> <f:facet name="nodeStamp"> <tr:panelGroupLayout> <tr:commandLink text = "#{node.description}" actionListener="#{fileTreeHandler.downloadFile}"/> </tr:panelGroupLayout> </f:facet> </tr:tree> </tr:panelHeader> </trh:cellFormat> Here is the filetreehandler code: import org.acegisecurity.Authentication; import org.acegisecurity.context.SecurityContextHolder; import org.apache.log4j.Logger; import org.apache.myfaces.trinidad.component.core.data.CoreTree; import org.apache.myfaces.trinidad.event.FocusEvent; import org.apache.myfaces.trinidad.model.ChildPropertyTreeModel; import org.apache.myfaces.trinidad.model.RowKeySet; import org.apache.myfaces.trinidad.model.TreeModel; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * A Simple tree model used to create a graphical tree representation for a * given directory. * * @author Ric Smith, Oracle Corp. */ @SessionScoped public class FileTreeHandler implements Serializable { /** Apache tree model. */ private TreeModel treeModel; private static final long serialVersionUID = 1L; /** Was a node found. */ private boolean foundDirectory = false; //private RowKeySet disclosedEntries; private CoreTree tree; private Object clickedNodeRowKey; /** Logging for the class. */ private Logger logger = Logger.getLogger(this.getClass()); /** * Constructor. * Reads the given directory. * Sets the treeModel nodes for all files and directories in the * input directory. * * @param baseDirectory */ //RowKeySetImpl rowKeySet = new RowKeySetImpl(); public FileTreeHandler(String baseDirectory) { logger.debug("In constructor"); List<FileNode> nodes = new ArrayList<FileNode>(); Authentication authentic = SecurityContextHolder.getContext().getAuthentication(); String username = authentic.getName(); // Storing logged in username into String String dir = baseDirectory + "/" + username; FileNode rootNode = buildFileTree(dir); if (rootNode.getChildCount() == 0) { setFoundDirectory(false); } else { setFoundDirectory(true); } nodes.add(rootNode); treeModel = new ChildPropertyTreeModel(nodes, "children") { public boolean isContainer() { return ((FileNode) getRowData()).getChildCount() > 0; } }; //UIXHierarchy tree = (UIXHierarchy)treeModel.getRowData(); // RowKeySet disclosedEntries = new RowKeySetTreeImpl(); //disclosedEntries.setCollectionModel(treeModel); } /** * Simple action event used to init the download of a file within the tree. * * * @param evt * @throws IOException */ public void downloadFile(String evt) throws IOException { FileNode selectedNode = ((FileNode) treeModel.getRowData()); if (!selectedNode.isDir()) { File selectedFile = selectedNode.getFile(); downloadFile(selectedFile); } } /** * A helper method to setup the current session for the download. * * @param file * @throws IOException */ private static void downloadFile(File file) throws IOException { FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext extContext = facesContext.getExternalContext(); Long length = file.length(); HttpServletResponse response = (HttpServletResponse) extContext .getResponse(); //response.setContentType("applicatiion/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\""); response.setContentLength((int) length.intValue()); InputStream in = new FileInputStream(file); OutputStream out = response.getOutputStream(); byte[] buf = new byte[4096]; int count; while ((count = in.read(buf)) >= 0) { out.write(buf, 0, count); } count = 0; while ((count = in.read(buf)) >= 0) { out.write(buf, 0, count); } in.close(); out.flush(); out.close(); facesContext.responseComplete(); } /** * Generates a tree of FileNodes for a given dir. * * @param dirpath * @return */ private static FileNode buildFileTree(String dirpath) { File root = new File(dirpath); return visitAllDirsAndFiles(root); } /* public void handleRowDisclosure(RowDisclosureEvent rowDisclosureEvent) throws Exception { Object rowKey = null; UIXHierarchy rowData = null; String viewDefName = null; TreeModel treemodel = (TreeModel)rowDisclosureEvent.getSource(); RowKeySet rks = rowDisclosureEvent.getAddedSet(); if (rks != null) { int setSize = rks.size(); if (setSize > 1) { throw new Exception("Unexpected multiple row disclosure row sets"); } if (setSize == 0) return; rowKey = rks.iterator().next(); treemodel.setRowKey(rowKey); rowData = (UIXHierarchy)treemodel.getRowData(); if (rowData.getContainerRowKey() != null) { viewDefName = rowData.getContainerRowKey().g; } } } */ /** * Recurses over a given directory. * * @param dir * @return */ private static FileNode visitAllDirsAndFiles(File dir) { FileNode parentNode = process(dir); if (dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { FileNode childNode = visitAllDirsAndFiles(new File(dir, children[i])); parentNode.getChildren().add(childNode); } } return parentNode; } /** * Creates a file node for a given file. Any file processing should be done * here. * * @param dir * @return FileNode */ public static FileNode process(File dir) { FileNode node = new FileNode(dir); return node; } public void clickTree(FocusEvent event) { RowKeySet rks = getTree().getDisclosedRowKeys(); rks.invert(); List<List> clickedNodePath = (List<List>) clickedNodeRowKey; Iterator i = getTree().getDisclosedRowKeys().iterator(); boolean closedNode = false; while (i.hasNext()) { List openNodePath = (List) i.next(); if (openNodePath.equals(clickedNodeRowKey)) { rks.remove(clickedNodePath); closedNode = true; } } // open clicked node if (!closedNode) { rks.add(clickedNodePath); } } /*public void handleRowDisclosure(RowDisclosureEvent event) { RowKeySet added = event.getAddedSet(); RowKeySet removed = event.getRemovedSet(); if(disclosedEntries == null) { disclosedEntries = added; } else { if(!added.isEmpty()) { disclosedEntries.addAll(added); } if(!removed.isEmpty()) { disclosedEntries.removeAll(removed); } } }*/ public void setTreeModel(TreeModel treeModel) { this.treeModel = treeModel; } public TreeModel getTreeModel() { return treeModel; } public boolean getFoundDirectory() { return foundDirectory; } public void setFoundDirectory(boolean foundDirectory) { this.foundDirectory = foundDirectory; } public void setTree(CoreTree tree) { this.tree = tree; } public CoreTree getTree() { return tree; } public void setClickedNodeRowKey(Object clickedNodeRowKey) { this.clickedNodeRowKey = clickedNodeRowKey; } public Object getClickedNodeRowKey() { return clickedNodeRowKey; } /* public RowKeySetImpl getRowKeySet() { return rowKeySet; } public void setRowKeySet(RowKeySetImpl rowKeySet) { this.rowKeySet = rowKeySet; } */ } However, I'm using Spring here. I know I'm doing something wrong, but no idea. Please help. Thanks -- View this message in context: http://old.nabble.com/Need-help-in-trinidad-tree-component-tp34684793p34684793.html Sent from the MyFaces - Users mailing list archive at Nabble.com.