Subversion Repositories eFlore/Applications.coel

Rev

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