Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 40 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 40 Rev 47
1
package org.tela_botanica.client.vues;
1
package org.tela_botanica.client.vues;
2
 
2
 
3
 
3
 
4
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.image.ImageMediateur;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
-
 
6
 
6
import com.google.gwt.user.client.Window;
7
import com.google.gwt.user.client.Window;
7
import com.gwtext.client.core.EventObject;
8
import com.gwtext.client.core.EventObject;
8
import com.gwtext.client.data.Node;
9
import com.gwtext.client.data.Node;
9
import com.gwtext.client.data.NodeTraversalCallback;
10
import com.gwtext.client.data.NodeTraversalCallback;
10
import com.gwtext.client.data.Tree;
11
import com.gwtext.client.data.Tree;
11
import com.gwtext.client.widgets.Button;
12
import com.gwtext.client.widgets.Button;
12
import com.gwtext.client.widgets.Panel;
13
import com.gwtext.client.widgets.Panel;
13
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
14
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
14
import com.gwtext.client.widgets.form.TextField;
15
import com.gwtext.client.widgets.form.TextField;
15
import com.gwtext.client.widgets.layout.RowLayout;
16
import com.gwtext.client.widgets.layout.RowLayout;
16
import com.gwtext.client.widgets.layout.RowLayoutData;
17
import com.gwtext.client.widgets.layout.RowLayoutData;
17
import com.gwtext.client.widgets.tree.TreeEditor;
18
import com.gwtext.client.widgets.tree.TreeEditor;
18
import com.gwtext.client.widgets.tree.TreeNode;
19
import com.gwtext.client.widgets.tree.TreeNode;
19
import com.gwtext.client.widgets.tree.TreePanel;
20
import com.gwtext.client.widgets.tree.TreePanel;
20
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;
21
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;
21
 
22
 
22
/**
23
/**
23
 * Arbre des mots clés, qui est une vue rafraichissable,
24
 * Arbre des mots clés, qui est une vue rafraichissable,
24
 * qui contient des mots clés cochables et réorganisables à volonté
25
 * qui contient des mots clés cochables et réorganisables à volonté
25
 * @author aurelien
26
 * @author aurelien
26
 *
27
 *
27
 */
28
 */
