Subversion Repositories eFlore/Applications.coel

Rev

Rev 884 | Blame | Last modification | View Log | RSS feed

package org.tela_botanica.client.vues;

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

import org.tela_botanica.client.Mediateur;
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.MenuApplicationId;
import org.tela_botanica.client.modeles.Personne;
import org.tela_botanica.client.modeles.PersonneListe;
import org.tela_botanica.client.modeles.Publication;
import org.tela_botanica.client.modeles.PublicationAPersonne;
import org.tela_botanica.client.modeles.PublicationAPersonneListe;
import org.tela_botanica.client.modeles.Structure;
import org.tela_botanica.client.modeles.StructureListe;
import org.tela_botanica.client.util.Pattern;
import org.tela_botanica.client.util.UtilArray;
import org.tela_botanica.client.util.UtilString;

import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.HorizontalPanel;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.google.gwt.core.client.GWT;


public class PublicationForm extends Formulaire implements Rafraichissable {
        
        private Publication publication;
        private PublicationAPersonneListe publicationAPersonneListe = null;
        private boolean publicationAPersonneListeChargementOk = false;
        
        private FieldSet auteursFieldset = null;
        private ArrayList<ComboBox<Personne>> auteurComboboxListe = null;
        private LayoutContainer conteneurChamps;
        private ListStore<Personne> auteursStorePartage = null;
        private boolean auteurStorePartageChargementOk = false;
        
        private FieldSet generalitesFieldset = null;
        private TextField<String> titreChp = null;
        private TextField<String> collectionChp = null;
        private TextField<String> uriChp = null;
        
        private FieldSet editionFieldset = null;
        private ComboBox<Structure> editeurCombobox = null;
        private TextField<String> datePublicationChp = null;
        private TextField<String> tomeChp = null;
        private TextField<String> fasciculeChp = null;
        private TextField<String> pagesChp = null;
        
        private String idStructureEdition = ""; 
        private String idAuteurs = "";

        private boolean formulaireValideOk = false;
        private boolean publicationValideOk = false;
        private boolean auteursValideOk = false;

        public PublicationForm(Mediateur mediateurCourrant, String publicationId) {
                initialiserPublicationForm(mediateurCourrant, publicationId);
        }

        public PublicationForm(Mediateur mediateurCourrant, String publicationId, Rafraichissable vueARafraichirApresValidation) {
                vueExterneARafraichirApresValidation = vueARafraichirApresValidation;
                initialiserPublicationForm(mediateurCourrant, publicationId);
        }
        
        private void initialiserPublicationForm(Mediateur mediateurCourrant, String publicationId) {
                publication = new Publication();
                publication.setId(publicationId);
                
                String modeDeCreation = (UtilString.isEmpty(publication.getId()) ? Formulaire.MODE_AJOUTER : Formulaire.MODE_MODIFIER);
                initialiserFormulaire(mediateurCourrant, modeDeCreation, MenuApplicationId.PUBLICATION);
                
                panneauFormulaire.setLayout(new FlowLayout());
                String titre = genererTitreFormulaire();
                panneauFormulaire.setHeading(titre);

                creerZoneAuteurs();
                panneauFormulaire.add(auteursFieldset);
                
                creerZoneGeneralites();
                panneauFormulaire.add(generalitesFieldset);
                
                creerZoneEdition();
                panneauFormulaire.add(editionFieldset);
                
                if (modeDeCreation.equals(Formulaire.MODE_MODIFIER)) {
                        mediateurCourrant.selectionnerPublication(this, publicationId);
                        mediateurCourrant.selectionnerPublicationAPersonne(this, publicationId, null, PublicationAPersonne.ROLE_AUTEUR);
                }
        }
        
        private String genererTitreFormulaire() {
                String titre = "Ajout d'une publication";
                if (mode.equals(Formulaire.MODE_MODIFIER)) {
                         titre = "Modification d'une publication - "+i18nC.id()+": "+publication.getId();
                }
                return titre;
        }
        
        private void creerZoneAuteurs() {
                FormLayout layout = new FormLayout();
                layout.setLabelWidth(200);
                
                // Fieldset Auteur
                auteursFieldset = new FieldSet();
                auteursFieldset.setHeading("Auteur(s)");
                auteursFieldset.setCollapsible(true);
                auteursFieldset.setLayout(layout);
                
                auteurComboboxListe = new ArrayList<ComboBox<Personne>>(0);
                auteursStorePartage = new ListStore<Personne>();
                mediateur.clicObtenirListeAuteurs(this);
                
                creerChampsAuteur();
        }
        
