Subversion Repositories eFlore/Applications.coel

Rev

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

Rev Author Line No. Line
637 jp_milcent 1
package org.tela_botanica.client.vues;
2
 
639 jp_milcent 3
import java.util.Iterator;
687 jp_milcent 4
import java.util.List;
639 jp_milcent 5
 
980 jpm 6
import org.tela_botanica.client.ComposantClass;
637 jp_milcent 7
import org.tela_botanica.client.Mediateur;
687 jp_milcent 8
import org.tela_botanica.client.RegistreId;
980 jpm 9
import org.tela_botanica.client.composants.ChampComboBoxListeValeurs;
907 jpm 10
import org.tela_botanica.client.configuration.Configuration;
637 jp_milcent 11
import org.tela_botanica.client.i18n.Constantes;
1076 jpm 12
import org.tela_botanica.client.i18n.ErrorMessages;
637 jp_milcent 13
import org.tela_botanica.client.images.Images;
687 jp_milcent 14
import org.tela_botanica.client.interfaces.Rafraichissable;
639 jp_milcent 15
import org.tela_botanica.client.modeles.Valeur;
16
import org.tela_botanica.client.modeles.ValeurListe;
703 jp_milcent 17
import org.tela_botanica.client.modeles.aDonneeListe;
637 jp_milcent 18
 
687 jp_milcent 19
import com.extjs.gxt.ui.client.Registry;
637 jp_milcent 20
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
703 jp_milcent 21
import com.extjs.gxt.ui.client.Style.SortDir;
639 jp_milcent 22
import com.extjs.gxt.ui.client.event.BaseEvent;
637 jp_milcent 23
import com.extjs.gxt.ui.client.event.ButtonEvent;
639 jp_milcent 24
import com.extjs.gxt.ui.client.event.ComponentEvent;
25
import com.extjs.gxt.ui.client.event.Events;
26
import com.extjs.gxt.ui.client.event.Listener;
637 jp_milcent 27
import com.extjs.gxt.ui.client.event.SelectionListener;
703 jp_milcent 28
import com.extjs.gxt.ui.client.store.ListStore;
637 jp_milcent 29
import com.extjs.gxt.ui.client.widget.LayoutContainer;
30
import com.extjs.gxt.ui.client.widget.TabItem;
934 jpm 31
import com.extjs.gxt.ui.client.widget.button.Button;
637 jp_milcent 32
import com.extjs.gxt.ui.client.widget.button.ButtonBar;
639 jp_milcent 33
import com.extjs.gxt.ui.client.widget.form.CheckBox;
34
import com.extjs.gxt.ui.client.widget.form.CheckBoxGroup;
703 jp_milcent 35
import com.extjs.gxt.ui.client.widget.form.ComboBox;
639 jp_milcent 36
import com.extjs.gxt.ui.client.widget.form.Field;
637 jp_milcent 37
import com.extjs.gxt.ui.client.widget.form.FormPanel;
639 jp_milcent 38
import com.extjs.gxt.ui.client.widget.form.Radio;
39
import com.extjs.gxt.ui.client.widget.form.RadioGroup;
980 jpm 40
import com.extjs.gxt.ui.client.widget.form.TextArea;
41
import com.extjs.gxt.ui.client.widget.form.TextField;
639 jp_milcent 42
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
637 jp_milcent 43
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
639 jp_milcent 44
import com.extjs.gxt.ui.client.widget.layout.FormData;
637 jp_milcent 45
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
639 jp_milcent 46
import com.extjs.gxt.ui.client.widget.tips.ToolTipConfig;
687 jp_milcent 47
import com.google.gwt.core.client.GWT;
637 jp_milcent 48
 
