Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
91 jpm 1
package org.tela_botanica.client.vues;
2
 
3
import java.util.Comparator;
4
import java.util.Iterator;
5
 
6
import org.tela_botanica.client.interfaces.Filtrable;
7
import org.tela_botanica.client.interfaces.Rafraichissable;
8
import org.tela_botanica.client.modeles.DateObservation;
9
import org.tela_botanica.client.modeles.EntiteGeographiqueObservation;
10
import org.tela_botanica.client.modeles.ListeDateObservation;
11
import org.tela_botanica.client.modeles.ListeEntiteGeographiqueObservation;
12
import org.tela_botanica.client.modeles.ListeObservation;
13
import org.tela_botanica.client.modeles.Observation;
14
import org.tela_botanica.client.observation.ObservationMediateur;
15
 
16
import com.google.gwt.core.client.GWT;
17
import com.google.gwt.json.client.JSONArray;
18
import com.google.gwt.json.client.JSONObject;
19
import com.google.gwt.user.client.Window;
20
import com.google.gwt.user.client.ui.Label;
21
import com.gwtext.client.data.Node;
22
import com.gwtext.client.data.NodeTraversalCallback;
23
import com.gwtext.client.data.Tree;
24
import com.gwtext.client.data.event.NodeListenerAdapter;
25
import com.gwtext.client.widgets.Component;
26
import com.gwtext.client.widgets.Panel;
27
import com.gwtext.client.widgets.event.PanelListenerAdapter;
28
import com.gwtext.client.widgets.tree.TreeNode;
29
import com.gwtext.client.widgets.tree.TreePanel;
30
import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
31
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;
32
import com.gwtext.client.core.EventObject;
33
 
34
/**
35
 * fenêtre de recherche affichant l'arbre des mots clés en lecture et un bouton
36
 * cliquable
37
 *
38
 * @author aurelien
39
 *
40
 */
