Subversion Repositories eFlore/Applications.coel

Rev

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

Rev Author Line No. Line
719 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.Publication;
13
import org.tela_botanica.client.modeles.PublicationListe;
14
import org.tela_botanica.client.modeles.ValeurListe;
15
 
775 jpm 16
import com.extjs.gxt.ui.client.event.BaseEvent;
719 jp_milcent 17
import com.extjs.gxt.ui.client.event.ButtonEvent;
18
import com.extjs.gxt.ui.client.event.ComponentEvent;
775 jpm 19
import com.extjs.gxt.ui.client.event.Events;
719 jp_milcent 20
import com.extjs.gxt.ui.client.event.KeyListener;
21
import com.extjs.gxt.ui.client.event.Listener;
22
import com.extjs.gxt.ui.client.event.SelectionListener;
23
import com.extjs.gxt.ui.client.store.ListStore;
24
import com.extjs.gxt.ui.client.store.Store;
25
import com.extjs.gxt.ui.client.store.StoreEvent;
26
import com.extjs.gxt.ui.client.widget.ContentPanel;
27
import com.extjs.gxt.ui.client.widget.Info;
28
import com.extjs.gxt.ui.client.widget.InfoConfig;
29
import com.extjs.gxt.ui.client.widget.button.Button;
775 jpm 30
import com.extjs.gxt.ui.client.widget.button.ButtonBar;
719 jp_milcent 31
import com.extjs.gxt.ui.client.widget.form.ComboBox;
775 jpm 32
import com.extjs.gxt.ui.client.widget.form.FormPanel;
719 jp_milcent 33
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
34
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
35
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
36
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
37
import com.extjs.gxt.ui.client.widget.grid.Grid;
38
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
39
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
40
import com.extjs.gxt.ui.client.widget.grid.HeaderGroupConfig;
41
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
42
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
43
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
44
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
45
import com.google.gwt.core.client.GWT;
46
 
47
public class CollectionFormPublication extends FormulaireOnglet implements Rafraichissable {
48
	private ContentPanel panneauPrincipal = null;
49
	private ToolBar barreOutils = null;
50
	private Grid<Publication> grille;
51
 
52
	private PublicationListe publications = null;
53
	private PublicationListe publicationsAjoutees = null;
54
	private PublicationListe publicationsSupprimees = null;
55
	private ComboBox<Publication> publicationsSaisiesComboBox = null;
56
	private Button publicationsBoutonSupprimer = null;
57
	private Button publicationsBoutonModifier = null;
775 jpm 58
	private Button ajouterPublicationSaisieBouton = null;
719 jp_milcent 59
 
60
	private static final String ETAT_AJOUTE = "A";
61
	private static final String ETAT_SUPPRIME = "S";
62
 
63
	public CollectionFormPublication(Formulaire formulaireCourrant) {
64
		initialiserOnglet(formulaireCourrant);
65
		setId("publication");
66
		setText(Mediateur.i18nC.collectionPublication());
67
		setStyleAttribute("padding", "0");
68
 
69
		panneauPrincipal = creerPanneauContenantGrille();
70
		barreOutils = creerBarreOutilsGrille();
71
		panneauPrincipal.setTopComponent(barreOutils);
72
		grille = creerGrille();
73
  		panneauPrincipal.add(grille);
74
		add(panneauPrincipal);
75
 
76
		initialiser();
77
	}
78
 
79
	private void initialiser() {
80
		// Remise à zéro des modification dans la liste des auteurs
81
		publicationsAjoutees = new PublicationListe();
82
		publicationsSupprimees = new PublicationListe();
83
 
84
		// Actualisation de l'état des boutons de la barre d'outils
85
		actualiserEtatBoutonsBarreOutils();
86
	}
87
 
88
	private ContentPanel creerPanneauContenantGrille() {
89
		ContentPanel panneau = new ContentPanel();
90
 
91
		panneau.setHeading(i18nC.collectionPublicationTitre());
92
		panneau.setIcon(Images.ICONES.table());
93
		panneau.setLayout(new FitLayout());
94
		panneau.setFrame(true);
95
 
96
		return panneau;
97
	}
98
 
99
	private ToolBar creerBarreOutilsGrille() {
100
		ToolBar barreOutils = new ToolBar();
101
 
102
		Button ajouterBouton = creerBoutonAjouter();
103
		barreOutils.add(ajouterBouton);
104
 
105
		barreOutils.add(new SeparatorToolItem());
106
 
107
		publicationsBoutonModifier = creerBoutonModifier();
108
		barreOutils.add(publicationsBoutonModifier);
109
 
110
		barreOutils.add(new SeparatorToolItem());
111
 
112
		publicationsBoutonSupprimer = creerBoutonSupprimer();
113
		barreOutils.add(publicationsBoutonSupprimer);
114
 
115
		barreOutils.add(new SeparatorToolItem());
116
 
117
		Button rafraichirBouton = creerBoutonRafraichir();
118
		barreOutils.add(rafraichirBouton);
119
 
120
		barreOutils.add(new SeparatorToolItem());
121
 
122
		publicationsSaisiesComboBox = creerComboBoxPublicationsSaisis();
123
		barreOutils.add(publicationsSaisiesComboBox);
124
 
775 jpm 125
		ajouterPublicationSaisieBouton = creerBoutonAjouterPublicationSaisi();
719 jp_milcent 126
		barreOutils.add(ajouterPublicationSaisieBouton);
127
 
128
		return barreOutils;
129
	}
130
 
131
	private Button creerBoutonAjouter() {
132
		Button bouton = new Button(i18nC.ajouter());
133
		bouton.setIcon(Images.ICONES.vcardAjouter());
134
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
135
			@Override
136
			public void componentSelected(ButtonEvent ce) {
775 jpm 137
				final FenetreForm fenetre = creerFenetreModaleAvecFormulairePersonne(Formulaire.MODE_AJOUTER);
719 jp_milcent 138
				fenetre.show();
139
			}
140
		});
