Subversion Repositories eFlore/Applications.coel

Rev

Rev 799 | Rev 822 | Go to most recent revision | Blame | Compare with Previous | 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 java.util.Set;

import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.RegistreId;
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.PublicationListe;
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 com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
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.KeyListener;
import com.extjs.gxt.ui.client.event.Listener;
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.DateField;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
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.TextField;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
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;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;

public class PublicationForm extends Formulaire implements Rafraichissable {
        
        private Publication publication;
        private PublicationAPersonneListe publicationAPersonneListe = null;
        
        private FieldSet auteursFieldset = null;
        private ArrayList<ComboBox<Personne>> auteurComboboxListe = null;
        private PersonneListe listePersonneAuteur = null;
        private LayoutContainer conteneurChamps;
        private ListStore<Personne> auteursStorePartage = null;
        
        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 = "";
        
        protected boolean listePersonneAuteurInitialisee = false;
        protected boolean listeAuteurPublicationInitialisee = false;

        private boolean formValide = false;
        private boolean validationPublication = false;
        private boolean validationAuteurs = false;

        private Rafraichissable vueExterneARafraichirApresValidation = null;

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

        public PublicationForm(Mediateur mediateurCourrant, String publicationId, Rafraichissable vueARafraichirApresValidation) {
                initialiserPublicationForm(mediateurCourrant, publicationId);
                vueExterneARafraichirApresValidation = vueARafraichirApresValidation;
        }
        
