Subversion Repositories eFlore/Applications.cel

Rev

Rev 798 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
199 david 1
package org.tela_botanica.client.vues.observation.filtres;
318 aurelien 2
import org.tela_botanica.client.interfaces.Filtrable;
155 aurelien 3
import org.tela_botanica.client.interfaces.Rafraichissable;
4
import org.tela_botanica.client.observation.ObservationMediateur;
5
 
6
import com.google.gwt.user.client.Window;
7
import com.gwtext.client.core.EventObject;
8
import com.gwtext.client.data.Node;
9
import com.gwtext.client.data.NodeTraversalCallback;
10
import com.gwtext.client.data.Tree;
318 aurelien 11
import com.gwtext.client.dd.DragData;
12
import com.gwtext.client.dd.DragDrop;
13
import com.gwtext.client.dd.DropTargetConfig;
155 aurelien 14
import com.gwtext.client.widgets.Button;
318 aurelien 15
import com.gwtext.client.widgets.Component;
155 aurelien 16
import com.gwtext.client.widgets.Panel;
17
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
318 aurelien 18
import com.gwtext.client.widgets.event.PanelListenerAdapter;
155 aurelien 19
import com.gwtext.client.widgets.form.TextField;
20
import com.gwtext.client.widgets.layout.VerticalLayout;
339 aurelien 21
import com.gwtext.client.widgets.menu.BaseItem;
22
import com.gwtext.client.widgets.menu.Item;
23
import com.gwtext.client.widgets.menu.Menu;
24
import com.gwtext.client.widgets.menu.event.MenuListenerAdapter;
318 aurelien 25
import com.gwtext.client.widgets.tree.DropNodeCallback;
26
import com.gwtext.client.widgets.tree.MultiSelectionModel;
27
import com.gwtext.client.widgets.tree.TreeDragData;
155 aurelien 28
import com.gwtext.client.widgets.tree.TreeEditor;
29
import com.gwtext.client.widgets.tree.TreeNode;
30
import com.gwtext.client.widgets.tree.TreePanel;
31
import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
32
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;
33
 