141
		return bouton;
142
	}
143
 
144
	private Button creerBoutonModifier() {
145
		Button bouton = new Button(i18nC.modifier());
146
		bouton.setIcon(Images.ICONES.vcardModifier());
147
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
148
			@Override
149
			public void componentSelected(ButtonEvent ce) {
150
				Publication publicationSaisieSelectionnee = grille.getSelectionModel().getSelectedItem();
151
 
152
				if (publicationSaisieSelectionnee == null) {
153
					Info.display(i18nC.informationTitreGenerique(), i18nC.selectionnerPublication());
154
				} else {
775 jpm 155
					final FenetreForm fenetre = creerFenetreModaleAvecFormulairePersonne(Formulaire.MODE_MODIFIER);
719 jp_milcent 156
					fenetre.show();
157
				}
158
			}
159
		});
160
		return bouton;
161
	}
775 jpm 162
 
163
	private FenetreForm creerFenetreModaleAvecFormulairePersonne(String mode) {
164
		final FenetreForm fenetre = new FenetreForm("");
165
		final PublicationForm formulaire = creerFormulairePublication(fenetre, mode);
166
		fenetre.add(formulaire);
167
		return fenetre;
168
	}
169
 
170
	private PublicationForm creerFormulairePublication(final FenetreForm fenetre, final String mode) {
171
		PublicationForm formulairePublication = new PublicationForm(mediateur, mode);
172
		FormPanel panneauFormulaire = formulairePublication.getFormulaire();
173
		fenetre.setHeading(panneauFormulaire.getHeading());
174
		panneauFormulaire.setHeaderVisible(false);
175
		panneauFormulaire.setTopComponent(null);
719 jp_milcent 176
 
775 jpm 177
		// TODO : gérer la barre d'outil avec des évènements spécifique au contexte de fenêtre modale
178
		SelectionListener<ButtonEvent> ecouteur = creerEcouteurValidationFormulairePublication(fenetre, formulairePublication);
179
		final ButtonBar barreValidation = new FormulaireBarreValidation(ecouteur);
180
		panneauFormulaire.setBottomComponent(barreValidation);
181
 
182
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
183
			Publication publicationSaisiSelectionne = grille.getSelectionModel().getSelectedItem();
184
			formulairePublication.rafraichir(publicationSaisiSelectionne);
185
		}
186
 
187
		return formulairePublication;
188
	}
189
 
190
	private SelectionListener<ButtonEvent> creerEcouteurValidationFormulairePublication(final FenetreForm fenetre, final PublicationForm 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
					formulaire.soumettreFormulaire();
197
					fenetre.hide();
198
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_APPLIQUER)) {
199
					formulaire.soumettreFormulaire();
200
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_ANNULER)) {
201
					fenetre.hide();
202
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_REINITIALISER)) {
203
					formulaire.reinitialiserFormulaire();
204
				}
205
			}
206
		};
207
 
208
		return ecouteur;
209
	}
210
 
719 jp_milcent 211
	private Button creerBoutonSupprimer() {
212
		Button bouton = new Button(i18nC.supprimer());
213
		bouton.setIcon(Images.ICONES.vcardSupprimer());
214
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
215
			@Override
216
			public void componentSelected(ButtonEvent ce) {
217
				Publication publicationSaisieSelectionnee = grille.getSelectionModel().getSelectedItem();
218
				if (publicationSaisieSelectionnee == null) {
219
					Info.display(i18nC.informationTitreGenerique(), i18nC.selectionnerPublication());
220
				} else {
221
					supprimerDansGrille(publicationSaisieSelectionnee);
222
				}
223
			}
224
		});
