Subversion Repositories eFlore/Archives.cel-v2

Rev

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

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