Subversion Repositories eFlore/Applications.coel

Rev

Rev 1898 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.tela_botanica.client.vues.collection;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.composants.ChampCaseACocher;
import org.tela_botanica.client.composants.ChampComboBoxListeValeurs;
import org.tela_botanica.client.composants.ChampMultiValeursMultiTypes;
import org.tela_botanica.client.composants.ChampSliderPourcentage;
import org.tela_botanica.client.composants.InfoLogger;
import org.tela_botanica.client.composants.ChampNombre;
import org.tela_botanica.client.images.Images;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.InterneValeur;
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.modeles.collection.Collection;
import org.tela_botanica.client.modeles.collection.CollectionBotanique;
import org.tela_botanica.client.modeles.collection.UniteBase;
import org.tela_botanica.client.modeles.collection.UniteRangement;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.util.Pattern;
import org.tela_botanica.client.util.UtilNombre;
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.Style.Scroll;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
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.MessageBoxEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Info;
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.FieldSet;
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.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.AggregationRowConfig;
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.EditorGrid;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.HeaderGroupConfig;
import com.extjs.gxt.ui.client.widget.grid.SummaryType;
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.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.i18n.client.NumberFormat;

public class CollectionFormDescription extends FormulaireOnglet implements Rafraichissable {
        
        public static final String ID = "description";
        private Collection collection = null;
        private CollectionBotanique collectionBotanique = null;
        private Collection collectionCollectee = null;
        private CollectionBotanique collectionBotaniqueCollectee = null;
        
        private static ListStore<InterneValeur> precisionStore = null;
        private ChampComboBoxListeValeurs typesCollectionBotaCombo = null;
        private NumberField nbreEchantillonChp = null;
        private EditorGrid<UniteRangement> uniteRangementGrille = null;
        private ChampComboBoxListeValeurs etatUniteRangementCombo = null;
        private EditorGrid<UniteBase> uniteBaseGrille = null;
        private ChampCaseACocher typePapierConservationChp = null;
        private ChampCaseACocher methodeConservationChp = null;
        private ChampSliderPourcentage specimenFixationPourcentChp = null;
        private ChampSliderPourcentage etiquetteFixationPourcentChp = null;
        private ChampCaseACocher specimentMethodeFixationChp = null;
        private ChampCaseACocher etiquetteMethodeFixationSurSupportChp = null;
        private ChampCaseACocher etiquetteMethodeFixationSurSpecimenChp = null;
        private ChampCaseACocher typeEcritureChp = null;
        private ChampComboBoxListeValeurs traitementCombo = null;
        private ChampCaseACocher poisonTraitementChp = null;
        private ChampCaseACocher insecteTraitementChp = null;
        private ChampComboBoxListeValeurs etatGeneralCombo = null;
        private ChampComboBoxListeValeurs determinationCombo = null;
        private ChampMultiValeursMultiTypes specimenDegradationChp = null;
        private ChampMultiValeursMultiTypes presentationDegradationChp = null;
        private Text labelPresentationDegradationChp = null;
                
        public CollectionFormDescription(Formulaire formulaireCourrant) {
                initialiserOnglet(formulaireCourrant);
                setId(ID);
                setText(Mediateur.i18nC.collectionDescription());

                FormLayout formulaireLayout = (FormLayout) this.getLayout();
                formulaireLayout.setLabelAlign(LabelAlign.LEFT);
                formulaireLayout.setLabelWidth(300);
                
                creerFieldsetTypesUniteEtat();
                
                creerFieldsetConservation(); // Papier
                
                creerFieldsetEtiquette(); // RAS
                creerFieldsetTraitement(); // RAS
                
                creerFieldsetPrecision(); // A supprimer ou déplacer plus tard
                creerStorePrecision();
                
                layout();
        }
        
        private void creerFieldsetPrecision() {
                FieldSet precisionFieldSet = new FieldSet();
                precisionFieldSet.setHeadingHtml(i18nC.collectionTitrePrecision());
                precisionFieldSet.setCollapsible(true);
                precisionFieldSet.collapse();
                precisionFieldSet.setLayout(Formulaire.creerFormLayout(largeurLabelDefaut, alignementLabelDefaut));
                
                typesCollectionBotaCombo = new ChampComboBoxListeValeurs(i18nC.typeCollectionBotanique(), "typeCollectionBota");
                typesCollectionBotaCombo.setTabIndex(tabIndex++);
                precisionFieldSet.add(typesCollectionBotaCombo, new FormData(250, 0));
                
                nbreEchantillonChp = new NumberField(); 
                nbreEchantillonChp.setFieldLabel(i18nC.nbreEchantillon());
                nbreEchantillonChp.setToolTip(i18nC.nbreEchantillonInfo());
                nbreEchantillonChp.setFormat(NumberFormat.getFormat("#"));
                precisionFieldSet.add(nbreEchantillonChp);
                
                this.add(precisionFieldSet);
        }
        
        private static void creerStorePrecision() {
                if (precisionStore == null) {
                        precisionStore = new ListStore<InterneValeur>();
                        precisionStore.add(new InterneValeur(UniteRangement.COMPTE_APPROXIMATIF, Mediateur.i18nC.precisionApproximatif()));  
                        precisionStore.add(new InterneValeur(UniteRangement.COMPTE_EXACT, Mediateur.i18nC.precisionExact()));
                }
        }
        
        private static String getPrecisionNom(String precisionAbr) {
                String precision = "";
                if (!precisionAbr.equals("NULL")) {
                        creerStorePrecision();
                        InterneValeur precisionValeur = precisionStore.findModel("abr", precisionAbr);
                        if (precisionValeur != null && !precisionValeur.getNom().equals("NULL")) {
                                precision = precisionValeur.getNom();
                        }
                }
                return precision;
        }
        
