Subversion Repositories eFlore/Applications.cel

Rev

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

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