Subversion Repositories eFlore/Applications.cel

Rev

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

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