41
public class ArbreDateObservationFiltreVue extends Panel implements Rafraichissable,
42
		Filtrable {
43
 
44
	/**
45
	 * Le médiateur associé à la vue
46
	 */
47
	private ObservationMediateur	observationMediateur		= null;
48
 
49
	/**
50
	 * Les localites en cours
51
	 */
52
	private String donneesDateEnCours = "";
53
 
54
	/**
55
	 * Le treepanel qui affiche l'arbre
56
	 */
57
	private TreePanel arbreDonneesDates = null;
58
 
59
 
60
 
61
	/**
62
	 * La structure de donnees qui stocke l'arbre. Utilisee a ce niveau car trop liee a la vue
63
	 */
64
 
65
	private Tree donneesDates = new Tree();
66
 
67
	/**
68
	 * booléen d'initialisation
69
	 */
70
	private boolean estInstancie = false;
71
 
72
	/**
73
	 * booléen d'etat
74
	 */
75
	private boolean filtreModifie = false;
76
 
77
	private boolean arbreCharge = false ;
78
 
79
	private String nomFiltre = "" ;
80
 
81
	/**
82
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
83
	 */
84
	@SuppressWarnings("unused")
85
	private ArbreDateObservationFiltreVue() {
86
		super();
87
	}
88
 
89
	/**
90
	 * Constructeur avec paramètres
91
	 *
92
	 * @param im
93
	 *            le médiateur à associer
94
	 */
95
	public ArbreDateObservationFiltreVue(ObservationMediateur obs) {
96
 
97
		// on crée le panel
98
		super("Dates");
99
 
100
		this.observationMediateur = obs;
101
 
102
		arbreDonneesDates = new TreePanel();
103
 
104
		this.setPaddings(5);
105
 
106
		this.setBorder(false);
107
		this.setCollapsible(true);
108
		this.setAutoWidth(true);
109
 
110
 
111
		// on ajoute les listeners
112
		ajouterListenersPanel();
113
		estInstancie = false;
114
	}
115
 
116
	/**
117
	 * Ajoute les listeners pour le rendu du panel
118
	 */
119
	private void ajouterListenersPanel() {
120
		  this.addListener(new PanelListenerAdapter() {
121
 
122
			// on instancie réellement les composants au moment du rendu pour
123
			// accélérer l'affichage
124
			// et éviter des bugs
125
			public void onRender(Component component) {
126
 
127
				// on interdit le drag and drop dans l'arbre
128
				arbreDonneesDates.setEnableDD(false);
129
				arbreDonneesDates.setId("x-view-tree-filter-date");
130
				arbreDonneesDates.setAutoWidth(false);
131
 
132
				if (GWT.isScript()) {
133
					arbreDonneesDates.setAutoScroll(true);
134
				}
135
 
136
				arbreDonneesDates.setBorder(false);
137
 
138
				// on crée une racine pour l'arbre
139
				TreeNode root = new TreeNode("Dates");
140
				root.setId("racine_date");
141
				String[] usObject = { "Dates" };
142
				root.setUserObject(usObject);
143
 
144
				arbreDonneesDates.setRootNode(root);
145
				arbreDonneesDates.setRootVisible(true);
146
				arbreDonneesDates.setBorder(false);
147
				root.setExpandable(true) ;
148
 
149
				add(arbreDonneesDates);
150
 
151
				// on ajoute les listeners d'évenements
152
				ajouterListeners();
153
 
154
 
155
				// enfin on considère le composant comme instancié
156
				estInstancie = true;
157
 
158
 
159
			}
160
 
161
		});
162
	}
163
 
164
 
165
 
166
	/**
167
	 * ajoute les listeners pour les boutons et le cochage des entites
168
	 */
169
	private void ajouterListeners() {
170
 
171
		arbreDonneesDates.addListener(new TreePanelListenerAdapter() {
172
 
173
			public void onClick(TreeNode node, EventObject e) {
174
 
175
				nomFiltre = "" ;
176
				donneesDateEnCours = "" ;
177
				String nomPere = "" ;
178
				String nomGrandPere = "" ;
179
 
180
				switch(node.getDepth())
181
				{
182
					case 0:
183
						if(!arbreCharge)
184
						{
185
							arbreCharge = true ;
186
							observationMediateur.obtenirDatesObservation() ;
187
						}
188
						else
189
						{
190
							observationMediateur.obtenirNombreObservation() ;
191
						}
192
						return ;
193
					case 3: nomFiltre += "annee,mois,jour";
94 jpm 194
						nomPere = ((String[])node.getParentNode().getUserObject())[1] ;
195
						nomGrandPere = ((String[])node.getParentNode().getParentNode().getUserObject())[1] ;
196
						donneesDateEnCours += nomGrandPere+","+nomPere+","+((String[])node.getUserObject())[1] ;
91 jpm 197
						break;
198
					case 2: nomFiltre += "annee,mois";
94 jpm 199
						nomPere = ((String[])node.getParentNode().getUserObject())[1] ;
200
						donneesDateEnCours += nomPere+","+((String[])node.getUserObject())[1] ;
91 jpm 201
						break;
202
					case 1: nomFiltre += "annee";
94 jpm 203
						donneesDateEnCours += ((String[])node.getUserObject())[1] ;
91 jpm 204
						break;
205
					default:
206
						break;
207
				}
208
 
209
				filtreModifie = true ;
210
				observationMediateur.obtenirNombreObservation() ;
211
 
212
			}
213
 
214
		}) ;
215
 
216
		arbreDonneesDates.getRootNode().addListener(new TreeNodeListenerAdapter() {
217
 
218
			public void onExpand(Node node) {
219
				if(!arbreCharge)
220
				{
221
					observationMediateur.obtenirDatesObservation() ;
222
					arbreCharge = true ;
223
				}
224
			}
225
 
226
		}) ;
227
	}
228
 
229
	/**
230
	 * Méthode héritée de l'interface rafraichissable
231
	 */
232
	public void rafraichir(Object nouvelleDonnees,
233
			boolean repandreRaffraichissement) {
234
 
235
		if (nouvelleDonnees instanceof ListeDateObservation) {
236
 
237
			String annee=null;
238
			String mois=null;
239
			String jour=null;
240
 
241
			ListeDateObservation data = (ListeDateObservation) nouvelleDonnees ;
242
 
243
				// on crée un arbre vide
244
				TreeNode root = new TreeNode();
245
				root.setId("racine_date");
246
				root.setText("Dates");
94 jpm 247
				String[] usObjRoot = { "Dates", "Dates"};
91 jpm 248
				root.setUserObject(usObjRoot);
249
				donneesDates.setRootNode(root);
250
 
251
			// on la parse et on récupère les informations qui nous interessent
252
			for (Iterator<String> it= data.keySet().iterator(); it.hasNext();) {
253
 
254
				DateObservation ent=(DateObservation) data.get(it.next());
255
 
256
				annee= ent.getAnnee() ;
257
				mois= ent.getMois() ;
258
				String moisLettre = renvoyerMois(Integer.parseInt(mois)) ;
259
				jour= ent.getJour() ;
260
 
261
				if(annee.contains("0000")) {
262
					annee="Inconnue" ;
263
				}
264
 
265
				if(jour.contains("00")) {
266
					jour="Inconnue" ;
267
				}
268
 
94 jpm 269
				Node noeudMemeAnnee = donneesDates.getNodeById(""+annee);
91 jpm 270
				// si la région existe déjà
94 jpm 271
					if(noeudMemeAnnee != null)
91 jpm 272
					{
273
						// on teste si la localité existe
94 jpm 274
						Node noeudMemeMois = donneesDates.getNodeById(""+(annee+mois));
275
						if(noeudMemeMois != null)
91 jpm 276
						{
277
							// enfin on teste si le lieu dit existe
94 jpm 278
							Node noeudMemeJour = donneesDates.getNodeById(""+(annee+mois+jour));
279
							if(noeudMemeJour != null)
91 jpm 280
							{
281
								// tous les noeuds existent déjà, normalement ça ne devrait pas arriver
282
							}
283
							else
284
							{
285
								// enfin on ne crée que le noeud du lieu dit
94 jpm 286
								TreeNode node_jour = new TreeNode();
287
								node_jour.setId(""+(annee+mois+jour));
288
								node_jour.setText(jour);
289
								noeudMemeMois.appendChild(node_jour) ;
290
								String[] usObj = {jour,jour};
291
								node_jour.setUserObject(usObj);
91 jpm 292
							}
293
						}
294
						else
295
						{
94 jpm 296
							TreeNode node_mois = new TreeNode();
297
							node_mois.setId(""+(annee+mois));
298
							node_mois.setText(moisLettre);
299
							noeudMemeAnnee.appendChild(node_mois) ;
300
							String[] usObj = {moisLettre,mois};
301
							node_mois.setUserObject(usObj);
91 jpm 302
 
94 jpm 303
							TreeNode node_jour = new TreeNode();
304
							node_jour.setId(""+(annee+mois+jour));
305
							node_jour.setText(jour);
306
							node_mois.appendChild(node_jour) ;
307
							String[] usObj2 = {jour,jour};
308
							node_jour.setUserObject(usObj2);
91 jpm 309
 
310
						}
311
					}
312
					else
313
					{
94 jpm 314
						TreeNode node_annee = new TreeNode();
315
						node_annee.setId(""+annee);
316
						node_annee.setText(annee);
317
						root.appendChild(node_annee) ;
318
						String[] usObj = {annee, annee};
319
						node_annee.setUserObject(usObj);
91 jpm 320
 
94 jpm 321
						TreeNode node_mois = new TreeNode();
322
						node_mois.setId(""+(annee+mois));
323
						node_mois.setText(moisLettre);
324
						node_annee.appendChild(node_mois) ;
325
						String[] usObj2 = {moisLettre,mois};
326
						node_mois.setUserObject(usObj2);
91 jpm 327
 
94 jpm 328
						TreeNode node_jour = new TreeNode();
329
						node_jour.setId(""+(annee+mois+jour));
330
						node_jour.setText(jour);
331
						node_mois.appendChild(node_jour) ;
332
						String[] usObj3 = {jour,jour};
333
						node_jour.setUserObject(usObj3);
91 jpm 334
					}
335
 
336
				}
337
 
338
				// on vide tous les noeuds
339
				arbreDonneesDates.getRootNode().eachChild(new NodeTraversalCallback() {
340
 
341
					public boolean execute(Node node) {
342
 
343
						node.remove();
344
						return true;
345
					}
346
 
347
				});
348
 
349
				// et on recopie le nouvel arbre
350
				copierFilsNoeud(donneesDates.getRootNode(), arbreDonneesDates
351
						.getRootNode());
352
 
94 jpm 353
				// on trie
354
				root.sort(comparerNoeuds()) ;
355
 
91 jpm 356
				// si l'arbre n'était pas encore considéré comme instancié
357
				if (!estInstancie) {
358
					// on signale que oui
359
					estInstancie = true;
360
				}
361
 
362
				// l'état du filtre est réinitialisé
363
				filtreModifie = false;
364
				//show() ;
365
				doLayout();
366
 
367
			}
368
 
94 jpm 369
		if(nouvelleDonnees instanceof Observation)
91 jpm 370
		{
94 jpm 371
			Observation ent = (Observation)nouvelleDonnees ;
372
			String dateSpl[] = ent.getDate().split("/") ;
91 jpm 373
 
94 jpm 374
			String annee= dateSpl[2];
375
			String mois= dateSpl[1];
376
			String jour= dateSpl[0];
377
 
91 jpm 378
			String moisLettre = renvoyerMois(Integer.parseInt(mois)) ;
379
 
380
			Node root = arbreDonneesDates.getRootNode() ;
381
 
382
			if(annee.contains("0000") || annee.equals(null)) {
383
				annee="Inconnue" ;
384
			}
385
 
386
			if(jour.contains("00") || jour.equals(null)) {
387
				jour="Inconnue" ;
388
			}
389
 
94 jpm 390
			Node noeudMemeAnnee = donneesDates.getNodeById(""+annee);
91 jpm 391
			// si la région existe déjà
94 jpm 392
				if(noeudMemeAnnee != null)
393
				{
91 jpm 394
					// on teste si la localité existe
94 jpm 395
					Node noeudMemeMois = donneesDates.getNodeById(""+(annee+mois));
396
					if(noeudMemeMois != null)
91 jpm 397
					{
398
						// enfin on teste si le lieu dit existe
94 jpm 399
						Node noeudMemeJour = donneesDates.getNodeById(""+(annee+mois+jour));
400
						if(noeudMemeJour != null)
91 jpm 401
						{
402
							// tous les noeuds existent déjà, normalement ça ne devrait pas arriver
403
						}
404
						else
405
						{
406
							// enfin on ne crée que le noeud du lieu dit
94 jpm 407
							TreeNode node_jour = new TreeNode();
408
							node_jour.setId(""+(annee+mois+jour));
409
							node_jour.setText(jour);
410
							String[] usObj = {jour,jour};
411
							node_jour.setUserObject(usObj);
412
							noeudMemeMois.appendChild(node_jour) ;
413
 
414
							root.sort(comparerNoeuds()) ;
91 jpm 415
						}
416
					}
417
					else
418
					{
94 jpm 419
						TreeNode node_mois = new TreeNode();
420
						node_mois.setId(""+(annee+mois));
421
						node_mois.setText(moisLettre);
422
						String[] usObj = {moisLettre,mois};
423
						node_mois.setUserObject(usObj);
424
						noeudMemeAnnee.appendChild(node_mois) ;
91 jpm 425
 
94 jpm 426
						Window.alert("on crée on nouveau mois "+node_mois.getId()) ;
91 jpm 427
 
94 jpm 428
						TreeNode node_jour = new TreeNode();
429
						node_jour.setId(""+(annee+mois+jour));
430
						node_jour.setText(jour);
431
						String[] usObj2 = {jour,jour};
432
						node_jour.setUserObject(usObj2);
433
						node_mois.appendChild(node_jour) ;
434
 
435
						root.sort(comparerNoeuds()) ;
91 jpm 436
					}
437
			}
438
			else
439
			{
440
 
94 jpm 441
				TreeNode node_annee = new TreeNode();
442
				node_annee.setId(""+annee);
443
				node_annee.setText(annee);
444
				String[] usObj = {annee,annee};
445
				node_annee.setUserObject(usObj);
446
				root.appendChild(node_annee) ;
91 jpm 447
 
94 jpm 448
				TreeNode node_mois = new TreeNode();
449
				node_mois.setId(""+(annee+mois));
450
				node_mois.setText(moisLettre);
451
				String[] usObj2 = {moisLettre,mois};
452
				node_mois.setUserObject(usObj2);
453
				node_annee.appendChild(node_mois) ;
91 jpm 454
 
94 jpm 455
				TreeNode node_jour = new TreeNode();
456
				node_jour.setId(""+(annee+mois+jour));
457
				node_jour.setText(jour);
458
				String[] usObj3 = {jour,jour};
459
				node_jour.setUserObject(usObj3);
460
				node_mois.appendChild(node_jour) ;
91 jpm 461
 
462
				// TODO : améliorer la compararaison des noeuds
463
				root.sort(comparerNoeuds()) ;
464
			}
465
 
466
				arbreDonneesDates.doLayout() ;
467
		}
468
	}
469
 
470
 
471
	/**
472
	 * Accesseur pour le panneau contenant l'arbre
473
	 *
474
	 * @return le panneau de l'arbre des mots clés
475
	 */
476
	public TreePanel getArbreMotsCles() {
477
		return arbreDonneesDates;
478
	}
479
 
480
	/**
481
	 * Méthode héritée de Filtrable renvoie le nom du filtre
482
	 */
483
	public String renvoyerNomFiltre() {
484
 
485
		return "Dates";
486
	}
487
 
488
	/**
489
	 * Renvoie un tableau contenant le nom du champ à filtrer et la valeur
490
	 *
491
	 * @return un tableau contenant le nom du champ à filtrer et sa valeur
492
	 */
493
	public String[] renvoyerValeursAFiltrer() {
494
 
495
		valider();
496
 
497
		String valeursFiltrees[] = {nomFiltre, donneesDateEnCours } ;
498
 
499
		return valeursFiltrees;
500
	}
501
 
502
	/**
503
	 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un
504
	 * copie du sous arbre du premier noeud, qu'elle concatène au deuxième
505
	 *
506
	 * @param ndPereOriginal
507
	 *            le père des noeuds de l'arbre original
508
	 * @param ndPereCopie
509
	 *            le père qui va recevoir les copies
510
	 */
511
	private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) {
512
		if (ndPereCopie != null && ndPereOriginal != null) {
513
			Node[] ndNodeFils = ndPereOriginal.getChildNodes();
514
 
515
			for (int i = 0; i < ndNodeFils.length; i++) {
516
 
517
				String[] usObj = (String[]) ndNodeFils[i].getUserObject();
518
				TreeNode child = new TreeNode(usObj[0]);
519
				child.setUserObject(usObj);
520
				ndPereCopie.appendChild(child);
521
 
522
				if (!ndNodeFils[i].isLeaf()) {
523
					copierFilsNoeud(ndNodeFils[i], child);
524
				}
525
 
526
			}
527
		}
528
	}
