Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.vues.personne;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.tela_botanica.client.ComposantId;
import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.RegistreId;
import org.tela_botanica.client.configuration.Configuration;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Valeur;
import org.tela_botanica.client.modeles.ValeurListe;
import org.tela_botanica.client.modeles.personne.Personne;
import org.tela_botanica.client.modeles.publication.Publication;
import org.tela_botanica.client.modeles.publication.PublicationAPersonne;
import org.tela_botanica.client.modeles.publication.PublicationAPersonneListe;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.vues.DetailVue;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.Scroll;
import com.extjs.gxt.ui.client.util.Format;
import com.extjs.gxt.ui.client.util.Params;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Html;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.TabPanel;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.LabelField;
import com.extjs.gxt.ui.client.widget.layout.AnchorLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
import com.google.gwt.user.client.ui.Image;

public class PersonneDetailVue extends DetailVue implements Rafraichissable {

        private TabPanel tabPanel;
        private Html entete;
        
        private TabItem tabIdentite;
        private TabItem tabAdresse;
        private TabItem tabInfosNat;
        private TabItem tabLogos;
        private TabItem tabPublications;
        
        private HashMap hmLabelFieldRegion = new HashMap();
        
        private Configuration config = (Configuration) Registry.get(RegistreId.CONFIG);
        private boolean ontologieRecue = false;
        private Personne personneAAfficher = null;

        private boolean personneAffichee = false;
        private String tableauPublicationsLieesTpl = "";
        private String lignePublicationLieeTpl = "";
        
        private void chargerOntologie() {
                mediateur.obtenirListeValeurEtRafraichir(this, "pays");
                mediateur.obtenirListeValeurEtRafraichir(this, "tel");
                mediateur.obtenirListeValeurEtRafraichir(this, "relationPersonnePublication");
        }
        
        
        public PersonneDetailVue(Mediateur mediateur) {
                super(mediateur);
                chargerOntologie();

                setLayout(new FitLayout());

                entete = new Html();
                entete.setId(ComposantId.ZONE_DETAIL_ENTETE);

                ContentPanel panneauPrincipal = new ContentPanel();
                panneauPrincipal.setLayout(new FitLayout());
                panneauPrincipal.setHeaderVisible(false);
                panneauPrincipal.setBodyBorder(true);
                panneauPrincipal.setTopComponent(entete);

                tabIdentite = new TabItem(i18nC.personneIdentite());
                tabIdentite.setLayout(new AnchorLayout());
                tabIdentite.setScrollMode(Scroll.AUTO);

                tabAdresse = new TabItem(i18nC.personneAdresses());
                tabAdresse.setLayout(new FitLayout());
                tabAdresse.setScrollMode(Scroll.AUTO);

                tabInfosNat = new TabItem(i18nC.personneInfoNat());
                tabInfosNat.setScrollMode(Scroll.AUTO);

                //Greg : ajout d'un résumé des publications
                tabPublications = new TabItem(i18nC.tabPublications());
                tabPublications.setScrollMode(Scroll.AUTO);
                tabPublications.setLayout(new FlowLayout());
                
                tabLogos = new TabItem(i18nC.personneLogos());
                tabLogos.setScrollMode(Scroll.AUTO);
                tabLogos.setLayout(new FlowLayout());

                tabPanel = new TabPanel();
                tabPanel.setId(ComposantId.ZONE_DETAIL_CORPS);
                tabPanel.setBodyBorder(false);

                tabPanel.add(tabIdentite);
                tabPanel.add(tabAdresse);
                tabPanel.add(tabInfosNat);
                tabPanel.add(tabPublications);
                tabPanel.add(tabLogos);

                panneauPrincipal.add(tabPanel);
                add(panneauPrincipal);
        }

