Java Primefaces: Aktionen auf Node aktuallisiert kompletten Tree

Fonce

Captain
Registriert
Feb. 2006
Beiträge
3.447
Hi,
ich hätte da noch ein Problem mit Primefaces.
Ich habe dort einen Tree zu dem ich Node hinzufügen/löschen/umbennen kann.
Das Problem ist, das er bei diesen anscheinend immer den kompletten Tree aktualisiert und so wieder beim zugeklappten Root Tree landet.

Sieht da jemand den Fehler oder hat eine Idee?=

Hier die Form
Code:
<h:form id="treeForm">
            <p:contextMenu for="tree">
                <p:menuitem value="Create" update="tree" onclick="PF('createFolderDlg').show();" icon="ui-icon-plus" />
                <p:menuitem value="Rename" update="tree" onclick="PF('renameFolderDlg').show();" icon="ui-icon-edit" />
                <p:menuitem value="Delete" update="tree" actionListener="#{folderTreeBean.deleteNode}"  icon="ui-icon-close"/>
            </p:contextMenu>
            <p:growl id="messages" showDetail="true" /> 
            <p:tree value="#{folderTreeBean.root}" dynamic="true" cache="false"  selectionMode="single" selection="#{folderTreeBean.selectedNode}" var="node" id="tree" highlight="true" animate="true" >
                <p:ajax event="expand" update=":treeForm:messages" listener="#{folderTreeBean.onNodeExpand}" />
                <p:ajax event="collapse" update=":treeForm:messages" listener="#{folderTreeBean.onNodeCollapse}" />
                <p:ajax event="select" update=":treeForm:messages" listener="#{folderTreeBean.onNodeSelect}" />
                <p:ajax event="unselect" update=":treeForm:messages" listener="#{folderTreeBean.onNodeUnselect}" />
                <p:treeNode id="treeNode" expandedIcon="ui-icon-folder-open"  
                            collapsedIcon="ui-icon-folder-collapsed">
                    <h:outputText value="#{node}" id="lblNode" />
                </p:treeNode>
            </p:tree> 
            <p:dialog id="createDialog" header="Create Folder" widgetVar="createFolderDlg" modal="true" height="100">  
                <h:outputText value="Name:" />  
                <p:inputText value="#{folderTreeBean.newFolderName}"/>
                <p:commandButton value="Create" action="#{folderTreeBean.createNode()}" update="tree" oncomplete="PF('createFolderDlg').hide();"/>
            </p:dialog> 
            <p:dialog id="renameDialog" header="Rename Folder" draggable="false" widgetVar="renameFolderDlg" modal="true" height="100">  
                <h:outputText value="Name:" />  
                <p:inputText  value="#{folderTreeBean.renameFolderName}"/>
                <p:commandButton value="Rename" action="#{folderTreeBean.renameNode()}"  update="tree" oncomplete="PF('renameFolderDlg').hide();"  />
            </p:dialog> 
        </h:form>


Hier das Bean
Code:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.rehborn.mydms.webapp;

import java.io.Serializable;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.event.NodeUnselectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.rehborn.mydms.FileSystem;
import org.rehborn.mydms.Folder;

/**
 *
 * @author Julian
 */
@Named
@SessionScoped
public class FolderTreeBean implements Serializable {

    @Inject
    private FileSystemBean dms;
    private TreeNode root;
    private DMSNode selectedNode;
    private String newFolderName;
    private String renameFolderName;

    public String getRenameFolderName() {
        return renameFolderName;
    }

    public void setRenameFolderName(String renameFolderName) {
        this.renameFolderName = renameFolderName;
    }

    public String getNewFolderName() {
        return newFolderName;
    }

    public void setNewFolderName(String newFolderName) {
        this.newFolderName = newFolderName;
    }

    public TreeNode getSelectedNode() {
        return selectedNode;
    }

    public void setSelectedNode(TreeNode selectedNode) {
        this.selectedNode = (DMSNode) selectedNode;
    }

    public FolderTreeBean() {

    }

    public TreeNode getRoot() {
        FileSystem fileSystem = dms.getDMSBackend("MYDMSTESTDOMAIN");
        Folder rootFolder = fileSystem.getRootFolder();
        root = new DefaultTreeNode("dummyRoot");
        TreeNode node = new DMSNode(rootFolder, root);
        List<Folder> children = fileSystem.getChildFolder(rootFolder);
        buildTree(fileSystem, children, node);
        return root;
    }

    private void buildTree(FileSystem fileSystem, List<Folder> childrenList, TreeNode rootNode) {
        for (Folder folder : childrenList) {
            TreeNode child = new DMSNode(folder, rootNode);
            List<Folder> moreChilds = fileSystem.getChildFolder(folder);
            if (!moreChilds.isEmpty()) {
                buildTree(fileSystem, moreChilds, child);
            }
        }
    }

    public void onNodeExpand(NodeExpandEvent event) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Expanded", event.getTreeNode().toString());
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void onNodeCollapse(NodeCollapseEvent event) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Collapsed", event.getTreeNode().toString());
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void onNodeSelect(NodeSelectEvent event) {
        selectedNode = (DMSNode) event.getTreeNode();
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected", event.getTreeNode().toString());
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void onNodeUnselect(NodeUnselectEvent event) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Unselected", event.getTreeNode().toString());
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void deleteNode(ActionEvent event) {
        FileSystem fileSystem = dms.getDMSBackend("MYDMSTESTDOMAIN");
        Folder folder = fileSystem.getFolder(selectedNode.getFolderId());
        if (folder.equals(fileSystem.getRootFolder())) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Root can't deleted", selectedNode.toString());
            FacesContext.getCurrentInstance().addMessage(null, message);
        } else {
            fileSystem.deleteFolder(folder);
            selectedNode.getChildren().clear();
            DMSNode newSelected = (DMSNode) selectedNode.getParent();
            selectedNode.getParent().getChildren().remove(selectedNode);
//            selectedNode.setParent(null);
            selectedNode = newSelected;
//            selectedNode.setExpanded(true);
        }
    }
    
    public void renameNode(){
        FileSystem fileSystem = dms.getDMSBackend("MYDMSTESTDOMAIN");
        Folder folder = fileSystem.getFolder(selectedNode.getFolderId());
        if (folder.equals(fileSystem.getRootFolder())) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Root can't deleted", selectedNode.toString());
            FacesContext.getCurrentInstance().addMessage(null, message);
        } else {
            folder.setName(renameFolderName);
            fileSystem.updateFolder(folder);
            selectedNode.setData(folder.getName());
        }
    }

    public void createNode() {
        FileSystem fileSystem = dms.getDMSBackend("MYDMSTESTDOMAIN");
        Folder parentFolder = fileSystem.getFolder(selectedNode.getFolderId());
        Folder newFolder = new Folder(newFolderName, parentFolder);
        fileSystem.createFolder(newFolder);
        DMSNode newNode = new DMSNode(newFolder, selectedNode);
        selectedNode = newNode;
    }

}
 
In deinem getRoot wird ein neuer Baum erstellt und dessen Wurzel zurückgeliefert. Die selectedNode hat dann keinen Bezug zum neuen Baum.

Ob das das Problem löst kann ich nicht sagen, ich kenne mich mit Primefaces nicht aus.
 
Jap, das war der Fehler

Musste den aufbau der Root Trees in eine eigene Methode mit @PostConstruct Annotation auslagern. ;)
 

Ähnliche Themen

Zurück
Oben