Subversion Repositories eFlore/Applications.coel

Rev

Rev 1383 | 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.configuration.Configuration;
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.ValeurListe;
import org.tela_botanica.client.modeles.aDonnee;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.vues.Formulaire;

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.Component;
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.RowLayout;

public class ChampMultiValeursMultiTypesPaginable extends ChampMultiValeursPaginable implements Rafraichissable {

          //-------------//
         //  ATTRIBUTS  //
        //-------------//
        
        // Elements pour le champ 'types'
        ColumnData colonneChampTypes = null;
        ChampComboBoxRechercheTempsReelPaginable champTypesComboBox = null;
        int largeurChampTypes = 200;
        String displayNameChampTypes = "nom";
        
        // Elements pour gérer le type de valeurs que contient le champ
        Proxy proxyChampTypes = null;
        ModelType modeltypeChampTypes = null;

        // Variables de traitement
        HashMap<Integer, String> tempMapValeurs = null;
        
          //-------------//
         //   METHODES  //
        //-------------//

        /*--------------
          Constructeur 
        --------------*/
        public ChampMultiValeursMultiTypesPaginable(String label, int largeurTotale, boolean estCombobox, ModelType modeltypeChampValeur, Proxy proxyChampValeur, String displayNameChampValeur, ModelType modeltypeChampTypes, Proxy proxyChampTypes, String displayNameChampTypes) {
                super(label, largeurTotale, estCombobox, modeltypeChampValeur, proxyChampValeur, displayNameChampValeur);
                
                this.proxyChampTypes = proxyChampTypes;
                this.modeltypeChampTypes = modeltypeChampTypes;
                this.displayNameChampTypes = displayNameChampTypes;
                
                initialiserChampMultiValeursMultiTypesPaginable(label);
        }

        /*------------
          Accesseurs 
        ------------*/
        
         //------------//
        //    Get     //------------------------------------------------------------
        
        public ChampComboBoxRechercheTempsReelPaginable getChampTypesComboBox() {
                return this.champTypesComboBox;
        }
        
         //------------//
        //    Set     //------------------------------------------------------------
        
        @Override
        public void setLargeurTotale(int largeurTotale) {
                this.largeurTotale = largeurTotale;
                largeurChampValeur = largeurTotale - largeurBouton - largeurChampTypes;
        }
        
        /*-------------------------------------------
          Méthodes protégées et méthodes publiques 
        --------------------------------------------*/
        
        @Override
        public void rafraichir(Object nouvellesDonnees) {
                super.rafraichir(nouvellesDonnees);
                
                if (nouvellesDonnees instanceof ValeurListe) {
                        Valeur v = ((ValeurListe)nouvellesDonnees).toList().get(0);
                        ajouterValeur(tempMapValeurs.get(Integer.parseInt(v.getId())), v.getNom(), v.getId());
                }
        }
        
