Subversion Repositories eFlore/Applications.coel

Rev

Details | Last modification | View Log | RSS feed

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