Subversion Repositories eFlore/Applications.coel

Rev

Rev 749 | Rev 775 | 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.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 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.Events;
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.TextField;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
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 LayoutContainer implements Rafraichissable {

        private Mediateur mediateur = null;
        
        FormPanel panel = null;
        
        private String idStructureEdition = ""; 
        private String idPublication = "";
        private String idProjet = "";
        
        private PersonneListe listePersonneAuteur = null; 
        private PublicationAPersonneListe pubAPersonneListeAuteur = null;
        private ListStore<Personne> storeAuteurs = null;
        private ArrayList<ComboBox<Personne>> listeAuteurs = null;
        private String idAuteurs = "";
        
        private TextField<String> nomArticle = null;
        private TextField<String> intituleCollPub = null;
        private TextField<String> uriPub = null;
        
        private ComboBox<Structure> comboListeEditeurs = null;
        private ListStore<Structure> storeEditeurs = null;
        private TextField<String> datePub = null;
        private TextField<String> tomPub = null;
        private TextField<String> fasciculePub = null;
        private TextField<String> pagesPub = null;
        private String mode = "AJOUT";
        
        private boolean formValide = false;
        private boolean validationPublication = false;
        private boolean validationAuteurs = false;
        
        FieldSet fieldSetAuteurs = null;

        private Publication publi;

        protected boolean listeAuteurInitialisee = false;
        protected boolean listeAuteurPublicationInitialisee = false;

        private LayoutContainer conteneurChamps;

        private Button annulerBtn;

        private Button validerBtn;

        public PublicationForm() {

                setId("x-form-pub");
                setLayout(new FitLayout());
                mediateur = Registry.get(RegistreId.MEDIATEUR);
                
                storeAuteurs = new ListStore<Personne>();
                listePersonneAuteur = new PersonneListe();
                
                // Création de la disposition : FIELDSET
                FormLayout layoutFieldset = new FormLayout();
                layoutFieldset.setLabelWidth(200);
                //layoutFieldset.setPadding(4);

                //+-----------------------------------------------------------------------------------------------------------+
                // Création du panneau Formulaire
                panel = new FormPanel();
                panel.setFrame(true);
                panel.setIconStyle("icone-form-ajouter");  
                panel.setCollapsible(false);  
                panel.setHeading("Ajout d'une publication");  
                panel.setButtonAlign(HorizontalAlignment.CENTER);  
                panel.setLayout(new FlowLayout());
                
                add(panel);
                
                // Fieldset Auteur
                fieldSetAuteurs = new FieldSet();
                fieldSetAuteurs.setHeading("Auteur(s)");
                fieldSetAuteurs.setCollapsible(true);
                fieldSetAuteurs.setLayout(layoutFieldset);
                
                listeAuteurs = new ArrayList<ComboBox<Personne>>(0);
                
                panel.add(fieldSetAuteurs);
                
                genererChampsAuteur(false);
                
                // Création de la disposition : FIELDSET
                FormLayout layoutFieldset2 = new FormLayout();
                layoutFieldset.setLabelWidth(200);
                //layoutFieldset.setPadding(4);
                
                // Fieldset Infos Générales
                FieldSet fieldSetInfosGen = new FieldSet();
                fieldSetInfosGen.setHeading("Informations générales");
                fieldSetInfosGen.setCollapsible(true);
                fieldSetInfosGen.setLayout(layoutFieldset2);
                
                panel.add(fieldSetInfosGen);
                
                nomArticle = new TextField<String>();
                nomArticle.setName("cpu");
                nomArticle.setFieldLabel("Titre de l'article ou de l'ouvrage");
                
                intituleCollPub = new TextField<String>();
                intituleCollPub.setFieldLabel("Intitulé de la collection ou de la revue");
                
                uriPub = new TextField<String>();
                uriPub.setFieldLabel("URI de la publication");
                
                fieldSetInfosGen.add(nomArticle);
                fieldSetInfosGen.add(intituleCollPub);
                fieldSetInfosGen.add(uriPub);
                
                // Création de la disposition : FIELDSET
                FormLayout layoutFieldset3 = new FormLayout();
                //layoutFieldset.setPadding(4);
                
                // Fieldset Edition
                FieldSet fieldSetEdition = new FieldSet();
                fieldSetEdition.setHeading("Edition");
                fieldSetEdition.setCollapsible(true);
                fieldSetEdition.setLayout(layoutFieldset3);
                
                panel.add(fieldSetEdition);
                
                storeEditeurs = new ListStore<Structure>();
                comboListeEditeurs = new ComboBox<Structure>();  
                comboListeEditeurs.setEmptyText("Sélectionner un editeur...");
                comboListeEditeurs.setFieldLabel("Editeur de la publication");
                comboListeEditeurs.setDisplayField("nom");
                comboListeEditeurs.setStore(storeEditeurs);
                comboListeEditeurs.setEditable(true);
                comboListeEditeurs.setTypeAhead(true);  
                comboListeEditeurs.setTriggerAction(TriggerAction.QUERY);
                
                datePub = new TextField<String>();
                datePub.setMaxLength(4);
                datePub.setMinLength(4);
                datePub.setFieldLabel("Année de publication");
                
                tomPub = new TextField<String>();
                tomPub.setFieldLabel("Tome");
                
                fasciculePub = new TextField<String>();
                fasciculePub.setFieldLabel("Fascicule");
                
                pagesPub = new TextField<String>();
                pagesPub.setFieldLabel("Pages");
                
                fieldSetEdition.add(comboListeEditeurs, new FormData(500, 20));
                fieldSetEdition.add(datePub, new FormData(40, 20));
                fieldSetEdition.add(tomPub, new FormData(75, 20));
                fieldSetEdition.add(fasciculePub, new FormData(75, 20));
                fieldSetEdition.add(pagesPub, new FormData(100, 20));
                
                // Ajout des boutons au panneau formulaire
                annulerBtn = new Button("Annuler");
                annulerBtn.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent be) {
                                mediateur.clicMenu("Publications");
                        }
                });
                panel.addButton(annulerBtn);
                
                validerBtn = new Button("Valider");
                validerBtn.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent be) {
                                soumettreFormulaire();
                        }
                });
                
                panel.addButton(validerBtn);
                
                mediateur.clicObtenirListeEditeurs(this);
                mediateur.clicObtenirListeAuteurs(this);
        }
        
        public void rafraichir(Object nouvellesDonnees) {
                
                // Si on a reçu les details d'une publication
                if (nouvellesDonnees instanceof Publication) {
                        mode = "MODIF" ;
                        
                        
                        genererChampsAuteur(true);
                        publi = (Publication) nouvellesDonnees;
                        mediateur.selectionnerAuteurAPublication(this,publi.getId());
                        mediateur.clicObtenirListeAuteurs(this);
                        nomArticle.setValue(publi.getTitre());
                        intituleCollPub.setValue(publi.getCollection());
                        uriPub.setValue(publi.getURI());
                        datePub.setRawValue(reduireDateParAnnee(publi.getDateParution()));
                        tomPub.setValue(publi.getIndicationNvt());
                        fasciculePub.setValue(publi.getFascicule());
                        pagesPub.setValue(publi.getPages());
                        
                        idPublication = publi.getId();
                        idStructureEdition = publi.getEditeur();
                        idProjet = publi.getProjet() ;
                        
                        panel.setHeading("Modification d'une publication");
                }
                
                // Si on a reçu une liste des editeurs
                if(nouvellesDonnees instanceof StructureListe) {
                        storeEditeurs.removeAll();
                        StructureListe listeStructure = (StructureListe) nouvellesDonnees;
                        storeEditeurs.add((List<Structure>) listeStructure.toList());
                        
                        if (mode.equals("MODIF")) {     
                                comboListeEditeurs.setValue((Structure) listeStructure.get(idStructureEdition));
                        }
                        comboListeEditeurs.expand();
                }
                
                if(nouvellesDonnees instanceof PublicationAPersonneListe) {
                        pubAPersonneListeAuteur = (PublicationAPersonneListe)nouvellesDonnees;
                        
                        if(listeAuteurInitialisee) {
                                Iterator<String> itap = pubAPersonneListeAuteur.keySet().iterator();
                                for(;itap.hasNext();){
                                        creerTextFieldEtBouton(pubAPersonneListeAuteur.get(itap.next()).getIdAuteur());
                                }
                                
                                int nbAuteurs = 0;
                                for(Iterator<ComboBox<Personne>> it = listeAuteurs.iterator(); it.hasNext();) {
                                        if(listeAuteurs.size() > 1) {
                                                it.next().setFieldLabel("Auteur "+nbAuteurs);
                                                nbAuteurs++;
                                        }
                                }
                                listeAuteurPublicationInitialisee = true;
                        }
                }
                
                if (nouvellesDonnees instanceof Information) {
                        Information nouvellesInfos = (Information)nouvellesDonnees;
                        
                        if(nouvellesInfos.getType().equals("liste_personne")) {
                                listePersonneAuteur = (PersonneListe)nouvellesInfos.getDonnee(0);
                                storeAuteurs.removeAll();
                                for (Iterator<String> it = listePersonneAuteur.keySet().iterator(); it.hasNext();) {
                                        Personne p = listePersonneAuteur.get(it.next());
                                        storeAuteurs.add(p);
                                }
                                
                                listeAuteurInitialisee = true;
                        }
                        
                        if (nouvellesInfos.getType().equals("publication_valide")) {
                                validationPublication = true;
                                idPublication = ""+nouvellesInfos.getDonnee(0);
                                
                                if(mode.equals("AJOUT")) {
                                        mediateur.ajouterAuteurPublication(this,idAuteurs,"2360",idPublication);
                                }
                                
                                if(mode.equals("MODIF")) {
                                        mediateur.modifierAuteurPublication(this,idAuteurs,idPublication);
                                }
                        }
                                
                        if (nouvellesInfos.getType().equals("auteur_valide")) {
                                validationAuteurs = true;
                        }
                                
                        if(formValide && validationPublication && validationAuteurs) {
                                mediateur.rechargerListePublication();
                        }
                }
        }
        
        private void soumettreFormulaire() {
                String auteur = "";
                String idAuteur = "";
                for (int i = 0; i < listeAuteurs.size(); i++) {
                        if(listeAuteurs.get(i).getValue() != null) {
                                idAuteur += listeAuteurs.get(i).getValue().getId();
                                auteur += listeAuteurs.get(i).getValue().getNom()+ " "+listeAuteurs.get(i).getValue().getPrenom();
                                if (i != listeAuteurs.size() -1) {
                                        auteur += "|";
                                        idAuteur += ",";
                                }
                        }
                }
                
                String erreurs = "";
                
                if(idAuteur == null || idAuteur.equals("")) {
                        erreurs += "Veuillez entrer au moins un auteur ! ";
                } else {
                        idAuteurs = idAuteur;
                }
                
                String nomArt = nomArticle.getValue();
                if(nomArt == null || nomArt.equals("")) {
                        erreurs += "Veuillez entrer le nom de l'article ! ";
                }
                
                String collPub = intituleCollPub.getValue();
                
                String pub = nomArticle.getValue()+" "+intituleCollPub.getValue();
                
                String uri = uriPub.getValue();
                
                String editeur = "";
                
                if(comboListeEditeurs.getValue() == null) {
                        //erreurs += "Veuillez sélectionner un éditeur ! ";
                } else {
                        editeur = comboListeEditeurs.getValue().getId();
                        if(editeur == null || editeur.equals("")) {
                                erreurs += "Veuillez sélectionner un éditeur ! ";
                        }
                }
                
                String datePar = datePub.getRawValue();
                if(datePar == null || datePar.equals("")) {
                        erreurs += "Veuillez entrer une date ! ";
                } else {
                        String resDate = analyserDate(datePar);
                        if(resDate.equals("")) {
                                datePar = datePar+"-00-00";
                        } else {
                                erreurs += resDate;
                        }
                }
                String tome = tomPub.getValue();

                String fascicule = fasciculePub.getValue();
                
                String pages = pagesPub.getValue();
                
                if(erreurs.length() > 0) {
                        MessageBox.alert("Erreur dans la saisie des champs", erreurs, null);
                        return;
                }
                
                formValide = true;
                this.setEnabled(false);
                mediateur.afficherPopinChargement();
                
                if (mode.equals("AJOUT")) {
                        Publication publi = new Publication(pub,uri,auteur, collPub,nomArt,editeur,datePar,tome,fascicule,pages);
                        mediateur.ajouterPublication(this, publi);
                } else if (mode.equals("MODIF")) {
                        Publication publi = new Publication(idPublication,idProjet,pub,uri,auteur, collPub,nomArt,editeur,datePar,tome,fascicule,pages);
                        mediateur.modifierPublication(this, publi);
                }
        }
        
        private String analyserDate(String datePar) {
                
                if(datePar.matches("^[0-2][0-9]{3}$")) {
                        return "";
                } else {
                        return "Format de date incorrect ";
                }
        }
        
        private String reduireDateParAnnee(String datePar) {
                if(datePar.matches("^[0-2][0-9]{3}(-[0-9]{2}){2}$")) {
                        return datePar.split("-")[0];
                } else {
                        return "";
                }
        }

        private void genererChampsAuteur(boolean vider) {
                
                fieldSetAuteurs.removeAll();
                
                conteneurChamps = new LayoutContainer(); 
                                
                Button ajoutAuteurBtn = new Button("Ajouter un auteur");
                ajoutAuteurBtn.addSelectionListener(new SelectionListener<ButtonEvent>() {

                        @Override
                        public void componentSelected(ButtonEvent be) {
                                creerTextFieldEtBouton("");
                                int nbAuteurs = 0;
                                for(Iterator<ComboBox<Personne>> it = listeAuteurs.iterator(); it.hasNext();) {
                                        if(listeAuteurs.size() > 1) {
                                                it.next().setFieldLabel("Auteur "+nbAuteurs);
                                                nbAuteurs++;
                                        }
                                }
                                fieldSetAuteurs.layout(true);
                        }
                        
                });
                
                fieldSetAuteurs.add(conteneurChamps);
                fieldSetAuteurs.add(ajoutAuteurBtn);
                fieldSetAuteurs.layout(true);
                
                if(!vider) {
                        creerTextFieldEtBouton("");
                }
                

        }
        
        public HorizontalPanel creerTextFieldEtBouton(String valeurDefaut) {
                final HorizontalPanel p = new HorizontalPanel();
                
                // Création de la disposition : FIELDSET
                FormLayout layoutPanelTF = new FormLayout();
                p.setLayout(layoutPanelTF);
                
                final ComboBox<Personne> tf = new ComboBox<Personne>();
                tf.setDisplayField("fmt_nom_complet");
                tf.setStore(storeAuteurs);
                tf.setEmptyText("Selectionnez un auteur...");
                String label = "Auteur ";
                tf.setFieldLabel(label);
                if(valeurDefaut != null && !valeurDefaut.equals("") ) {
                        Personne auteur = listePersonneAuteur.get(valeurDefaut);
                        tf.setValue(auteur);
                }
                listeAuteurs.add(tf);
                
                tf.setSize(200, 20);
                LayoutContainer lc = new LayoutContainer();
                lc.setLayout(new FormLayout());
                lc.add(tf);
                
                Button supp = new Button("-");
                supp.addSelectionListener(new SelectionListener<ButtonEvent>() {
                        @Override
                        public void componentSelected(ButtonEvent be) {
                                int nbAuteurs = 0;
                                if(listeAuteurs.size() != 1) {
                                        for(Iterator<ComboBox<Personne>> it = listeAuteurs.iterator(); it.hasNext();) {
                                                        it.next().setFieldLabel("Auteur "+nbAuteurs);
                                                        nbAuteurs++;
                                        }
                                }
                                listeAuteurs.remove(tf);
                                conteneurChamps.remove(p);
                                fieldSetAuteurs.layout(true);
                        }
                        
                });
                p.add(lc);
                p.add(supp);
                conteneurChamps.add(p);
                fieldSetAuteurs.layout(true);
                
                return p;
        }
        
        public void obtenirListeAuteurs() {
                mediateur.clicObtenirListeAuteurs(this);
        }
        
}