Subversion Repositories eFlore/Archives.cel-v2

Rev

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

Rev 38 Rev 40
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
		arbreMotsCles.setId("x-view-tree-keyword") ;
-
 
101
		arbreMotsCles.setAutoWidth(true) ;
-
 
102
		//arbreMotsCles.setAutoScroll(true) ;
-
 
103
		arbreMotsCles.setBorder(false) ;
100
		
104
		
101
		// on crée une racine pour l'arbre
105
		// on crée une racine pour l'arbre
102
		TreeNode root = new TreeNode("Tags") ;
106
		TreeNode root = new TreeNode("Tags") ;
103
		root.setId("racine") ;
107
		root.setId("racine") ;
104
		String[] usObject = {"Mots clés" , "racine" } ;
108
		String[] usObject = {"Mots clés" , "racine" } ;
105
		root.setUserObject(usObject) ;
109
		root.setUserObject(usObject) ;
106
		
110
		
107
		arbreMotsCles.setRootNode(root) ;
111
		arbreMotsCles.setRootNode(root) ;
108
		arbreMotsCles.setRootVisible(false) ;
112
		arbreMotsCles.setRootVisible(false) ;
109
		arbreMotsCles.getRootNode().setIcon("tela.png") ;
113
		arbreMotsCles.getRootNode().setIcon("tela.png") ;
110
		arbreMotsCles.setBorder(false) ;
114
		arbreMotsCles.setBorder(false) ;
111
		
115
		
112
		// on crée l'éditeur pour l'arbre
116
		// on crée l'éditeur pour l'arbre
113
		tfEdit = new TextField() ;
117
		tfEdit = new TextField() ;
114
		te = new TreeEditor(arbreMotsCles,tfEdit) ;
118
		te = new TreeEditor(arbreMotsCles,tfEdit) ;
115
		valider = new Button("Appliquer") ;
119
		valider = new Button("Appliquer") ;
116
		arbreMotsCles.add(te) ;
120
		arbreMotsCles.add(te) ;
117
		
121
		
118
		// on met en forme le layout
122
		// on met en forme le layout
119
		this.add(arbreMotsCles,new RowLayoutData("90%")) ;
123
		this.add(arbreMotsCles,new RowLayoutData("90%")) ;
120
		this.add(valider,new RowLayoutData("10%")) ;
124
		this.add(valider,new RowLayoutData("10%")) ;
121
		
125
		
122
		this.setBorder(false) ;
126
		this.setBorder(false) ;
-
 
127
		this.setCollapsible(true) ;
-
 
128
		this.setTitleCollapse(true) ;
123
		
129
		
124
		// on ajoute les listeners
130
		// on ajoute les listeners
125
		ajouterListeners() ;
131
		ajouterListeners() ;
126
		
132
		
127
	}
133
	}
128
	
134
	
129
	/**
135
	/**
130
	 * Acesseur pour le médiateur
136
	 * Acesseur pour le médiateur
131
	 * @return le médiateur associé à la vue
137
	 * @return le médiateur associé à la vue
132
	 */
138
	 */
133
	private ImageMediateur GetIMediateur() {
139
	private ImageMediateur GetIMediateur() {
134
		
140
		
135
		return iMediateur ;
141
		return iMediateur ;
136
		
142
		
137
	}
143
	}
138
	
144
	
139
	/**
145
	/**
140
	 * Acesseur pour l'arbre des mots clés
146
	 * Acesseur pour l'arbre des mots clés
141
	 * @return le panel contenant l'arbre
147
	 * @return le panel contenant l'arbre
142
	 */
148
	 */
143
	public TreePanel getArbreMotsCles() {
149
	public TreePanel getArbreMotsCles() {
144
		return arbreMotsCles;
150
		return arbreMotsCles;
145
	}
151
	}
146
 
152
 
147
	/**
153
	/**
148
	 * Accesseur pour l'éditeur
154
	 * Accesseur pour l'éditeur
149
	 * @return l'éditeur associé à l'arbre
155
	 * @return l'éditeur associé à l'arbre
150
	 */
156
	 */
151
	public TreeEditor getTe() {
157
	public TreeEditor getTe() {
152
		return te;
158
		return te;
153
	}
159
	}
154
 
160
 
155
	/**
161
	/**
156
	 * Acesseur pour le TextField associé à l'éditeur
162
	 * Acesseur pour le TextField associé à l'éditeur
157
	 * @return le champ texte associé à l'éditeur
163
	 * @return le champ texte associé à l'éditeur
158
	 */
