Subversion Repositories eFlore/Applications.coel

Rev

Rev 1642 | Rev 1881 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
665 jp_milcent 1
package org.tela_botanica.client.composants;
2
 
3
import java.util.HashMap;
4
 
691 jp_milcent 5
import org.tela_botanica.client.Mediateur;
665 jp_milcent 6
import org.tela_botanica.client.images.Images;
721 gduche 7
import org.tela_botanica.client.modeles.Valeur;
955 jpm 8
import org.tela_botanica.client.modeles.aDonnee;
1468 jpm 9
import org.tela_botanica.client.util.Debug;
665 jp_milcent 10
 
11
import com.extjs.gxt.ui.client.event.ButtonEvent;
1262 cyprien 12
import com.extjs.gxt.ui.client.event.Events;
13
import com.extjs.gxt.ui.client.event.FieldEvent;
14
import com.extjs.gxt.ui.client.event.Listener;
665 jp_milcent 15
import com.extjs.gxt.ui.client.event.SelectionListener;
721 gduche 16
import com.extjs.gxt.ui.client.store.ListStore;
665 jp_milcent 17
import com.extjs.gxt.ui.client.widget.LayoutContainer;
18
import com.extjs.gxt.ui.client.widget.MessageBox;
19
import com.extjs.gxt.ui.client.widget.Text;
20
import com.extjs.gxt.ui.client.widget.button.Button;
721 gduche 21
import com.extjs.gxt.ui.client.widget.form.ComboBox;
857 jpm 22
import com.extjs.gxt.ui.client.widget.form.Field;
665 jp_milcent 23
import com.extjs.gxt.ui.client.widget.form.HiddenField;
24
import com.extjs.gxt.ui.client.widget.form.LabelField;
25
import com.extjs.gxt.ui.client.widget.form.TextField;
1093 gduche 26
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
665 jp_milcent 27
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
28
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
29
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
30
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
31
 
