Subversion Repositories eFlore/Applications.cel

Rev

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

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