318 aurelien 34
public class ArbreMotsClesObservationVue extends Panel implements Rafraichissable, Filtrable {
155 aurelien 35
 
36
		/**
37
		 * Le médiateur associé à la vue
38
		 */
39
		private ObservationMediateur oMediateur = null;
40
 
41
		/**
42
		 * Le treepanel qui affiche l'arbre
43
		 */
44
		private static TreePanel arbreMotsCles = null;
45
		/**
46
		 * L'éditeur qui permet de modifier les mots clés dans l'arbre
47
		 */
48
		private TreeEditor te = null;
49
		/**
50
		 * Le textfield associé à l'éditeur
51
		 */
52
		private TextField tfEdit = null;
53
		/**
54
		 * Bouton de validation
55
		 */
318 aurelien 56
		private Button ajouterMotCle = null;
155 aurelien 57
		/**
58
		 * Une string permettant connaitre les mots clés cochés en cours séparés par
59
		 * des virgules
60
		 */
61
		private String motsClesEnCours = "";
62
		/**
63
		 * Tableau contenant les mots clés qui n'ont pas encore été jaouté à l'arbre
64
		 * (sert au lazy rendering quand on reçoit des mots clés avant que le rendu
65
		 * du conteneur n'ai été effectué)
66
		 */
67
		private String[] motsClesEnAttente = new String[0];
68
		/**
69
		 * Booléen d'évènement qui sert à savoir si on est en train d'ajouter un
70
		 * noeud
71
		 */
72
		private boolean ajoutNoeud = false;
73
		/**
74
		 * Booléen d'évènement qui sert à savoir si on est en train de modifier un
75
		 * noeud
76
		 */
77
		private boolean modifNoeud = false;
78
		/**
79
		 * Booléen d'instanciation du conteneur
80
		 */
81
		private boolean arbreCharge = false;
318 aurelien 82
 
155 aurelien 83
		/**
318 aurelien 84
		 * Booléen nécessaire pour l'affichage
85
		 *
86
		 */
87
		private boolean estInstancie = false;
88
 
89
		/**
155 aurelien 90
		 * Booléen d'évènement qui sert à savoir si les mots clés ont bien été reçu
91
		 */
92
		private boolean motsCleInitialises;
318 aurelien 93
 
94
		private Component livue = null;
335 aurelien 95
 
96
		MultiSelectionModel msModel = null;
155 aurelien 97
 
98
		/**
99
		 * Constructeur sans paramètre (privé car interdit d'utilisation)
100
		 */
101
		@SuppressWarnings("unused")
195 david 102
		private ArbreMotsClesObservationVue() {
155 aurelien 103
			super();
104
		}
105
 
106
		/**
107
		 * Constructeur avec paramètre
108
		 *
109
		 * @param im
110
		 *            le médiateur à associer
111
		 */
195 david 112
		public ArbreMotsClesObservationVue(ObservationMediateur om) {
155 aurelien 113
			// on crée le panel
339 aurelien 114
			super("Projets");
318 aurelien 115
 
155 aurelien 116
			this.setLayout(new VerticalLayout());
117
			oMediateur = om;
318 aurelien 118
 
119
			setBorder(false);
120
			setCollapsible(true);
121
			setTitleCollapse(true);
355 aurelien 122
			setAutoScroll(true);
1254 aurelien 123
 
318 aurelien 124
			// on ajoute les listeners
125
			ajouterListenersPanel();
155 aurelien 126
 
318 aurelien 127
		}
128
 
129
		/**
130
		 * Ajoute les listeners pour le rendu du panel
131
		 */
132
		private void ajouterListenersPanel() {
133
			  this.addListener(new PanelListenerAdapter() {
155 aurelien 134
 
318 aurelien 135
				// on instancie réellement les composants au moment du rendu pour
136
				// accélérer l'affichage
137
				// et éviter des bugs
138
				public void onRender(Component component) {
139
 
140
					livue = oMediateur.getListeObservation();
141
 
142
					// on crée le conteneur de l'arbre
143
					arbreMotsCles = new TreePanel();
144
					// on permet le drag and drop dans l'arbre
145
					//arbreMotsCles.setEnableDD(true);
146
					arbreMotsCles.setId("x-view-tree-keyword-obs");
147
 
148
 
335 aurelien 149
					msModel = new MultiSelectionModel();
318 aurelien 150
					arbreMotsCles.setSelectionModel(msModel);
155 aurelien 151
 
318 aurelien 152
					// on crée une racine pour l'arbre
339 aurelien 153
					TreeNode root = new TreeNode("Projets");
318 aurelien 154
					root.setId("racine_obs");
339 aurelien 155
					String[] usObject = { "Projets", "racine_obs" };
318 aurelien 156
					root.setUserObject(usObject);
157
					root.setExpandable(true);
158
 
159
					arbreMotsCles.setRootNode(root);
160
 
161
					// on crée l'éditeur pour l'arbre
162
					tfEdit = new TextField();
163
					te = new TreeEditor(arbreMotsCles, tfEdit);
339 aurelien 164
					ajouterMotCle = new Button("Ajouter un projet");
318 aurelien 165
					arbreMotsCles.add(te);
166
 
167
					arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() {
168
						public void onClick(Node node, EventObject e) {
169
							if(!arbreCharge) {
170
								expand();
171
							}
172
						}
155 aurelien 173
 
318 aurelien 174
						public void onExpand(Node node) {
175
							if(!arbreCharge) {
176
								obtenirArbreMotsCles();
177
								arbreCharge = true;
178
							}
179
						}
180
					});
155 aurelien 181
 
318 aurelien 182
					// on interdit le drag and drop dans l'arbre
183
					arbreMotsCles.setRootVisible(true);
184
					arbreMotsCles.setBorder(false);
185
 
186
					// on met en forme le layout
187
					add(arbreMotsCles);
188
					add(ajouterMotCle);
155 aurelien 189
 
318 aurelien 190
					// enfin on considère le composant comme instancié
191
					estInstancie = true;
192
 
193
					configDragAndDrop();
194
 
195
					// on ajoute les listeners d'évenements
196
					ajouterListeners();
197
				}
198
 
199
			});
155 aurelien 200
		}
