Subversion Repositories eFlore/Applications.coel

Rev

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