Subversion Repositories eFlore/Applications.cel

Rev

Rev 2199 | Blame | Last modification | View Log | RSS feed

package org.tela_botanica.client.util;

import java.util.HashMap;

import org.tela_botanica.client.cel2;

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
        private static String[] caracteresInterdits = {"\\", "/", ","};
        
        public static String obtenirCheminParent(String cheminMotCle) {
                String[] tabChemin = cheminMotCle.split("/");
                String cheminParent = "/";
                if(tabChemin.length >= 1) {
                        for(int i = 1; i < tabChemin.length - 1; i++) {
                                cheminParent += tabChemin[i]+"/";
                        }
                }
                return cheminParent;
        }

        public static Object[] construireArbre(String NomRacine, String idRacine,
                        JSONArray arbreJson, boolean afficherCheckbox) {
                
                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();
                                
                                // le chemin est mis en minuscule afin de fusionner toutes 
                                // la variantes minuscules majuscule d'un mot clé
                                // qui peuvent poser problème
                                String chemin = noeud.get("chemin").isString()
                                                .stringValue().toLowerCase();
                                
                                String cheminParent = MotsClesUtilitaire.obtenirCheminParent(chemin);
                                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);
                                if(afficherCheckbox) {
                                        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;
        }

        /**
         * 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, boolean afficherCheckbox) {
                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]);
                                if(afficherCheckbox) {
                                        child.setChecked(false);
                                }
                                child.setUserObject(usObj);
                                ndPereCopie.appendChild(child);

                                if (!ndNodeFils[i].isLeaf()) {
                                        copierFilsNoeud(ndNodeFils[i], child, afficherCheckbox);
                                }
                        }
                }
        }
        
        public static TreeNode ajouterNoeud(TreeNode parent, boolean afficherCheckbox) {
                // on crée un nouveau noeud vide
                TreeNode nd = new TreeNode("");
                nd.setCls("x-view-treenode-keyword");
                
                if(afficherCheckbox) {
                        nd.setChecked(true);
                }
                
                // on associe un objet au noeud qui contient des infos
                String[] usObject = new String[2];
                // l'objet contient le nom du noeud
                usObject[0] = "";
                usObject[1] = "";
                nd.setUserObject(usObject);
                
                String cheminTemporaireAjout = parent.getPath()+"/"+nd.getId();
                nd.setId(cheminTemporaireAjout);
                                
                return nd;
        }
        
        public static String getChaineCaracteresInterdits() {
                String interdits = "";
                for (int i = 0; i < MotsClesUtilitaire.caracteresInterdits.length; i++) {
                        interdits += MotsClesUtilitaire.caracteresInterdits[i]+" ";
                }
                return interdits;
        }
        
        public static boolean estUnMotCleAutorise(String motCle) {
                boolean valide = !motCle.trim().isEmpty();
                for (int i = 0; i < MotsClesUtilitaire.caracteresInterdits.length; i++) {
                        if(motCle.indexOf(MotsClesUtilitaire.caracteresInterdits[i]) != -1) {
                                valide = false;
                                break;
                        }
                }               
                return valide;
        }

        public static boolean estUnePositionAutorisee(TreeNode node, Node parent, String text) {
                if(parent == null) {
                        parent = node.getParentNode();
                }
                text = normaliserChaine(text);
                Node[] noeudsFreres = parent.getChildNodes(); 
                boolean ok = true;
                for(int i = 0; i <= noeudsFreres.length; i++) {
                        if(noeudsFreres[i] != null) {
                                String cheminFrere = normaliserChaine(noeudsFreres[i].getPath());
                                String cheminNoeud = normaliserChaine(node.getPath());
                                String texteNoeudfrere = normaliserChaine(((String[])noeudsFreres[i].getUserObject())[0]);
                                if(!cheminFrere.equals(cheminNoeud) && text.equals(texteNoeudfrere)) {
                                        ok = false;
                                }
                        }
                }
                return ok;
        }
        
        public static String normaliserChaine(String chaine) {
                return supprimerAccents(chaine).toLowerCase().trim();
        }
        
        public static String supprimerAccents(String chaine) {
            String s = chaine;

            s = s.replaceAll("[èéêë]","e");
            s = s.replaceAll("[ûùü]","u");
            s = s.replaceAll("[ïî]","i");
            s = s.replaceAll("[àâ]","a");
            s = s.replaceAll("ô","o");

            s = s.replaceAll("[ÈÉÊË]","E");
            s = s.replaceAll("[ÛÙÜ]","U");
            s = s.replaceAll("[ÏÎ]","I");
            s = s.replaceAll("[ÀÂ]","A");
            s = s.replaceAll("Ô","O");

            return s;
        }
}