Subversion Repositories eFlore/Applications.coel

Rev

Rev 812 | Rev 853 | 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 com.extjs.gxt.ui.client.event.ButtonEvent;
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.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.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;
import com.google.gwt.core.client.GWT;

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 validation = null;
        String exempleValidation = null;
        String boutonSupprimerLabel = "";
        
        LayoutContainer principalLayout = null;
        TextField<String> champTexte = null;
        HiddenField<String> champRecapitulatif = null;
        HashMap<String, LayoutContainer> valeurs = null;
        ComboBox<Valeur> types = null;
        
        int largeurTotale = 420;
        int largeurBouton = 20;
        int largeurChamp = 0;
        
        boolean estMultiType = 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) {
                this.estMultiType = estMultiType; 
                initialiserChampMultiValeur(label, largeurTotale);
        }
        
        public void setLabel(String label) {
                if (label == null) {
                        label = "";
                }
                nomLabelChampTxt = label;
        }
        
        public void setLargeur(int largeur) {
                if (largeur != 0 && largeur > 20) {
                        largeurTotale = largeur;
                }
                largeurChamp = largeurTotale - largeurBouton;
        }
        
        public void setValidation (String validation, String exempleValidation) {
                this.validation = validation;
                this.exempleValidation = exempleValidation;
                
                this.valeurNonValideMsg = Mediateur.i18nM.valeurNonValideMsg(exempleValidation);
        }
        
        public void setValeurParDefaut(String valeur)   {
                this.valeurParDefaut = valeur;
                champTexte.setValue(valeur);
        }
        
        public void setValeurBoutonSupprimer(String valeur)     {
                this.boutonSupprimerLabel = valeur;
        }
        
        private void initialiserChampMultiValeur(String label, int largeur) {
                setLabel(label);
                setLargeur(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(largeurChamp);
                principalLayout.add(label);
                
                LayoutContainer colonneLayout = new LayoutContainer();
                colonneLayout.setLayout(new ColumnLayout());
                
                if (estMultiType == true)       {
                        largeurChamp = largeurChamp - 150;
                        types = new ComboBox<Valeur>();
                        types.setDisplayField("nom");
                        types.setEmptyText("Choisissez:");                      
                        types.setStore(new ListStore<Valeur>());
                        colonneLayout.add(types, new ColumnData(150));
                }
                
                champTexte = new TextField<String>();
                colonneLayout.add(champTexte, new ColumnData(largeurChamp));

                Button ajouterBouton = new Button();
                ajouterBouton.setIcon(Images.ICONES.ajouter());
                ajouterBouton.addSelectionListener(
                        new SelectionListener<ButtonEvent>() {
                                public void componentSelected(ButtonEvent ce) {
                                        String valeurChampTxt = (String) champTexte.getValue();
                                        if ((valeurChampTxt == null) || valeurChampTxt.trim().equals("") || valeurChampTxt.trim().equals(valeurParDefaut))      {
                                                MessageBox.alert(titreErreur, valeurVideMsg, null);
                                        } else if (valeurs.get(valeurChampTxt) != null){
                                                MessageBox.alert(titreErreur, valeurIdentiqueMsg, null);                                                        
                                        } else {
                                                if (validation!=null && !valeurChampTxt.matches(validation))    {
                                                        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("Erreur de saisie", "Vous devez saisir un type ", null);
                                                                }       else {
                                                                        ajouterValeur(valeurChampTxt, type, id);
                                                                }
                                                                
                                                                
                                                        } else {
                                                                ajouterValeur(valeurChampTxt);
                                                        }
                                                }
                                        }
                                }
                        });
                colonneLayout.add(ajouterBouton, new ColumnData(largeurBouton));
                
                principalLayout.add(champRecapitulatif);
                principalLayout.add(colonneLayout);
                add(principalLayout);
        }
        
        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()        {
                champTexte.setValue(valeurParDefaut);   
        }
        
        public void actualiserLayoutGlobal() {
                GWT.log("Valeurs : "+getValeurs(), null);
                layout();
        }
        
        public void ajouterValeurAuRecapitulatif(String texte) {
                String texteRecapitulatif = "";
                if (champRecapitulatif.getValue() != null)      {
                        texteRecapitulatif = champRecapitulatif.getValue();
                }
                texteRecapitulatif += texte + ";;";
                champRecapitulatif.setValue(texteRecapitulatif);
        }
        
        public void supprimerValeurDuRecapitulatif(String texte) {
                if (champRecapitulatif.getValue() != null)      {
                        String texteRecapitulatif = champRecapitulatif.getValue();
                        texteRecapitulatif = texteRecapitulatif.replace(texte + ";;", "");
                        champRecapitulatif.setValue(texteRecapitulatif);
                }
        }
        
        public String getValeurs() {
                String texteRecapitulatif = "";
                if (champRecapitulatif.getValue() != null) {
                        texteRecapitulatif = champRecapitulatif.getValue();
                        texteRecapitulatif = texteRecapitulatif.replaceAll("(.*);;$", "$1");
                }
                return texteRecapitulatif;
        }
        
        public void peupler(String chaineExistante) {
                reinitialiser();
                if (chaineExistante != null && !chaineExistante.trim().equals("")) {
                        String[] valeurs = chaineExistante.split(";;");
                        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);
        }
}