Subversion Repositories eFlore/Applications.coel

Rev

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