Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.composants;

import java.util.Iterator;

import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.RegistreId;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Configuration;
import org.tela_botanica.client.modeles.Valeur;
import org.tela_botanica.client.modeles.ValeurListe;

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.TextField;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
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;
        
        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());
        }
        
        public String getListeCode() {
                return listeValeursCode;
        }
        public void setListeCode(String code) {
                listeValeursCode = code;
        }
        
        public void setLabel(String label) {
                groupeCaseACocher.setFieldLabel(label);
        }
        
        public void setChampAutre(boolean avoirChamp) {
                avoirChampAutre = avoirChamp;
                if (avoirChampAutre) {
                        champAutre = new TextField<String>();
                }
        }
        
        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(creerFormLayout(50, LabelAlign.TOP));
                        champAutre.setId("autre-"+listeValeurs.getId());
                        champAutre.setFieldLabel("Autre");
                        champAutre.setLabelStyle("font-weight:normal;");
                        conteneur.add(champAutre, new FormData(500, 0));
                        
                        add(conteneur);
                }
                layout();
        }

        @Override
        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);
                }
        }
        
}