        public void afficherDetailPersonne(Personne personne) {
                if (personne != null) {
                        String tplEntete = initialiserTplEntete();
                        
                        //Sélection des publication à personne
                        mediateur.selectionnerPublicationAPersonne(this, null, personne.getId(), new LinkedList());

                        Params enteteParams = new Params();
                        enteteParams.set("nom", (String) personne.get("fmt_nom_complet"));
                        enteteParams.set("mail", (String) personne.getCourrielPrinc());

                        LinkedList lstLogos = (LinkedList) personne
                                        .getChaineDenormaliseAsMapOrList("truk_logo");
                        if (lstLogos != null && lstLogos.size() > 0) {

                                tabLogos.removeAll();
                                String urlLogoPrinc = (String) lstLogos.get(0);
                                if (!urlLogoPrinc.trim().equals("")) {
                                        tplEntete = "<div id='personne-logo-div'><img src='{image}' alt='logo' /></div>"
                                                        + tplEntete;
                                        enteteParams.set("image", urlLogoPrinc);
                                }

                                Iterator<String> itLogo = lstLogos.iterator();
                                while (itLogo.hasNext()) {
                                        String urlLogoCourant = itLogo.next();
                                        Image imgCourante = new Image(urlLogoCourant);
                                        tabLogos.add(imgCourante);
                                }
                                tabLogos.enable();

                        } else {
                                enteteParams.set("image", "");
                                tabLogos.disable();
                        }

                        entete.el().setInnerHtml(Format.substitute(tplEntete, enteteParams));

                        String tplIdentite = initialiserTplIdentite();

                        Params tabIdentiteParams = new Params();
                        tabIdentiteParams.set("nom_complet", personne.getString("fmt_nom_complet"));
                        tabIdentiteParams.set("abreviation", personne.getString("abreviation"));
                        tabIdentiteParams.set("naissance_date", personne.getAnneeOuDateNaiss().equals("") ? mediateur.i18nC.inconnue() : personne.getAnneeOuDateNaiss());
                        tabIdentiteParams.set("naissance_lieu", personne.getString("naissance_lieu"));
                        String tplDeces = "";
                        if (personne.estDecedee())      {
                                tplDeces = " <h2>Décès:</h2>"
                                                + " <span><b>"
                                                + i18nC.personneDateDeces()
                                                + ":</b></span> {deces_date}<br />"
                                                + "      <span><b>"
                                                + i18nC.personneLieuDeces()
                                                + ":</b></span> {deces_lieu}<br /><br />";
                                
                                tabIdentiteParams.set("deces_date", personne.getAnneeOuDateDeces().equals("") ? mediateur.i18nC.inconnue() : personne.getAnneeOuDateDeces());
                                tabIdentiteParams.set("deces_lieu", personne.getString("deces_lieu"));
                        }
                        
                        Params paramsDeces = new Params();
                        paramsDeces.set("tplDeces", tplDeces);
                        tplIdentite = Format.substitute(tplIdentite, paramsDeces);
                        
                        tabIdentiteParams.set("description", personne.getString("description"));

                        tabInfosNat.removeAll();

                        tabIdentiteParams.set("nom_autre", construireTxtTruck(personne.getString("truk_nom_autre")));
                        tabIdentiteParams.set("abreviation_autre", construireTxtTruck(personne.getString("truk_abreviation_autre")));

                        tplIdentite += construireTxtListeOntologie(personne.getString("truk_telephone"));

                        // Courriel :Champ truk de la forme
                        // "Adresse@adr.com;; adr2@adr.fr ..."
                        LinkedList<String> listeCourriel = (LinkedList<String>) personne
                                        .getChaineDenormaliseAsMapOrList("truk_courriel");
                        if ((listeCourriel != null) && (listeCourriel.size() > 0)) {
                                String strLabelCourriel = "Courriel";
                                if (listeCourriel.size() > 1) {
                                        strLabelCourriel += "s";
                                }

                                String valeurCourriel = "";
                                Iterator<String> itCourriel = listeCourriel.iterator();
                                while (itCourriel.hasNext()) {
                                        String valeurCourante = itCourriel.next();
                                        valeurCourriel += "<br /><a href=\"mailto:"
                                                        + valeurCourante + "\">" + valeurCourante + "</a>";
                                }
                                tplIdentite += valeurCourriel;
                        }

                        // Url Site Webs
                        LinkedList listeUrl = (LinkedList) personne
                                        .getChaineDenormaliseAsMapOrList("truk_url");
                        if (listeUrl != null && listeUrl.size() > 0) {

                                tplIdentite += "<br /><br /><b>Sites web:</b><br /><span style='display:inline-block'>";
                                String strUrl = "";
                                Iterator<String> urlIt = listeUrl.iterator();
                                while (urlIt.hasNext()) {
                                        String urlCourante = urlIt.next();
                                        strUrl += "<a href=\"" + urlCourante + "\">" + urlCourante
                                                        + "</a> <br/>";
                                }
                                tplIdentite += strUrl + "</span><br />";
                        }

                        tplIdentite += "</div>";

                        afficherOnglet(tplIdentite, tabIdentiteParams, tabIdentite);

                        String tabAdresseTpl = "<div class='{css_corps}'>"
                                        + "     <div class='{css_fieldset}'>"
                                        + "             <h2>Adresse personnelle:</h2>"
                                        + "             <b>Adresse:</b> {adresse01} <br />" 
                                        + "             <b>Complément d'adresse: </b>{adresse02} <br />"
                                        + "             <b>Boite postale: </b>{boitePostale}<br />"
                                        + "             <b>Code postal:</b>{codePostal} <br />" 
                                        + "             <b>Région:</b>{region}<br />"
                                        + "             <b>Pays :</b><span style='uppercase'>{pays}</span><br />"
                                        + "</div>";
                        // Adresses :
                        Params paramAdresseTpl = new Params();
                        paramAdresseTpl.set("adresse01", (String) personne
                                        .obtenirValeurChamp("adresse_01"));
                        paramAdresseTpl.set("adresse02", (String) personne
                                        .obtenirValeurChamp("adresse_02"));
                        paramAdresseTpl.set("boitePostale", (String) personne
                                        .obtenirValeurChamp("bp"));
                        paramAdresseTpl.set("codePostal", (String) personne
                                        .obtenirValeurChamp("code_postal"));
                        paramAdresseTpl.set("ville", (String) personne
                                        .obtenirValeurChamp("ville"));
                        paramAdresseTpl.set("region", (String) personne
                                        .obtenirValeurChamp("ce_truk_region"));
                        paramAdresseTpl.set("pays", construireTxtListeOntologie((String) personne
                                        .obtenirValeurChamp("ce_truk_pays")));

                        afficherOnglet(tabAdresseTpl, paramAdresseTpl, tabAdresse);
                        tabAdresse.setStyleAttribute("padding", "15px");

                        // Infos naturalistes :Biographie, Spécialité (typé)
                        String tplInfosNat = "<div class='{css_corps}'>"
                                        + "     <div class='{css_fieldset}'>" + "               <h2>"
                                        + i18nC.personneBiographie() + "</h2>"
                                        + "                     {biographie}" + "               "
                                        + "<h2>" + i18nC.personneSpecialite() + "</h2>"
                                        + "                     {specialites}" + "      <h2>"
                                        + i18nC.personneRecolte() + "</h2>"
                                        + "             {recoltes}" + "  </div>" + "</div>";
                        Params prmInfosNat = new Params();

                        prmInfosNat.set("biographie", personne.get("biographie"));
                        
                        String specialite = construireTxtTruck(personne.getSpecialite());
                        prmInfosNat.set("specialites", specialite);

                        String recolte = construireTxtListeOntologie(personne.getString("truk_recolte"));
                        prmInfosNat.set("recoltes", recolte);

                        afficherOnglet(tplInfosNat, prmInfosNat, tabInfosNat);
                        tabAdresse.setStyleAttribute("padding", "15px");

                        changerLabelRegions();
                        layout();
                }
        }

