Subversion Repositories eFlore/Applications.coel

Rev

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

Rev Author Line No. Line
703 jp_milcent 1
package org.tela_botanica.client.vues;
2
 
3
import java.util.ArrayList;
4
import java.util.List;
5
 
6
import org.tela_botanica.client.Mediateur;
7
import org.tela_botanica.client.images.Images;
8
import org.tela_botanica.client.interfaces.Rafraichissable;
9
import org.tela_botanica.client.modeles.Information;
10
import org.tela_botanica.client.modeles.Personne;
11
import org.tela_botanica.client.modeles.PersonneListe;
12
import org.tela_botanica.client.modeles.ValeurListe;
13
 
775 jpm 14
import com.extjs.gxt.ui.client.event.BaseEvent;
703 jp_milcent 15
import com.extjs.gxt.ui.client.event.ButtonEvent;
16
import com.extjs.gxt.ui.client.event.ComponentEvent;
775 jpm 17
import com.extjs.gxt.ui.client.event.EventType;
703 jp_milcent 18
import com.extjs.gxt.ui.client.event.Events;
19
import com.extjs.gxt.ui.client.event.KeyListener;
20
import com.extjs.gxt.ui.client.event.Listener;
21
import com.extjs.gxt.ui.client.event.SelectionListener;
22
import com.extjs.gxt.ui.client.store.ListStore;
23
import com.extjs.gxt.ui.client.store.Store;
24
import com.extjs.gxt.ui.client.store.StoreEvent;
25
import com.extjs.gxt.ui.client.widget.ContentPanel;
26
import com.extjs.gxt.ui.client.widget.Info;
27
import com.extjs.gxt.ui.client.widget.button.Button;
775 jpm 28
import com.extjs.gxt.ui.client.widget.button.ButtonBar;
703 jp_milcent 29
import com.extjs.gxt.ui.client.widget.form.ComboBox;
30
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
31
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
32
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
33
import com.extjs.gxt.ui.client.widget.grid.Grid;
34
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
35
import com.extjs.gxt.ui.client.widget.grid.HeaderGroupConfig;
36
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
37
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
38
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
39
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
40
import com.google.gwt.core.client.GWT;
775 jpm 41
import com.google.gwt.event.dom.client.KeyCodes;
703 jp_milcent 42
 
