Subversion Repositories eFlore/Applications.coel

Rev

Rev 1292 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.tela_botanica.client.composants;

import java.util.HashMap;

import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.RegistreId;
import org.tela_botanica.client.composants.pagination.Proxy;
import org.tela_botanica.client.composants.pagination.ProxyValeur;
import org.tela_botanica.client.images.Images;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Valeur;
import org.tela_botanica.client.modeles.aDonnee;
import org.tela_botanica.client.util.Debug;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.ModelType;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.FieldEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Text;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.form.HiddenField;
import com.extjs.gxt.ui.client.widget.form.LabelField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.layout.RowLayout;

public class ChampMultiValeursPaginable extends LayoutContainer implements Rafraichissable {
        //TODO : changer le champRecapitulatif par une hashMap
        //TODO : autoriser la modification des champs saisis

          //-------------//
         //  ATTRIBUTS  //
        //-------------//
        
        Mediateur mediateur = (Mediateur) Registry.get(RegistreId.MEDIATEUR);
        
        String idChampCache = null;
        String titreErreur = null;
        String valeurVideMsg = null;
        String valeurIdentiqueMsg = null;
        String valeurNonValideMsg = null;
        String valeurParDefaut = "";
        String validationMasque = null;
        String exempleValidation = null;
        boolean champValeurEstComboBox = false;

        // Elements pour le champ 'valeurs'
        Field<String> champValeurTxt = null;
        ChampComboBoxRechercheTempsReelPaginable champValeurComboBox = null;
        HiddenField<String> champRecapitulatif = null;
        HashMap<String, LayoutContainer> valeurs = null;
        
        // Elements pour gérer le type de valeurs que contient le champ
        Proxy proxyChampValeur = null;
        ModelType modeltypeChampValeur = null;
        String displayNameChampValeur = "nom";
        
        // Elements pour l'UI
        LayoutContainer principalLayout = null;
        LayoutContainer colonneConteneur = null;
        ColumnData colonneChampValeur = null;
        ColumnData colonneBoutonAjouter = null;
        Button ajouterBouton = null;
        int largeurTotale = 500;
        int largeurBouton = 20;
        int largeurChampValeur = 200;
        String boutonSupprimerLabel = "";       
        String nomLabelChampTxt = "";


          //-------------//
         //   METHODES  //
        //-------------//

        /*--------------
          Constructeur 
        --------------*/
        // Usage :      Si champValeurEstComboBox est FAUX alors modeltype, proxy et displayName doivent être à Null.
        //                      Sinon ils doivent impérativement être non nuls.                       
        public ChampMultiValeursPaginable(String label, int largeurTotale, boolean champValeurEstComboBox, ModelType modeltype, Proxy proxy, String displayName) {      
                this.champValeurEstComboBox = champValeurEstComboBox;
                
                if (champValeurEstComboBox) {
                        if ((proxy == null) || (modeltype == null) || (displayName == null)) {
                                MessageBox.alert("[ERREUR]","Constructeur de ChampMultiValeursPaginable - paramètre Null",null);
                        }
                        else {
                                this.proxyChampValeur = proxy;
                                this.modeltypeChampValeur = modeltype;
                                this.displayNameChampValeur = displayName;
                        }
                }
                
                initialiserChampMultiValeursPaginable(label, largeurTotale);
        }

        /*------------
          Accesseurs 
        ------------*/
        
         //------------//
        //    Get     //------------------------------------------------------------
        
        public ChampComboBoxRechercheTempsReelPaginable getChampValeurComboBox() {
                if (champValeurEstComboBox) return this.champValeurComboBox;
                else return null;
        }

        public Field getChampValeurTxt() {
                if (!champValeurEstComboBox) return this.champValeurTxt;
                else return null;
        }
        
        public String getLabel() {
                return this.nomLabelChampTxt;
        }
        
        public String getValeurs() {
                String texteRecapitulatif = "";
                if (champRecapitulatif.getValue() != null) {
                        texteRecapitulatif = champRecapitulatif.getValue();
                        texteRecapitulatif = texteRecapitulatif.replaceAll("(.*)"+aDonnee.SEPARATEUR_VALEURS+"$", "$1");
                }
                return texteRecapitulatif;
        }
        
