Subversion Repositories eFlore/Applications.coel

Rev

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