Subversion Repositories eFlore/Applications.cel

Rev

Rev 2 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 5
1
package org.tela_botanica.client.vues;
1
package org.tela_botanica.client.vues;
2
 
2
 
3
import org.tela_botanica.client.image.ImageMediateur;
3
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.interfaces.Filtrable;
4
import org.tela_botanica.client.interfaces.Filtrable;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
6
 
6
 
7
import com.google.gwt.user.client.ui.Label;
7
import com.google.gwt.user.client.ui.Label;
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.Component;
11
import com.gwtext.client.widgets.Component;
12
import com.gwtext.client.widgets.Panel;
12
import com.gwtext.client.widgets.Panel;
13
import com.gwtext.client.widgets.event.PanelListenerAdapter;
13
import com.gwtext.client.widgets.event.PanelListenerAdapter;
14
import com.gwtext.client.widgets.tree.TreeNode;
14
import com.gwtext.client.widgets.tree.TreeNode;
15
import com.gwtext.client.widgets.tree.TreePanel;
15
import com.gwtext.client.widgets.tree.TreePanel;
16
 
16
 
17
/**
17
/**
18
 * fenêtre de recherche affichant l'arbre des mots clés en lecture et un bouton 
18
 * fenêtre de recherche affichant l'arbre des mots clés en lecture et un bouton
19
 * cliquable
19
 * cliquable
-
 
20
 * 
20
 * @author aurelien
21
 * @author aurelien
21
 *
22
 * 
22
 */
23
 */
