Subversion Repositories eFlore/Applications.cel

Rev

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

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