Subversion Repositories eFlore/Applications.cel

Rev

Rev 5 | 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();
76
 
77
		this.setPaddings(5);
78
 
79
		this.setBorder(false);
80
		this.setCollapsible(true);
81
		this.setAutoWidth(true);
82
 
83
		add(labelRecherche);
84
 
2 aperonnet 85
		// on ajoute les listeners
5 aperonnet 86
		ajouterListenersPanel();
87
		estInstancie = false;
2 aperonnet 88
	}
5 aperonnet 89
 
2 aperonnet 90
	/**
91
	 * Ajoute les listeners pour le rendu du panel
92
	 */
5 aperonnet 93
	private void ajouterListenersPanel() {
2 aperonnet 94
		this.addListener(new PanelListenerAdapter() {
95
 
5 aperonnet 96
			// on instancie réellement les composants au moment du rendu pour
97
			// accélérer l'affichage
2 aperonnet 98
			// et éviter des bugs
99
			public void onRender(Component component) {
5 aperonnet 100
 
2 aperonnet 101
				// on interdit le drag and drop dans l'arbre
5 aperonnet 102
				arbreMotsCles.setEnableDD(false);
103
				arbreMotsCles.setId("x-view-tree-filter");
104
				arbreMotsCles.setAutoWidth(false);
105
				arbreMotsCles.setAutoScroll(true);
106
				arbreMotsCles.setBorder(false);
107
 
58 jpm 108
				if(estInstancie)
109
				{
110
					// on crée une racine pour l'arbre
111
					TreeNode root = new TreeNode("Tags");
112
					root.setId("racine_filtre");
113
					String[] usObject = { "Mots clés", "racine" };
114
					root.setUserObject(usObject);
115
					arbreMotsCles.setRootNode(root);
116
				}
117
 
5 aperonnet 118
				arbreMotsCles.setRootVisible(true);
119
				arbreMotsCles.setBorder(false);
120
 
2 aperonnet 121
				// on met en forme le layout
5 aperonnet 122
				((Panel) component).add(arbreMotsCles);
123
 
2 aperonnet 124
				// on ajoute les listeners d'évenements
5 aperonnet 125
				ajouterListeners();
126
 
2 aperonnet 127
				// et on demande l'arbre des mots clés
5 aperonnet 128
				getIMediateur()
129
						.obtenirArbreMotsCles(
130
								getIMediateur().getPanneauFiltres()
131
										.getMotsClesFiltre());
132
 
2 aperonnet 133
				// enfin on considère le composant comme instancié
5 aperonnet 134
				estInstancie = true;
135
 
2 aperonnet 136
			}
5 aperonnet 137
 
138
		});
2 aperonnet 139
	}
5 aperonnet 140
 
2 aperonnet 141
	/**
142
	 * ajoute les listeners pour les boutons et le cochage des mots clés
5 aperonnet 143
	 */
144
	private void ajouterListeners() {
2 aperonnet 145
 
146
	}
5 aperonnet 147
 
2 aperonnet 148
	/**
149
	 * Méthode héritée de l'interface rafraichissable
150
	 */
151
	public void rafraichir(Object nouvelleDonnees,
152
			boolean repandreRaffraichissement) {
5 aperonnet 153
 
2 aperonnet 154
		// si on a reçu un arbre
5 aperonnet 155
		if (nouvelleDonnees instanceof Tree) {
156
			Tree nouvelArbre = (Tree) nouvelleDonnees;
157
 
158
			// on vide tous les noeuds
159
			arbreMotsCles.getRootNode().eachChild(new NodeTraversalCallback() {
160
 
161
				public boolean execute(Node node) {
162
 
163
					node.remove();
164
					return true;
165
				}
166
 
167
			});
168
 
169
			// et on recopie le nouvel arbre
170
			copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles
171
					.getRootNode());
172
 
173
			// si l'arbre n'était pas encore considéré comme instancié
174
			if (!estInstancie) {
175
				// on signale que oui
176
				estInstancie = true;
177
			}
178
 
179
			// l'état du filtre est réinitialisé
180
			filtreModifie = false;
58 jpm 181
			show() ;
2 aperonnet 182
		}
5 aperonnet 183
 
184
		if (nouvelleDonnees instanceof TreeNode) {
185
			TreeNode nd = (TreeNode) nouvelleDonnees;
186
 
2 aperonnet 187
			// si le noeud n'existe pas déjà c'est un ajout
5 aperonnet 188
			if (arbreMotsCles.getTree().getNodeById(nd.getId() + "_filtre") == null) {
2 aperonnet 189
				// donc on ne fait rien de spécial
190
			}
191
			// si le noeud existe déjà c'est un déplacement
5 aperonnet 192
			else {
2 aperonnet 193
				// alors on supprime d'abord le noeud concerné
5 aperonnet 194
				arbreMotsCles.getTree().getNodeById(nd.getId() + "_filtre")
195
						.remove();
2 aperonnet 196
			}
5 aperonnet 197
 
2 aperonnet 198
			// on cherche le père du nouveau noeud
5 aperonnet 199
			Node ndPereOriginal = nd.getParentNode();
200
			String idPereFiltre = ndPereOriginal.getId() + "_filtre";
201
 
202
			String[] usObj = (String[]) nd.getUserObject();
203
			TreeNode child = new TreeNode(usObj[0]);
204
			child.setId(usObj[1] + "_filtre");
2 aperonnet 205
			child.setChecked(false);
5 aperonnet 206
			child.setUserObject(usObj);
207
			arbreMotsCles.getNodeById(idPereFiltre).appendChild(child);
208
 
2 aperonnet 209
			// et on ajoute le nouveau noeud à son père
5 aperonnet 210
			copierFilsNoeud(nd, child);
58 jpm 211
			this.doLayout();
2 aperonnet 212
		}