225
		return bouton;
226
	}
227
 
228
	private Button creerBoutonRafraichir() {
229
		Button bouton = new Button(i18nC.rafraichir());
230
		bouton.setIcon(Images.ICONES.rafraichir());
231
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
232
			@Override
233
			public void componentSelected(ButtonEvent ce) {
234
				// TODO : mettre en place le rafraichissement de la liste
235
			}
236
		});
237
		return bouton;
238
	}
239
 
240
	private ComboBox<Publication> creerComboBoxPublicationsSaisis() {
241
		ListStore<Publication> publicationsSaisiesStore = new ListStore<Publication>();
242
 
243
		ComboBox<Publication> comboBox = new ComboBox<Publication>();
244
		comboBox.setWidth(400);
245
		comboBox.setEmptyText(i18nC.chercherPublicationSaisi());
246
		comboBox.setTriggerAction(TriggerAction.ALL);
247
		comboBox.setEditable(true);
248
		comboBox.setDisplayField("fmt_nom_complet");
249
		comboBox.setStore(publicationsSaisiesStore);
250
		comboBox.addKeyListener(new KeyListener() {
251
			public void componentKeyUp(ComponentEvent ce) {
775 jpm 252
				if (publicationsSaisiesComboBox.getRawValue() != null && publicationsSaisiesComboBox.getRawValue().length() > 0) {
253
					if (!ce.isNavKeyPress()) {
254
						obtenirPublicationsSaisies(publicationsSaisiesComboBox.getRawValue());
255
					}
719 jp_milcent 256
				}
257
			}
258
		});
775 jpm 259
		comboBox.addListener(Events.Select, new Listener<BaseEvent>() {
260
			@Override
261
			public void handleEvent(BaseEvent be) {
262
				if (publicationsSaisiesComboBox.getValue() instanceof Publication) {
263
					ajouterPublicationSaisieBouton.fireEvent(Events.Select);
264
				}
265
			}
266
		});
719 jp_milcent 267
		return comboBox;
268
	}
269
 
270
	private Button creerBoutonAjouterPublicationSaisi() {
271
		Button bouton = new Button(i18nC.ajouter());
272
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
273
			@Override
274
			public void componentSelected(ButtonEvent ce) {
275
				Publication publicationSaisieSelectionne = publicationsSaisiesComboBox.getValue();
276
				ajouterDansGrille(publicationSaisieSelectionne);
775 jpm 277
				publicationsSaisiesComboBox.setValue(null);
719 jp_milcent 278
			}
279
		});
280
		return bouton;
281
	}
282
 
283
	private void ajouterDansGrille(Publication publication) {
284
		if (publication != null) {
285
			// Ajout de la personne ajoutée à la liste
286
			if (publication.getId() != null && !publication.getId().equals("")) {
287
				publicationsAjoutees.put(publication.getId(), publication);
288
			}
289
 
290
			// Définition de l'état
291
			publication.set("etat", ETAT_AJOUTE);
292
 
293
			// Ajout à la grille
294
			grille.getStore().insert(publication, 0);
295
		}
296
	}
297
 
298
	private void supprimerDansGrille(Publication publication) {
299
		if (publication != null) {
300
			// Ajout de la personne supprimée à la liste
301
			if ((publication.get("etat") == null || !publication.get("etat").equals(ETAT_AJOUTE)) && publication.getId() != null && !publication.getId().equals("")) {
302
				publicationsSupprimees.put(publication.getId(), publication);
303
			}
304
 
305
			// Suppression de l'enregistrement de la grille
306
			grille.getStore().remove(publication);
307
		}
308
	}
309
 