43
public class CollectionFormAuteur extends FormulaireOnglet implements Rafraichissable {
44
 
45
	private ContentPanel panneauPrincipal = null;
46
	private ToolBar barreOutils = null;
47
	private Grid<Personne> grille;
48
 
49
	private PersonneListe auteurs = null;
50
	private PersonneListe auteursAjoutes = null;
51
	private PersonneListe auteursSupprimes = null;
52
	private ComboBox<Personne> auteursSaisisComboBox = null;
53
	private Button auteursBoutonSupprimer = null;
54
	private Button auteursBoutonModifier = null;
775 jpm 55
	private Button ajouterAuteurSaisiBouton = null;
703 jp_milcent 56
 
57
	private static final String ETAT_AJOUTE = "A";
58
	private static final String ETAT_SUPPRIME = "S";
59
 
60
	public CollectionFormAuteur(Formulaire formulaireCourrant) {
61
		initialiserOnglet(formulaireCourrant);
62
		setId("auteur");
63
		setText(Mediateur.i18nC.collectionAuteur());
64
		setStyleAttribute("padding", "0");
65
 
66
		panneauPrincipal = creerPanneauContenantGrille();
67
		barreOutils = creerBarreOutilsGrille();
68
		panneauPrincipal.setTopComponent(barreOutils);
69
		grille = creerGrille();
70
  		panneauPrincipal.add(grille);
71
		add(panneauPrincipal);
72
 
73
		initialiser();
74
	}
75
 
76
	private void initialiser() {
77
		// Remise à zéro des modification dans la liste des auteurs
78
		auteursAjoutes = new PersonneListe();
79
		auteursSupprimes = new PersonneListe();
80
 
81
		// Actualisation de l'état des boutons de la barre d'outils
82
		actualiserEtatBoutonsBarreOutils();
83
	}
84
 
85
	private ContentPanel creerPanneauContenantGrille() {
86
		ContentPanel panneau = new ContentPanel();
87
 
88
		panneau.setHeading(i18nC.collectionAuteurTitre());
89
		panneau.setIcon(Images.ICONES.table());
90
		panneau.setLayout(new FitLayout());
91
		panneau.setFrame(true);
92
 
93
		return panneau;
94
	}
95
 
96
	private ToolBar creerBarreOutilsGrille() {
97
		ToolBar barreOutils = new ToolBar();
98
 
99
		Button ajouterPersonneBouton = creerBoutonAjouter();
100
		barreOutils.add(ajouterPersonneBouton);
101
 
102
		barreOutils.add(new SeparatorToolItem());
103
 
104
		auteursBoutonModifier = creerBoutonModifier();
105
		barreOutils.add(auteursBoutonModifier);
106
 
107
		barreOutils.add(new SeparatorToolItem());
108
 
109
		auteursBoutonSupprimer = creerBoutonSupprimer();
110
		barreOutils.add(auteursBoutonSupprimer);
111
 
112
		barreOutils.add(new SeparatorToolItem());
113
 
114
		Button rafraichirPersonneBouton = creerBoutonRafraichir();
115
		barreOutils.add(rafraichirPersonneBouton);
116
 
117
		barreOutils.add(new SeparatorToolItem());
118
 
119
		auteursSaisisComboBox = creerComboBoxAuteursSaisis();
120
		barreOutils.add(auteursSaisisComboBox);
121
 
775 jpm 122
		ajouterAuteurSaisiBouton = creerBoutonAjouterAuteurSaisi();
703 jp_milcent 123
		barreOutils.add(ajouterAuteurSaisiBouton);
124
 
125
		return barreOutils;
126
	}
127
 
128
	private Button creerBoutonAjouter() {
129
		Button bouton = new Button(i18nC.ajouter());
130
		bouton.setIcon(Images.ICONES.vcardAjouter());
131
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
132
			@Override
133
			public void componentSelected(ButtonEvent ce) {
775 jpm 134
				FenetreForm fenetre = creerFenetreModaleAvecFormulairePersonne(Formulaire.MODE_AJOUTER);
703 jp_milcent 135
				fenetre.show();
136
			}
137
		});
138
		return bouton;
139
	}
140
 
141
	private Button creerBoutonModifier() {
142
		Button bouton = new Button(i18nC.modifier());
143
		bouton.setIcon(Images.ICONES.vcardModifier());
144
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
145
			@Override
146
			public void componentSelected(ButtonEvent ce) {
147
				Personne auteurSaisiSelectionne = grille.getSelectionModel().getSelectedItem();
148
				if (auteurSaisiSelectionne == null) {
149
					Info.display("Info", "Veuillez selectionner un auteur");
150
				} else {
775 jpm 151
					FenetreForm fenetre = creerFenetreModaleAvecFormulairePersonne(Formulaire.MODE_MODIFIER);
703 jp_milcent 152
					fenetre.show();
153
				}
154
			}
155
		});
156
		return bouton;
157
	}
775 jpm 158
 
159
	private FenetreForm creerFenetreModaleAvecFormulairePersonne(String mode) {
160
		final FenetreForm fenetre = new FenetreForm("");
161
		final PersonneForm formulaire = creerFormulairePersonne(fenetre);
162
		fenetre.add(formulaire);
163
		return fenetre;
164
	}
165
 
166
	private PersonneForm creerFormulairePersonne(final FenetreForm fenetre) {
167
		PersonneForm formulaire = new PersonneForm(mode);
168
		fenetre.setHeading(formulaire.getHeading());
169
		formulaire.setHeaderVisible(false);
170
		formulaire.setTopComponent(null);
703 jp_milcent 171
 
775 jpm 172
		// TODO : gérer la barre d'outil avec des évènements spécifique au contexte de fenêtre modale
173
		SelectionListener<ButtonEvent> ecouteur = creerEcouteurValidationFormulairePersonne(fenetre, formulaire);
174
		final ButtonBar barreValidation = new FormulaireBarreValidation(ecouteur);
175
		formulaire.setBottomComponent(barreValidation);
176
 
177
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
178
			// TODO : simplifier la gestion de l'ajout des données d'une Personne au form pour la modification... (pas besoin de passer par une liste).
179
			Information info = new Information("liste_personne");
180
			PersonneListe personnes = new PersonneListe();
181
			Personne auteurSaisiSelectionne = grille.getSelectionModel().getSelectedItem();
182
			personnes.put(auteurSaisiSelectionne.getId(), auteurSaisiSelectionne);
183
			info.setDonnee(0, personnes);
184
			formulaire.rafraichir(info);
185
		}
