Subversion Repositories eFlore/Applications.coel

Rev

Rev 1661 | 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.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.InfoLogger;
import org.tela_botanica.client.configuration.Configuration;
import org.tela_botanica.client.i18n.Constantes;
import org.tela_botanica.client.i18n.ErrorMessages;
import org.tela_botanica.client.images.Images;
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.aDonneeListe;
import org.tela_botanica.client.util.Debug;

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.Info;
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.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.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.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;

public abstract class Formulaire extends LayoutContainer implements Rafraichissable {

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

        public FormPanel getFormulaire() {
                return panneauFormulaire;
        }
        
        public void initialiserFormulaire(Mediateur mediateurCourrant, String modeDeCreation, String idMenuCourrant) {
                // Initialisation de variables
                mode = modeDeCreation;
                mediateur = mediateurCourrant;
                i18nC = Mediateur.i18nC;
                i18nM = Mediateur.i18nM;
                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());
                panneauFormulaire.setPadding(0);
                
                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);
        }
        
        public SelectionListener<ButtonEvent> creerEcouteurValidation() {
                SelectionListener<ButtonEvent> ecouteur = new SelectionListener<ButtonEvent>() {
                        public void componentSelected(ButtonEvent ce) {
                                
                                String code = ((Button) ce.getComponent()).getData("code");
                                if (code.equals(FormulaireBarreValidation.CODE_BOUTON_VALIDER)) {
                                        if (mediateur.getUtilisateur().isIdentifie()) {
                                                clicBoutonvalidation = true;                                            
                                                soumettreFormulaire();
                                                
                                        } else {
                                                InfoLogger.display(i18nC.modeAnonyme(), i18nC.identificationNecessaire());
                                        }
                                } else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_APPLIQUER)) {
                                        if (mediateur.getUtilisateur().isIdentifie()) {
                                                soumettreFormulaire();
                                        } else {
                                                InfoLogger.display(i18nC.modeAnonyme(), i18nC.identificationNecessaire());
                                        }
                                } else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_ANNULER)) {
                                        fermerFormulaire();
                                }
                        }
                };
                
                return ecouteur;
        }
        
        public abstract boolean verifierFormulaire();
        
        public abstract boolean soumettreFormulaire();
        
        public TabItem creerOnglet(String nom, String id) {
                TabItem onglet = new TabItem();
                onglet.setId(id);
                onglet.setText(nom);
                FormulaireOnglet.parametrer(onglet);
                return onglet;
        }

        public void controlerFermeture() {      
                if (clicBoutonvalidation) {
                        fermerFormulaire();
                }               
        }
        
        public void fermerFormulaire() {
                clicBoutonvalidation = false;
                panneauFormulaire.setEnabled(false);
                surFermetureFormulaire();
                //mediateur.clicMenu(menuIdCourant);    
        }
        
        public void surFermetureFormulaire() {
                // A surcharger si jamais une action spécifique doit être entreprise
        }
        
        /** 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
         */
        public 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
         */
        public 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;
        }
        
        public 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);
                }
        }
        
        public 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.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);
                }
        }
        
        public static Listener<BaseEvent> creerEcouteurChampObligatoire() {
                return new Listener<BaseEvent>() {
                        public void handleEvent(BaseEvent be) {
                                Field<?> champ = null;
                                boolean etreVide = true;
                                if (be.getSource() instanceof TextField<?>) {
                                        champ = (TextField<?>) be.getSource();
                                        etreVide = (champ.getRawValue().isEmpty()) ? true : false;
                                } else if (be.getSource() instanceof TextArea) {
                                        champ = (TextArea) be.getSource();
                                        etreVide = (champ.getRawValue().isEmpty()) ? true : false;
                                } else if (be.getSource() instanceof ChampComboBoxListeValeurs) {
                                        champ = (ChampComboBoxListeValeurs) be.getSource();
                                        etreVide = (champ.getValue() == null) ? true : false;
                                } else if (be.getSource() instanceof ComboBox<?>) {
                                        champ = (ComboBox<?>) be.getSource();
                                        etreVide = (champ.getValue() == null) ? true : false;
                                }
                                champ.removeStyleName(ComposantClass.OBLIGATOIRE);
                                champ.removeStyleName(ComposantClass.OBLIGATOIRE_OK);
                                if (etreVide == false) {
                                        champ.addStyleName(ComposantClass.OBLIGATOIRE_OK);
                                } else {
                                        champ.addStyleName(ComposantClass.OBLIGATOIRE);
                                }
                        }
                };
        }
}