Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.composants;

import java.util.Iterator;
import java.util.List;

import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.RegistreId;
import org.tela_botanica.client.configuration.Configuration;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Valeur;
import org.tela_botanica.client.modeles.ValeurListe;
import org.tela_botanica.client.modeles.aDonnee;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.synchronisation.Sequenceur;
import org.tela_botanica.client.util.UtilString;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.form.CheckBox;
import com.extjs.gxt.ui.client.widget.form.CheckBoxGroup;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.form.LabelField;
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.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
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.tips.ToolTipConfig;
import com.google.gwt.core.client.GWT;

public class ChampCaseACocher extends LayoutContainer implements Rafraichissable {
        
        private Configuration config = null;
        private Mediateur mediateur = null;
        
        private CheckBoxGroup groupeCaseACocher = null;
        private boolean avoirChampAutre = false;
        private Field<String> champAutre = null;

        private String listeValeursCode = null;
        private Sequenceur sequenceur = new Sequenceur();
        
        public ChampCaseACocher(String label, String listeCode, boolean avoirChampAutre) {
                config = (Configuration) Registry.get(RegistreId.CONFIG);
                mediateur = (Mediateur) Registry.get(RegistreId.MEDIATEUR);

                setLayout(creerFormLayout(650, LabelAlign.TOP));
                groupeCaseACocher = new CheckBoxGroup();
                setLabel(label);
                setChampAutre(avoirChampAutre);
                
                setListeCode(listeCode);
                mediateur.obtenirListeValeurEtRafraichir(this, getListeCode(), sequenceur);
        }
        
        public String getListeCode() {
                return listeValeursCode;
        }
        public void setListeCode(String code) {
                listeValeursCode = code;
        }
        
        public void setLabel(String label) {
                groupeCaseACocher.setFieldLabel(label);
        }
        
        public boolean avoirChampAutre() {
                return avoirChampAutre;
        }
        public void setChampAutre(boolean avoirChamp) {
                avoirChampAutre = avoirChamp;
                if (avoirChampAutre) {
                        champAutre = new TextArea();
                        champAutre.setWidth("80%");
                }
        }
        
        public String getValeur() {
                String valeur = "";
                
                List<CheckBox> liste = groupeCaseACocher.getValues();
                if (liste != null) {
                        int taille = liste.size();
                        for (int i = 0; i < taille; i++) {
                                CheckBox cac = liste.get(i);
                                if (cac.isEnabled()) {
                                        valeur += aDonnee.SEPARATEUR_VALEURS+cac.getData("id");
                                }
                        }
                        
                }
                
                if (avoirChampAutre() && !UtilString.isEmpty(champAutre.getValue())) {
                        valeur += aDonnee.SEPARATEUR_VALEURS+"AUTRE"+aDonnee.SEPARATEUR_TYPE_VALEUR+champAutre.getValue();
                }
                
                if (!UtilString.isEmpty(valeur)) {
                        valeur = valeur.replaceFirst("^"+aDonnee.SEPARATEUR_VALEURS, "");
                }
                
                return valeur;
        }
        
        public void peupler(String donnees) {
                String[] valeurs = donnees.split(aDonnee.SEPARATEUR_VALEURS);
                for (int i = 0; i < valeurs.length; i++) {
                        if (valeurs[i].startsWith("AUTRE"+aDonnee.SEPARATEUR_TYPE_VALEUR)) {
                                champAutre.setValue(valeurs[i].replaceFirst("^AUTRE"+aDonnee.SEPARATEUR_TYPE_VALEUR, ""));
                        } else {
                                //TODO : check : List<CheckBox> cases = groupeCac.getAll();
                                List<Field<?>> cases = groupeCaseACocher.getAll();
                                for (int j = 0; j < cases.size(); j++) {
                                        if (cases.get(j).getId().equals("val-"+valeurs[i])) {
                                                ((CheckBox) cases.get(j)).setValue(true);
                                        }
                                }
                        }
                }
        }
        
        private FormLayout creerFormLayout(Integer labelWidth, LabelAlign labelAlign) {
                FormLayout formLayout = new FormLayout();
                if (labelWidth != null) {
                        formLayout.setLabelWidth(labelWidth);
                }
                if (labelAlign != null) {
                        formLayout.setLabelAlign(labelAlign);
                }
                return formLayout;
        }
        
        private void creerChoixMultipleCac(ValeurListe listeValeurs) {
                addListener(Events.Hide, new Listener<BaseEvent>() {
                        public void handleEvent(BaseEvent be) {
                                groupeCaseACocher.reset();
                                if (avoirChampAutre()) {
                                        champAutre.setValue("");
                                }
                        }
                });
                
                groupeCaseACocher.setAutoWidth(true);
                groupeCaseACocher.setStyleAttribute("padding", "3px");
                groupeCaseACocher.setData("liste_id", listeValeurs.getId());
                for (Iterator<String> it = listeValeurs.keySet().iterator(); it.hasNext();) {
                        Valeur val = listeValeurs.get(it.next());
                        String nom =  val.get("nom");
                        CheckBox cac = new CheckBox();
                        cac.setId("val-"+val.getId());
                        cac.setData("id", val.getId());
                        cac.setBoxLabel(nom);
                        if (! val.getDescription().equals("NULL")) {
                                cac.setToolTip(new ToolTipConfig(val.getNom(), val.getDescription()));
                        }
                        groupeCaseACocher.add(cac);
                }
                add(groupeCaseACocher);
                
                if (avoirChampAutre()) {
                        // FIXME : éviter le chevauchement du texte des cases à cocher avec le label "Autre" sur les petits écrans
                        LayoutContainer conteneur = new LayoutContainer();
                        conteneur.setLayout(new FlowLayout());
                        conteneur.add(new LabelField("Autre : "));
                        champAutre.setId("autre-"+listeValeurs.getId());
                        champAutre.setLabelStyle("font-weight:normal;");
                        conteneur.add(champAutre, new FormData(500, 0));
                        
                        add(conteneur);
                }
                layout();
        }

        public void rafraichir(Object nouvellesDonnees) {
                if (nouvellesDonnees instanceof ValeurListe) {
                        ValeurListe listeValeurs = (ValeurListe) nouvellesDonnees;
                        if (listeValeurs.getId().equals(config.getListeId(getListeCode()))) {
                                creerChoixMultipleCac(listeValeurs);
                        } 
                } else {
                        GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);
                }
        }
        
}