Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.composants;

import org.tela_botanica.client.ComposantId;
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.Information;
import org.tela_botanica.client.modeles.Utilisateur;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
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.KeyListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.util.Format;
import com.extjs.gxt.ui.client.util.Params;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.HtmlContainer;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyCodes;

public class IdentificationFenetre extends Dialog implements Rafraichissable {
        
        private Mediateur mediateur = null;
        private Constantes i18nC = null;
        protected TextField<String> login = null;
        protected TextField<String> motDePasse = null;
        protected Button reinitialiserBouton = null;
        protected Button validerBouton = null;
        private Button annulerBouton = null;
        protected Status status = null;
        private String zoneInfoTpl = null;
        private HtmlContainer zoneInfoHtml = null;

        public IdentificationFenetre(Mediateur mediateurCourrant) {
                mediateur = mediateurCourrant;
                i18nC = Mediateur.i18nC;
                
                initialiserSquelettes();
                
                FormLayout layout = new FormLayout();
                layout.setLabelWidth(110);
                layout.setDefaultWidth(220);
                setLayout(layout);

                setButtonAlign(HorizontalAlignment.RIGHT);
            setButtons("");
                setIcon(Images.ICONES.utilisateur());
                setHeading(Registry.get(RegistreId.APPLI_NOM)+" - "+i18nC.identificationTitre());
                setModal(true);
                setBodyBorder(true);
                setBodyStyle("padding: 10px;background: none");
                setWidth(450);
                setResizable(false);
                setAutoWidth(false);
                
                
                KeyListener keyListener = new KeyListener() {
                        public void componentKeyUp(ComponentEvent event) {
                                valider();
                        }
                        @SuppressWarnings("unchecked")
                        public void componentKeyPress(ComponentEvent evenement) {
                                if (evenement.getKeyCode() == KeyCodes.KEY_ENTER) {
                                        TextField<String> champ = (TextField<String>) evenement.getSource();
                                        if (champ.getFieldLabel().equals(i18nC.motDePasse())) {
                                                validerBouton.fireEvent(Events.Select);
                                        }
                                }
                        }
                };

                zoneInfoHtml = new HtmlContainer();
                zoneInfoHtml.hide();
                add(zoneInfoHtml);
                
                login = new TextField<String>();
                login.setMinLength(4);
                login.setFieldLabel(i18nC.login());
                login.addKeyListener(keyListener);
                add(login);

                motDePasse = new TextField<String>();
                motDePasse.setMinLength(4);
                motDePasse.setPassword(true);
                motDePasse.setFieldLabel(i18nC.motDePasse());
                motDePasse.addKeyListener(keyListener);
                add(motDePasse);

                setFocusWidget(login);
        }
        
        private void initialiserSquelettes() {
                zoneInfoTpl = "<div id='"+ComposantId.DIV_IDENTIFICATION_MSG+"'>{0}</div>";
        }
        
        @Override
        protected void createButtons() {
                super.createButtons();
                // FIXME : l'instanciation dans le constructeur ne marche pas pour cette méthode...
                i18nC = Mediateur.i18nC;
            
                status = new Status();
            status.setBusy(i18nC.identificationVerification());
            status.hide();
            status.setAutoWidth(true);
            getButtonBar().add(status);
            
            getButtonBar().add(new FillToolItem());
            
                reinitialiserBouton = new Button(i18nC.reinitialiser());
                reinitialiserBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        public void componentSelected(ButtonEvent ce) {
                                zoneInfoHtml.hide();
                                login.reset();
                                motDePasse.reset();
                                status.clearStatus("");
                                valider();
                                login.focus();
                                layout();
                        }

                });

                validerBouton = new Button(i18nC.valider());
                validerBouton.disable(); // Par défaut : dois être en mode disable
                validerBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        public void componentSelected(ButtonEvent ce) {
                                onSubmit();
                        }
                });
                
                annulerBouton = new Button(i18nC.annuler());
                annulerBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        public void componentSelected(ButtonEvent ce) {
                                hide();
                        }
                });
                
                addButton(reinitialiserBouton);
                addButton(annulerBouton);
                addButton(validerBouton);
        }

        protected void onSubmit() {
                status.show();
            getButtonBar().disable();
                mediateur.connecterUtilisateur(login.getValue(), motDePasse.getValue());
        }

        protected boolean avoirValeur(TextField<String> field) {
                return field.getValue() != null && field.getValue().length() > 0;
        }

        protected void valider() {
                validerBouton.setEnabled(avoirValeur(login) && avoirValeur(motDePasse) && motDePasse.getValue().length() > 3);
        }

        public void rafraichir(Object nouvellesDonnees) {
                if (nouvellesDonnees instanceof Information) {
                        Information info = (Information) nouvellesDonnees;
                        if (info.getType().equals("maj_utilisateur")) {
                                Utilisateur utilisateurCourant = mediateur.getUtilisateur();
                                if (utilisateurCourant.isIdentifie() == false) {
                                                if (utilisateurCourant.getLicence().equals("")) {
                                                        afficherErreur(i18nC.identificationMauvaise());
                                                } else if (utilisateurCourant.getLicence().equals("0")){
                                                        afficherErreur(i18nC.licenceAccepter());
                                                        mediateur.afficherFenetreLicence(this);
                                                } else {
                                                        hide();
                                                }
                                } else {
                                        if (utilisateurCourant.existeDansAnnuaire())    {
                                                mediateur.mettreAJourPersonneAnnuaire(utilisateurCourant);
                                        }
                                        hide();
                                }
                        } 
                } else {
                        GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);
                }
                
        }
        
        public void afficherErreur(String erreur)       {
                status.hide();
                getButtonBar().enable();
                valider();
                zoneInfoHtml.setHtml(Format.substitute(zoneInfoTpl, (new Params()).add(erreur)));
                zoneInfoHtml.show();
                layout();
        }

}