310
	private Grid<Publication> creerGrille() {
311
		ListStore<Publication> storeGrille = new ListStore<Publication>();
312
		storeGrille.addListener(Store.Add, new Listener<StoreEvent<Publication>>() {
313
			public void handleEvent(StoreEvent<Publication> ce) {
314
				actualiserEtatBoutonsBarreOutils();
315
			}
316
		});
317
		storeGrille.addListener(Store.Remove, new Listener<StoreEvent<Publication>>() {
318
			public void handleEvent(StoreEvent<Publication> ce) {
319
				actualiserEtatBoutonsBarreOutils();
320
			}
321
		});
322
 
323
		RowNumberer pluginLigneNumero = new RowNumberer();
324
 
325
		GridCellRenderer<Publication> infoBulle = new GridCellRenderer<Publication>() {
326
			@Override
327
			public String render(Publication model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<Publication> store, Grid<Publication> grid) {
328
				String valeur = (String) model.get(property);
329
				return "<span title='"+valeur+"'>" + valeur + "</span>";
330
			}
331
		};
332
 
333
		List<ColumnConfig> colonnes = new ArrayList<ColumnConfig>();
334
		colonnes.add(pluginLigneNumero);
335
		ColumnConfig fmtAuteurColonne = new ColumnConfig("fmt_auteur", i18nC.publicationAuteurs(), 150);
336
		fmtAuteurColonne.setRenderer(infoBulle);
337
		colonnes.add(fmtAuteurColonne);
338
		ColumnConfig titreColonne = new ColumnConfig("titre", i18nC.publicationTitre(), 150);
339
		titreColonne.setRenderer(infoBulle);
340
		colonnes.add(titreColonne);
341
		colonnes.add(new ColumnConfig("collection", i18nC.publicationRevueCollection(), 75));
342
		colonnes.add(new ColumnConfig("editeur", i18nC.publicationEditeur(), 75));
343
		colonnes.add(new ColumnConfig("date_parution", i18nC.publicationDateParution(), 75));
344
		colonnes.add(new ColumnConfig("indication_nvt", i18nC.publicationNvt(), 75));
345
		colonnes.add(new ColumnConfig("fascicule", i18nC.publicationFascicule(), 75));
346
		colonnes.add(new ColumnConfig("truk_pages", i18nC.publicationPage(), 50));
347
 
348
		GridSelectionModel<Publication> modeleDeSelection = new GridSelectionModel<Publication>();
349
 
350
		ColumnModel modeleDeColonnes = new ColumnModel(colonnes);
351
 
352
		Grid<Publication> grillePublications = new Grid<Publication>(storeGrille, modeleDeColonnes);
353
		grillePublications.setHeight("100%");
354
		grillePublications.setBorders(true);
355
		grillePublications.setSelectionModel(modeleDeSelection);
356
		grillePublications.addPlugin(pluginLigneNumero);
357
		grillePublications.getView().setForceFit(true);
358
		grillePublications.setAutoExpandColumn("titre");
359
		grillePublications.setStripeRows(true);
360
		grillePublications.setTrackMouseOver(true);
361
 
362
		return grillePublications;
363
	}
364
 
365
	public void actualiserEtatBoutonsBarreOutils() {
366
		// Activation des boutons si la grille contient un élément
367
		if (grille.getStore().getCount() > 0) {
368
			publicationsBoutonSupprimer.enable();
369
			publicationsBoutonModifier.enable();
370
		}
371
		// Désactivation des boutons si la grille ne contient plus d'élément
372
		if (grille.getStore().getCount() == 0) {
373
			publicationsBoutonSupprimer.disable();
374
			publicationsBoutonModifier.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 PublicationListe) {
383
			PublicationListe listePublications = (PublicationListe) nouvellesDonnees;
384
			rafraichirPublicationListe(listePublications);
385
		} else if (nouvellesDonnees instanceof ValeurListe) {
386
			ValeurListe listeValeurs = (ValeurListe) nouvellesDonnees;
387
			rafraichirValeurListe(listeValeurs);
388
		} else {
389
			GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);
390
		}
391
	}
392
 
393
	private void rafraichirValeurListe(ValeurListe listeValeurs) {
394
		if (listeValeurs.getId().equals(config.getListeId(""))) {
395
			Formulaire.rafraichirComboBox(listeValeurs, null, null);
396
		} else {
397
			GWT.log("Gestion de la liste "+listeValeurs.getId()+" non implémenté!", null);
398
		}
399
	}
400
 
401
	private void rafraichirPublicationListe(PublicationListe listePublications) {
402
		List<Publication> liste = listePublications.toList();
403
 
404
		publicationsSaisiesComboBox.getStore().removeAll();
405
		publicationsSaisiesComboBox.getStore().add(liste);
406
		publicationsSaisiesComboBox.expand();
407
	}
408
 
409
	public void rafraichirInformation(Information info) {
410
		if (info.getMessages() != null && !info.getMessages().toString().equals("[]")) {
411
			GWT.log("MESSAGES:\n"+info.getMessages().toString(), null);
412
		}
413
		String type = info.getType();
414
		if (type.equals("liste_collection_a_publication")) {
415
			if (info.getDonnee(0) != null) {
416
				initialiser();
417
				// TODO : passer à la méthode peupler un objet CollectionAPublicationListe et modifier le type de publications
418
				//publications = (CollectionAPublicationListe) info.getDonnee(0);
419
				peupler();
420
			}
421
		}
422
	}
423
 
424
	private void peupler() {
425
		layout();
426
		Info.display(i18nC.chargementPublication(), i18nC.ok());
427
	}
428
 
429
	private void obtenirPublicationsSaisies(String nom) {
430
		mediateur.selectionnerPublicationParNomComplet(this, null, nom+"%");
431
	}
432
}