Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 43 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
40 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
 
47 aperonnet 7
import com.gwtext.client.core.EventObject;
40 aperonnet 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.Button;
12
import com.gwtext.client.widgets.Panel;
13
import com.gwtext.client.widgets.Window;
14
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
15
import com.gwtext.client.widgets.event.WindowListenerAdapter;
16
import com.gwtext.client.widgets.layout.RowLayout;
17
import com.gwtext.client.widgets.layout.RowLayoutData;
18
import com.gwtext.client.widgets.tree.TreeNode;
19
import com.gwtext.client.widgets.tree.TreePanel;
20
 
43 aperonnet 21
/**
22
 * fenêtre de recherche affichant l'arbre des mots clés en lecture et un bouton
23
 * cliquable
24
 * @author aurelien
25
 *
26
 */
40 aperonnet 27
public class ArbreMotsClesFiltreVue extends Window implements Rafraichissable, Filtrable {
28
 
29
	/**
30
	 * Le médiateur associé à la vue
31
	 */
32
	private ImageMediateur iMediateur = null ;
33
	/**
34
	 * Les mots clés en cours
35
	 */
36
	private String motsClesEncours = "" ;
37
 
38
	/**
39
	 * Le treepanel qui affiche l'arbre
40
	 */
41
	private TreePanel arbreMotsCles = null ;
42
 
43
	/**
44
	 * Bouton rechercher
45
	 */
46
	private Button rechercher = null ;
47
 
48
	/**
49
	 * booléen d'initialisation
50
	 */
51
	private boolean estInstancie = false ;
52
 
53
	/**
54
	 * booléen d'etat
55
	 */
56
	private boolean filtreModifie = false ;
57
 
43 aperonnet 58
	/**
59
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
60
	 */
40 aperonnet 61
	private ArbreMotsClesFiltreVue()
62
	{
63
		super() ;
64
	}
65
 
43 aperonnet 66
	/**
67
	 * Constructeur avec paramètres
68
	 * @param im le médiateur à associer
69
	 */
40 aperonnet 70
	public ArbreMotsClesFiltreVue(ImageMediateur im)
71
	{
72
 
73
		// on crée le panel
74
		super("Mots clés") ;
75
		this.setLayout(new RowLayout());
76
		iMediateur = im ;
77
 
78
		// on crée le conteneur de l'arbre
79
		arbreMotsCles = new TreePanel() ;
80
		// on permet le drag and drop dans l'arbre
81
		arbreMotsCles.setEnableDD(true) ;
82
		arbreMotsCles.setId("x-view-tree-filter") ;
83
		arbreMotsCles.setAutoWidth(true) ;
84
		//arbreMotsCles.setAutoScroll(true) ;
85
		arbreMotsCles.setBorder(false) ;
86
 
87
		// on crée une racine pour l'arbre
88
		TreeNode root = new TreeNode("Tags") ;
89
		root.setId("racine_filtre") ;
90
		String[] usObject = {"Mots clés" , "racine" } ;
91
		root.setUserObject(usObject) ;
92
 
93
		arbreMotsCles.setRootNode(root) ;
94
		arbreMotsCles.setRootVisible(false) ;
95
		arbreMotsCles.getRootNode().setIcon("tela.png") ;
96
		arbreMotsCles.setBorder(false) ;
97
 
98
		rechercher = new Button("Rechercher") ;
99
 
100
		// on met en forme le layout
101
		this.add(arbreMotsCles,new RowLayoutData("90%")) ;
102
		this.add(rechercher,new RowLayoutData("10%")) ;
103
 
104
		this.setBorder(false) ;
105
		this.setCollapsible(true) ;
43 aperonnet 106
		this.setCloseAction(HIDE) ;
40 aperonnet 107
 
108
		// on ajoute les listeners
109
		ajouterListeners() ;
110
		estInstancie = true ;
111
	}
112
 
43 aperonnet 113
	/**
114
	 * Ajoute les listeners
115
	 */
116
	private void ajouterListeners()
40 aperonnet 117
	{
118
		// gestion de la validation
119
		rechercher.addListener(new ButtonListenerAdapter() {
120
 
47 aperonnet 121
 
40 aperonnet 122
			public void onClick(Button button, EventObject e) {
123
 
124
				// on vide les mots clés en cours
125
				motsClesEncours = "" ;
126
				// pour chaque noeud à partir de la racine
127
				getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() {
128
 
129
				// on éxécute une fonction
130
				public boolean execute(Node node) {
131
 
132
						// on récupère le mot clé associé au noeud et ses infos
133
						TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ;
134
 
135
							String[] usObject =  (String[])tn.getUserObject() ;
136
							getIMediateur().mettreAjourMotsClesId(usObject[0],usObject[1]) ;
137
 
138
								if(tn.getUI().isChecked())
139
								{
140
									// et les concatène à la string des mots clés en cours
141
									motsClesEncours += usObject[1]+"," ;
142
								}
143
 
144
						return true ;
145
					}
146
 
147
				});
148
 
149
				// on suppose que le filtre a change
150
				filtreModifie = true ;
151
				// enfin on notifie le médiateur et on lui passe l'arbre et la liste des mots clés ainsi obtenue
152
				getIMediateur().obtenirPhotoGalerie(getIMediateur().getFiltreMotsCles()) ;
153
			}
154
 
155
		}) ;
156
 
43 aperonnet 157
		// gestion de la fermeture du panneau
40 aperonnet 158
		this.addListener(new WindowListenerAdapter() {
159
 
47 aperonnet 160
 
40 aperonnet 161
			public void onClose(Panel panel) {
162
 
163
				arbreMotsCles.getRootNode().destroy() ;
164
 
165
				// on crée une racine pour l'arbre
166
				TreeNode root = new TreeNode("Tags") ;
167
				root.setId("racine_filtre") ;
168
				String[] usObject = {"Mots clés" , "racine" } ;
169
				root.setUserObject(usObject) ;
170
				arbreMotsCles.setRootNode(root) ;
171
			}
172
		}) ;
173
	}