28
public class ArbreMotsClesVue extends Panel implements Rafraichissable {
29
public class ArbreMotsClesVue extends Panel implements Rafraichissable {
29
 
30
 
30
	/**
31
	/**
31
	 * Le médiateur associé à la vue
32
	 * Le médiateur associé à la vue
32
	 */
33
	 */
33
	private ImageMediateur iMediateur = null ;
34
	private ImageMediateur iMediateur = null ;
34
	
35
	
35
	/**
36
	/**
36
	 * Le treepanel qui affiche l'arbre
37
	 * Le treepanel qui affiche l'arbre
37
	 */
38
	 */
38
	private TreePanel arbreMotsCles = null ;
39
	private TreePanel arbreMotsCles = null ;
39
	/**
40
	/**
40
	 * L'éditeur qui permet de modifier les mots clés dans l'arbre
41
	 * L'éditeur qui permet de modifier les mots clés dans l'arbre
41
	 */
42
	 */
42
	private TreeEditor te = null ;
43
	private TreeEditor te = null ;
43
	/**
44
	/**
44
	 * Le textfield associé à l'éditeur
45
	 * Le textfield associé à l'éditeur
45
	 */
46
	 */
46
	private TextField tfEdit = null ;
47
	private TextField tfEdit = null ;
47
	/**
48
	/**
48
	 * Bouton de validation
49
	 * Bouton de validation
49
	 */
50
	 */
50
	private Button valider = null ;
51
	private Button valider = null ;
51
	/**
52
	/**
52
	 * Une string permettant connaitre les mots clés cochés en cours séparés par des virgules
53
	 * Une string permettant connaitre les mots clés cochés en cours séparés par des virgules
53
	 */
54
	 */
54
	private String motsClesEnCours = "" ;
55
	private String motsClesEnCours = "" ;
55
	/**
56
	/**
56
	 * Tableau contenant les mots clés qui n'ont pas encore été jaouté à l'arbre 
57
	 * Tableau contenant les mots clés qui n'ont pas encore été jaouté à l'arbre 
57
	 * (sert au lazy rendering quand on reçoit des mots clés avant que le rendu du conteneur n'ai été effectué)
58
	 * (sert au lazy rendering quand on reçoit des mots clés avant que le rendu du conteneur n'ai été effectué)
58
	 */
59
	 */
59
	private String[] motsClesEnAttente ; 
60
	private String[] motsClesEnAttente ; 
60
	/**
61
	/**
61
	 * Booléen d'évènement qui sert à savoir si on est en train d'ajouter un noeud
62
	 * Booléen d'évènement qui sert à savoir si on est en train d'ajouter un noeud
62
	 */
63
	 */
63
	private boolean ajoutNoeud = false ;
64
	private boolean ajoutNoeud = false ;
64
	/**
65
	/**
65
	 * Booléen d'évènement qui sert à savoir si on est en train de modifier un noeud
66
	 * Booléen d'évènement qui sert à savoir si on est en train de modifier un noeud
66
	 */
67
	 */
67
	private boolean modifNoeud = false ;
68
	private boolean modifNoeud = false ;
68
	/**
69
	/**
69
	 * Booléen d'instanciation du conteneur
70
	 * Booléen d'instanciation du conteneur
70
	 */
71
	 */
71
	private boolean estInstancie = false ;
72
	private boolean estInstancie = false ;
72
	/**
73
	/**
73
	 * Booléen d'évènement qui sert à savoir si les mots clés ont bien été reçu
74
	 * Booléen d'évènement qui sert à savoir si les mots clés ont bien été reçu
74
	 */
75
	 */
75
	private boolean motsCleInitialises ;
76
	private boolean motsCleInitialises ;
76
	
77
	
77
	/**
78
	/**
78
	 * Constructeur sans paramètre (privé car interdit d'utilisation)
79
	 * Constructeur sans paramètre (privé car interdit d'utilisation)
79
	 */
80
	 */
80
	private ArbreMotsClesVue()
81
	private ArbreMotsClesVue()
81
	{
82
	{
82
		super() ;
83
		super() ;
83
	}
84
	}
84
	
85
	
85
	/**
86
	/**
86
	 * Constructeur avec paramètre
87
	 * Constructeur avec paramètre
87
	 * @param im le médiateur à associer
88
	 * @param im le médiateur à associer
88
	 */
89
	 */
89
	public ArbreMotsClesVue(ImageMediateur im)
90
	public ArbreMotsClesVue(ImageMediateur im)
90
	{
91
	{
91
		// on crée le panel
92
		// on crée le panel
92
		super("Mots clés") ;
93
		super("Mots clés") ;
93
		this.setLayout(new RowLayout());
94
		this.setLayout(new RowLayout());
94
		iMediateur = im ;
95
		iMediateur = im ;
95
		
96
		
96
		// on crée le conteneur de l'arbre
97
		// on crée le conteneur de l'arbre
97
		arbreMotsCles = new TreePanel() ;
98
		arbreMotsCles = new TreePanel() ;
98
		// on permet le drag and drop dans l'arbre
99
		// on permet le drag and drop dans l'arbre
99
		arbreMotsCles.setEnableDD(true) ;
100
		arbreMotsCles.setEnableDD(true) ;
100
		arbreMotsCles.setId("x-view-tree-keyword") ;
101
		arbreMotsCles.setId("x-view-tree-keyword") ;
101
		arbreMotsCles.setAutoWidth(true) ;
102
		arbreMotsCles.setAutoWidth(true) ;
102
		//arbreMotsCles.setAutoScroll(true) ;
103
		//arbreMotsCles.setAutoScroll(true) ;
103
		arbreMotsCles.setBorder(false) ;
104
		arbreMotsCles.setBorder(false) ;
104
		
105
		
105
		// on crée une racine pour l'arbre
106
		// on crée une racine pour l'arbre
106
		TreeNode root = new TreeNode("Tags") ;
107
		TreeNode root = new TreeNode("Tags") ;
107
		root.setId("racine") ;
108
		root.setId("racine") ;
108
		String[] usObject = {"Mots clés" , "racine" } ;
109
		String[] usObject = {"Mots clés" , "racine" } ;
109
		root.setUserObject(usObject) ;
110
		root.setUserObject(usObject) ;
110
		
111
		
111
		arbreMotsCles.setRootNode(root) ;
112
		arbreMotsCles.setRootNode(root) ;
112
		arbreMotsCles.setRootVisible(false) ;
113
		arbreMotsCles.setRootVisible(false) ;
113
		arbreMotsCles.getRootNode().setIcon("tela.png") ;
114
		arbreMotsCles.getRootNode().setIcon("tela.png") ;
114
		arbreMotsCles.setBorder(false) ;
115
		arbreMotsCles.setBorder(false) ;
115
		
116
		
116
		// on crée l'éditeur pour l'arbre
117
		// on crée l'éditeur pour l'arbre
117
		tfEdit = new TextField() ;
118
		tfEdit = new TextField() ;
118
		te = new TreeEditor(arbreMotsCles,tfEdit) ;
119
		te = new TreeEditor(arbreMotsCles,tfEdit) ;
119
		valider = new Button("Appliquer") ;
120
		valider = new Button("Appliquer") ;
120
		arbreMotsCles.add(te) ;
121
		arbreMotsCles.add(te) ;
121
		
122
		
122
		// on met en forme le layout
123
		// on met en forme le layout
123
		this.add(arbreMotsCles,new RowLayoutData("90%")) ;
124
		this.add(arbreMotsCles,new RowLayoutData("90%")) ;
124
		this.add(valider,new RowLayoutData("10%")) ;
125
		this.add(valider,new RowLayoutData("10%")) ;
125
		
126
		
126
		this.setBorder(false) ;
127
		this.setBorder(false) ;
127
		this.setCollapsible(true) ;
128
		this.setCollapsible(true) ;
128
		this.setTitleCollapse(true) ;
129
		this.setTitleCollapse(true) ;
129
		
130
		
130
		// on ajoute les listeners
131
		// on ajoute les listeners
131
		ajouterListeners() ;
132
		ajouterListeners() ;
132
		
133
		
133
	}
134
	}
134
	
135
	
135
	/**
136
	/**
136
	 * Acesseur pour le médiateur
137
	 * Acesseur pour le médiateur
137
	 * @return le médiateur associé à la vue
138
	 * @return le médiateur associé à la vue
138
	 */
139
	 */
139
	private ImageMediateur GetIMediateur() {
140
	private ImageMediateur GetIMediateur() {
140
		
141
		
141
		return iMediateur ;
142
		return iMediateur ;
142
		
143
		
143
	}
144
	}
144
	
145
	
145
	/**
146
	/**
146
	 * Acesseur pour l'arbre des mots clés
147
	 * Acesseur pour l'arbre des mots clés
147
	 * @return le panel contenant l'arbre
148
	 * @return le panel contenant l'arbre
148
	 */
149
	 */
149
	public TreePanel getArbreMotsCles() {
150
	public TreePanel getArbreMotsCles() {
150
		return arbreMotsCles;
151
		return arbreMotsCles;
151
	}
152
	}
152
 
153
 
153
	/**
154
	/**
154
	 * Accesseur pour l'éditeur
155
	 * Accesseur pour l'éditeur
155
	 * @return l'éditeur associé à l'arbre
156
	 * @return l'éditeur associé à l'arbre
156
	 */
157
	 */
157
	public TreeEditor getTe() {
158
	public TreeEditor getTe() {
158
		return te;
159
		return te;
159
	}
160
	}
160
 
161
 
161
	/**
162
	/**
162
	 * Acesseur pour le TextField associé à l'éditeur
163
	 * Acesseur pour le TextField associé à l'éditeur
163
	 * @return le champ texte associé à l'éditeur
164
	 * @return le champ texte associé à l'éditeur
164
	 */
165
	 */
165
	public TextField getTfEdit() {
166
	public TextField getTfEdit() {
166
		return tfEdit;
167
		return tfEdit;
167
	}
168
	}
168
	
169
	
169
	/**
170
	/**
170
	 * Ajoute les listeners nécessaires pour la gestion des évènements
171
	 * Ajoute les listeners nécessaires pour la gestion des évènements
171
	 */
172
	 */
172
	private void ajouterListeners()
173
	private void ajouterListeners()
173
	{
174
	{
174
		arbreMotsCles.addListener(new TreePanelListenerAdapter() {
175
		arbreMotsCles.addListener(new TreePanelListenerAdapter() {
175
			
176
			
176
			// gestion du clic sur un noeud
177
			// gestion du clic sur un noeud
177
			public void onClick(TreeNode node, EventObject e) {
178
			public void onClick(TreeNode node, EventObject e) {
178
				
179
				
179
				e.stopEvent() ;
180
				e.stopEvent() ;
180
				gererClicNoeud(node);
181
				gererClicNoeud(node);
181
			}
182
			}
182
 
183
 
183
			// gestion du clic droit sur un noeud
184
			// gestion du clic droit sur un noeud
184
			public void onContextMenu(TreeNode node, EventObject e) {
185
			public void onContextMenu(TreeNode node, EventObject e) {
185
				
186
				
186
					e.stopEvent() ;
187
					e.stopEvent() ;
187
					GetIMediateur().montrerContextMenuArbre(node, e , getTe()) ;
188
					GetIMediateur().montrerContextMenuArbre(node, e , getTe()) ;
188
				
189
				
189
			}
190
			}
190
		
191
		
191
			// gestion du double clic sur un noeud
192
			// gestion du double clic sur un noeud
192
			public void onDblClick(TreeNode node, EventObject e) {
193
			public void onDblClick(TreeNode node, EventObject e) {
193
				
194
				
194
				modifNoeud = true ;
195
				modifNoeud = true ;
195
				te.startEdit(node);
196
				te.startEdit(node);
196
			}
197
			}
197
			
198
			
198
			// gestion de la modification du texte d'un noeud 
199
			// gestion de la modification du texte d'un noeud 
199
			public void onTextChange(TreeNode node, String text, String oldText) {
200
			public void onTextChange(TreeNode node, String text, String oldText) {
200
 
201
 
201
				// on récupère les informations associées au noeud
202
				// on récupère les informations associées au noeud
202
				TreeNode nd = node ;
203
				TreeNode nd = node ;
203
				String[] usObject = new String[2] ;
204
				String[] usObject = new String[2] ;
204
				usObject[0] = text ;
205
				usObject[0] = text ;
205
				usObject[1] = ((String[])nd.getUserObject())[1] ;
206
				usObject[1] = ((String[])nd.getUserObject())[1] ;
206
				nd.setUserObject(usObject) ;
207
				nd.setUserObject(usObject) ;
207
				
208
				
208
				// si c'est un nouveau noeud
209
				// si c'est un nouveau noeud
209
				if(ajoutNoeud)
210
				if(ajoutNoeud)
210
				{
211
				{
211
					// on notifie le médiateur de l'ajout et on lui passe l'arbre
212
					// on notifie le médiateur de l'ajout et on lui passe l'arbre
212
					GetIMediateur().ajouterMotCleDansArbre(nd,getArbreMotsCles().getTree()) ;
213
					GetIMediateur().ajouterMotCleDansArbre(nd,getArbreMotsCles().getTree()) ;
213
					// et considière l'ajout achevé
214
					// et considière l'ajout achevé
214
					ajoutNoeud = false ;
215
					ajoutNoeud = false ;
215
				}
216
				}
216
				// si c'est noeud déjà existant
217
				// si c'est noeud déjà existant
217
				else
218
				else
218
				{
219
				{
219
					// on notifie le médiateur de la modification et on lui passe l'arbre
220
					// on notifie le médiateur de la modification et on lui passe l'arbre
220
					GetIMediateur().modifierMotCleDansArbre(nd,getArbreMotsCles().getTree()) ;
221
					GetIMediateur().modifierMotCleDansArbre(nd,getArbreMotsCles().getTree()) ;
221
					// et on considère la modification achevée
222
					// et on considère la modification achevée
222
					modifNoeud = false ;
223
					modifNoeud = false ;
223
				}
224
				}
224
				
225
				
225
			}
226
			}
226
			
227
			
227
			// gestion du déplacement d'un noeud
228
			// gestion du déplacement d'un noeud
228
			public void onMoveNode(Tree tree, TreeNode node, TreeNode oldParent, TreeNode newParent,int index)
229
			public void onMoveNode(Tree tree, TreeNode node, TreeNode oldParent, TreeNode newParent,int index)
229
			{
230
			{
230
				// on notifie le médiateur et on lui passe l'arbre
231
				// on notifie le médiateur et on lui passe l'arbre
231
				GetIMediateur().deplacerMotCleDansArbre(node, getArbreMotsCles().getTree()) ;
232
				GetIMediateur().deplacerMotCleDansArbre(node, getArbreMotsCles().getTree()) ;
232
			}
233
			}
233
 
234
 
234
			// gestion du changement de valeur dans la checkbox 
235
			// gestion du changement de valeur dans la checkbox 
-
 
236
			
235
			public void onCheckChange(TreeNode node, boolean checked) {
237
			/*public void onCheckChange(TreeNode node, boolean checked) {
236
				
238
				
237
				// si on a coché un noeud
239
				// si on a coché un noeud
238
				if(checked)
240
				if(checked)
239
				{
241
				{
240
					// on remonte pour cocher tous les parents du noeud
242
					// on remonte pour cocher tous les parents du noeud
241
					node.bubble(new NodeTraversalCallback() {
243
					node.bubble(new NodeTraversalCallback() {
242
						
244
						
243
						public boolean execute(Node node)
245
						public boolean execute(Node node)
244
						{
246
						{
245
							TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
247
							TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
246
							tn.getUI().toggleCheck(true) ;
248
							tn.getUI().toggleCheck(true) ;
247
							
249
							
248
							return true ;
250
							return true ;
249
						}
251
						}
250
					}) ;
252
					}) ;
251
				}
253
				}
252
			}
254
			}*/
253
			
255
			
254
		}) ;
256
		}) ;
255
		
257
		
256
		// gestion de la validation
258
		// gestion de la validation
257
		valider.addListener(new ButtonListenerAdapter() {
259
		valider.addListener(new ButtonListenerAdapter() {
258
			
260
			
259
			// lors du clic
261
			// lors du clic
260
			public void onClick(Button button, EventObject e) {
262
			public void onClick(Button button, EventObject e) {
261
				
263
				
262
				// on vide les mots clés en cours
264
				// on vide les mots clés en cours
263
				motsClesEnCours = "" ;
265
				motsClesEnCours = "" ;
264
				// pour chaque noeud à partir de la racine
266
				// pour chaque noeud à partir de la racine
265
				getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
267
				getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
266
					
268
					
267
					// on éxécute une fonction
269
					// on éxécute une fonction
268
					public boolean execute(Node node) {
270
					public boolean execute(Node node) {
269
					
271
					
270
							// on récupère le mot clé associé au noeud et ses infos
272
							// on récupère le mot clé associé au noeud et ses infos
271
							TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
273
							TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
272
 
274
 
273
								String[] usObject =  (String[])tn.getUserObject() ;
275
								String[] usObject =  (String[])tn.getUserObject() ;
274
								GetIMediateur().mettreAjourMotsClesId(usObject[0],usObject[1]) ;
276
								GetIMediateur().mettreAjourMotsClesId(usObject[0],usObject[1]) ;
275
									
277
									
276
									if(tn.getUI().isChecked())
278
									if(tn.getUI().isChecked())
277
									{
279
									{
278
										// et les concatène à la string des mots clés en cours
280
										// et les concatène à la string des mots clés en cours
279
										motsClesEnCours += usObject[1]+"," ;
281
										motsClesEnCours += usObject[1]+"," ;
280
									}
282
									}
281
							
283
							
282
							return true ;
284
							return true ;
283
					}
285
					}
284
					
286
					
285
				});
287
				});
286
				
288
				
287
				// enfin on notifie le médiateur et on lui passe l'arbre et la liste des mots clés ainsi obtenue
289
				// enfin on notifie le médiateur et on lui passe l'arbre et la liste des mots clés ainsi obtenue
288
				GetIMediateur().mettreAjourMotsCles(motsClesEnCours,arbreMotsCles.getTree()) ;
290
				GetIMediateur().mettreAjourMotsCles(motsClesEnCours,arbreMotsCles.getTree()) ;
289
			}
291
			}
290
		}) ;
292
		}) ;
291
		
293
		
292
	}
