Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
54 david 1
package org.tela_botanica.client.vues;
2
 
68 david 3
import java.util.Iterator;
4
 
54 david 5
import org.tela_botanica.client.interfaces.Filtrable;
6
import org.tela_botanica.client.interfaces.Rafraichissable;
68 david 7
import org.tela_botanica.client.modeles.EntiteGeographiqueObservation;
8
import org.tela_botanica.client.modeles.ListeEntiteGeographiqueObservation;
54 david 9
import org.tela_botanica.client.observation.ObservationMediateur;
10
 
72 david 11
import com.google.gwt.core.client.GWT;
68 david 12
import com.google.gwt.json.client.JSONArray;
13
import com.google.gwt.json.client.JSONObject;
14
import com.google.gwt.user.client.Window;
54 david 15
import com.google.gwt.user.client.ui.Label;
16
import com.gwtext.client.data.Node;
17
import com.gwtext.client.data.NodeTraversalCallback;
18
import com.gwtext.client.data.Tree;
19
import com.gwtext.client.widgets.Component;
20
import com.gwtext.client.widgets.Panel;
21
import com.gwtext.client.widgets.event.PanelListenerAdapter;
22
import com.gwtext.client.widgets.tree.TreeNode;
23
import com.gwtext.client.widgets.tree.TreePanel;
85 jpm 24
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;
25
import com.gwtext.client.core.EventObject;
54 david 26
 
27
/**
28
 * fenêtre de recherche affichant l'arbre des mots clés en lecture et un bouton
29
 * cliquable
30
 *
31
 * @author aurelien
32
 *
33
 */
