Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.vues;

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.i18n.Constantes;
import org.tela_botanica.client.images.Images;
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 org.tela_botanica.client.modeles.aDonneeListe;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.SortDir;
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.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.Slider;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.TabPanel;
import com.extjs.gxt.ui.client.widget.button.ButtonBar;
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.ComboBox;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.Radio;
import com.extjs.gxt.ui.client.widget.form.RadioGroup;
import com.extjs.gxt.ui.client.widget.form.SliderField;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
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.tips.ToolTipConfig;
import com.google.gwt.core.client.GWT;
import com.google.gwt.json.client.JSONObject;

public abstract class Formulaire extends LayoutContainer implements Rafraichissable {

        public static final String MODE_AJOUTER = "AJOUT";
        public static final String MODE_MODIFIER = "MODIF";
        
        protected Constantes i18nC = null;
        protected Mediateur mediateur = null;
        protected Configuration config = null;
        
        protected String mode = null;
        protected int tabIndex = 100;
        
        protected FormPanel panneauFormulaire = null;
        protected ButtonBar barreOutilsValidation = null;
                
        protected String menuIdCourant = null;
        protected static Boolean clicBoutonvalidation = false;

        public FormPanel getFormulaire() {
                return panneauFormulaire;
        }
        
        public void initialiserFormulaire(Mediateur mediateurCourrant, String modeDeCreation, String idMenuCourrant) {
                // Initialisation de variables
                mode = modeDeCreation;
                mediateur = mediateurCourrant;
                i18nC = Mediateur.i18nC;
                menuIdCourant = idMenuCourrant;
                config = (Configuration) Registry.get(RegistreId.CONFIG);
                
                // Iniatilisation du layoutContainer
                setLayout(new FitLayout());
                setBorders(false);
                
                // Création du panneau du FORMULAIRE GÉNÉRAL
                panneauFormulaire = new FormPanel();
                panneauFormulaire.setBodyBorder(false);
                panneauFormulaire.setFrame(true);
                panneauFormulaire.setCollapsible(false);
                panneauFormulaire.setButtonAlign(HorizontalAlignment.CENTER);  
                panneauFormulaire.setLayout(new FitLayout());

                if (modeDeCreation.equals(MODE_AJOUTER)) {
                        panneauFormulaire.setIcon(Images.ICONES.formAjouter());
                } else if (modeDeCreation.equals(MODE_AJOUTER)) {
                        panneauFormulaire.setIcon(Images.ICONES.formModifier());
                }
                
                barreOutilsValidation = new FormulaireBarreValidation(creerEcouteurValidation());
                panneauFormulaire.setBottomComponent(barreOutilsValidation);
                
                add(panneauFormulaire);
        }
        
        protected abstract SelectionListener<ButtonEvent> creerEcouteurValidation();
        
        protected abstract boolean verifierFormulaire();
        
        protected abstract boolean soumettreFormulaire();
        
        protected TabItem creerOnglet(String nom, String id) {
                TabItem onglet = new TabItem();
                onglet.setId(id);
                onglet.setText(nom);
                FormulaireOnglet.parametrer(onglet);
                return onglet;
        }

        protected void controlerFermetureApresRafraichissement() {
                // Si le bouton Valider a été cliqué, nous affichons la liste des structures
                if (clicBoutonvalidation) {
                        fermerFormulaire();
                }
        }
        
        protected void fermerFormulaire() {
                clicBoutonvalidation = false;
                panneauFormulaire.setEnabled(false);
                mediateur.clicMenu(menuIdCourant);
        }
        
        /** Méthode simplifiant la création de FormLayout.
         * Chacun des paramètres peut prendre la valeur null pour utiliser la valeur par défaut.
         * 
         * @param labelWidth largeur des labels. 
         * @param labelAlign alignement des labels
         * @return
         */
        protected static FormLayout creerFormLayout(Integer labelWidth, LabelAlign labelAlign) {
                FormLayout formLayout = new FormLayout();
                if (labelWidth != null) {
                        formLayout.setLabelWidth(labelWidth);
                }
                if (labelAlign != null) {
                        formLayout.setLabelAlign(labelAlign);
                }
                return formLayout;
        }
        