164
	 */
159
	public TextField getTfEdit() {
165
	public TextField getTfEdit() {
160
		return tfEdit;
166
		return tfEdit;
161
	}
167
	}
162
	
168
	
163
	/**
169
	/**
164
	 * Ajoute les listeners nécessaires pour la gestion des évènements
170
	 * Ajoute les listeners nécessaires pour la gestion des évènements
165
	 */
171
	 */
166
	private void ajouterListeners()
172
	private void ajouterListeners()
167
	{
173
	{
168
		arbreMotsCles.addListener(new TreePanelListenerAdapter() {
174
		arbreMotsCles.addListener(new TreePanelListenerAdapter() {
169
			
175
			
170
			// gestion du clic sur un noeud
176
			// gestion du clic sur un noeud
171
			public void onClick(TreeNode node, EventObject e) {
177
			public void onClick(TreeNode node, EventObject e) {
172
				
178
				
173
				e.stopEvent() ;
179
				e.stopEvent() ;
174
				gererClicNoeud(node);
180
				gererClicNoeud(node);
175
			}
181
			}
176
 
182
 
177
			// gestion du clic droit sur un noeud
183
			// gestion du clic droit sur un noeud
178
			public void onContextMenu(TreeNode node, EventObject e) {
184
			public void onContextMenu(TreeNode node, EventObject e) {
179
				
185
				
180
					e.stopEvent() ;
186
					e.stopEvent() ;
181
					GetIMediateur().montrerContextMenuArbre(node, e , getTe()) ;
187
					GetIMediateur().montrerContextMenuArbre(node, e , getTe()) ;
182
				
188
				
183
			}
189
			}
184
		
190
		
185
			// gestion du double clic sur un noeud
191
			// gestion du double clic sur un noeud
186
			public void onDblClick(TreeNode node, EventObject e) {
192
			public void onDblClick(TreeNode node, EventObject e) {
187
				
193
				
188
				modifNoeud = true ;
194
				modifNoeud = true ;
189
				te.startEdit(node);
195
				te.startEdit(node);
190
			}
196
			}
191
			
197
			
192
			// gestion de la modification du texte d'un noeud 
198
			// gestion de la modification du texte d'un noeud 
193
			public void onTextChange(TreeNode node, String text, String oldText) {
199
			public void onTextChange(TreeNode node, String text, String oldText) {
194
 
200
 
195
				// on récupère les informations associées au noeud
201
				// on récupère les informations associées au noeud
196
				TreeNode nd = node ;
202
				TreeNode nd = node ;
197
				String[] usObject = new String[2] ;
203
				String[] usObject = new String[2] ;
198
				usObject[0] = text ;
204
				usObject[0] = text ;
199
				usObject[1] = ((String[])nd.getUserObject())[1] ;
205
				usObject[1] = ((String[])nd.getUserObject())[1] ;
200
				nd.setUserObject(usObject) ;
206
				nd.setUserObject(usObject) ;
201
				
207
				
202
				// si c'est un nouveau noeud
208
				// si c'est un nouveau noeud
203
				if(ajoutNoeud)
209
				if(ajoutNoeud)
204
				{
210
				{
205
					// on notifie le médiateur de l'ajout et on lui passe l'arbre
211
					// on notifie le médiateur de l'ajout et on lui passe l'arbre
206
					GetIMediateur().ajouterMotCleDansArbre(nd,getArbreMotsCles().getTree()) ;
212
					GetIMediateur().ajouterMotCleDansArbre(nd,getArbreMotsCles().getTree()) ;
207
					// et considière l'ajout achevé
213
					// et considière l'ajout achevé
208
					ajoutNoeud = false ;
214
					ajoutNoeud = false ;
209
				}
215
				}
210
				// si c'est noeud déjà existant
216
				// si c'est noeud déjà existant
211
				else
217
				else
212
				{
218
				{
213
					// on notifie le médiateur de la modification et on lui passe l'arbre
219
					// on notifie le médiateur de la modification et on lui passe l'arbre
214
					GetIMediateur().modifierMotCleDansArbre(nd,getArbreMotsCles().getTree()) ;
220
					GetIMediateur().modifierMotCleDansArbre(nd,getArbreMotsCles().getTree()) ;
215
					// et on considère la modification achevée
221
					// et on considère la modification achevée
216
					modifNoeud = false ;
222
					modifNoeud = false ;
217
				}
223
				}
218
				
224
				
219
			}
225
			}
220
			
226
			
221
			// gestion du déplacement d'un noeud
227
			// gestion du déplacement d'un noeud
222
			public void onMoveNode(Tree tree, TreeNode node, TreeNode oldParent, TreeNode newParent,int index)
228
			public void onMoveNode(Tree tree, TreeNode node, TreeNode oldParent, TreeNode newParent,int index)
223
			{
229
			{
224
				// on notifie le médiateur et on lui passe l'arbre
230
				// on notifie le médiateur et on lui passe l'arbre
225
				GetIMediateur().deplacerMotCleDansArbre(node, getArbreMotsCles().getTree()) ;
231
				GetIMediateur().deplacerMotCleDansArbre(node, getArbreMotsCles().getTree()) ;
226
			}
232
			}
227
 
233
 
228
			// gestion du changement de valeur dans la checkbox 
234
			// gestion du changement de valeur dans la checkbox 
229
			public void onCheckChange(TreeNode node, boolean checked) {
235
			public void onCheckChange(TreeNode node, boolean checked) {
230
				
236
				
231
				// si on a coché un noeud
237
				// si on a coché un noeud
232
				if(checked)
238
				if(checked)
233
				{
239
				{
234
					// on remonte pour cocher tous les parents du noeud
240
					// on remonte pour cocher tous les parents du noeud
235
					node.bubble(new NodeTraversalCallback() {
241
					node.bubble(new NodeTraversalCallback() {
236
						
242
						
237
						public boolean execute(Node node)
243
						public boolean execute(Node node)
238
						{
244
						{
239
							TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
245
							TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
240
							tn.getUI().toggleCheck(true) ;
246
							tn.getUI().toggleCheck(true) ;
241
							
247
							
242
							return true ;
248
							return true ;
243
						}
249
						}
244
					}) ;
250
					}) ;
245
				}
251
				}
246
			}
252
			}
247
			
253
			
248
		}) ;
254
		}) ;
249
		
255
		
250
		// gestion de la validation
256
		// gestion de la validation
251
		valider.addListener(new ButtonListenerAdapter() {
257
		valider.addListener(new ButtonListenerAdapter() {
252
			
258
			
253
			// lors du clic
259
			// lors du clic
254
			public void onClick(Button button, EventObject e) {
260
			public void onClick(Button button, EventObject e) {
255
				
261
				
256
				// on vide les mots clés en cours
262
				// on vide les mots clés en cours
257
				motsClesEnCours = "" ;
263
				motsClesEnCours = "" ;
258
				// pour chaque noeud à partir de la racine
264
				// pour chaque noeud à partir de la racine
259
				getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
265
				getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
260
					
266
					
261
					// on éxécute une fonction
267
					// on éxécute une fonction
262
					public boolean execute(Node node) {
268
					public boolean execute(Node node) {
263
					
269
					
264
							// on récupère le mot clé associé au noeud et ses infos
270
							// on récupère le mot clé associé au noeud et ses infos
265
							TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
271
							TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
266
 
272
 
267
								String[] usObject =  (String[])tn.getUserObject() ;
273
								String[] usObject =  (String[])tn.getUserObject() ;
268
								GetIMediateur().mettreAjourMotsClesId(usObject[0],usObject[1]) ;
274
								GetIMediateur().mettreAjourMotsClesId(usObject[0],usObject[1]) ;
269
									
275
									
270
									if(tn.getUI().isChecked())
276
									if(tn.getUI().isChecked())
271
									{
277
									{
272
										// et les concatène à la string des mots clés en cours
278
										// et les concatène à la string des mots clés en cours
273
										motsClesEnCours += usObject[1]+"," ;
279
										motsClesEnCours += usObject[1]+"," ;
274
									}
280
									}
275
							
281
							
276
							return true ;
282
							return true ;
277
					}
283
					}
278
					
284
					
279
				});
285
				});
280
				
286
				
281
				// enfin on notifie le médiateur et on lui passe l'arbre et la liste des mots clés ainsi obtenue
287
				// enfin on notifie le médiateur et on lui passe l'arbre et la liste des mots clés ainsi obtenue
282
				GetIMediateur().mettreAjourMotsCles(motsClesEnCours,arbreMotsCles.getTree()) ;
288
				GetIMediateur().mettreAjourMotsCles(motsClesEnCours,arbreMotsCles.getTree()) ;
283
			}
289
			}
284
		}) ;