        private static String getPrecisionAbr(String precisionNom) {
                String precision = "";
                if (!precisionNom.equals("NULL")) {
                        creerStorePrecision();
                        InterneValeur precisionValeur = precisionStore.findModel("nom", precisionNom);
                        if (precisionValeur != null) {
                                precision = precisionValeur.getAbr();
                        }
                }
                return precision;
        }
        
        private ComboBox<InterneValeur> getChampPrecision() {
                ComboBox<InterneValeur> precisionCombo = new ComboBox<InterneValeur>();
                precisionCombo.setForceSelection(true);
                precisionCombo.setTriggerAction(TriggerAction.ALL);
                precisionCombo.setDisplayField("nom");
                precisionCombo.setStore(precisionStore);
                precisionCombo.setEditable(false);
                return precisionCombo;
        }
        
        /**
        * La classe NumberField est sujette à un bug qui empeche son 
        * édition dans firefox, il faut donc la surcharger
        **/
        private NumberField creerChampNombre() {
                ChampNombre champNombre = new ChampNombre();    
                return champNombre;
        }
                
        private ContentPanel creerUniteRangement() {
                ContentPanel panneauGrille = creerPanneauContenantGrille(i18nC.collectionUniteRangementTitre());
                
                uniteRangementGrille  = creerGrilleUniteRangement();
                mediateur.obtenirListeValeurEtRafraichir(this, "typeUniteRangement", null);
                panneauGrille.add(uniteRangementGrille);
                
                ToolBar barreOutils = creerBarreOutilsGrilleUniteRangement();
                panneauGrille.setTopComponent(barreOutils);
                
                return panneauGrille;
        }
        
        private ContentPanel creerPanneauContenantGrille(String titre) {
                ContentPanel panneau = new ContentPanel();
                panneau.setHeadingHtml(titre);
                panneau.setIcon(Images.ICONES.table());
                panneau.setLayout(new FitLayout());
                panneau.setFrame(true);
                panneau.setSize(800, 200);
                panneau.setScrollMode(Scroll.NONE);
                panneau.setCollapsible(true);
                panneau.setStyleAttribute("margin", "5px 0");
                
                return panneau;
        }
        
        private EditorGrid<UniteRangement> creerGrilleUniteRangement() {
                ListStore<UniteRangement> storeGrille = new ListStore<UniteRangement>();
                
                List<ColumnConfig> colonnes = new ArrayList<ColumnConfig>();
                colonnes.add(new ColumnConfig("type", i18nC.collectionUniteType(), 150));
                
                NumberField champNombre = creerChampNombre();
                champNombre.setFormat(NumberFormat.getFormat("#"));
                ColumnConfig nombreColonne = new ColumnConfig("nombre", i18nC.collectionUniteNbre(), 50);
                nombreColonne.setEditor(new CellEditor(champNombre));
                nombreColonne.setNumberFormat(NumberFormat.getFormat("#"));
                colonnes.add(nombreColonne);
                                
                CellEditor editeurPrecision = new CellEditor(getChampPrecision()) {  
                        @Override  
                        public Object preProcessValue(Object valeur) {  
                                InterneValeur retour = null;
                                if (valeur != null ) {
                                        if (precisionStore.findModel("nom", valeur.toString()) != null) {
                                                retour = precisionStore.findModel("nom", valeur.toString());
                                        } else if (precisionStore.findModel("abr", valeur.toString()) != null) {
                                                retour = precisionStore.findModel("abr", valeur.toString());
                                        }
                                }
                                return retour;
                        }  

                        @Override  
                        public Object postProcessValue(Object valeur) {  
                                String retour = null;
                                if (valeur != null ) {
                                        if (valeur instanceof InterneValeur) {
                                                InterneValeur valeurInterne = (InterneValeur) valeur;
                                                retour = valeurInterne.getNom();
                                        }
                                }
                                return retour;  
                        }
                };
                
                ColumnConfig precisionColonne = new ColumnConfig("precision", i18nC.collectionUnitePrecision(), 50);
                precisionColonne.setEditor(editeurPrecision);
                colonnes.add(precisionColonne);
                
                TextField<String> formatChp = new TextField<String>();
                ColumnConfig formatColonne =  new ColumnConfig("format", i18nC.collectionUniteFormat(), 100);
                formatColonne.setEditor(new CellEditor(formatChp));
                colonnes.add(formatColonne);
                
                GridSelectionModel<UniteRangement> modeleDeSelection = new GridSelectionModel<UniteRangement>();
                ColumnModel modeleDeColonnes = new ColumnModel(colonnes);
                
                AggregationRowConfig<UniteBase> total = new AggregationRowConfig<UniteBase>();
                total.setHtml("type", i18nC.total());
                total.setSummaryType("nombre", SummaryType.SUM);
                total.setSummaryFormat("nombre", NumberFormat.getFormat("#"));
                modeleDeColonnes.addAggregationRow(total);
                
                EditorGrid<UniteRangement> grilleUniteRangement = new EditorGrid<UniteRangement>(storeGrille, modeleDeColonnes);
                grilleUniteRangement.setHeight(300);
                grilleUniteRangement.setBorders(true);
                grilleUniteRangement.setSelectionModel(modeleDeSelection);
                grilleUniteRangement.getView().setForceFit(true);
                grilleUniteRangement.getView().setAutoFill(true);
                grilleUniteRangement.setAutoExpandColumn("type");
                grilleUniteRangement.setStripeRows(true);
                grilleUniteRangement.setTrackMouseOver(true);
                
                return grilleUniteRangement;
        }
        