        /** Méthode simplifiant la création de bouton radio oui/non
         * 
         * @param listeNom nom de la liste de valeur
         * @return
         */
        protected RadioGroup creerChoixUniqueRadioGroupe(String groupeNom, String listeNom) {
                groupeNom += "_grp";
                // NOTE : il semblerait qu'il faille aussi utiliser setName() pour éviter tout problème...
                RadioGroup radioGroup = new RadioGroup(groupeNom);
                radioGroup.setName(groupeNom);

                if (listeNom.equals("ouiNon")) {
                        ValeurListe ouiNonListe = new ValeurListe();
                        ouiNonListe.ajouter(new Valeur("1", i18nC.oui(), "NULL", "NULL"));
                        ouiNonListe.ajouter(new Valeur("0", i18nC.non(), "NULL", "NULL"));
                        creerChoixUniqueBoutonRadio(radioGroup, ouiNonListe);
                }
                
                return radioGroup;
        }
        
        protected void creerChoixUniqueBoutonRadio(RadioGroup radioGroupe, ValeurListe listeValeurs) {
                for (Iterator<String> it = listeValeurs.keySet().iterator(); it.hasNext();) {
                        Valeur val = listeValeurs.get(it.next());
                        
                        Radio radioBtn = new Radio();
                        radioBtn.setName(radioGroupe.getName().replace("_grp", ""));
                        radioBtn.setId(val.getId()+"_"+radioBtn.getName());
                        radioBtn.setBoxLabel(val.getNom());
                        radioBtn.setValueAttribute(val.getId());
                        radioBtn.addListener(Events.Change, new Listener<ComponentEvent>() {
        
                                public void handleEvent(ComponentEvent be) {
                                        //Window.alert(((Radio) be.component).getName());
                                        afficherChampSupplementaire(((Radio) be.getComponent()));
                                }
                                
                        });
                        
                        if (! val.getDescription().equals("NULL")) {
                                radioBtn.setToolTip(new ToolTipConfig(val.getNom(), val.getDescription()));
                        }
                        radioGroupe.add(radioBtn);
                }
        }
        
        protected void afficherChampSupplementaire(Radio radioBtn) {
                GWT.log("Vous devez redéfinir la méthode afficherChampSupplementaire(Radio radioBtn) dans votre classe formulaire.", null);
        };
        
        /** Méthode simplifiant la création de choix multiple sous forme de case à cocher.
         * Apelle un service retournant la liste des valeurs représentant les cases à cocher.
         * Ajoute ou pas un champ "Autre".
         * 
         * @return ContentPanel le panneau contenant les cases à cocher
         */
        public static LayoutContainer creerChoixMultipleCp() {
                LayoutContainer conteneur = new LayoutContainer();
                conteneur.setLayout(creerFormLayout(650, LabelAlign.TOP));
                return conteneur;
        }
        
        /** Méthode simplifiant la création de choix multiple sous forme de case à cocher.
         * Apelle un service retournant la liste des valeurs représentant les cases à cocher.
         * Ajoute ou pas un champ "Autre".
         * 
         * @param cp panneau conteant le groupe de case à cocher
         * @param cacGroup le groupe de case à cocher
         * @param listeValeurs la liste de valeurs à transformer en case à cocher
         * @param boolAutreChp booléen indiquant si oui ou non le champ autre doit apparaître 
         * @return
         */
        public static void creerChoixMultipleCac(LayoutContainer cp, final CheckBoxGroup cacGroupe, ValeurListe listeValeurs, final Field<String> autreChp) {
                cp.addListener(Events.Hide, new Listener<BaseEvent>() {

                        public void handleEvent(BaseEvent be) {
                                cacGroupe.reset();
                                autreChp.setValue("");
                        }
                        
                });
                
                cacGroupe.setAutoWidth(true);
                cacGroupe.setStyleAttribute("padding", "3px");
                cacGroupe.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()));
                        }
                        cacGroupe.add(cac);
                }
                cp.add(cacGroupe);
                
                if (autreChp != null) {
                        // 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));
                        autreChp.setId("autre-"+listeValeurs.getId());
                        autreChp.setFieldLabel("Autre");
                        autreChp.setLabelStyle("font-weight:normal;");
                        conteneur.add(autreChp, new FormData(500, 0));
                        
                        cp.add(conteneur);
                }
                cp.layout();
        }
        
        @SuppressWarnings({"unchecked"})
        public static void rafraichirComboBox(aDonneeListe<?> listeValeurs, ComboBox combo) {
                rafraichirComboBox(listeValeurs, combo, "nom");
        }
        
        @SuppressWarnings({"unchecked"})
        public static void rafraichirComboBox(aDonneeListe<?> listeValeurs, ComboBox combo, String champATrier) {
                List<?> liste = listeValeurs.toList();
                if (liste.size() > 0) {
                        ListStore store = combo.getStore();
                        store.removeAll();
                        store.add(liste);
                        store.sort(champATrier, SortDir.ASC);
                        combo.setStore(store);
                }
        }
}