23
public class ArbreMotsClesFiltreVue extends Panel implements Rafraichissable, Filtrable {
24
public class ArbreMotsClesFiltreVue extends Panel implements Rafraichissable,
-
 
25
		Filtrable {
24
 
26
 
25
	/**
27
	/**
26
	 * Le médiateur associé à la vue
28
	 * Le médiateur associé à la vue
27
	 */
29
	 */
28
	private ImageMediateur iMediateur = null ;
30
	private ImageMediateur iMediateur = null;
29
	/**
31
	/**
30
	 * Les mots clés en cours
32
	 * Les mots clés en cours
31
	 */
33
	 */
32
	private String motsClesEncours = "" ;
34
	private String motsClesEncours = "";
33
	
35
 
34
	/**
36
	/**
35
	 * Le treepanel qui affiche l'arbre
37
	 * Le treepanel qui affiche l'arbre
36
	 */
38
	 */
37
	private TreePanel arbreMotsCles = null ;
39
	private TreePanel arbreMotsCles = null;
38
	
40
 
39
	/**
41
	/**
40
	 * booléen d'initialisation
42
	 * booléen d'initialisation
41
	 */
43
	 */
42
	private boolean estInstancie = false ;
44
	private boolean estInstancie = false;
43
	
45
 
44
	/**
46
	/**
45
	 * booléen d'etat
47
	 * booléen d'etat
46
	 */
48
	 */
47
	private boolean filtreModifie = false ;
49
	private boolean filtreModifie = false;
48
	
50
 
49
	/**
51
	/**
50
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
52
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
51
	 */
53
	 */
52
	@SuppressWarnings("unused")
54
	@SuppressWarnings("unused")
53
	private ArbreMotsClesFiltreVue()
55
	private ArbreMotsClesFiltreVue() {
54
	{
-
 
55
		super() ;
56
		super();
56
	}
57
	}
57
	
58
 
58
	/**
59
	/**
59
	 * Constructeur avec paramètres
60
	 * Constructeur avec paramètres
-
 
61
	 * 
-
 
62
	 * @param im
60
	 * @param im le médiateur à associer
63
	 *            le médiateur à associer
61
	 */
64
	 */
62
	public ArbreMotsClesFiltreVue(ImageMediateur im)
65
	public ArbreMotsClesFiltreVue(ImageMediateur im) {
63
	{
-
 
64
		
66
 
65
		// on crée le panel
67
		// on crée le panel
66
		super() ;
68
		super();
67
		//this.setLayout(new VerticalLayout());
69
		// this.setLayout(new VerticalLayout());
68
		iMediateur = im ;
70
		iMediateur = im;
69
		
71
 
70
		// on crée le conteneur de l'arbre
72
		// on crée le conteneur de l'arbre
71
		Label labelRecherche = new Label("Mots clés :") ;
73
		Label labelRecherche = new Label("Mots clés :");
72
		arbreMotsCles = new TreePanel() ;
74
		arbreMotsCles = new TreePanel();
73
		
75
 
74
		this.setPaddings(5) ;
76
		this.setPaddings(5);
75
		
77
 
76
		this.setBorder(false) ;
78
		this.setBorder(false);
77
		this.setCollapsible(true) ;
79
		this.setCollapsible(true);
78
		this.setAutoWidth(true) ;
80
		this.setAutoWidth(true);
79
		
81
 
80
		add(labelRecherche) ;
82
		add(labelRecherche);
81
		
83
 
82
		// on ajoute les listeners
84
		// on ajoute les listeners
83
		ajouterListenersPanel() ;
85
		ajouterListenersPanel();
84
		estInstancie = false ;
86
		estInstancie = false;
85
	}
87
	}
86
	
88
 
87
	/**
89
	/**
88
	 * Ajoute les listeners pour le rendu du panel
90
	 * Ajoute les listeners pour le rendu du panel
89
	 */
91
	 */
90
	private void ajouterListenersPanel()
92
	private void ajouterListenersPanel() {
91
	{
-
 
92
		this.addListener(new PanelListenerAdapter() {
93
		this.addListener(new PanelListenerAdapter() {
93
 
94
 
-
 
95
			// on instancie réellement les composants au moment du rendu pour
94
			// on instancie réellement les composants au moment du rendu pour accélérer l'affichage
96
			// accélérer l'affichage
95
			// et éviter des bugs
97
			// et éviter des bugs
96
			public void onRender(Component component) {
98
			public void onRender(Component component) {
97
				
99
 
98
				// on interdit le drag and drop dans l'arbre
100
				// on interdit le drag and drop dans l'arbre
99
				arbreMotsCles.setEnableDD(false) ;
101
				arbreMotsCles.setEnableDD(false);
100
				arbreMotsCles.setId("x-view-tree-filter") ;
102
				arbreMotsCles.setId("x-view-tree-filter");
101
				arbreMotsCles.setAutoWidth(false) ;
103
				arbreMotsCles.setAutoWidth(false);
102
				arbreMotsCles.setAutoScroll(true) ;
104
				arbreMotsCles.setAutoScroll(true);
103
				arbreMotsCles.setBorder(false) ;
105
				arbreMotsCles.setBorder(false);
104
				
106
 
105
				// on crée une racine pour l'arbre
107
				// on crée une racine pour l'arbre
106
				TreeNode root = new TreeNode("Tags") ;
108
				TreeNode root = new TreeNode("Tags");
107
				root.setId("racine_filtre") ;
109
				root.setId("racine_filtre");
108
				String[] usObject = {"Mots clés" , "racine" } ;
110
				String[] usObject = { "Mots clés", "racine" };
109
				root.setUserObject(usObject) ;
111
				root.setUserObject(usObject);
110
				
112
 
111
				arbreMotsCles.setRootNode(root) ;
113
				arbreMotsCles.setRootNode(root);
112
				arbreMotsCles.setRootVisible(true) ;
114
				arbreMotsCles.setRootVisible(true);
113
				arbreMotsCles.setBorder(false) ;
-
 
114
				
115
				arbreMotsCles.setBorder(false);
115
				
116
 
116
				// on met en forme le layout
117
				// on met en forme le layout
117
				((Panel)component).add(arbreMotsCles) ;
118
				((Panel) component).add(arbreMotsCles);
118
				
119
 
119
				// on ajoute les listeners d'évenements
120
				// on ajoute les listeners d'évenements
120
				ajouterListeners() ;
121
				ajouterListeners();
121
				
122
 
-
 
123
				// et on demande l'arbre des mots clés
-
 
124
				getIMediateur()
122
				// et on demande l'arbre des mots clés
125
						.obtenirArbreMotsCles(
-
 
126
								getIMediateur().getPanneauFiltres()
123
				getIMediateur().obtenirArbreMotsCles(getIMediateur().getPanneauFiltres().getMotsClesFiltre()) ;
127
										.getMotsClesFiltre());
124
				
128
 
125
				// enfin on considère le composant comme instancié
129
				// enfin on considère le composant comme instancié
126
				estInstancie = true ;
130
				estInstancie = true;
127
				
131
 
128
			}
132
			}
129
			
133
 
130
		}) ;
134
		});
131
	}
135
	}
132
		
136
 
133
	/**
137
	/**
134
	 * ajoute les listeners pour les boutons et le cochage des mots clés
138
	 * ajoute les listeners pour les boutons et le cochage des mots clés
135
	 */  
139
	 */
136
	private void ajouterListeners()
-
 
137
	{
140
	private void ajouterListeners() {
138
 
141
 
139
	}
142
	}
140
	
143
 
141
	/**
144
	/**
142
	 * Méthode héritée de l'interface rafraichissable
145
	 * Méthode héritée de l'interface rafraichissable
143
	 */
146
	 */
144
	public void rafraichir(Object nouvelleDonnees,
147
	public void rafraichir(Object nouvelleDonnees,
145
			boolean repandreRaffraichissement) {
148
			boolean repandreRaffraichissement) {
146
		
149
 
147
		// si on a reçu un arbre
150
		// si on a reçu un arbre
148
		if(nouvelleDonnees instanceof Tree)
151
		if (nouvelleDonnees instanceof Tree) {
149
		{
-
 
150
				Tree nouvelArbre = (Tree)nouvelleDonnees ;
152
			Tree nouvelArbre = (Tree) nouvelleDonnees;
151
				
153
 
152
				// on vide tous les noeuds
154
			// on vide tous les noeuds
153
				arbreMotsCles.getRootNode().eachChild(new NodeTraversalCallback() {
155
			arbreMotsCles.getRootNode().eachChild(new NodeTraversalCallback() {
154
					
156
 
155
					public boolean execute(Node node) {
157
				public boolean execute(Node node) {
156
						
158
 
157
						node.remove() ;
159
					node.remove();
158
						return true ;
160
					return true;
159
					}
161
				}
160
					
-
 
161
					
162
 
162
				}) ;
163
			});
163
				
164
 
164
				// et on recopie le nouvel arbre
165
			// et on recopie le nouvel arbre
165
				copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles.getRootNode()) ;
166
			copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles
-
 
167
					.getRootNode());
166
					
168
 
167
					// si l'arbre n'était pas encore considéré comme instancié
169
			// si l'arbre n'était pas encore considéré comme instancié
168
					if(!estInstancie)
170
			if (!estInstancie) {
169
					{
-
 
170
						// on signale que oui
171
				// on signale que oui
171
						estInstancie = true ;
172
				estInstancie = true;
172
					}
173
			}
173
					
174
 
174
					// l'état du filtre est réinitialisé 
175
			// l'état du filtre est réinitialisé
175
					filtreModifie = false ;
176
			filtreModifie = false;
176
					
177
 
177
					show() ;
178
			show();
178
		}
179
		}
179
		
180
 
180
		if(nouvelleDonnees instanceof TreeNode)
181
		if (nouvelleDonnees instanceof TreeNode) {
181
		{
-
 
182
			TreeNode nd = (TreeNode)nouvelleDonnees ;
182
			TreeNode nd = (TreeNode) nouvelleDonnees;
183
			
183
 
184
			// si le noeud n'existe pas déjà c'est un ajout
184
			// si le noeud n'existe pas déjà c'est un ajout
185
			if(arbreMotsCles.getTree().getNodeById(nd.getId()+"_filtre") == null)
185
			if (arbreMotsCles.getTree().getNodeById(nd.getId() + "_filtre") == null) {
186
			{
-
 
187
				// donc on ne fait rien de spécial
186
				// donc on ne fait rien de spécial
188
			}
187
			}
189
			// si le noeud existe déjà c'est un déplacement
188
			// si le noeud existe déjà c'est un déplacement
190
			else
189
			else {
191
			{
-
 
192
				// alors on supprime d'abord le noeud concerné
190
				// alors on supprime d'abord le noeud concerné
193
				arbreMotsCles.getTree().getNodeById(nd.getId()+"_filtre").remove() ;
191
				arbreMotsCles.getTree().getNodeById(nd.getId() + "_filtre")
-
 
192
						.remove();
194
			}
193
			}
195
			
194
 
196
			// on cherche le père du nouveau noeud
195
			// on cherche le père du nouveau noeud
197
			Node ndPereOriginal = nd.getParentNode() ;
196
			Node ndPereOriginal = nd.getParentNode();
198
			String idPereFiltre = ndPereOriginal.getId()+"_filtre" ;
197
			String idPereFiltre = ndPereOriginal.getId() + "_filtre";
199
			
198
 
200
			String[] usObj = (String[])nd.getUserObject() ;
199
			String[] usObj = (String[]) nd.getUserObject();
201
			TreeNode child = new TreeNode(usObj[0]) ;
200
			TreeNode child = new TreeNode(usObj[0]);
202
			child.setId(usObj[1]+"_filtre") ;
201
			child.setId(usObj[1] + "_filtre");
203
			child.setChecked(false);
202
			child.setChecked(false);
204
			child.setUserObject(usObj) ;
203
			child.setUserObject(usObj);
205
			arbreMotsCles.getNodeById(idPereFiltre).appendChild(child) ;
204
			arbreMotsCles.getNodeById(idPereFiltre).appendChild(child);
206
			
205
 
207
			// et on ajoute le nouveau noeud à son père
206
			// et on ajoute le nouveau noeud à son père
208
			copierFilsNoeud(nd, child) ;
207
			copierFilsNoeud(nd, child);
209
		}
208
		}
210
		
209
 
211
		// si on reçoit une string
210
		// si on reçoit une string
212
		if(nouvelleDonnees instanceof String)
211
		if (nouvelleDonnees instanceof String) {
213
		{
-
 
214
			String idSupp = (String)nouvelleDonnees+"_filtre" ;
212
			String idSupp = (String) nouvelleDonnees + "_filtre";
215
			// c'est une suppression et si le noeud existe bien
213
			// c'est une suppression et si le noeud existe bien
216
			if(arbreMotsCles.getTree().getNodeById(idSupp) != null)
214
			if (arbreMotsCles.getTree().getNodeById(idSupp) != null) {
217
			{
-
 
218
				// on le supprime
215
				// on le supprime
219
				arbreMotsCles.getTree().getNodeById(idSupp).remove() ;
216
				arbreMotsCles.getTree().getNodeById(idSupp).remove();
220
			}
217
			}
221
		}
218
		}
222
		
219
 
223
	}
220
	}