32
public class ChampMultiValeurs extends LayoutContainer {
727 gduche 33
	//TODO : changer le champRecapitulatif par une hashMap
34
	//TODO : autoriser la modification des champs saisis
35
 
665 jp_milcent 36
	String idChampCache = null;
37
 
38
	String nomLabelChampTxt = "";
39
 
40
	String titreErreur = null;
41
	String valeurVideMsg = null;
42
	String valeurIdentiqueMsg = null;
694 gduche 43
	String valeurNonValideMsg = null;
44
 
693 gduche 45
	String valeurParDefaut = "";
857 jpm 46
	String validationMasque = null;
694 gduche 47
	String exempleValidation = null;
700 gduche 48
	String boutonSupprimerLabel = "";
665 jp_milcent 49
 
50
	LayoutContainer principalLayout = null;
857 jpm 51
	Field<String> champValeurTxt = null;
52
	ComboBox<Valeur> champValeurCombo = null;
665 jp_milcent 53
	HiddenField<String> champRecapitulatif = null;
54
	HashMap<String, LayoutContainer> valeurs = null;
721 gduche 55
	ComboBox<Valeur> types = null;
665 jp_milcent 56
 
57
	int largeurTotale = 420;
58
	int largeurBouton = 20;
59
	int largeurChamp = 0;
861 jpm 60
	int largeurType = 0;
665 jp_milcent 61
 
721 gduche 62
	boolean estMultiType = false;
857 jpm 63
	boolean estComboBox = false;
721 gduche 64
 
665 jp_milcent 65
	public ChampMultiValeurs() {
66
		initialiserChampMultiValeur(null, 0);
67
	}
68
 
69
	public ChampMultiValeurs(String label) {
70
		initialiserChampMultiValeur(label, 0);
71
	}
72
 
73
	public ChampMultiValeurs(String label, int largeurTotale) {
74
		initialiserChampMultiValeur(label, largeurTotale);
75
	}
76
 
972 gduche 77
	public ChampMultiValeurs(boolean estMultiType, String label, int largeurTotale, int largeurType) {
857 jpm 78
		this.estMultiType = estMultiType;
721 gduche 79
		initialiserChampMultiValeur(label, largeurTotale);
80
	}
861 jpm 81
 
82
	public ChampMultiValeurs(boolean estCombobox, boolean estMultiType, String label, int largeurTotale, int largeurType) {
857 jpm 83
		this.estMultiType = estMultiType;
84
		this.estComboBox = estCombobox;
861 jpm 85
		setLargeurType(largeurType);
857 jpm 86
		initialiserChampMultiValeur(label, largeurTotale);
87
	}
88
 
1262 cyprien 89
	public ComboBox<Valeur> getTypes() {
90
		return this.types;
91
	}
92
 
665 jp_milcent 93
	public void setLabel(String label) {
94
		if (label == null) {
95
			label = "";
96
		}
97
		nomLabelChampTxt = label;
98
	}
99
 
861 jpm 100
	public void setLargeurChamp(int largeurMax) {
101
		if (largeurMax != 0 && largeurMax > 20) {
102
			largeurTotale = largeurMax;
665 jp_milcent 103
		}
861 jpm 104
 
665 jp_milcent 105
		largeurChamp = largeurTotale - largeurBouton;
106
	}
107
 
861 jpm 108
	public void setLargeurType(int largeur) {
109
		largeurType = largeur;
110
	}
111
 
694 gduche 112
	public void setValidation (String validation, String exempleValidation)	{
857 jpm 113
		this.validationMasque = validation;
694 gduche 114
		this.exempleValidation = exempleValidation;
115
 
116
		this.valeurNonValideMsg = Mediateur.i18nM.valeurNonValideMsg(exempleValidation);
117
	}
118
 
693 gduche 119
	public void setValeurParDefaut(String valeur)	{
120
		this.valeurParDefaut = valeur;
857 jpm 121
		champValeurTxt.setValue(valeur);
693 gduche 122
	}
123
 
700 gduche 124
	public void setValeurBoutonSupprimer(String valeur)	{
125
		this.boutonSupprimerLabel = valeur;
126
	}
127
 
665 jp_milcent 128
	private void initialiserChampMultiValeur(String label, int largeur) {
129
		setLabel(label);
861 jpm 130
		setLargeurChamp(largeur);
665 jp_milcent 131
 
691 jp_milcent 132
		titreErreur = Mediateur.i18nC.erreurSaisieTitre();
133
		valeurVideMsg = Mediateur.i18nC.demanderValeur();
134
		valeurIdentiqueMsg = Mediateur.i18nC.valeurDejaPresente();
665 jp_milcent 135
 
136
		valeurs = new HashMap<String, LayoutContainer>();
137
		champRecapitulatif = new HiddenField<String>();
138
		champRecapitulatif.setValue("");
139
 
140
		setLayout(new FormLayout());
141
 
142
		creerChampMultiValeurs();
143
	}
144
 
145
	private void creerChampMultiValeurs() {
146
		principalLayout = new LayoutContainer();
147
		principalLayout.setLayout(new RowLayout());
148
 
149
		LabelField label = new LabelField(nomLabelChampTxt + ":");
861 jpm 150
		label.setWidth("95%");
665 jp_milcent 151
		principalLayout.add(label);
152
 
861 jpm 153
		LayoutContainer colonneConteneur = new LayoutContainer();
154
		colonneConteneur.setLayout(new ColumnLayout());
665 jp_milcent 155
 
721 gduche 156
		if (estMultiType == true)	{
157
			types = new ComboBox<Valeur>();
158
			types.setDisplayField("nom");
159
			types.setEmptyText("Choisissez:");
160
			types.setStore(new ListStore<Valeur>());
1093 gduche 161
			types.setTypeAhead(true);
162
			types.setTriggerAction(TriggerAction.ALL);
1262 cyprien 163
 
164
			types.addListener(Events.Select, new Listener<FieldEvent>() {
165
				public void handleEvent(FieldEvent fe) {
166
 
167
				}
168
			});
169
 
861 jpm 170
			colonneConteneur.add(types, new ColumnData(largeurType));
721 gduche 171
		}
172
 
857 jpm 173
		if (estComboBox) {
174
			champValeurCombo = new ComboBox<Valeur>();
175
			champValeurCombo.setDisplayField("nom");
176
			champValeurCombo.setStore(new ListStore<Valeur>());
1262 cyprien 177
			colonneConteneur.add(champValeurCombo, new ColumnData(largeurChamp));
857 jpm 178
		} else {
179
			champValeurTxt = new TextField<String>();
861 jpm 180
			colonneConteneur.add(champValeurTxt, new ColumnData(largeurChamp));
857 jpm 181
		}
665 jp_milcent 182
		Button ajouterBouton = new Button();
183
		ajouterBouton.setIcon(Images.ICONES.ajouter());
857 jpm 184
		ajouterBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
185
			public void componentSelected(ButtonEvent ce) {
1641 aurelien 186
				surAjoutValeur(true);
857 jpm 187
			}
188
		});
861 jpm 189
		colonneConteneur.add(ajouterBouton, new ColumnData(largeurBouton));
665 jp_milcent 190
 
191
		principalLayout.add(champRecapitulatif);
861 jpm 192
		principalLayout.add(colonneConteneur);
665 jp_milcent 193
		add(principalLayout);
