Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

package org.tela_botanica.client.util;

import java.util.HashMap;

import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.user.client.Window;
import com.gwtext.client.data.Node;
import com.gwtext.client.data.Tree;
import com.gwtext.client.widgets.tree.TreeNode;

public class MotsClesUtilitaire {
        
        //TODO rassembler tout ce qui construit les arbres de mots clés ici
        
        public static String obtenirCheminParent(String cheminMotCle, String motCle) {
                return cheminMotCle.substring(0, cheminMotCle.length() - motCle.length() -1);
        }

        public static Object[] construireArbre(String NomRacine, String idRacine,
                        JSONArray arbreJson) {
                
                Tree arbreMotsCles = new Tree() ;       
                HashMap<String, String> motsCles = new HashMap<String, String>(0);
                HashMap<String, String> parentes = new HashMap<String, String>();
                
                final int taillemax = arbreJson.size();

                // on crée un arbre vide
                TreeNode root = new TreeNode();
                root.setId(idRacine);
                root.setText(NomRacine);
                String[] usObjRacine = {NomRacine, idRacine};
                root.setUserObject(usObjRacine);
                arbreMotsCles.setRootNode(root);
                
                // le mot clé racine possède le chemin racine ("/")
                parentes.put("/", idRacine);

                // pour chacun des élements du tableau
                for (int j = 0; j < taillemax; j++) {
                        // on extrait les élements du tableau
                        if (arbreJson.get(j).isObject() != null) {
                                JSONObject noeud = (JSONObject) arbreJson.get(j);

                                String idMotCle = noeud.get("id_mot_cle")
                                                .isString().stringValue();
                                String motCle = noeud.get("mot_cle").isString()
                                                .stringValue();
                                String chemin = noeud.get("chemin").isString()
                                                .stringValue();
                                
                                String cheminParent = MotsClesUtilitaire.obtenirCheminParent(chemin, motCle);
                                String parent = parentes.get(cheminParent);
                                
                                String[] usObj = {motCle, idMotCle};

                                // et on construit l'arbre en ajoutant les noeuds un à un (qui sont renvoyés
                                // dans l'ordre hierarchique de leur niveau
                                // ce qui permet de les traiter séquentiellement)
                                TreeNode node = new TreeNode();
                                node.setId(idMotCle);
                                node.setText(motCle);
                                node.setChecked(false);
                                Node parentNode = arbreMotsCles.getNodeById(parent);
                                node.setUserObject(usObj);
                                parentNode.appendChild(node);
                                
                                parentes.put(chemin, idMotCle);
                                motsCles.put(idMotCle, motCle);
                        }
                }
                Object[] retour = {arbreMotsCles, motsCles};
                return retour;
        }

        public static String construireChemin(TreeNode nd) {
                String chemin = "/";
                Node node = nd;
                while(node != null) {
                        String[] usObj = (String[])node.getUserObject();
                        chemin = usObj[0]+"/"+chemin;
                        node = node.getParentNode();
                }
                return chemin;
        }

        /**
         * 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
         */
        public static 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]);
                                child.setChecked(false);
                                child.setUserObject(usObj);
                                ndPereCopie.appendChild(child);

                                if (!ndNodeFils[i].isLeaf()) {
                                        copierFilsNoeud(ndNodeFils[i], child);
                                }
                        }
                }
        }
}