Subversion Repositories eFlore/Applications.coel

Rev

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

Rev Author Line No. Line
1287 cyprien 1
package org.tela_botanica.client.composants;
2
 
3
import java.util.HashMap;
4
 
5
import org.tela_botanica.client.Mediateur;
6
import org.tela_botanica.client.RegistreId;
7
import org.tela_botanica.client.composants.pagination.Proxy;
8
import org.tela_botanica.client.configuration.Configuration;
9
import org.tela_botanica.client.images.Images;
10
import org.tela_botanica.client.interfaces.Rafraichissable;
11
import org.tela_botanica.client.modeles.Valeur;
12
import org.tela_botanica.client.modeles.ValeurListe;
13
import org.tela_botanica.client.modeles.aDonnee;
14
import org.tela_botanica.client.util.Debug;
15
import org.tela_botanica.client.vues.Formulaire;
16
 
17
import com.extjs.gxt.ui.client.Registry;
18
import com.extjs.gxt.ui.client.data.ModelData;
19
import com.extjs.gxt.ui.client.data.ModelType;
20
import com.extjs.gxt.ui.client.event.ButtonEvent;
21
import com.extjs.gxt.ui.client.event.Events;
22
import com.extjs.gxt.ui.client.event.FieldEvent;
23
import com.extjs.gxt.ui.client.event.Listener;
24
import com.extjs.gxt.ui.client.event.SelectionListener;
25
import com.extjs.gxt.ui.client.store.ListStore;
26
import com.extjs.gxt.ui.client.widget.Component;
27
import com.extjs.gxt.ui.client.widget.LayoutContainer;
28
import com.extjs.gxt.ui.client.widget.MessageBox;
29
import com.extjs.gxt.ui.client.widget.Text;
30
import com.extjs.gxt.ui.client.widget.button.Button;
31
import com.extjs.gxt.ui.client.widget.form.ComboBox;
32
import com.extjs.gxt.ui.client.widget.form.Field;
33
import com.extjs.gxt.ui.client.widget.form.HiddenField;
34
import com.extjs.gxt.ui.client.widget.form.LabelField;
35
import com.extjs.gxt.ui.client.widget.form.TextField;
36
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
37
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
38
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
39
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
40
 
