Subversion Repositories eFlore/Applications.cel

Rev

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

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