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