Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client;

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

import org.tela_botanica.client.composants.AideFenetre;
import org.tela_botanica.client.composants.IdentificationFenetre;
import org.tela_botanica.client.composants.LicenceFenetre;
import org.tela_botanica.client.composants.ParametreFenetre;
import org.tela_botanica.client.configuration.APropos;
import org.tela_botanica.client.configuration.Configuration;
import org.tela_botanica.client.i18n.Constantes;
import org.tela_botanica.client.i18n.ErrorMessages;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Collection;
import org.tela_botanica.client.modeles.CollectionAPersonne;
import org.tela_botanica.client.modeles.CollectionAPublication;
import org.tela_botanica.client.modeles.CollectionAPublicationListe;
import org.tela_botanica.client.modeles.CollectionListe;
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.Projet;
import org.tela_botanica.client.modeles.ProjetListe;
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.StructureAPersonne;
import org.tela_botanica.client.modeles.CollectionAPersonneListe;
import org.tela_botanica.client.modeles.StructureAPersonneListe;
import org.tela_botanica.client.modeles.StructureConservation;
import org.tela_botanica.client.modeles.StructureListe;
import org.tela_botanica.client.modeles.StructureValorisation;
import org.tela_botanica.client.modeles.Utilisateur;
import org.tela_botanica.client.modeles.ValeurListe;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.vues.CollectionForm;
import org.tela_botanica.client.vues.CollectionListeVue;
import org.tela_botanica.client.vues.CollectionVue;
import org.tela_botanica.client.vues.ContenuVue;
import org.tela_botanica.client.vues.EnteteVue;
import org.tela_botanica.client.vues.Formulaire;
import org.tela_botanica.client.vues.PersonneForm;
import org.tela_botanica.client.vues.ProjetForm;
import org.tela_botanica.client.vues.ProjetVue;
import org.tela_botanica.client.vues.PublicationForm;
import org.tela_botanica.client.vues.StructureForm;
import org.tela_botanica.client.vues.PersonneVue;
import org.tela_botanica.client.vues.PopupChargement;
import org.tela_botanica.client.vues.PublicationVue;
import org.tela_botanica.client.vues.StatutVue;
import org.tela_botanica.client.vues.StructureVue;
import org.tela_botanica.client.vues.MenuVue;
import org.tela_botanica.client.vues.accueil.AccueilVue;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Viewport;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.Dictionary;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.RootPanel;

public class Mediateur implements Rafraichissable {
        
        private Viewport viewport;
        private Modele modele = null;
        public static final Constantes i18nC = getI18nConstante();
        public static final ErrorMessages i18nM = getI18nMessage();
        
        private EnteteVue panneauNord = null;
        private MenuVue panneauOuest = null;
        private ContenuVue panneauCentre = null;
        private StatutVue panneauSud = null;
        
        private IdentificationFenetre fenetreIdentification = null;
        