41
public class ChampMultiValeursMultiTypesPaginable extends ChampMultiValeursPaginable implements Rafraichissable {
42
 
43
	  //-------------//
44
	 //  ATTRIBUTS	//
45
	//-------------//
46
 
47
	// Elements pour le champ 'types'
48
	ColumnData colonneChampTypes = null;
49
	ChampComboBoxRechercheTempsReelPaginable champTypesComboBox = null;
50
	int largeurChampTypes = 200;
51
	String displayNameChampTypes = "nom";
52
 
53
	// Elements pour gérer le type de valeurs que contient le champ
54
	Proxy proxyChampTypes = null;
55
	ModelType modeltypeChampTypes = null;
56
 
57
	// Variables de traitement
58
	HashMap<Integer, String> tempMapValeurs = null;
59
 
60
	  //-------------//
61
	 //   METHODES	//
62
	//-------------//
63
 
64
	/*--------------
65
	  Constructeur
66
	--------------*/
67
	public ChampMultiValeursMultiTypesPaginable(String label, int largeurTotale, boolean estCombobox, ModelType modeltypeChampValeur, Proxy proxyChampValeur, String displayNameChampValeur, ModelType modeltypeChampTypes, Proxy proxyChampTypes, String displayNameChampTypes) {
68
		super(label, largeurTotale, estCombobox, modeltypeChampValeur, proxyChampValeur, displayNameChampValeur);
69
 
70
		this.proxyChampTypes = proxyChampTypes;
71
		this.modeltypeChampTypes = modeltypeChampTypes;
72
		this.displayNameChampTypes = displayNameChampTypes;
73
 
74
		initialiserChampMultiValeursMultiTypesPaginable(label);
75
	}
76
 
77
	/*------------
78
	  Accesseurs
79
	------------*/
80
 
81
	 //------------//
82
	//    Get     //------------------------------------------------------------
83
 
84
	public ChampComboBoxRechercheTempsReelPaginable getChampTypesComboBox() {
85
		return this.champTypesComboBox;
86
	}
87
 
88
	 //------------//
89
	//    Set     //------------------------------------------------------------
90
 
91
	@Override
92
	public void setLargeurTotale(int largeurTotale) {
93
		this.largeurTotale = largeurTotale;
94
		largeurChampValeur = largeurTotale - largeurBouton - largeurChampTypes;
95
	}
96
 
97
	/*-------------------------------------------
98
	  Méthodes protégées et méthodes publiques
99
	--------------------------------------------*/
100
 
101
	@Override
102
	public void rafraichir(Object nouvellesDonnees) {
103
		super.rafraichir(nouvellesDonnees);
104
 
105
		if (nouvellesDonnees instanceof ValeurListe) {
106
			Valeur v = ((ValeurListe)nouvellesDonnees).toList().get(0);
107
			ajouterValeur(tempMapValeurs.get(Integer.parseInt(v.getId())), v.getNom(), v.getId());
108
		}
109
	}
110
 
111
	@Override
1369 cyprien 112
	protected void ajouterValeur(final String texte, final String type, final String idType) {
1287 cyprien 113
 
114
		LayoutContainer colonneConteneur = new LayoutContainer();
115
		colonneConteneur.setLayout(new ColumnLayout());
1369 cyprien 116
		valeurs.put(idType + aDonnee.SEPARATEUR_TYPE_VALEUR + texte, colonneConteneur);
1287 cyprien 117
 
118
		Text champType = new Text();
119
		champType.setText(type + " : ");
120
		champType.setWidth(largeurChampTypes);
121
		colonneConteneur.add(champType, new ColumnData(largeurChampTypes));
122
 
123
		Text champValeur = new Text();
124
		champValeur.setText(texte);
125
		champValeur.setWidth(largeurChampTypes);
126
		colonneConteneur.add(champValeur, new ColumnData(largeurChampTypes));
127
 
128
		Button supprimerBouton = new Button();
129
		supprimerBouton.setIcon(Images.ICONES.supprimer());
130
		supprimerBouton.setText(boutonSupprimerLabel);
1369 cyprien 131
		supprimerBouton.setData("valeur", idType + aDonnee.SEPARATEUR_TYPE_VALEUR + texte);
1287 cyprien 132
 
133
		supprimerBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
134
			public void componentSelected(ButtonEvent ce) {
135
				String valeur = ce.getComponent().getData("valeur");
136
				LayoutContainer valeurLayout = valeurs.get(valeur);
137
				principalLayout.remove(valeurLayout);
138
				valeurs.remove(valeur);
139
				supprimerValeurDuRecapitulatif(valeur);
140
				actualiserLayoutGlobal();
141
			}
142
		});
143
		colonneConteneur.add(supprimerBouton, new ColumnData(largeurBouton));
144
 
145
		// Ajout du layout de la valeur au layout principal
146
		principalLayout.add(colonneConteneur);
147
 
148
		// Ajout de la valeur au champ récapitulatif des valeurs ajoutées
1369 cyprien 149
		ajouterValeurAuRecapitulatif(texte, idType);
150
 
1287 cyprien 151
		reinitialiserChamp();
152
		actualiserLayoutGlobal();
153
	}
154
 
155
	@Override
156
	public void peupler(String chaineExistante) {
157
 
158
		if (valeurs.size() > 0)	{
159
			reinitialiser();
160
		}
161
		if (chaineExistante != null && !chaineExistante.trim().equals("")) {
162
 
163
			String[] valeurs = chaineExistante.split(aDonnee.SEPARATEUR_VALEURS);
164
			for (int i = 0; i < valeurs.length; i++) {
165
				String[] idEtValeur = valeurs[i].split(aDonnee.SEPARATEUR_TYPE_VALEUR);
1428 cyprien 166
				if (idEtValeur.length == 2) {
167
					String idType = idEtValeur[0];
168
					String idValeur = idEtValeur[1];
169
 
170
					// Champ Valeur
171
					if (idType.matches("[0-9]+")) {
172
						tempMapValeurs.put(Integer.parseInt(idType), idValeur);
173
					} else {
174
						tempMapValeurs.put(((Configuration)(Registry.get(RegistreId.CONFIG))).getListeId(idType), idValeur);
175
					}
176
 
177
					// Champ Types
178
					mediateur.obtenirListeValeurEtRafraichir(this, Integer.parseInt(idType), null);
179
				} else {
180
					InfoLogger.display("Erreur", "ChampMultiValeursMultiTypesPaginable. Erreur dans le split de "+chaineExistante, true);
181
				}
1287 cyprien 182
			}
183
		}
184
	}
185
 
186
 
187
	/*------------------
188
	  Méthodes privées
189
	------------------*/
190
 
191
	private void initialiserChampMultiValeursMultiTypesPaginable(String label) {
192
		setLargeurTotale(largeurTotale);
193
		tempMapValeurs = new HashMap<Integer,String>();
194
		creerChampMultiValeursMultiTypes();
195
	}