186
 
187
		return formulaire;
188
	}
189
 
190
	private SelectionListener<ButtonEvent> creerEcouteurValidationFormulairePersonne(final FenetreForm fenetre, final PersonneForm formulaire) {
191
		SelectionListener<ButtonEvent> ecouteur = new SelectionListener<ButtonEvent>() {
192
			@Override
193
			public void componentSelected(ButtonEvent ce) {
194
				String code = ((Button) ce.getComponent()).getData("code");
195
				if (code.equals(FormulaireBarreValidation.CODE_BOUTON_VALIDER)) {
196
					Boolean ok = formulaire.enregistrer();
197
					if (ok == true) {
198
						// Fermer fenêtre et ajouter/modifier l'élément dans la liste
199
					}
200
					fenetre.hide();
201
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_APPLIQUER)) {
202
					Boolean ok = formulaire.enregistrer();
203
					if (ok == true) {
204
						// Fermer fenêtre et ajouter/modifier l'élément dans la liste
205
					}
206
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_ANNULER)) {
207
					fenetre.hide();
208
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_REINITIALISER)) {
209
					formulaire.reinitialiser();
210
				}
211
			}
212
		};
213
 
214
		return ecouteur;
215
	}
216
 
703 jp_milcent 217
	private Button creerBoutonSupprimer() {
218
		Button bouton = new Button(i18nC.supprimer());
219
		bouton.setIcon(Images.ICONES.vcardSupprimer());
220
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
221
			@Override
222
			public void componentSelected(ButtonEvent ce) {
223
				Personne auteurSaisiSelectionne = grille.getSelectionModel().getSelectedItem();
224
				if (auteurSaisiSelectionne == null) {
720 jp_milcent 225
					Info.display(i18nC.informationTitreGenerique(), i18nC.selectionnerAuteur());
703 jp_milcent 226
				} else {
720 jp_milcent 227
					supprimerDansGrille(auteurSaisiSelectionne);
703 jp_milcent 228
				}
229
			}
230
		});
231
		return bouton;
232
	}
233
 
234
	private Button creerBoutonRafraichir() {
235
		Button bouton = new Button(i18nC.rafraichir());
236
		bouton.setIcon(Images.ICONES.rafraichir());
237
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
238
			@Override
239
			public void componentSelected(ButtonEvent ce) {
240
				// TODO : mettre en place le rafraichissement de la liste
241
			}
242
		});
243
		return bouton;
244
	}
245
 
246
	private ComboBox<Personne> creerComboBoxAuteursSaisis() {
720 jp_milcent 247
		ListStore<Personne> personnesSaisiesStore = new ListStore<Personne>();
248
		personnesSaisiesStore.add(new ArrayList<Personne>());
703 jp_milcent 249
 
250
		ComboBox<Personne> comboBox = new ComboBox<Personne>();
251
		comboBox.setWidth(200);
720 jp_milcent 252
		comboBox.setEmptyText(i18nC.chercherAuteurSaisi());
703 jp_milcent 253
		comboBox.setTriggerAction(TriggerAction.ALL);
254
		comboBox.setEditable(true);
255
		comboBox.setDisplayField("fmt_nom_complet");
720 jp_milcent 256
		comboBox.setStore(personnesSaisiesStore);
703 jp_milcent 257
		comboBox.addKeyListener(new KeyListener() {
258
			public void componentKeyUp(ComponentEvent ce) {
775 jpm 259
				if (auteursSaisisComboBox.getRawValue() != null && auteursSaisisComboBox.getRawValue().length() > 0) {
260
					if (!ce.isNavKeyPress()) {
261
						obtenirAuteursSaisis(auteursSaisisComboBox.getRawValue());
262
					}
703 jp_milcent 263
				}
264
			}
265
		});
775 jpm 266
		comboBox.addListener(Events.Select, new Listener<BaseEvent>() {
267
			@Override
268
			public void handleEvent(BaseEvent be) {
269
				if (auteursSaisisComboBox.getValue() instanceof Personne) {
270
					ajouterAuteurSaisiBouton.fireEvent(Events.Select);
271
				}
272
			}
273
		});
703 jp_milcent 274
		return comboBox;
275
	}