294
	}
293
	
295
	
294
	/**
296
	/**
295
	 * Envoie une demande au médiateur pour obtenir l'arbre des mots clés
297
	 * Envoie une demande au médiateur pour obtenir l'arbre des mots clés
296
	 */
298
	 */
297
	public void obtenirArbreMotsCles() {
299
	public void obtenirArbreMotsCles() {
298
		
300
		
299
		GetIMediateur().obtenirArbreMotsCles(this) ;
301
		GetIMediateur().obtenirArbreMotsCles(this) ;
300
		
302
		
301
	}
303
	}
302
 
304
 
303
	/**
305
	/**
304
	 * Supprime un noeud de l'arbre
306
	 * Supprime un noeud de l'arbre
305
	 * @param n le noeud à supprimer
307
	 * @param n le noeud à supprimer
306
	 */
308
	 */
307
	public void supprimerNoeud(TreeNode n)
309
	public void supprimerNoeud(TreeNode n)
308
	{
310
	{
309
		// si ça n'est pas la racine (qu'on ne peut pas supprimer)
311
		// si ça n'est pas la racine (qu'on ne peut pas supprimer)
310
		if(!n.getId().equals(getArbreMotsCles().getRootNode().getId()))
312
		if(!n.getId().equals(getArbreMotsCles().getRootNode().getId()))
311
		{
313
		{
312
			// on détache le noeud et on le détruit
314
			// on détache le noeud et on le détruit
313
			n.getParentNode().removeChild(n);
315
			n.getParentNode().removeChild(n);
314
			n.destroy() ;
316
			n.destroy() ;
315
			// puis on en notifie le médiateur en lui passant le noeud supprimé et l'arbre
317
			// puis on en notifie le médiateur en lui passant le noeud supprimé et l'arbre
316
			GetIMediateur().supprimerMotCleDansArbre(n, arbreMotsCles.getTree()) ;
318
			GetIMediateur().supprimerMotCleDansArbre(n, arbreMotsCles.getTree()) ;
317
		}
319
		}
318
		else
320
		else
319
		{
321
		{
320
			// si l'utilisateur tente de supprimer la racine, on l'avertit de son erreur
322
			// si l'utilisateur tente de supprimer la racine, on l'avertit de son erreur
321
			Window.alert("Impossible de supprimer la racine de l'arbre") ;
323
			Window.alert("Impossible de supprimer la racine de l'arbre") ;
322
		}
324
		}
323
	}
325
	}