194
	}
195
 
1641 aurelien 196
	private void surAjoutValeur(boolean validerChamp) {
197
		String valeurChamp = "";
198
		if (estComboBox) {
199
			if (champValeurCombo.getValue() != null) {
200
				valeurChamp = champValeurCombo.getValue().getId();
201
			}
202
		} else {
203
			valeurChamp = champValeurTxt.getValue();
204
		}
205
 
206
		if ((valeurChamp == null) || valeurChamp.trim().equals("") || valeurChamp.trim().equals(valeurParDefaut))	{
207
			if(validerChamp) {
208
				MessageBox.alert(titreErreur, valeurVideMsg, null);
209
			}
210
		} else if (valeurs.get(valeurChamp) != null) {
211
			if(validerChamp) {
212
				MessageBox.alert(titreErreur, valeurIdentiqueMsg, null);
213
			}
214
		} else {
215
			if (validationMasque != null && !valeurChamp.matches(validationMasque)) {
216
				if(validerChamp) {
217
					MessageBox.alert(titreErreur, valeurNonValideMsg, null);
218
				}
219
			} else {
220
				if (estMultiType)	{
221
					String type = "";
222
					String id = "";
223
					Valeur valeur = types.getValue();
224
 
225
					if (valeur != null)	{
226
						type = valeur.getNom();
227
						id = valeur.getId();
228
					} else {
229
						type = types.getRawValue();
230
						id = type;
231
					}
232
 
233
					if (type.trim().equals(""))	{
234
						MessageBox.alert(Mediateur.i18nM.titreErreurSaisie(), Mediateur.i18nM.typeChampMulti(), null);
235
					} else {
236
						ajouterValeur(valeurChamp, type, id);
237
					}
238
				} else {
239
					ajouterValeur(valeurChamp);
240
				}
241
			}
242
		}
243
	}
244
 
1642 aurelien 245
	//TODO: la fonction est valide et la fonction surAjoutValeur ont beaucoup en commun
246
	// voir si on peut les factoriser (ou déplacer les alertes dans les classes appelantes)
247
	public boolean estValide(boolean autoriserVide) {
248
		boolean valide = true;
249
		String valeurChamp = "";
250
		if (estComboBox) {
251
			if (champValeurCombo.getValue() != null) {
252
				valeurChamp = champValeurCombo.getValue().getId();
253
			}
254
		} else {
255
			valeurChamp = champValeurTxt.getValue();
256
		}
257
 
258
		if ((valeurChamp == null) || valeurChamp.trim().equals("") || valeurChamp.trim().equals(valeurParDefaut))	{
259
			if(!autoriserVide) {
260
				valide = false;
261
			}
262
		} else if (valeurs.get(valeurChamp) != null) {
263
			if(!autoriserVide) {
264
				valide = false;
265
			}
266
		} else {
267
			if (validationMasque != null && !valeurChamp.matches(validationMasque)) {
268
					valide = false;
269
			} else {
270
				if (estMultiType)	{
271
					String type = "";
272
					String id = "";
273
					Valeur valeur = types.getValue();
274
 
275
					if (valeur != null)	{
276
						type = valeur.getNom();
277
						id = valeur.getId();
278
					} else {
279
						type = types.getRawValue();
280
						id = type;
281
					}
282
 
283
					if (type.trim().equals(""))	{
284
						valide = false;
285
					}
286
				}
287
			}
288
		}
289
		return valide;
290
	}
291
 
721 gduche 292
	public void ajouterValeur(final String texte, final String strValeur, final String id)	{
293
		//Implémenté dans classe inférieure
294
	}
295
 
700 gduche 296
	public void ajouterValeur(final String texte) 	{
1468 jpm 297
 
665 jp_milcent 298
		LayoutContainer colonneLayout = new LayoutContainer();
299
		colonneLayout.setLayout(new ColumnLayout());
300
		valeurs.put(texte, colonneLayout);
301
 
302
		Text champTxt = new Text();
303
		champTxt.setText(texte);
304
		colonneLayout.add(champTxt, new ColumnData(largeurChamp));
305
 
306
		Button supprimerBouton = new Button();
307
		supprimerBouton.setIcon(Images.ICONES.supprimer());
700 gduche 308
		supprimerBouton.setText(boutonSupprimerLabel);
665 jp_milcent 309
		supprimerBouton.setData("valeur", texte);
310
		supprimerBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
311
			public void componentSelected(ButtonEvent ce) {
312
				String valeur = ce.getComponent().getData("valeur");
313
				LayoutContainer valeurLayout = valeurs.get(valeur);
314
				principalLayout.remove(valeurLayout);
315
 
316
				valeurs.remove(valeur);
1468 jpm 317
 
700 gduche 318
				supprimerValeurDuRecapitulatif(valeur);
665 jp_milcent 319
 
320
				actualiserLayoutGlobal();
321
			}
322
		});