        private String collecterGrilleUniteRangement() {
                String truk = "";
                int nbreUnite = uniteRangementGrille.getStore().getCount();
                for (int i = 0; i < nbreUnite; i++) {
                        UniteRangement unite = uniteRangementGrille.getStore().getAt(i);
                        if (unite.getTypeAutre()) {
                                truk += unite.getType();
                        } else {
                                truk += unite.getId();
                        }
                        truk += aDonnee.SEPARATEUR_TYPE_VALEUR;
                        truk += UtilNombre.formaterEnEntier(unite.getNombre())+aDonnee.SEPARATEUR_DONNEES;
                        truk += getPrecisionAbr(unite.getPrecision())+aDonnee.SEPARATEUR_DONNEES;
                        truk += unite.getFormat();
                        truk += (i == (nbreUnite - 1)) ? "" : aDonnee.SEPARATEUR_VALEURS;
                        
                        if (truk.matches("^"+aDonnee.SEPARATEUR_DONNEES)) {
                                truk = truk.replaceFirst("^"+aDonnee.SEPARATEUR_DONNEES, "");
                        }
                        
                        if (truk.matches("^"+aDonnee.SEPARATEUR_TYPE_VALEUR)) {
                                truk = truk.replaceFirst("^"+aDonnee.SEPARATEUR_TYPE_VALEUR, "");
                        }
                }
                return truk;
        }
        
        private void peuplerGrilleUniteRangement(String valeurTruk) {
                if (!UtilString.isEmpty(valeurTruk)) {
                        HashMap<String,UniteRangement> unitesEnregistrees = parserValeurUniteRangement(valeurTruk);
                        
                        ArrayList<UniteRangement> listeUniteMaj = new ArrayList<UniteRangement>();
                        int nbreUnite = uniteRangementGrille.getStore().getCount();
                        for (int i = 0; i < nbreUnite; i++) {
                                UniteRangement uniteDansGrille = uniteRangementGrille.getStore().getAt(i);
                                UniteRangement uniteEnregistree = unitesEnregistrees.get(uniteDansGrille.getId());
                                
                                if (uniteEnregistree != null) {
                                        uniteEnregistree.setType(uniteDansGrille.getType());
                                        listeUniteMaj.add(uniteEnregistree);
                                } else {
                                        listeUniteMaj.add(uniteDansGrille);
                                }
                        }
                        
                        Iterator<String> it = unitesEnregistrees.keySet().iterator();
                        while (it.hasNext()) {
                                String cle = it.next();
                                if (cle.matches(aDonnee.TYPE_AUTRE+aDonnee.SEPARATEUR_TYPE_VALEUR+"[a-zA-Z0-9]+")) {
                                        UniteRangement uniteAutreEnregistree = unitesEnregistrees.get(cle);
                                        listeUniteMaj.add(uniteAutreEnregistree);
                                }
                        }
                        
                        uniteRangementGrille.getStore().removeAll();
                        uniteRangementGrille.getStore().add(listeUniteMaj);
                        layout();
                }
        }
        
        public static HashMap<String,UniteRangement> parserValeurUniteRangement(String valeurTruk) {
                HashMap<String,UniteRangement> unitesEnregistrees = new HashMap<String,UniteRangement>(); 
                if (!UtilString.isEmpty(valeurTruk)) {
                        String[] unites = valeurTruk.split(Pattern.quote(aDonnee.SEPARATEUR_VALEURS));
                        for (int i = 0; i < unites.length; i++) {
                                String[] uniteTypeIdDonnees = unites[i].split(Pattern.quote(aDonnee.SEPARATEUR_TYPE_VALEUR));
                                String uniteChaineDonnees = uniteTypeIdDonnees[1];
                                String[] uniteDonnees = uniteChaineDonnees.split(Pattern.quote(aDonnee.SEPARATEUR_DONNEES));
                                
                                UniteRangement uniteRangement = new UniteRangement();
                                if (uniteDonnees.length > 0) {
                                        uniteRangement.setNombre(UtilString.formaterEnEntier(uniteDonnees[0]));
                                }
                                if (uniteDonnees.length > 1) {
                                        uniteRangement.setPrecision(getPrecisionNom(uniteDonnees[1]));
                                }
                                if (uniteDonnees.length > 2) {
                                        uniteRangement.setFormat(uniteDonnees[2]);
                                }
                                
                                if (uniteTypeIdDonnees[0].matches("[0-9]+")) {
                                        uniteRangement.setId(uniteTypeIdDonnees[0]);
                                        uniteRangement.setTypeAutre(false);
                                        unitesEnregistrees.put(uniteTypeIdDonnees[0], uniteRangement);
                                } else {                                        
                                        uniteRangement.setType(uniteTypeIdDonnees[0]);
                                        uniteRangement.setTypeAutre(true);
                                        String id = aDonnee.TYPE_AUTRE+aDonnee.SEPARATEUR_TYPE_VALEUR+uniteTypeIdDonnees[0]+"-"+i;
                                        uniteRangement.setId(id);
                                        unitesEnregistrees.put(aDonnee.TYPE_AUTRE+aDonnee.SEPARATEUR_TYPE_VALEUR+uniteTypeIdDonnees[0], uniteRangement);
                                }
                        }
                }
                return unitesEnregistrees;
        }
        
        private ToolBar creerBarreOutilsGrilleUniteRangement() {
                ToolBar barreOutils = new ToolBar();  
                
                Button ajouterBouton = creerBoutonAjouterUniteRangement();
                barreOutils.add(ajouterBouton);
                
                barreOutils.add(new SeparatorToolItem());
                
                Button supprimerBouton = creerBoutonSupprimerUniteRangement();
                barreOutils.add(supprimerBouton);

                return barreOutils;
        }
        