529
 
530
	/**
531
	 * Méthode héritée de Filtrable Renvoie l'état du filtre (modifié ou non)
532
	 */
533
	public boolean renvoyerEtatFiltre() {
534
 
535
		return filtreModifie;
536
	}
537
 
538
	public void valider() {
539
 
540
		if (estInstancie) {
541
 
542
		}
543
	}
544
 
545
	public Comparator<TreeNode> comparerNoeuds()
546
	{
547
		return new Comparator<TreeNode>() {
548
 
549
			public int compare(TreeNode o1, TreeNode o2) {
550
 
94 jpm 551
				String n1 = ((String[])o1.getUserObject())[1] ;
552
				String n2 = ((String[])o2.getUserObject())[1] ;
91 jpm 553
 
554
				return n1.compareTo(n2) ;
555
			}
556
 
557
		} ;
558
	}
559
 
560
	public String renvoyerMois(int numMois) {
561
 
562
		switch (numMois) {
563
		case 1:
564
			return "janvier" ;
565
		case 2:
566
			return "fevrier" ;
567
		case 3:
568
			return "mars" ;
569
		case 4:
570
			return "avril" ;
571
		case 5:
572
			return "mai" ;
573
		case 6:
574
			return "juin" ;
575
		case 7:
576
			return "juillet" ;
577
		case 8:
578
			return "août" ;
579
		case 9:
580
			return "septembre" ;
581
		case 10:
582
			return "octobre" ;
583
		case 11:
584
			return "novembre" ;
585
		case 12:
586
			return "décembre" ;
587
		default:
588
			return "Inconnue" ;
589
		}
590
 
591
	}
592
 
593
 
594
}