Subversion Repositories eFlore/Applications.coel

Rev

Rev 1642 | Rev 1881 | 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.images.Images;
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.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 ChampMultiValeurs extends LayoutContainer {
        //TODO : changer le champRecapitulatif par une hashMap
        //TODO : autoriser la modification des champs saisis

        String idChampCache = null;
        
        String nomLabelChampTxt = "";
        
        String titreErreur = null;
        String valeurVideMsg = null;
        String valeurIdentiqueMsg = null;
        String valeurNonValideMsg = null;
        
        String valeurParDefaut = "";
        String validationMasque = null;
        String exempleValidation = null;
        String boutonSupprimerLabel = "";
        
        LayoutContainer principalLayout = null;
        Field<String> champValeurTxt = null;
        ComboBox<Valeur> champValeurCombo = null;
        HiddenField<String> champRecapitulatif = null;
        HashMap<String, LayoutContainer> valeurs = null;
        ComboBox<Valeur> types = null;
        
        int largeurTotale = 420;
        int largeurBouton = 20;
        int largeurChamp = 0;
        int largeurType = 0;
        
        boolean estMultiType = false;
        boolean estComboBox = false;
        
        public ChampMultiValeurs() {
                initialiserChampMultiValeur(null, 0);
        }
        
        public ChampMultiValeurs(String label) {
                initialiserChampMultiValeur(label, 0);
        }
        
        public ChampMultiValeurs(String label, int largeurTotale) {
                initialiserChampMultiValeur(label, largeurTotale);
        }
        
        public ChampMultiValeurs(boolean estMultiType, String label, int largeurTotale, int largeurType) {
                this.estMultiType = estMultiType;
                initialiserChampMultiValeur(label, largeurTotale);
        }
                
        public ChampMultiValeurs(boolean estCombobox, boolean estMultiType, String label, int largeurTotale, int largeurType) {
                this.estMultiType = estMultiType;
                this.estComboBox = estCombobox;
                setLargeurType(largeurType);
                initialiserChampMultiValeur(label, largeurTotale);
        }
        
        public ComboBox<Valeur> getTypes() {
                return this.types;
        }
        
        public void setLabel(String label) {
                if (label == null) {
                        label = "";
                }
                nomLabelChampTxt = label;
        }
        
        public void setLargeurChamp(int largeurMax) {
                if (largeurMax != 0 && largeurMax > 20) {
                        largeurTotale = largeurMax;
                }
                
                largeurChamp = largeurTotale - largeurBouton;
        }
        
        public void setLargeurType(int largeur) {
                largeurType = largeur;
        }
                
        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;
        }
        
        private void initialiserChampMultiValeur(String label, int largeur) {
                setLabel(label);
                setLargeurChamp(largeur);
                
                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());
                
                LabelField label = new LabelField(nomLabelChampTxt + ":");
                label.setWidth("95%");
                principalLayout.add(label);
                
                LayoutContainer colonneConteneur = new LayoutContainer();
                colonneConteneur.setLayout(new ColumnLayout());
                
                if (estMultiType == true)       {
                        types = new ComboBox<Valeur>();
                        types.setDisplayField("nom");
                        types.setEmptyText("Choisissez:");                      
                        types.setStore(new ListStore<Valeur>());
                        types.setTypeAhead(true);
                        types.setTriggerAction(TriggerAction.ALL);
                        
                        types.addListener(Events.Select, new Listener<FieldEvent>() {
                                public void handleEvent(FieldEvent fe) {

                                }
                        });
                        
                        colonneConteneur.add(types, new ColumnData(largeurType));
                }
                
                if (estComboBox) {
                        champValeurCombo = new ComboBox<Valeur>();
                        champValeurCombo.setDisplayField("nom");
                        champValeurCombo.setStore(new ListStore<Valeur>());
                        colonneConteneur.add(champValeurCombo, new ColumnData(largeurChamp));                   
                } else {
                        champValeurTxt = new TextField<String>();
                        colonneConteneur.add(champValeurTxt, new ColumnData(largeurChamp));
                }
                Button ajouterBouton = new Button();
                ajouterBouton.setIcon(Images.ICONES.ajouter());
                ajouterBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        public void componentSelected(ButtonEvent ce) {
                                surAjoutValeur(true);
                        }
                });
                colonneConteneur.add(ajouterBouton, new ColumnData(largeurBouton));
                
                principalLayout.add(champRecapitulatif);
                principalLayout.add(colonneConteneur);
                add(principalLayout);
        }
        
        private void surAjoutValeur(boolean validerChamp) {
                String valeurChamp = "";
                if (estComboBox) {
                        if (champValeurCombo.getValue() != null) {
                                valeurChamp = champValeurCombo.getValue().getId();
                        }
                } else {
                        valeurChamp = champValeurTxt.getValue();
                }
                
                if ((valeurChamp == null) || valeurChamp.trim().equals("") || valeurChamp.trim().equals(valeurParDefaut))       {
                        if(validerChamp) {
                                MessageBox.alert(titreErreur, valeurVideMsg, null);
                        }
                } else if (valeurs.get(valeurChamp) != null) {
                        if(validerChamp) {
                                MessageBox.alert(titreErreur, valeurIdentiqueMsg, null);
                        }
                } else {
                        if (validationMasque != null && !valeurChamp.matches(validationMasque)) {
                                if(validerChamp) {
                                        MessageBox.alert(titreErreur, valeurNonValideMsg, null);
                                }
                        } else {
                                if (estMultiType)       {
                                        String type = "";
                                        String id = "";
                                        Valeur valeur = types.getValue();
                
                                        if (valeur != null)     {
                                                type = valeur.getNom();
                                                id = valeur.getId();
                                        } else {
                                                type = types.getRawValue();
                                                id = type;
                                        }
        
                                        if (type.trim().equals(""))     {
                                                MessageBox.alert(Mediateur.i18nM.titreErreurSaisie(), Mediateur.i18nM.typeChampMulti(), null);
                                        } else {
                                                ajouterValeur(valeurChamp, type, id);
                                        }
                                } else {
                                        ajouterValeur(valeurChamp);
                                }
                        }
                }
        }
        
        //TODO: la fonction est valide et la fonction surAjoutValeur ont beaucoup en commun
        // voir si on peut les factoriser (ou déplacer les alertes dans les classes appelantes)
        public boolean estValide(boolean autoriserVide) {
                boolean valide = true;
                String valeurChamp = "";
                if (estComboBox) {
                        if (champValeurCombo.getValue() != null) {
                                valeurChamp = champValeurCombo.getValue().getId();
                        }
                } else {
                        valeurChamp = champValeurTxt.getValue();
                }
                
                if ((valeurChamp == null) || valeurChamp.trim().equals("") || valeurChamp.trim().equals(valeurParDefaut))       {
                        if(!autoriserVide) {
                                valide = false;
                        }
                } else if (valeurs.get(valeurChamp) != null) {
                        if(!autoriserVide) {
                                valide = false;
                        }
                } else {
                        if (validationMasque != null && !valeurChamp.matches(validationMasque)) {
                                        valide = false;
                        } else {
                                if (estMultiType)       {
                                        String type = "";
                                        String id = "";
                                        Valeur valeur = types.getValue();
                
                                        if (valeur != null)     {
                                                type = valeur.getNom();
                                                id = valeur.getId();
                                        } else {
                                                type = types.getRawValue();
                                                id = type;
                                        }
        
                                        if (type.trim().equals(""))     {
                                                valide = false;
                                        }
                                }
                        }
                }
                return valide;
        }
        
        public void ajouterValeur(final String texte, final String strValeur, final String id)  {
                //Implémenté dans classe inférieure
        }
        
        public 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(largeurChamp));
                
                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();
        }
        
        public void reinitialiserChamp()        {
                if (estComboBox) {
                        champValeurCombo.setValue(champValeurCombo.getStore().findModel("id_valeur", valeurParDefaut));
                } else {
                        champValeurTxt.setValue(valeurParDefaut);
                }
                
                if (estMultiType) {
                        types.reset();
                }
        }
        
        public void actualiserLayoutGlobal() {
                layout();
        }
        
        public void ajouterValeurAuRecapitulatif(String texte) {
                String texteRecapitulatif = "";
                if (champRecapitulatif.getValue() != null)      {
                        texteRecapitulatif = champRecapitulatif.getValue();
                }
                texteRecapitulatif += texte + aDonnee.SEPARATEUR_VALEURS;
                champRecapitulatif.setValue(texteRecapitulatif);
        }
        
        public void supprimerValeurDuRecapitulatif(String texte) {

                if (champRecapitulatif.getValue() != null)      {
                        String texteValeur = "";
                        if (estComboBox) {
                                // comme c'est le nom de la valeur qui est passée en paramètre,
                                // on doit récupérer son id
                                ListStore<Valeur> valeurs = champValeurCombo.getStore();
                                Valeur objetValeur = valeurs.findModel("nom", texte);
                                
                                if (objetValeur != null)        {
                                        texteValeur = objetValeur.getId();
                                } else {
                                        texteValeur = texte;
                                }
                        } else {
                                texteValeur = texte;
                        }
                        
                        String texteRecapitulatif = champRecapitulatif.getValue();
                        texteRecapitulatif = texteRecapitulatif.replace(texteValeur + aDonnee.SEPARATEUR_VALEURS, "");
                        champRecapitulatif.setValue(texteRecapitulatif);
                }
        }
        
        public String getValeurs() {
                // permet de s'assurer qu'une valeur saisie dans le champ mais non ajoutée par le 
                // clic sur le + soit bien prise en compte
                surAjoutValeur(false);
                String texteRecapitulatif = "";
                if (champRecapitulatif.getValue() != null) {
                        texteRecapitulatif = champRecapitulatif.getValue();
                        texteRecapitulatif = texteRecapitulatif.replaceAll("(.*)"+aDonnee.SEPARATEUR_VALEURS+"$", "$1");
                }
                return texteRecapitulatif;
        }
        
        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]);
                        }
                }
        }
        
        public 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();
                initialiserChampMultiValeur(nomLabelChampTxt, largeurTotale);
        }
}