Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.vues.accueil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeMap;

import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.RegistreId;
import org.tela_botanica.client.composants.InfoLogger;
import org.tela_botanica.client.i18n.Constantes;
import org.tela_botanica.client.images.Images;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Information;
import org.tela_botanica.client.modeles.Utilisateur;
import org.tela_botanica.client.util.Debug;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.EventType;
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.event.TabPanelEvent;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.TabPanel;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.custom.Portal;
import com.extjs.gxt.ui.client.widget.custom.Portlet;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.xml.client.Document;
import com.google.gwt.xml.client.Element;
import com.google.gwt.xml.client.Node;
import com.google.gwt.xml.client.NodeList;
import com.google.gwt.xml.client.XMLParser;

public class AccueilVue  extends LayoutContainer implements Rafraichissable {
        
        private Mediateur mediateur = null;
        private Constantes i18nC = null;
        private static Portal portail = null;
        private static Widget tutoriel = null;
        private static boolean enregistrementEnCours = false;
        private ContentPanel panneauPrincipalPortail = new ContentPanel();
        TabPanel panneauOnglet = null;
        
        public AccueilVue(Mediateur mediateurCourant) {
                mediateur = mediateurCourant;
                i18nC = Mediateur.i18nC;
                setLayout(new FitLayout());
                
                panneauPrincipalPortail = new ContentPanel();
                panneauPrincipalPortail.setLayout(new FitLayout());
                panneauPrincipalPortail.setHeaderVisible(false);
                panneauPrincipalPortail.setBorders(false);
                
                panneauOnglet = new TabPanel();
                
                final ToolBar barreOutils = new ToolBar();
                Button ajouter = new Button(i18nC.ajouter());
                ajouter.setIcon(Images.ICONES.ajouter());
                ajouter.addSelectionListener(new SelectionListener<ButtonEvent>() {  
                        public void componentSelected(ButtonEvent be) {  
                                ajouterPortlet();
                        }  
                });
                ajouter.setToolTip(i18nC.indicationAjouterStatistiqueAccueil());
                barreOutils.add(ajouter);
                
                Button enregistrer = new Button("Enregistrer");
                enregistrer.setIcon(Images.ICONES.appliquer());
                enregistrer.addSelectionListener(new SelectionListener<ButtonEvent>() {  
                        public void componentSelected(ButtonEvent be) {  
                                if (enregistrementEnCours == false) {
                                        enregistrerParametres();
                                } else {
                                        InfoLogger.display(i18nC.accueilEnregistrement(), i18nC.accueilEnregistrementEnCours());
                                }
                        }  
                });
                enregistrer.setToolTip(i18nC.indicationEnregistrerAccueil());
                barreOutils.add(enregistrer);
                
                panneauPrincipalPortail.setTopComponent(barreOutils);
                
                tutoriel = new AccueilTutorielVue(mediateur);
                portail = creerPortail();
                
                Utilisateur utilisateur = ((Mediateur) Registry.get(RegistreId.MEDIATEUR)).getUtilisateur();
                if(utilisateur.isIdentifie()) {
                        chargerParametres();
                }
                ajouterPortletsDefaut();
                
                panneauPrincipalPortail.add(portail);
                
                TabItem tiPortlet = new TabItem("Statistiques");
                tiPortlet.add(panneauPrincipalPortail);
                
                final TabItem tiTuto = new TabItem("Premiers pas");
                tiTuto.setLayout(new FitLayout());
                tiTuto.add(tutoriel);
                
                panneauOnglet.add(tiTuto);
                panneauOnglet.add(tiPortlet);

                add(panneauOnglet);
                
                // Correction de hauteur du panneau contenant les stats qui gère mal le fait d'être
                // dans un onglet
                panneauOnglet.addListener(Events.Select, new Listener<TabPanelEvent>() {
                        public void handleEvent(TabPanelEvent be) {
                                if(portail.isRendered()) {
                                        portail.setHeight(panneauOnglet.getHeight() - barreOutils.getHeight());
                                        portail.setWidth(panneauOnglet.getWidth());
                                }
                        }
            });
                
                mediateur.desactiverChargement(this);
        }
        
        private Portal creerPortail() {
                Portal portail  = new Portal(3);
                portail.setBorders(true);
                portail.setStyleAttribute("backgroundColor", "white");
                portail.setShadow(true);
                portail.setColumnWidth(0, .33);
                portail.setColumnWidth(1, .33);
                portail.setColumnWidth(2, .33);
                return portail;
        }
        
