Subversion Repositories eFlore/Applications.cel

Rev

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