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