687 jp_milcent 49
public abstract class Formulaire extends LayoutContainer implements Rafraichissable {
637 jp_milcent 50
 
51
	public static final String MODE_AJOUTER = "AJOUT";
52
	public static final String MODE_MODIFIER = "MODIF";
53
 
934 jpm 54
	public Constantes i18nC = null;
1076 jpm 55
	public ErrorMessages i18nM = null;
934 jpm 56
	public Mediateur mediateur = null;
57
	public Configuration config = null;
687 jp_milcent 58
 
934 jpm 59
	public String mode = null;
60
	public int tabIndex = 100;
637 jp_milcent 61
 
934 jpm 62
	public FormPanel panneauFormulaire = null;
63
	public ButtonBar barreOutilsValidation = null;
775 jpm 64
 
934 jpm 65
	public String menuIdCourant = null;
66
	public static Boolean clicBoutonvalidation = false;
67
	public Rafraichissable vueExterneARafraichirApresValidation = null;
775 jpm 68
 
69
	public FormPanel getFormulaire() {
70
		return panneauFormulaire;
71
	}
639 jp_milcent 72
 
648 jp_milcent 73
	public void initialiserFormulaire(Mediateur mediateurCourrant, String modeDeCreation, String idMenuCourrant) {
637 jp_milcent 74
		// Initialisation de variables
75
		mode = modeDeCreation;
76
		mediateur = mediateurCourrant;
77
		i18nC = Mediateur.i18nC;
1077 jpm 78
		i18nM = Mediateur.i18nM;
648 jp_milcent 79
		menuIdCourant = idMenuCourrant;
687 jp_milcent 80
		config = (Configuration) Registry.get(RegistreId.CONFIG);
648 jp_milcent 81
 
637 jp_milcent 82
		// Iniatilisation du layoutContainer
83
		setLayout(new FitLayout());
84
		setBorders(false);
85
 
86
		// Création du panneau du FORMULAIRE GÉNÉRAL
87
		panneauFormulaire = new FormPanel();
88
		panneauFormulaire.setBodyBorder(false);
89
		panneauFormulaire.setFrame(true);
775 jpm 90
 		panneauFormulaire.setCollapsible(false);
637 jp_milcent 91
		panneauFormulaire.setButtonAlign(HorizontalAlignment.CENTER);
92
		panneauFormulaire.setLayout(new FitLayout());
775 jpm 93
 
94
		if (modeDeCreation.equals(MODE_AJOUTER)) {
95
			panneauFormulaire.setIcon(Images.ICONES.formAjouter());
96
		} else if (modeDeCreation.equals(MODE_AJOUTER)) {
97
			panneauFormulaire.setIcon(Images.ICONES.formModifier());
98
		}
639 jp_milcent 99
 
775 jpm 100
		barreOutilsValidation = new FormulaireBarreValidation(creerEcouteurValidation());
101
		panneauFormulaire.setBottomComponent(barreOutilsValidation);
648 jp_milcent 102
 
103
		add(panneauFormulaire);
637 jp_milcent 104
	}
105
 
934 jpm 106
	public SelectionListener<ButtonEvent> creerEcouteurValidation() {
107
		SelectionListener<ButtonEvent> ecouteur = new SelectionListener<ButtonEvent>() {
108
			@Override
109
			public void componentSelected(ButtonEvent ce) {
110
				String code = ((Button) ce.getComponent()).getData("code");
111
				if (code.equals(FormulaireBarreValidation.CODE_BOUTON_VALIDER)) {
112
					soumettreFormulaire();
113
					clicBoutonvalidation = true;
114
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_APPLIQUER)) {
115
					soumettreFormulaire();
116
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_ANNULER)) {
117
					mediateur.clicMenu(menuIdCourant);
118
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_REINITIALISER)) {
119
					reinitialiserFormulaire();
120
				}
121
			}
122
		};
123
 
124
		return ecouteur;
125
	}
637 jp_milcent 126
 
934 jpm 127
	public abstract boolean verifierFormulaire();
787 jpm 128
 
934 jpm 129
	public abstract boolean soumettreFormulaire();
782 jpm 130
 
934 jpm 131
	public abstract void reinitialiserFormulaire();
132
 
133
	public TabItem creerOnglet(String nom, String id) {
637 jp_milcent 134
		TabItem onglet = new TabItem();
135
		onglet.setId(id);
136
		onglet.setText(nom);
687 jp_milcent 137
		FormulaireOnglet.parametrer(onglet);
637 jp_milcent 138
		return onglet;
139
	}
639 jp_milcent 140
 
934 jpm 141
	public void controlerFermetureApresRafraichissement() {
639 jp_milcent 142
		// Si le bouton Valider a été cliqué, nous affichons la liste des structures
143
		if (clicBoutonvalidation) {
782 jpm 144
			fermerFormulaire();
639 jp_milcent 145
		}
146
	}
147
 
934 jpm 148
	public void fermerFormulaire() {
782 jpm 149
		clicBoutonvalidation = false;
150
		panneauFormulaire.setEnabled(false);
151
		mediateur.clicMenu(menuIdCourant);
152
	}
153
 
