Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.vues.structure;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.tela_botanica.client.ComposantClass;
import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.RegistreId;
import org.tela_botanica.client.composants.ChampComboBoxListeValeurs;
import org.tela_botanica.client.composants.ChampComboBoxRechercheTempsReelPaginable;
import org.tela_botanica.client.composants.ChampNombre;
import org.tela_botanica.client.composants.InfoLogger;
import org.tela_botanica.client.composants.pagination.ProxyProjets;
import org.tela_botanica.client.composants.pagination.ProxyValeur;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Information;
import org.tela_botanica.client.modeles.InterneValeur;
import org.tela_botanica.client.modeles.InterneValeurListe;
import org.tela_botanica.client.modeles.Valeur;
import org.tela_botanica.client.modeles.ValeurListe;
import org.tela_botanica.client.modeles.personne.Personne;
import org.tela_botanica.client.modeles.projet.Projet;
import org.tela_botanica.client.modeles.structure.Structure;
import org.tela_botanica.client.modeles.structure.StructureAPersonne;
import org.tela_botanica.client.modeles.structure.StructureAPersonneListe;
import org.tela_botanica.client.modeles.structure.StructureConservation;
import org.tela_botanica.client.modeles.structure.StructureValorisation;
import org.tela_botanica.client.synchronisation.Sequenceur;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.util.Pattern;
import org.tela_botanica.client.util.UtilString;
import org.tela_botanica.client.vues.Formulaire;
import org.tela_botanica.client.vues.FormulaireOnglet;

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.BaseEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.CheckBoxGroup;
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.FieldSet;
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.NumberField;
import com.extjs.gxt.ui.client.widget.form.RadioGroup;
import com.extjs.gxt.ui.client.widget.form.TextArea;
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.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
import com.extjs.gxt.ui.client.widget.grid.EditorGrid;
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.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.Window;

public class StructureFormIdentification extends FormulaireOnglet implements Rafraichissable {
        
        public TabItem personnelOnglet;
        public TabItem conservationOnglet;
        public TabItem valorisationOnglet;
        public HiddenField<String> idStructureChp;
        public Structure identification;
        public ListStore<Valeur> magazinLstpr;
        public ComboBox<Valeur> comboLstpr;
        public ListStore<Valeur> magazinLstpu;
        public ComboBox<Valeur> comboLstpu;
        public ComboBox<InterneValeur> comboAcronyme;
        public TextField<String> ihChp;
        public TextField<String> mnhnChp;
        public ComboBox<InterneValeur> comboTypeStructure;
        public TextField<String> nomStructureChp;
        public TextField<String> dateFondationChp;
        public TextArea descriptionChp;
        public TextArea conditionAccesChp;
        public TextArea conditionUsageChp;
        public TextArea adrChp;
        public TextArea adrComplementChp;
        public TextField<String> cpChp;
        public TextField<String> villeChp;
        public ListStore<Valeur> magazinRegion;
        public ComboBox<Valeur> comboRegion;
        public ListStore<Valeur> magazinPays;
        public ChampComboBoxRechercheTempsReelPaginable comboPays;
        public TextField<String> latitudeChp;
        public TextField<String> longitudeChp;
        public TextField<String> telChp;
        public TextField<String> faxChp;
        public TextField<String> emailChp;
        public TextField<String> urlChp;
        public StructureAPersonneListe personnel;
        public StructureAPersonneListe personnelAjoute;
        public StructureAPersonneListe personnelModifie;
        public StructureAPersonneListe personnelSupprime;
        public NumberField nbreTotalPersonneStructureChp;
        public EditorGrid<StructureAPersonne> grillePersonnel;
        public ListStore<StructureAPersonne> personnelGrilleMagazin;
        public StructureConservation conservation;
        public RadioGroup formationMarkRGrpChp;
        public RadioGroup interetFormationMarkRGrpChp;
        public RadioGroup collectionCommuneMarkRGrpChp;
        public RadioGroup accesControleMarkRGrpChp;
        public RadioGroup restaurationMarkRGrpChp;
        public RadioGroup traitementMarkRGrpChp;
        public RadioGroup collectionAcquisitionMarkRGrpChp;
        public RadioGroup echantillonAcquisitionMarkRGrpChp;
        public TextField<String> localStockageAutreChp;
        public TextField<String> meubleStockageAutreChp;
        public TextField<String> parametreStockageAutreChp;
        public TextField<String> collectionAutreAutreChp;
        public TextField<String> autreCollectionAutreChp;
        public TextField<String> opRestauAutreChp;
        public TextField<String> autreMaterielAutreChp;
        public TextField<String> poisonTraitementAutreChp;
        public TextField<String> traitementAutreChp;
        public TextField<String> insecteTraitementAutreChp;
        public TextField<String> actionAutreChp;
        public TextField<String> provenanceRechercheAutreChp;
        public TextField<String> typeRechercheAutreChp;
        public CheckBoxGroup localStockageTrukCacGrpChp;
        public LayoutContainer localStockageTrukCp;
        public CheckBoxGroup meubleStockageTrukCacGrpChp;
        public LayoutContainer meubleStockageTrukCp;
        public CheckBoxGroup parametreStockageTrukCacGrpChp;
        public LayoutContainer parametreStockageTrukCp;
        public LayoutContainer collectionAutreTrukCp;
        public CheckBoxGroup collectionAutreTrukCacGrpChp;
        public CheckBoxGroup opRestauTrukCacGrpChp;
        public LayoutContainer opRestauTrukCp;
        public CheckBoxGroup autreMaterielTrukCacGrpChp;
        public LayoutContainer autreMaterielTrukCp;
        public LayoutContainer traitementTrukCp;
        public CheckBoxGroup traitementTrukCacGrpChp;
        public LayoutContainer poisonTraitementTrukCp;
        public LayoutContainer insecteTraitementTrukCp;
        public CheckBoxGroup insecteTraitementTrukCacGrpChp;
        public CheckBoxGroup poisonTraitementTrukCacGrpChp;
        public LayoutContainer autreCollectionTrukCp;
        public CheckBoxGroup autreCollectionTrukCacGrpChp;
        public LayoutContainer provenanceRechercheTrukCp;
        public CheckBoxGroup provenanceRechercheTrukCacGrpChp;
        public CheckBoxGroup typeRechercheTrukCacGrpChp;
        public LayoutContainer typeRechercheTrukCp;
        public TextField<String> futureActionChp;
        public TextField<String> sansMotifAccesChp;
        public TextField<String> avecMotifAccesChp;
        public TextField<String> formationChp;
        public RadioGroup traitementAcquisitionMarkRGrpChp;
        public LabelField traitementAcquisitionMarkLabel;
        public RadioGroup materielConservationCeRGrpChp;
        public StructureValorisation valorisation;
        public RadioGroup actionMarkRGrpChp;
        public LayoutContainer actionTrukCp;
        public CheckBoxGroup actionTrukCacGrpChp;
        public RadioGroup futureActionMarkRGrpChp;
        public RadioGroup rechercheMarkRGrpChp;
        public RadioGroup sansMotifAccesMarkRGrpChp;
        public RadioGroup avecMotifAccesMarkRGrpChp;
        public TextField<String> publicationChp;
        public LayoutContainer materielConservationCp;
        public ListStore<Personne> personneExistanteMagazin;
        public ChampComboBoxRechercheTempsReelPaginable personneExistanteCombo;
        public Button supprimerPersonnelBtn;
        public ListStore<Projet> projetsMagazin;
        public ChampComboBoxRechercheTempsReelPaginable projetsCombo;
        public CellEditor fonctionEditor;
        public List<Valeur> fonctionsListe;
        public Sequenceur sequenceur;
        public Structure structure;
        public Rafraichissable vueExterneARafraichirApresValidation;
        