290
		}) ;
285
		
291
		
286
	}
292
	}
287
	
293
	
288
	/**
294
	/**
289
	 * Envoie une demande au médiateur pour obtenir l'arbre des mots clés
295
	 * Envoie une demande au médiateur pour obtenir l'arbre des mots clés
290
	 */
296
	 */
291
	public void obtenirArbreMotsCles() {
297
	public void obtenirArbreMotsCles() {
292
		
298
		
293
		GetIMediateur().obtenirArbreMotsCles(this) ;
299
		GetIMediateur().obtenirArbreMotsCles(this) ;
294
		
300
		
295
	}
301
	}
296
 
302
 
297
	/**
303
	/**
298
	 * Supprime un noeud de l'arbre
304
	 * Supprime un noeud de l'arbre
299
	 * @param n le noeud à supprimer
305
	 * @param n le noeud à supprimer
300
	 */
306
	 */
301
	public void supprimerNoeud(TreeNode n)
307
	public void supprimerNoeud(TreeNode n)
302
	{
308
	{
303
		// si ça n'est pas la racine (qu'on ne peut pas supprimer)
309
		// si ça n'est pas la racine (qu'on ne peut pas supprimer)
304
		if(!n.getId().equals(getArbreMotsCles().getRootNode().getId()))
310
		if(!n.getId().equals(getArbreMotsCles().getRootNode().getId()))
305
		{
311
		{
306
			// on détache le noeud et on le détruit
312
			// on détache le noeud et on le détruit
307
			n.getParentNode().removeChild(n);
313
			n.getParentNode().removeChild(n);
308
			n.destroy() ;
314
			n.destroy() ;
309
			// puis on en notifie le médiateur en lui passant le noeud supprimé et l'arbre
315
			// puis on en notifie le médiateur en lui passant le noeud supprimé et l'arbre
310
			GetIMediateur().supprimerMotCleDansArbre(n, arbreMotsCles.getTree()) ;
316
			GetIMediateur().supprimerMotCleDansArbre(n, arbreMotsCles.getTree()) ;
311
		}
317
		}
312
		else
318
		else
313
		{
319
		{
314
			// si l'utilisateur tente de supprimer la racine, on l'avertit de son erreur
320
			// si l'utilisateur tente de supprimer la racine, on l'avertit de son erreur
315
			Window.alert("Impossible de supprimer la racine de l'arbre") ;
321
			Window.alert("Impossible de supprimer la racine de l'arbre") ;
316
		}
322
		}
317
	}
323
	}
