Subversion Repositories eFlore/Applications.cel

Rev

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