Subversion Repositories eFlore/Applications.coel

Rev

Go to most recent revision | Details | 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;
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());
48
		panneauPrincipal.setHeading("Accueil");
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
}