276
 
277
	private Button creerBoutonAjouterAuteurSaisi() {
720 jp_milcent 278
		Button bouton = new Button(i18nC.ajouter());
703 jp_milcent 279
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
280
			@Override
281
			public void componentSelected(ButtonEvent ce) {
282
				Personne auteurSaisiSelectionne = auteursSaisisComboBox.getValue();
720 jp_milcent 283
				ajouterDansGrille(auteurSaisiSelectionne);
775 jpm 284
				auteursSaisisComboBox.setValue(null);
703 jp_milcent 285
			}
286
		});
287
		return bouton;
288
	}
289
 
720 jp_milcent 290
	private void ajouterDansGrille(Personne auteur) {
703 jp_milcent 291
		if (auteur != null) {
292
			// Ajout de la personne ajoutée à la liste
293
			if (auteur.getId() != null && !auteur.getId().equals("")) {
294
				auteursAjoutes.put(auteur.getId(), auteur);
295
			}
296
 
297
			// Définition de l'état
298
			auteur.set("etat", ETAT_AJOUTE);
299
 
300
			// Ajout à la grille
301
			grille.getStore().insert(auteur, 0);
302
		}
303
	}
304
 
720 jp_milcent 305
	private void supprimerDansGrille(Personne auteur) {
703 jp_milcent 306
		if (auteur != null) {
307
			// Ajout de la personne supprimée à la liste
308
			if ((auteur.get("etat") == null || !auteur.get("etat").equals(ETAT_AJOUTE)) && auteur.getId() != null && !auteur.getId().equals("")) {
309
				auteursSupprimes.put(auteur.getId(), auteur);
310
			}
311
 
312
			// Suppression de l'enregistrement de la grille
313
			grille.getStore().remove(auteur);
314
		}
315
	}
316
 
317
	private Grid<Personne> creerGrille() {
318
		ListStore<Personne> storeGrille = new ListStore<Personne>();
319
		storeGrille.addListener(Store.Add, new Listener<StoreEvent<Personne>>() {
320
			public void handleEvent(StoreEvent<Personne> ce) {
321
				actualiserEtatBoutonsBarreOutils();
322
			}
323
		});
324
		storeGrille.addListener(Store.Remove, new Listener<StoreEvent<Personne>>() {
325
			public void handleEvent(StoreEvent<Personne> ce) {
326
				actualiserEtatBoutonsBarreOutils();
327
			}
328
		});
329
 
330
		RowNumberer pluginLigneNumero = new RowNumberer();
720 jp_milcent 331
 
703 jp_milcent 332
		List<ColumnConfig> colonnes = new ArrayList<ColumnConfig>();
333
		colonnes.add(pluginLigneNumero);
334
		colonnes.add(new ColumnConfig("fmt_nom_complet", i18nC.personneNomComplet(), 150));
335
		colonnes.add(new ColumnConfig("nom", i18nC.personneNom(), 75));
336
		colonnes.add(new ColumnConfig("prenom", i18nC.personnePrenom(), 75));
337
		colonnes.add(new ColumnConfig("prefixe", i18nC.personnePrefixe(), 50));
338
		//colonnes.add(new ColumnConfig("truk_nom_autre", i18nC.personneNomAutre(), 200));
339
		colonnes.add(new ColumnConfig("naissance_date", i18nC.date(), 75));
340
		colonnes.add(new ColumnConfig("naissance_lieu", i18nC.lieu(), 100));
341
		colonnes.add(new ColumnConfig("ce_deces", i18nC.personneDecedeeInterogation(), 50));
342
		colonnes.add(new ColumnConfig("deces_date", i18nC.date(), 75));
343
		colonnes.add(new ColumnConfig("deces_lieu", i18nC.lieu(), 100));
344
 
345
		GridSelectionModel<Personne> modeleDeSelection = new GridSelectionModel<Personne>();
346
 
347
		ColumnModel modeleDeColonnes = new ColumnModel(colonnes);
348
		modeleDeColonnes.addHeaderGroup(0, 1, new HeaderGroupConfig(i18nC.personneIdentite(), 1, 4));
349
		modeleDeColonnes.addHeaderGroup(0, 5, new HeaderGroupConfig(i18nC.personneNaissance(), 1, 2));
350
		modeleDeColonnes.addHeaderGroup(0, 7, new HeaderGroupConfig(i18nC.personneDeces(), 1, 3));
351
 
352
		Grid<Personne> grillePersonne = new Grid<Personne>(storeGrille, modeleDeColonnes);
353
		grillePersonne.setHeight("100%");
354
		grillePersonne.setBorders(true);
355
		grillePersonne.setSelectionModel(modeleDeSelection);
356
		grillePersonne.addPlugin(pluginLigneNumero);
357
		grillePersonne.getView().setForceFit(true);
358
		grillePersonne.setAutoExpandColumn("fmt_nom_complet");
359
		grillePersonne.setStripeRows(true);
360
		grillePersonne.setTrackMouseOver(true);
361
 
362
		return grillePersonne;
363
	}
