Subversion Repositories eFlore/Applications.cel

Rev

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;
2042 aurelien 7
import org.tela_botanica.client.util.MotsClesUtilitaire;
2 aperonnet 8
 
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
 
1291 aurelien 135
			@Override
155 aurelien 136
			public void onClick(Node node, EventObject e) {
137
				if(!arbreInitialise) {
138
					expand();
139
				}
140
			}
141
 
1291 aurelien 142
			@Override
155 aurelien 143
			public void onExpand(Node node) {
144
				if(!arbreInitialise) {
145
					obtenirArbreMotsCles();
146
					arbreInitialise = true;
147
				}
148
			}
149
 
150
		});
151
 
5 aperonnet 152
		this.setPaddings(5);
153
 
154
		this.setBorder(false);
155
		this.setCollapsible(true);
156
		this.setAutoWidth(true);
157
 
2 aperonnet 158
		// on ajoute les listeners
5 aperonnet 159
		ajouterListenersPanel();
160
		estInstancie = false;
2 aperonnet 161
	}
5 aperonnet 162
 
2 aperonnet 163
	/**
164
	 * Ajoute les listeners pour le rendu du panel
165
	 */
5 aperonnet 166
	private void ajouterListenersPanel() {
2 aperonnet 167
		this.addListener(new PanelListenerAdapter() {
168
 
5 aperonnet 169
			// on instancie réellement les composants au moment du rendu pour
170
			// accélérer l'affichage
2 aperonnet 171
			// et éviter des bugs
1291 aurelien 172
			@Override
2 aperonnet 173
			public void onRender(Component component) {
5 aperonnet 174
 
2 aperonnet 175
				// on interdit le drag and drop dans l'arbre
5 aperonnet 176
				arbreMotsCles.setEnableDD(false);
177
				arbreMotsCles.setAutoWidth(false);
178
				arbreMotsCles.setAutoScroll(true);
179
				arbreMotsCles.setBorder(false);
180
 
155 aurelien 181
				// on met en forme le layout
182
				((Panel) component).add(arbreMotsCles,new RowLayoutData("80%"));
183
 
2 aperonnet 184
				// on ajoute les listeners d'évenements
5 aperonnet 185
				ajouterListeners();
155 aurelien 186
				//obtenirArbreMotsCles();
2 aperonnet 187
			}
155 aurelien 188
 
5 aperonnet 189
		});
2 aperonnet 190
	}
5 aperonnet 191
 
2 aperonnet 192
	/**
193
	 * ajoute les listeners pour les boutons et le cochage des mots clés
5 aperonnet 194
	 */
195
	private void ajouterListeners() {
678 aurelien 196
		arbreMotsCles.addListener(new TreePanelListenerAdapter() {
197
 
198
			// gestion du clic sur un noeud
1291 aurelien 199
			@Override
678 aurelien 200
			public void onClick(TreeNode node, EventObject e) {
201
 
202
				e.stopEvent();
203
 
204
				boolean multi = false;
205
				if(e.hasModifier()) {
206
					multi = true;
207
				}
208
				gererClicNoeud(node,multi);
209
			}
210
		});
211
	}
212
 
213
	/**
214
	 * Fonction de gestion sur le clic sur le noeud
215
	 *
216
	 * @param node
217
	 */
218
	public void gererClicNoeud(TreeNode node, boolean multi) {
135 aurelien 219
 
678 aurelien 220
		if(!arbreInitialise) {
221
			obtenirArbreMotsCles();
222
		} else {
223
			if(node.equals(arbreMotsCles.getRootNode())) {
224
				arbreMotsCles.getSelectionModel().clearSelections();
225
			} else {
226
				((MultiSelectionModel)arbreMotsCles.getSelectionModel()).select(node, multi);
227
			}
228
			filtreModifie = true;
229
			iMediateur.obtenirPhotoGalerie();
230
		}
2 aperonnet 231
	}
5 aperonnet 232
 
2 aperonnet 233
	/**
234
	 * Méthode héritée de l'interface rafraichissable
235
	 */
1291 aurelien 236
	@Override
2 aperonnet 237
	public void rafraichir(Object nouvelleDonnees,
238
			boolean repandreRaffraichissement) {
5 aperonnet 239
 
2 aperonnet 240
		// si on a reçu un arbre
5 aperonnet 241
		if (nouvelleDonnees instanceof Tree) {
242
			Tree nouvelArbre = (Tree) nouvelleDonnees;
155 aurelien 243
 
135 aurelien 244
			// on vide tous les noeuds de l'ancien arbre
245
			Node[] rootChild = arbreMotsCles.getRootNode().getChildNodes();
246
			for (int i = 0; i < rootChild.length; i++) {
247
 
248
				rootChild[i].remove();
249
			}
5 aperonnet 250
 
251
			// et on recopie le nouvel arbre
2042 aurelien 252
			MotsClesUtilitaire.copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles
5 aperonnet 253
					.getRootNode());
254
 
255
			// si l'arbre n'était pas encore considéré comme instancié
256
			if (!estInstancie) {
257
				// on signale que oui
258
				estInstancie = true;
259
			}
135 aurelien 260
 
155 aurelien 261
			if(!arbreInitialise) {
262
				arbreInitialise = true;
263
			}
264
 
135 aurelien 265
			arbreMotsCles.setRootNode(arbreMotsCles.getRootNode());
5 aperonnet 266
 
267
			// l'état du filtre est réinitialisé
268
			filtreModifie = false;
155 aurelien 269
			doLayout() ;
2 aperonnet 270
		}
271
	}
5 aperonnet 272
 
2 aperonnet 273
	/**
274
	 * Accesseur pour le médiateur
5 aperonnet 275
	 *
2 aperonnet 276
	 * @return le médiateur associé
277
	 */