68 david 34
public class ArbreEntiteGeographiqueObservationFiltreVue extends Panel implements Rafraichissable,
54 david 35
		Filtrable {
36
 
37
	/**
38
	 * Le médiateur associé à la vue
39
	 */
40
	private ObservationMediateur	observationMediateur		= null;
41
 
42
	/**
43
	 * Les localites en cours
44
	 */
68 david 45
	private String entitesGeographiquesEncours = "";
54 david 46
 
47
	/**
48
	 * Le treepanel qui affiche l'arbre
49
	 */
68 david 50
	private TreePanel arbreEntitesGeographiques = null;
54 david 51
 
68 david 52
 
53
 
54 david 54
	/**
68 david 55
	 * La structure de donnees qui stocke l'arbre. Utilisee a ce niveau car trop liee a la vue
56
	 */
57
 
58
	private Tree donneeEntitesGeographiques = new Tree();;
59
 
60
	/**
54 david 61
	 * booléen d'initialisation
62
	 */
63
	private boolean estInstancie = false;
64
 
65
	/**
66
	 * booléen d'etat
67
	 */
68
	private boolean filtreModifie = false;
69
 
85 jpm 70
	private String[] valeursFiltrees = null ;
71
 
72
	private boolean arbreCharge = false ;
73
 
54 david 74
	/**
75
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
76
	 */
77
	@SuppressWarnings("unused")
68 david 78
	private ArbreEntiteGeographiqueObservationFiltreVue() {
54 david 79
		super();
80
	}
81
 
82
	/**
83
	 * Constructeur avec paramètres
84
	 *
85
	 * @param im
86
	 *            le médiateur à associer
87
	 */
68 david 88
	public ArbreEntiteGeographiqueObservationFiltreVue(ObservationMediateur obs) {
54 david 89
 
90
		// on crée le panel
70 david 91
		super("Localité");
54 david 92
 
93
		this.observationMediateur = obs;
94
 
68 david 95
		arbreEntitesGeographiques = new TreePanel();
54 david 96
 
97
		this.setPaddings(5);
98
 
99
		this.setBorder(false);
100
		this.setCollapsible(true);
101
		this.setAutoWidth(true);
102
 
103
 
104
		// on ajoute les listeners
105
		ajouterListenersPanel();
106
		estInstancie = false;
107
	}
108
 
109
	/**
110
	 * Ajoute les listeners pour le rendu du panel
111
	 */
112
	private void ajouterListenersPanel() {
68 david 113
		  this.addListener(new PanelListenerAdapter() {
54 david 114
 
115
			// on instancie réellement les composants au moment du rendu pour
116
			// accélérer l'affichage
117
			// et éviter des bugs
118
			public void onRender(Component component) {
119
 
120
				// on interdit le drag and drop dans l'arbre
68 david 121
				arbreEntitesGeographiques.setEnableDD(false);
73 david 122
				arbreEntitesGeographiques.setId("x-view-tree-filter-entity");
72 david 123
				arbreEntitesGeographiques.setAutoWidth(false);
124
 
125
				if (GWT.isScript()) {
126
					arbreEntitesGeographiques.setAutoScroll(true);
127
				}
128
 
129
				arbreEntitesGeographiques.setBorder(false);
54 david 130
 
131
				// on crée une racine pour l'arbre
72 david 132
				TreeNode root = new TreeNode("Localités");
70 david 133
				root.setId("racine_entite");
72 david 134
				String[] usObject = { "Localités" };
54 david 135
				root.setUserObject(usObject);
136
 
68 david 137
				arbreEntitesGeographiques.setRootNode(root);
138
				arbreEntitesGeographiques.setRootVisible(true);
139
				arbreEntitesGeographiques.setBorder(false);
85 jpm 140
				root.setExpandable(true) ;
54 david 141
 
68 david 142
				add(arbreEntitesGeographiques);
54 david 143
 
144
				// on ajoute les listeners d'évenements
145
				ajouterListeners();
146
 
147
 
148
				// enfin on considère le composant comme instancié
149
				estInstancie = true;
150
 
68 david 151
 
54 david 152
			}
153
 
154
		});
155
	}
156
 
68 david 157
 
158
 
54 david 159
	/**
70 david 160
	 * ajoute les listeners pour les boutons et le cochage des entites
54 david 161
	 */
162
	private void ajouterListeners() {
85 jpm 163
 
164
		arbreEntitesGeographiques.addListener(new TreePanelListenerAdapter() {
165
 
166
			public void onClick(TreeNode node, EventObject e) {
167
 
168
				String nomFiltre = "" ;
169
 
170
				switch(node.getDepth())
171
				{
172
					case 0:
173
						if(!arbreCharge)
174
						{
175
							observationMediateur.obtenirListeEntiteGeographique() ;
176
							arbreCharge = true ;
177
						}
178
						return ;
179
					case 1: nomFiltre = "id_location";
180
						break;
181
					case 2: nomFiltre = "location";
182
						break;
183
					case 3: nomFiltre = "lieudit";
184
						break;
185
					default:
186
						break;
187
				}
188
 
189
				entitesGeographiquesEncours = node.getText() ;
190
				filtreModifie = true ;
191
				observationMediateur.obtenirListeObservation() ;
192
 
193
			}
194
 
195
		}) ;
54 david 196
	}
197
 
198
	/**
199
	 * Méthode héritée de l'interface rafraichissable
200
	 */
201
	public void rafraichir(Object nouvelleDonnees,
202
			boolean repandreRaffraichissement) {
203
 
204
 
68 david 205
		if (nouvelleDonnees instanceof ListeEntiteGeographiqueObservation) {
206
 
207
 
72 david 208
 
68 david 209
			String entite=null;
72 david 210
			String idEntite=null;
211
			String idParent=null;
68 david 212
 
213
			ListeEntiteGeographiqueObservation data = (ListeEntiteGeographiqueObservation) nouvelleDonnees ;
214
 
215
 
216
			if (data.isEmpty()) {
217
				// on crée un arbre vide
218
				TreeNode root = new TreeNode();
72 david 219
				root.setId("racine_entite");
220
				root.setText("Localités");
221
				String[] usObj = { "Localités"};
68 david 222
				root.setUserObject(usObj);
223
				donneeEntitesGeographiques.setRootNode(root);
224
 
225
			}
226
 
83 david 227
			// on la parse et on récupère les informations qui nous interessent
68 david 228
			for (Iterator<String> it= data.keySet().iterator(); it.hasNext();) {
229
 
230
				EntiteGeographiqueObservation ent=(EntiteGeographiqueObservation) data.get(it.next());
231
 
232
				entite=ent.getEntite();
73 david 233
 
85 jpm 234
				if(entite.contains("000null")) {
235
					entite="Inconnue" ;
236
				}
73 david 237
 
72 david 238
				idEntite=ent.getIdEntite();
239
				idParent=ent.getIdParent();
68 david 240
 
72 david 241
 
68 david 242
				String[] usObj = { entite };
243
 
244
					// et on construit l'arbre à partir de la racine (qui est
245
					// toujours le premier élément)
72 david 246
					if (entite.equals("racine_entite")) {
68 david 247
						TreeNode root = new TreeNode();
72 david 248
						root.setId(idEntite);
68 david 249
						root.setText(entite);
250
						root.setUserObject(usObj);
251
						donneeEntitesGeographiques.setRootNode(root);
252
					} else {
253
						// et en ajoutant les noeuds un à un (qui sont renvoyé
254
						// dans l'ordre hierarchique de leur niveau
255
						// ce qui permet de les traiter séquentiellement)
256
						TreeNode node = new TreeNode();
72 david 257
						node.setId(idEntite);
258
						node.setText(entite);
259
						Node parentNode = donneeEntitesGeographiques.getNodeById(idParent);
85 jpm 260
						if(parentNode != null)
261
						{
262
							node.setUserObject(usObj);
263
							parentNode.appendChild(node);
264
						}
68 david 265
					}
266
				}
267
 
268
			}
269
 
54 david 270
			// on vide tous les noeuds
68 david 271
			arbreEntitesGeographiques.getRootNode().eachChild(new NodeTraversalCallback() {
54 david 272
 
273
				public boolean execute(Node node) {
274
 
275
					node.remove();
276
					return true;
277
				}
278
 
279
			});
280
 
281
			// et on recopie le nouvel arbre
68 david 282
			copierFilsNoeud(donneeEntitesGeographiques.getRootNode(), arbreEntitesGeographiques
54 david 283
					.getRootNode());
284
 
285
			// si l'arbre n'était pas encore considéré comme instancié
286
			if (!estInstancie) {
287
				// on signale que oui
288
				estInstancie = true;
289
			}
290
 
291
			// l'état du filtre est réinitialisé
292
			filtreModifie = false;
70 david 293
			//show() ;
294
			doLayout();
68 david 295
	}
296
 
54 david 297
 
68 david 298
 
54 david 299
 
300
 
301
	/**
302
	 * Accesseur pour le panneau contenant l'arbre
303
	 *
304
	 * @return le panneau de l'arbre des mots clés
305
	 */
306
	public TreePanel getArbreMotsCles() {
68 david 307
		return arbreEntitesGeographiques;
54 david 308
	}
309
 
310
	/**
311
	 * Méthode héritée de Filtrable renvoie le nom du filtre
312
	 */
313
	public String renvoyerNomFiltre() {
314
 
315
		return "Localités";
316
	}
317
 
318
	/**
319
	 * Renvoie un tableau contenant le nom du champ à filtrer et la valeur
320
	 *
321
	 * @return un tableau contenant le nom du champ à filtrer et sa valeur
322
	 */
323
	public String[] renvoyerValeursAFiltrer() {
324
 
325
		valider();
85 jpm 326
 
327
		if(filtreModifie) {
328
		valeursFiltrees[0]  = "localites" ;
329
		valeursFiltrees[1] = entitesGeographiquesEncours ;
330
		}
54 david 331
 
332
		return valeursFiltrees;
333
	}
334
 
335
	/**
336
	 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un
337
	 * copie du sous arbre du premier noeud, qu'elle concatène au deuxième
338
	 *
339
	 * @param ndPereOriginal
340
	 *            le père des noeuds de l'arbre original
341
	 * @param ndPereCopie
342
	 *            le père qui va recevoir les copies
343
	 */
344
	private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) {
345
		if (ndPereCopie != null && ndPereOriginal != null) {
346
			Node[] ndNodeFils = ndPereOriginal.getChildNodes();
347
 
348
			for (int i = 0; i < ndNodeFils.length; i++) {
349
 
350
				String[] usObj = (String[]) ndNodeFils[i].getUserObject();
351
				TreeNode child = new TreeNode(usObj[0]);
352
				child.setUserObject(usObj);
353
				ndPereCopie.appendChild(child);
354
 
355
				if (!ndNodeFils[i].isLeaf()) {
356
					copierFilsNoeud(ndNodeFils[i], child);
357
				}
358
 
359
			}
360
		}
361
	}