224
	
221
 
225
	/**
222
	/**
226
	 * Accesseur pour le médiateur
223
	 * Accesseur pour le médiateur
-
 
224
	 * 
227
	 * @return le médiateur associé
225
	 * @return le médiateur associé
228
	 */
226
	 */
229
	public ImageMediateur getIMediateur()
227
	public ImageMediateur getIMediateur() {
230
	{
-
 
231
		return iMediateur ;
228
		return iMediateur;
232
	}
229
	}
233
	
230
 
234
	/**
231
	/**
235
	 * Accesseur pour le panneau contenant l'arbre
232
	 * Accesseur pour le panneau contenant l'arbre
-
 
233
	 * 
236
	 * @return le panneau de l'arbre des mots clés
234
	 * @return le panneau de l'arbre des mots clés
237
	 */
235
	 */
238
	public TreePanel getArbreMotsCles()
236
	public TreePanel getArbreMotsCles() {
239
	{
-
 
240
		return arbreMotsCles ;
237
		return arbreMotsCles;
241
	}
238
	}
242
	
239
 
243
	/**
240
	/**
244
	 * Méthode héritée de Filtrable
241
	 * Méthode héritée de Filtrable renvoie le nom du filtre
245
	 * renvoie le nom du filtre
-
 
246
	 */