        private String ID = "identification";
        
        Formulaire formulaireCourant;
        
        public StructureFormIdentification(Formulaire formulaireCourant) {
                
                initialiserOnglet(formulaireCourant);
                setLayout(new FitLayout());
                setId(ID);
                setText(Mediateur.i18nC.structureInfoGeneral());
                setStyleAttribute("padding", "0");
                
                this.formulaireCourant = formulaireCourant;
                
                //+-----------------------------------------------------------------------------------------------------------+
                        //+-----------------------------------------------------------------------------------------------------------+
                        // Champs cachés
                        idStructureChp = new HiddenField<String>();
                        
                        //+-----------------------------------------------------------------------------------------------------------+
                        // Fieldset IDENTITÉ
                        FieldSet fieldSetIdentite = new FieldSet();
                        fieldSetIdentite.setHeadingHtml("Identité");
                        fieldSetIdentite.setCollapsible(true);
                        fieldSetIdentite.setLayout(Formulaire.creerFormLayout(120, LabelAlign.LEFT));
                        fieldSetIdentite.setAutoHeight(true);
                        
                        nomStructureChp = new TextField<String>();
                        nomStructureChp.setTabIndex(tabIndex++);
                        nomStructureChp.setFieldLabel("Nom de la structure");
                        nomStructureChp.setAllowBlank(false);
                        nomStructureChp.getMessages().setBlankText("Ce champ est obligatoire.");
                        nomStructureChp.addStyleName(ComposantClass.OBLIGATOIRE);
                        nomStructureChp.addListener(Events.Valid, Formulaire.creerEcouteurChampObligatoire());
                        fieldSetIdentite.add(nomStructureChp, new FormData(450, 0));
                        
                        ModelType modelTypeProjets = new ModelType();
                        modelTypeProjets.setRoot("projets");
                        modelTypeProjets.setTotalName("nbElements");
                        modelTypeProjets.addField("cpr_nom");
                        modelTypeProjets.addField("cpr_id_projet");
                        
                        String displayNameProjets = "cpr_nom";
                        ProxyProjets<ModelData> proxyProjets = new ProxyProjets<ModelData>(null);
                        
                        projetsCombo = new ChampComboBoxRechercheTempsReelPaginable(proxyProjets, modelTypeProjets, displayNameProjets);
                        projetsCombo.getCombo().setTabIndex(tabIndex++);
                        projetsCombo.getCombo().setFieldLabel(i18nC.projetChamp());
                        projetsCombo.getCombo().setForceSelection(true);
                        projetsCombo.getCombo().addStyleName(ComposantClass.OBLIGATOIRE);
                        projetsCombo.getCombo().addListener(Events.Valid, Formulaire.creerEcouteurChampObligatoire());
                        projetsCombo.setWidth(120, 520);
                        fieldSetIdentite.add(projetsCombo, new FormData(520, 0));
                        
                        // Création du sous-formulaire : Acronyme
                        LayoutContainer ligne = new LayoutContainer();  
                        ligne.setLayout(new ColumnLayout());
                        ligne.setSize(600, -1);
                        
                        LayoutContainer gauche = new LayoutContainer();
                        gauche.setLayout(Formulaire.creerFormLayout(120, LabelAlign.LEFT));
                        LayoutContainer droite = new LayoutContainer();
                        droite.setLayout(Formulaire.creerFormLayout(10, LabelAlign.LEFT));
                        
                        ListStore<InterneValeur> acronymes = new ListStore<InterneValeur>();  
                        acronymes.add(InterneValeurListe.getTypeAcronyme()); 
                        
                        comboAcronyme = new ComboBox<InterneValeur>();
                        comboAcronyme.setTabIndex(tabIndex++);
                        comboAcronyme.setEmptyText("Sélectioner un type d'acronyme...");
                        comboAcronyme.setFieldLabel("Type d'acronyme");
                        comboAcronyme.setDisplayField("nom");
                        comboAcronyme.setStore(acronymes);
                        comboAcronyme.setEditable(false);
                        comboAcronyme.setTypeAhead(true);  
                        comboAcronyme.setTriggerAction(TriggerAction.ALL);
                        comboAcronyme.addSelectionChangedListener(new SelectionChangedListener<InterneValeur>() {
                                @Override
                                public void selectionChanged(SelectionChangedEvent<InterneValeur> se) {
                                        String acronymeAbr = se.getSelectedItem().getAbr();
                                        if (acronymeAbr.equals("IH")) {
                                                mnhnChp.hide();
                                                ihChp.show();
                                        } else if (acronymeAbr.equals("MNHN")) {
                                                ihChp.hide();
                                                mnhnChp.show();
                                        } else if (acronymeAbr.equals("")) {
                                                ihChp.hide();
                                                mnhnChp.hide();
                                                comboAcronyme.clearSelections();
                                        }
                                }
                });
                        gauche.add(comboAcronyme, new FormData("95%"));
                        
                        ihChp = new TextField<String>();  
                        ihChp.setTabIndex(tabIndex++);
                        ihChp.setLabelSeparator("");
                        ihChp.setToolTip("Index Herbariorum : herbier de plus de 5000 échantillons");
                        ihChp.hide();
                        droite.add(ihChp, new FormData("95%"));
                        
                        mnhnChp = new TextField<String>();
                        mnhnChp.setTabIndex(tabIndex++);
                        mnhnChp.setLabelSeparator("");
                        mnhnChp.setToolTip("Acronyme MNHN : herbier de moins de 5000 échantillons");
                        mnhnChp.hide();
                        droite.add(mnhnChp, new FormData("95%"));
                        
                        ligne.add(gauche, new ColumnData(.5));  
                        ligne.add(droite, new ColumnData(.5));
                        fieldSetIdentite.add(ligne);
                        
                        // Création du sous-formulaire : Type de Structure
                        LayoutContainer ligneTs = new LayoutContainer();  
                        ligneTs.setLayout(new ColumnLayout());
                        ligneTs.setSize(600, -1);
                        
                        LayoutContainer gaucheTs = new LayoutContainer();
                        gaucheTs.setLayout(Formulaire.creerFormLayout(120, LabelAlign.LEFT));
                        
                        LayoutContainer droiteTs = new LayoutContainer();
                        droiteTs.setLayout(Formulaire.creerFormLayout(10, LabelAlign.LEFT));
                        
                        ListStore<InterneValeur> typesStructure = new ListStore<InterneValeur>();  
                        typesStructure.add(InterneValeurListe.getTypeStructure());
                        
                        comboTypeStructure = new ComboBox<InterneValeur>();
                        comboTypeStructure.setTabIndex(tabIndex++);
                        comboTypeStructure.setEmptyText("Sélectioner un type de structure...");
                        comboTypeStructure.setFieldLabel("Statut des structures");
                        comboTypeStructure.setDisplayField("nom");
                        comboTypeStructure.setStore(typesStructure);
                        comboTypeStructure.setEditable(false);
                        comboTypeStructure.setTypeAhead(true);  
                        comboTypeStructure.setTriggerAction(TriggerAction.ALL);
                        comboTypeStructure.addSelectionChangedListener(new SelectionChangedListener<InterneValeur>() {
                                @Override
                                public void selectionChanged(SelectionChangedEvent<InterneValeur> se) {
                                        String typeAbr = se.getSelectedItem().getAbr();
                                        if (typeAbr.equals("stpu")) {
                                                comboLstpr.hide();
                                                comboLstpu.show();
                                        } else if (typeAbr.equals("stpr")) {
                                                comboLstpu.hide();
                                                comboLstpr.show();
                                        } else if (typeAbr.equals("")) {
                                                comboLstpr.hide();
                                                comboLstpu.hide();
                                                comboTypeStructure.clearSelections();
                                        }
                                }
                });
                        gaucheTs.add(comboTypeStructure, new FormData("95%"));
                        
                        magazinLstpu = new ListStore<Valeur>();
                        comboLstpu = new ComboBox<Valeur>();
                        comboLstpu.setTabIndex(tabIndex++);
                        //comboLstpu.setFieldLabel("Statut des structures publiques");
                        comboLstpu.setLabelSeparator("");
                        comboLstpu.setDisplayField("nom");
                        comboLstpu.setEditable(false);
                        comboLstpu.setTriggerAction(TriggerAction.ALL);
                        comboLstpu.setStore(magazinLstpu);
                        comboLstpu.hide();
                        droiteTs.add(comboLstpu, new FormData("95%"));
                        mediateur.obtenirListeValeurEtRafraichir(this, "stpu", sequenceur);
                        
                        magazinLstpr = new ListStore<Valeur>();
                        comboLstpr = new ComboBox<Valeur>();
                        comboLstpr.setTabIndex(tabIndex++);
                        //comboLstpr.setFieldLabel("Statut des structures privées");
                        comboLstpr.setLabelSeparator("");
                        comboLstpr.setDisplayField("nom");
                        comboLstpr.setEditable(false);
                        comboLstpr.setTriggerAction(TriggerAction.ALL);
                        comboLstpr.setStore(magazinLstpr);
                        comboLstpr.hide();
                        droiteTs.add(comboLstpr, new FormData("95%"));
                        mediateur.obtenirListeValeurEtRafraichir(this, "stpr", sequenceur);
                        
                        ligneTs.add(gaucheTs, new ColumnData(0.5));  
                        ligneTs.add(droiteTs, new ColumnData(0.5));
                        fieldSetIdentite.add(ligneTs);
                        
                        dateFondationChp = new TextField();
                        dateFondationChp.setTabIndex(tabIndex++);
                        dateFondationChp.setFieldLabel("Date de fondation");
                        fieldSetIdentite.add(dateFondationChp);
                        
                        nbreTotalPersonneStructureChp = new NumberField(); 
                        nbreTotalPersonneStructureChp.setFieldLabel("Nombre de personnes travaillant dans l'institution");
                        nbreTotalPersonneStructureChp.setFormat(NumberFormat.getFormat("#"));
                        nbreTotalPersonneStructureChp.setToolTip(i18nC.champNumerique());
                        nbreTotalPersonneStructureChp.setAllowDecimals(false);
                        nbreTotalPersonneStructureChp.setAllowNegative(false);
                        nbreTotalPersonneStructureChp.setEmptyText("");
                        fieldSetIdentite.add(nbreTotalPersonneStructureChp);

                        this.add(fieldSetIdentite);
                        
                        //+-----------------------------------------------------------------------------------------------------------+         
                        // Fieldset DESCRIPTION
                        FieldSet fieldSetDescription = new FieldSet();
                        fieldSetDescription.setHeadingHtml("Description");
                        fieldSetDescription.setCollapsible(true);
                        fieldSetDescription.setLayout(Formulaire.creerFormLayout(120, LabelAlign.LEFT));
                        
                        descriptionChp = new TextArea();
                        descriptionChp.setTabIndex(tabIndex++);
                        descriptionChp.setFieldLabel("Description");
                        fieldSetDescription.add(descriptionChp, new FormData(550, 0));
                        
                        conditionAccesChp = new TextArea();
                        conditionAccesChp.setTabIndex(tabIndex++);
                        conditionAccesChp.setFieldLabel("Conditions d'accès");
                        fieldSetDescription.add(conditionAccesChp, new FormData(550, 0));
                        
                        conditionUsageChp = new TextArea();
                        conditionUsageChp.setTabIndex(tabIndex++);
                        conditionUsageChp.setFieldLabel("Conditions d'usage");
                        fieldSetDescription.add(conditionUsageChp, new FormData(550, 0));
                        
                        this.add(fieldSetDescription);
                        
                        //+-----------------------------------------------------------------------------------------------------------+         
                        // Fieldset ADRESSE
                        LayoutContainer principalFdAdresse = new LayoutContainer();  
                        principalFdAdresse.setLayout(new ColumnLayout());
                        principalFdAdresse.setSize(1050, -1);
                        
                        LayoutContainer gaucheFdAdresse = new LayoutContainer();
                        gaucheFdAdresse.setLayout(Formulaire.creerFormLayout(null, LabelAlign.LEFT));
                        
                        LayoutContainer droiteFdAdresse = new LayoutContainer();
                        droiteFdAdresse.setLayout(Formulaire.creerFormLayout(100, LabelAlign.LEFT));
                        droiteFdAdresse.setWidth(700);
                        
                        FieldSet fieldSetAdresse = new FieldSet();
                        fieldSetAdresse.setHeadingHtml("Adresse");
                        fieldSetAdresse.setCollapsible(true);
                        
                        fieldSetAdresse.setLayout(Formulaire.creerFormLayout(null, LabelAlign.LEFT));
                        
                        adrChp = new TextArea();
                        adrChp.setTabIndex(tabIndex++);
                        adrChp.setFieldLabel("Adresse (Nom du batiment, rue...)");
                        fieldSetAdresse.add(adrChp, new FormData(550, 0));
                        
                        adrComplementChp = new TextArea();
                        adrComplementChp.setTabIndex(tabIndex++);
                        adrComplementChp.setFieldLabel("Complément d'adresse (BP, étage...)");
                        fieldSetAdresse.add(adrComplementChp, new FormData(550, 0));
                        
                        cpChp = new TextField<String>();
                        cpChp.setTabIndex(tabIndex++);
                        cpChp.setFieldLabel("Code postal");
                        gaucheFdAdresse.add(cpChp, new FormData("95%"));
                        
                        villeChp = new TextField<String>();
                        villeChp.setTabIndex(tabIndex++);
                        villeChp.setFieldLabel("Ville");
                        gaucheFdAdresse.add(villeChp, new FormData("95%"));
                        
                        ModelType modelTypesPays = new ModelType();
                        modelTypesPays.setRoot("valeurs");
                        modelTypesPays.setTotalName("nbElements");
                        modelTypesPays.addField("cmlv_nom");
                        modelTypesPays.addField("cmlv_id_valeur");
                        modelTypesPays.addField("cmlv_abreviation");
                        modelTypesPays.addField("cmlv_description");
                        
                        String displayNamePays = "cmlv_nom";
                        String nomListeTypes = "pays";
                        ProxyValeur<ModelData> proxyPays = new ProxyValeur<ModelData>(nomListeTypes, null);
                        
                        comboPays = new ChampComboBoxRechercheTempsReelPaginable(proxyPays, modelTypesPays, displayNamePays);
                        comboPays.setWidth(100,500);
                        comboPays.getCombo().setTabIndex(tabIndex++);
                        comboPays.getCombo().setFieldLabel("Pays");
                        comboPays.getCombo().setForceSelection(true);
                        comboPays.getCombo().setTemplate(getTemplatePays());
                        
                        SelectionChangedListener<ModelData> selectionChange = new SelectionChangedListener<ModelData>() {
                                public void selectionChanged(SelectionChangedEvent se) {
                                        // Rafraichir avec le pays sélectionné
                                        comboRegion.clear();
                                        obtenirListeRegionParPays((new Valeur(se.getSelectedItem())).getAbreviation().toString());
                                }
                        };
                        comboPays.getCombo().addSelectionChangedListener(selectionChange);
                        
                        droiteFdAdresse.add(comboPays, new FormData("95%"));
                        
                        magazinRegion = new ListStore<Valeur>();
                        comboRegion = new ComboBox<Valeur>();
                        comboRegion.setTabIndex(tabIndex++);
                        comboRegion.setFieldLabel("Région");
                        comboRegion.setEmptyText("Sélectionner une région...");
                        comboRegion.setDisplayField("nom");
                        comboRegion.setTypeAhead(true);
                        comboRegion.setTriggerAction(TriggerAction.ALL);
                        comboRegion.setStore(magazinRegion);
                        droiteFdAdresse.add(comboRegion, new FormData("95%"));

                        
                        latitudeChp = new TextField<String>();
                        latitudeChp.setRegex(Pattern.latitude);
                        latitudeChp.setToolTip("Format : nombre décimal positif ou négatif de 0 à 90.");
                        latitudeChp.getMessages().setRegexText("La valeur saisie n'est pas une latitude valide. Exemples de latitude : -45,302010 ou 45.252423 ou 25,16.");
                        latitudeChp.setTabIndex(tabIndex++);
                        latitudeChp.setFieldLabel("Latitude (Nord)");
                        gaucheFdAdresse.add(latitudeChp, new FormData("95%"));
                        
                        longitudeChp = new TextField<String>();
                        longitudeChp.setRegex(Pattern.longitude);
                        longitudeChp.setToolTip("Format : nombre décimal positif ou négatif de 0 à 180.");
                        longitudeChp.getMessages().setRegexText("La valeur saisie n'est pas une longitude valide. Exemples de longitude : -150,302010 ou 150.252423 ou 25,16.");
                        longitudeChp.setTabIndex(tabIndex++);
                        longitudeChp.setFieldLabel("Longitude (Est)");
                        droiteFdAdresse.add(longitudeChp, new FormData("95%"));
                        
                        principalFdAdresse.add(gaucheFdAdresse, new ColumnData(.5));
                        principalFdAdresse.add(droiteFdAdresse, new ColumnData(.5));
                        fieldSetAdresse.add(principalFdAdresse);
                        
                        this.add(fieldSetAdresse);
                        
                        //+-----------------------------------------------------------------------------------------------------------+
                        // Fieldset TÉLÉPHONE et EMAIL
                        LayoutContainer principalFdTelMail = new LayoutContainer();  
                        principalFdTelMail.setLayout(new ColumnLayout());
                        principalFdTelMail.setSize(700, -1);
                        
                        LayoutContainer gaucheFdTelMail = new LayoutContainer();
                        gaucheFdTelMail.setLayout(Formulaire.creerFormLayout(60, LabelAlign.LEFT));
                        
                        LayoutContainer droiteFdTelMail = new LayoutContainer();
                        droiteFdTelMail.setLayout(Formulaire.creerFormLayout(60, LabelAlign.LEFT));
                        
                        FieldSet fieldSetTelMail = new FieldSet();
                        fieldSetTelMail.setHeadingHtml("Communication");
                        fieldSetTelMail.setCollapsible(true);
                        
                        fieldSetTelMail.setLayout(Formulaire.creerFormLayout(null, LabelAlign.LEFT));
                                        
                        telChp = new TextField<String>();
                        telChp.setTabIndex(tabIndex++);
                        telChp.setFieldLabel("Téléphone fixe");
                        gaucheFdTelMail.add(telChp, new FormData("95%"));
                        
                        faxChp = new TextField<String>();
                        faxChp.setTabIndex(tabIndex++);
                        faxChp.setFieldLabel("Fax");
                        droiteFdTelMail.add(faxChp, new FormData("95%"));
                        
                        emailChp = new TextField<String>();
                        emailChp.setTabIndex(tabIndex++);
                        emailChp.setFieldLabel("Courriel");
                        emailChp.setToolTip("Saisir le courriel de l'organisation, pas de courriel individuel. Ex. : accueil@organisation.org");
                        gaucheFdTelMail.add(emailChp, new FormData("95%"));
                        
                        urlChp = new TextField<String>();
                        urlChp.setTabIndex(tabIndex++);
                        urlChp.setFieldLabel("Site web");
                        droiteFdTelMail.add(urlChp, new FormData("95%"));
                        
                        principalFdTelMail.add(gaucheFdTelMail, new ColumnData(.5));
                        principalFdTelMail.add(droiteFdTelMail, new ColumnData(.5));
                        fieldSetTelMail.add(principalFdTelMail);
                                                
                        this.add(fieldSetTelMail);
        }
        
