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()));
}
}
}