         //------------//
        //    Set     //------------------------------------------------------------
        
        public void setLabel(String label) {
                if (label == null) {
                        label = "";
                }
                nomLabelChampTxt = label;
        }
        
        public void setLargeurTotale(int largeur) {
                this.largeurTotale = largeur;
                largeurChampValeur = largeurTotale - largeurBouton;
        }
                
        public void setValidation (String validation, String exempleValidation) {
                this.validationMasque = validation;
                this.exempleValidation = exempleValidation;
                
                this.valeurNonValideMsg = Mediateur.i18nM.valeurNonValideMsg(exempleValidation);
        }
        
        public void setValeurParDefaut(String valeur)   {
                this.valeurParDefaut = valeur;
                champValeurTxt.setValue(valeur);
        }
        
        public void setValeurBoutonSupprimer(String valeur)     {
                this.boutonSupprimerLabel = valeur;
        }
        
        /*------------------
          Méthodes publiques 
        -------------------*/
        public void peupler(String chaineExistante) {
                if (valeurs.size()>0)   {
                        reinitialiser();
                }
                if (chaineExistante != null && !chaineExistante.trim().equals("")) {
                        String[] valeurs = chaineExistante.split(aDonnee.SEPARATEUR_VALEURS);
                        for (int i = 0; i < valeurs.length; i++) {
                                ajouterValeur(valeurs[i]);
                        }
                }
        }
        
        @Override
        public void rafraichir(Object nouvellesDonnees) {
                
        }
        
        /*-------------------
          Méthodes protégées 
        --------------------*/
        protected void ajouterValeur(final String texte, final String strValeur, final String id)       {
                //Implémenté dans classe inférieure
        }
        
