Subversion Repositories eFlore/Applications.cel

Rev

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