Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.vues.commentaire;

import java.util.ArrayList;

import org.tela_botanica.client.ComposantClass;
import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.composants.ChampSliderPourcentage;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Information;
import org.tela_botanica.client.modeles.MenuApplicationId;
import org.tela_botanica.client.modeles.commentaire.Commentaire;
import org.tela_botanica.client.modeles.projet.Projet;
import org.tela_botanica.client.modeles.projet.ProjetListe;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.util.UtilArray;
import org.tela_botanica.client.util.UtilString;
import org.tela_botanica.client.vues.Formulaire;

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.store.ListStore;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.form.CheckBox;
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.TextArea;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.form.Validator;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;


public class CommentaireForm extends Formulaire implements Rafraichissable {
        
        private Commentaire commentaire;

        private ComboBox<Projet> projetsCombo = null;
        private TextField<String> titreChp;
        private TextArea texteChp;
        private ChampSliderPourcentage ponderationChp;
        private CheckBox publicChp;
        
        private static boolean formulaireValideOk = false;
        private static boolean commentaireValideOk = false;

        public CommentaireForm(Mediateur mediateurCourrant, String commentaireId) {
                initialiserCommentaireForm(mediateurCourrant, commentaireId);
        }

        public CommentaireForm(Mediateur mediateurCourrant, String commentaireId, Rafraichissable vueARafraichirApresValidation) {
                vueExterneARafraichirApresValidation = vueARafraichirApresValidation;
                initialiserCommentaireForm(mediateurCourrant, commentaireId);
        }
        
        private void initialiserCommentaireForm(Mediateur mediateurCourrant, String commentaireId) {
                initialiserValidation();
                
                commentaire = new Commentaire();
                commentaire.setId(commentaireId);
                
                String modeDeCreation = (UtilString.isEmpty(commentaire.getId()) ? Formulaire.MODE_AJOUTER : Formulaire.MODE_MODIFIER);
                initialiserFormulaire(mediateurCourrant, modeDeCreation, MenuApplicationId.COMMENTAIRE);
                
                panneauFormulaire.setLayout(new FormLayout());
                String titre = genererTitreFormulaire();
                panneauFormulaire.setHeading(titre);

                creerChamps();

                if (modeDeCreation.equals(Formulaire.MODE_MODIFIER)) {
                        mediateur.selectionnerCommentaire(this, commentaireId);
                }
        }
        
        private String genererTitreFormulaire() {
                String titre = i18nC.commentaireTitreFormAjout();
                if (mode.equals(Formulaire.MODE_MODIFIER)) {
                         titre = i18nC.commentaireTitreFormModif()+" - "+i18nC.id()+": "+commentaire.getId();
                }
                return titre;
        }
        
        private void creerChamps() {
                projetsCombo = new ComboBox<Projet>();
                projetsCombo.setTabIndex(tabIndex++);
                projetsCombo.setFieldLabel(i18nC.projetChamp());
                projetsCombo.setDisplayField("nom");
                projetsCombo.setForceSelection(true);
                projetsCombo.setValidator(new Validator() {
                        @Override
                        public String validate(Field<?> field, String value) {
                                String retour = null;
                                if (field.getRawValue().equals("")) {
                                        field.setValue(null);
                                } else if (projetsCombo.getStore().findModel("nom", field.getRawValue()) == null) {
                                        String contenuBrut = field.getRawValue();
                                        field.setValue(null);
                                        field.setRawValue(contenuBrut);
                                        retour = "Veuillez sélectionner une valeur ou laisser le champ vide";
                                }
                                return retour;
                        }
                });
                projetsCombo.setTriggerAction(TriggerAction.ALL);
                projetsCombo.setStore(new ListStore<Projet>());
                projetsCombo.addStyleName(ComposantClass.OBLIGATOIRE);
                projetsCombo.addListener(Events.Valid, new Listener<BaseEvent>() {
                        @Override
                        public void handleEvent(BaseEvent be) {
                                Projet valeur = projetsCombo.getValue();
                                // Gestion du style obligatoire
                                projetsCombo.removeStyleName(ComposantClass.OBLIGATOIRE);
                                projetsCombo.removeStyleName(ComposantClass.OBLIGATOIRE_OK);
                                if (valeur != null) {
                                        projetsCombo.addStyleName(ComposantClass.OBLIGATOIRE_OK);
                                } else {
                                        projetsCombo.addStyleName(ComposantClass.OBLIGATOIRE);
                                }
                        }
                });
                panneauFormulaire.add(projetsCombo, new FormData(450, 0));
                mediateur.selectionnerProjet(this, null);
                
                titreChp = new TextField<String>();
                titreChp.setFieldLabel(i18nC.commentaireTitre());
                titreChp.addStyleName(ComposantClass.OBLIGATOIRE);
                titreChp.addListener(Events.Valid, creerEcouteurChampObligatoire());
                panneauFormulaire.add(titreChp, new FormData(450, 0));
                
                texteChp = new TextArea();
                texteChp.setFieldLabel(i18nC.commentaireTexte());
                panneauFormulaire.add(texteChp, new FormData(450, 250));
                
                ponderationChp = new ChampSliderPourcentage(i18nC.commentairePonderation());
                panneauFormulaire.add(ponderationChp, new FormData(450, 0));
                
                publicChp = new CheckBox();
                publicChp.setFieldLabel(i18nC.donneePublic());
                panneauFormulaire.add(publicChp, new FormData(50, 0));
        }
        