324
	
326
	
325
	/**
327
	/**
326
	 * Ajoute un noeud dans l'arbre au parent donné
328
	 * Ajoute un noeud dans l'arbre au parent donné
327
	 * @param parent le futur parent du noeud à ajouter
329
	 * @param parent le futur parent du noeud à ajouter
328
	 */
330
	 */
329
	public void ajouterNoeud(TreeNode parent)
331
	public void ajouterNoeud(TreeNode parent)
330
	{
332
	{
331
		// on met l'ajout du noeud à vrai
333
		// on met l'ajout du noeud à vrai
332
		ajoutNoeud = true ;
334
		ajoutNoeud = true ;
333
		// on crée un nouveau noeud vide
335
		// on crée un nouveau noeud vide
334
		TreeNode nd = new TreeNode("");
336
		TreeNode nd = new TreeNode("");
335
		nd.setIcon("tela.png") ;
337
		nd.setIcon("tela.png") ;
336
		nd.setChecked(true);
338
		nd.setChecked(true);
337
		// on associe un objet au noeud qui contient des infos
339
		// on associe un objet au noeud qui contient des infos
338
		String[] usObject = new String[2] ;
340
		String[] usObject = new String[2] ;
339
		// l'objet contient le nom du noeud
341
		// l'objet contient le nom du noeud
340
		usObject[0] = "" ;
342
		usObject[0] = "" ;
341
		// l'identifiant d'un noeud c'est son hashcode
343
		// l'identifiant d'un noeud c'est son hashcode
342
		usObject[1] = Integer.toString(nd.hashCode()) ;
344
		usObject[1] = Integer.toString(nd.hashCode()) ;
343
		// l'objet associé au noeud contient aussi son identifiant
345
		// l'objet associé au noeud contient aussi son identifiant
344
		nd.setId(usObject[1]) ;
346
		nd.setId(usObject[1]) ;
345
		nd.setUserObject(usObject) ;
347
		nd.setUserObject(usObject) ;
346
		
348
		
347
		// on le concatène au parent et on étend ses enfants
349
		// on le concatène au parent et on étend ses enfants
348
		parent.appendChild(nd);
350
		parent.appendChild(nd);
349
		parent.expand();
351
		parent.expand();
350
		// enfin on place le curseur et on fait apparaitre le champ d'édition pour que l'utilisateur nomme son mot clé
352
		// enfin on place le curseur et on fait apparaitre le champ d'édition pour que l'utilisateur nomme son mot clé
351
		te.startEdit(nd);
353
		te.startEdit(nd);
352
	}
354
	}