5 aperonnet 213
 
2 aperonnet 214
		// si on reçoit une string
5 aperonnet 215
		if (nouvelleDonnees instanceof String) {
216
			String idSupp = (String) nouvelleDonnees + "_filtre";
2 aperonnet 217
			// c'est une suppression et si le noeud existe bien
5 aperonnet 218
			if (arbreMotsCles.getTree().getNodeById(idSupp) != null) {
2 aperonnet 219
				// on le supprime
5 aperonnet 220
				arbreMotsCles.getTree().getNodeById(idSupp).remove();
2 aperonnet 221
			}
58 jpm 222
 
2 aperonnet 223
		}
5 aperonnet 224
 
2 aperonnet 225
	}
5 aperonnet 226
 
2 aperonnet 227
	/**
228
	 * Accesseur pour le médiateur
5 aperonnet 229
	 *
2 aperonnet 230
	 * @return le médiateur associé
231
	 */
5 aperonnet 232
	public ImageMediateur getIMediateur() {
233
		return iMediateur;
2 aperonnet 234
	}
5 aperonnet 235
 
2 aperonnet 236
	/**
237
	 * Accesseur pour le panneau contenant l'arbre
5 aperonnet 238
	 *
2 aperonnet 239
	 * @return le panneau de l'arbre des mots clés
240
	 */
5 aperonnet 241
	public TreePanel getArbreMotsCles() {
242
		return arbreMotsCles;
2 aperonnet 243
	}
5 aperonnet 244
 
2 aperonnet 245
	/**
5 aperonnet 246
	 * Méthode héritée de Filtrable renvoie le nom du filtre
2 aperonnet 247
	 */
248
	public String renvoyerNomFiltre() {
5 aperonnet 249
 
250
		return "mots clés";
2 aperonnet 251
	}
5 aperonnet 252
 
2 aperonnet 253
	/**
254
	 * Renvoie un tableau contenant le nom du champ à filtrer et la valeur
5 aperonnet 255
	 *
2 aperonnet 256
	 * @return un tableau contenant le nom du champ à filtrer et sa valeur
257
	 */
258
	public String[] renvoyerValeursAFiltrer() {
5 aperonnet 259
 
260
		valider();
261
 
262
		String[] valeursFiltrees = { "ci_meta_mots_cles", motsClesEncours };
263
 
264
		return valeursFiltrees;
2 aperonnet 265
	}
5 aperonnet 266
 
2 aperonnet 267
	/**
5 aperonnet 268
	 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un
269
	 * copie du sous arbre du premier noeud, qu'elle concatène au deuxième
270
	 *
271
	 * @param ndPereOriginal
272
	 *            le père des noeuds de l'arbre original
273
	 * @param ndPereCopie
274
	 *            le père qui va recevoir les copies
2 aperonnet 275
	 */
5 aperonnet 276
	private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) {
277
		if (ndPereCopie != null && ndPereOriginal != null) {
278
			Node[] ndNodeFils = ndPereOriginal.getChildNodes();
279
 
2 aperonnet 280
			for (int i = 0; i < ndNodeFils.length; i++) {
5 aperonnet 281
 
282
				String[] usObj = (String[]) ndNodeFils[i].getUserObject();
283
				TreeNode child = new TreeNode(usObj[0]);
284
				child.setId(usObj[1] + "_filtre");
2 aperonnet 285
				child.setChecked(false);
5 aperonnet 286
				child.setUserObject(usObj);
287
				ndPereCopie.appendChild(child);
288
 
289
				if (!ndNodeFils[i].isLeaf()) {
290
					copierFilsNoeud(ndNodeFils[i], child);
2 aperonnet 291
				}
5 aperonnet 292
 
2 aperonnet 293
			}
294
		}
295
	}
296
 
297
	/**
5 aperonnet 298
	 * Méthode héritée de Filtrable Renvoie l'état du filtre (modifié ou non)
2 aperonnet 299
	 */
300
	public boolean renvoyerEtatFiltre() {
5 aperonnet 301
 
302
		return filtreModifie;
2 aperonnet 303
	}
5 aperonnet 304
 
305
	public void valider() {
306
		if (estInstancie) {
2 aperonnet 307
			// on vide les mots clés en cours
5 aperonnet 308
			motsClesEncours = "";
2 aperonnet 309
			// pour chaque noeud à partir de la racine
5 aperonnet 310
			getArbreMotsCles().getRootNode().cascade(
311
					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
317
							// infos
318
							TreeNode tn = getArbreMotsCles().getNodeById(
319
									node.getId());
320
 
321
							String[] usObject = (String[]) tn.getUserObject();
322
							getIMediateur().mettreAjourMotsClesId(usObject[0],
323
									usObject[1]);
324
 
325
							if (tn.getUI().isChecked()) {
326
								// et les concatène à la string des mots clés en
327
								// cours
328
								motsClesEncours += usObject[1] + ",";
2 aperonnet 329
							}
5 aperonnet 330
 
331
							return true;
332
						}
333
 
334
					});
335
 
2 aperonnet 336
			// on suppose que le filtre a change
5 aperonnet 337
			filtreModifie = true;
2 aperonnet 338
		}
339
	}
340
 
341
}