        public String initialiserTplEntete() {
                return "<div id='{css_id}'>" + "<h1>{nom}</h1>"
                                + "<h2><a href='{mail}'>{mail}</a></h2>" + "</div>";
        }

        public String initialiserTplIdentite() {
                return "<div class='{css_corps}'>" + "  <div class='{css_fieldset}'>"
                                + "      <h2>Noms:</h2>" + "     <span><b>"
                                + i18nC.personneNomComplet()
                                + ":</b></span> {nom_complet}<br />"
                                + "      <span><b>"
                                + i18nC.personneNomAutre()
                                + ":</b></span> {nom_autre}<br />"
                                + "      <span><b>"
                                + i18nC.personneAbreviation()
                                + ":</b></span> {abreviation}<br />"
                                + "      <span><b>"
                                + i18nC.personneAbreviationAutre()
                                + ":</b></b></span> {abreviation_autre}<br /><br />"
                                + "      <h2>Naissance:</h2>"
                                + "      <span><b>"
                                + i18nC.personneDateNaissance()
                                + ":</b></span> {naissance_date}<br />"
                                + "      <span><b>"
                                + i18nC.personneLieuNaissance()
                                + ":</b></span> {naissance_lieu}<br /><br />"
                                + "{tplDeces}"
                                + "     </div>"
                                + "</div>"
                                + "<div class='{css_corps}'>"
                                + "     <div class='css_fieldset'> "
                                + "     <h2>Description:</h2>"
                                + "             {description}<br />" + "        </div>" + "<br />";
        }