        private native String getTemplatePays() /*-{ 
                return  [ 
                '<tpl for=".">', 
                '<div class="x-combo-list-item">{cmlv_nom} ({cmlv_abreviation})</div>', 
                '</tpl>' 
                ].join(""); 
        }-*/;
        
        public void obtenirListeRegionParPays(String strPays)   {
                mediateur.obtenirListeRegionsEtRafraichir(this, "region", strPays);
        }
        
        public void peuplerIdSurRetourAjout() {
                initialiserIdentification();
                idStructureChp.setValue(identification.getId());
                nomStructureChp.setValue(identification.getNom());
        }
                
        public void peupler() {
                if(identification == null) {
                        initialiserIdentification();
                }
                if (formulaireCourant.mode.equals(Formulaire.MODE_AJOUTER)) {
                        // Indique que l'ongleta pu être modifié pour la méthode collecter...
                        this.setData("acces", true);
                        // Initialisation de l'objet Structure
                        identification = new Structure();
                        // Indication du projet sélectionné par défaut
                        String projetCourantId = ((Mediateur) Registry.get(RegistreId.MEDIATEUR)).getProjetId();
                        if (projetCourantId != null && !projetCourantId.equals("0")) {
                                projetsCombo.getCombo().setValue(projetsCombo.getStore().findModel("cpr_id_projet", projetCourantId));
                        }
                }

                if (formulaireCourant.mode.equals(Formulaire.MODE_MODIFIER) && identification != null && getData("acces").equals(false)) {
                        idStructureChp.setValue(identification.getId());
                        nomStructureChp.setValue(identification.getNom());
                        if (!identification.getIdProjet().equals("0")) {
                                projetsCombo.getCombo().setValue(projetsCombo.getStore().findModel("cpr_id_projet", identification.getIdProjet()));
                        }
                        
                        if (!identification.getIdAlternatif().isEmpty()) {
                                String[] acronyme = identification.getIdAlternatif().split("##");
                                //#436 : Ne pas afficher "null"
                                if (UtilString.isEmpty(acronyme[1]) || acronyme[1].equals("null"))      {
                                        acronyme[1] = "";
                                }
                                
                                if (acronyme[0].matches("^IH$")) {
                                        comboAcronyme.setValue(InterneValeurListe.getTypeAcronymeIH());
                                        ihChp.setValue(acronyme[1]);
                                } else if (acronyme[0].matches("^MNHN$")) {
                                        comboAcronyme.setValue(InterneValeurListe.getTypeAcronymeMNHN());
                                        mnhnChp.setValue(acronyme[1]);
                                }
                        }
                        if (!identification.getTypePrive().isEmpty()) {
                                if (identification.getTypePrive().matches("^[0-9]+$")) {
                                        comboTypeStructure.setValue(InterneValeurListe.getTypePrivee());
                                        comboLstpr.setValue(comboLstpr.getStore().findModel("id_valeur", identification.getTypePrive()));
                                }
                        } else if (!identification.getTypePublic().isEmpty()) {
                                if (identification.getTypePublic().matches("^[0-9]+$")) {
                                        comboTypeStructure.setValue(InterneValeurListe.getTypePublique());
                                        comboLstpu.setValue(comboLstpu.getStore().findModel("id_valeur", identification.getTypePublic()));
                                }
                        }
                        
                        String dateFondation = identification.getAnneeOuDateFondation();
                        dateFondationChp.setValue(dateFondation);
                        
                        descriptionChp.setValue(identification.getDescription());
                        conditionAccesChp.setValue(identification.getConditionAcces());
                        conditionUsageChp.setValue(identification.getConditionUsage());
                        
                        adrChp.setValue(identification.getAdresse());
                        adrComplementChp.setValue(identification.getAdresseComplement());
                        cpChp.setValue(identification.getCodePostal());
                        villeChp.setValue(identification.getVille());
                        mettreAJourRegion();
                        //(identification.getRegion());
                        if (identification.getPays().matches("^[0-9]+$")) {
                                comboPays.chargerValeurInitiale(identification.getPays(), "cmlv_id_valeur");
                        } else {
                                comboPays.getCombo().setRawValue(identification.getPays());
                        }
                        latitudeChp.setValue(identification.getLatitude());
                        longitudeChp.setValue(identification.getLongitude());
                        
                        telChp.setValue(identification.getTelephoneFixe());
                        faxChp.setValue(identification.getFax());
                        
                        emailChp.setValue(identification.getCourriel());
                        urlChp.setValue(identification.getUrl("WEB"));
                        
                        nbreTotalPersonneStructureChp.setValue(identification.getNbrePersonne());
                        
                        // Indique que l'onglet a été rempli et a pu être modifié pour la méthode collecter...
                        this.setData("acces", true);
                }
        }
        
