Subversion Repositories eFlore/Applications.cel

Rev

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