201
 
202
		/**
203
		 * Acesseur pour le médiateur
204
		 *
205
		 * @return le médiateur associé à la vue
206
		 */
207
		private ObservationMediateur getOMediateur() {
208
 
209
			return oMediateur;
210
 
211
		}
212
 
213
		/**
214
		 * Acesseur pour l'arbre des mots clés
215
		 *
216
		 * @return le panel contenant l'arbre
217
		 */
218
		public TreePanel getArbreMotsCles() {
219
			return arbreMotsCles;
220
		}
221
 
222
		/**
223
		 * Accesseur pour l'éditeur
224
		 *
225
		 * @return l'éditeur associé à l'arbre
226
		 */
227
		public TreeEditor getTe() {
228
			return te;
229
		}
230
 
231
		/**
232
		 * Acesseur pour le TextField associé à l'éditeur
233
		 *
234
		 * @return le champ texte associé à l'éditeur
235
		 */
236
		public TextField getTfEdit() {
237
			return tfEdit;
238
		}
239
 
240
		/**
241
		 * Ajoute les listeners nécessaires pour la gestion des évènements
242
		 */
243
		private void ajouterListeners() {
244
			arbreMotsCles.addListener(new TreePanelListenerAdapter() {
245
 
246
				// gestion du clic sur un noeud
247
				public void onClick(TreeNode node, EventObject e) {
248
 
249
					e.stopEvent();
318 aurelien 250
					boolean multi = false;
251
					if(e.hasModifier()) {
252
						multi = true;
253
					}
254
					gererClicNoeud(node,multi);
155 aurelien 255
				}
256
 
257
				// gestion du clic droit sur un noeud
258
				public void onContextMenu(TreeNode node, EventObject e) {
259
 
260
					e.stopEvent();
339 aurelien 261
					montrerContextMenuArbre(node, e, getTe());
155 aurelien 262
 
263
				}
264
 
265
				// gestion du double clic sur un noeud
266
				public void onDblClick(TreeNode node, EventObject e) {
267
 
268
					modifNoeud = true;
269
					if (!node.getId().equals("racine_obs")) {
270
						te.startEdit(node);
271
					}
272
				}
273
 
274
				// gestion de la modification du texte d'un noeud
275
				public void onTextChange(TreeNode node, String text, String oldText) {
276
 
277
					// on récupère les informations associées au noeud
278
					TreeNode nd = node;
279
					String[] usObject = new String[2];
280
					usObject[0] = text;
281
					usObject[1] = ((String[]) nd.getUserObject())[1];
282
					nd.setUserObject(usObject);
283
 
284
					// si c'est un nouveau noeud
285
					if (ajoutNoeud) {
286
						// on notifie le médiateur de l'ajout et on lui passe
287
						// l'arbre
288
						getOMediateur().ajouterMotCleDansArbre(nd,
289
								getArbreMotsCles().getTree());
290
						// et considère l'ajout achevé
291
						ajoutNoeud = false;
292
					}
293
					// si c'est noeud déjà existant
294
					else {
295
						if (modifNoeud) {
296
							// on notifie le médiateur de la modification et on lui
297
							// passe l'arbre
298
							getOMediateur().modifierMotCleDansArbre(nd,
299
									getArbreMotsCles().getTree());
300
							// et on considère la modification achevée
301
							modifNoeud = false;
302
						}
303
					}
304
 
305
				}
306
 
307
				// gestion du déplacement d'un noeud
308
				public void onMoveNode(Tree tree, TreeNode node,
309
						TreeNode oldParent, TreeNode newParent, int index) {
310
					// on notifie le médiateur et on lui passe l'arbre
311
					getOMediateur().deplacerMotCleDansArbre(node,
312
							getArbreMotsCles().getTree());
313
				}
318 aurelien 314
 
315
				public boolean doBeforeNodeDrop(TreePanel treePanel,
316
						TreeNode target, DragData dragData,
317
						String point, DragDrop source,
318
						TreeNode dropNode,
319
						DropNodeCallback dropNodeCallback) {
320
 
339 aurelien 321
					if(dragData instanceof TreeDragData) {
322
						return true;
323
					}
318 aurelien 324
 
339 aurelien 325
					String idMotCle = ((String[])target.getUserObject())[1];
326
 
327
					if(oMediateur.gererDDObsSurMotCle(target, dragData)) {
318 aurelien 328
 
339 aurelien 329
						cocherMotCle(idMotCle);
330
						return true;
331
					}
332
 
333
					return false;
318 aurelien 334
				}
155 aurelien 335
 
318 aurelien 336
 
337
				public void onNodeDrop(TreePanel treePanel,
338
						TreeNode target, DragData dragData,
339
						String point, DragDrop source, TreeNode dropNode) {
339 aurelien 340
 
318 aurelien 341
 
342
				}
343
 
155 aurelien 344
			});
345
 
346
			// gestion de la validation
318 aurelien 347
			ajouterMotCle.addListener(new ButtonListenerAdapter() {
155 aurelien 348
 
349
				// lors du clic
350
				public void onClick(Button button, EventObject e) {
318 aurelien 351
 
339 aurelien 352
					TreeNode[] noeuds = ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).getSelectedNodes();
353
					TreeNode noeudAjout;
354
					if(noeuds.length > 0) {
355
						noeudAjout = noeuds[noeuds.length - 1];
356
					} else {
357
						noeudAjout = arbreMotsCles.getRootNode();
358
					}
359
					ajouterNoeud(noeudAjout);
318 aurelien 360
 
155 aurelien 361
				}
362
			});