353
	
355
	
354
	/**
356
	/**
355
	 * Coche le noeud s'il est décoché, le décoche sinon
357
	 * Coche le noeud s'il est décoché, le décoche sinon
356
	 * @param node
358
	 * @param node
357
	 */
359
	 */
358
	public void gererClicNoeud(TreeNode node)
360
	public void gererClicNoeud(TreeNode node)
359
	{
361
	{
360
		if(node.getUI().isChecked())
362
		if(node.getUI().isChecked())
361
		{
363
		{
362
			node.getUI().toggleCheck(false) ;
364
			node.getUI().toggleCheck(false) ;
363
		}
365
		}
364
		else
366
		else
365
		{
367
		{
366
			node.getUI().toggleCheck(true) ;
368
			node.getUI().toggleCheck(true) ;
367
		}
369
		}
368
	}
370
	}
369
	
371
	
370
	/**
372
	/**
371
	 * Parcourt l'arbre et coche les noeud qui font partie de la liste des mots clés à cocher 
373
	 * Parcourt l'arbre et coche les noeud qui font partie de la liste des mots clés à cocher 
372
	 * @param motsClesIds un tableau contenant les identifiants des mots clés à cocher
374
	 * @param motsClesIds un tableau contenant les identifiants des mots clés à cocher
373
	 */