639 jp_milcent 154
	/** Méthode simplifiant la création de FormLayout.
155
	 * Chacun des paramètres peut prendre la valeur null pour utiliser la valeur par défaut.
156
	 *
157
	 * @param labelWidth largeur des labels.
158
	 * @param labelAlign alignement des labels
159
	 * @return
160
	 */
912 jpm 161
	public static FormLayout creerFormLayout(Integer labelWidth, LabelAlign labelAlign) {
639 jp_milcent 162
		FormLayout formLayout = new FormLayout();
163
		if (labelWidth != null) {
164
			formLayout.setLabelWidth(labelWidth);
165
		}
166
		if (labelAlign != null) {
167
			formLayout.setLabelAlign(labelAlign);
168
		}
169
		return formLayout;
170
	}
171
 
172
	/** Méthode simplifiant la création de bouton radio oui/non
173
	 *
174
	 * @param listeNom nom de la liste de valeur
175
	 * @return
176
	 */
934 jpm 177
	public RadioGroup creerChoixUniqueRadioGroupe(String groupeNom, String listeNom) {
639 jp_milcent 178
		groupeNom += "_grp";
179
		// NOTE : il semblerait qu'il faille aussi utiliser setName() pour éviter tout problème...
180
		RadioGroup radioGroup = new RadioGroup(groupeNom);
181
		radioGroup.setName(groupeNom);
182
 
183
		if (listeNom.equals("ouiNon")) {
184
			ValeurListe ouiNonListe = new ValeurListe();
185
			ouiNonListe.ajouter(new Valeur("1", i18nC.oui(), "NULL", "NULL"));
186
			ouiNonListe.ajouter(new Valeur("0", i18nC.non(), "NULL", "NULL"));
187
			creerChoixUniqueBoutonRadio(radioGroup, ouiNonListe);
188
		}
189
 
190
		return radioGroup;
191
	}
192
 
934 jpm 193
	public void creerChoixUniqueBoutonRadio(RadioGroup radioGroupe, ValeurListe listeValeurs) {
639 jp_milcent 194
		for (Iterator<String> it = listeValeurs.keySet().iterator(); it.hasNext();) {
195
			Valeur val = listeValeurs.get(it.next());
196
 
197
			Radio radioBtn = new Radio();
198
			radioBtn.setName(radioGroupe.getName().replace("_grp", ""));
199
			radioBtn.setId(val.getId()+"_"+radioBtn.getName());
200
			radioBtn.setBoxLabel(val.getNom());
201
			radioBtn.setValueAttribute(val.getId());
202
			radioBtn.addListener(Events.Change, new Listener<ComponentEvent>() {
203
 
204
				public void handleEvent(ComponentEvent be) {
205
					//Window.alert(((Radio) be.component).getName());
206
					afficherChampSupplementaire(((Radio) be.getComponent()));
207
				}
208
 
209
			});
210
 
211
			if (! val.getDescription().equals("NULL")) {
212
				radioBtn.setToolTip(new ToolTipConfig(val.getNom(), val.getDescription()));
213
			}
214
			radioGroupe.add(radioBtn);
215
		}
216
	}
217
 
934 jpm 218
	public void afficherChampSupplementaire(Radio radioBtn) {
775 jpm 219
		GWT.log("Vous devez redéfinir la méthode afficherChampSupplementaire(Radio radioBtn) dans votre classe formulaire.", null);
220
	};
639 jp_milcent 221
 
222
	/** Méthode simplifiant la création de choix multiple sous forme de case à cocher.
223
	 * Apelle un service retournant la liste des valeurs représentant les cases à cocher.
224
	 * Ajoute ou pas un champ "Autre".
225
	 *
226
	 * @return ContentPanel le panneau contenant les cases à cocher
227
	 */
831 jpm 228
	public static LayoutContainer creerChoixMultipleCp() {
639 jp_milcent 229
		LayoutContainer conteneur = new LayoutContainer();
230
		conteneur.setLayout(creerFormLayout(650, LabelAlign.TOP));
231
		return conteneur;
232
	}
233
 
234
	/** Méthode simplifiant la création de choix multiple sous forme de case à cocher.
235
	 * Apelle un service retournant la liste des valeurs représentant les cases à cocher.
236
	 * Ajoute ou pas un champ "Autre".
237
	 *
238
	 * @param cp panneau conteant le groupe de case à cocher
239
	 * @param cacGroup le groupe de case à cocher
240
	 * @param listeValeurs la liste de valeurs à transformer en case à cocher
241
	 * @param boolAutreChp booléen indiquant si oui ou non le champ autre doit apparaître
242
	 * @return
243
	 */