318
	
324
	
319
	/**
325
	/**
320
	 * Ajoute un noeud dans l'arbre au parent donné
326
	 * Ajoute un noeud dans l'arbre au parent donné
321
	 * @param parent le futur parent du noeud à ajouter
327
	 * @param parent le futur parent du noeud à ajouter
322
	 */
328
	 */
323
	public void ajouterNoeud(TreeNode parent)
329
	public void ajouterNoeud(TreeNode parent)
324
	{
330
	{
325
		// on met l'ajout du noeud à vrai
331
		// on met l'ajout du noeud à vrai
326
		ajoutNoeud = true ;
332
		ajoutNoeud = true ;
327
		// on crée un nouveau noeud vide
333
		// on crée un nouveau noeud vide
328
		TreeNode nd = new TreeNode("");
334
		TreeNode nd = new TreeNode("");
329
		nd.setIcon("tela.png") ;
335
		nd.setIcon("tela.png") ;
330
		nd.setChecked(true);
336
		nd.setChecked(true);
331
		// on associe un objet au noeud qui contient des infos
337
		// on associe un objet au noeud qui contient des infos
332
		String[] usObject = new String[2] ;
338
		String[] usObject = new String[2] ;
333
		// l'objet contient le nom du noeud
339
		// l'objet contient le nom du noeud
334
		usObject[0] = "" ;
340
		usObject[0] = "" ;
335
		// l'identifiant d'un noeud c'est son hashcode
341
		// l'identifiant d'un noeud c'est son hashcode
336
		usObject[1] = Integer.toString(nd.hashCode()) ;
342
		usObject[1] = Integer.toString(nd.hashCode()) ;
337
		// l'objet associé au noeud contient aussi son identifiant
343
		// l'objet associé au noeud contient aussi son identifiant
338
		nd.setId(usObject[1]) ;
344
		nd.setId(usObject[1]) ;
339
		nd.setUserObject(usObject) ;
345
		nd.setUserObject(usObject) ;
340
		
346
		
341
		// on le concatène au parent et on étend ses enfants
347
		// on le concatène au parent et on étend ses enfants
342
		parent.appendChild(nd);
348
		parent.appendChild(nd);
343
		parent.expand();
349
		parent.expand();
344
		// enfin on place le curseur et on fait apparaitre le champ d'édition pour que l'utilisateur nomme son mot clé
350
		// enfin on place le curseur et on fait apparaitre le champ d'édition pour que l'utilisateur nomme son mot clé
345
		te.startEdit(nd);
351
		te.startEdit(nd);
346
	}
352
	}
