Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
2 aperonnet 1
package org.tela_botanica.client.vues;
2
 
3
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.interfaces.Filtrable;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
155 aurelien 6
import org.tela_botanica.client.observation.ObservationMediateur;
2 aperonnet 7
 
678 aurelien 8
import com.google.gwt.user.client.Window;
155 aurelien 9
import com.gwtext.client.core.EventObject;
2 aperonnet 10
import com.gwtext.client.data.Node;
11
import com.gwtext.client.data.Tree;
12
import com.gwtext.client.widgets.Component;
13
import com.gwtext.client.widgets.Panel;
14
import com.gwtext.client.widgets.event.PanelListenerAdapter;
155 aurelien 15
import com.gwtext.client.widgets.layout.RowLayout;
16
import com.gwtext.client.widgets.layout.RowLayoutData;
678 aurelien 17
import com.gwtext.client.widgets.tree.MultiSelectionModel;
2 aperonnet 18
import com.gwtext.client.widgets.tree.TreeNode;
19
import com.gwtext.client.widgets.tree.TreePanel;
155 aurelien 20
import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
678 aurelien 21
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;
2 aperonnet 22
 
23
/**
5 aperonnet 24
 * fenêtre de recherche affichant l'arbre des mots clés en lecture et un bouton
2 aperonnet 25
 * cliquable
5 aperonnet 26
 *
2 aperonnet 27
 * @author aurelien
5 aperonnet 28
 *
2 aperonnet 29
 */
5 aperonnet 30
public class ArbreMotsClesFiltreVue extends Panel implements Rafraichissable,
31
		Filtrable {
2 aperonnet 32
 
33
	/**
34
	 * Le médiateur associé à la vue
35
	 */
5 aperonnet 36
	private ImageMediateur iMediateur = null;
155 aurelien 37
 
2 aperonnet 38
	/**
155 aurelien 39
	 * Le médiateur associé à la vue
40
	 */
41
	private ObservationMediateur oMediateur = null;
42
 
43
	/**
2 aperonnet 44
	 * Les mots clés en cours
45
	 */
5 aperonnet 46
	private String motsClesEncours = "";
47
 
2 aperonnet 48
	/**
49
	 * Le treepanel qui affiche l'arbre
50
	 */
155 aurelien 51
	private static TreePanel arbreMotsCles = null;
5 aperonnet 52
 
2 aperonnet 53
	/**
54
	 * booléen d'initialisation
55
	 */
5 aperonnet 56
	private boolean estInstancie = false;
155 aurelien 57
 
58
	private boolean arbreInitialise = false;
5 aperonnet 59
 
2 aperonnet 60
	/**
61
	 * booléen d'etat
62
	 */
5 aperonnet 63
	private boolean filtreModifie = false;
155 aurelien 64
 
65
	/**
66
	 * prefixe pour générer des ids adaptées
67
	 */
68
	private String prefixe = "_filtre" ;
69
 
70
	private final String prefixeImg = "_images" ;
71
 
72
	private final String prefixeObs = "_obs" ;
5 aperonnet 73
 
2 aperonnet 74
	/**
75
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
76
	 */
77
	@SuppressWarnings("unused")
5 aperonnet 78
	private ArbreMotsClesFiltreVue() {
79
		super();
2 aperonnet 80
	}
5 aperonnet 81
 
2 aperonnet 82
	/**
83
	 * Constructeur avec paramètres
5 aperonnet 84
	 *
85
	 * @param im
86
	 *            le médiateur à associer
2 aperonnet 87
	 */
5 aperonnet 88
	public ArbreMotsClesFiltreVue(ImageMediateur im) {
89
 
2 aperonnet 90
		// on crée le panel
5 aperonnet 91
		super();
92
		iMediateur = im;
155 aurelien 93
		this.prefixe += prefixeImg;
94
		initialiserPanel();
95
	}
96
 
97
	/**
98
	 * Constructeur avec paramètres
99
	 *
100
	 * @param im
101
	 *            le médiateur à associer
102
	 */
103
	public ArbreMotsClesFiltreVue(ObservationMediateur om) {
5 aperonnet 104
 
155 aurelien 105
		// on crée le panel
106
		super();
107
		oMediateur = om;
108
		this.prefixe += prefixeObs;
109
		initialiserPanel();
110
 
111
		this.setLayout(new RowLayout());
112
 
113
	}
114
 
115
	public void initialiserPanel() {
2 aperonnet 116
		// on crée le conteneur de l'arbre
5 aperonnet 117
		arbreMotsCles = new TreePanel();
155 aurelien 118
		arbreMotsCles.setId("x-view-tree-filter"+prefixe);
5 aperonnet 119
 
678 aurelien 120
		MultiSelectionModel msModel = new MultiSelectionModel();
121
		arbreMotsCles.setSelectionModel(msModel);
122
 
77 jpm 123
		// on crée une racine pour l'arbre
124
		TreeNode root = new TreeNode("Tags");
155 aurelien 125
		root.setId("racine"+prefixe);
352 aurelien 126
		String[] usObject = { "Mots clés", "racine"+prefixe };
77 jpm 127
		root.setUserObject(usObject);
155 aurelien 128
 
129
		root.setExpandable(true);
130
 
77 jpm 131
		arbreMotsCles.setRootNode(root);
132
 
155 aurelien 133
		arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() {
134
 
135
			public void onClick(Node node, EventObject e) {
136
				if(!arbreInitialise) {
137
					expand();
138
				}
139
			}
140
 
141
			public void onExpand(Node node) {
142
				if(!arbreInitialise) {
143
					obtenirArbreMotsCles();
144
					arbreInitialise = true;
145
				}
146
			}
147
 
148
		});
149
 
5 aperonnet 150
		this.setPaddings(5);
151
 
152
		this.setBorder(false);
153
		this.setCollapsible(true);
154
		this.setAutoWidth(true);
155
 
2 aperonnet 156
		// on ajoute les listeners
5 aperonnet 157
		ajouterListenersPanel();
158
		estInstancie = false;
2 aperonnet 159
	}
