Subversion Repositories eFlore/Applications.coel

Rev

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