362
 
363
	/**
364
	 * Méthode héritée de Filtrable Renvoie l'état du filtre (modifié ou non)
365
	 */
366
	public boolean renvoyerEtatFiltre() {
367
 
368
		return filtreModifie;
369
	}
370
 
371
	public void valider() {
372
		if (estInstancie) {
373
			// on vide les mots clés en cours
68 david 374
			entitesGeographiquesEncours = "";
54 david 375
			// pour chaque noeud à partir de la racine
376
			getArbreMotsCles().getRootNode().cascade(
377
					new NodeTraversalCallback() {
378
 
379
						// on éxécute une fonction
380
						public boolean execute(Node node) {
381
 
382
							// on récupère le mot clé associé au noeud et ses
383
							// infos
384
							TreeNode tn = getArbreMotsCles().getNodeById(
385
									node.getId());
386
 
387
							String[] usObject = (String[]) tn.getUserObject();
68 david 388
							//observationMediateur.mettreAjourEntitesGeographiques(usObject[0],
54 david 389
								//	usObject[1]);
390
 
391
							if (tn.getUI().isChecked()) {
392
								// et les concatène à la string des mots clés en
393
								// cours
68 david 394
								entitesGeographiquesEncours += usObject[1] + ",";
54 david 395
							}
396
 
397
							return true;
398
						}
399
 
400
					});
401
 
402
			// on suppose que le filtre a change
403
			filtreModifie = true;
404
		}
405
	}
406
 
407
}