363
 
364
		}
318 aurelien 365
 
366
 
367
		/**
368
		 * Configure le drag 'n drop pour la liste
369
		 */
370
		private void configDragAndDrop()
371
		{
372
			// on fabrique la nouvelle configuration
373
			// les éléments sur lesquels on fait du drag 'n drop doivent tous avoir le même ddGroup
374
			arbreMotsCles.setDdGroup("ObsMotsClesGroup");
375
			//arbreMotsCles.setEnableDD(true);
376
			arbreMotsCles.setEnableDrag(true);
377
			arbreMotsCles.setEnableDrop(true);
378
			DropTargetConfig dtc = new DropTargetConfig();
379
			dtc.setdDdGroup("ObsMotsClesGroup");
380
		}
381
 
155 aurelien 382
		/**
383
		 * Envoie une demande au médiateur pour obtenir l'arbre des mots clés
384
		 */
385
		public void obtenirArbreMotsCles() {
386
 
387
			getOMediateur().obtenirArbreMotsCles(this);
388
 
389
		}
390
 
391
		/**
392
		 * Supprime un noeud de l'arbre
393
		 *
394
		 * @param n
395
		 *            le noeud à supprimer
396
		 */
397
		public void supprimerNoeud(TreeNode n) {
398
			// si ça n'est pas la racine (qu'on ne peut pas supprimer)
399
			if (!n.getId().equals(getArbreMotsCles().getRootNode().getId())) {
339 aurelien 400
 
401
				if(Window.confirm("Etes vous sur de vouloir supprimer ce projet ?")) {
402
					// on détache le noeud et on le détruit
403
					n.getParentNode().removeChild(n);
404
					n.destroy();
405
					// puis on en notifie le médiateur en lui passant le noeud supprimé
406
					// et l'arbre
407
					getOMediateur()
408
							.supprimerMotCleDansArbre(n, arbreMotsCles.getTree());
409
				}
155 aurelien 410
			} else {
411
				// si l'utilisateur tente de supprimer la racine, on l'avertit de
412
				// son erreur
413
				Window.alert("Impossible de supprimer la racine de l'arbre");
414
			}
415
		}