        // INFO: Les items d'une classse portal correspondent aux colonnes. Pour vider une Portal, il faut donc vider les éléments de chaque item du Portal.
        private void viderPortail() {
                portail.getItem(0).removeAll();
                portail.getItem(1).removeAll();
                portail.getItem(2).removeAll();
        }
        
        private void chargerParametres() {      
                viderPortail();
                Document paramXml = XMLParser.parse(mediateur.getUtilisateur().getParametre());
                NodeList listeAccueilNoeud = paramXml.getElementsByTagName("accueil");
                int nbreAccueilNoeud = listeAccueilNoeud.getLength();

                // Récupération du noeud accueil
                Node accueilNoeud = null;
                if (nbreAccueilNoeud == 0) {            
                        ajouterPortletsDefaut();
                } else if (nbreAccueilNoeud == 1) {
                        accueilNoeud = listeAccueilNoeud.item(0);
                        NodeList listeAppletteNoeud = accueilNoeud.getChildNodes();
                        // un noeud de type vide indique que l'utilisateur a explicité effacé les applettes de la page d'accueil
                        if(listeAppletteNoeud.getLength() > 0 && !listeAppletteNoeud.item(0).getNodeName().equals("vide")) {            
                                // Lecture des noeuds "applette"
                                int nbreAppletteNoeud = listeAppletteNoeud.getLength();
                                TreeMap<String, HashMap<String, String>> tableApplettes = new TreeMap<String, HashMap<String, String>>();                               
                                for (int i = 0; i < nbreAppletteNoeud ; i++) {
                                        Element appletteNoeud = (Element) listeAppletteNoeud.item(i);
                                        int colonne = Integer.parseInt(appletteNoeud.getAttribute("colonne"));
                                        int index = Integer.parseInt(appletteNoeud.getAttribute("index"));
                                        HashMap<String, String> infoApplette = new HashMap<String, String>();
                                        infoApplette.put("reduite", appletteNoeud.getAttribute("reduite"));
                                        infoApplette.put("epingle", appletteNoeud.getAttribute("epingle"));
                                        infoApplette.put("type", appletteNoeud.getAttribute("type"));
                                        infoApplette.put("colonne", appletteNoeud.getAttribute("colonne"));
                                        infoApplette.put("index", appletteNoeud.getAttribute("index"));
                                        infoApplette.put("contenu", appletteNoeud.getAttribute("contenu"));
                                        tableApplettes.put(colonne+"-"+index, infoApplette);
                                }
                                Iterator<String> it = tableApplettes.keySet().iterator();
                                while (it.hasNext()) {
                                        String id = it.next();
                                        HashMap<String, String> infoApplette = tableApplettes.get(id);
                                        boolean reduite = (infoApplette.get("reduite") != null && infoApplette.get("reduite").equals("true")) ? true : false;
                                        boolean epingle = (infoApplette.get("epingle") != null && infoApplette.get("epingle").equals("true")) ? true : false;
                                        int index = Integer.parseInt(infoApplette.get("index"));
                                        int colonne = Integer.parseInt(infoApplette.get("colonne"));                    
                                        ajouterPortlet(reduite, epingle, infoApplette.get("type"), colonne, index, infoApplette.get("contenu"));                                
                                }
                        } else if(listeAppletteNoeud.getLength() == 0) {
                                ajouterPortletsDefaut();
                        }
                }
                layout();               
        }
        