347
	
353
	
348
	/**
354
	/**
349
	 * Coche le noeud s'il est décoché, le décoche sinon
355
	 * Coche le noeud s'il est décoché, le décoche sinon
350
	 * @param node
356
	 * @param node
351
	 */
357
	 */
352
	public void gererClicNoeud(TreeNode node)
358
	public void gererClicNoeud(TreeNode node)
353
	{
359
	{
354
		if(node.getUI().isChecked())
360
		if(node.getUI().isChecked())
355
		{
361
		{
356
			node.getUI().toggleCheck(false) ;
362
			node.getUI().toggleCheck(false) ;
357
		}
363
		}
358
		else
364
		else
359
		{
365
		{
360
			node.getUI().toggleCheck(true) ;
366
			node.getUI().toggleCheck(true) ;
361
		}
367
		}
362
	}
368
	}
363
	
369
	
364
	/**
370
	/**
365
	 * Parcourt l'arbre et coche les noeud qui font partie de la liste des mots clés à cocher 
371
	 * Parcourt l'arbre et coche les noeud qui font partie de la liste des mots clés à cocher 
366
	 * @param motsClesIds un tableau contenant les identifiants des mots clés à cocher
372
	 * @param motsClesIds un tableau contenant les identifiants des mots clés à cocher
367
	 */
373
	 */
368
	public void cocherMotsCles(final String[] motsClesIds)
374
	public void cocherMotsCles(final String[] motsClesIds)
369
	{
375
	{
370
		if(getArbreMotsCles() != null && getArbreMotsCles().getRootNode() != null)
376
		if(getArbreMotsCles() != null && getArbreMotsCles().getRootNode() != null)
371
		{
377
		{
372
			// à partir de la racine
378
			// à partir de la racine
373
			getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
379
			getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
374
	
380
	
375
				// pour chaque noeud
381
				// pour chaque noeud
376
				public boolean execute(Node node) {
382
				public boolean execute(Node node) {
377
					
383
					
378
						// on parcourt le tableau des mots clés
384
						// on parcourt le tableau des mots clés
379
						for(int i = 0 ; i < motsClesIds.length ; i++)
385
						for(int i = 0 ; i < motsClesIds.length ; i++)
380
						{
386
						{
381
							// si le mot clé fait partie des id à cocher on le coche
387
							// si le mot clé fait partie des id à cocher on le coche
382
							String usObject[] = (String[])node.getUserObject() ;
388
							String usObject[] = (String[])node.getUserObject() ;
383
							String nodeId = usObject[1] ;
389
							String nodeId = usObject[1] ;
384
							
390
							
385
							getArbreMotsCles().getNodeById(node.getId()).getUI().toggleCheck(false) ;
391
							getArbreMotsCles().getNodeById(node.getId()).getUI().toggleCheck(false) ;
386
										
392
										
387
							if(nodeId.equals(motsClesIds[i]))
393
							if(nodeId.equals(motsClesIds[i]))
388
							{
394
							{
389
								getArbreMotsCles().getNodeById(nodeId).getUI().toggleCheck(true) ;
395
								getArbreMotsCles().getNodeById(nodeId).getUI().toggleCheck(true) ;
390
								return true ;
396
								return true ;
391
							}
397
							}
392
						}
398
						}
393
						// et on passe au suivant
399
						// et on passe au suivant
394
						return true;
400
						return true;
395
				}
401
				}
396
				
402
				
397
			}) ;
403
			}) ;
398
		}
404
		}
399
	}
405
	}
400
	
406
	
