Subversion Repositories eFlore/Applications.cel

Rev

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

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