375
	 */
374
	public void cocherMotsCles(final String[] motsClesIds)
376
	public void cocherMotsCles(final String[] motsClesIds)
375
	{
377
	{
376
		if(getArbreMotsCles() != null && getArbreMotsCles().getRootNode() != null)
378
		if(getArbreMotsCles() != null && getArbreMotsCles().getRootNode() != null)
377
		{
379
		{
378
			// à partir de la racine
380
			// à partir de la racine
379
			getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
381
			getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
380
	
382
	
381
				// pour chaque noeud
383
				// pour chaque noeud
382
				public boolean execute(Node node) {
384
				public boolean execute(Node node) {
383
					
385
					
384
						// on parcourt le tableau des mots clés
386
						// on parcourt le tableau des mots clés
385
						for(int i = 0 ; i < motsClesIds.length ; i++)
387
						for(int i = 0 ; i < motsClesIds.length ; i++)
386
						{
388
						{
387
							// si le mot clé fait partie des id à cocher on le coche
389
							// si le mot clé fait partie des id à cocher on le coche
388
							String usObject[] = (String[])node.getUserObject() ;
390
							String usObject[] = (String[])node.getUserObject() ;
389
							String nodeId = usObject[1] ;
391
							String nodeId = usObject[1] ;
390
							
-
 
391
							getArbreMotsCles().getNodeById(node.getId()).getUI().toggleCheck(false) ;
-
 
392
										
392
										
393
							if(nodeId.equals(motsClesIds[i]))
393
							if(nodeId.equals(motsClesIds[i]))
394
							{
394
							{
395
								getArbreMotsCles().getNodeById(nodeId).getUI().toggleCheck(true) ;
395
								getArbreMotsCles().getNodeById(nodeId).getUI().toggleCheck(true) ;
396
								return true ;
396
								return true ;
397
							}
397
							}
-
 
398
							
-
 
399
							getArbreMotsCles().getNodeById(node.getId()).getUI().toggleCheck(false) ;
398
						}
400
						}
399
						// et on passe au suivant
401
						// et on passe au suivant
400
						return true;
402
						return true;
401
				}
403
				}
402
				
404
				
403
			}) ;
405
			}) ;