        private void changerLabelRegions() {
                Collection<String> colClesComposants = hmLabelFieldRegion.keySet();
                Iterator<String> itComposants = colClesComposants.iterator();

                while (itComposants.hasNext()) {
                        String region = itComposants.next();
                        mediateur.obtenirValeurEtRafraichir(this, "region", region);
                }
        }

        private void ajouterLabelField(FieldSet fs, String tfLabel, Object tfValue) {
                if ((tfValue != null) && (!tfValue.toString().trim().equals(""))) {

                        LabelField tf = new LabelField();

                        tf.setFieldLabel(tfLabel + ":");
                        if ((tfLabel == null) || ("".equals(tfLabel))) {
                                tf.setHideLabel(true);
                                tf.setStyleAttribute("margin", "0 0 0 105px");
                        }
                        tf.setValue(tfValue);

                        // Ajout au fieldSet
                        fs.add(tf);
                }
        }
        
        
        private void initialiserTableauPublicationsLieesTpl() {
                
                tableauPublicationsLieesTpl =
                        "<div class='{css_corps}'>" +
                        "       <h2>{i18n_titre_publication}</h2>"+
                        "       <table>"+
                        "       <thead>"+
                        "               <tr>" +
                        "                       <th>{i18n_relation}</th>" +
                        "                       <th>{i18n_auteur}</th>" +
                        "                       <th>{i18n_titre}</th>" +
                        "                       <th>{i18n_revue}</th>" +
                        "                       <th>{i18n_editeur}</th>" +
                        "                       <th>{i18n_annee}</th>" +
                        "                       <th>{i18n_nvt}</th>" +
                        "                       <th>{i18n_fascicule}</th>" +
                        "                       <th>{i18n_page}</th>" +
                        "               </tr>"+
                        "       </thead>"+
                        "       <tbody>"+
                        "               {lignes}"+
                        "       </tbody>"+
                        "</table>";
        }
        
