Subversion Repositories eFlore/Applications.cel

Rev

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