404
		}
406
		}
405
	}
407
	}
406
	
408
	
407
	/**
409
	/**
408
	 * Méthode héritée de l'interface rafraichissable
410
	 * Méthode héritée de l'interface rafraichissable
409
	 * @param nouvelleDonnees les nouvelles données pour l'objet
411
	 * @param nouvelleDonnees les nouvelles données pour l'objet
410
	 * @param repandreRafraichissement booleen qui dit si on doit répandre l'évenement
412
	 * @param repandreRafraichissement booleen qui dit si on doit répandre l'évenement
411
	 */
413
	 */
412
	public void rafraichir(Object nouvelleDonnees,
414
	public void rafraichir(Object nouvelleDonnees,
413
			boolean repandreRafraichissement) {
415
			boolean repandreRafraichissement) {
414
		
416
		
415
		// si on a reçu un arbre
417
		// si on a reçu un arbre
416
		if(nouvelleDonnees instanceof Tree)
418
		if(nouvelleDonnees instanceof Tree)
417
		{
419
		{
418
				Tree nouvelArbre = (Tree)nouvelleDonnees ;
420
				Tree nouvelArbre = (Tree)nouvelleDonnees ;
419
					
421
					
420
					// on prend sa racine et on l'attache à l'arbre des mots clés
422
					// on prend sa racine et on l'attache à l'arbre des mots clés
421
					getArbreMotsCles().getRootNode().appendChild(nouvelArbre.getRootNode()) ;
423
					getArbreMotsCles().getRootNode().appendChild(nouvelArbre.getRootNode()) ;
422
					getArbreMotsCles().expandAll() ;
424
					getArbreMotsCles().expandAll() ;
423
					
425
					
424
					// si l'arbre n'était pas encore considéré comme instancié
426
					// si l'arbre n'était pas encore considéré comme instancié
425
					if(!estInstancie)
427
					if(!estInstancie)
426
					{
428
					{
427
						// on signale que oui
429
						// on signale que oui
428
						estInstancie = true ;
430
						estInstancie = true ;
429
					}
431
					}
430
					
432
					
431
					// s'il y a des mots clés en attente (lors du premier rendering)
433
					// s'il y a des mots clés en attente (lors du premier rendering)
432
					if(motsCleInitialises == false && motsClesEnAttente != null)
434
					if(motsCleInitialises == false && motsClesEnAttente != null)
433
					{
435
					{
434
						// on les coche
436
						// on les coche
435
						// TODO: corriger le bug qui fait que ça ne marche pas la premiere fois !!!!
437
						// TODO: corriger le bug qui fait que ça ne marche pas la premiere fois !!!!
436
						cocherMotsCles(motsClesEnAttente) ;
438
						cocherMotsCles(motsClesEnAttente) ;
437
						motsCleInitialises = true ; 
439
						motsCleInitialises = true ; 
438
					}
440
					}
439
		}
441
		}
440
		
442
		
441
		
443
		
442
		// Si on reçoit un tableau de String (cas ou l'on séléectionne une nouvelle image)
444
		// Si on reçoit un tableau de String (cas ou l'on séléectionne une nouvelle image)
443
		if(nouvelleDonnees instanceof String[])
445
		if(nouvelleDonnees instanceof String[])
444
		{
446
		{
445
			// et que l'arbre est instancié
447
			// et que l'arbre est instancié
446
			if(estInstancie && nouvelleDonnees != null)
448
			if(estInstancie && nouvelleDonnees != null)
447
			{
449
			{
448
				// le tableau de String contient les id des mots clés associés à l'image
450
				// le tableau de String contient les id des mots clés associés à l'image
449
				// on coche les mots clés contenu dans le tableau
451
				// on coche les mots clés contenu dans le tableau
450
				String[] motsClesIds = (String[])nouvelleDonnees ;		
452
				String[] motsClesIds = (String[])nouvelleDonnees ;		
451
				cocherMotsCles(motsClesIds) ;		
453
				cocherMotsCles(motsClesIds) ;		
452
			}
454
			}
453
			// si l'arbre n'est pas encore instancié on met les mots clés en attente
455
			// si l'arbre n'est pas encore instancié on met les mots clés en attente
454
			else
456
			else
455
			{
457
			{
456
				motsClesEnAttente = (String[])nouvelleDonnees ;
458
				motsClesEnAttente = (String[])nouvelleDonnees ;
457
			}
459
			}
458
		}
460
		}
459
		
461
		
460
	}
462
	}
461
 
463
 
462
}
464
}