831 jpm 244
	public static void creerChoixMultipleCac(LayoutContainer cp, final CheckBoxGroup cacGroupe, ValeurListe listeValeurs, final Field<String> autreChp) {
639 jp_milcent 245
		cp.addListener(Events.Hide, new Listener<BaseEvent>() {
246
			public void handleEvent(BaseEvent be) {
247
				cacGroupe.reset();
248
				autreChp.setValue("");
249
			}
250
 
251
		});
252
 
253
		cacGroupe.setAutoWidth(true);
254
		cacGroupe.setStyleAttribute("padding", "3px");
255
		cacGroupe.setData("liste_id", listeValeurs.getId());
256
		for (Iterator<String> it = listeValeurs.keySet().iterator(); it.hasNext();) {
257
			Valeur val = listeValeurs.get(it.next());
258
			String nom =  val.get("nom");
259
			CheckBox cac = new CheckBox();
260
			cac.setId("val-"+val.getId());
261
			cac.setData("id", val.getId());
262
			cac.setBoxLabel(nom);
263
			if (! val.getDescription().equals("NULL")) {
264
				cac.setToolTip(new ToolTipConfig(val.getNom(), val.getDescription()));
265
			}
266
			cacGroupe.add(cac);
267
		}
268
		cp.add(cacGroupe);
269
 
270
		if (autreChp != null) {
271
			// FIXME : éviter le chevauchement du texte des cases à cocher avec le label "Autre" sur les petits écrans
272
			LayoutContainer conteneur = new LayoutContainer();
273
			conteneur.setLayout(creerFormLayout(50, LabelAlign.TOP));
274
			autreChp.setId("autre-"+listeValeurs.getId());
275
			autreChp.setFieldLabel("Autre");
276
			autreChp.setLabelStyle("font-weight:normal;");
277
			conteneur.add(autreChp, new FormData(500, 0));
278
 
279
			cp.add(conteneur);
280
		}
281
		cp.layout();
282
	}
687 jp_milcent 283
 
703 jp_milcent 284
	@SuppressWarnings({"unchecked"})
831 jpm 285
	public static void rafraichirComboBox(aDonneeListe<?> listeValeurs, ComboBox combo) {
286
		rafraichirComboBox(listeValeurs, combo, "nom");
287
	}
288
 
289
	@SuppressWarnings({"unchecked"})
290
	public static void rafraichirComboBox(aDonneeListe<?> listeValeurs, ComboBox combo, String champATrier) {
703 jp_milcent 291
		List<?> liste = listeValeurs.toList();
292
		if (liste.size() > 0) {
831 jpm 293
			ListStore store = combo.getStore();
703 jp_milcent 294
			store.removeAll();
295
			store.add(liste);
831 jpm 296
			store.sort(champATrier, SortDir.ASC);
703 jp_milcent 297
			combo.setStore(store);
298
		}
299
	}
980 jpm 300
 
301
	public static Listener<BaseEvent> creerEcouteurChampObligatoire() {
302
		return new Listener<BaseEvent>() {
303
			@Override
304
			public void handleEvent(BaseEvent be) {
305
				Field<?> champ = null;
306
				boolean etreVide = true;
307
				if (be.getSource() instanceof TextField<?>) {
308
					champ = (TextField<?>) be.getSource();
309
					etreVide = (champ.getRawValue().isEmpty()) ? true : false;
310
				} else if (be.getSource() instanceof TextArea) {
311
					champ = (TextArea) be.getSource();
312
					etreVide = (champ.getRawValue().isEmpty()) ? true : false;
313
				} else if (be.getSource() instanceof ChampComboBoxListeValeurs) {
314
					champ = (ChampComboBoxListeValeurs) be.getSource();
315
					etreVide = (champ.getValue() == null) ? true : false;
316
				} else if (be.getSource() instanceof ComboBox<?>) {
317
					champ = (ComboBox<?>) be.getSource();
318
					etreVide = (champ.getValue() == null) ? true : false;
319
				}
320
				champ.removeStyleName(ComposantClass.OBLIGATOIRE);
321
				champ.removeStyleName(ComposantClass.OBLIGATOIRE_OK);
322
				if (etreVide == false) {
323
					champ.addStyleName(ComposantClass.OBLIGATOIRE_OK);
324
				} else {
325
					champ.addStyleName(ComposantClass.OBLIGATOIRE);
326
				}
327
			}
328
		};
329
	}
687 jp_milcent 330
}