Subversion Repositories eFlore/Applications.cel

Rev

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

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