323
		colonneLayout.add(supprimerBouton, new ColumnData(largeurBouton));
324
 
325
		// Ajout du layout de la valeur au layout principal
326
		principalLayout.add(colonneLayout);
327
 
328
		// Ajout de la valeur au champ récapitulatif des valeurs ajoutées
329
		ajouterValeurAuRecapitulatif(texte);
693 gduche 330
		reinitialiserChamp();
665 jp_milcent 331
		actualiserLayoutGlobal();
332
	}
333
 
721 gduche 334
	public void reinitialiserChamp()	{
857 jpm 335
		if (estComboBox) {
336
			champValeurCombo.setValue(champValeurCombo.getStore().findModel("id_valeur", valeurParDefaut));
337
		} else {
338
			champValeurTxt.setValue(valeurParDefaut);
339
		}
340
 
341
		if (estMultiType) {
342
			types.reset();
343
		}
693 gduche 344
	}
345
 
721 gduche 346
	public void actualiserLayoutGlobal() {
665 jp_milcent 347
		layout();
348
	}
349
 
700 gduche 350
	public void ajouterValeurAuRecapitulatif(String texte) {
665 jp_milcent 351
		String texteRecapitulatif = "";
352
		if (champRecapitulatif.getValue() != null)	{
353
			texteRecapitulatif = champRecapitulatif.getValue();
354
		}
955 jpm 355
		texteRecapitulatif += texte + aDonnee.SEPARATEUR_VALEURS;
665 jp_milcent 356
		champRecapitulatif.setValue(texteRecapitulatif);
357
	}
358
 
700 gduche 359
	public void supprimerValeurDuRecapitulatif(String texte) {
1468 jpm 360
 
665 jp_milcent 361
		if (champRecapitulatif.getValue() != null)	{
1468 jpm 362
			String texteValeur = "";
1513 jpm 363
			if (estComboBox) {
364
				// comme c'est le nom de la valeur qui est passée en paramètre,
365
				// on doit récupérer son id
366
				ListStore<Valeur> valeurs = champValeurCombo.getStore();
367
				Valeur objetValeur = valeurs.findModel("nom", texte);
368
 
369
				if (objetValeur != null)	{
370
					texteValeur = objetValeur.getId();
371
				} else {
372
					texteValeur = texte;
373
				}
1468 jpm 374
			} else {
375
				texteValeur = texte;
376
			}
377
 
665 jp_milcent 378
			String texteRecapitulatif = champRecapitulatif.getValue();
1468 jpm 379
			texteRecapitulatif = texteRecapitulatif.replace(texteValeur + aDonnee.SEPARATEUR_VALEURS, "");
665 jp_milcent 380
			champRecapitulatif.setValue(texteRecapitulatif);
381
		}
382
	}
383
 
384
	public String getValeurs() {
1641 aurelien 385
		// permet de s'assurer qu'une valeur saisie dans le champ mais non ajoutée par le
386
		// clic sur le + soit bien prise en compte
387
		surAjoutValeur(false);
665 jp_milcent 388
		String texteRecapitulatif = "";
389
		if (champRecapitulatif.getValue() != null) {
390
			texteRecapitulatif = champRecapitulatif.getValue();
955 jpm 391
			texteRecapitulatif = texteRecapitulatif.replaceAll("(.*)"+aDonnee.SEPARATEUR_VALEURS+"$", "$1");
665 jp_milcent 392
		}
393
		return texteRecapitulatif;
394
	}
669 jp_milcent 395
 
396
	public void peupler(String chaineExistante) {
853 gduche 397
		if (valeurs.size()>0)	{
398
			reinitialiser();
399
		}
691 jp_milcent 400
		if (chaineExistante != null && !chaineExistante.trim().equals("")) {
955 jpm 401
			String[] valeurs = chaineExistante.split(aDonnee.SEPARATEUR_VALEURS);
669 jp_milcent 402
			for (int i = 0; i < valeurs.length; i++) {
403
				ajouterValeur(valeurs[i]);
404
			}
405
		}
406
	}
830 gduche 407
 
408
	public void reinitialiser()	{
409
		//TODO : pourrait etre mieux fait si les valeurs étaient enregistrées dans un
410
		// layout particulier. Il suffirait alors d'enlever les valeurs de ce layout.
411
		principalLayout.removeAll();
412
		initialiserChampMultiValeur(nomLabelChampTxt, largeurTotale);
413
	}
665 jp_milcent 414
}