        protected void ajouterValeur(final String texte)        {
                LayoutContainer colonneLayout = new LayoutContainer();
                colonneLayout.setLayout(new ColumnLayout());
                valeurs.put(texte, colonneLayout);
                
                Text champTxt = new Text();
                champTxt.setText(texte);
                colonneLayout.add(champTxt, new ColumnData(largeurChampValeur));
                
                Button supprimerBouton = new Button();
                supprimerBouton.setIcon(Images.ICONES.supprimer());
                supprimerBouton.setText(boutonSupprimerLabel);
                supprimerBouton.setData("valeur", texte);
                supprimerBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        public void componentSelected(ButtonEvent ce) {
                                String valeur = ce.getComponent().getData("valeur");
                                LayoutContainer valeurLayout = valeurs.get(valeur);
                                principalLayout.remove(valeurLayout);
                                valeurs.remove(valeur);
                                supprimerValeurDuRecapitulatif(valeur);
                                actualiserLayoutGlobal();
                        }
                });
                colonneLayout.add(supprimerBouton, new ColumnData(largeurBouton));
                
                // Ajout du layout de la valeur au layout principal
                principalLayout.add(colonneLayout);
                
                // Ajout de la valeur au champ récapitulatif des valeurs ajoutées
                ajouterValeurAuRecapitulatif(texte);
                reinitialiserChamp();
                actualiserLayoutGlobal();
        }
        
        protected void reinitialiserChamp()     {
                if (champValeurEstComboBox) {
                        champValeurComboBox.getCombo().clear();
                } else {
                        champValeurTxt.setValue(valeurParDefaut);
                }
        }
        
        protected void actualiserLayoutGlobal() {
                layout();
        }
        
        protected void ajouterValeurAuRecapitulatif(String texte) {
                String texteRecapitulatif = "";
                if (champRecapitulatif.getValue() != null)      {
                        texteRecapitulatif = champRecapitulatif.getValue();
                }
                texteRecapitulatif += texte + aDonnee.SEPARATEUR_VALEURS;
                champRecapitulatif.setValue(texteRecapitulatif);
        }
        
        protected void supprimerValeurDuRecapitulatif(String texte) {
                if (champRecapitulatif.getValue() != null)      {
                        String texteRecapitulatif = champRecapitulatif.getValue();
                        texteRecapitulatif = texteRecapitulatif.replace(texte + aDonnee.SEPARATEUR_VALEURS, "");
                        champRecapitulatif.setValue(texteRecapitulatif);
                }
        }
        
        protected void reinitialiser() {
                //TODO : pourrait etre mieux fait si les valeurs étaient enregistrées dans un 
                // layout particulier. Il suffirait alors d'enlever les valeurs de ce layout.
                principalLayout.removeAll();
                initialiserChampMultiValeursPaginable(nomLabelChampTxt, largeurTotale);
        }
        
        /*------------------
          Méthodes privées 
        -------------------*/
        private void initialiserChampMultiValeursPaginable(String label, int largeurTotale) {           
                setLabel(label);
                setLargeurTotale(largeurTotale);
                
                titreErreur = Mediateur.i18nC.erreurSaisieTitre();
                valeurVideMsg = Mediateur.i18nC.demanderValeur();
                valeurIdentiqueMsg = Mediateur.i18nC.valeurDejaPresente();
        
                valeurs = new HashMap<String, LayoutContainer>();
                champRecapitulatif = new HiddenField<String>();
                champRecapitulatif.setValue("");
        
                setLayout(new FormLayout());
        
                creerChampMultiValeurs();
        }

        private void creerChampMultiValeurs() {         
                principalLayout = new LayoutContainer();
                principalLayout.setLayout(new RowLayout());
                
                /* Creation du champ Valeur */
                LabelField label = new LabelField(nomLabelChampTxt + ":");
                label.setWidth("95%");
                principalLayout.add(label);
                
                colonneConteneur = new LayoutContainer();
                colonneConteneur.setLayout(new ColumnLayout()); 
                colonneChampValeur = new ColumnData(largeurChampValeur);
                
                if (champValeurEstComboBox) {                   
                        champValeurComboBox = new ChampComboBoxRechercheTempsReelPaginable(proxyChampValeur, modeltypeChampValeur, displayNameChampValeur);
                        champValeurComboBox.setWidth(largeurChampValeur);
                        champValeurComboBox.getCombo().setEmptyText("Valeur...");
                        colonneConteneur.add(champValeurComboBox, colonneChampValeur);                  
                } else {
                        champValeurTxt = new TextField<String>();
                        champValeurTxt.setWidth(largeurChampValeur);
                        champValeurTxt.setEmptyText("Valeur...");
                        colonneConteneur.add(champValeurTxt, colonneChampValeur);
                }
                
                /* Creation du bouton Ajouter */
                ajouterBouton = new Button();
                ajouterBouton.setWidth(largeurBouton);
                ajouterBouton.setIcon(Images.ICONES.ajouter());         
                ajouterBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        public void componentSelected(ButtonEvent ce) {
                                // récupération de la valeur du champ "Valeur"
                                String valeurChamp = "";
                                if (champValeurEstComboBox) {
                                        if (champValeurComboBox.getValeur() != null) {
                                                valeurChamp = champValeurComboBox.getValeur().getNom();
                                        }
                                } else {
                                        valeurChamp = champValeurTxt.getValue();
                                }
                                // validation de la valeur avant ajout
                                if ((valeurChamp == null) || valeurChamp.trim().equals("") || valeurChamp.trim().equals(valeurParDefaut)) {
                                        MessageBox.alert(titreErreur, valeurVideMsg, null);
                                } else if (valeurs.get(valeurChamp) != null){
                                        MessageBox.alert(titreErreur, valeurIdentiqueMsg, null);                                                        
                                } else {
                                        if (validationMasque != null && !valeurChamp.matches(validationMasque)) {
                                                MessageBox.alert(titreErreur, valeurNonValideMsg, null);
                                        } else {
                                                ajouterValeur(valeurChamp);
                                        }
                                }
                        }
                });
                colonneBoutonAjouter = new ColumnData(largeurBouton);
                colonneConteneur.add(ajouterBouton, colonneBoutonAjouter);
                
                principalLayout.add(champRecapitulatif);
                principalLayout.add(colonneConteneur);
                add(principalLayout);
        }
}