416
 
417
		/**
418
		 * Ajoute un noeud dans l'arbre au parent donné
419
		 *
420
		 * @param parent
421
		 *            le futur parent du noeud à ajouter
422
		 */
423
		public void ajouterNoeud(TreeNode parent) {
424
 
425
			// on met l'ajout du noeud à vrai
426
			ajoutNoeud = true;
427
			// on crée un nouveau noeud vide
428
			TreeNode nd = new TreeNode("");
429
			nd.setCls("x-view-treenode-keyword");
430
			// on associe un objet au noeud qui contient des infos
431
			String[] usObject = new String[2];
432
			// l'objet contient le nom du noeud
433
			usObject[0] = "";
434
			usObject[1] = genererIdMotCle(nd);
435
			nd.setId(usObject[1]);
436
			nd.setUserObject(usObject);
437
			// l'identifiant d'un noeud c'est son hashcode
438
			// l'objet associé au noeud contient aussi son identifiant
439
 
440
			// on le concatène au parent et on étend ses enfants
441
			parent.appendChild(nd);
442
			parent.expand();
443
			// enfin on place le curseur et on fait apparaitre le champ d'édition
444
			// pour que l'utilisateur nomme son mot clé
445
			te.startEdit(nd);
446
 
447
		}
448
 
449
		/**
318 aurelien 450
		 * Fonction de gestion sur le clic sur le noeud
155 aurelien 451
		 *
452
		 * @param node
453
		 */
318 aurelien 454
		public void gererClicNoeud(TreeNode node, boolean multi) {
455
 
339 aurelien 456
			if(!arbreCharge) {
457
				obtenirArbreMotsCles();
458
			} else {
459
				if(multi) {
460
				}
461
				((MultiSelectionModel)arbreMotsCles.getSelectionModel()).select(node, multi);
462
				oMediateur.obtenirNombreObservation();
463
			}
155 aurelien 464
		}
465
 
466
		/**
467
		 * Parcourt l'arbre et coche les noeud qui font partie de la liste des mots
468
		 * clés à cocher
469
		 *
470
		 * @param motsClesIds
471
		 *            un tableau contenant les identifiants des mots clés à cocher
472
		 */
473
		public void cocherMotsCles(final String[] motsClesIds) {
474
			if (getArbreMotsCles() != null
475
					&& getArbreMotsCles().getRootNode() != null) {
476
				// à partir de la racine
477
				getArbreMotsCles().getRootNode().cascade(
478
						new NodeTraversalCallback() {
479
 
480
							// pour chaque noeud
481
							public boolean execute(Node node) {
482
 
483
								// on parcourt le tableau des mots clés
484
								for (int i = 0; i < motsClesIds.length; i++) {
485
									// si le mot clé fait partie des id à cocher on
486
									// le coche
487
									String usObject[] = (String[]) node
488
											.getUserObject();
489
									String nodeId = usObject[1];
490
 
491
									if (nodeId.equals(motsClesIds[i])) {
492
 
339 aurelien 493
										getArbreMotsCles().getNodeById(nodeId)
494
										.getUI().getTextEl().addClassName("x-tree-node-text-kw");
495
 
155 aurelien 496
											return true;
497
									}
498
								}
339 aurelien 499
 
500
								if((getArbreMotsCles().getNodeById(node.getId()).getUI().getTextEl()) != null) {
501
									getArbreMotsCles().getNodeById(node.getId())
502
									.getUI().getTextEl().removeClassName("x-tree-node-text-kw");
503
								}
504
 
505
 
155 aurelien 506
								// et on passe au suivant
507
								return true;
508
							}
509
 
510
						});
511
			}
512
			else {
513
				motsClesEnAttente = motsClesIds ;
514
			}
515
		}
339 aurelien 516
 
517
		public void cocherMotCle(String motCleId) {
518
			getArbreMotsCles().getNodeById(motCleId)
519
			.getUI().getTextEl().addClassName("x-tree-node-text-kw");
520
		}
