Subversion Repositories eFlore/Applications.coel

Rev

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