        private Button creerBoutonAjouterUniteRangement() {
                Button bouton = new Button(i18nC.ajouter());
                bouton.setIcon(Images.ICONES.ajouter());
                bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent ce) {
                                final MessageBox box = MessageBox.prompt(i18nC.collectionUniteType(), i18nC.collectionUniteRangementSaisirType());
                                        box.addCallback(new Listener<MessageBoxEvent>() {
                                        public void handleEvent(MessageBoxEvent be) {
                                                if (!UtilString.isEmpty(be.getValue()) && !be.getValue().matches("[0-9]+")) {
                                                        final UniteRangement unite = new UniteRangement();
                                                        unite.setType(be.getValue());
                                                        unite.setTypeAutre(true);
                                                        uniteRangementGrille.getStore().add(unite);
                                                } else {
                                                        InfoLogger.display("Information", "Vous ne pouvez pas saisir de valeur vide ou numérique");
                                                }
                                        }
                                });
                        }
                });
                return bouton;
        }
        
        private Button creerBoutonSupprimerUniteRangement() {
                Button bouton = new Button(i18nC.supprimer());
                bouton.setIcon(Images.ICONES.supprimer());
                bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {  
                        @Override
                        public void componentSelected(ButtonEvent ce) {
                                UniteRangement uniteRangementSelectionnee = uniteRangementGrille.getSelectionModel().getSelectedItem();
                                if (uniteRangementSelectionnee == null) {
                                        InfoLogger.display(i18nC.informationTitreGenerique(), Mediateur.i18nM.veuillezSelectionner(i18nC.selectionnerUniteRangement()));
                                } else if (uniteRangementSelectionnee.getTypeAutre() == false) {
                                        InfoLogger.display(i18nC.informationTitreGenerique(), i18nC.selectionnerUniteRangementAjoute());
                                } else {
                                        uniteRangementGrille.getStore().remove(uniteRangementSelectionnee);
                                }
                        }   
                });
                return bouton;
        }
        
        private ContentPanel creerUniteBase() {
                ContentPanel panneauGrille = creerPanneauContenantGrille(i18nC.collectionUniteBaseTitre());
                
                uniteBaseGrille  = creerGrilleUniteBase();
                mediateur.obtenirListeValeurEtRafraichir(this, "typeUniteBase", null);
                panneauGrille.add(uniteBaseGrille);
                
                ToolBar barreOutils = creerBarreOutilsGrilleUniteBase();
                panneauGrille.setTopComponent(barreOutils);
                
                return panneauGrille;           
        }
        
        private EditorGrid<UniteBase> creerGrilleUniteBase() {
                ListStore<UniteBase> storeGrille = new ListStore<UniteBase>();
                
                List<ColumnConfig> colonnes = new ArrayList<ColumnConfig>();
                colonnes.add(new ColumnConfig("type", i18nC.collectionUniteType(), 150));
                
                NumberField champNombre = creerChampNombre();
                champNombre.setFormat(NumberFormat.getFormat("#"));
                CellEditor editeurNombre = new CellEditor(champNombre);
                
                ColumnConfig nombreColonne = new ColumnConfig("nombre", i18nC.collectionUniteNbre(), 50);
                nombreColonne.setEditor(editeurNombre);
                nombreColonne.setNumberFormat(NumberFormat.getFormat("#"));
                colonnes.add(nombreColonne);
                
                CellEditor editeurPrecision = new CellEditor(getChampPrecision()) {  
                        @Override  
                        public Object preProcessValue(Object valeur) {  
                                InterneValeur retour = null;
                                if (valeur != null ) {
                                        if (precisionStore.findModel("nom", valeur.toString()) != null) {
                                                retour = precisionStore.findModel("nom", valeur.toString());
                                        } else if (precisionStore.findModel("abr", valeur.toString()) != null) {
                                                retour = precisionStore.findModel("abr", valeur.toString());
                                        }
                                }
                                return retour;
                        }  

                        @Override  
                        public Object postProcessValue(Object valeur) {  
                                String retour = null;
                                if (valeur != null ) {
                                        if (valeur instanceof InterneValeur) {
                                                InterneValeur valeurInterne = (InterneValeur) valeur;
                                                retour = valeurInterne.getNom();
                                        }
                                }
                                return retour;
                        }  
                };
                
                ColumnConfig precisionColonne = new ColumnConfig("precision", i18nC.collectionUnitePrecision(), 50);
                precisionColonne.setEditor(editeurPrecision);
                colonnes.add(precisionColonne);
                
                TextField<String> formatChp = new TextField<String>();
                ColumnConfig formatColonne =  new ColumnConfig("format", i18nC.collectionUniteFormat(), 100);
                formatColonne.setEditor(new CellEditor(formatChp));
                colonnes.add(formatColonne);
                
                ColumnConfig partNombreColonne = new ColumnConfig("nombre_part", i18nC.collectionUniteNbre(), 50);
                partNombreColonne.setEditor(editeurNombre);
                partNombreColonne.setNumberFormat(NumberFormat.getFormat("#"));
                colonnes.add(partNombreColonne);
                
                ColumnConfig partPrecisionColonne = new ColumnConfig("precision_part", i18nC.collectionUnitePrecision(), 50);
                partPrecisionColonne.setEditor(editeurPrecision);
                colonnes.add(partPrecisionColonne);
                
                ColumnConfig spNombreColonne = new ColumnConfig("nombre_sp", i18nC.collectionUniteNbre(), 50);
                spNombreColonne.setEditor(editeurNombre);
                spNombreColonne.setNumberFormat(NumberFormat.getFormat("#"));
                colonnes.add(spNombreColonne);
                
                ColumnConfig spPrecisionColonne = new ColumnConfig("precision_sp", i18nC.collectionUnitePrecision(), 50);
                spPrecisionColonne.setEditor(editeurPrecision);
                colonnes.add(spPrecisionColonne);
                
                GridSelectionModel<UniteBase> modeleDeSelection = new GridSelectionModel<UniteBase>();
                ColumnModel modeleDeColonnes = new ColumnModel(colonnes);
                modeleDeColonnes.addHeaderGroup(0, 0, new HeaderGroupConfig(i18nC.collectionUniteBase(), 1, 4));
                modeleDeColonnes.addHeaderGroup(0, 4, new HeaderGroupConfig(i18nC.collectionUniteBasePart(), 1, 2));
                modeleDeColonnes.addHeaderGroup(0, 6, new HeaderGroupConfig(i18nC.collectionUniteBaseSp(), 1, 2));
                
                AggregationRowConfig<UniteBase> total = new AggregationRowConfig<UniteBase>();
                total.setHtml("type", "TOTAL");
                total.setSummaryType("nombre", SummaryType.SUM);
                total.setSummaryFormat("nombre", NumberFormat.getFormat("#"));
                total.setSummaryType("nombre_part", SummaryType.SUM);
                total.setSummaryFormat("nombre_part", NumberFormat.getFormat("#"));
                total.setSummaryType("nombre_sp", SummaryType.SUM);
                total.setSummaryFormat("nombre_sp", NumberFormat.getFormat("#"));
                modeleDeColonnes.addAggregationRow(total);
                
                EditorGrid<UniteBase> grilleUniteBase = new EditorGrid<UniteBase>(storeGrille, modeleDeColonnes);
                grilleUniteBase.setHeight(200);
                grilleUniteBase.setBorders(true);
                grilleUniteBase.setSelectionModel(modeleDeSelection);
                grilleUniteBase.getView().setForceFit(true);
                grilleUniteBase.getView().setAutoFill(true);
                grilleUniteBase.setAutoExpandColumn("type");
                grilleUniteBase.setStripeRows(true);
                grilleUniteBase.setTrackMouseOver(true);
                
                return grilleUniteBase;
        }
        
        private String collecterGrilleUniteBase() {
                String truk = "";
                int nbreUnite = uniteBaseGrille.getStore().getCount();
                for (int i = 0; i < nbreUnite; i++) {
                        UniteBase unite = uniteBaseGrille.getStore().getAt(i);
                        if (unite.getTypeAutre()) {
                                truk += unite.getType();
                        } else {
                                truk += unite.getId();
                        }
                        truk += aDonnee.SEPARATEUR_TYPE_VALEUR;
                        truk += UtilNombre.formaterEnEntier(unite.getNombre())+aDonnee.SEPARATEUR_DONNEES;
                        truk += getPrecisionAbr(unite.getPrecision())+aDonnee.SEPARATEUR_DONNEES;
                        truk += unite.getFormat()+aDonnee.SEPARATEUR_DONNEES;
                        truk += UtilNombre.formaterEnEntier(unite.getNombrePart())+aDonnee.SEPARATEUR_DONNEES;
                        truk += getPrecisionAbr(unite.getPrecisionPart())+aDonnee.SEPARATEUR_DONNEES;
                        truk += UtilNombre.formaterEnEntier(unite.getNombreSp())+aDonnee.SEPARATEUR_DONNEES;
                        truk += getPrecisionAbr(unite.getPrecisionSp());
                        truk += (i == (nbreUnite - 1)) ? "" : aDonnee.SEPARATEUR_VALEURS;
                }
                return truk;
        }
        
        private void peuplerGrilleUniteBase(String valeurTruk) {
                if (!UtilString.isEmpty(valeurTruk)) {
                        HashMap<String,UniteBase> unitesEnregistrees = parserValeurUniteBase(valeurTruk);
                        
                        ArrayList<UniteBase> listeUniteMaj = new ArrayList<UniteBase>();
                        int nbreUnite = uniteBaseGrille.getStore().getCount();
                        for (int i = 0; i < nbreUnite; i++) {
                                UniteBase uniteDansGrille = uniteBaseGrille.getStore().getAt(i);
                                UniteBase uniteEnregistree = unitesEnregistrees.get(uniteDansGrille.getId());
                                if (uniteEnregistree != null) {
                                        uniteEnregistree.setType(uniteDansGrille.getType());
                                        listeUniteMaj.add(uniteEnregistree);
                                } else {
                                        listeUniteMaj.add(uniteDansGrille);
                                }
                        }
                        
                        Iterator<String> it = unitesEnregistrees.keySet().iterator();
                        while (it.hasNext()) {
                                String cle = it.next();
                                if (cle.matches(aDonnee.TYPE_AUTRE+aDonnee.SEPARATEUR_TYPE_VALEUR+"[a-zA-Z0-9]+")) {
                                        UniteBase uniteAutreEnregistree = unitesEnregistrees.get(cle);
                                        listeUniteMaj.add(uniteAutreEnregistree);
                                }
                        }
                        
                        uniteBaseGrille.getStore().removeAll();
                        uniteBaseGrille.getStore().add(listeUniteMaj);
                        layout();
                }
        }
        
        public static HashMap<String,UniteBase> parserValeurUniteBase(String valeurTruk) {
                HashMap<String,UniteBase> unitesEnregistrees = new HashMap<String,UniteBase>();
                if (!UtilString.isEmpty(valeurTruk)) {
                        String[] unites = valeurTruk.split(Pattern.quote(aDonnee.SEPARATEUR_VALEURS));
                        for (int i = 0; i < unites.length; i++) {
                                String[] uniteTypeIdDonnees = unites[i].split(Pattern.quote(aDonnee.SEPARATEUR_TYPE_VALEUR));
                                String uniteChaineDonnees = uniteTypeIdDonnees[1];
                                String[] uniteDonnees = uniteChaineDonnees.split(Pattern.quote(aDonnee.SEPARATEUR_DONNEES));
                                
                                UniteBase uniteBase = new UniteBase();
                                if (uniteDonnees.length > 0) {
                                        uniteBase.setNombre(UtilString.formaterEnEntier(uniteDonnees[0]));
                                }
                                if (uniteDonnees.length > 1) {
                                        uniteBase.setPrecision(getPrecisionNom(uniteDonnees[1]));
                                }
                                if (uniteDonnees.length > 2) {
                                        uniteBase.setFormat(uniteDonnees[2]);
                                }
                                if (uniteDonnees.length > 3) {
                                        uniteBase.setNombrePart(UtilString.formaterEnEntier(uniteDonnees[3]));
                                }
                                if (uniteDonnees.length > 4) {
                                        uniteBase.setPrecisionPart(getPrecisionNom(uniteDonnees[4]));
                                }
                                if (uniteDonnees.length > 5) {
                                        uniteBase.setNombreSp(UtilString.formaterEnEntier(uniteDonnees[5]));
                                }
                                if (uniteDonnees.length > 6) {
                                        uniteBase.setPrecisionSp(getPrecisionNom(uniteDonnees[6]));
                                }
                                
                                if (uniteTypeIdDonnees[0].matches("[0-9]+")) {
                                        uniteBase.setId(uniteTypeIdDonnees[0]);
                                        uniteBase.setTypeAutre(false);
                                        unitesEnregistrees.put(uniteTypeIdDonnees[0], uniteBase);
                                } else {
                                        uniteBase.setType(uniteTypeIdDonnees[0]);
                                        uniteBase.setTypeAutre(true);
                                        String id = aDonnee.TYPE_AUTRE+aDonnee.SEPARATEUR_TYPE_VALEUR+uniteTypeIdDonnees[0]+"-"+i;
                                        uniteBase.setId(id);
                                        unitesEnregistrees.put(aDonnee.TYPE_AUTRE+aDonnee.SEPARATEUR_TYPE_VALEUR+uniteTypeIdDonnees[0], uniteBase);                                     
                                }
                        }
                }
                return unitesEnregistrees;
        }
        
        private ToolBar creerBarreOutilsGrilleUniteBase() {
                ToolBar barreOutils = new ToolBar();  
                
                Button ajouterBouton = creerBoutonAjouterUniteBase();
                barreOutils.add(ajouterBouton);
                
                barreOutils.add(new SeparatorToolItem());
                
                Button supprimerBouton = creerBoutonSupprimerUniteBase();
                barreOutils.add(supprimerBouton);               
                
                return barreOutils;
        }
        
        private Button creerBoutonAjouterUniteBase() {
                Button bouton = new Button(i18nC.ajouter());
                bouton.setIcon(Images.ICONES.ajouter());
                bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent ce) {
                                final MessageBox box = MessageBox.prompt(i18nC.collectionUniteType(), i18nC.collectionUniteBaseSaisirType());
                                        box.addCallback(new Listener<MessageBoxEvent>() {
                                        public void handleEvent(MessageBoxEvent be) {
                                                if (!UtilString.isEmpty(be.getValue()) && !be.getValue().matches("[0-9]+")) {
                                                        final UniteBase unite = new UniteBase();
                                                        unite.setType(be.getValue());
                                                        unite.setTypeAutre(true);
                                                        uniteBaseGrille.getStore().add(unite);
                                                } else {
                                                        InfoLogger.display("Information", "Vous ne pouvez pas saisir de valeur vide ou numérique");
                                                }
                                        }
                                });
                        }
                });
                return bouton;
        }
        
        private Button creerBoutonSupprimerUniteBase() {
                Button bouton = new Button(i18nC.supprimer());
                bouton.setIcon(Images.ICONES.supprimer());
                bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {  
                        @Override
                        public void componentSelected(ButtonEvent ce) {
                                UniteBase uniteBaseSelectionnee = uniteBaseGrille.getSelectionModel().getSelectedItem();
                                if (uniteBaseSelectionnee == null) {
                                        InfoLogger.display(i18nC.informationTitreGenerique(), Mediateur.i18nM.veuillezSelectionner(i18nC.selectionnerUniteBase()));
                                } else if (uniteBaseSelectionnee.getTypeAutre() == false) {
                                        InfoLogger.display(i18nC.informationTitreGenerique(), i18nC.selectionnerUniteBaseAjoute());
                                } else {
                                        uniteBaseGrille.getStore().remove(uniteBaseSelectionnee);
                                }
                        }   
                });
                return bouton;
        }
        
        private void creerFieldsetConservation() {
                FieldSet conservationFieldSet = new FieldSet();
                conservationFieldSet.setHeadingHtml(i18nC.collectionTitreConservation());
                conservationFieldSet.setCollapsible(true);
                conservationFieldSet.collapse();
                conservationFieldSet.setLayout(Formulaire.creerFormLayout(largeurLabelDefaut, alignementLabelDefaut));
                
                typePapierConservationChp = new ChampCaseACocher(i18nC.typePapierConservation(), "typePapier", true);
                conservationFieldSet.add(typePapierConservationChp);
                
                methodeConservationChp = new ChampCaseACocher(i18nC.methodeConservation(), "methodeRangement", true);
                conservationFieldSet.add(methodeConservationChp);
                
                this.add(conservationFieldSet);
        }
        
        private void creerFieldsetEtiquette() {
                FieldSet etiquetteFieldSet = new FieldSet();
                etiquetteFieldSet.setHeadingHtml(i18nC.collectionTitreEtiquette());
                etiquetteFieldSet.setCollapsible(true);
                etiquetteFieldSet.collapse();
                etiquetteFieldSet.setLayout(Formulaire.creerFormLayout(largeurLabelDefaut, alignementLabelDefaut));
                
                Text fixationPoucentLabel = new Text(i18nC.fixationPourcent());
                etiquetteFieldSet.add(fixationPoucentLabel);
                
                specimenFixationPourcentChp = new ChampSliderPourcentage(i18nC.specimenFixationPourcent());
                etiquetteFieldSet.add(specimenFixationPourcentChp, new FormData(200, 0));
                
                etiquetteFixationPourcentChp = new ChampSliderPourcentage(i18nC.etiquetteFixationPourcent());
                etiquetteFieldSet.add(etiquetteFixationPourcentChp, new FormData(200, 0));
                
                specimentMethodeFixationChp = new ChampCaseACocher(i18nC.specimenMethodeFixation(), "methodeFixation", true);
                etiquetteFieldSet.add(specimentMethodeFixationChp);
                
                etiquetteMethodeFixationSurSupportChp = new ChampCaseACocher(i18nC.etiquetteMethodeFixationSurSupport(), "methodeFixation", true);
                etiquetteFieldSet.add(etiquetteMethodeFixationSurSupportChp);
                
                etiquetteMethodeFixationSurSpecimenChp = new ChampCaseACocher(i18nC.etiquetteMethodeFixationSurSpecimen(), "methodeFixationSurSpecimen", true);
                etiquetteFieldSet.add(etiquetteMethodeFixationSurSpecimenChp);
                
                typeEcritureChp = new ChampCaseACocher(i18nC.typeEcriture(), "typeEcriture", false);
                etiquetteFieldSet.add(typeEcritureChp);
                
                this.add(etiquetteFieldSet);
        }
        
        private void creerFieldsetTraitement() {
                FieldSet traitementFieldSet = new FieldSet();
                traitementFieldSet.setHeadingHtml(i18nC.collectionTitreTraitement());
                traitementFieldSet.setCollapsible(true);
                traitementFieldSet.collapse();
                traitementFieldSet.setLayout(Formulaire.creerFormLayout(largeurLabelDefaut, alignementLabelDefaut));
                
                traitementCombo  = new ChampComboBoxListeValeurs(i18nC.collectionTraitement(), "onpi");
                traitementCombo.setTrie("id_valeur");
                traitementFieldSet.add(traitementCombo, new FormData(300, 0));
                
                poisonTraitementChp = new ChampCaseACocher(i18nC.collectionTraitementPoison(), "poisonTraitement", true);
                traitementFieldSet.add(poisonTraitementChp);
                
                insecteTraitementChp = new ChampCaseACocher(i18nC.collectionTraitementInsecte(), "insecteTraitement", true);
                traitementFieldSet.add(insecteTraitementChp);

                this.add(traitementFieldSet);
        }
        
        private void creerFieldsetTypesUniteEtat() {
                FieldSet etatTypesUniteFieldSet = new FieldSet();
                // Etat général et nombre d'échantillons (à changer dans l'i18n
                etatTypesUniteFieldSet.setHeadingHtml(i18nC.collectionEtatGeneralEtNombreEchantillons());
                etatTypesUniteFieldSet.setCollapsible(true);
                etatTypesUniteFieldSet.collapse();
                etatTypesUniteFieldSet.setLayout(Formulaire.creerFormLayout(largeurLabelDefaut, alignementLabelDefaut));
                
                etatUniteRangementCombo = new ChampComboBoxListeValeurs(i18nC.collectionUniteRangementEtatGeneral(), "etat");
                etatUniteRangementCombo.setToolTip(i18nC.collectionUniteRangementEtatGeneralInfo());
                etatUniteRangementCombo.setTrie("id_valeur");
                etatUniteRangementCombo.setWidth(300);
                etatTypesUniteFieldSet.add(etatUniteRangementCombo);
                
                etatTypesUniteFieldSet.add(creerUniteRangement());
                etatTypesUniteFieldSet.add(creerUniteBase());
                
                add(etatTypesUniteFieldSet);
                
                etatGeneralCombo = new ChampComboBoxListeValeurs(i18nC.collectionEtatGeneral(), "etat");
                etatGeneralCombo.setToolTip(i18nC.collectionEtatGeneralInfo());
                etatGeneralCombo.setTrie("id_valeur");
                etatTypesUniteFieldSet.add(etatGeneralCombo, new FormData(300, 0));
                
                specimenDegradationChp = new ChampMultiValeursMultiTypes(i18nC.degradationSpecimen(), 150, true);
                specimenDegradationChp.initialiserType("specimenDegradation");
                specimenDegradationChp.initialiserCombobox("niveauImportance");
                etatTypesUniteFieldSet.add(specimenDegradationChp);
                
                labelPresentationDegradationChp = new Text();
                labelPresentationDegradationChp.setWidth("95%");
                labelPresentationDegradationChp.setVisible(false);
                
                presentationDegradationChp = new ChampMultiValeursMultiTypes(i18nC.degradationPresentation(), 150, 200, true);
                presentationDegradationChp.initialiserType("supportDegradation");
                presentationDegradationChp.initialiserCombobox("niveauImportance");
                
                presentationDegradationChp.getTypes().addListener(Events.Select,
                        new Listener<FieldEvent>() {
                                public void handleEvent(FieldEvent be) {
                                        if (((Valeur)(be.getField().getValue())).get("id_valeur").equals("2310")) {
                                                labelPresentationDegradationChp.setText(i18nC.degradationPresentationLabel());
                                                labelPresentationDegradationChp.setVisible(true);
                                        }
                                        else {
                                                labelPresentationDegradationChp.setText("");
                                                labelPresentationDegradationChp.setVisible(false);                                              
                                        }
                                }               
                        });
                etatTypesUniteFieldSet.add(presentationDegradationChp);
                etatTypesUniteFieldSet.add(labelPresentationDegradationChp);
                
                determinationCombo = new ChampComboBoxListeValeurs(i18nC.collectionDetermination(), "niveauDetermination");
                determinationCombo.setTrie("id_valeur");
                etatTypesUniteFieldSet.add(determinationCombo, new FormData(450, 0));
                
                this.add(etatTypesUniteFieldSet);
        }
        
        public void peupler() {
                initialiserCollection();
                if (collectionBotanique != null) {
                        typesCollectionBotaCombo.peupler(collectionBotanique.getType());
                        if (!UtilString.isEmpty(collectionBotanique.getNbreEchantillon())) {
                                nbreEchantillonChp.setValue(Integer.parseInt(collectionBotanique.getNbreEchantillon()));
                        }
                        
                        peuplerGrilleUniteRangement(collectionBotanique.getUniteRangement());
                        etatUniteRangementCombo.peupler(collectionBotanique.getUniteRangementEtat());
                        
                        peuplerGrilleUniteBase(collectionBotanique.getUniteBase());
                        
                        typePapierConservationChp.peupler(collectionBotanique.getConservationPapierType());
                        methodeConservationChp.peupler(collectionBotanique.getConservationMethode());
                        
                        specimenFixationPourcentChp.peupler(collectionBotanique.getSpecimenFixationPourcent());
                        etiquetteFixationPourcentChp.peupler(collectionBotanique.getEtiquetteFixationPourcent());
                        specimentMethodeFixationChp.peupler(collectionBotanique.getSpecimenFixationMethode());
                        etiquetteMethodeFixationSurSupportChp.peupler(collectionBotanique.getEtiquetteFixationSupport());
                        etiquetteMethodeFixationSurSpecimenChp.peupler(collectionBotanique.getEtiquetteFixationSpecimen());
                        typeEcritureChp.peupler(collectionBotanique.getEtiquetteEcriture());
                        
                        traitementCombo.peupler(collectionBotanique.getTraitement());
                        poisonTraitementChp.peupler(collectionBotanique.getTraitementPoison());
                        insecteTraitementChp.peupler(collectionBotanique.getTraitementInsecte());
                        
                        etatGeneralCombo.peupler(collectionBotanique.getEtatGeneral());
                        specimenDegradationChp.peupler(collectionBotanique.getDegradationSpecimen());
                        presentationDegradationChp.peupler(collectionBotanique.getDegradationPresentation());
                        determinationCombo.peupler(collectionBotanique.getDetermination());
                }               
        }
        
        public void collecter() {
                initialiserCollection();
                if (etreAccede()) {
                        collectionBotaniqueCollectee.setType(typesCollectionBotaCombo.getValeur());
                        if (nbreEchantillonChp.getValue() != null) {
                                collectionBotaniqueCollectee.setNbreEchantillon(Integer.toString(nbreEchantillonChp.getValue().intValue()));
                        }
                        
                        collectionBotaniqueCollectee.setUniteRangement(collecterGrilleUniteRangement());
                        collectionBotaniqueCollectee.setUniteRangementEtat(etatUniteRangementCombo.getValeur());
                        
                        collectionBotaniqueCollectee.setUniteBase(collecterGrilleUniteBase());
                        
                        collectionBotaniqueCollectee.setConservationPapierType(typePapierConservationChp.getValeur());
                        collectionBotaniqueCollectee.setConservationMethode(methodeConservationChp.getValeur());
                        
                        collectionBotaniqueCollectee.setSpecimenFixationPourcent(specimenFixationPourcentChp.getValeur());
                        collectionBotaniqueCollectee.setEtiquetteFixationPourcent(etiquetteFixationPourcentChp.getValeur());
                        collectionBotaniqueCollectee.setSpecimenFixationMethode(specimentMethodeFixationChp.getValeur());
                        collectionBotaniqueCollectee.setEtiquetteFixationSupport(etiquetteMethodeFixationSurSupportChp.getValeur());
                        collectionBotaniqueCollectee.setEtiquetteFixationSpecimen(etiquetteMethodeFixationSurSpecimenChp.getValeur());
                        collectionBotaniqueCollectee.setEtiquetteEcriture(typeEcritureChp.getValeur());
                        
                        collectionBotaniqueCollectee.setTraitement(traitementCombo.getValeur());
                        collectionBotaniqueCollectee.setTraitementPoison(poisonTraitementChp.getValeur());
                        collectionBotaniqueCollectee.setTraitementInsecte(insecteTraitementChp.getValeur());
                        
                        collectionBotaniqueCollectee.setEtatGeneral(etatGeneralCombo.getValeur());
                        collectionBotaniqueCollectee.setDegradationSpecimen(specimenDegradationChp.getValeurs());
                        collectionBotaniqueCollectee.setDegradationPresentation(presentationDegradationChp.getValeurs());
                        collectionBotaniqueCollectee.setDetermination(determinationCombo.getValeur());
                }
        }

        private void initialiserCollection() {
                collection = ((CollectionForm) formulaire).collection;
                if (collection != null) {
                        collectionBotanique = collection.getBotanique();
                }
                
                collectionCollectee = ((CollectionForm) formulaire).collectionCollectee;
                if (collectionCollectee != null) {
                        collectionBotaniqueCollectee = collectionCollectee.getBotanique();
                }
        }
        
        public void rafraichir(Object nouvellesDonnees) {
                if (nouvellesDonnees instanceof ValeurListe) {
                        ValeurListe listeValeurs = (ValeurListe) nouvellesDonnees;
                        rafraichirValeurListe(listeValeurs);
                } else {
                        Debug.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()));
                }
        }
        
        private void rafraichirValeurListe(ValeurListe listeValeurs) {
                if (listeValeurs.getId().equals(config.getListeId("typeUniteRangement"))) {
                        Iterator<String> it = listeValeurs.keySet().iterator();
                        while (it.hasNext()) {
                                Valeur valeur = listeValeurs.get(it.next());
                                UniteRangement unite = new UniteRangement();
                                unite.setId(valeur.getId());
                                unite.setType(valeur.getNom());
                                unite.setTypeAutre(false);
                                uniteRangementGrille.getStore().add(unite);
                        }
                } else if (listeValeurs.getId().equals(config.getListeId("typeUniteBase"))) {
                        Iterator<String> it = listeValeurs.keySet().iterator();
                        while (it.hasNext()) {
                                Valeur valeur = listeValeurs.get(it.next());
                                UniteBase unite = new UniteBase();
                                unite.setId(valeur.getId());
                                unite.setType(valeur.getNom());
                                unite.setTypeAutre(false);
                                uniteBaseGrille.getStore().add(unite);
                        }
                } else {
                        Debug.log("Gestion de la liste "+listeValeurs.getId()+" non implémenté!");
                }
        }
}