        private void initialiserIdentification() {
                identification = ((StructureForm)formulaireCourant).identification;
        }

        public Structure collecter() {
                peupler();
                Structure structureARetourner = null;
                if (this.getData("acces").equals(true)) {
                        
                        if(identification == null) {
                                initialiserIdentification();
                        }
                        
                        Structure structureCollectee = (Structure) identification.cloner(new Structure());
                        
                        structureCollectee.setId(idStructureChp.getValue());
                        structureCollectee.setNom(nomStructureChp.getValue());
                        // Récupération de l'identifiant du projet
                        if (projetsCombo.getCombo().getValue() != null) {
                                structureCollectee.setIdProjet(new Projet(projetsCombo.getValeur()).getId());
                        }
                        // Récupération de l'acronyme (= identifiant alternatif)
                        structureCollectee.setIdAlternatif(null);
                        if (comboAcronyme.getValue() != null) {
                                String typeAcronyme = comboAcronyme.getValue().getAbr();
                                if (typeAcronyme == "IH") {
                                        structureCollectee.setIdAlternatif(typeAcronyme+"##"+ihChp.getValue());
                                } else if (typeAcronyme == "MNHN") {
                                        structureCollectee.setIdAlternatif(typeAcronyme+"##"+mnhnChp.getValue());
                                }
                        }
                        // Récupération statut de la structure
                        structureCollectee.setTypePublic(null);
                        structureCollectee.setTypePrive(null);
                        if (comboTypeStructure.getValue() != null) {
                                String typeStructure = comboTypeStructure.getValue().getAbr();
                                if (typeStructure == "stpu" && comboLstpu.getValue() != null) {
                                        structureCollectee.setTypePublic(comboLstpu.getValue().getId());
                                } else if (typeStructure == "stpr" && comboLstpr.getValue() != null) {
                                        structureCollectee.setTypePrive(comboLstpr.getValue().getId());
                                }
                        }
                        
                        String valeurDateFondation = dateFondationChp.getValue();
                        if (!UtilString.isEmpty(valeurDateFondation))   {
                                if (valeurDateFondation.matches("\\d{2}/\\d{2}/\\d{4}"))        {
                                        Date dateFondation = DateTimeFormat.getFormat("dd/MM/yyyy").parse(valeurDateFondation);
                                        structureCollectee.setDateFondation(dateFondation);
                                } else if (valeurDateFondation.matches("\\d{4}"))       {
                                        structureCollectee.setDateFondation(valeurDateFondation + "-00-00");
                                }
                        }
                        
                        structureCollectee.setDescription(descriptionChp.getValue());
                        structureCollectee.setConditionAcces(conditionAccesChp.getValue());
                        structureCollectee.setConditionUsage(conditionUsageChp.getValue());
                        
                        structureCollectee.setAdresse(adrChp.getValue());
                        structureCollectee.setAdresseComplement(adrComplementChp.getValue());
                        structureCollectee.setCodePostal(cpChp.getValue());
                        structureCollectee.setVille(villeChp.getValue());
                        
                        String strRegion = "";
                        Valeur valeurRegion = comboRegion.getValue();
                        if (valeurRegion == null)       {
                                strRegion = "AUTRE##" + comboRegion.getRawValue();      
                        } else  {
                                strRegion = valeurRegion.getId();
                        }
                        
                        structureCollectee.setRegion(strRegion);
                        structureCollectee.setPays(null);
                        if (comboPays.getCombo().getValue() != null) {
                                structureCollectee.setPays(new Valeur(comboPays.getValeur()).getId());
                        } else if (comboPays.getCombo().getRawValue() != "") {
                                structureCollectee.setPays(comboPays.getCombo().getRawValue());
                        }
                        structureCollectee.setLatitude(latitudeChp.getValue());
                        structureCollectee.setLongitude(longitudeChp.getValue());
                        
                        structureCollectee.setTelephoneFixe(telChp.getValue());
                        structureCollectee.setFax(faxChp.getValue());
                        
                        structureCollectee.setCourriel(emailChp.getValue());
                        structureCollectee.setUrl(Structure.URL_SITE, urlChp.getValue());
                        
                        if (nbreTotalPersonneStructureChp.getValue() != null) {
                                structureCollectee.setNbrePersonne(nbreTotalPersonneStructureChp.getValue().intValue());
                        }
                        
                        structureARetourner = identification = structureCollectee;                      
                } else {

                }
                return structureARetourner;
        }

