Subversion Repositories eFlore/Applications.cel

Rev

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