196
 
197
	private void creerChampMultiValeursMultiTypes() {
198
 
199
		/* Creation du champ Types */
200
		champTypesComboBox = new ChampComboBoxRechercheTempsReelPaginable(proxyChampTypes, modeltypeChampTypes, displayNameChampTypes);
201
		champTypesComboBox.setWidth(largeurChampTypes);
202
		champTypesComboBox.getCombo().setEmptyText("Type...");
203
 
204
		champTypesComboBox.addListener(Events.Select, new Listener<FieldEvent>() {
205
			public void handleEvent(FieldEvent fe) {
206
 
207
			}
208
		});
209
 
210
		/* Placement des éléments dans le conteneur */
211
		// le champ "types" doit être graphiquement placé avant les autres champs,
212
		// on doit donc retirer ces derniers avant d'insérer le champ "types"
213
		colonneConteneur.removeAll();
214
		colonneConteneur.setWidth(largeurTotale);
215
		colonneChampTypes = new ColumnData(largeurChampTypes);
216
		colonneChampTypes.setWidth(largeurChampTypes);
217
		colonneConteneur.add(champTypesComboBox, colonneChampTypes);
218
		if (champValeurEstComboBox) {
219
			champValeurComboBox.setWidth(largeurChampValeur);
220
			colonneChampValeur.setWidth(largeurChampValeur);
221
			colonneConteneur.add(champValeurComboBox, colonneChampValeur);
222
		} else {
223
			champValeurTxt.setWidth(largeurChampValeur);
224
			colonneChampValeur.setWidth(largeurChampValeur);
225
			colonneConteneur.add(champValeurTxt, colonneChampValeur);
226
		}
227
		ajouterBouton.setWidth(largeurBouton);
228
		colonneBoutonAjouter.setWidth(largeurBouton);
229
		colonneConteneur.add(ajouterBouton, colonneBoutonAjouter);
230
 
231
		/* Modification de l'écouteur du bouton Ajouter */
232
		ajouterBouton.removeAllListeners();
233
		ajouterBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
234
			public void componentSelected(ButtonEvent ce) {
235
				// récupération de la valeur du champ "Valeur"
236
				String valeurChamp = "";
237
				if (champValeurEstComboBox) {
238
					if (champValeurComboBox.getValeur() != null) {
1369 cyprien 239
						Valeur val = new Valeur(champValeurComboBox.getValeur());
240
						valeurChamp = val.getNom();
1287 cyprien 241
					}
242
				} else {
243
					valeurChamp = champValeurTxt.getValue();
244
				}
1369 cyprien 245
 
1287 cyprien 246
				// validation de la valeur avant ajout
247
				if ((valeurChamp == null) || valeurChamp.trim().equals("") || valeurChamp.trim().equals(valeurParDefaut))	{
248
					MessageBox.alert(titreErreur, valeurVideMsg, null);
249
				} else if (valeurs.get(valeurChamp) != null){
250
					MessageBox.alert(titreErreur, valeurIdentiqueMsg, null);
251
				} else {
252
					if (validationMasque != null && !valeurChamp.matches(validationMasque)) 	{
253
						MessageBox.alert(titreErreur, valeurNonValideMsg, null);
1369 cyprien 254
					} else { // VALIDATION OK
255
						Valeur type = new Valeur(champTypesComboBox.getValeur());
256
						String typeNomStr = type.getNom();
257
						String typeIdStr = type.getId();
1287 cyprien 258
 
1369 cyprien 259
						if (typeIdStr.trim().equals(""))	{
1287 cyprien 260
							MessageBox.alert(Mediateur.i18nM.titreErreurSaisie(), Mediateur.i18nM.typeChampMulti(), null);
261
						} else {
1369 cyprien 262
							ajouterValeur(valeurChamp, typeNomStr, typeIdStr);
1287 cyprien 263
						}
264
					}
265
				}
266
			}
267
		});
268
	}
269
 
270
	private void ajouterValeurAuRecapitulatif(String texte, String id) {
271
		String texteRecapitulatif = "";
272
		if (champRecapitulatif.getValue() != null)	{
273
			texteRecapitulatif = champRecapitulatif.getValue();
274
		}
275
		texteRecapitulatif += id + aDonnee.SEPARATEUR_TYPE_VALEUR + texte + aDonnee.SEPARATEUR_VALEURS;
276
		champRecapitulatif.setValue(texteRecapitulatif);
277
	}
278
}