        public Mediateur() {
                // Enregistrement du Médiateur dans le Registre
                Registry.register(RegistreId.MEDIATEUR, this);

                //Initialisation du Registre
                initialiserRegistre();
                
                // Création du Modèle qui s'enregistre lui même dans le Registre
                modele = new Modele();

                // Création du Viewport qui contient la disposition globale de l'application
                viewport = new Viewport();
                viewport.setLayout(new BorderLayout());

                // Création des différents panneaux
            creerPanneauNord();
            creerPanneauOuest();
            creerPanneauCentral();
            creerPanneauSud();
                
                // Connection de l'utilisateur
                connecterUtilisateur(null, null);
                
                // Retour à GWT du Viewport une fois constuit
                RootPanel.get().add(viewport);
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION de l'I18N et du REGISTRE
        //+----------------------------------------------------------------------------------------------------------------+
        protected static Constantes getI18nConstante() {
                return GWT.create(Constantes.class);
        }
        
        protected static ErrorMessages getI18nMessage() {
                return GWT.create(ErrorMessages.class);
        }
        
        protected void initialiserRegistre() {
                Registry.register(RegistreId.APPLI_NOM, i18nC.appliNom());
                Registry.register(RegistreId.APPLI_CODE, i18nC.appliCode());
                Registry.register(RegistreId.APPLI_VERSION, i18nC.appliVersionNumero());
                
                APropos apropos = new APropos();
                Registry.register(RegistreId.APPLI_REVISION, apropos.getRevisionGlobale());
                Registry.register(RegistreId.APPLI_COMPILATION_JAVA_VERSION, apropos.getVersionJavaCompilation());
                Registry.register(RegistreId.APPLI_COMPILATION_DATE_HEURE, apropos.getDateHeureCompilation());

                Registry.register(RegistreId.CONFIG, new Configuration());
                Registry.register(RegistreId.POPUP_CHARGEMENT, new PopupChargement(this));
                Registry.register(RegistreId.UTILISATEUR_COURANT, new Utilisateur());
                Registry.register(RegistreId.PROJET_COURANT, new Projet());
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION des PANNEAUX PRINCIPAUX
        //+----------------------------------------------------------------------------------------------------------------+
        
        private void creerPanneauNord() {
                panneauNord = new EnteteVue(this);
                
                BorderLayoutData regionNord = new BorderLayoutData(LayoutRegion.NORTH, 100);  
                regionNord.setCollapsible(true);
                regionNord.setFloatable(true);
                regionNord.setSplit(false);
                regionNord.setMargins(new Margins(5, 5, 0, 5));
                
                viewport.add(panneauNord, regionNord);
        }
        
        private void creerPanneauOuest() {
                panneauOuest = new MenuVue(this); 
                
                BorderLayoutData regionOuest = new BorderLayoutData(LayoutRegion.WEST, 200);  
                regionOuest.setSplit(true);
                regionOuest.setCollapsible(true);  
                regionOuest.setMargins(new Margins(5));

                viewport.add(panneauOuest, regionOuest);
        }

        private void creerPanneauCentral() {
                panneauCentre = new ContenuVue(this);

                BorderLayoutData regionCentre = new BorderLayoutData(LayoutRegion.CENTER);  
                regionCentre.setMargins(new Margins(5, 5, 5, 0));

                viewport.add(panneauCentre, regionCentre);
        }
        
        private void creerPanneauSud() {
                panneauSud = new StatutVue();
                
                BorderLayoutData regionSud = new BorderLayoutData(LayoutRegion.SOUTH, 20); 
                regionSud.setCollapsible(true);
                regionSud.setFloatable(true);
                regionSud.setSplit(false);
                regionSud.setMargins(new Margins(0));
                
                viewport.add(panneauSud, regionSud);
        }

        public void actualiserPanneauCentral() {
                panneauCentre.layout();
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION du MENU
        //+----------------------------------------------------------------------------------------------------------------+
        
        public void clicMenu(String codeMenuClique) {
                activerChargement(codeMenuClique);
                panneauOuest.selectionMenu(codeMenuClique);
                if (codeMenuClique.equals(MenuApplicationId.ACCUEIL)) {
                        afficherAccueil();
                } else if (codeMenuClique.equals(MenuApplicationId.PROJET)) {
                        selectionnerProjet(panneauCentre, null); 
                } else if (codeMenuClique.equals(MenuApplicationId.STRUCTURE)) {
                        selectionnerStructure(panneauCentre, null);
                } else if (codeMenuClique.equals(MenuApplicationId.COLLECTION)) { 
                        selectionnerCollection(panneauCentre, null);
                } else if (codeMenuClique.equals(MenuApplicationId.PERSONNE)) { 
                        selectionnerPersonne(panneauCentre, null, null);
                } else if (codeMenuClique.equals(MenuApplicationId.PUBLICATION)) {
                        selectionnerPublication(panneauCentre, null);
                } else {
                        GWT.log(i18nM.nonImplemente(codeMenuClique), null);
                }
                panneauCentre.layout();
        }

        public void activerChargement(String message) {
                Debug.log(message);
                afficherPopinChargement(); 
                panneauSud.showBusy(i18nC.chargement()+" "+message);
        }
        
        public void desactiverChargement() {
                masquerPopinChargement();
                panneauSud.clear();
        }
                
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION DES FENÊTRES
        //+----------------------------------------------------------------------------------------------------------------+

        public void ouvrirAide() {
                AideFenetre aideFenetre = new AideFenetre();
                aideFenetre.show();
                // FIXME : apparament le fade In/Fade Out pose problème sur les navigateurs...
                //aideFenetre.el().fadeIn(FxConfig.NONE);
        }

        public void ouvrirParametres() {
                ParametreFenetre parametresFenetre = new ParametreFenetre();
                parametresFenetre.show();
        }

        public void ouvrirIdentification() {
                fenetreIdentification = new IdentificationFenetre();
                fenetreIdentification.show();
        }

        public void ouvrirApplis(String id) {
                if (id.equals(ComposantId.MENU_CEL)) {
                        Window.open(((Configuration) Registry.get(RegistreId.CONFIG)).getCelUrl(), "Carnet en ligne", "");
                } else if (id.equals(ComposantId.MENU_BEL)) {
                        Window.open(((Configuration) Registry.get(RegistreId.CONFIG)).getCelUrl(), "Biblio en ligne", "");
                }
        }

        public void afficherFenetreLicence(IdentificationFenetre vue)   {
                LicenceFenetre lf = new LicenceFenetre(vue);
        }
        
        public void accepterLicence(Rafraichissable vue)        {
                modele.accepterLicence(vue);            
        }
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION de l'UTILISATEUR et de l'IDENTIFICATION
        //+----------------------------------------------------------------------------------------------------------------+
        /**
         * Retourne l'identifiant de l'utilisateur courrant de l'application.
         */
        public String getUtilisateurId() {
                String id = null;
                Utilisateur utilisateurCourant = (Utilisateur) Registry.get(RegistreId.UTILISATEUR_COURANT);
                if (!utilisateurCourant.getId().equals("")) {
                        id = utilisateurCourant.getId();
                }
                return id;
        }
        
        public Utilisateur getUtilisateur() {
                Utilisateur utilisateurCourant = (Utilisateur) Registry.get(RegistreId.UTILISATEUR_COURANT);
                return utilisateurCourant;
        }
        
        public void connecterUtilisateur(String login, String mdp) {
                modele.connecterUtilisateur(this, login, mdp);
        }
        
        public void deconnecterUtilisateur() {
                modele.deconnecterUtilisateur(this);
        }
        
        public void mettreAJourEtatIdentification(Utilisateur utilisateur) {
                // Mise à jour du registre
                Registry.register(RegistreId.UTILISATEUR_COURANT, utilisateur);
                
                // Création de l'information de mise à jour de l'utilisateur
                Information info = new Information("maj_utilisateur");

                // Rafraichissement de la fenêtre d'Identification
                if (fenetreIdentification != null) {
                        fenetreIdentification.rafraichir(info);
                }
                
                // Rafraichissement du panneau Nord
                panneauNord.rafraichir(info);

                // Rafraichissement du panneau Centre
                if (panneauCentre != null) {
                        panneauCentre.rafraichir(info);
                }               
        }
        
        public void modifierUtilisateur()       {
                Utilisateur utilisateurCourant = (Utilisateur) Registry.get(RegistreId.UTILISATEUR_COURANT);
                panneauNord.rafraichir(utilisateurCourant);
                modele.modifierUtilisateur(this, utilisateurCourant);
        }
        
        public void mettreAJourPersonneAnnuaire(Utilisateur utilisateur)        {
                panneauNord.rafraichir(utilisateur);
                modele.mettreAJourPersonneAnnuaire(this, utilisateur);
        }

        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION DES VALEURS ET LISTES
        //+----------------------------------------------------------------------------------------------------------------+

        public void obtenirListeValeurEtRafraichir(Rafraichissable vueARafraichir, String listeId)      {
                modele.obtenirListeValeurs(vueARafraichir, ((Configuration) Registry.get(RegistreId.CONFIG)).getListeId(listeId));
        }
        
        public void obtenirValeurEtRafraichir(Rafraichissable vue, String listeId, String identifiantValeur)    {
                modele.obtenirValeur(vue, "abv", ((Configuration) Registry.get(RegistreId.CONFIG)).getListeId(listeId), identifiantValeur);
        }
        
        public void obtenirListeRegionsEtRafraichir(Rafraichissable vue, String strListeId, String strPays)     {
                modele.obtenirListeRegion(vue, ((Configuration) Registry.get(RegistreId.CONFIG)).getListeId(strListeId), strPays+".__");
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION des APPLETS de l'ACCUEIL
        //+----------------------------------------------------------------------------------------------------------------+
        
        public void afficherAccueil() {
                if (!(panneauCentre.getContenu() instanceof AccueilVue)) {
                        panneauCentre.removeAll();
                        panneauCentre.add(new AccueilVue(this));
                }
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION des PROJETS
        //+----------------------------------------------------------------------------------------------------------------+
        
        public void afficherFormProjet(String projetId) {
                panneauCentre.removeAll();
                ProjetForm projetForm = new ProjetForm(this, projetId);
                panneauCentre.add(projetForm);
                
                panneauCentre.layout();
        }
        
        public void afficherListeProjets(ProjetListe projetsACharger)   {
                if (!(panneauCentre.getContenu() instanceof ProjetVue)) {
                        panneauCentre.removeAll();
                        panneauCentre.add(new ProjetVue(this));
                        panneauCentre.setId(ComposantId.PANNEAU_PROJET_LISTE);
                        panneauCentre.layout();
                }       
                
                panneauCentre.getContenu().rafraichir(projetsACharger);
        }
        
        public void clicListeProjet(Projet projet) {
                panneauCentre.getContenu().rafraichir(projet);
        }

        public void clicSupprimerProjet(final List<Projet> projetListe) {
                if (projetListe.size() <= 0) {
                        MessageBox.alert("Attention", "Vous devez sélectionner un projet", null); 
                } else {
                        String message = "Voulez-vous vraiment supprimer ces projets ?";
                        if (projetListe.size() == 1) {
                                message = "Voulez-vous vraiment supprimer ce projet ?";
                        }
                        
                        final Listener<MessageBoxEvent> listenerSuppression = new Listener<MessageBoxEvent>() { 
                                public void handleEvent(MessageBoxEvent ce) {  
                                        Dialog dialog = (Dialog) ce.getComponent();
                                    Button btn = ce.getButtonClicked();  
                                           
                                    if (btn.getText().equals(dialog.yesText)) {
                                        modele.supprimerProjet(panneauCentre.getContenu(), projetListe);  
                                    }
                                }
                        };
                                     
                        MessageBox.confirm("Supprimer un projet", message, listenerSuppression);
                }
                
        }

        public void clicModifierProjet(List<Projet> projetsSelectionnes) {
                if (projetsSelectionnes.size() == 0) {
                        Info.display("Information", "Veuillez sélectionner un projet.");
                } else if (projetsSelectionnes.size() > 1) {
                        Info.display("Information", "Veuillez sélectionner un seul projet à la fois.");
                } else if (projetsSelectionnes.size() == 1) {
                        afficherFormProjet(projetsSelectionnes.get(0).getId());
                } else {
                        Info.display("Erreur", "Une erreur est survenue dans la méthode clicModifierProjet() du Médiateur.");
                }
        }

        public void clicAjouterProjet() {
                afficherFormProjet(null);
        }

        public void selectionnerProjet(Rafraichissable vueARafraichir, String projetId) {
                modele.selectionnerProjet(vueARafraichir, projetId);
        }

        public void ajouterProjet(Rafraichissable vueARafraichir, Projet projetCollecte) {
                modele.ajouterProjet(vueARafraichir, projetCollecte);
        }

        public void modifierProjet(Rafraichissable vueARafraichir, Projet projetCollecte) {
                modele.modifierProjet(vueARafraichir, projetCollecte);  
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        // SELECTION : projet
        /**
         * Retourne l'identifiant du projet courrant de l'application.
         */
        public String getProjetId() {
                String id = null;
                Projet projetCourant = (Projet) Registry.get(RegistreId.PROJET_COURANT);
                if (projetCourant != null && !projetCourant.getId().equals("")) {
                        id = projetCourant.getId();
                }
                return id;
        }
                
        public void selectionnerProjetCourant(Projet projetSelectionne) {
                Registry.register(RegistreId.PROJET_COURANT, projetSelectionne);
                if (panneauCentre.getContenu() instanceof ProjetVue)    {
                        selectionnerProjet(panneauCentre.getContenu(), null);
                } else if (panneauCentre.getContenu() instanceof StructureVue)  {
                        selectionnerStructure(panneauCentre.getContenu(), null);
                } else if (panneauCentre.getContenu() instanceof CollectionVue) {
                        selectionnerCollection(panneauCentre.getContenu(), null);
                } else if (panneauCentre.getContenu() instanceof PersonneVue) {
                        selectionnerPersonne(panneauCentre.getContenu(), null, getProjetId());
                } else if (panneauCentre.getContenu() instanceof PublicationVue) {
                        selectionnerPublication(panneauCentre.getContenu(), null);
                }
        }
        
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION DES STRUCTURES
        //+----------------------------------------------------------------------------------------------------------------+

        public void afficherListeStructures(StructureListe structuresACharger) {
                if (!(panneauCentre.getContenu() instanceof StructureVue))      {       
                        panneauCentre.removeAll();
                        panneauCentre.add(new StructureVue(this));
                }
                panneauCentre.getContenu().rafraichir(structuresACharger);
        }
        
        public void afficherFormStructure(String structureId) {
                String mode = Formulaire.MODE_AJOUTER;
                if (structureId != null) {
                        mode = Formulaire.MODE_MODIFIER;
                }
                
                panneauCentre.removeAll();
                StructureForm structureForm = new StructureForm(this, mode);
                panneauCentre.add(structureForm);
                
                if (mode.equals(Formulaire.MODE_MODIFIER)) {
                        selectionnerStructure(structureForm, structureId);
                        selectionnerStructureAPersonne(structureForm, structureId, StructureAPersonne.ROLE_EQUIPE);
                }
                
                panneauCentre.layout();
        }
        
        public void clicListeStructure(Structure structure) {
                panneauCentre.getContenu().rafraichir(structure);
                if (structure != null && structure.getPersonnel() == null) {
                        selectionnerStructureAPersonne(panneauCentre.getContenu(), structure.getId(), StructureAPersonne.ROLE_EQUIPE);
                }
        }

        public void clicAjouterStructure() {
                afficherFormStructure(null);
        }
        
        public void clicModifierStructure(List<Structure> structureSelection) {
                if (structureSelection.size() == 0) {
                        Info.display("Information", "Veuillez sélectionner une structure.");
                } else if (structureSelection.size() > 1) {
                        Info.display("Information", "Veuillez sélectionner une seule structure à la fois.");
                } else if (structureSelection.size() == 1) {
                        afficherFormStructure(structureSelection.get(0).getId());
                } else {
                        Info.display("Erreur", "Une erreur est survenue dans la méthode clicModifierStructure() du Médiateur.");
                }
        }
        
        public void clicSupprimerStructure(final Rafraichissable vue, final List<Structure> structureSelection) {
                if (structureSelection.size() == 0) {
                        Info.display("Information", "Veuillez sélectionner une structure.");
                } else if(structureSelection.size() > 0) {
                        String titre = "Supprimer des structures";
                        String message = "Êtes vous sur de vouloir supprimer les structures sélectionnées ?";
                        if (structureSelection.size() == 1) {
                                titre = "Supprimer une structure";
                                message = "Êtes vous sur de vouloir supprimer la structure sélectionnée ?";
                        }
                        
                        final Listener<MessageBoxEvent> suppressionEcouteur = new Listener<MessageBoxEvent>() { 
                                public void handleEvent(MessageBoxEvent ce) {  
                                        Dialog dialog = (Dialog) ce.getComponent();
                                        Button btn = ce.getButtonClicked();  

                                        if (btn.getText().equals(dialog.yesText))       {
                                                String idStr = "" ;
                                                for(int i = 0 ; i < structureSelection.size() ; i++) {
                                                        idStr += structureSelection.get(i).getId()+","; 
                                                }
                                                supprimerStructure(vue, idStr);
                                        }
                                }
                        };
                        
                        MessageBox.confirm(titre, message, suppressionEcouteur);
                } else {
                        Info.display("Erreur", "Une erreur est survenue dans la méthode clicSupprimerStructure() du Médiateur.");
                }
        }
        
        public void selectionnerStructure(Rafraichissable vueARafraichir, String structureId) {
                modele.selectionnerStructure(vueARafraichir, getProjetId(), structureId);
        }
        
        public void selectionnerStructureParProjet(Rafraichissable vueARafraichir, String projetId) {
                modele.selectionnerStructure(vueARafraichir, projetId, null);
        }
        
        public void ajouterStructure(Rafraichissable vueARafraichir, Structure structure, StructureConservation conservation, StructureValorisation valorisation) {
                modele.ajouterStructure(vueARafraichir, structure, conservation, valorisation);
        }
        
        public void modifierStructure(Rafraichissable vueARafraichir, String structureId, Structure structure, StructureConservation conservation, StructureValorisation valorisation) {
                modele.modifierStructure(vueARafraichir, structureId, structure, conservation, valorisation);
        }
        
        public void supprimerStructure(Rafraichissable vueARafraichir, String IdentifiantsStructureSepareParVirgule) {
                modele.supprimerStructure(vueARafraichir, IdentifiantsStructureSepareParVirgule);
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        // GESTION de la relation STRUCTURE A PERSONNE
        public void selectionnerStructureAPersonne(Rafraichissable vueARafraichir, String structureId, String roleId) {
                modele.selectionnerStructureAPersonne(vueARafraichir, structureId, roleId);
        }
        
        public void ajouterStructureAPersonne(Rafraichissable vueARafraichir, String structureId, StructureAPersonneListe personnelAjoute) {
                if (personnelAjoute != null && personnelAjoute.size() > 0) {
                        for (Iterator<String> it = personnelAjoute.keySet().iterator(); it.hasNext();) {
                                modele.ajouterStructureAPersonne(vueARafraichir, structureId, (StructureAPersonne) personnelAjoute.get(it.next()));
                        }
                }
        }
        
        public void modifierStructureAPersonne(Rafraichissable vueARafraichir, StructureAPersonneListe personnelModifie) {
                if (personnelModifie != null && personnelModifie.size() > 0) {
                        for (Iterator<String> it = personnelModifie.keySet().iterator(); it.hasNext();) {
                                modele.modifierStructureAPersonne(vueARafraichir, (StructureAPersonne) personnelModifie.get(it.next()));
                        }
                }
        }
        
        public void supprimerStructureAPersonne(Rafraichissable vueARafraichir, StructureAPersonneListe personnelSupprime) {
                if (personnelSupprime != null && personnelSupprime.size() > 0) {
                        String idStructureAPersonneSepareParVirgule = "" ;
                        Iterator<String> it = personnelSupprime.keySet().iterator();
                        while (it.hasNext()) {
                                idStructureAPersonneSepareParVirgule += personnelSupprime.get(it.next()).getId();
                                idStructureAPersonneSepareParVirgule += (it.hasNext()) ? "," : "";
                        }
                        supprimerStructureAPersonne(vueARafraichir, idStructureAPersonneSepareParVirgule);
                }
        }
        
        public void supprimerStructureAPersonne(Rafraichissable vueARafraichir, String idStructureAPersonneSeparesParVirgule) {
                modele.supprimerStructureAPersonne(vueARafraichir, idStructureAPersonneSeparesParVirgule);
        }
        
        public void supprimerStructureAPersonne(final Rafraichissable vueARafraichir, final List<Structure> structuresListe) {
                if (structuresListe.size() != 0) {
                        String idStructureSepareParVirgule = "" ;
                        Iterator<Structure> it = structuresListe.iterator();
                        while (it.hasNext()) {
                                Structure structure = it.next();
                                idStructureSepareParVirgule += structure.getId();
                                idStructureSepareParVirgule += it.hasNext() ? "," : "";
                        }
                        supprimerStructureAPersonne(vueARafraichir, idStructureSepareParVirgule);
                }
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION des COLLECTIONS
        //+----------------------------------------------------------------------------------------------------------------+
        
        public void afficherListeCollections(CollectionListe collectionsACharger) {
                if (!(panneauCentre.getContenu() instanceof CollectionVue)) {
                        panneauCentre.removeAll();
                        panneauCentre.add(new CollectionVue(this));
                }
                
                panneauCentre.getContenu().rafraichir(collectionsACharger);
        }
        
        public void afficherFormCollection(String collectionId) {
                panneauCentre.removeAll();
                CollectionForm collectionForm = new CollectionForm(this, collectionId);
                panneauCentre.add(collectionForm);
                
                panneauCentre.layout();
        }
        
        public void clicListeCollection(Collection collectionCliquee) {
                panneauCentre.getContenu().rafraichir(collectionCliquee);
                if (collectionCliquee != null) {
                        selectionnerCollectionAPersonne(panneauCentre.getContenu(), collectionCliquee.getId(), null);
                        selectionnerCollectionAPublication(panneauCentre.getContenu(), collectionCliquee.getId());
                } 
        }
        
        public void clicAjouterCollection() {
                afficherFormCollection(null);
        }

        public void clicModifierCollection(List<Collection> selection) {
                if (selection.size() == 0) {
                        Info.display("Information", "Veuillez sélectionner une collection.");
                } else if (selection.size() > 1) {
                        Info.display("Information", "Veuillez sélectionner une seule collection à la fois.");
                } else if (selection.size() == 1) {
                        afficherFormCollection(selection.get(0).getId());
                } else {
                        Info.display("Erreur", "Une erreur est survenue dans la méthode clicModifierCollection() du Médiateur.");
                }
        }

        public void clicSupprimerCollection(CollectionListeVue collectionListeVue, List<Collection> collectionsASupprimer) {
                // TODO Auto-generated method stub      
        }

        public void selectionnerCollection(Rafraichissable vueARafraichir, String collectionId) {
                modele.selectionnerCollection(vueARafraichir, getProjetId(), collectionId);
        }
        
        public void selectionnerCollectionParProjet(Rafraichissable vueARafraichir, String projetId) {
                modele.selectionnerCollection(vueARafraichir, projetId, null);
        }
        
        public void ajouterCollection(Rafraichissable vueARafraichir, Collection collection) {
                modele.ajouterCollection(vueARafraichir, getUtilisateurId(), collection);
        }
        
        public void modifierCollection(Rafraichissable vueARafraichir, Collection collection) {
                modele.modifierCollection(vueARafraichir, collection);
        }
        
        public void supprimerCollection(Rafraichissable vueARafraichir, String IdentifiantsCollectionSepareParVirgule) {
                modele.supprimerCollection(vueARafraichir, getUtilisateurId(), IdentifiantsCollectionSepareParVirgule);
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        // GESTION de la relation COLLECTION A PERSONNE
        
        public void selectionnerCollectionAPersonne(Rafraichissable vueARafraichir, String collectionId, String roleId) {
                modele.selectionnerCollectionAPersonne(vueARafraichir, collectionId, roleId);
        }
        
        public void ajouterCollectionAPersonne(Rafraichissable vueARafraichir, String collectionId, CollectionAPersonneListe personnesAjoutees) {
                if (personnesAjoutees != null && personnesAjoutees.size() > 0) {
                        for (Iterator<String> it = personnesAjoutees.keySet().iterator(); it.hasNext();) {
                                modele.ajouterCollectionAPersonne(vueARafraichir, collectionId, (CollectionAPersonne) personnesAjoutees.get(it.next()));
                        }
                }
        }
        
        public void modifierCollectionAPersonne(Rafraichissable vueARafraichir, CollectionAPersonneListe personnesModifiees) {
                if (personnesModifiees != null && personnesModifiees.size() > 0) {
                        for (Iterator<String> it = personnesModifiees.keySet().iterator(); it.hasNext();) {
                                modele.modifierCollectionAPersonne(vueARafraichir, (CollectionAPersonne) personnesModifiees.get(it.next()));
                        }
                }
        }
        
        public void supprimerCollectionAPersonne(Rafraichissable vueARafraichir, CollectionAPersonneListe personnesSupprimees) {
                if (personnesSupprimees != null && personnesSupprimees.size() > 0) {
                        String idCollectionAPersonneSeparesParVirgule = "" ;
                        for (Iterator<String> it = personnesSupprimees.keySet().iterator(); it.hasNext();) {
                                idCollectionAPersonneSeparesParVirgule += personnesSupprimees.get(it.next()).getId();
                                if (it.hasNext()) {
                                        idCollectionAPersonneSeparesParVirgule += ",";
                                }
                        }
                        modele.supprimerCollectionAPersonne(vueARafraichir, idCollectionAPersonneSeparesParVirgule);
                }
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        // GESTION de la relation COLLECTION A PUBLICATION
        
        public void selectionnerCollectionAPublication(Rafraichissable vueARafraichir, String collectionId) {
                modele.selectionnerCollectionAPublication(vueARafraichir, collectionId);
        }
        
        public void ajouterCollectionAPublication(Rafraichissable vueARafraichir, String collectionId, CollectionAPublicationListe publicationsAjoutees) {
                if (publicationsAjoutees != null && publicationsAjoutees.size() > 0) {
                        for (Iterator<String> it = publicationsAjoutees.keySet().iterator(); it.hasNext();) {
                                modele.ajouterCollectionAPublication(vueARafraichir, collectionId, (CollectionAPublication) publicationsAjoutees.get(it.next()));
                        }
                }
        }
        
        public void modifierCollectionAPublication(Rafraichissable vueARafraichir, CollectionAPublicationListe publicationsModifiees) {
                if (publicationsModifiees != null && publicationsModifiees.size() > 0) {
                        for (Iterator<String> it = publicationsModifiees.keySet().iterator(); it.hasNext();) {
                                modele.modifierCollectionAPublication(vueARafraichir, (CollectionAPublication) publicationsModifiees.get(it.next()));
                        }
                }
        }
        
        public void supprimerCollectionAPublication(Rafraichissable vueARafraichir, CollectionAPublicationListe publicationsSupprimees) {
                if (publicationsSupprimees != null && publicationsSupprimees.size() > 0) {
                        String idCollectionAPublicationSeparesParVirgule = "" ;
                        for (Iterator<String> it = publicationsSupprimees.keySet().iterator(); it.hasNext();) {
                                idCollectionAPublicationSeparesParVirgule += publicationsSupprimees.get(it.next()).getId();
                                if (it.hasNext()) {
                                        idCollectionAPublicationSeparesParVirgule += ",";
                                }
                        }
                        modele.supprimerCollectionAPublication(vueARafraichir, idCollectionAPublicationSeparesParVirgule);
                }
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        // GESTION de la relation COLLECTION A PUBLICATION
        
        //+----------------------------------------------------------------------------------------------------------------+
        // GESTION de la relation COLLECTION A COMMENTAIRE
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION DES PERSONNES
        //+----------------------------------------------------------------------------------------------------------------+

        public void afficherListePersonnes(PersonneListe personnesACharger)     {
                if (!(panneauCentre.getContenu() instanceof PersonneVue))       {
                        panneauCentre.removeAll();
                        panneauCentre.add(new PersonneVue(this));
                        panneauCentre.setId(ComposantId.PANNEAU_PERSONNE_LISTES);
                }       
                
                panneauCentre.getContenu().rafraichir(personnesACharger);
        }
        
        public void afficherFormPersonne(String personneId)     {
                panneauCentre.removeAll();
                PersonneForm personneForm = new PersonneForm(this, personneId);
                panneauCentre.add(personneForm);
                
                panneauCentre.layout();
        }

        public void clicListePersonne(Personne personne)        {
                panneauCentre.getContenu().rafraichir(personne);
        }

        public void clicAjouterPersonne()       {
                afficherFormPersonne(null);
        }
        
        public void clicModifierPersonne(List<Personne> selection)      {
                if (selection.size() == 0) {
                        Info.display("Information", "Veuillez sélectionner une personne.");
                } else if (selection.size() > 1) {
                        Info.display("Information", "Veuillez sélectionner une seule personne à la fois.");
                } else if (selection.size() == 1) {
                        afficherFormPersonne(selection.get(0).getId());
                } else {
                        Info.display("Erreur", "Une erreur est survenue dans la méthode clicModifierPersonne() du Médiateur.");
                }                       
        }
        
        
        public void clicSupprimerPersonne(final Rafraichissable vue, final List<Personne> personneSelection) {
                //Empecher suppression utilisateur
                for (int i=0; i < personneSelection.size(); i++)        {
                        Personne courante = personneSelection.get(i);
                        if (courante.getId().equals(getUtilisateurId()))        {
                                Info.display("Information", "Vous ne pouvez pas supprimer votre compte");
                                personneSelection.remove(courante);
                        }
                }
                
                if (personneSelection.size() == 0) {
                        Info.display("Information", "Veuillez sélectionner une personne.");
                } else if(personneSelection.size() > 0) {
                        String message = "Êtes vous sur de vouloir supprimer les personnes sélectionnées ?";
                        if (personneSelection.size() == 1) {
                                message = "Êtes vous sur de vouloir supprimer la personne sélectionnée ?";
                        }
                        
                        final Listener<MessageBoxEvent> listenerSuppression = new Listener<MessageBoxEvent>() { 
                                public void handleEvent(MessageBoxEvent ce) {
                                        Dialog dialog = (Dialog) ce.getComponent();
                                        Button btn = ce.getButtonClicked();

                                        if (btn.getText().equals(dialog.yesText)) {
                                                String idPersonneSepareParVirgule = "" ;
                                                Iterator<Personne> itPersonne = personneSelection.iterator();
                                                while (itPersonne.hasNext()) {
                                                        Personne personneCourante = itPersonne.next();
                                                        idPersonneSepareParVirgule += personneCourante.getId();
                                                        idPersonneSepareParVirgule +=",";
                                                }
                                                modele.supprimerPersonne(vue, idPersonneSepareParVirgule);  
                                        }
                                }
                        };
                        
                        MessageBox.confirm("Supprimer une personne", message, listenerSuppression);
                } else {
                        Info.display("Erreur", "Une erreur est survenue dans la méthode clicSupprimerPersonne() du Médiateur.");
                }
        }

        public void selectionnerPersonne(Rafraichissable vueARafraichir, Personne personne, String projetId)    {
                int nbElements = Integer.valueOf(((Dictionary) Dictionary.getDictionary("configuration")).get("nbElementsPage")); 
                selectionnerPersonne(vueARafraichir, personne, projetId, 0, nbElements);
        }
        
        public void selectionnerPersonne(Rafraichissable vueARafraichir, Personne personne, String projetId, int start, int nbElements) {
                String personneId = null;
                if (personne != null)   {
                        personneId = personne.getId();
                }
                modele.selectionnerPersonne(vueARafraichir, personneId, projetId, null, start, nbElements);
        }
        
        public void selectionnerPersonneParNomComplet(Rafraichissable vueARafraichir, String projetId, String nomComplet) {
                modele.selectionnerPersonne(vueARafraichir, null, projetId, nomComplet, 0, -1);         
        }
        
        public void selectionnerPersonneParProjet(Rafraichissable vueARafraichir, String projetId) {
                modele.selectionnerPersonne(vueARafraichir, null, projetId, null, 0, -1);               
        }
        
        public void enregistrerPersonne(Rafraichissable vue, Personne personne){
                if (personne.getId() != null && !personne.getId().trim().equals("")) {  
                        modele.modifierPersonne(vue, personne);
                }       else {
                        modele.ajouterPersonne(vue, personne);
                }
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION DES PUBLICATIONS
        //+----------------------------------------------------------------------------------------------------------------+

        public void afficherListePublication(PublicationListe nouvelleDonnees) {
                if (!(panneauCentre.getContenu() instanceof PublicationVue))    {
                        panneauCentre.removeAll();
                        panneauCentre.add(new PublicationVue(this));
                }       
                
                panneauCentre.getContenu().rafraichir(nouvelleDonnees); 
        }
        
        public void afficherFormPublication(String publicationId) {
                panneauCentre.removeAll();
                PublicationForm publicationForm = new PublicationForm(this, publicationId);
                panneauCentre.add(publicationForm);
                
                panneauCentre.layout();
        }
        
        public void clicListePublication(Publication publication) {
                if (publication != null) {
                        panneauCentre.getContenu().rafraichir(publication);     
                }
        }

        public void clicAjouterPublication() {
                afficherFormPublication(null);
        }
        
        public void clicModifierPublication(List<Publication> selection) {
                if (selection.size() == 0) {
                        Info.display("Information", "Veuillez sélectionner une publication.");
                } else if (selection.size() > 1) {
                        Info.display("Information", "Veuillez sélectionner une seule publication à la fois.");
                } else if (selection.size() == 1) {
                        afficherFormPublication(selection.get(0).getId());
                } else {
                        Info.display("Erreur", "Une erreur est survenue dans la méthode clicModifierPublication() du Médiateur.");
                }
        }
        
        public void clicSupprimerPublication(final List<Publication> publicationListe) {
                if (publicationListe.size() <= 0) {
                        MessageBox.alert("Attention", "Vous devez sélectionner une publication", null); 
                } else {
                        String message = "Voulez-vous vraiment supprimer ces publications ?";
                        if (publicationListe.size() == 1) {
                                message = "Voulez-vous vraiment supprimer cette publication ?";
                        }
                        
                        final Listener<MessageBoxEvent> listenerSuppression = new Listener<MessageBoxEvent>() { 
                                public void handleEvent(MessageBoxEvent ce) {  
                                        Dialog dialog = (Dialog) ce.getComponent();
                                    Button btn = ce.getButtonClicked();  
                                           
                                    if (btn.getText().equals(dialog.yesText)) {
                                        supprimerPublication(panneauCentre.getContenu(), publicationListe);
                                        supprimerPublicationAPersonne(panneauCentre.getContenu(), publicationListe.get(0).getId());
                                    }
                                }
                        };
                                     
                        MessageBox.confirm("Supprimer une publication", message, listenerSuppression);
                }
        }
        
        public void selectionnerPublication(Rafraichissable vueARafraichir, String publicationId) {
                modele.selectionnerPublication(vueARafraichir, publicationId, getProjetId(), null);
        }
        
        public void selectionnerPublicationParNomComplet(Rafraichissable vueARafraichir, String projetId, String nomComplet) {
                modele.selectionnerPublication(vueARafraichir, null, projetId, nomComplet);             
        }
        
        public void ajouterPublication(Rafraichissable vueARafraichir, Publication publication) {
                modele.ajouterPublication(vueARafraichir, publication);
        }
        
        public void modifierPublication(Rafraichissable vueARafraichir, Publication publication) {
                modele.modifierPublication(vueARafraichir, publication);
        }
        
        public void supprimerPublication(Rafraichissable vueARafraichir, List<Publication> publicationsListe) {
                if (publicationsListe != null && publicationsListe.size() > 0) {
                        String idPublicationSeparesParVirgule = "" ;
                        Iterator<Publication> it = publicationsListe.iterator();
                        while (it.hasNext()) {
                                idPublicationSeparesParVirgule += it.next().getId();
                                if (it.hasNext()) {
                                        idPublicationSeparesParVirgule += ",";
                                }
                        }
                        modele.supprimerPublication(vueARafraichir, idPublicationSeparesParVirgule);
                        modele.supprimerPublicationAPersonne(vueARafraichir, idPublicationSeparesParVirgule);
                }
        }

        public void clicObtenirListeEditeurs(Rafraichissable vueARafraichir) {
                selectionnerStructureParProjet(vueARafraichir, null);
        }

        public void clicObtenirListeAuteurs(Rafraichissable vueARafraichir) {
                selectionnerPersonneParProjet(vueARafraichir, null);
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        // GESTION de la relation PUBLICATION A PERSONNE

        public void selectionnerPublicationAPersonne(Rafraichissable vueARafraichir, String publicationId, String personnesId, String roleId) {
                modele.selectionPublicationAPersonne(vueARafraichir, publicationId, personnesId, roleId);
        }
        
        public void ajouterPublicationAPersonne(Rafraichissable vueARafraichir, String publicationId, PublicationAPersonneListe personnesAjoutees, String roleId) {
                if (personnesAjoutees != null && personnesAjoutees.size() > 0) {
                        String idPublicationAPersonneSepareParVirgule = "" ;
                        for (Iterator<String> it = personnesAjoutees.keySet().iterator(); it.hasNext();) {
                                idPublicationAPersonneSepareParVirgule += personnesAjoutees.get(it.next()).getIdPersonne();
                                if (it.hasNext()) {
                                        idPublicationAPersonneSepareParVirgule += ",";
                                }
                        }
                        modele.ajouterPublicationAPersonne(vueARafraichir, publicationId, idPublicationAPersonneSepareParVirgule, roleId);
                }
        }
        
        public void supprimerPublicationAPersonne(Rafraichissable vueARafraichir, PublicationAPersonneListe personnesSupprimees) {
                if (personnesSupprimees != null && personnesSupprimees.size() > 0) {
                        String idPublicationAPersonneSepareParVirgule = "" ;
                        for (Iterator<String> it = personnesSupprimees.keySet().iterator(); it.hasNext();) {
                                idPublicationAPersonneSepareParVirgule += personnesSupprimees.get(it.next()).getId();
                                if (it.hasNext()) {
                                        idPublicationAPersonneSepareParVirgule += ",";
                                }
                        }
                        supprimerPublicationAPersonne(vueARafraichir, idPublicationAPersonneSepareParVirgule);
                }
        }
        
        public void supprimerPublicationAPersonne(Rafraichissable vueARafraichir, String idPublicationSeparesParVirgule) {
                modele.supprimerPublicationAPersonne(vueARafraichir, idPublicationSeparesParVirgule);
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              RAFRAICHISSEMENT
        //+----------------------------------------------------------------------------------------------------------------+
        
        public void rafraichir(Object nouvellesDonnees) {
                if (nouvellesDonnees instanceof Utilisateur) {
                        mettreAJourEtatIdentification((Utilisateur) nouvellesDonnees);
                } else  {
                        GWT.log(i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);
                }
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        //                                                                                              GESTION du STATUT
        //+----------------------------------------------------------------------------------------------------------------+
        
        public void afficherPopinChargement()   {
                ((PopupChargement) Registry.get(RegistreId.POPUP_CHARGEMENT)).center();
        }
                
        public void masquerPopinChargement()    {               
                ((PopupChargement) Registry.get(RegistreId.POPUP_CHARGEMENT)).hide();
        }

}