        private void initialiserPublicationForm(Mediateur mediateurCourrant, String publicationId) {
                String modeDeCreation = Formulaire.MODE_AJOUTER;
                publication = new Publication();
                if (publicationId != null) {
                        modeDeCreation = Formulaire.MODE_MODIFIER;
                }
                initialiserFormulaire(mediateurCourrant, modeDeCreation, MenuApplicationId.PUBLICATION);
                
                panneauFormulaire.setLayout(new FlowLayout());
                String titre = (modeDeCreation.equals(Formulaire.MODE_AJOUTER) ? "Ajout d'une publication" : "Modification d'une publication");
                panneauFormulaire.setHeading(titre);

                creerZoneAuteurs();
                panneauFormulaire.add(auteursFieldset);
                
                creerZoneGeneralites();
                panneauFormulaire.add(generalitesFieldset);
                
                creerZoneEdition();
                panneauFormulaire.add(editionFieldset);
                                
                mediateurCourrant.selectionnerPublication(this, publicationId);
                mediateurCourrant.selectionnerAuteurAPublication(this, publicationId);
        }
        
        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);
                
                genererChampsAuteur(false);
        }
        
        private void genererChampsAuteur(boolean vider) {
                auteursFieldset.removeAll();
                
                conteneurChamps = new LayoutContainer(); 
                                
                Button ajoutAuteurBtn = new Button("Ajouter un auteur");
                ajoutAuteurBtn.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent be) {
                                creerTextFieldEtBouton(null);
                                
                                int nbAuteurs = 0;
                                for (Iterator<ComboBox<Personne>> it = auteurComboboxListe.iterator(); it.hasNext();) {
                                        if (auteurComboboxListe.size() > 1) {
                                                it.next().setFieldLabel("Auteur "+nbAuteurs);
                                                nbAuteurs++;
                                        }
                                }
                                
                                auteursFieldset.layout(true);
                        }
                });
                
                auteursFieldset.add(conteneurChamps);
                auteursFieldset.add(ajoutAuteurBtn);
                auteursFieldset.layout(true);
                
                if (!vider) {
                        creerTextFieldEtBouton(null);
                }
        }
        
        public void creerTextFieldEtBouton(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);
                
                LayoutContainer lc = new LayoutContainer();
                lc.setLayout(new FormLayout());
                lc.add(auteursSaisisComboBox, new FormData(300, 0));
                
                Button supp = new Button("-");
                supp.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent be) {
                                int nbAuteurs = 0;
                                if (auteurComboboxListe.size() != 1) {
                                        for (Iterator<ComboBox<Personne>> it = auteurComboboxListe.iterator(); it.hasNext();) {
                                                it.next().setFieldLabel("Auteur "+nbAuteurs);
                                                nbAuteurs++;
                                        }
                                }
                                auteurComboboxListe.remove(auteursSaisisComboBox);
                                conteneurChamps.remove(panneauHorizontal);
                                auteursFieldset.layout(true);
                        }
                        
                });
                panneauHorizontal.add(lc);
                panneauHorizontal.add(supp);
                conteneurChamps.add(panneauHorizontal);
                auteursFieldset.layout(true);
        }
        
        private ComboBox<Personne> creerComboBoxAuteursSaisis() {
                ComboBox<Personne> comboBox = new ComboBox<Personne>();
                comboBox.setEmptyText(i18nC.chercherAuteurSaisi());
                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'intérogation '?' 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 (etreValide()) {
                        reinitialiserValidation();
                        repandreRafraichissement();
                        controlerFermetureApresRafraichissement();
                }
        }

        private void rafraichirPublication(Publication publi) {
                publication = publi;
                
                genererChampsAuteur(true);
                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 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;
                
                if (listePersonneAuteurInitialisee) {
                        Iterator<String> itap = publicationAPersonneListe.keySet().iterator();
                        while (itap.hasNext()) {
                                creerTextFieldEtBouton(publicationAPersonneListe.get(itap.next()).getPersonne());
                        }
                        
                        int nbAuteurs = 0;
                        for (Iterator<ComboBox<Personne>> it = auteurComboboxListe.iterator(); it.hasNext();) {
                                if (auteurComboboxListe.size() > 1) {
                                        it.next().setFieldLabel("Auteur "+nbAuteurs);
                                        nbAuteurs++;
                                }
                        }
                        listeAuteurPublicationInitialisee = true;
                }
        }
        
        private void rafraichirInformation(Information info) {
                if (info.getType().equals("liste_personne")) {
                        listePersonneAuteurInitialisee = true;
                        listePersonneAuteur = (PersonneListe) info.getDonnee(0);
                        List<Personne> liste = listePersonneAuteur.toList();
                        auteursStorePartage.removeAll();
                        auteursStorePartage.add(liste);
                } else if (info.getType().equals("publication_valide")) {
                        validationPublication = true;
                        publication.setId((String) info.getDonnee(0));
                        
                        if (mode.equals(Formulaire.MODE_AJOUTER)) {
                                mediateur.ajouterAuteurPublication(this, idAuteurs, PublicationAPersonne.ROLE_AUTEUR, publication.getId());
                        } else if (mode.equals(Formulaire.MODE_MODIFIER)) {
                                mediateur.modifierAuteurPublication(this, idAuteurs, publication.getId());
                        }
                } else if (info.getType().equals("auteur_valide")) {
                        validationAuteurs = true;
                }
        }
        
        private Boolean etreValide() {
                Boolean valide = false;
                if (formValide && validationPublication && validationAuteurs) {
                        valide = true;
                }
                return valide;
        }
        
        private void reinitialiserValidation() {
                formValide = false;
                validationPublication = false;
                validationAuteurs = 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() {
                formValide = verifierFormulaire();
                if (formValide) {
                        Publication publicationCollectee = collecterPublication();
                        if (publicationCollectee != null) {
                                if (mode.equals(Formulaire.MODE_AJOUTER)) {
                                        mediateur.ajouterPublication(this, publicationCollectee);
                                } else if (mode.equals(Formulaire.MODE_MODIFIER)) {
                                        mediateur.modifierPublication(this, publicationCollectee);
                                }
                        }
                }
                return formValide;
        }
        
        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 Publication collecterPublication() {
                Publication publicationARetourner = null;
                Publication publicationCollectee = (Publication) publication.cloner(new Publication());
                
                String auteur = "";
                for (int i = 0; i < auteurComboboxListe.size(); i++) {
                        if (auteurComboboxListe.get(i).getValue() != null) {
                                idAuteurs += auteurComboboxListe.get(i).getValue().getId();
                                auteur += auteurComboboxListe.get(i).getValue().getNom()+ " "+auteurComboboxListe.get(i).getValue().getPrenom();
                                if (i != auteurComboboxListe.size() -1) {
                                        auteur += ", ";
                                        idAuteurs += ",";
                                }
                        }
                }
                publicationCollectee.setAuteur(auteur);
                
                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;
        }
        
}