Subversion Repositories eFlore/Applications.cel

Rev

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