Subversion Repositories eFlore/Applications.coel

Rev

Rev 637 | Rev 687 | 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 org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.i18n.Constantes;
import org.tela_botanica.client.images.Images;
import org.tela_botanica.client.modeles.MenuApplicationId;
import org.tela_botanica.client.modeles.Valeur;
import org.tela_botanica.client.modeles.ValeurListe;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
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.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.TabPanel;
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.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.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.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.google.gwt.user.client.ui.AbstractImagePrototype;

public abstract class Formulaire extends LayoutContainer {

        public static final String MODE_AJOUTER = "AJOUT";
        public static final String MODE_MODIFIER = "MODIF";
        
        public static final String CODE_BOUTON_VALIDER = "VA";
        public static final String CODE_BOUTON_APPLIQUER = "AP";
        public static final String CODE_BOUTON_ANNULER = "AN";
        public static final String CODE_BOUTON_REINITIALISER = "RE";
        
        protected Constantes i18nC = null;
        protected Mediateur mediateur = null;

        protected String mode = null;
        protected int tabIndex = 100;
        
        protected FormPanel panneauFormulaire = null;
        protected ButtonBar barreOutilsValidation = null;
        protected TabPanel onglets = null;
        
        protected String menuIdCourant = null;
        protected static Boolean clicBoutonvalidation = false;
        
        public Formulaire(Mediateur mediateurCourrant, String modeDeCreation) {
                // Initialisation de variables
                mode = modeDeCreation;
                mediateur = mediateurCourrant;
                i18nC = Mediateur.i18nC;
                        
                // 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.setIcon(Images.ICONES.formAjouter());  
                panneauFormulaire.setCollapsible(false);  
                panneauFormulaire.setHeading(i18nC.titreAjoutFormStructurePanneau());
                panneauFormulaire.setButtonAlign(HorizontalAlignment.CENTER);  
                panneauFormulaire.setLayout(new FitLayout());
                
                creerBarreOutilsValidation();
        }
        
        protected abstract void creerOnglets();
        
        protected TabItem creerOnglet(String nom, String id) {
                TabItem onglet = new TabItem();
                onglet.setId(id);
                onglet.setText(nom);
                onglet.setLayout(new FormLayout());
                onglet.setStyleAttribute("padding", "10px");
                onglet.setScrollMode(Scroll.AUTO);
                onglet.setData("acces", false);
                
                return onglet;
        }
        
        protected void creerBarreOutilsValidation() {
                barreOutilsValidation = new ButtonBar();
                barreOutilsValidation.setAlignment(HorizontalAlignment.LEFT);
                
                barreOutilsValidation.add(creerBoutonFormulaire(i18nC.reinitialiser(), Images.ICONES.reinitialiser(), CODE_BOUTON_REINITIALISER));
                
                barreOutilsValidation.add(new FillToolItem());
                
                barreOutilsValidation.add(creerBoutonFormulaire(i18nC.appliquer(), Images.ICONES.appliquer(), CODE_BOUTON_APPLIQUER));
                
                barreOutilsValidation.add(creerBoutonFormulaire(i18nC.annuler(), Images.ICONES.annuler(), CODE_BOUTON_ANNULER));
                
                barreOutilsValidation.add(creerBoutonFormulaire(i18nC.valider(), Images.ICONES.valider(), CODE_BOUTON_VALIDER));
                
                panneauFormulaire.setBottomComponent(barreOutilsValidation);
        }
        
        protected Button creerBoutonFormulaire(String nom, AbstractImagePrototype icone, final String code) {
                SelectionListener<ButtonEvent> ecouteur = creerEcouteurBoutonFormulaire(code);
                Button bouton = creerBouton(nom, icone, ecouteur);
                return bouton;
        }
        
        protected abstract SelectionListener<ButtonEvent> creerEcouteurBoutonFormulaire(final String code);
        
        protected Button creerBouton(String nom, AbstractImagePrototype icone, SelectionListener<ButtonEvent> ecouteur) {
                Button bouton = new Button(nom);
                bouton.setIcon(icone);
                bouton.addSelectionListener(ecouteur);
                
                return bouton;
        }
        
        protected abstract void soumettreFormulaire();
        

        protected void verifierApresRafraichissement() {
                // Si le bouton Valider a été cliqué, nous affichons la liste des structures
                if (clicBoutonvalidation) {
                        mediateur.clicMenu(menuIdCourant);
                        clicBoutonvalidation = false;
                }
        }
        
        /** 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 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 abstract void afficherChampSupplementaire(Radio radioBtn);
        
        
        /** 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
         */
        protected 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
         */
        protected 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();
        }
}