Subversion Repositories eFlore/Applications.coel

Rev

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

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