5 aperonnet 160
 
2 aperonnet 161
	/**
162
	 * Ajoute les listeners pour le rendu du panel
163
	 */
5 aperonnet 164
	private void ajouterListenersPanel() {
2 aperonnet 165
		this.addListener(new PanelListenerAdapter() {
166
 
5 aperonnet 167
			// on instancie réellement les composants au moment du rendu pour
168
			// accélérer l'affichage
2 aperonnet 169
			// et éviter des bugs
170
			public void onRender(Component component) {
5 aperonnet 171
 
2 aperonnet 172
				// on interdit le drag and drop dans l'arbre
5 aperonnet 173
				arbreMotsCles.setEnableDD(false);
174
				arbreMotsCles.setAutoWidth(false);
175
				arbreMotsCles.setAutoScroll(true);
176
				arbreMotsCles.setBorder(false);
177
 
155 aurelien 178
				// on met en forme le layout
179
				((Panel) component).add(arbreMotsCles,new RowLayoutData("80%"));
180
 
2 aperonnet 181
				// on ajoute les listeners d'évenements
5 aperonnet 182
				ajouterListeners();
155 aurelien 183
				//obtenirArbreMotsCles();
2 aperonnet 184
			}
155 aurelien 185
 
5 aperonnet 186
		});
2 aperonnet 187
	}
5 aperonnet 188
 
2 aperonnet 189
	/**
190
	 * ajoute les listeners pour les boutons et le cochage des mots clés
5 aperonnet 191
	 */
192
	private void ajouterListeners() {
678 aurelien 193
		arbreMotsCles.addListener(new TreePanelListenerAdapter() {
194
 
195
			// gestion du clic sur un noeud
196
			public void onClick(TreeNode node, EventObject e) {
197
 
198
				e.stopEvent();
199
 
200
				boolean multi = false;
201
				if(e.hasModifier()) {
202
					multi = true;
203
				}
204
				gererClicNoeud(node,multi);
205
			}
206
		});
207
	}
208
 
209
	/**
210
	 * Fonction de gestion sur le clic sur le noeud
211
	 *
212
	 * @param node
213
	 */
214
	public void gererClicNoeud(TreeNode node, boolean multi) {
135 aurelien 215
 
678 aurelien 216
		if(!arbreInitialise) {
217
			obtenirArbreMotsCles();
218
		} else {
219
			if(node.equals(arbreMotsCles.getRootNode())) {
220
				arbreMotsCles.getSelectionModel().clearSelections();
221
			} else {
222
				((MultiSelectionModel)arbreMotsCles.getSelectionModel()).select(node, multi);
223
			}
224
			filtreModifie = true;
225
			iMediateur.obtenirPhotoGalerie();
226
		}
2 aperonnet 227
	}