242
	 */
247
	public String renvoyerNomFiltre() {
243
	public String renvoyerNomFiltre() {
248
		
244
 
249
		return "mots clés" ;
245
		return "mots clés";
250
	}
246
	}
251
	
247
 
252
	/**
248
	/**
253
	 * Renvoie un tableau contenant le nom du champ à filtrer et la valeur
249
	 * Renvoie un tableau contenant le nom du champ à filtrer et la valeur
-
 
250
	 * 
254
	 * @return un tableau contenant le nom du champ à filtrer et sa valeur
251
	 * @return un tableau contenant le nom du champ à filtrer et sa valeur
255
	 */
252
	 */
256
	public String[] renvoyerValeursAFiltrer() {
253
	public String[] renvoyerValeursAFiltrer() {
257
		
254
 
258
		valider() ;
255
		valider();
259
		
256
 
260
		String[] valeursFiltrees = {"ci_meta_mots_cles",motsClesEncours} ;
257
		String[] valeursFiltrees = { "ci_meta_mots_cles", motsClesEncours };
261
		
258
 
262
		return valeursFiltrees ;
259
		return valeursFiltrees;
263
	}
260
	}
264
	
261
 
265
	/**
262
	/**
266
	 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un copie du sous arbre du premier
263
	 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un
267
	 * noeud, qu'elle concatène au deuxième 
264
	 * copie du sous arbre du premier noeud, qu'elle concatène au deuxième
-
 
265
	 * 
-
 
266
	 * @param ndPereOriginal
268
	 * @param ndPereOriginal le père des noeuds de l'arbre original
267
	 *            le père des noeuds de l'arbre original
-
 
268
	 * @param ndPereCopie
269
	 * @param ndPereCopie le père qui va recevoir les copies
269
	 *            le père qui va recevoir les copies
270
	 */
