Subversion Repositories eFlore/Applications.cel

Rev

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

package org.tela_botanica.client.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
import org.tela_botanica.client.modeles.objets.ListeGroupesChampsEtendus;
import org.tela_botanica.client.util.autocompletion.AutoCompletionComboBox;

import com.google.gwt.core.client.Callback;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.gwtext.client.core.EventCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Ext;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.layout.FormLayout;

@SuppressWarnings("unchecked")
public abstract class FormulaireSaisieChampEtendu extends FormPanel implements Rafraichissable {
        
        final AutoCompletionComboBox nChamp;
        Button ajouterChampsEtenduEtFermer;
        Button ajouterChampsEtendu;
        Button annulerAjouterChampEtendu;
        String idChamp = null;
        
        Panel conteneurGroupesChampsEtendus;
        Panel conteneurlabelGroupe;
        ListBox listeGroupeChampsEtendus;
        HTML indicationSaisieGroupe;
        
        private static ListeGroupesChampsEtendus cacheGroupes;
        private static Map<String, String> cacheLabelsCle;
        
        private HTML descriptionChamp = null;
    private String groupeSelectionne = null;
        
        public FormulaireSaisieChampEtendu() {  
                super();
                setPaddings(3);
                setBodyBorder(false);
                
                indicationSaisieGroupe = new HTML("Vous pouvez ajouter plusieurs champs à la fois correspondant à un groupe "+
                                "par exemple les champs des projet 'sauvages de ma rue' ou 'florilèges', etc... <br />"+
                                "De nouveaux groupes seront ajoutés régulièrement en fonction des champs les plus utilisés");
                indicationSaisieGroupe.addStyleName("aideCreerChampEtendu");
                
                conteneurlabelGroupe = new Panel();
                conteneurlabelGroupe.setStyleName("panneauEnLigne");
                conteneurlabelGroupe.addStyleName("selecteurGroupeEtendus");
                conteneurlabelGroupe.setBorder(false);
                Label labelGroupeChampsEtendus = new Label("Ajouter un groupe de champs :");
                listeGroupeChampsEtendus = new ListBox();
                listeGroupeChampsEtendus.setWidth("315px");
                conteneurlabelGroupe.add(labelGroupeChampsEtendus);
                conteneurlabelGroupe.add(listeGroupeChampsEtendus);
                
                conteneurGroupesChampsEtendus = new Panel();
                conteneurGroupesChampsEtendus.setBorder(false);
                conteneurGroupesChampsEtendus.setPaddings(0);
                conteneurGroupesChampsEtendus.setMargins(0);
                conteneurGroupesChampsEtendus.setLayout(new FormLayout());
                conteneurGroupesChampsEtendus.setWidth("100%");
                
                add(conteneurGroupesChampsEtendus);
                
                if(cacheGroupes == null) {
                        ListeReferentielChampsEtendusDAO lrceDao = new ListeReferentielChampsEtendusDAO(null);
                        lrceDao.obtenirGroupesChampsEtendus(this);
                } else {
                        this.rafraichir(cacheGroupes, false);
                }
                                
                HTML indicationSaisie = new HTML("Saisissez un nom de champ ou choisisez un nom proposé par l'autocomplétion "+
                                "Si vous choissisez un nom de champ existant vous pourrez profiter d'une autocomplétion "+
                                "sur les valeurs déjà saisies pour ce champ par les autres utilisateurs.<br /> "+
                                "Les champs de la forme 'label (clé)' sont des champs 'standards' ayant un rôle et une description " +
                                "bien définie");
                indicationSaisie.addStyleName("aideCreerChampEtendu");
                add(indicationSaisie);
                
                HorizontalPanel hp = new HorizontalPanel();
                hp.setBorderWidth(0);
                
                
                nChamp = new AutoCompletionComboBox("Nom du champ", ListeReferentielChampsEtendusDAO.getUrlRequeteNomsChampsEtendus()) {
                        @Override
                        protected Map<String, String> parserResultatRequete(
                                        Response response) {
                                Map<String, String> clesLabels = ListeReferentielChampsEtendusDAO.parserRetourListeNomsChampsEtendus(response);
                                cacheLabelsCle = new HashMap<String, String>();
                                for(Map.Entry<String, String> entry : clesLabels.entrySet()){
                                        cacheLabelsCle.put(entry.getValue(), entry.getKey());
                                }
                                return clesLabels;
                        }

                        @Override
                        protected void onSelectionValeur() {
                                telechargerEtAfficherDescriptionChamps(cacheLabelsCle.get(nChamp.getRawValue()));
                        }

                        @Override
                        protected void onValidationSaisie() {
                                // rien à faire ici
                        }

                        @Override
                        protected void onModificationValeur() {
                                // rien à faire ici non plus           
                        }
                        
                };
                
                nChamp.addStyleName("panneauEnLigne");
                add(nChamp);
                
                descriptionChamp = new HTML();
                descriptionChamp.addStyleName("aideWikiChampEtendu");
                add(descriptionChamp);
                
                ajouterChampsEtenduEtFermer = new Button("Ajouter et fermer");
                ajouterChampsEtenduEtFermer.setTooltip("Ajouter un champ étendu ou un groupe de champs et fermer la fenêtre");
                ajouterChampsEtendu = new Button("Ajouter");
                ajouterChampsEtendu.setTooltip("Ajouter un champ étendu ou un groupe de champ");
                annulerAjouterChampEtendu = new Button("Annuler");
                annulerAjouterChampEtendu.setTooltip("Fermer la fenêtre sans ajouter de champ");
                
                hp.add(ajouterChampsEtenduEtFermer);
                hp.add(ajouterChampsEtendu);
                hp.add(annulerAjouterChampEtendu);      
                add(hp);
                
                ajouterListeners();
        }