        private void creerChampsAuteur() {
                auteursFieldset.removeAll();
                
                conteneurChamps = new LayoutContainer(); 
                                
                Button ajouterAuteurBouton = new Button("Ajouter un auteur");
                ajouterAuteurBouton.setIcon(Images.ICONES.ajouter());
                ajouterAuteurBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent be) {
                                creerChampAuteurEtBoutonSupprimer(null);
                        }
                });
                
                auteursFieldset.add(conteneurChamps);
                auteursFieldset.add(ajouterAuteurBouton);
                auteursFieldset.layout(true);
                
                if (mode.equals(Formulaire.MODE_AJOUTER)) {
                        creerChampAuteurEtBoutonSupprimer(null);
                }
        }
        
        public void creerChampAuteurEtBoutonSupprimer(Personne auteur) {
                final HorizontalPanel panneauHorizontal = new HorizontalPanel();
                panneauHorizontal.setLayout(new FormLayout());
                
                final ComboBox<Personne> auteursSaisisComboBox = creerComboBoxAuteursSaisis();
                if (auteur != null) {
                        GWT.log(auteur.getId(), null);
                        auteursSaisisComboBox.setValue(auteursStorePartage.findModel("id_personne", auteur.getId()));
                }
                auteurComboboxListe.add(auteursSaisisComboBox);
                auteursSaisisComboBox.setFieldLabel("Auteur "+auteurComboboxListe.size());
                
                LayoutContainer panneauChampTxtEtBouton = new LayoutContainer();
                panneauChampTxtEtBouton.setLayout(new FormLayout());
                panneauChampTxtEtBouton.add(auteursSaisisComboBox, new FormData(300, 0));
                panneauHorizontal.add(panneauChampTxtEtBouton);
                
                Button supprimerAuteurBouton = new Button();
                supprimerAuteurBouton.setIcon(Images.ICONES.supprimer());
                supprimerAuteurBouton.setToolTip(i18nC.supprimer());
                supprimerAuteurBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent be) {
                                auteurComboboxListe.remove(auteursSaisisComboBox);
                                conteneurChamps.remove(panneauHorizontal);
                                
                                int numeroAuteurs = 1;
                                for (Iterator<ComboBox<Personne>> it = auteurComboboxListe.iterator(); it.hasNext();) {
                                        it.next().setFieldLabel("Auteur "+numeroAuteurs);
                                        numeroAuteurs++;
                                }

                                auteursFieldset.layout(true);
                        }
                });
                panneauHorizontal.add(supprimerAuteurBouton);
                
                conteneurChamps.add(panneauHorizontal);
                auteursFieldset.layout(true);
        }
        
        private ComboBox<Personne> creerComboBoxAuteursSaisis() {
                ComboBox<Personne> comboBox = new ComboBox<Personne>();
                comboBox.setEmptyText(i18nC.chercherPersonneSaisi());
                comboBox.setEditable(true);
                comboBox.setForceSelection(true);
                comboBox.setDisplayField("fmt_nom_complet");
                comboBox.setTriggerAction(TriggerAction.ALL);
                comboBox.setStore(auteursStorePartage);

                return comboBox;
        }
        
        private void creerZoneGeneralites() {
                FormLayout layout = new FormLayout();
                layout.setLabelWidth(200);
                
                // Fieldset Infos Générales
                generalitesFieldset = new FieldSet();
                generalitesFieldset.setHeading("Informations générales");
                generalitesFieldset.setCollapsible(true);
                generalitesFieldset.setLayout(layout);
                
                titreChp = new TextField<String>();
                titreChp.setName("cpu");
                titreChp.setFieldLabel("Titre de l'article ou de l'ouvrage");
                generalitesFieldset.add(titreChp, new FormData(450, 0));
                
                collectionChp = new TextField<String>();
                collectionChp.setFieldLabel("Intitulé de la revue ou de la collection");
                generalitesFieldset.add(collectionChp, new FormData(450, 0));
                
                uriChp = new TextField<String>();
                uriChp.setFieldLabel("URL de la publication");
                generalitesFieldset.add(uriChp, new FormData(450, 0));
        }
        
        private void creerZoneEdition() {
                FormLayout layout = new FormLayout();
                layout.setLabelWidth(200);

                // Fieldset Edition
                editionFieldset = new FieldSet();
                editionFieldset.setHeading("Édition");
                editionFieldset.setCollapsible(true);
                editionFieldset.setLayout(layout);
                
                ListStore<Structure> editeurStore = new ListStore<Structure>();
                editeurCombobox = new ComboBox<Structure>();  
                editeurCombobox.setEmptyText("Sélectionner un éditeur...");
                editeurCombobox.setFieldLabel("Éditeur de la publication");
                editeurCombobox.setDisplayField("nom");
                editeurCombobox.setStore(editeurStore);
                editeurCombobox.setEditable(true);
                editeurCombobox.setTriggerAction(TriggerAction.ALL);
                editionFieldset.add(editeurCombobox, new FormData(450, 0));
                mediateur.clicObtenirListeEditeurs(this);
                
                datePublicationChp = new TextField<String>();
                datePublicationChp.setMaxLength(4);
                datePublicationChp.setMinLength(4);
                datePublicationChp.setFieldLabel("Année de publication");
                editionFieldset.add(datePublicationChp, new FormData(40, 0));
                
                tomeChp = new TextField<String>();
                tomeChp.setFieldLabel("Série de la revue ou tome");
                editionFieldset.add(tomeChp, new FormData(75, 0));
                
                fasciculeChp = new TextField<String>();
                fasciculeChp.setFieldLabel("Fascicule de la revue");
                editionFieldset.add(fasciculeChp, new FormData(75, 0));
                
                pagesChp = new TextField<String>();
                pagesChp.setFieldLabel("Pages");
                pagesChp.setToolTip("Fomat : NBRE ou NBRE-NBRE. ('NBRE' correspond à une suite de chiffres arabes ou romains ou à un point d'interrogation '?' dans le cas d'une donnée inconnue)");
                editionFieldset.add(pagesChp, new FormData(100, 0));
        }

        public void rafraichir(Object nouvellesDonnees) {
                if (nouvellesDonnees instanceof Publication) {
                        // Si on a reçu les details d'une publication
                        rafraichirPublication((Publication) nouvellesDonnees);
                } else if (nouvellesDonnees instanceof StructureListe) {
                        // Si on a reçu une liste des editeurs
                        rafraichirListeEditeurs((StructureListe) nouvellesDonnees);
                } else if (nouvellesDonnees instanceof PublicationAPersonneListe) {
                        rafraichirListeAuteurs((PublicationAPersonneListe) nouvellesDonnees);
                } else if (nouvellesDonnees instanceof Information) {
                        rafraichirInformation((Information) nouvellesDonnees);  
                } else {
                        GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);
                }
                
                if (etrePretAAfficherAuteurs()) {
                        afficherAuteurs();
                }
                
                if (etreValide()) {
                        initialiserValidation();
                        repandreRafraichissement();
                        controlerFermetureApresRafraichissement();
                }
        }

        private void rafraichirPublication(Publication publi) {
                publication = publi;
                peuplerFormulaire();
        }
        
        private void rafraichirListeEditeurs(StructureListe editeurs) {
                editeurCombobox.getStore().removeAll();
                editeurCombobox.getStore().add((List<Structure>) editeurs.toList());
                
                if (mode.equals(Formulaire.MODE_MODIFIER)) {    
                        editeurCombobox.setValue((Structure) editeurs.get(idStructureEdition));
                }
                editeurCombobox.expand();
        }
        
        private void rafraichirListeAuteurs(PublicationAPersonneListe auteurs) {
                publicationAPersonneListe = auteurs;
                publicationAPersonneListeChargementOk = true;
        }
        
        private void rafraichirInformation(Information info) {
                if (info.getType().equals("liste_personne")) {
                        PersonneListe listePersonneAuteur = (PersonneListe) info.getDonnee(0);
                        
                        List<Personne> liste = listePersonneAuteur.toList();
                        auteursStorePartage.removeAll();
                        auteursStorePartage.add(liste);
                        
                        auteurStorePartageChargementOk = true;
                } else if (info.getType().equals("publication_valide")) {
                        publicationValideOk = true;
                        publication.setId((String) info.getDonnee(0));
                        
                        if (mode.equals(Formulaire.MODE_AJOUTER)) {
                                mediateur.ajouterPublicationAPersonne(this, publication.getId(), idAuteurs, PublicationAPersonne.ROLE_AUTEUR);
                        } else if (mode.equals(Formulaire.MODE_MODIFIER)) {
                                mediateur.modifierPublicationAPersonne(this, publication.getId(), idAuteurs, PublicationAPersonne.ROLE_AUTEUR);
                        }
                } else if (info.getType().equals("auteur_valide")) {
                        auteursValideOk = true;
                }
        }
        
        private void afficherAuteurs() {
                Iterator<String> itap = publicationAPersonneListe.keySet().iterator();
                while (itap.hasNext()) {
                        creerChampAuteurEtBoutonSupprimer(publicationAPersonneListe.get(itap.next()).getPersonne());
                }
                initialiserAffichageAuteurs();
        }

        private void initialiserAffichageAuteurs() {
                auteurStorePartageChargementOk = false;
                publicationAPersonneListeChargementOk = false;
        }

        private boolean etrePretAAfficherAuteurs() {
                boolean ok = false;
                if (auteurStorePartageChargementOk && publicationAPersonneListeChargementOk) {
                        ok = true;
                }
                return ok;
        }

        private Boolean etreValide() {
                Boolean valide = false;
                GWT.log("formulaire"+formulaireValideOk+" - Publication :"+publicationValideOk+" - Auteurs :"+auteursValideOk, null);
                if (formulaireValideOk && publicationValideOk && auteursValideOk) {
                        valide = true;
                }
                return valide;
        }
        
        private void initialiserValidation() {
                formulaireValideOk = false;
                publicationValideOk = false;
                auteursValideOk = false;
        }
        
        private void repandreRafraichissement() {
                if (vueExterneARafraichirApresValidation != null) {
                        String type = "publication_modifiee";
                        if (mode.equals(Formulaire.MODE_AJOUTER)) {
                                type = "publication_ajoutee";
                        }
                        Information info = new Information(type);
                        info.setDonnee(0, publication);
                        vueExterneARafraichirApresValidation.rafraichir(info);
                }
        }
        
        public boolean soumettreFormulaire() {
                formulaireValideOk = verifierFormulaire();
                GWT.log("Form?"+formulaireValideOk, null);
                if (formulaireValideOk) {
                        Publication publicationCollectee = collecterPublication();
                        if (publicationCollectee != null) {
                                GWT.log("Info collectée ? ok", null);
                                if (mode.equals(Formulaire.MODE_AJOUTER)) {
                                        mediateur.ajouterPublication(this, publicationCollectee);
                                } else if (mode.equals(Formulaire.MODE_MODIFIER)) {
                                        mediateur.modifierPublication(this, publicationCollectee);
                                }
                        }
                }
                return formulaireValideOk;
        }
        
        protected boolean verifierFormulaire() {
                boolean valide = true;
                ArrayList<String> messages = new ArrayList<String>();
                
                boolean auteurErreur = true;
                for (int i = 0; i < auteurComboboxListe.size(); i++) {
                        if (auteurComboboxListe.get(i).getValue() != null) {
                                auteurErreur = false;
                                break;
                        }
                }
                if (auteurErreur) {
                        messages.add("Veuillez saisir au moins un auteur !");
                }
                
                String titre = titreChp.getValue();
                if (titre == null || titre.equals("")) {
                        messages.add("Veuillez saisir le titre de la publication !");
                }
                
                String uri = uriChp.getValue();
                if (uri != null && ! uri.isEmpty() && ! uri.matches(Pattern.url)) {
                        messages.add("L'URL saisie n'est pas valide !");
                }
                
                String datePublication = datePublicationChp.getRawValue();
                if (datePublication == null || datePublication.equals("")) {
                        messages.add("Veuillez saisir une année de parution !");
                } else {
                        if (!etreDateValide(datePublication)) {
                                messages.add("Le format de l'année saisie est incorrect !");
                        }
                }
                
                String pages = pagesChp.getValue();
                String valeurPage = "(?:[0-9]+|[IVXLCDM]+|\\?)";
                if (pages != null && ! pages.matches("^(?:"+valeurPage+"|"+valeurPage+"-"+valeurPage+")$")) {
                        messages.add("Le format des pages est incorrect !");
                }
                
                if (messages.size() != 0) {
                        String[] tableauDeMessages = {};
                        tableauDeMessages = messages.toArray(tableauDeMessages);
                        MessageBox.alert("Erreurs de saisies", UtilArray.implode(tableauDeMessages, "<br />"), null);
                        valide = false;
                }
                return valide;          
        }
        
        private void peuplerFormulaire() {
                creerChampsAuteur();
                titreChp.setValue(publication.getTitre());
                collectionChp.setValue(publication.getCollection());
                uriChp.setValue(publication.getURI());
                datePublicationChp.setRawValue(reduireDateParAnnee(publication.getDateParution()));
                tomeChp.setValue(publication.getIndicationNvt());
                fasciculeChp.setValue(publication.getFascicule());
                pagesChp.setValue(publication.getPages());
                
                if (publication.getEditeur().matches("^[0-9]+$")) {
                        editeurCombobox.setValue(editeurCombobox.getStore().findModel("id_structure", publication.getEditeur()));
                        idStructureEdition = publication.getEditeur();
                } else {
                        editeurCombobox.setRawValue(publication.getEditeur());
                }
        }
        
        private Publication collecterPublication() {
                Publication publicationARetourner = null;
                Publication publicationCollectee = (Publication) publication.cloner(new Publication());
                
                String auteurIntituleFormate = "";
                int auteursNombre = auteurComboboxListe.size();
                for (int i = 0; i < auteursNombre; i++) {
                        if (auteurComboboxListe.get(i).getValue() != null) {
                                Personne auteur = auteurComboboxListe.get(i).getValue();
                                idAuteurs += auteur.getId();
                                auteurIntituleFormate += auteur.getNom()+ " "+auteur.getPrenom();
                                if (i != (auteursNombre - 1)) {
                                        auteurIntituleFormate += ", ";
                                        idAuteurs += ",";
                                }
                        }
                }
                GWT.log("Auteurs formaté :"+auteurIntituleFormate, null);
                GWT.log("Auteurs ids :"+idAuteurs, null);
                publicationCollectee.setAuteur(auteurIntituleFormate);
                
                String titre = titreChp.getValue();
                publicationCollectee.setTitre(titre);
                
                String collection = collectionChp.getValue();
                publicationCollectee.setCollection(collection);
                
                String nomComplet = titreChp.getValue()+" "+collectionChp.getValue();
                publicationCollectee.setNomComplet(nomComplet);
                
                String uri = uriChp.getValue();
                publicationCollectee.setUri(uri);
                
                String editeur = "";
                if (editeurCombobox.getValue() != null) {
                        editeur = editeurCombobox.getValue().getId();
                        publicationCollectee.setStructureEditeur(editeurCombobox.getValue());
                } else if (editeurCombobox.getRawValue() != "") {
                        editeur = editeurCombobox.getRawValue();
                }
                publicationCollectee.setEditeur(editeur);
                
                String anneePublication = datePublicationChp.getRawValue();
                String datePublication = anneePublication+"-00-00";
                publicationCollectee.setDateParution(datePublication);
                
                String tome = tomeChp.getValue();
                publicationCollectee.setIndicationNvt(tome);
                
                String fascicule = fasciculeChp.getValue();
                publicationCollectee.setFascicule(fascicule);
                
                String pages = pagesChp.getValue();
                publicationCollectee.setPages(pages);
                
                if (!publicationCollectee.comparer(publication)) {
                        publicationARetourner = publication = publicationCollectee;
                }
                
                return publicationARetourner;
        }
        
        protected void reinitialiserFormulaire() {
                if (mode.equals(Formulaire.MODE_MODIFIER)) {
                        mediateur.afficherFormPublication(publication.getId());
                } else {
                        mediateur.afficherFormPublication(null);
                }
        }
        
        private boolean etreDateValide(String anneePublication) {
                boolean valide = true;
                if (!anneePublication.matches("^[0-2][0-9]{3}$")) {
                        valide = false;
                }
                return valide;
        }
        
        private String reduireDateParAnnee(String datePar) {
                if (datePar.matches("^[0-2][0-9]{3}(-[0-9]{2}){2}$")) {
                        return datePar.split("-")[0];
                } else {
                        return "";
                }
        }
        
        @Override
        protected SelectionListener<ButtonEvent> creerEcouteurValidation() {
                SelectionListener<ButtonEvent> ecouteur = new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent ce) {
                                String code = ((Button) ce.getComponent()).getData("code");
                                if (code.equals(FormulaireBarreValidation.CODE_BOUTON_VALIDER)) {
                                        soumettreFormulaire();
                                        clicBoutonvalidation = true;
                                } else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_APPLIQUER)) {
                                        soumettreFormulaire();
                                } else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_ANNULER)) {
                                        mediateur.clicMenu(menuIdCourant);
                                } else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_REINITIALISER)) {
                                        reinitialiserFormulaire();
                                }
                        }
                };
                
                return ecouteur;
        }
        
}