Subversion Repositories eFlore/Applications.cel

Rev

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