        private void ajouterListeners() {
                 
            listeGroupeChampsEtendus.addChangeHandler(new ChangeHandler() {             
                        @Override
                        public void onChange(ChangeEvent event) {
                                groupeSelectionne = listeGroupeChampsEtendus.getValue(listeGroupeChampsEtendus.getSelectedIndex());
                        }
                });
            
            ajouterChampsEtenduEtFermer.addListener(new ButtonListenerAdapter() {                       
                        @Override
                        public void onClick(Button button, EventObject e) {
                                if(doitAjouterGroupe()) {
                                        surValidationMultiple(renvoyerListeChampsEtendus(groupeSelectionne));
                                } else {
                                        if(champEtenduEstValide()) {
                                                surValidation(validerEtRenvoyerChampEtendu());
                                        } else {
                                                Window.alert("Le nom du champ étendu ne peut pas être vide");
                                        }
                                }
                        }
                });
            
            ajouterChampsEtendu.addListener(new ButtonListenerAdapter() {                       
                        @Override
                        public void onClick(Button button, EventObject e) {
                                if(champEtenduEstValide()) {
                                        surAjout(validerEtRenvoyerChampEtendu());
                                        raz();
                                } else {
                                        Window.alert("Le nom du champ étendu ne peut pas être vide");
                                }
                        }
                });
            
            annulerAjouterChampEtendu.addListener(new ButtonListenerAdapter() {                 
                        @Override
                        public void onClick(Button button, EventObject e) {
                                surAnnulation();
                        }
                });
        }
        
        private void raz() {
                idChamp = null;
                nChamp.reset();
                nChamp.focus();
        }
        
        private ChampSaisieEtendu validerEtRenvoyerChampEtendu() {
                String labelChamp = nChamp.getRawValue();
                String cleChamp = cacheLabelsCle.containsKey(labelChamp) ? cacheLabelsCle.get(labelChamp) : labelChamp;
                ChampSaisieEtendu retour = new ChampSaisieEtendu(labelChamp, cleChamp, ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(cleChamp));
                retour.setId(cleChamp);
                return retour;
        }
        
        private List<ChampSaisieEtendu> renvoyerListeChampsEtendus(String groupe) {     
                List<ChampSaisieEtendu> champsDuGroupe = new ArrayList<ChampSaisieEtendu>();
                HashMap<String, String> listeChampsEtendus = cacheGroupes.get(groupe);
                for (Iterator<String> iterator = listeChampsEtendus.keySet().iterator(); iterator.hasNext();) {
                        String cle = iterator.next();
                        String label = listeChampsEtendus.get(cle);
                        ChampSaisieEtendu champ = new ChampSaisieEtendu(label, cle,  ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(cle));
                        champsDuGroupe.add(champ);
                }

                return champsDuGroupe;
        }
        
        private boolean doitAjouterGroupe() {
                return groupeSelectionne != null && !groupeSelectionne.equals("");
        }
        
        private boolean champEtenduEstValide() {
                String valeurChamp = nChamp.getRawValue();
                return (valeurChamp != null && !valeurChamp.isEmpty());
        }
        
        public abstract void surAjout(ChampSaisieEtendu champ);
        public abstract void surAjoutMultiple(List<ChampSaisieEtendu> champs);
        public abstract void surValidation(ChampSaisieEtendu champ);
        public abstract void surValidationMultiple(List<ChampSaisieEtendu> champs);
        public abstract void surAnnulation();
        
        public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {                     
                if(nouvelleDonnees instanceof ListeGroupesChampsEtendus) {
                        cacheGroupes  = (ListeGroupesChampsEtendus)nouvelleDonnees;
                        listeGroupeChampsEtendus.addItem("...");
                        for (Iterator<String> iterator = cacheGroupes.keySet().iterator(); iterator.hasNext();) {
                                listeGroupeChampsEtendus.addItem(iterator.next());
                        }

                        if(cacheGroupes.size() > 0) {
                                conteneurGroupesChampsEtendus.add(indicationSaisieGroupe);
                                conteneurGroupesChampsEtendus.add(conteneurlabelGroupe);
                                doLayout();
                        }
                }
        }
        
    
    private void telechargerEtAfficherDescriptionChamps(final String cle) {
                ListeReferentielChampsEtendusDAO.telechargerDescriptionWikini(cle, new Callback<String, String>() {                     
                        @Override
                        public void onSuccess(String description) {
                                afficherDescriptionEtLienWikiChampEtendu(cle, description);
                        }
                        
                        @Override
                        public void onFailure(String reason) {
                                // rien
                        }
                });
        }
    
    private void afficherDescriptionEtLienWikiChampEtendu(final String cle, String description) {
        if(description.trim().isEmpty()) {
                        String urlDesc = ListeReferentielChampsEtendusDAO.obtenirUrlEditionDescriptionWiki(cle);
                        descriptionChamp.setHTML("<span> Aucune description n'existe pour ce champ.<br />" +
                                        "Vous pouvez la remplir sur cette page :" +
                                        "<a id=\"lien_description_wiki_ce_"+cle+"\" href="+urlDesc+" target=\"_blank\">"+cle+"</span></span>");
                        Ext.get("lien_description_wiki_ce_"+cle).addListener("click", new EventCallback() {     
                                @Override
                                public void execute(EventObject e) {
                                        ListeReferentielChampsEtendusDAO.creerPageWikini(cle);
                                }
                        });
                } else {
                        descriptionChamp.setHTML("<span class=\"descriptionChampEtenduTitre\">Description :</span> "+description);
                }
    }
}