174
 
43 aperonnet 175
	/**
176
	 * Méthode héritée de l'interface rafraichissable
177
	 */
40 aperonnet 178
	public void rafraichir(Object nouvelleDonnees,
179
			boolean repandreRaffraichissement) {
180
 
181
		// si on a reçu un arbre
182
		if(nouvelleDonnees instanceof Tree)
183
		{
184
				Tree nouvelArbre = (Tree)nouvelleDonnees ;
185
 
43 aperonnet 186
				arbreMotsCles.getRootNode().eachChild(new NodeTraversalCallback() {
187
 
188
 
189
					public boolean execute(Node node) {
190
 
191
						node.remove() ;
192
						return true ;
193
					}
194
 
195
 
196
				}) ;
197
 
40 aperonnet 198
				copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles.getRootNode()) ;
199
 
200
					getArbreMotsCles().expandAll() ;
201
 
202
					// si l'arbre n'était pas encore considéré comme instancié
203
					if(!estInstancie)
204
					{
205
						// on signale que oui
206
						estInstancie = true ;
207
					}
208
 
209
					filtreModifie = false ;
210
 
211
					setSize(200, 300) ;
212
					show() ;
213
		}
214
 
215
	}
216
 
43 aperonnet 217
	/**
218
	 * Accesseur pour le médiateur
219
	 * @return le médiateur associé
220
	 */
40 aperonnet 221
	public ImageMediateur getIMediateur()
222
	{
223
		return iMediateur ;
224
	}
225
 
43 aperonnet 226
	/**
227
	 * Accesseur pour le panneau contenant l'arbre
228
	 * @return le panneau de l'arbre des mots clés
229
	 */
40 aperonnet 230
	public TreePanel getArbreMotsCles()
231
	{
232
		return arbreMotsCles ;
233
	}
43 aperonnet 234
 
235
	/**
236
	 * Méthode héritée de Filtrable
237
	 * renvoie le nom du filtre
238
	 */
40 aperonnet 239
	public String renvoyerNomFiltre() {
240
 
241
		return "mots clés" ;
242
	}
43 aperonnet 243
 
244
	/**
245
	 * Renvoie un tableau contenant le nom du champ à filtrer et la valeur
246
	 * @return un tableau contenant le nom du champ à filtrer et sa valeur
247
	 */
40 aperonnet 248
	public String[] renvoyerValeursAFiltrer() {
249
 
250
		String[] valeursFiltrees = {"ci_meta_mots_cles",motsClesEncours} ;
251
 
252
		return valeursFiltrees ;
253
	}
254
 
43 aperonnet 255
	/**
256
	 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un copie du sous arbre du premier
257
	 * noeud, qu'elle concatène au deuxième
258
	 * @param ndPereOriginal le père des noeuds de l'arbre original
259
	 * @param ndPereCopie le père qui va recevoir les copies
260
	 */
261
	private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie)
40 aperonnet 262
	{
263
		Node[] ndNodeFils = ndPereOriginal.getChildNodes() ;
264
 
265
		for (int i = 0; i < ndNodeFils.length; i++) {
266
 
267
			String[] usObj = (String[])ndNodeFils[i].getUserObject() ;
268
			TreeNode child = new TreeNode(usObj[0]) ;
269
			child.setIcon("tela.png") ;
270
			child.setChecked(false);
271
			child.setUserObject(usObj) ;
272
			ndPereCopie.appendChild(child) ;
273
 
274
			if(! ndNodeFils[i].isLeaf())
275
			{
276
				copierFilsNoeud(ndNodeFils[i],child) ;
277
			}
278
 
279
		}
280
	}
281
 
43 aperonnet 282
	/**
283
	 * Méthode héritée de Filtrable
284
	 * Renvoie l'état du filtre modifié ou nom)
285
	 */
40 aperonnet 286
	public boolean renvoyerEtatFiltre() {
287
 
288
		return filtreModifie ;
289
	}
290
 
291
}