5 aperonnet 228
 
2 aperonnet 229
	/**
230
	 * Méthode héritée de l'interface rafraichissable
231
	 */
232
	public void rafraichir(Object nouvelleDonnees,
233
			boolean repandreRaffraichissement) {
5 aperonnet 234
 
2 aperonnet 235
		// si on a reçu un arbre
5 aperonnet 236
		if (nouvelleDonnees instanceof Tree) {
237
			Tree nouvelArbre = (Tree) nouvelleDonnees;
155 aurelien 238
 
135 aurelien 239
			// on vide tous les noeuds de l'ancien arbre
240
			Node[] rootChild = arbreMotsCles.getRootNode().getChildNodes();
241
			for (int i = 0; i < rootChild.length; i++) {
242
 
243
				rootChild[i].remove();
244
			}
5 aperonnet 245
 
246
			// et on recopie le nouvel arbre
247
			copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles
248
					.getRootNode());
249
 
250
			// si l'arbre n'était pas encore considéré comme instancié
251
			if (!estInstancie) {
252
				// on signale que oui
253
				estInstancie = true;
254
			}
135 aurelien 255
 
155 aurelien 256
			if(!arbreInitialise) {
257
				arbreInitialise = true;
258
			}
259
 
135 aurelien 260
			arbreMotsCles.setRootNode(arbreMotsCles.getRootNode());
5 aperonnet 261
 
262
			// l'état du filtre est réinitialisé
263
			filtreModifie = false;
155 aurelien 264
			doLayout() ;
2 aperonnet 265
		}
266
	}
5 aperonnet 267
 
2 aperonnet 268
	/**
269
	 * Accesseur pour le médiateur
5 aperonnet 270
	 *
2 aperonnet 271
	 * @return le médiateur associé
272
	 */
5 aperonnet 273
	public ImageMediateur getIMediateur() {
274
		return iMediateur;
2 aperonnet 275
	}
155 aurelien 276
 
277
	public ObservationMediateur getOMediateur() {
278
		return oMediateur ;
279
	}
5 aperonnet 280
 
2 aperonnet 281
	/**
282
	 * Accesseur pour le panneau contenant l'arbre
5 aperonnet 283
	 *
2 aperonnet 284
	 * @return le panneau de l'arbre des mots clés
285
	 */
5 aperonnet 286
	public TreePanel getArbreMotsCles() {
287
		return arbreMotsCles;
2 aperonnet 288
	}
5 aperonnet 289
 
2 aperonnet 290
	/**
5 aperonnet 291
	 * Méthode héritée de Filtrable renvoie le nom du filtre
2 aperonnet 292
	 */
293
	public String renvoyerNomFiltre() {
5 aperonnet 294
 
295
		return "mots clés";
2 aperonnet 296
	}
5 aperonnet 297
 
2 aperonnet 298
	/**
299
	 * Renvoie un tableau contenant le nom du champ à filtrer et la valeur
5 aperonnet 300
	 *
2 aperonnet 301
	 * @return un tableau contenant le nom du champ à filtrer et sa valeur
302
	 */
303
	public String[] renvoyerValeursAFiltrer() {
155 aurelien 304
 
678 aurelien 305
		String val = "";
306
 
307
		TreeNode[] noeuds = ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).getSelectedNodes();
308
 
309
		for(int i = 0; i< noeuds.length ; i++) {
310
			if(noeuds[i].getDepth() > 0) {
311
 
312
				String[] userObj = (String[])noeuds[i].getUserObject();
313
				String idMotCle = noeuds[i].getId();
314
 
315
				if(userObj != null && userObj[1] != null) {
316
					idMotCle = userObj[1];
317
				}
318
 
319
				val += ";"+idMotCle;
320
			}
155 aurelien 321
		}
678 aurelien 322
 
323
		val = val.replaceFirst(";", "");
324
 
325
		String[] valeursFiltres = {"ci_meta_mots_cles", val};
5 aperonnet 326
 
678 aurelien 327
		return valeursFiltres;
2 aperonnet 328
	}
5 aperonnet 329
 
