Subversion Repositories eFlore/Applications.cel

Rev

Rev 85 | Rev 87 | 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
 
86 jpm 74
	private String nomFiltre = "" ;
75
 
54 david 76
	/**
77
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
78
	 */
79
	@SuppressWarnings("unused")
68 david 80
	private ArbreEntiteGeographiqueObservationFiltreVue() {
54 david 81
		super();
82
	}
83
 
84
	/**
85
	 * Constructeur avec paramètres
86
	 *
87
	 * @param im
88
	 *            le médiateur à associer
89
	 */
68 david 90
	public ArbreEntiteGeographiqueObservationFiltreVue(ObservationMediateur obs) {
54 david 91
 
92
		// on crée le panel
70 david 93
		super("Localité");
54 david 94
 
95
		this.observationMediateur = obs;
96
 
68 david 97
		arbreEntitesGeographiques = new TreePanel();
54 david 98
 
99
		this.setPaddings(5);
100
 
101
		this.setBorder(false);
102
		this.setCollapsible(true);
103
		this.setAutoWidth(true);
104
 
105
 
106
		// on ajoute les listeners
107
		ajouterListenersPanel();
108
		estInstancie = false;
109
	}
110
 
111
	/**
112
	 * Ajoute les listeners pour le rendu du panel
113
	 */
114
	private void ajouterListenersPanel() {
68 david 115
		  this.addListener(new PanelListenerAdapter() {
54 david 116
 
117
			// on instancie réellement les composants au moment du rendu pour
118
			// accélérer l'affichage
119
			// et éviter des bugs
120
			public void onRender(Component component) {
121
 
122
				// on interdit le drag and drop dans l'arbre
68 david 123
				arbreEntitesGeographiques.setEnableDD(false);
73 david 124
				arbreEntitesGeographiques.setId("x-view-tree-filter-entity");
72 david 125
				arbreEntitesGeographiques.setAutoWidth(false);
126
 
127
				if (GWT.isScript()) {
128
					arbreEntitesGeographiques.setAutoScroll(true);
129
				}
130
 
131
				arbreEntitesGeographiques.setBorder(false);
54 david 132
 
133
				// on crée une racine pour l'arbre
72 david 134
				TreeNode root = new TreeNode("Localités");
70 david 135
				root.setId("racine_entite");
72 david 136
				String[] usObject = { "Localités" };
54 david 137
				root.setUserObject(usObject);
138
 
68 david 139
				arbreEntitesGeographiques.setRootNode(root);
140
				arbreEntitesGeographiques.setRootVisible(true);
141
				arbreEntitesGeographiques.setBorder(false);
85 jpm 142
				root.setExpandable(true) ;
54 david 143
 
68 david 144
				add(arbreEntitesGeographiques);
54 david 145
 
146
				// on ajoute les listeners d'évenements
147
				ajouterListeners();
148
 
149
 
150
				// enfin on considère le composant comme instancié
151
				estInstancie = true;
152
 
68 david 153
 
54 david 154
			}
155
 
156
		});
157
	}
158
 
68 david 159
 
160
 
54 david 161
	/**
70 david 162
	 * ajoute les listeners pour les boutons et le cochage des entites
54 david 163
	 */
164
	private void ajouterListeners() {
85 jpm 165
 
166
		arbreEntitesGeographiques.addListener(new TreePanelListenerAdapter() {
167
 
168
			public void onClick(TreeNode node, EventObject e) {
169
 
86 jpm 170
				nomFiltre = "" ;
85 jpm 171
 
172
				switch(node.getDepth())
173
				{
174
					case 0:
175
						if(!arbreCharge)
176
						{
177
							observationMediateur.obtenirListeEntiteGeographique() ;
178
							arbreCharge = true ;
179
						}
86 jpm 180
						else
181
						{
182
							entitesGeographiquesEncours = "" ;
183
							observationMediateur.obtenirNombreObservation() ;
184
						}
85 jpm 185
						return ;
186
					case 1: nomFiltre = "id_location";
187
						break;
188
					case 2: nomFiltre = "location";
189
						break;
190
					case 3: nomFiltre = "lieudit";
191
						break;
192
					default:
193
						break;
194
				}
195
 
86 jpm 196
				if(node.getText().equals("Inconnue"))
197
				{
198
					entitesGeographiquesEncours = "000null" ;
199
				}
200
				else
201
				{
202
					entitesGeographiquesEncours = node.getText() ;
203
				}
204
				//Window.alert("Les entités sont : "+entitesGeographiquesEncours) ;
85 jpm 205
				filtreModifie = true ;
86 jpm 206
				observationMediateur.obtenirNombreObservation() ;
85 jpm 207
 
208
			}
209
 
210
		}) ;
54 david 211
	}
212
 
213
	/**
214
	 * Méthode héritée de l'interface rafraichissable
215
	 */
