Subversion Repositories eFlore/Applications.cel

Rev

Rev 1291 | 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 org.tela_botanica.client.observation.ObservationMediateur;

import com.gwtext.client.core.EventObject;
import com.gwtext.client.data.Node;
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.layout.RowLayout;
import com.gwtext.client.widgets.layout.RowLayoutData;
import com.gwtext.client.widgets.tree.MultiSelectionModel;
import com.gwtext.client.widgets.tree.TreeNode;
import com.gwtext.client.widgets.tree.TreePanel;
import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;

/**
 * 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;
        
        /**
         * Le médiateur associé à la vue
         */
        private ObservationMediateur oMediateur = null;
        
        /**
         * Les mots clés en cours
         */
        private String motsClesEncours = "";

        /**
         * Le treepanel qui affiche l'arbre
         */
        private static TreePanel arbreMotsCles = null;

        /**
         * booléen d'initialisation
         */
        private boolean estInstancie = false;
        
        private boolean arbreInitialise = false;

        /**
         * booléen d'etat
         */
        private boolean filtreModifie = false;
        
        /**
         * prefixe pour générer des ids adaptées
         */
        private String prefixe = "_filtre" ;
        
        private final String prefixeImg = "_images" ;
        
        private final String prefixeObs = "_obs" ;

        /**
         * 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 panel
                super();
                iMediateur = im;
                this.prefixe += prefixeImg;
                initialiserPanel();
        }
        
        /**
         * Constructeur avec paramètres
         * 
         * @param im
         *            le médiateur à associer
         */
        public ArbreMotsClesFiltreVue(ObservationMediateur om) {

                // on crée le panel
                super();
                oMediateur = om;
                this.prefixe += prefixeObs;
                initialiserPanel();
                
                this.setLayout(new RowLayout());

        }
        
        public void initialiserPanel() {
                // on crée le conteneur de l'arbre
                arbreMotsCles = new TreePanel();
                arbreMotsCles.setId("x-view-tree-filter"+prefixe);

                MultiSelectionModel msModel = new MultiSelectionModel();
                arbreMotsCles.setSelectionModel(msModel);
                
                // on crée une racine pour l'arbre
                TreeNode root = new TreeNode("Tags");
                root.setId("racine"+prefixe);
                String[] usObject = { "Mots clés", "racine"+prefixe };
                root.setUserObject(usObject);
                
                root.setExpandable(true);
                
                arbreMotsCles.setRootNode(root);
                
                arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() {

                        @Override
                        public void onClick(Node node, EventObject e) {
                                if(!arbreInitialise) {
                                        expand();
                                }
                        }

                        @Override
                        public void onExpand(Node node) {
                                if(!arbreInitialise) {
                                        obtenirArbreMotsCles();
                                        arbreInitialise = true;
                                }
                        }

                });
                
                this.setPaddings(5);

                this.setBorder(false);
                this.setCollapsible(true);
                this.setAutoWidth(true);

                // on ajoute les listeners
                ajouterListenersPanel();
                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 bugs
                        @Override
                        public void onRender(Component component) {

                                // on interdit le drag and drop dans l'arbre
                                arbreMotsCles.setEnableDD(false);
                                arbreMotsCles.setAutoWidth(false);
                                arbreMotsCles.setAutoScroll(true);
                                arbreMotsCles.setBorder(false);

                                // on met en forme le layout
                                ((Panel) component).add(arbreMotsCles,new RowLayoutData("80%"));

                                // on ajoute les listeners d'évenements
                                ajouterListeners();
                                //obtenirArbreMotsCles();
                        }
                        
                });
        }

        /**
         * ajoute les listeners pour les boutons et le cochage des mots clés
         */
        private void ajouterListeners() {
                arbreMotsCles.addListener(new TreePanelListenerAdapter() {
                                                                
                        // gestion du clic sur un noeud
                        @Override
                        public void onClick(TreeNode node, EventObject e) {

                                e.stopEvent();
                                                                
                                boolean multi = false;
                                if(e.hasModifier()) {
                                        multi = true;
                                }
                                gererClicNoeud(node,multi);
                        }
                });
        }
        
        /**
         * Fonction de gestion sur le clic sur le noeud
         * 
         * @param node
         */
        public void gererClicNoeud(TreeNode node, boolean multi) {
                
                if(!arbreInitialise) {
                        obtenirArbreMotsCles();
                } else {
                        if(node.equals(arbreMotsCles.getRootNode())) {
                                arbreMotsCles.getSelectionModel().clearSelections();
                        } else {
                                ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).select(node, multi);
                        }
                        filtreModifie = true;
                        iMediateur.obtenirPhotoGalerie();
                }
        }

        /**
         * Méthode héritée de l'interface rafraichissable
         */
        @Override
        public void rafraichir(Object nouvelleDonnees,
                        boolean repandreRaffraichissement) {

                // si on a reçu un arbre
                if (nouvelleDonnees instanceof Tree) {
                        Tree nouvelArbre = (Tree) nouvelleDonnees;
                        
                        // on vide tous les noeuds de l'ancien arbre
                        Node[] rootChild = arbreMotsCles.getRootNode().getChildNodes();
                        for (int i = 0; i < rootChild.length; i++) {
                                
                                rootChild[i].remove();
                        }

                        // et on recopie le nouvel arbre
                        copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles
                                        .getRootNode());

                        // si l'arbre n'était pas encore considéré comme instancié
                        if (!estInstancie) {
                                // on signale que oui
                                estInstancie = true;
                        }
                        
                        if(!arbreInitialise) {
                                arbreInitialise = true;
                        }
                        
                        arbreMotsCles.setRootNode(arbreMotsCles.getRootNode());

                        // l'état du filtre est réinitialisé
                        filtreModifie = false;
                        doLayout() ;
                }
        }

        /**
         * Accesseur pour le médiateur
         * 
         * @return le médiateur associé
         */
        public ImageMediateur getIMediateur() {
                return iMediateur;
        }
        
        public ObservationMediateur getOMediateur() {
                return oMediateur ;
        }

        /**
         * 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
         */
        @Override
        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
         */
        @Override
        public String[] renvoyerValeursAFiltrer() {
                
                String val = "";
                
                TreeNode[] noeuds = ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).getSelectedNodes();
                
                for(int i = 0; i< noeuds.length ; i++) {
                        if(noeuds[i].getDepth() > 0) {
                                
                                String[] userObj = (String[])noeuds[i].getUserObject();
                                String idMotCle = noeuds[i].getId();
                                
                                if(userObj != null && userObj[1] != null) {
                                        idMotCle = userObj[1];
                                }
                                
                                val += ";"+idMotCle;
                        }
                }
                
                val = val.replaceFirst(";", "");
                
                String[] valeursFiltres = {"id_mots_cles", val};

                return valeursFiltres;
        }

        /**
         * 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] +prefixe);
                                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)
         */
        @Override
        public boolean renvoyerEtatFiltre() {

                return filtreModifie;
        }
        
        public void mettreAJourMotsCles(String valeur, String id) {
                if(getIMediateur() != null) {
                        getIMediateur().mettreAjourMotsClesId(valeur,
                                id);
                }
                else
                {
                        getOMediateur().mettreAjourMotsClesId(valeur, id);
                }
        }
        
        public void obtenirArbreMotsCles() {
                if(getIMediateur() != null) {
                        getIMediateur().obtenirArbreMotsCles(this);
                }
                else
                {
                        getOMediateur().obtenirArbreMotsCles(this);
                }
        }

        @Override
        public void valider() {
                if (estInstancie) {
                        // on vide les mots clés en cours
                        motsClesEncours = "";
                        // on suppose que le filtre a change
                        filtreModifie = true;
                }
        }

        public void raz() {
                
                if(arbreInitialise) {
                        // on vide tous les noeuds de l'ancien arbre
                        Node[] rootChild = arbreMotsCles.getRootNode().getChildNodes();
                        for (int i = 0; i < rootChild.length; i++) {
                                
                                rootChild[i].remove();
                        }
                        
                        arbreInitialise = false ;
                        
                        // on crée une racine pour l'arbre
                        TreeNode root = new TreeNode("Tags");
                        root.setId("racine"+prefixe);
                        String[] usObject = { "Mots clés", "racine"+prefixe };
                        root.setUserObject(usObject);
                        
                        root.setExpandable(true);
                        
                        arbreMotsCles.setRootNode(root);
                        
                        arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() {
        
                                @Override
                                public void onClick(Node node, EventObject e) {
                                        if(!arbreInitialise) {
                                                expand();
                                        }
                                }
        
                                @Override
                                public void onExpand(Node node) {
                                        if(!arbreInitialise) {
                                                obtenirArbreMotsCles();
                                                arbreInitialise = true;
                                        }
                                }
                        });
                }
        }

        @Override
        public void viderFiltre() {
                motsClesEncours = "";
                arbreMotsCles.getSelectionModel().clearSelections();
        }

}