2 aperonnet 330
	/**
5 aperonnet 331
	 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un
332
	 * copie du sous arbre du premier noeud, qu'elle concatène au deuxième
333
	 *
334
	 * @param ndPereOriginal
335
	 *            le père des noeuds de l'arbre original
336
	 * @param ndPereCopie
337
	 *            le père qui va recevoir les copies
2 aperonnet 338
	 */
5 aperonnet 339
	private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) {
340
		if (ndPereCopie != null && ndPereOriginal != null) {
341
			Node[] ndNodeFils = ndPereOriginal.getChildNodes();
135 aurelien 342
 
2 aperonnet 343
			for (int i = 0; i < ndNodeFils.length; i++) {
5 aperonnet 344
 
345
				String[] usObj = (String[]) ndNodeFils[i].getUserObject();
346
				TreeNode child = new TreeNode(usObj[0]);
155 aurelien 347
				child.setId(usObj[1] +prefixe);
5 aperonnet 348
				child.setUserObject(usObj);
349
				ndPereCopie.appendChild(child);
350
 
351
				if (!ndNodeFils[i].isLeaf()) {
352
					copierFilsNoeud(ndNodeFils[i], child);
2 aperonnet 353
				}
5 aperonnet 354
 
2 aperonnet 355
			}
356
		}
357
	}
358
 
359
	/**
5 aperonnet 360
	 * Méthode héritée de Filtrable Renvoie l'état du filtre (modifié ou non)
2 aperonnet 361
	 */
362
	public boolean renvoyerEtatFiltre() {
5 aperonnet 363
 
364
		return filtreModifie;
2 aperonnet 365
	}
155 aurelien 366
 
367
	public void mettreAJourMotsCles(String valeur, String id) {
368
		if(getIMediateur() != null) {
369
			getIMediateur().mettreAjourMotsClesId(valeur,
370
				id);
371
		}
372
		else
373
		{
374
			getOMediateur().mettreAjourMotsClesId(valeur, id);
375
		}
376
	}
377
 
378
	public void obtenirArbreMotsCles() {
379
		if(getIMediateur() != null) {
380
			getIMediateur().obtenirArbreMotsCles(this);
381
		}
382
		else
383
		{
384
			getOMediateur().obtenirArbreMotsCles(this);
385
		}
386
	}
5 aperonnet 387
 
388
	public void valider() {
389
		if (estInstancie) {
2 aperonnet 390
			// on vide les mots clés en cours
5 aperonnet 391
			motsClesEncours = "";
678 aurelien 392
 
393
 
5 aperonnet 394
 
2 aperonnet 395
			// on suppose que le filtre a change
5 aperonnet 396
			filtreModifie = true;
2 aperonnet 397
		}
398
	}
399
 
155 aurelien 400
	public void raz() {
401
 
268 aurelien 402
		if(arbreInitialise) {
403
			// on vide tous les noeuds de l'ancien arbre
404
			Node[] rootChild = arbreMotsCles.getRootNode().getChildNodes();
405
			for (int i = 0; i < rootChild.length; i++) {
406
 
407
				rootChild[i].remove();
408
			}
155 aurelien 409
 
268 aurelien 410
			arbreInitialise = false ;
411
 
412
			// on crée une racine pour l'arbre
413
			TreeNode root = new TreeNode("Tags");
414
			root.setId("racine"+prefixe);
352 aurelien 415
			String[] usObject = { "Mots clés", "racine"+prefixe };
268 aurelien 416
			root.setUserObject(usObject);
417
 
418
			root.setExpandable(true);
419
 
420
			arbreMotsCles.setRootNode(root);
421
 
422
			arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() {
423
 
424
				public void onClick(Node node, EventObject e) {
425
					if(!arbreInitialise) {
426
						expand();
427
					}
155 aurelien 428
				}
268 aurelien 429
 
430
				public void onExpand(Node node) {
431
					if(!arbreInitialise) {
432
						obtenirArbreMotsCles();
433
						arbreInitialise = true;
434
					}
155 aurelien 435
				}
268 aurelien 436
			});
437
		}
155 aurelien 438
	}
439
 
678 aurelien 440
	public void viderFiltre() {
441
		motsClesEncours = "";
442
		arbreMotsCles.getSelectionModel().clearSelections();
443
	}
444
 
2 aperonnet 445
}