        public void rafraichir(Object nouvellesDonnees) {
                if (nouvellesDonnees instanceof Commentaire) {
                        // Si on a reçu les details d'une publication
                        rafraichirCommentaire((Commentaire) nouvellesDonnees);
                } else if (nouvellesDonnees instanceof ProjetListe) {
                        ProjetListe projets = (ProjetListe) nouvellesDonnees;
                        Formulaire.rafraichirComboBox(projets, projetsCombo);
                        setValeurComboProjets();
                } else if (nouvellesDonnees instanceof Information) {
                        rafraichirInformation((Information) nouvellesDonnees);  
                } else {
                        Debug.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()));
                }
                
                if (etreValide()) {
                        initialiserValidation();
                        repandreRafraichissement();
                        controlerFermetureApresRafraichissement();
                }
        }
        
        private void rafraichirCommentaire(Commentaire commentaireRecu) {
                commentaire = commentaireRecu;
                peuplerFormulaire();
        }
        
        private String getValeurComboProjets() {
                String valeur = "";
                if (projetsCombo.getValue() != null) {
                        valeur = projetsCombo.getValue().getId();
                }
                return valeur;
        }
        private void setValeurComboProjets() {
                if (projetsCombo.getStore() != null ) {
                        if (mode.equals(Formulaire.MODE_MODIFIER) && commentaire != null) {
                                projetsCombo.setValue(projetsCombo.getStore().findModel("id_projet", commentaire.getIdProjet()));
                        } else if (mode.equals(Formulaire.MODE_AJOUTER)) {
                                projetsCombo.setValue(projetsCombo.getStore().findModel("id_projet", mediateur.getProjetId()));
                        }
                }
        }
        
        private void rafraichirInformation(Information info) {
                String type = info.getType();
                if (type.equals("ajout_commentaire") || type.equals("modif_commentaire")) {
                        commentaireValideOk = true;
                        commentaire.setId((String) info.getDonnee(0));
                }
        }

        private Boolean etreValide() {
                Boolean valide = false;
                Debug.log("formulaire"+formulaireValideOk+" - Commentaire :"+commentaireValideOk);
                if (formulaireValideOk && commentaireValideOk) {
                        valide = true;
                }
                return valide;
        }
        
        private void initialiserValidation() {
                formulaireValideOk = false;
                commentaireValideOk = false;
        }
        
        private void repandreRafraichissement() {
                if (vueExterneARafraichirApresValidation != null) {
                        String type = "commentaire_modifiee";
                        if (mode.equals(Formulaire.MODE_AJOUTER)) {
                                type = "commentaire_ajoutee";
                        }
                        Information info = new Information(type);
                        info.setDonnee(0, commentaire);
                        vueExterneARafraichirApresValidation.rafraichir(info);
                }
        }
        
        public boolean soumettreFormulaire() {
                formulaireValideOk = verifierFormulaire();
                Debug.log("Form?"+formulaireValideOk);
                if (formulaireValideOk) {
                        soumettreCommentaire();
                }
                return formulaireValideOk;
        }
        
        private void soumettreCommentaire() {
                Commentaire commentaireCollectee = collecterCommentaire();
                if (commentaireCollectee != null) {
                        Debug.log("Info public collectée ? ok");
                        if (mode.equals(Formulaire.MODE_AJOUTER)) {
                                mediateur.ajouterCommentaire(this, commentaireCollectee);
                        } else if (mode.equals(Formulaire.MODE_MODIFIER)) {
                                mediateur.modifierCommentaire(this, commentaireCollectee);
                        }
                }
        }
        
        public boolean verifierFormulaire() {
                boolean valide = true;
                ArrayList<String> messages = new ArrayList<String>();
                
                String titre = titreChp.getValue();
                if (titre == null || titre.equals("")) {
                        messages.add(i18nC.commentaireMessageTitre());
                }
                
                if (messages.size() != 0) {
                        String[] tableauDeMessages = {};
                        tableauDeMessages = messages.toArray(tableauDeMessages);
                        MessageBox.alert(i18nC.erreurSaisieTitre(), UtilArray.implode(tableauDeMessages, "<br />"), null);
                        valide = false;
                }
                return valide;          
        }
        
        private void peuplerFormulaire() {
                setValeurComboProjets();
                titreChp.setValue(commentaire.getTitre());
                texteChp.setValue(commentaire.getTexte());
                ponderationChp.peupler(commentaire.getPonderation());
                boolean acces = (commentaire.etrePublic() ? true : false);
                publicChp.setValue(acces);
        }
        
        private Commentaire collecterCommentaire() {
                Commentaire commentaireCollectee = (Commentaire) commentaire.cloner(new Commentaire());
                
                commentaireCollectee.setIdProjet(getValeurComboProjets());
                
                String titre = titreChp.getValue();
                commentaireCollectee.setTitre(titre);
                
                String texte = texteChp.getValue();
                commentaireCollectee.setTexte(texte);
                
                String ponderation = ponderationChp.getValeur();
                commentaireCollectee.setPonderation(ponderation);
                
                String acces = (publicChp.getValue() ? "1" : "0");
                commentaireCollectee.setPublic(acces);
                
                Commentaire commentaireARetourner = null;
                if (!commentaireCollectee.comparer(commentaire)) {
                        commentaireARetourner = commentaire = commentaireCollectee;
                }
                return commentaireARetourner;
        }
        
        public void reinitialiserFormulaire() {
                if (mode.equals(Formulaire.MODE_MODIFIER)) {
                        mediateur.afficherFormPublication(commentaire.getId());
                } else {
                        mediateur.afficherFormPublication(null);
                }
        }
}