Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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