521
 
522
		public void initialiser() {
523
 
524
			arbreCharge = false ;
525
			motsClesEnCours = "";
526
			arbreMotsCles.collapseAll();
527
			// on vide l'ancien arbre
528
			Node[] rootChild = arbreMotsCles.getRootNode().getChildNodes();
529
			for (int i = 0; i < rootChild.length; i++) {
530
 
531
				rootChild[i].remove();
532
			}
533
 
534
			arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() {
535
 
536
				public void onExpand(Node node) {
537
					if(!arbreCharge)
538
					{
539
						obtenirArbreMotsCles() ;
540
						arbreCharge = true ;
541
					}
542
				}
543
 
544
			}) ;
545
		}
155 aurelien 546
 
547
		/**
548
		 * Méthode héritée de l'interface rafraichissable
549
		 *
550
		 * @param nouvelleDonnees
551
		 *            les nouvelles données pour l'objet
552
		 * @param repandreRafraichissement
553
		 *            booleen qui dit si on doit répandre l'évenement
554
		 */
555
		public void rafraichir(Object nouvelleDonnees,
556
				boolean repandreRafraichissement) {
557
 
558
			if(nouvelleDonnees instanceof Tree) {
559
 
560
				Tree nouvelArbre = (Tree)nouvelleDonnees ;
561
 
562
				// on prend sa racine et on l'attache à l'arbre des mots clés
563
				Node[] rootChild = getArbreMotsCles().getRootNode().getChildNodes();
564
				for (int i = 0; i < rootChild.length; i++) {
565
 
566
					rootChild[i].remove();
567
				}
568
 
569
				copierFilsNoeud(nouvelArbre.getRootNode(),getArbreMotsCles().getRootNode());
570
 
571
				// si l'arbre n'était pas encore considéré comme instancié
572
				if (!arbreCharge) {
573
					// on signale que oui
574
					arbreCharge = true;
575
				}
576
 
339 aurelien 577
 
155 aurelien 578
				// s'il y a des mots clés en attente (lors du premier rendering)
579
				if (motsCleInitialises == false && motsClesEnAttente != null) {
580
					// on les coche
339 aurelien 581
					cocherMotsCles(motsClesEnAttente) ;
155 aurelien 582
					motsCleInitialises = true;
583
				}
584
 
585
				if(motsClesEnAttente.length > 0) {
339 aurelien 586
					cocherMotsCles(motsClesEnAttente);
587
				}
155 aurelien 588
			}
589
 
590
			// Si on reçoit un tableau de String (cas ou l'on séléectionne une
318 aurelien 591
			// nouvelle obs)
339 aurelien 592
			if (nouvelleDonnees instanceof String) {
593
 
594
				String chaineMc = (String)nouvelleDonnees;
595
				String[] motsClesIds = chaineMc.split(";");
596
 
155 aurelien 597
				// et que l'arbre est instancié
598
				if (arbreCharge) {
599
					// le tableau de String contient les id des mots clés associés à
600
					// l'image
601
					// on coche les mots clés contenu dans le tableau
602
					cocherMotsCles(motsClesIds);
603
 
604
				}
605
				// si l'arbre n'est pas encore instancié on met les mots clés en
606
				// attente
607
				else {
339 aurelien 608
					motsClesEnAttente = (String[]) motsClesIds;
155 aurelien 609
				}
610
			}
611
		}
612
 
613
		private String genererIdMotCle(TreeNode nd) {
339 aurelien 614
 
353 aurelien 615
			double IdMC = (nd.hashCode() + ((Math.random() * 10000) + 1));
339 aurelien 616
			return ""+IdMC;
155 aurelien 617
		}
618
 
619
		/**
620
		 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un
621
		 * copie du sous arbre du premier noeud, qu'elle concatène au deuxième
622
		 *
623
		 * @param ndPereOriginal
624
		 *            le père des noeuds de l'arbre original
625
		 * @param ndPereCopie
626
		 *            le père qui va recevoir les copies
627
		 */