        private void initialiserLignePublicationLieeTpl() {
                lignePublicationLieeTpl =
                        "<tr>"+
                        "       <td>{relation}</td>"+
                        "       <td>{auteur}</td>"+
                        "       <td>{titre}</td>"+
                        "       <td>{revue}</td>"+
                        "       <td>{editeur}</td>"+
                        "       <td>{annee}</td>"+
                        "       <td>{nvt}</td>"+
                        "       <td>{fascicule}</td>"+
                        "       <td>{page}</td>"+
                        "</tr>";
        }
        /**
         * @author greg
         * Rempli l'onglet des publications liées
         * @param listePublications la liste des publications
         */
        private void afficherPublications(PublicationAPersonneListe listePublications)  {
                List<PublicationAPersonne> publicationsLiees = listePublications.toList();
                Iterator<PublicationAPersonne> iterateur = publicationsLiees.iterator();
                
                //Onglet Publications
                initialiserTableauPublicationsLieesTpl();
                Params paramsPublis = new Params();
                
                String contenuLignes = "";
                while (iterateur.hasNext())     {
                        initialiserLignePublicationLieeTpl();
                        
                        PublicationAPersonne publicationAPersonneCourante = iterateur.next();
                        Publication publication = publicationAPersonneCourante.getPublicationLiee();
                        
                        Params ligneParams = new Params();
                        ligneParams.set("relation", construireTxtListeOntologie(publicationAPersonneCourante.getRole()));
                        ligneParams.set("auteur", publication.getAuteur());
                        ligneParams.set("titre", publication.getTitre());
                        ligneParams.set("revue", publication.getCollection());
                        ligneParams.set("editeur", publication.getEditeur());
                        ligneParams.set("annee", publication.getAnneeParution());
                        ligneParams.set("nvt", publication.getIndicationNvt());
                        ligneParams.set("fascicule", publication.getFascicule());
                        ligneParams.set("page", publication.getPages());
                        contenuLignes += Format.substitute(lignePublicationLieeTpl, ligneParams);
                }
                
                paramsPublis.set("lignes", contenuLignes);
                paramsPublis.set("i18n_titre_publication", i18nC.tabPublications());
                paramsPublis.set("i18n_relation", i18nC.publicationAuteurs());
                paramsPublis.set("i18n_auteur", i18nC.publicationAuteurs());
                paramsPublis.set("i18n_titre", i18nC.publicationTitre());
                paramsPublis.set("i18n_revue", i18nC.publicationRevueCollection());
                paramsPublis.set("i18n_editeur", i18nC.publicationEditeur());
                paramsPublis.set("i18n_annee", i18nC.publicationDateParution());
                paramsPublis.set("i18n_nvt", i18nC.publicationNvt());
                paramsPublis.set("i18n_fascicule", i18nC.publicationFascicule());
                paramsPublis.set("i18n_page", i18nC.publicationPage());
                afficherOnglet(tableauPublicationsLieesTpl, paramsPublis, tabPublications);
                
        }
        
        public void rafraichir(Object nouvellesDonnees) {
                
                // FIXME : Ci-dessous, on utilise le booléen personneAffichee pour éviter un affichage répété de personnes.
                // Se règlerait avec une gestion Synchrone/Asynchrone
                
                // Si on a reçu une personne on en affiche les détails
                if (nouvellesDonnees instanceof Personne) {
                        personneAAfficher = (Personne) nouvellesDonnees;
                        personneAffichee = false;
                } else if (nouvellesDonnees instanceof ValeurListe) {
                        ValeurListe ontologieReceptionnee = (ValeurListe) nouvellesDonnees;
                        ajouterListeValeursAOntologie(ontologieReceptionnee);
                        ontologieRecue = true;
                        
                        // Remplacer ci-dessous par Ontologie
                        ValeurListe listeValeur = (ValeurListe) nouvellesDonnees;
                        if (listeValeur.getId().equals(config.getListeId("region"))) {
                        
                                Collection colCleListeValeur = listeValeur.keySet();
                                Iterator<String> itLv = colCleListeValeur.iterator();
                                while (itLv.hasNext()) {
                                        String idRegion = itLv.next();
                                        Valeur region = listeValeur.get(idRegion);

                                        if (region != null) {

                                                String strRegionId = region.getAbreviation();

                                                LinkedList<LabelField> listComposantsRegion = (LinkedList) hmLabelFieldRegion.get(strRegionId);
                                                for (int i = 0; i < listComposantsRegion.size(); i++) {
                                                        LabelField lfRegion = listComposantsRegion.get(i);
                                                        lfRegion.setFieldLabel(region.getNom());
                                                }

                                        }
                                }
                        }
                } else if (nouvellesDonnees instanceof PublicationAPersonneListe)       {
                        afficherPublications((PublicationAPersonneListe) nouvellesDonnees);
                }
                
                if (ontologieRecue && personneAAfficher != null && personneAffichee == false)   {
                        
                        Debug.log(">>> personneAAfficher = "+personneAAfficher.toString());
                        
                        afficherDetailPersonne(personneAAfficher);
                        personneAffichee = true;
                }
        }

}