270
	 */
271
	private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie)
271
	private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) {
272
	{
-
 
273
		if(ndPereCopie != null && ndPereOriginal != null)
272
		if (ndPereCopie != null && ndPereOriginal != null) {
274
		{
-
 
275
			Node[] ndNodeFils = ndPereOriginal.getChildNodes() ;
273
			Node[] ndNodeFils = ndPereOriginal.getChildNodes();
276
			
274
 
277
			for (int i = 0; i < ndNodeFils.length; i++) {
275
			for (int i = 0; i < ndNodeFils.length; i++) {
278
				
276
 
279
				String[] usObj = (String[])ndNodeFils[i].getUserObject() ;
277
				String[] usObj = (String[]) ndNodeFils[i].getUserObject();
280
				TreeNode child = new TreeNode(usObj[0]) ;
278
				TreeNode child = new TreeNode(usObj[0]);
281
				child.setId(usObj[1]+"_filtre") ;
279
				child.setId(usObj[1] + "_filtre");
282
				child.setChecked(false);
280
				child.setChecked(false);
283
				child.setUserObject(usObj) ;
281
				child.setUserObject(usObj);
284
				ndPereCopie.appendChild(child) ;
282
				ndPereCopie.appendChild(child);
285
				
283
 
286
				if(! ndNodeFils[i].isLeaf())
284
				if (!ndNodeFils[i].isLeaf()) {
287
				{
-
 
288
					copierFilsNoeud(ndNodeFils[i],child) ;
285
					copierFilsNoeud(ndNodeFils[i], child);
289
				}
286
				}
290
				
287
 
291
			}
288
			}
292
		}
289
		}
293
	}
290
	}
294
 
291
 
295
	/**
292
	/**
296
	 * Méthode héritée de Filtrable
-
 
297
	 * Renvoie l'état du filtre (modifié ou non)
293
	 * Méthode héritée de Filtrable Renvoie l'état du filtre (modifié ou non)
298
	 */
294
	 */
299
	public boolean renvoyerEtatFiltre() {
295
	public boolean renvoyerEtatFiltre() {
300
		
296
 
301
		return filtreModifie ;
297
		return filtreModifie;
302
	}
298
	}
303
	
299
 
304
	public void valider()
300
	public void valider() {
305
	{
-
 
306
		if(estInstancie)
301
		if (estInstancie) {
307
		{
-
 
308
			// on vide les mots clés en cours
302
			// on vide les mots clés en cours
309
			motsClesEncours = "" ;
303
			motsClesEncours = "";
310
			// pour chaque noeud à partir de la racine
304
			// pour chaque noeud à partir de la racine
311
			getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
305
			getArbreMotsCles().getRootNode().cascade(
-
 
306
					new NodeTraversalCallback() {
312
			
307
 
313
			// on éxécute une fonction
308
						// on éxécute une fonction
314
			public boolean execute(Node node) {
309
						public boolean execute(Node node) {
315
			
310
 
316
					// on récupère le mot clé associé au noeud et ses infos
311
							// on récupère le mot clé associé au noeud et ses
-
 
312
							// infos
317
					TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
313
							TreeNode tn = getArbreMotsCles().getNodeById(
-
 
314
									node.getId());
318
	
315
 
319
						String[] usObject =  (String[])tn.getUserObject() ;
316
							String[] usObject = (String[]) tn.getUserObject();
320
						getIMediateur().mettreAjourMotsClesId(usObject[0],usObject[1]) ;
317
							getIMediateur().mettreAjourMotsClesId(usObject[0],
-
 
318
									usObject[1]);
321
							
319
 
322
							if(tn.getUI().isChecked())
320
							if (tn.getUI().isChecked()) {
323
							{
-
 
324
								// et les concatène à la string des mots clés en cours
321
								// et les concatène à la string des mots clés en
-
 
322
								// cours
325
								motsClesEncours += usObject[1]+"," ;
323
								motsClesEncours += usObject[1] + ",";
326
							}
324
							}
327
					
325
 
328
					return true ;
326
							return true;
329
				}
327
						}
330
					
328
 
331
			});
329
					});
332
			
330
 
333
			// on suppose que le filtre a change
331
			// on suppose que le filtre a change
334
			filtreModifie = true ;
332
			filtreModifie = true;
335
		}
333
		}
336
	}
334
	}
337
 
335
 
338
}
336
}