216
	public void rafraichir(Object nouvelleDonnees,
217
			boolean repandreRaffraichissement) {
218
 
219
 
68 david 220
		if (nouvelleDonnees instanceof ListeEntiteGeographiqueObservation) {
221
 
222
 
72 david 223
 
68 david 224
			String entite=null;
72 david 225
			String idEntite=null;
226
			String idParent=null;
68 david 227
 
228
			ListeEntiteGeographiqueObservation data = (ListeEntiteGeographiqueObservation) nouvelleDonnees ;
229
 
230
 
231
			if (data.isEmpty()) {
232
				// on crée un arbre vide
233
				TreeNode root = new TreeNode();
72 david 234
				root.setId("racine_entite");
235
				root.setText("Localités");
236
				String[] usObj = { "Localités"};
68 david 237
				root.setUserObject(usObj);
238
				donneeEntitesGeographiques.setRootNode(root);
239
 
240
			}
241
 
83 david 242
			// on la parse et on récupère les informations qui nous interessent
68 david 243
			for (Iterator<String> it= data.keySet().iterator(); it.hasNext();) {
244
 
245
				EntiteGeographiqueObservation ent=(EntiteGeographiqueObservation) data.get(it.next());
246
 
247
				entite=ent.getEntite();
73 david 248
 
85 jpm 249
				if(entite.contains("000null")) {
250
					entite="Inconnue" ;
251
				}
73 david 252
 
72 david 253
				idEntite=ent.getIdEntite();
254
				idParent=ent.getIdParent();
68 david 255
 
72 david 256
 
68 david 257
				String[] usObj = { entite };
258
 
259
					// et on construit l'arbre à partir de la racine (qui est
260
					// toujours le premier élément)
72 david 261
					if (entite.equals("racine_entite")) {
68 david 262
						TreeNode root = new TreeNode();
72 david 263
						root.setId(idEntite);
68 david 264
						root.setText(entite);
265
						root.setUserObject(usObj);
266
						donneeEntitesGeographiques.setRootNode(root);
267
					} else {
268
						// et en ajoutant les noeuds un à un (qui sont renvoyé
269
						// dans l'ordre hierarchique de leur niveau
270
						// ce qui permet de les traiter séquentiellement)
271
						TreeNode node = new TreeNode();
72 david 272
						node.setId(idEntite);
86 jpm 273
						node.setText(entite);
72 david 274
						Node parentNode = donneeEntitesGeographiques.getNodeById(idParent);
85 jpm 275
						if(parentNode != null)
276
						{
277
							node.setUserObject(usObj);
278
							parentNode.appendChild(node);
279
						}
68 david 280
					}
281
				}
282
 
283
			}
284
 
54 david 285
			// on vide tous les noeuds
68 david 286
			arbreEntitesGeographiques.getRootNode().eachChild(new NodeTraversalCallback() {
54 david 287
 
288
				public boolean execute(Node node) {
289
 
290
					node.remove();
291
					return true;
292
				}
293
 
294
			});
295
 
296
			// et on recopie le nouvel arbre
68 david 297
			copierFilsNoeud(donneeEntitesGeographiques.getRootNode(), arbreEntitesGeographiques
54 david 298
					.getRootNode());
299
 
300
			// si l'arbre n'était pas encore considéré comme instancié
301
			if (!estInstancie) {
302
				// on signale que oui
303
				estInstancie = true;
304
			}
305
 
306
			// l'état du filtre est réinitialisé
307
			filtreModifie = false;
70 david 308
			//show() ;
309
			doLayout();
68 david 310
	}
311
 
54 david 312
 
68 david 313
 
54 david 314
 
315
 
316
	/**
317
	 * Accesseur pour le panneau contenant l'arbre
318
	 *
319
	 * @return le panneau de l'arbre des mots clés
320
	 */
321
	public TreePanel getArbreMotsCles() {
68 david 322
		return arbreEntitesGeographiques;
54 david 323
	}
324
 
325
	/**
326
	 * Méthode héritée de Filtrable renvoie le nom du filtre
327
	 */
328
	public String renvoyerNomFiltre() {
329
 
330
		return "Localités";
331
	}
332
 
333
	/**
334
	 * Renvoie un tableau contenant le nom du champ à filtrer et la valeur
335
	 *
336
	 * @return un tableau contenant le nom du champ à filtrer et sa valeur
337
	 */
338
	public String[] renvoyerValeursAFiltrer() {
339
 
340
		valider();
85 jpm 341
 
86 jpm 342
		String valeursFiltrees[] = {nomFiltre, entitesGeographiquesEncours } ;
54 david 343
 
344
		return valeursFiltrees;
345
	}
346
 
347
	/**
348
	 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un
349
	 * copie du sous arbre du premier noeud, qu'elle concatène au deuxième
350
	 *
351
	 * @param ndPereOriginal
352
	 *            le père des noeuds de l'arbre original
353
	 * @param ndPereCopie
354
	 *            le père qui va recevoir les copies
355
	 */
356
	private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) {
357
		if (ndPereCopie != null && ndPereOriginal != null) {
358
			Node[] ndNodeFils = ndPereOriginal.getChildNodes();
359
 
360
			for (int i = 0; i < ndNodeFils.length; i++) {
361
 
362
				String[] usObj = (String[]) ndNodeFils[i].getUserObject();
363
				TreeNode child = new TreeNode(usObj[0]);
364
				child.setUserObject(usObj);
365
				ndPereCopie.appendChild(child);
366
 
367
				if (!ndNodeFils[i].isLeaf()) {
368
					copierFilsNoeud(ndNodeFils[i], child);
369
				}
370
 
371
			}
372
		}
373
	}
374
 
375
	/**
376
	 * Méthode héritée de Filtrable Renvoie l'état du filtre (modifié ou non)
377
	 */
378
	public boolean renvoyerEtatFiltre() {
379
 
380
		return filtreModifie;
381
	}
382
 
383
	public void valider() {
86 jpm 384
 
54 david 385
		if (estInstancie) {
86 jpm 386
 
54 david 387
		}
388
	}
389
 
390
}