Rev 5 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.vues;import org.tela_botanica.client.image.ImageMediateur;import org.tela_botanica.client.interfaces.Filtrable;import org.tela_botanica.client.interfaces.Rafraichissable;import com.google.gwt.user.client.ui.Label;import com.gwtext.client.data.Node;import com.gwtext.client.data.NodeTraversalCallback;import com.gwtext.client.data.Tree;import com.gwtext.client.widgets.Component;import com.gwtext.client.widgets.Panel;import com.gwtext.client.widgets.event.PanelListenerAdapter;import com.gwtext.client.widgets.tree.TreeNode;import com.gwtext.client.widgets.tree.TreePanel;/*** fenêtre de recherche affichant l'arbre des mots clés en lecture et un bouton* cliquable* @author aurelien**/public class ArbreMotsClesFiltreVue extends Panel implements Rafraichissable, Filtrable {/*** Le médiateur associé à la vue*/private ImageMediateur iMediateur = null ;/*** Les mots clés en cours*/private String motsClesEncours = "" ;/*** Le treepanel qui affiche l'arbre*/private TreePanel arbreMotsCles = null ;/*** booléen d'initialisation*/private boolean estInstancie = false ;/*** booléen d'etat*/private boolean filtreModifie = false ;/*** Constructeur sans argument (privé car ne doit pas être utilisé)*/@SuppressWarnings("unused")private ArbreMotsClesFiltreVue(){super() ;}/*** Constructeur avec paramètres* @param im le médiateur à associer*/public ArbreMotsClesFiltreVue(ImageMediateur im){// on crée le panelsuper() ;//this.setLayout(new VerticalLayout());iMediateur = im ;// on crée le conteneur de l'arbreLabel labelRecherche = new Label("Mots clés :") ;arbreMotsCles = new TreePanel() ;this.setPaddings(5) ;this.setBorder(false) ;this.setCollapsible(true) ;this.setAutoWidth(true) ;add(labelRecherche) ;// on ajoute les listenersajouterListenersPanel() ;estInstancie = false ;}/*** Ajoute les listeners pour le rendu du panel*/private void ajouterListenersPanel(){this.addListener(new PanelListenerAdapter() {// on instancie réellement les composants au moment du rendu pour accélérer l'affichage// et éviter des bugspublic void onRender(Component component) {// on interdit le drag and drop dans l'arbrearbreMotsCles.setEnableDD(false) ;arbreMotsCles.setId("x-view-tree-filter") ;arbreMotsCles.setAutoWidth(false) ;arbreMotsCles.setAutoScroll(true) ;arbreMotsCles.setBorder(false) ;// on crée une racine pour l'arbreTreeNode root = new TreeNode("Tags") ;root.setId("racine_filtre") ;String[] usObject = {"Mots clés" , "racine" } ;root.setUserObject(usObject) ;arbreMotsCles.setRootNode(root) ;arbreMotsCles.setRootVisible(true) ;arbreMotsCles.setBorder(false) ;// on met en forme le layout((Panel)component).add(arbreMotsCles) ;// on ajoute les listeners d'évenementsajouterListeners() ;// et on demande l'arbre des mots clésgetIMediateur().obtenirArbreMotsCles(getIMediateur().getPanneauFiltres().getMotsClesFiltre()) ;// enfin on considère le composant comme instanciéestInstancie = true ;}}) ;}/*** ajoute les listeners pour les boutons et le cochage des mots clés*/private void ajouterListeners(){}/*** Méthode héritée de l'interface rafraichissable*/public void rafraichir(Object nouvelleDonnees,boolean repandreRaffraichissement) {// si on a reçu un arbreif(nouvelleDonnees instanceof Tree){Tree nouvelArbre = (Tree)nouvelleDonnees ;// on vide tous les noeudsarbreMotsCles.getRootNode().eachChild(new NodeTraversalCallback() {public boolean execute(Node node) {node.remove() ;return true ;}}) ;// et on recopie le nouvel arbrecopierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles.getRootNode()) ;// si l'arbre n'était pas encore considéré comme instanciéif(!estInstancie){// on signale que ouiestInstancie = true ;}// l'état du filtre est réinitialiséfiltreModifie = false ;show() ;}if(nouvelleDonnees instanceof TreeNode){TreeNode nd = (TreeNode)nouvelleDonnees ;// si le noeud n'existe pas déjà c'est un ajoutif(arbreMotsCles.getTree().getNodeById(nd.getId()+"_filtre") == null){// donc on ne fait rien de spécial}// si le noeud existe déjà c'est un déplacementelse{// alors on supprime d'abord le noeud concernéarbreMotsCles.getTree().getNodeById(nd.getId()+"_filtre").remove() ;}// on cherche le père du nouveau noeudNode ndPereOriginal = nd.getParentNode() ;String idPereFiltre = ndPereOriginal.getId()+"_filtre" ;String[] usObj = (String[])nd.getUserObject() ;TreeNode child = new TreeNode(usObj[0]) ;child.setId(usObj[1]+"_filtre") ;child.setChecked(false);child.setUserObject(usObj) ;arbreMotsCles.getNodeById(idPereFiltre).appendChild(child) ;// et on ajoute le nouveau noeud à son pèrecopierFilsNoeud(nd, child) ;}// si on reçoit une stringif(nouvelleDonnees instanceof String){String idSupp = (String)nouvelleDonnees+"_filtre" ;// c'est une suppression et si le noeud existe bienif(arbreMotsCles.getTree().getNodeById(idSupp) != null){// on le supprimearbreMotsCles.getTree().getNodeById(idSupp).remove() ;}}}/*** Accesseur pour le médiateur* @return le médiateur associé*/public ImageMediateur getIMediateur(){return iMediateur ;}/*** Accesseur pour le panneau contenant l'arbre* @return le panneau de l'arbre des mots clés*/public TreePanel getArbreMotsCles(){return arbreMotsCles ;}/*** Méthode héritée de Filtrable* renvoie le nom du filtre*/public String renvoyerNomFiltre() {return "mots clés" ;}/*** Renvoie un tableau contenant le nom du champ à filtrer et la valeur* @return un tableau contenant le nom du champ à filtrer et sa valeur*/public String[] renvoyerValeursAFiltrer() {valider() ;String[] valeursFiltrees = {"ci_meta_mots_cles",motsClesEncours} ;return valeursFiltrees ;}/*** Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un copie du sous arbre du premier* noeud, qu'elle concatène au deuxième* @param ndPereOriginal le père des noeuds de l'arbre original* @param ndPereCopie le père qui va recevoir les copies*/private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie){if(ndPereCopie != null && ndPereOriginal != null){Node[] ndNodeFils = ndPereOriginal.getChildNodes() ;for (int i = 0; i < ndNodeFils.length; i++) {String[] usObj = (String[])ndNodeFils[i].getUserObject() ;TreeNode child = new TreeNode(usObj[0]) ;child.setId(usObj[1]+"_filtre") ;child.setChecked(false);child.setUserObject(usObj) ;ndPereCopie.appendChild(child) ;if(! ndNodeFils[i].isLeaf()){copierFilsNoeud(ndNodeFils[i],child) ;}}}}/*** Méthode héritée de Filtrable* Renvoie l'état du filtre (modifié ou non)*/public boolean renvoyerEtatFiltre() {return filtreModifie ;}public void valider(){if(estInstancie){// on vide les mots clés en coursmotsClesEncours = "" ;// pour chaque noeud à partir de la racinegetArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {// on éxécute une fonctionpublic boolean execute(Node node) {// on récupère le mot clé associé au noeud et ses infosTreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;String[] usObject = (String[])tn.getUserObject() ;getIMediateur().mettreAjourMotsClesId(usObject[0],usObject[1]) ;if(tn.getUI().isChecked()){// et les concatène à la string des mots clés en coursmotsClesEncours += usObject[1]+"," ;}return true ;}});// on suppose que le filtre a changefiltreModifie = true ;}}}