364
 
365
	public void actualiserEtatBoutonsBarreOutils() {
366
		// Activation des boutons si la grille contient un élément
367
		if (grille.getStore().getCount() > 0) {
368
			auteursBoutonSupprimer.enable();
369
			auteursBoutonModifier.enable();
370
		}
371
		// Désactivation des boutons si la grille ne contient plus d'élément
372
		if (grille.getStore().getCount() == 0) {
373
			auteursBoutonSupprimer.disable();
374
			auteursBoutonModifier.disable();
375
		}
376
	}
377
 
378
	public void rafraichir(Object nouvellesDonnees) {
379
		if (nouvellesDonnees instanceof Information) {
380
			Information info = (Information) nouvellesDonnees;
381
			rafraichirInformation(info);
382
		} else if (nouvellesDonnees instanceof ValeurListe) {
383
			ValeurListe listeValeurs = (ValeurListe) nouvellesDonnees;
384
			rafraichirValeurListe(listeValeurs);
385
		} else {
386
			GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);
387
		}
388
	}
389
 
390
	private void rafraichirValeurListe(ValeurListe listeValeurs) {
391
		if (listeValeurs.getId().equals(config.getListeId(""))) {
392
			Formulaire.rafraichirComboBox(listeValeurs, null, null);
393
		} else {
394
			GWT.log("Gestion de la liste "+listeValeurs.getId()+" non implémenté!", null);
395
		}
396
	}
397
 
398
	public void rafraichirInformation(Information info) {
399
		if (info.getMessages() != null && !info.getMessages().toString().equals("[]")) {
400
			GWT.log("MESSAGES:\n"+info.getMessages().toString(), null);
401
		}
402
		String type = info.getType();
403
		if (type.equals("liste_personne")) {
404
			if (info.getDonnee(0) != null) {
405
				PersonneListe personnes = (PersonneListe) info.getDonnee(0);
406
				List<Personne> liste = personnes.toList();
407
 
408
				auteursSaisisComboBox.getStore().removeAll();
409
				auteursSaisisComboBox.getStore().add(liste);
410
				auteursSaisisComboBox.expand();
411
			}
412
		} else if (type.equals("liste_collection_a_personne")) {
413
			if (info.getDonnee(0) != null) {
414
				initialiser();
415
				// TODO : passer à la méthode peupler un objet CollectionAPersonneListe et modifier le type de auteurs
416
				//auteurs = (CollectionAPersonneListe) info.getDonnee(0);
417
				peupler();
418
			}
419
		}
420
	}
421
 
422
	private void peupler() {
423
		layout();
720 jp_milcent 424
		Info.display(i18nC.chargementAuteur(), i18nC.ok());
703 jp_milcent 425
	}
426
 
427
	private void obtenirAuteursSaisis(String nom) {
428
		mediateur.selectionnerPersonneParNomComplet(this, null, nom+"%");
429
	}
430
}