        private void enregistrerParametres() {
                ArrayList<Portlet> applettes = getPortlets();
                
                Iterator<Portlet>  it = applettes.iterator();
                
                Document paramXml = XMLParser.parse(mediateur.getUtilisateur().getParametre());
                NodeList listeAccueilNoeud = paramXml.getElementsByTagName("accueil");
                int nbreAccueilNoeud = listeAccueilNoeud.getLength();

                // Suppression des noeuds "accueil" existant car il ne devrait y en avoir qu'un
                if (nbreAccueilNoeud > 1) {
                        for (int i = 0; i < nbreAccueilNoeud ; i++) {
                                paramXml.getDocumentElement().removeChild(listeAccueilNoeud.item(i));
                        }
                        nbreAccueilNoeud = 0;
                }
                
                // Création du nouveau noeud accueil
                Node accueilNoeud = null;
                Element accueilElement = paramXml.createElement("accueil");
                if (nbreAccueilNoeud == 0) {
                        accueilNoeud = paramXml.getDocumentElement().appendChild(accueilElement);
                } else if (nbreAccueilNoeud == 1) {
                        accueilNoeud = listeAccueilNoeud.item(0);
                        paramXml.getDocumentElement().replaceChild(accueilElement, accueilNoeud);
                        accueilNoeud = paramXml.getElementsByTagName("accueil").item(0);
                }
                
                // si il existe des applettes ouvertes
                if(it.hasNext()) {
                        // Ajout des noeuds "applette" au noeud "accueil"
                        while (it.hasNext()) {
                                Portlet applette = it.next();
                                String reduite = (applette.isCollapsed() ? "true" : "false");
                                String epingle = (applette.isPinned() ? "true" : "false");
                                String index = Integer.toString(portail.getPortletIndex(applette));
                                String colonne = Integer.toString(portail.getPortletColumn(applette));
                                String contenu = applette.getData("contenu");
                                
                                Element appletteElement = paramXml.createElement("applette");
                                appletteElement.setAttribute("reduite", reduite);
                                appletteElement.setAttribute("epingle", epingle);
                                appletteElement.setAttribute("type", "statistique");
                                appletteElement.setAttribute("colonne", colonne);
                                appletteElement.setAttribute("index", index);
                                appletteElement.setAttribute("contenu", contenu);
                                
                                accueilNoeud.appendChild(appletteElement);
                        }
                } else {
                        // sinon ajout d'un noeud vide
                        Element videElement = paramXml.createElement("vide");
                        accueilNoeud.appendChild(videElement);
                }
                
                enregistrementEnCours = true;
                mediateur.getUtilisateur().setParametre(paramXml.toString());
                mediateur.modifierUtilisateur();
        }
        
        private ArrayList<Portlet> getPortlets() {
                ArrayList<Portlet> applettes = new ArrayList<Portlet>();
                for (int i = 0; i < 3; i++) {
                        int nbreApplette = portail.getItem(i).getItemCount();
                        if (nbreApplette > 0) {
                                for (int j = 0; j < nbreApplette; j++) {
                                        applettes.add((Portlet) portail.getItem(i).getItem(j));
                                }
                        }
                }
                return applettes;
        }
        
        private void ajouterPortlet() {
                ajouterPortlet(false, false, "statistique", 0, 0, null);
        }
        
        private void ajouterPortlet(boolean reduite, boolean epingle, String type, int colonne, int index, String contenu) {
                Applette applette = null;
                if (type.equals("statistique")) {               
                        applette = new AppletteStatistique(mediateur, contenu);
                }
                if (reduite) {
                        applette.collapse();
                }
                portail.insert(applette, index, colonne);               
                applette.setEpingler(epingle);  
                layout();
        }
        
        private void ajouterPortletsDefaut() {          
                //TODO créer une énum des différents types de portlet puis faire une boucle
                // dessus
                Applette applette = new AppletteStatistique(mediateur, "NombreDonnees");
                portail.insert(applette, 0, 0);         
                applette.setEpingler(true);     
                
                applette = new AppletteStatistique(mediateur, "MesDonnees");
                portail.insert(applette, 0, 1); 
                
                applette = new AppletteStatistique(mediateur, "TypeDepot");
                portail.insert(applette, 0, 2); 
                
                applette = new AppletteStatistique(mediateur, "NombreCollectionParStructure");
                portail.insert(applette, 1, 0); 
                layout();
        }
        
        public void rafraichir(Object nouvellesDonnees) {       
                if (nouvellesDonnees instanceof Information) {
                        Information info = (Information) nouvellesDonnees;
                        String type = info.getType(); 
                        if (type.equals("maj_utilisateur")) {
                                if (enregistrementEnCours == true) {
                                        enregistrementEnCours = false;
                                        InfoLogger.display(i18nC.accueilEnregistrement(), i18nC.accueilEnregistrementSucces());
                                } else {
                                        chargerParametres();
                                        InfoLogger.display(i18nC.accueil(), i18nC.accueilChargementSucces());
                                }
                        }
                } else {
                        Debug.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()));
                }
        }
}