401
	/**
407
	/**
402
	 * Méthode héritée de l'interface rafraichissable
408
	 * Méthode héritée de l'interface rafraichissable
403
	 * @param nouvelleDonnees les nouvelles données pour l'objet
409
	 * @param nouvelleDonnees les nouvelles données pour l'objet
404
	 * @param repandreRafraichissement booleen qui dit si on doit répandre l'évenement
410
	 * @param repandreRafraichissement booleen qui dit si on doit répandre l'évenement
405
	 */
411
	 */
406
	public void rafraichir(Object nouvelleDonnees,
412
	public void rafraichir(Object nouvelleDonnees,
407
			boolean repandreRafraichissement) {
413
			boolean repandreRafraichissement) {
408
		
414
		
409
		// si on a reçu un arbre
415
		// si on a reçu un arbre
410
		if(nouvelleDonnees instanceof Tree)
416
		if(nouvelleDonnees instanceof Tree)
411
		{
417
		{
412
				Tree nouvelArbre = (Tree)nouvelleDonnees ;
418
				Tree nouvelArbre = (Tree)nouvelleDonnees ;
413
					
419
					
414
					// on prend sa racine et on l'attache à l'arbre des mots clés
420
					// on prend sa racine et on l'attache à l'arbre des mots clés
415
					getArbreMotsCles().getRootNode().appendChild(nouvelArbre.getRootNode()) ;
421
					getArbreMotsCles().getRootNode().appendChild(nouvelArbre.getRootNode()) ;
416
					getArbreMotsCles().expandAll() ;
422
					getArbreMotsCles().expandAll() ;
417
					
423
					
418
					// si l'arbre n'était pas encore considéré comme instancié
424
					// si l'arbre n'était pas encore considéré comme instancié
419
					if(!estInstancie)
425
					if(!estInstancie)
420
					{
426
					{
421
						// on signale que oui
427
						// on signale que oui
422
						estInstancie = true ;
428
						estInstancie = true ;
423
					}
429
					}
424
					
430
					
425
					// s'il y a des mots clés en attente (lors du premier rendering)
431
					// s'il y a des mots clés en attente (lors du premier rendering)
426
					if(motsCleInitialises == false && motsClesEnAttente != null)
432
					if(motsCleInitialises == false && motsClesEnAttente != null)
427
					{
433
					{
428
						// on les coche
434
						// on les coche
429
						// TODO: corriger le bug qui fait que ça ne marche pas la premiere fois !!!!
435
						// TODO: corriger le bug qui fait que ça ne marche pas la premiere fois !!!!
430
						cocherMotsCles(motsClesEnAttente) ;
436
						cocherMotsCles(motsClesEnAttente) ;
431
						motsCleInitialises = true ; 
437
						motsCleInitialises = true ; 
432
					}
438
					}
433
		}
439
		}
434
		
440
		
435
		
441
		
436
		// Si on reçoit un tableau de String (cas ou l'on séléectionne une nouvelle image)
442
		// Si on reçoit un tableau de String (cas ou l'on séléectionne une nouvelle image)
437
		if(nouvelleDonnees instanceof String[])
443
		if(nouvelleDonnees instanceof String[])
438
		{
444
		{
439
			// et que l'arbre est instancié
445
			// et que l'arbre est instancié
440
			if(estInstancie && nouvelleDonnees != null)
446
			if(estInstancie && nouvelleDonnees != null)
441
			{
447
			{
442
				// le tableau de String contient les id des mots clés associés à l'image
448
				// le tableau de String contient les id des mots clés associés à l'image
443
				// on coche les mots clés contenu dans le tableau
449
				// on coche les mots clés contenu dans le tableau
444
				String[] motsClesIds = (String[])nouvelleDonnees ;		
450
				String[] motsClesIds = (String[])nouvelleDonnees ;		
445
				cocherMotsCles(motsClesIds) ;		
451
				cocherMotsCles(motsClesIds) ;		
446
			}
452
			}
447
			// si l'arbre n'est pas encore instancié on met les mots clés en attente
453
			// si l'arbre n'est pas encore instancié on met les mots clés en attente
448
			else
454
			else
449
			{
455
			{
450
				motsClesEnAttente = (String[])nouvelleDonnees ;
456
				motsClesEnAttente = (String[])nouvelleDonnees ;
451
			}
457
			}
452
		}
458
		}
453
		
459
		
454
	}
460
	}
455
 
461
 
456
}
462
}