| 912 | jpm | 1 | package org.tela_botanica.client.vues.accueil;
 | 
        
           | 910 | jpm | 2 |   | 
        
           | 912 | jpm | 3 | import java.util.ArrayList;
 | 
        
           |  |  | 4 | import java.util.HashMap;
 | 
        
           |  |  | 5 | import java.util.Iterator;
 | 
        
           |  |  | 6 | import java.util.TreeMap;
 | 
        
           |  |  | 7 |   | 
        
           | 910 | jpm | 8 | import org.tela_botanica.client.Mediateur;
 | 
        
           | 1615 | aurelien | 9 | import org.tela_botanica.client.RegistreId;
 | 
        
           | 1210 | cyprien | 10 | import org.tela_botanica.client.composants.InfoLogger;
 | 
        
           | 910 | jpm | 11 | import org.tela_botanica.client.i18n.Constantes;
 | 
        
           |  |  | 12 | import org.tela_botanica.client.images.Images;
 | 
        
           |  |  | 13 | import org.tela_botanica.client.interfaces.Rafraichissable;
 | 
        
           |  |  | 14 | import org.tela_botanica.client.modeles.Information;
 | 
        
           | 1615 | aurelien | 15 | import org.tela_botanica.client.modeles.Utilisateur;
 | 
        
           | 910 | jpm | 16 | import org.tela_botanica.client.util.Debug;
 | 
        
           |  |  | 17 |   | 
        
           | 1615 | aurelien | 18 | import com.extjs.gxt.ui.client.Registry;
 | 
        
           | 910 | jpm | 19 | import com.extjs.gxt.ui.client.event.ButtonEvent;
 | 
        
           |  |  | 20 | import com.extjs.gxt.ui.client.event.SelectionListener;
 | 
        
           |  |  | 21 | import com.extjs.gxt.ui.client.widget.ContentPanel;
 | 
        
           |  |  | 22 | import com.extjs.gxt.ui.client.widget.LayoutContainer;
 | 
        
           |  |  | 23 | import com.extjs.gxt.ui.client.widget.button.Button;
 | 
        
           |  |  | 24 | import com.extjs.gxt.ui.client.widget.custom.Portal;
 | 
        
           |  |  | 25 | import com.extjs.gxt.ui.client.widget.custom.Portlet;
 | 
        
           |  |  | 26 | import com.extjs.gxt.ui.client.widget.layout.FitLayout;
 | 
        
           |  |  | 27 | import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
 | 
        
           | 912 | jpm | 28 | import com.google.gwt.xml.client.Document;
 | 
        
           |  |  | 29 | import com.google.gwt.xml.client.Element;
 | 
        
           |  |  | 30 | import com.google.gwt.xml.client.Node;
 | 
        
           |  |  | 31 | import com.google.gwt.xml.client.NodeList;
 | 
        
           |  |  | 32 | import com.google.gwt.xml.client.XMLParser;
 | 
        
           | 910 | jpm | 33 |   | 
        
           |  |  | 34 | public class AccueilVue  extends LayoutContainer implements Rafraichissable {
 | 
        
           |  |  | 35 |   | 
        
           |  |  | 36 | 	private Mediateur mediateur = null;
 | 
        
           |  |  | 37 | 	private Constantes i18nC = null;
 | 
        
           | 1615 | aurelien | 38 | 	private static Portal portail = null;
 | 
        
           | 998 | jpm | 39 | 	private static boolean enregistrementEnCours = false;
 | 
        
           | 910 | jpm | 40 |   | 
        
           |  |  | 41 | 	public AccueilVue(Mediateur mediateurCourant) {
 | 
        
           |  |  | 42 | 		mediateur = mediateurCourant;
 | 
        
           |  |  | 43 | 		i18nC = Mediateur.i18nC;
 | 
        
           |  |  | 44 | 		setLayout(new FitLayout());
 | 
        
           |  |  | 45 |   | 
        
           |  |  | 46 | 		ContentPanel panneauPrincipal = new ContentPanel();
 | 
        
           |  |  | 47 | 		panneauPrincipal.setLayout(new FitLayout());
 | 
        
           | 1680 | raphael | 48 | 		panneauPrincipal.setHeadingHtml("Accueil");
 | 
        
           | 910 | jpm | 49 | 		panneauPrincipal.setBorders(false);
 | 
        
           |  |  | 50 |   | 
        
           |  |  | 51 | 		ToolBar barreOutils = new ToolBar();
 | 
        
           |  |  | 52 | 		Button ajouter = new Button(i18nC.ajouter());
 | 
        
           |  |  | 53 | 		ajouter.setIcon(Images.ICONES.ajouter());
 | 
        
           |  |  | 54 | 		ajouter.addSelectionListener(new SelectionListener<ButtonEvent>() {
 | 
        
           |  |  | 55 | 			public void componentSelected(ButtonEvent be) {
 | 
        
           | 912 | jpm | 56 | 				ajouterPortlet();
 | 
        
           | 910 | jpm | 57 | 			}
 | 
        
           |  |  | 58 | 		});
 | 
        
           | 1630 | aurelien | 59 | 		ajouter.setToolTip(i18nC.indicationAjouterStatistiqueAccueil());
 | 
        
           | 910 | jpm | 60 | 		barreOutils.add(ajouter);
 | 
        
           |  |  | 61 |   | 
        
           | 912 | jpm | 62 | 		Button enregistrer = new Button("Enregistrer");
 | 
        
           |  |  | 63 | 		enregistrer.setIcon(Images.ICONES.appliquer());
 | 
        
           |  |  | 64 | 		enregistrer.addSelectionListener(new SelectionListener<ButtonEvent>() {
 | 
        
           |  |  | 65 | 			public void componentSelected(ButtonEvent be) {
 | 
        
           | 998 | jpm | 66 | 				if (enregistrementEnCours == false) {
 | 
        
           |  |  | 67 | 					enregistrerParametres();
 | 
        
           |  |  | 68 | 				} else {
 | 
        
           | 1210 | cyprien | 69 | 					InfoLogger.display(i18nC.accueilEnregistrement(), i18nC.accueilEnregistrementEnCours());
 | 
        
           | 998 | jpm | 70 | 				}
 | 
        
           | 912 | jpm | 71 | 			}
 | 
        
           |  |  | 72 | 		});
 | 
        
           | 1630 | aurelien | 73 | 		enregistrer.setToolTip(i18nC.indicationEnregistrerAccueil());
 | 
        
           | 912 | jpm | 74 | 		barreOutils.add(enregistrer);
 | 
        
           |  |  | 75 |   | 
        
           | 910 | jpm | 76 | 		panneauPrincipal.setTopComponent(barreOutils);
 | 
        
           |  |  | 77 |   | 
        
           | 912 | jpm | 78 | 		portail = creerPortail();
 | 
        
           | 1615 | aurelien | 79 |   | 
        
           |  |  | 80 | 		Utilisateur utilisateur = ((Mediateur) Registry.get(RegistreId.MEDIATEUR)).getUtilisateur();
 | 
        
           |  |  | 81 | 		if(utilisateur.isIdentifie()) {
 | 
        
           |  |  | 82 | 			chargerParametres();
 | 
        
           |  |  | 83 | 		}
 | 
        
           |  |  | 84 |   | 
        
           | 912 | jpm | 85 | 		panneauPrincipal.add(portail);
 | 
        
           | 1613 | aurelien | 86 |   | 
        
           | 912 | jpm | 87 | 		add(panneauPrincipal);
 | 
        
           | 1468 | jpm | 88 | 		mediateur.desactiverChargement(this);
 | 
        
           | 912 | jpm | 89 | 	}
 | 
        
           |  |  | 90 |   | 
        
           |  |  | 91 | 	private Portal creerPortail() {
 | 
        
           |  |  | 92 | 		Portal portail  = new Portal(3);
 | 
        
           | 910 | jpm | 93 | 		portail.setBorders(true);
 | 
        
           |  |  | 94 | 		portail.setStyleAttribute("backgroundColor", "white");
 | 
        
           |  |  | 95 | 		portail.setShadow(true);
 | 
        
           |  |  | 96 | 		portail.setColumnWidth(0, .33);
 | 
        
           |  |  | 97 | 		portail.setColumnWidth(1, .33);
 | 
        
           |  |  | 98 | 		portail.setColumnWidth(2, .33);
 | 
        
           | 912 | jpm | 99 | 		return portail;
 | 
        
           | 910 | jpm | 100 | 	}
 | 
        
           |  |  | 101 |   | 
        
           | 912 | jpm | 102 | 	// 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.
 | 
        
           |  |  | 103 | 	private void viderPortail() {
 | 
        
           |  |  | 104 | 		portail.getItem(0).removeAll();
 | 
        
           |  |  | 105 | 		portail.getItem(1).removeAll();
 | 
        
           |  |  | 106 | 		portail.getItem(2).removeAll();
 | 
        
           | 910 | jpm | 107 | 	}
 | 
        
           |  |  | 108 |   | 
        
           | 1210 | cyprien | 109 | 	private void chargerParametres() {
 | 
        
           | 912 | jpm | 110 | 		viderPortail();
 | 
        
           |  |  | 111 | 		Document paramXml = XMLParser.parse(mediateur.getUtilisateur().getParametre());
 | 
        
           |  |  | 112 | 		NodeList listeAccueilNoeud = paramXml.getElementsByTagName("accueil");
 | 
        
           |  |  | 113 | 		int nbreAccueilNoeud = listeAccueilNoeud.getLength();
 | 
        
           |  |  | 114 |   | 
        
           |  |  | 115 | 		// Récupération du noeud accueil
 | 
        
           |  |  | 116 | 		Node accueilNoeud = null;
 | 
        
           | 1210 | cyprien | 117 | 		if (nbreAccueilNoeud == 0) {
 | 
        
           | 1613 | aurelien | 118 | 			ajouterPortletsDefaut();
 | 
        
           | 912 | jpm | 119 | 		} else if (nbreAccueilNoeud == 1) {
 | 
        
           |  |  | 120 | 			accueilNoeud = listeAccueilNoeud.item(0);
 | 
        
           |  |  | 121 | 			NodeList listeAppletteNoeud = accueilNoeud.getChildNodes();
 | 
        
           | 1613 | aurelien | 122 | 			// un noeud de type vide indique que l'utilisateur a explicité effacé les applettes de la page d'accueil
 | 
        
           |  |  | 123 | 			if(listeAppletteNoeud.getLength() > 0 && !listeAppletteNoeud.item(0).getNodeName().equals("vide")) {
 | 
        
           |  |  | 124 | 				// Lecture des noeuds "applette"
 | 
        
           |  |  | 125 | 				int nbreAppletteNoeud = listeAppletteNoeud.getLength();
 | 
        
           |  |  | 126 | 				TreeMap<String, HashMap<String, String>> tableApplettes = new TreeMap<String, HashMap<String, String>>();
 | 
        
           |  |  | 127 | 				for (int i = 0; i < nbreAppletteNoeud ; i++) {
 | 
        
           |  |  | 128 | 					Element appletteNoeud = (Element) listeAppletteNoeud.item(i);
 | 
        
           |  |  | 129 | 					int colonne = Integer.parseInt(appletteNoeud.getAttribute("colonne"));
 | 
        
           |  |  | 130 | 					int index = Integer.parseInt(appletteNoeud.getAttribute("index"));
 | 
        
           |  |  | 131 | 					HashMap<String, String> infoApplette = new HashMap<String, String>();
 | 
        
           |  |  | 132 | 					infoApplette.put("reduite", appletteNoeud.getAttribute("reduite"));
 | 
        
           |  |  | 133 | 					infoApplette.put("epingle", appletteNoeud.getAttribute("epingle"));
 | 
        
           |  |  | 134 | 					infoApplette.put("type", appletteNoeud.getAttribute("type"));
 | 
        
           |  |  | 135 | 					infoApplette.put("colonne", appletteNoeud.getAttribute("colonne"));
 | 
        
           |  |  | 136 | 					infoApplette.put("index", appletteNoeud.getAttribute("index"));
 | 
        
           |  |  | 137 | 					infoApplette.put("contenu", appletteNoeud.getAttribute("contenu"));
 | 
        
           |  |  | 138 | 					tableApplettes.put(colonne+"-"+index, infoApplette);
 | 
        
           |  |  | 139 | 				}
 | 
        
           |  |  | 140 | 				Iterator<String> it = tableApplettes.keySet().iterator();
 | 
        
           |  |  | 141 | 				while (it.hasNext()) {
 | 
        
           |  |  | 142 | 					String id = it.next();
 | 
        
           |  |  | 143 | 					HashMap<String, String> infoApplette = tableApplettes.get(id);
 | 
        
           |  |  | 144 | 					boolean reduite = (infoApplette.get("reduite") != null && infoApplette.get("reduite").equals("true")) ? true : false;
 | 
        
           |  |  | 145 | 					boolean epingle = (infoApplette.get("epingle") != null && infoApplette.get("epingle").equals("true")) ? true : false;
 | 
        
           |  |  | 146 | 					int index = Integer.parseInt(infoApplette.get("index"));
 | 
        
           |  |  | 147 | 					int colonne = Integer.parseInt(infoApplette.get("colonne"));
 | 
        
           |  |  | 148 | 					ajouterPortlet(reduite, epingle, infoApplette.get("type"), colonne, index, infoApplette.get("contenu"));
 | 
        
           |  |  | 149 | 				}
 | 
        
           |  |  | 150 | 			} else if(listeAppletteNoeud.getLength() == 0) {
 | 
        
           |  |  | 151 | 				ajouterPortletsDefaut();
 | 
        
           | 910 | jpm | 152 | 			}
 | 
        
           | 912 | jpm | 153 | 		}
 | 
        
           | 1210 | cyprien | 154 | 		layout();
 | 
        
           | 910 | jpm | 155 | 	}
 | 
        
           |  |  | 156 |   | 
        
           | 912 | jpm | 157 | 	private void enregistrerParametres() {
 | 
        
           |  |  | 158 | 		ArrayList<Portlet> applettes = getPortlets();
 | 
        
           |  |  | 159 |   | 
        
           |  |  | 160 | 		Iterator<Portlet>  it = applettes.iterator();
 | 
        
           |  |  | 161 |   | 
        
           |  |  | 162 | 		Document paramXml = XMLParser.parse(mediateur.getUtilisateur().getParametre());
 | 
        
           |  |  | 163 | 		NodeList listeAccueilNoeud = paramXml.getElementsByTagName("accueil");
 | 
        
           |  |  | 164 | 		int nbreAccueilNoeud = listeAccueilNoeud.getLength();
 | 
        
           |  |  | 165 |   | 
        
           |  |  | 166 | 		// Suppression des noeuds "accueil" existant car il ne devrait y en avoir qu'un
 | 
        
           |  |  | 167 | 		if (nbreAccueilNoeud > 1) {
 | 
        
           |  |  | 168 | 			for (int i = 0; i < nbreAccueilNoeud ; i++) {
 | 
        
           |  |  | 169 | 				paramXml.getDocumentElement().removeChild(listeAccueilNoeud.item(i));
 | 
        
           |  |  | 170 | 			}
 | 
        
           |  |  | 171 | 			nbreAccueilNoeud = 0;
 | 
        
           |  |  | 172 | 		}
 | 
        
           |  |  | 173 |   | 
        
           |  |  | 174 | 		// Création du nouveau noeud accueil
 | 
        
           |  |  | 175 | 		Node accueilNoeud = null;
 | 
        
           |  |  | 176 | 		Element accueilElement = paramXml.createElement("accueil");
 | 
        
           |  |  | 177 | 		if (nbreAccueilNoeud == 0) {
 | 
        
           |  |  | 178 | 			accueilNoeud = paramXml.getDocumentElement().appendChild(accueilElement);
 | 
        
           |  |  | 179 | 		} else if (nbreAccueilNoeud == 1) {
 | 
        
           |  |  | 180 | 			accueilNoeud = listeAccueilNoeud.item(0);
 | 
        
           |  |  | 181 | 			paramXml.getDocumentElement().replaceChild(accueilElement, accueilNoeud);
 | 
        
           |  |  | 182 | 			accueilNoeud = paramXml.getElementsByTagName("accueil").item(0);
 | 
        
           |  |  | 183 | 		}
 | 
        
           |  |  | 184 |   | 
        
           | 1613 | aurelien | 185 | 		// si il existe des applettes ouvertes
 | 
        
           |  |  | 186 | 		if(it.hasNext()) {
 | 
        
           |  |  | 187 | 			// Ajout des noeuds "applette" au noeud "accueil"
 | 
        
           |  |  | 188 | 			while (it.hasNext()) {
 | 
        
           |  |  | 189 | 				Portlet applette = it.next();
 | 
        
           |  |  | 190 | 				String reduite = (applette.isCollapsed() ? "true" : "false");
 | 
        
           |  |  | 191 | 				String epingle = (applette.isPinned() ? "true" : "false");
 | 
        
           |  |  | 192 | 				String index = Integer.toString(portail.getPortletIndex(applette));
 | 
        
           |  |  | 193 | 				String colonne = Integer.toString(portail.getPortletColumn(applette));
 | 
        
           |  |  | 194 | 				String contenu = applette.getData("contenu");
 | 
        
           |  |  | 195 |   | 
        
           |  |  | 196 | 				Element appletteElement = paramXml.createElement("applette");
 | 
        
           |  |  | 197 | 				appletteElement.setAttribute("reduite", reduite);
 | 
        
           |  |  | 198 | 				appletteElement.setAttribute("epingle", epingle);
 | 
        
           |  |  | 199 | 				appletteElement.setAttribute("type", "statistique");
 | 
        
           |  |  | 200 | 				appletteElement.setAttribute("colonne", colonne);
 | 
        
           |  |  | 201 | 				appletteElement.setAttribute("index", index);
 | 
        
           |  |  | 202 | 				appletteElement.setAttribute("contenu", contenu);
 | 
        
           |  |  | 203 |   | 
        
           |  |  | 204 | 				accueilNoeud.appendChild(appletteElement);
 | 
        
           |  |  | 205 | 			}
 | 
        
           |  |  | 206 | 		} else {
 | 
        
           |  |  | 207 | 			// sinon ajout d'un noeud vide
 | 
        
           |  |  | 208 | 			Element videElement = paramXml.createElement("vide");
 | 
        
           |  |  | 209 | 			accueilNoeud.appendChild(videElement);
 | 
        
           | 912 | jpm | 210 | 		}
 | 
        
           |  |  | 211 |   | 
        
           | 998 | jpm | 212 | 		enregistrementEnCours = true;
 | 
        
           | 912 | jpm | 213 | 		mediateur.getUtilisateur().setParametre(paramXml.toString());
 | 
        
           |  |  | 214 | 		mediateur.modifierUtilisateur();
 | 
        
           |  |  | 215 | 	}
 | 
        
           |  |  | 216 |   | 
        
           |  |  | 217 | 	private ArrayList<Portlet> getPortlets() {
 | 
        
           |  |  | 218 | 		ArrayList<Portlet> applettes = new ArrayList<Portlet>();
 | 
        
           |  |  | 219 | 		for (int i = 0; i < 3; i++) {
 | 
        
           |  |  | 220 | 			int nbreApplette = portail.getItem(i).getItemCount();
 | 
        
           |  |  | 221 | 			if (nbreApplette > 0) {
 | 
        
           |  |  | 222 | 				for (int j = 0; j < nbreApplette; j++) {
 | 
        
           |  |  | 223 | 					applettes.add((Portlet) portail.getItem(i).getItem(j));
 | 
        
           |  |  | 224 | 				}
 | 
        
           |  |  | 225 | 			}
 | 
        
           |  |  | 226 | 		}
 | 
        
           |  |  | 227 | 		return applettes;
 | 
        
           |  |  | 228 | 	}
 | 
        
           |  |  | 229 |   | 
        
           |  |  | 230 | 	private void ajouterPortlet() {
 | 
        
           | 913 | jpm | 231 | 		ajouterPortlet(false, false, "statistique", 0, 0, null);
 | 
        
           | 912 | jpm | 232 | 	}
 | 
        
           |  |  | 233 |   | 
        
           | 913 | jpm | 234 | 	private void ajouterPortlet(boolean reduite, boolean epingle, String type, int colonne, int index, String contenu) {
 | 
        
           |  |  | 235 | 		Applette applette = null;
 | 
        
           | 1210 | cyprien | 236 | 		if (type.equals("statistique")) {
 | 
        
           | 1165 | jpm | 237 | 			applette = new AppletteStatistique(mediateur, contenu);
 | 
        
           | 912 | jpm | 238 | 		}
 | 
        
           | 913 | jpm | 239 | 		if (reduite) {
 | 
        
           |  |  | 240 | 			applette.collapse();
 | 
        
           |  |  | 241 | 		}
 | 
        
           | 1210 | cyprien | 242 | 		portail.insert(applette, index, colonne);
 | 
        
           |  |  | 243 | 		applette.setEpingler(epingle);
 | 
        
           | 912 | jpm | 244 | 		layout();
 | 
        
           |  |  | 245 | 	}
 | 
        
           |  |  | 246 |   | 
        
           | 1613 | aurelien | 247 | 	private void ajouterPortletsDefaut() {
 | 
        
           |  |  | 248 | 		//TODO créer une énum des différents types de portlet puis faire une boucle
 | 
        
           |  |  | 249 | 		// dessus
 | 
        
           |  |  | 250 | 		Applette applette = new AppletteStatistique(mediateur, "NombreDonnees");
 | 
        
           |  |  | 251 | 		portail.insert(applette, 0, 0);
 | 
        
           |  |  | 252 | 		applette.setEpingler(true);
 | 
        
           |  |  | 253 |   | 
        
           |  |  | 254 | 		applette = new AppletteStatistique(mediateur, "MesDonnees");
 | 
        
           |  |  | 255 | 		portail.insert(applette, 0, 1);
 | 
        
           |  |  | 256 |   | 
        
           |  |  | 257 | 		applette = new AppletteStatistique(mediateur, "TypeDepot");
 | 
        
           |  |  | 258 | 		portail.insert(applette, 0, 2);
 | 
        
           |  |  | 259 |   | 
        
           |  |  | 260 | 		applette = new AppletteStatistique(mediateur, "NombreCollectionParStructure");
 | 
        
           |  |  | 261 | 		portail.insert(applette, 1, 0);
 | 
        
           |  |  | 262 | 		layout();
 | 
        
           |  |  | 263 | 	}
 | 
        
           |  |  | 264 |   | 
        
           | 1210 | cyprien | 265 | 	public void rafraichir(Object nouvellesDonnees) {
 | 
        
           | 910 | jpm | 266 | 		if (nouvellesDonnees instanceof Information) {
 | 
        
           |  |  | 267 | 			Information info = (Information) nouvellesDonnees;
 | 
        
           |  |  | 268 | 			String type = info.getType();
 | 
        
           | 912 | jpm | 269 | 			if (type.equals("maj_utilisateur")) {
 | 
        
           | 998 | jpm | 270 | 				if (enregistrementEnCours == true) {
 | 
        
           |  |  | 271 | 					enregistrementEnCours = false;
 | 
        
           | 1210 | cyprien | 272 | 					InfoLogger.display(i18nC.accueilEnregistrement(), i18nC.accueilEnregistrementSucces());
 | 
        
           | 998 | jpm | 273 | 				} else {
 | 
        
           |  |  | 274 | 					chargerParametres();
 | 
        
           | 1210 | cyprien | 275 | 					InfoLogger.display(i18nC.accueil(), i18nC.accueilChargementSucces());
 | 
        
           | 998 | jpm | 276 | 				}
 | 
        
           | 910 | jpm | 277 | 			}
 | 
        
           |  |  | 278 | 		} else {
 | 
        
           |  |  | 279 | 			Debug.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()));
 | 
        
           |  |  | 280 | 		}
 | 
        
           |  |  | 281 | 	}
 | 
        
           |  |  | 282 | }
 |