        @Override
        protected void ajouterValeur(final String texte, final String type, final String idType) {
                
                LayoutContainer colonneConteneur = new LayoutContainer();
                colonneConteneur.setLayout(new ColumnLayout());
                valeurs.put(idType + aDonnee.SEPARATEUR_TYPE_VALEUR + texte, colonneConteneur);
                
                Text champType = new Text();
                champType.setText(type + " : ");
                champType.setWidth(largeurChampTypes);
                colonneConteneur.add(champType, new ColumnData(largeurChampTypes));
                
                Text champValeur = new Text();
                champValeur.setText(texte);
                champValeur.setWidth(largeurChampTypes);
                colonneConteneur.add(champValeur, new ColumnData(largeurChampTypes));
                
                Button supprimerBouton = new Button();
                supprimerBouton.setIcon(Images.ICONES.supprimer());
                supprimerBouton.setText(boutonSupprimerLabel);
                supprimerBouton.setData("valeur", idType + aDonnee.SEPARATEUR_TYPE_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();
                        }
                });
                colonneConteneur.add(supprimerBouton, new ColumnData(largeurBouton));
                
                // Ajout du layout de la valeur au layout principal
                principalLayout.add(colonneConteneur);
                
                // Ajout de la valeur au champ récapitulatif des valeurs ajoutées             
                ajouterValeurAuRecapitulatif(texte, idType);
                
                reinitialiserChamp();
                actualiserLayoutGlobal();
        }

        @Override
        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++) {
                                String[] idEtValeur = valeurs[i].split(aDonnee.SEPARATEUR_TYPE_VALEUR);
                                if (idEtValeur.length == 2) {
                                        String idType = idEtValeur[0];
                                        String idValeur = idEtValeur[1];
                                        
                                        // Champ Valeur
                                        if (idType.matches("[0-9]+")) {
                                                tempMapValeurs.put(Integer.parseInt(idType), idValeur);
                                        } else {
                                                tempMapValeurs.put(((Configuration)(Registry.get(RegistreId.CONFIG))).getListeId(idType), idValeur);
                                        }
        
                                        // Champ Types
                                        mediateur.obtenirListeValeurEtRafraichir(this, Integer.parseInt(idType), null);
                                } else {
                                        InfoLogger.display("Erreur", "ChampMultiValeursMultiTypesPaginable. Erreur dans le split de "+chaineExistante, true);
                                }
                        }
                }
        }

        
        /*------------------
          Méthodes privées 
        ------------------*/
        
        private void initialiserChampMultiValeursMultiTypesPaginable(String label) {
                setLargeurTotale(largeurTotale);
                tempMapValeurs = new HashMap<Integer,String>();
                creerChampMultiValeursMultiTypes();
        }

        private void creerChampMultiValeursMultiTypes() {
                
                /* Creation du champ Types */           
                champTypesComboBox = new ChampComboBoxRechercheTempsReelPaginable(proxyChampTypes, modeltypeChampTypes, displayNameChampTypes);
                champTypesComboBox.setWidth(largeurChampTypes);
                champTypesComboBox.getCombo().setEmptyText("Type...");
                
                champTypesComboBox.addListener(Events.Select, new Listener<FieldEvent>() {
                        public void handleEvent(FieldEvent fe) {

                        }
                });

                /* Placement des éléments dans le conteneur */
                // le champ "types" doit être graphiquement placé avant les autres champs,
                // on doit donc retirer ces derniers avant d'insérer le champ "types"          
                colonneConteneur.removeAll();
                colonneConteneur.setWidth(largeurTotale);
                colonneChampTypes = new ColumnData(largeurChampTypes); 
                colonneChampTypes.setWidth(largeurChampTypes);
                colonneConteneur.add(champTypesComboBox, colonneChampTypes);            
                if (champValeurEstComboBox) {
                        champValeurComboBox.setWidth(largeurChampValeur);
                        colonneChampValeur.setWidth(largeurChampValeur);
                        colonneConteneur.add(champValeurComboBox, colonneChampValeur);                  
                } else {
                        champValeurTxt.setWidth(largeurChampValeur);
                        colonneChampValeur.setWidth(largeurChampValeur);
                        colonneConteneur.add(champValeurTxt, colonneChampValeur);
                }
                ajouterBouton.setWidth(largeurBouton);
                colonneBoutonAjouter.setWidth(largeurBouton);
                colonneConteneur.add(ajouterBouton, colonneBoutonAjouter);

                /* Modification de l'écouteur du bouton Ajouter */
                ajouterBouton.removeAllListeners();
                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) {
                                                Valeur val = new Valeur(champValeurComboBox.getValeur());
                                                valeurChamp = val.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 { // VALIDATION OK
                                                Valeur type = new Valeur(champTypesComboBox.getValeur());
                                                String typeNomStr = type.getNom();
                                                String typeIdStr = type.getId();

                                                if (typeIdStr.trim().equals(""))        {
                                                        MessageBox.alert(Mediateur.i18nM.titreErreurSaisie(), Mediateur.i18nM.typeChampMulti(), null);
                                                } else {
                                                        ajouterValeur(valeurChamp, typeNomStr, typeIdStr);
                                                }
                                        }
                                }
                        }
                });
        }
        
        private void ajouterValeurAuRecapitulatif(String texte, String id) {
                String texteRecapitulatif = "";
                if (champRecapitulatif.getValue() != null)      {
                        texteRecapitulatif = champRecapitulatif.getValue();
                }
                texteRecapitulatif += id + aDonnee.SEPARATEUR_TYPE_VALEUR + texte + aDonnee.SEPARATEUR_VALEURS;
                champRecapitulatif.setValue(texteRecapitulatif);
        }
}