628
		private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) {
629
			if (ndPereCopie != null && ndPereOriginal != null) {
630
				Node[] ndNodeFils = ndPereOriginal.getChildNodes();
631
 
632
				for (int i = 0; i < ndNodeFils.length; i++) {
633
 
634
					String[] usObj = (String[]) ndNodeFils[i].getUserObject();
635
					TreeNode child = new TreeNode(usObj[0]);
318 aurelien 636
					child.setId(usObj[1]);
155 aurelien 637
					child.setUserObject(usObj);
638
					ndPereCopie.appendChild(child);
639
 
640
					if (!ndNodeFils[i].isLeaf()) {
641
						copierFilsNoeud(ndNodeFils[i], child);
642
					}
643
 
644
				}
645
			}
646
		}
318 aurelien 647
 
648
		public void raz() {
649
 
339 aurelien 650
			arbreCharge = false ;
651
			arbreMotsCles.collapseAll();
652
			arbreMotsCles.clear() ;
653
 
654
			// on crée une racine pour l'arbre
655
			TreeNode root = new TreeNode("Projets");
656
			root.setId("racine_obs");
657
			String[] usObject = { "Projets", "racine_obs" };
658
			root.setUserObject(usObject);
659
			root.setExpandable(true);
660
 
661
			arbreMotsCles.setRootNode(root);
662
 
663
			arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() {
664
 
665
				public void onExpand(Node node) {
666
					if(!arbreCharge)
667
					{
668
						obtenirArbreMotsCles() ;
669
						arbreCharge = true ;
670
					}
671
				}
672
 
673
			}) ;
674
 
675
			motsClesEnCours  = "";
318 aurelien 676
		}
677
 
678
		public boolean renvoyerEtatFiltre() {
679
			// TODO Auto-generated method stub
680
			return false;
681
		}
682
 
683
		public String renvoyerNomFiltre() {
684
			// TODO Auto-generated method stub
685
			return null;
686
		}
687
 
688
		public String[] renvoyerValeursAFiltrer() {
335 aurelien 689
 
339 aurelien 690
			String val = "";
335 aurelien 691
 
339 aurelien 692
			TreeNode[] noeuds = ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).getSelectedNodes();
693
 
694
			for(int i = 0; i< noeuds.length ; i++) {
695
				if(noeuds[i].getDepth() > 0) {
696
					val += ";"+noeuds[i].getId();
697
				}
698
			}
699
 
700
			val = val.replaceFirst(";", "");
701
 
335 aurelien 702
			String[] valeursFiltres = {"mots_cles", val};
703
 
704
			return valeursFiltres;
318 aurelien 705
		}
706
 
707
		public void valider() {
708
			// TODO Auto-generated method stub
709
 
710
		}
339 aurelien 711
 
712
 
713
		public void montrerContextMenuArbre(final TreeNode n, EventObject e,
714
				TreeEditor te) {
715
				Menu mn = new Menu();
716
				final com.gwtext.client.widgets.menu.Item ajoutN = new Item(
717
						"Ajouter un projet");
718
				final com.gwtext.client.widgets.menu.Item suppN = new Item(
719
						"Supprimer projet");
720
 
721
				mn.addItem(ajoutN);
722
				mn.addItem(suppN);
723
 
724
				mn.addListener(new MenuListenerAdapter() {
725
 
726
					public void onItemClick(BaseItem item, EventObject e) {
727
						if (item.equals(suppN)) {
728
							supprimerNoeud(n);
729
						}
730
						if (item.equals(ajoutN)) {
731
							ajouterNoeud(n);
732
						}
733
					}
734
				});
735
 
736
				mn.showAt(e.getXY());
737
		}
683 aurelien 738
 
739
		public void viderFiltre() {
740
			arbreMotsCles.getSelectionModel().clearSelections();
741
			motsClesEnCours = "";
742
		}
155 aurelien 743
}