        @Override
        public void rafraichir(Object nouvellesDonnees) {
                if (nouvellesDonnees instanceof ValeurListe) {
                        ValeurListe listeValeurs = (ValeurListe) nouvellesDonnees;
                        rafraichirValeurListe(listeValeurs);
                } else if (nouvellesDonnees instanceof Information) {
                        Information info = (Information) nouvellesDonnees;
                        rafraichirInformation(info);
                } else {
                        Debug.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()));
                }
        }
        
        public void rafraichirInformation(Information info) {
                if (info.getType().equals("ajout_structure")) {
                        if (info.getDonnee(0) != null && info.getDonnee(0) instanceof String) {
                                String structureId = (String) info.getDonnee(0);
                                identification.setId(structureId);
                                this.setData("acces", false);
                                peupler();
                        } else {
                                InfoLogger.display("Ajout d'une Institution", info.toString());
                        }
                } else if (info.getType().equals("selection_structure")) {
                        InfoLogger.display("Modification d'une institution", info.toString());
                        String titre = i18nC.titreModifFormStructurePanneau();
                        if (info.getDonnee(0) != null) {
                                try {
                                        identification = (Structure) info.getDonnee(0);
                                        setAcces(false);
                                        peupler();
                                } catch(Exception e) {
                                        GWT.log("Problème de cast. "+info.getDonnee(0)+" ne peut être casté en Structure", e);
                                }
                                // Composition du titre
                                titre += " - ID : "+identification.getId();
                        }
                }
        }
        
        private void rafraichirValeurListe(ValeurListe listeValeurs) {
                List<Valeur> liste = listeValeurs.toList();

                // Test pour savoir si la liste contient des éléments
                if (liste.size() > 0) {
                        if (listeValeurs.getId().equals(config.getListeId("stpr"))) {
                                magazinLstpr.removeAll();
                                magazinLstpr.add(liste);
                                comboLstpr.setStore(magazinLstpr);
                        }
                        if (listeValeurs.getId().equals(config.getListeId("stpu"))) {
                                magazinLstpu.removeAll();
                                magazinLstpu.add(liste);
                                comboLstpu.setStore(magazinLstpu);
                        }
                        if (listeValeurs.getId().equals(config.getListeId("region"))) {
                                magazinRegion.removeAll();
                                magazinRegion.add(liste);
                                comboRegion.setStore(magazinRegion);
                                
                                mettreAJourRegion();
                        }
                }
        }

        private void mettreAJourRegion()        {
                //Met à jour la combo box en sélectionnant la valeur enregistrée pour la personne
                if (identification.get("ce_truk_region") != null && comboRegion.getStore().getCount() > 0)      {
                        Valeur valeurRegion = comboRegion.getStore().findModel("id_valeur", identification.get("ce_truk_region"));
                        if (valeurRegion!=null) {
                                comboRegion.setValue(valeurRegion);
                        } else if (identification.get("ce_truk_region").toString().startsWith("AUTRE##")) {
                                comboRegion.setRawValue(identification.get("ce_truk_region").toString().replaceFirst("^AUTRE##", ""));
                        }
                }
        }

        public Collection<? extends String> verifier() {
                ArrayList<String> messages = new ArrayList<String>();
                // Vérification des infos sur le nom de la structure
                if (    (this.getData("acces").equals(true) && nomStructureChp.getValue() == null) ||
                                (this.getData("acces").equals(true) && nomStructureChp.getValue().equals("")) ||
                                (this.getData("acces").equals(false) && identification.getNom().equals(""))) {
                        messages.add("Veuillez indiquez un nom à l'institution.");
                }
                
                // Vérification des infos sur le projet de la structure
                if (    (this.getData("acces").equals(true) && projetsCombo.getCombo().getValue() == null) ||
                                (this.getData("acces").equals(true) && projetsCombo.getCombo().getValue().equals("")) ||
                                (this.getData("acces").equals(false) && identification.getIdProjet().equals(""))) {
                        messages.add("Veuillez sélectionner un projet pour l'institution.");
                }
                
                //Vérification de la date de fondation
                String valeurDateFondation = dateFondationChp.getValue();
                if (!UtilString.isEmpty(valeurDateFondation) && (!valeurDateFondation.matches("\\d{2}/\\d{2}/\\d{4}") && 
                        !valeurDateFondation.matches("\\d{4}")))        {
                        messages.add("La date de fondation n'est pas au format jj/MM/AAAA ou AAAA");
                } 
                
                return messages;
        }
        
        public ModelData getValeurProjetCombo() {
                return projetsCombo.getCombo().getValue();
        }
        
        public ModelData getValeurProjet() {
                return projetsCombo.getValeur();
        }
}