Subversion Repositories eFlore/Archives.cel-v2

Rev

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