5 aperonnet 278
	public ImageMediateur getIMediateur() {
279
		return iMediateur;
2 aperonnet 280
	}
155 aurelien 281
 
282
	public ObservationMediateur getOMediateur() {
283
		return oMediateur ;
284
	}
5 aperonnet 285
 
2 aperonnet 286
	/**
287
	 * Accesseur pour le panneau contenant l'arbre
5 aperonnet 288
	 *
2 aperonnet 289
	 * @return le panneau de l'arbre des mots clés
290
	 */
5 aperonnet 291
	public TreePanel getArbreMotsCles() {
292
		return arbreMotsCles;
2 aperonnet 293
	}
5 aperonnet 294
 
2 aperonnet 295
	/**
5 aperonnet 296
	 * Méthode héritée de Filtrable renvoie le nom du filtre
2 aperonnet 297
	 */
1291 aurelien 298
	@Override
2 aperonnet 299
	public String renvoyerNomFiltre() {
5 aperonnet 300
 
301
		return "mots clés";
2 aperonnet 302
	}
5 aperonnet 303
 
2 aperonnet 304
	/**
305
	 * Renvoie un tableau contenant le nom du champ à filtrer et la valeur
5 aperonnet 306
	 *
2 aperonnet 307
	 * @return un tableau contenant le nom du champ à filtrer et sa valeur
308
	 */
1291 aurelien 309
	@Override
2 aperonnet 310
	public String[] renvoyerValeursAFiltrer() {
155 aurelien 311
 
678 aurelien 312
		String val = "";
313
 
314
		TreeNode[] noeuds = ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).getSelectedNodes();
315
 
316
		for(int i = 0; i< noeuds.length ; i++) {
317
			if(noeuds[i].getDepth() > 0) {
318
 
319
				String[] userObj = (String[])noeuds[i].getUserObject();
320
				String idMotCle = noeuds[i].getId();
321
 
322
				if(userObj != null && userObj[1] != null) {
323
					idMotCle = userObj[1];
324
				}
325
 
326
				val += ";"+idMotCle;
327
			}
155 aurelien 328
		}
678 aurelien 329
 
330
		val = val.replaceFirst(";", "");
331
 
965 aurelien 332
		String[] valeursFiltres = {"id_mots_cles", val};
5 aperonnet 333
 
678 aurelien 334
		return valeursFiltres;
2 aperonnet 335
	}
5 aperonnet 336
 
2 aperonnet 337
	/**
5 aperonnet 338
	 * Méthode héritée de Filtrable Renvoie l'état du filtre (modifié ou non)
2 aperonnet 339
	 */
1291 aurelien 340
	@Override
2 aperonnet 341
	public boolean renvoyerEtatFiltre() {
5 aperonnet 342
 
343
		return filtreModifie;
2 aperonnet 344
	}
155 aurelien 345
 
346
	public void mettreAJourMotsCles(String valeur, String id) {
347
		if(getIMediateur() != null) {
348
			getIMediateur().mettreAjourMotsClesId(valeur,
349
				id);
350
		}
351
		else
352
		{
353
			getOMediateur().mettreAjourMotsClesId(valeur, id);
354
		}
355
	}
356
 
357
	public void obtenirArbreMotsCles() {
358
		if(getIMediateur() != null) {
359
			getIMediateur().obtenirArbreMotsCles(this);
360
		}
361
		else
362
		{
363
			getOMediateur().obtenirArbreMotsCles(this);
364
		}
365
	}
5 aperonnet 366
 
1291 aurelien 367
	@Override
5 aperonnet 368
	public void valider() {
369
		if (estInstancie) {
2 aperonnet 370
			// on vide les mots clés en cours
5 aperonnet 371
			motsClesEncours = "";
2 aperonnet 372
			// on suppose que le filtre a change
5 aperonnet 373
			filtreModifie = true;
2 aperonnet 374
		}
375
	}
376
 
155 aurelien 377
	public void raz() {
378
 
268 aurelien 379
		if(arbreInitialise) {
380
			// on vide tous les noeuds de l'ancien arbre
381
			Node[] rootChild = arbreMotsCles.getRootNode().getChildNodes();
382
			for (int i = 0; i < rootChild.length; i++) {
383
 
384
				rootChild[i].remove();
385
			}
155 aurelien 386
 
268 aurelien 387
			arbreInitialise = false ;
388
 
389
			// on crée une racine pour l'arbre
390
			TreeNode root = new TreeNode("Tags");
391
			root.setId("racine"+prefixe);
352 aurelien 392
			String[] usObject = { "Mots clés", "racine"+prefixe };
268 aurelien 393
			root.setUserObject(usObject);
394
 
395
			root.setExpandable(true);
396
 
397
			arbreMotsCles.setRootNode(root);
398
 
399
			arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() {
400
 
1291 aurelien 401
				@Override
268 aurelien 402
				public void onClick(Node node, EventObject e) {
403
					if(!arbreInitialise) {
404
						expand();
405
					}
155 aurelien 406
				}
268 aurelien 407
 
1291 aurelien 408
				@Override
268 aurelien 409
				public void onExpand(Node node) {
410
					if(!arbreInitialise) {
411
						obtenirArbreMotsCles();
412
						arbreInitialise = true;
413
					}
155 aurelien 414
				}
268 aurelien 415
			});
416
		}
155 aurelien 417
	}
418
 
1291 aurelien 419
	@Override
678 aurelien 420
	public void viderFiltre() {
421
		motsClesEncours = "";
422
		arbreMotsCles.getSelectionModel().clearSelections();
423
	}
424
 
2 aperonnet 425
}