Subversion Repositories eFlore/Applications.coel

Rev

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