Subversion Repositories eFlore/Applications.coel

Rev

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

Rev Author Line No. Line
935 jpm 1
package org.tela_botanica.client.vues.publication;
219 aurelien 2
 
227 aurelien 3
import java.util.ArrayList;
4
import java.util.Iterator;
365 jp_milcent 5
import java.util.List;
227 aurelien 6
 
981 jpm 7
import org.tela_botanica.client.ComposantClass;
219 aurelien 8
import org.tela_botanica.client.Mediateur;
1284 gduche 9
import org.tela_botanica.client.composants.InfoLogger;
822 jpm 10
import org.tela_botanica.client.images.Images;
219 aurelien 11
import org.tela_botanica.client.interfaces.Rafraichissable;
705 aurelien 12
import org.tela_botanica.client.modeles.Information;
775 jpm 13
import org.tela_botanica.client.modeles.MenuApplicationId;
1284 gduche 14
import org.tela_botanica.client.modeles.Valeur;
15
import org.tela_botanica.client.modeles.aDonnee;
935 jpm 16
import org.tela_botanica.client.modeles.personne.Personne;
17
import org.tela_botanica.client.modeles.personne.PersonneListe;
1032 jpm 18
import org.tela_botanica.client.modeles.projet.Projet;
19
import org.tela_botanica.client.modeles.projet.ProjetListe;
935 jpm 20
import org.tela_botanica.client.modeles.publication.Publication;
21
import org.tela_botanica.client.modeles.publication.PublicationAPersonne;
22
import org.tela_botanica.client.modeles.publication.PublicationAPersonneListe;
23
import org.tela_botanica.client.modeles.structure.Structure;
24
import org.tela_botanica.client.modeles.structure.StructureListe;
1131 jpm 25
import org.tela_botanica.client.util.Debug;
792 jpm 26
import org.tela_botanica.client.util.Pattern;
782 jpm 27
import org.tela_botanica.client.util.UtilArray;
884 jpm 28
import org.tela_botanica.client.util.UtilString;
1284 gduche 29
import org.tela_botanica.client.vues.FenetreForm;
935 jpm 30
import org.tela_botanica.client.vues.Formulaire;
1284 gduche 31
import org.tela_botanica.client.vues.FormulaireBarreValidation;
32
import org.tela_botanica.client.vues.personne.PersonneForm;
219 aurelien 33
 
1284 gduche 34
import com.extjs.gxt.ui.client.Style.Scroll;
35
import com.extjs.gxt.ui.client.Style.SortDir;
36
import com.extjs.gxt.ui.client.core.XTemplate;
37
import com.extjs.gxt.ui.client.event.BaseEvent;
505 jp_milcent 38
import com.extjs.gxt.ui.client.event.ButtonEvent;
1284 gduche 39
import com.extjs.gxt.ui.client.event.ComponentEvent;
980 jpm 40
import com.extjs.gxt.ui.client.event.Events;
1284 gduche 41
import com.extjs.gxt.ui.client.event.KeyListener;
42
import com.extjs.gxt.ui.client.event.Listener;
219 aurelien 43
import com.extjs.gxt.ui.client.event.SelectionListener;
44
import com.extjs.gxt.ui.client.store.ListStore;
1284 gduche 45
import com.extjs.gxt.ui.client.store.Store;
46
import com.extjs.gxt.ui.client.store.StoreEvent;
227 aurelien 47
import com.extjs.gxt.ui.client.widget.HorizontalPanel;
1095 jpm 48
import com.extjs.gxt.ui.client.widget.Info;
219 aurelien 49
import com.extjs.gxt.ui.client.widget.LayoutContainer;
705 aurelien 50
import com.extjs.gxt.ui.client.widget.MessageBox;
1284 gduche 51
import com.extjs.gxt.ui.client.widget.Text;
219 aurelien 52
import com.extjs.gxt.ui.client.widget.button.Button;
1284 gduche 53
import com.extjs.gxt.ui.client.widget.button.ButtonBar;
219 aurelien 54
import com.extjs.gxt.ui.client.widget.form.ComboBox;
1032 jpm 55
import com.extjs.gxt.ui.client.widget.form.Field;
219 aurelien 56
import com.extjs.gxt.ui.client.widget.form.FieldSet;
1284 gduche 57
import com.extjs.gxt.ui.client.widget.form.FormPanel;
219 aurelien 58
import com.extjs.gxt.ui.client.widget.form.TextField;
1032 jpm 59
import com.extjs.gxt.ui.client.widget.form.Validator;
219 aurelien 60
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
1284 gduche 61
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
62
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
63
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
64
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
65
import com.extjs.gxt.ui.client.widget.grid.EditorGrid;
66
import com.extjs.gxt.ui.client.widget.grid.Grid;
67
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
68
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
69
import com.extjs.gxt.ui.client.widget.grid.RowExpander;
70
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
71
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
219 aurelien 72
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
73
import com.extjs.gxt.ui.client.widget.layout.FormData;
74
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
1284 gduche 75
import com.extjs.gxt.ui.client.widget.layout.RowData;
76
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
77
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
78
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
705 aurelien 79
import com.google.gwt.core.client.GWT;
1284 gduche 80
import com.google.gwt.user.client.Window;
219 aurelien 81
 
877 aurelien 82
 
775 jpm 83
public class PublicationForm extends Formulaire implements Rafraichissable {
219 aurelien 84
 
786 jpm 85
	private Publication publication;
1133 jpm 86
	private PersonneListe auteursInitialListe = null;
901 jpm 87
	private static boolean publicationAPersonneListeChargementOk = false;
1284 gduche 88
	private PersonneListe auteursAjoutes = null;
89
	private PersonneListe auteursSupprimes = null;
219 aurelien 90
 
1284 gduche 91
	private LayoutContainer auteursFieldset = null;
1032 jpm 92
	private ComboBox<Projet> projetsCombo = null;
775 jpm 93
	private ArrayList<ComboBox<Personne>> auteurComboboxListe = null;
94
	private ListStore<Personne> auteursStorePartage = null;
901 jpm 95
	private static boolean auteurStorePartageChargementOk = false;
227 aurelien 96
 
775 jpm 97
	private FieldSet generalitesFieldset = null;
786 jpm 98
	private TextField<String> titreChp = null;
99
	private TextField<String> collectionChp = null;
100
	private TextField<String> uriChp = null;
219 aurelien 101
 
775 jpm 102
	private FieldSet editionFieldset = null;
792 jpm 103
	private ComboBox<Structure> editeurCombobox = null;
1180 jpm 104
	private static boolean editeursOk = false;
786 jpm 105
	private TextField<String> datePublicationChp = null;
106
	private TextField<String> tomeChp = null;
107
	private TextField<String> fasciculeChp = null;
108
	private TextField<String> pagesChp = null;
219 aurelien 109
 
1180 jpm 110
	boolean auteursAffiches = false;
901 jpm 111
	private static boolean formulaireValideOk = false;
112
	private static boolean publicationValideOk = false;
113
	private static boolean auteursValideOk = false;
1131 jpm 114
	private static boolean publicationOk = false;
901 jpm 115
	private static boolean attenteAjoutAuteursOk = true;
116
	private static boolean attenteSuppressionAuteursOk = true;
1284 gduche 117
 
118
	private LayoutContainer zoneHaut, zoneBas;
119
 
120
	private static int idGenere = 1;
121
	private ToolBar barreOutils = null;
122
	private EditorGrid<Personne> grille;
123
	private PersonneListe personnesAjoutees = null;
124
	private PersonneListe personnesSupprimees = null;
125
	private ComboBox<Personne> personnesSaisiesComboBox = null;
126
	private Button personnesBoutonSupprimer = null;
127
	private Button personnesBoutonModifier = null;
128
	private ComboBox<Valeur> typeRelationCombo = null;
129
	private List<Valeur> roles = null;
130
	private PersonneListe listePersonne = new PersonneListe();
131
 
132
	private FenetreForm fenetreFormulaire = null;
133
 
781 jpm 134
	public PublicationForm(Mediateur mediateurCourrant, String publicationId) {
782 jpm 135
		initialiserPublicationForm(mediateurCourrant, publicationId);
136
	}
137
 
138
	public PublicationForm(Mediateur mediateurCourrant, String publicationId, Rafraichissable vueARafraichirApresValidation) {
822 jpm 139
		vueExterneARafraichirApresValidation = vueARafraichirApresValidation;
782 jpm 140
		initialiserPublicationForm(mediateurCourrant, publicationId);
141
	}
142
 
143
	private void initialiserPublicationForm(Mediateur mediateurCourrant, String publicationId) {
1284 gduche 144
 
1133 jpm 145
		auteursInitialListe = new PersonneListe();
901 jpm 146
		initialiserValidation();
147
		initialiserAffichageAuteurs();
148
 
799 jpm 149
		publication = new Publication();
822 jpm 150
		publication.setId(publicationId);
151
 
884 jpm 152
		String modeDeCreation = (UtilString.isEmpty(publication.getId()) ? Formulaire.MODE_AJOUTER : Formulaire.MODE_MODIFIER);
775 jpm 153
		initialiserFormulaire(mediateurCourrant, modeDeCreation, MenuApplicationId.PUBLICATION);
1284 gduche 154
		panneauFormulaire.setLayout(new RowLayout());
155
		panneauFormulaire.setStyleAttribute("padding", "0");
156
		zoneHaut = new LayoutContainer(new FitLayout());
157
		zoneBas = new LayoutContainer(new FlowLayout());
781 jpm 158
 
1284 gduche 159
		panneauFormulaire.add(zoneHaut, new RowData(1, 0.3));
160
		panneauFormulaire.add(zoneBas, new RowData(1, 0.5));
161
		panneauFormulaire.setScrollMode(Scroll.AUTO);
1095 jpm 162
		genererTitreFormulaire();
163
 
775 jpm 164
		creerZoneAuteurs();
1284 gduche 165
		zoneHaut.add(auteursFieldset);
219 aurelien 166
 
775 jpm 167
		creerZoneGeneralites();
1284 gduche 168
		zoneBas.add(generalitesFieldset);
239 aurelien 169
 
775 jpm 170
		creerZoneEdition();
1284 gduche 171
		zoneBas.add(editionFieldset);
822 jpm 172
 
173
		if (modeDeCreation.equals(Formulaire.MODE_MODIFIER)) {
174
			mediateurCourrant.selectionnerPublication(this, publicationId);
175
			mediateurCourrant.selectionnerPublicationAPersonne(this, publicationId, null, PublicationAPersonne.ROLE_AUTEUR);
176
		}
781 jpm 177
	}
782 jpm 178
 
1284 gduche 179
	public void actualiserEtatBoutonsBarreOutils() {
180
			// Activation des boutons si la grille contient un élément
181
			if (grille.getStore().getCount() > 0) {
182
				personnesBoutonSupprimer.enable();
183
				personnesBoutonModifier.enable();
184
			}
185
			// Désactivation des boutons si la grille ne contient plus d'élément
186
			if (grille.getStore().getCount() == 0) {
187
				personnesBoutonSupprimer.disable();
188
				personnesBoutonModifier.disable();
189
			}
190
		}
191
 
192
	private ToolBar creerBarreOutilsGrille() {
193
		ToolBar barreOutils = new ToolBar();
194
 
195
		Button ajouterBouton = creerBoutonAjouter();
196
		barreOutils.add(ajouterBouton);
197
 
198
		barreOutils.add(new Text(" ou "));
199
 
200
		personnesSaisiesComboBox = creerComboBoxPersonnesSaisies();
201
		barreOutils.add(personnesSaisiesComboBox);
202
 
203
		barreOutils.add(new SeparatorToolItem());
204
 
205
		personnesBoutonModifier = creerBoutonModifier();
206
		barreOutils.add(personnesBoutonModifier);
207
 
208
		barreOutils.add(new SeparatorToolItem());
209
 
210
		personnesBoutonSupprimer = creerBoutonSupprimer();
211
		barreOutils.add(personnesBoutonSupprimer);
212
 
213
		barreOutils.add(new SeparatorToolItem());
214
 
215
		Button rafraichirBouton = creerBoutonRafraichir();
216
		barreOutils.add(rafraichirBouton);
217
 
218
		return barreOutils;
219
	}
220
 
221
	private Button creerBoutonAjouter() {
222
		Button bouton = new Button(i18nC.ajouter());
223
		bouton.setIcon(Images.ICONES.vcardAjouter());
224
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
225
			public void componentSelected(ButtonEvent ce) {
226
				fenetreFormulaire = creerFenetreModaleAvecFormulairePersonne(Formulaire.MODE_AJOUTER);
227
				fenetreFormulaire.show();
228
			}
229
		});
230
		return bouton;
231
	}
232
 
233
	private Button creerBoutonModifier() {
234
		Button bouton = new Button(i18nC.modifier());
235
		bouton.setIcon(Images.ICONES.vcardModifier());
236
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
237
			public void componentSelected(ButtonEvent ce) {
238
				Personne personneSaisieSelectionnee = grille.getSelectionModel().getSelectedItem();
239
 
240
				if (personneSaisieSelectionnee == null) {
241
					InfoLogger.display(i18nC.informationTitreGenerique(), i18nC.selectionnerPublication());
242
				} else {
243
					fenetreFormulaire = creerFenetreModaleAvecFormulairePersonne(Formulaire.MODE_MODIFIER);
244
					fenetreFormulaire.show();
245
				}
246
			}
247
		});
248
		return bouton;
249
	}
250
 
251
	private FenetreForm creerFenetreModaleAvecFormulairePersonne(String mode) {
252
		String personneId = null;
253
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
254
			Personne personneSaisieSelectionnee = grille.getSelectionModel().getSelectedItem();
255
			personneId = personneSaisieSelectionnee.getId();
256
		}
257
 
258
		final FenetreForm fenetre = new FenetreForm("");
259
		final PersonneForm formulaire = creerFormulairePersonne(fenetre, personneId);
260
		fenetre.add(formulaire);
261
		return fenetre;
262
	}
263
 
264
	private PersonneForm creerFormulairePersonne(final FenetreForm fenetre, final String personneId) {
265
		PersonneForm formulairePersonne = new PersonneForm(mediateur, personneId, this);
266
		FormPanel panneauFormulaire = formulairePersonne.getFormulaire();
267
		fenetre.setHeading(panneauFormulaire.getHeading());
268
		panneauFormulaire.setHeaderVisible(false);
269
		panneauFormulaire.setTopComponent(null);
270
 
271
		// FIXME : avec GXT-2.1.0 la redéfinition du bottom component ne marche plus. Nous le cachons et en créeons un dans la fenêtre.
272
		panneauFormulaire.getBottomComponent().hide();
273
		SelectionListener<ButtonEvent> ecouteur = creerEcouteurValidationFormulairePersonne(fenetre, formulairePersonne);
274
		final ButtonBar barreValidation = new FormulaireBarreValidation(ecouteur);
275
		fenetre.setBottomComponent(barreValidation);
276
 
277
		return formulairePersonne;
278
	}
279
 
280
	private SelectionListener<ButtonEvent> creerEcouteurValidationFormulairePersonne(final FenetreForm fenetre, final PersonneForm formulaire) {
281
		SelectionListener<ButtonEvent> ecouteur = new SelectionListener<ButtonEvent>() {
282
			public void componentSelected(ButtonEvent ce) {
283
				String code = ((Button) ce.getComponent()).getData("code");
284
				if (code.equals(FormulaireBarreValidation.CODE_BOUTON_VALIDER)) {
285
					if (formulaire.soumettreFormulaire()) {
286
						fenetre.hide();
287
					}
288
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_APPLIQUER)) {
289
					formulaire.soumettreFormulaire();
290
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_ANNULER)) {
291
					fenetre.hide();
292
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_REINITIALISER)) {
293
					fenetreFormulaire.hide();
294
					fenetreFormulaire = creerFenetreModaleAvecFormulairePersonne(formulaire.mode);
295
					fenetreFormulaire.show();
296
				}
297
			}
298
		};
299
 
300
		return ecouteur;
301
	}
302
 
303
	private Button creerBoutonSupprimer() {
304
		Button bouton = new Button(i18nC.supprimer());
305
		bouton.setIcon(Images.ICONES.vcardSupprimer());
306
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
307
			public void componentSelected(ButtonEvent ce) {
308
				Personne personneSaisieSelectionnee = grille.getSelectionModel().getSelectedItem();
309
				if (personneSaisieSelectionnee == null) {
310
					InfoLogger.display(i18nC.informationTitreGenerique(), i18nC.selectionnerPublication());
311
				} else {
312
					supprimerDansGrille(personneSaisieSelectionnee);
313
				}
314
			}
315
		});
316
		return bouton;
317
	}
318
 
319
	private Button creerBoutonRafraichir() {
320
		Button bouton = new Button(i18nC.rafraichir());
321
		bouton.setIcon(Images.ICONES.rafraichir());
322
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
323
			public void componentSelected(ButtonEvent ce) {
324
				actualiserGrille();
325
			}
326
		});
327
		return bouton;
328
	}
329
 
330
	private void actualiserGrille() {
331
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
332
			// FIXME : c'est la merde
333
			//mediateur.selectionner(this, null, personneSelectionnee.getId(), "%");
334
		} else {
335
			grille.getStore().removeAll();
336
			layout();
337
		}
338
	}
339
 
340
	private ComboBox<Personne> creerComboBoxPersonnesSaisies() {
341
		ListStore<Personne> personnesSaisiesStore = new ListStore<Personne>();
342
 
343
		ComboBox<Personne> comboBox = new ComboBox<Personne>();
344
		comboBox.setWidth(400);
345
		comboBox.setEmptyText(i18nC.chercherPersonneSaisi());
346
		comboBox.setTriggerAction(TriggerAction.ALL);
347
		comboBox.setEditable(true);
348
		comboBox.setDisplayField("fmt_nom_complet");
349
		comboBox.setStore(personnesSaisiesStore);
350
		comboBox.addKeyListener(new KeyListener() {
351
			public void componentKeyUp(ComponentEvent ce) {
352
				if (personnesSaisiesComboBox.getRawValue() != null && personnesSaisiesComboBox.getRawValue().length() > 0) {
353
					if (!ce.isNavKeyPress()) {
354
						obtenirPersonnesSaisies(personnesSaisiesComboBox.getRawValue());
355
					}
356
				}
357
			}
358
		});
359
		comboBox.addListener(Events.Select, new Listener<BaseEvent>() {
360
			public void handleEvent(BaseEvent be) {
361
				if (personnesSaisiesComboBox.getValue() instanceof Personne) {
362
					// N'ajouter l'auteur que s'il n'est pas déjà présent dans la grille et dans les valeurs initiales
363
					Personne personneSaisieSelectionne = personnesSaisiesComboBox.getValue();
364
					if (grille.getStore().findModel(personneSaisieSelectionne) != null)	{
365
						Info.display("Information", "La personne est déjà présente dans la liste d'auteurs");
366
					} else {
367
						if (!auteursInitialListe.containsValue(personneSaisieSelectionne))	{
368
							auteursAjoutes.put(personneSaisieSelectionne.getId(), personneSaisieSelectionne);
369
						}
370
						ajouterDansGrille(personneSaisieSelectionne);
371
						personnesSaisiesComboBox.setValue(null);
372
					}
373
				}
374
			}
375
		});
376
		return comboBox;
377
	}
378
 
379
	private void obtenirPersonnesSaisies(String nom) {
380
		mediateur.selectionnerPersonneParNomComplet(this, null, nom+"%");
381
	}
382
 
383
	private void ajouterDansGrille(Personne personne) {
384
		ajouterDansGrille(personne, 0);
385
	}
386
 
387
	private void ajouterDansGrille(Personne personne, int index) {
388
		if (personne != null) {
389
			if (!grille.getStore().contains(personne))	{
390
				//1) si elle ne fait pas partie des initiaux, ajouter à la liste à ajouter
391
				if (!auteursInitialListe.containsValue(personne))	{
392
					auteursAjoutes.put(personne.getId(), personne);
393
				}
394
 
395
				// L'enlever de la liste à supprimer
396
				if (auteursSupprimes.containsValue(personne))	{
397
					auteursSupprimes.remove(personne);
398
				}
399
				//2) Ajouter a la grille
400
				grille.getStore().insert(personne, index);
401
				grille.getSelectionModel().select(index, false);
402
			} else {
403
				InfoLogger.display("Information", "La personne choisie existe déjà dans la liste.");
404
			}
405
		}
406
	}
407
 
408
	/**
409
	 * Met à jour la grille avec les informations contenus dans la variable listePublicationsLiees
410
	 */
411
	private void mettreAJourGrille()	{
412
 
413
		grille.getStore().removeAll();
414
		grille.getStore().add(listePersonne.toList());
415
	}
416
 
417
	private void supprimerDansGrille(Personne personne) {
418
		if (personne != null) {
419
			//1) Ajouter a la liste des personne à supprimer uniquement si est présente dans la liste initiale
420
			if (auteursInitialListe.containsValue(personne)) {
421
				auteursSupprimes.put(personne.getId(), personne);
422
			}
423
 
424
			if (auteursAjoutes.containsValue(personne))	{
425
				auteursAjoutes.remove(personne);
426
			}
427
 
428
			//2) Supprimer la personne de la liste
429
			grille.getStore().remove(personne);
430
		} else {
431
			Info.display("Information", "Vous devez sélectionner une personne");
432
		}
433
	}
434
 
435
	private EditorGrid<Personne> creerGrille() {
436
 
437
		ListStore<Personne> storeGrille = new ListStore<Personne>();
438
		storeGrille.addListener(Store.Add, new Listener<StoreEvent<Personne>>() {
439
			public void handleEvent(StoreEvent<Personne> ce) {
440
				actualiserEtatBoutonsBarreOutils();
441
			}
442
		});
443
 
444
		storeGrille.addListener(Store.Remove, new Listener<StoreEvent<Personne>>() {
445
			public void handleEvent(StoreEvent<Personne> ce) {
446
				actualiserEtatBoutonsBarreOutils();
447
			}
448
		});
449
 
450
		storeGrille.addListener(Store.Update, new Listener<StoreEvent<Personne>>() {
451
			public void handleEvent(StoreEvent<Personne> ce) {
452
				if (ce.getRecord().isModified("_role_") && !ce.getModel().get("_etat_").equals(aDonnee.ETAT_AJOUTE)) {
453
					ce.getModel().set("_etat_", aDonnee.ETAT_MODIFIE);
454
				}
455
			}
456
		});
457
 
458
		List<ColumnConfig> colonnes = new ArrayList<ColumnConfig>();
459
		colonnes.add(new ColumnConfig("fmt_nom_complet", i18nC.personneNomComplet(), 150));
460
		colonnes.add(new ColumnConfig("code_postal", i18nC.personneCodePostal(), 150));
461
		colonnes.add(new ColumnConfig("ville", i18nC.personneVille(), 75));
462
		colonnes.add(new ColumnConfig("truk_courriel", i18nC.personneCourriel(), 75));
463
 
464
		GridSelectionModel<Personne> modeleDeSelection = new GridSelectionModel<Personne>();
465
 
466
		ColumnModel modeleDeColonnes = new ColumnModel(colonnes);
467
 
468
		EditorGrid<Personne> grillePublications = new EditorGrid<Personne>(storeGrille, modeleDeColonnes);
469
		grillePublications.setHeight("100%");
470
		grillePublications.setBorders(true);
471
		grillePublications.setSelectionModel(modeleDeSelection);
472
		grillePublications.getView().setForceFit(true);
473
		grillePublications.setAutoExpandColumn("fmt_nom_complet");
474
		grillePublications.setStripeRows(true);
475
		grillePublications.setTrackMouseOver(true);
476
 
477
		return grillePublications;
478
	}
479
 
1095 jpm 480
	private void genererTitreFormulaire() {
989 jpm 481
		String titre = i18nC.publicationTitreFormAjout();
822 jpm 482
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
1095 jpm 483
			 titre = i18nC.publicationTitreFormModif();
484
			 if (publication != null) {
1284 gduche 485
				 titre += " - "+i18nC.id()+": "+publication.getId()+" - "+publication.getObjetDeLaPublication();
1095 jpm 486
			 }
822 jpm 487
		}
1095 jpm 488
		panneauFormulaire.setHeading(titre);
822 jpm 489
	}
1284 gduche 490
 
822 jpm 491
 
775 jpm 492
	private void creerZoneAuteurs() {
493
		// Fieldset Auteur
1284 gduche 494
		auteursFieldset = new LayoutContainer(new FitLayout());
775 jpm 495
		auteurComboboxListe = new ArrayList<ComboBox<Personne>>(0);
792 jpm 496
		mediateur.clicObtenirListeAuteurs(this);
775 jpm 497
 
822 jpm 498
		creerChampsAuteur();
775 jpm 499
	}
500
 
822 jpm 501
	private void creerChampsAuteur() {
775 jpm 502
		auteursFieldset.removeAll();
1284 gduche 503
		barreOutils = creerBarreOutilsGrille();
504
		panneauFormulaire.setTopComponent(barreOutils);
505
		grille = creerGrille();
506
		auteursFieldset.add(grille);
1131 jpm 507
		auteursFieldset.layout();
775 jpm 508
	}
509
 
822 jpm 510
	public void creerChampAuteurEtBoutonSupprimer(Personne auteur) {
1284 gduche 511
		/*final HorizontalPanel panneauHorizontal = new HorizontalPanel();
1134 jpm 512
 
513
		LayoutContainer panneauChampTxt = new LayoutContainer();
514
		panneauChampTxt.setLayout(new FormLayout());
515
 
775 jpm 516
		final ComboBox<Personne> auteursSaisisComboBox = creerComboBoxAuteursSaisis();
517
		if (auteur != null) {
1131 jpm 518
			auteursSaisisComboBox.setValue(auteur);
901 jpm 519
			auteursSaisisComboBox.validate();
775 jpm 520
		}
521
		auteurComboboxListe.add(auteursSaisisComboBox);
989 jpm 522
		auteursSaisisComboBox.setFieldLabel(i18nC.publicationAuteurSingulier()+" "+auteurComboboxListe.size());
1134 jpm 523
		panneauChampTxt.add(auteursSaisisComboBox, new FormData(300, 0));
524
		panneauHorizontal.add(panneauChampTxt);
758 aurelien 525
 
822 jpm 526
		Button supprimerAuteurBouton = new Button();
527
		supprimerAuteurBouton.setIcon(Images.ICONES.supprimer());
528
		supprimerAuteurBouton.setToolTip(i18nC.supprimer());
529
		supprimerAuteurBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
775 jpm 530
			@Override
531
			public void componentSelected(ButtonEvent be) {
532
				auteurComboboxListe.remove(auteursSaisisComboBox);
533
				conteneurChamps.remove(panneauHorizontal);
822 jpm 534
 
535
				int numeroAuteurs = 1;
536
				for (Iterator<ComboBox<Personne>> it = auteurComboboxListe.iterator(); it.hasNext();) {
989 jpm 537
					it.next().setFieldLabel(i18nC.publicationAuteurSingulier()+" "+numeroAuteurs);
822 jpm 538
					numeroAuteurs++;
539
				}
540
 
1131 jpm 541
				auteursFieldset.layout();
775 jpm 542
			}
543
		});
822 jpm 544
		panneauHorizontal.add(supprimerAuteurBouton);
1134 jpm 545
 
775 jpm 546
		conteneurChamps.add(panneauHorizontal);
1284 gduche 547
		auteursFieldset.layout();*/
775 jpm 548
	}
549
 
550
	private ComboBox<Personne> creerComboBoxAuteursSaisis() {
1134 jpm 551
		ListStore<Personne> auteursStore = new ListStore<Personne>();
552
		auteursStore.add(auteursStorePartage.getModels());
553
 
775 jpm 554
		ComboBox<Personne> comboBox = new ComboBox<Personne>();
860 jpm 555
		comboBox.setEmptyText(i18nC.chercherPersonneSaisi());
775 jpm 556
		comboBox.setEditable(true);
1131 jpm 557
		comboBox.setAllowBlank(false);
775 jpm 558
		comboBox.setForceSelection(true);
559
		comboBox.setDisplayField("fmt_nom_complet");
560
		comboBox.setTriggerAction(TriggerAction.ALL);
1134 jpm 561
		comboBox.setStore(auteursStore);
1176 jpm 562
		comboBox.setMessageTarget("tooltip");
981 jpm 563
		comboBox.addStyleName(ComposantClass.OBLIGATOIRE);
980 jpm 564
		comboBox.addListener(Events.Valid, creerEcouteurChampObligatoire());
775 jpm 565
 
566
		return comboBox;
567
	}
568
 
569
	private void creerZoneGeneralites() {
570
		FormLayout layout = new FormLayout();
571
		layout.setLabelWidth(200);
219 aurelien 572
 
573
		// Fieldset Infos Générales
775 jpm 574
		generalitesFieldset = new FieldSet();
575
		generalitesFieldset.setHeading("Informations générales");
576
		generalitesFieldset.setCollapsible(true);
577
		generalitesFieldset.setLayout(layout);
219 aurelien 578
 
1032 jpm 579
		projetsCombo = new ComboBox<Projet>();
580
		projetsCombo.setTabIndex(tabIndex++);
581
		projetsCombo.setFieldLabel(i18nC.projetChamp());
582
		projetsCombo.setDisplayField("nom");
583
		projetsCombo.setForceSelection(true);
584
		projetsCombo.setValidator(new Validator() {
585
			public String validate(Field<?> field, String value) {
586
				String retour = null;
587
				if (field.getRawValue().equals("")) {
588
					field.setValue(null);
589
				} else if (projetsCombo.getStore().findModel("nom", field.getRawValue()) == null) {
590
					String contenuBrut = field.getRawValue();
591
					field.setValue(null);
592
					field.setRawValue(contenuBrut);
593
					retour = "Veuillez sélectionner une valeur ou laisser le champ vide";
594
				}
595
				return retour;
596
			}
597
		});
598
		projetsCombo.setTriggerAction(TriggerAction.ALL);
599
		projetsCombo.setStore(new ListStore<Projet>());
600
		projetsCombo.addStyleName(ComposantClass.OBLIGATOIRE);
601
		projetsCombo.addListener(Events.Valid, Formulaire.creerEcouteurChampObligatoire());
602
		generalitesFieldset.add(projetsCombo, new FormData(450, 0));
603
		mediateur.selectionnerProjet(this, null);
604
 
786 jpm 605
		titreChp = new TextField<String>();
606
		titreChp.setName("cpu");
607
		titreChp.setFieldLabel("Titre de l'article ou de l'ouvrage");
981 jpm 608
		titreChp.addStyleName(ComposantClass.OBLIGATOIRE);
980 jpm 609
		titreChp.addListener(Events.Valid, creerEcouteurChampObligatoire());
792 jpm 610
		generalitesFieldset.add(titreChp, new FormData(450, 0));
219 aurelien 611
 
786 jpm 612
		collectionChp = new TextField<String>();
792 jpm 613
		collectionChp.setFieldLabel("Intitulé de la revue ou de la collection");
614
		generalitesFieldset.add(collectionChp, new FormData(450, 0));
219 aurelien 615
 
786 jpm 616
		uriChp = new TextField<String>();
792 jpm 617
		uriChp.setFieldLabel("URL de la publication");
618
		generalitesFieldset.add(uriChp, new FormData(450, 0));
775 jpm 619
	}
620
 
621
	private void creerZoneEdition() {
622
		FormLayout layout = new FormLayout();
623
		layout.setLabelWidth(200);
624
 
219 aurelien 625
		// Fieldset Edition
775 jpm 626
		editionFieldset = new FieldSet();
792 jpm 627
		editionFieldset.setHeading("Édition");
775 jpm 628
		editionFieldset.setCollapsible(true);
629
		editionFieldset.setLayout(layout);
219 aurelien 630
 
792 jpm 631
		ListStore<Structure> editeurStore = new ListStore<Structure>();
632
		editeurCombobox = new ComboBox<Structure>();
633
		editeurCombobox.setEmptyText("Sélectionner un éditeur...");
634
		editeurCombobox.setFieldLabel("Éditeur de la publication");
635
		editeurCombobox.setDisplayField("nom");
636
		editeurCombobox.setStore(editeurStore);
637
		editeurCombobox.setEditable(true);
638
		editeurCombobox.setTriggerAction(TriggerAction.ALL);
639
		editionFieldset.add(editeurCombobox, new FormData(450, 0));
640
		mediateur.clicObtenirListeEditeurs(this);
219 aurelien 641
 
786 jpm 642
		datePublicationChp = new TextField<String>();
643
		datePublicationChp.setMaxLength(4);
644
		datePublicationChp.setMinLength(4);
645
		datePublicationChp.setFieldLabel("Année de publication");
981 jpm 646
		datePublicationChp.addStyleName(ComposantClass.OBLIGATOIRE);
980 jpm 647
		datePublicationChp.addListener(Events.Valid, creerEcouteurChampObligatoire());
792 jpm 648
		editionFieldset.add(datePublicationChp, new FormData(40, 0));
219 aurelien 649
 
786 jpm 650
		tomeChp = new TextField<String>();
792 jpm 651
		tomeChp.setFieldLabel("Série de la revue ou tome");
652
		editionFieldset.add(tomeChp, new FormData(75, 0));
219 aurelien 653
 
786 jpm 654
		fasciculeChp = new TextField<String>();
792 jpm 655
		fasciculeChp.setFieldLabel("Fascicule de la revue");
656
		editionFieldset.add(fasciculeChp, new FormData(75, 0));
219 aurelien 657
 
786 jpm 658
		pagesChp = new TextField<String>();
659
		pagesChp.setFieldLabel("Pages");
887 aurelien 660
		pagesChp.setToolTip("Fomat : NBRE ou NBRE-NBRE. ('NBRE' correspond à une suite de chiffres arabes ou romains ou à un point d'interrogation '?' dans le cas d'une donnée inconnue)");
792 jpm 661
		editionFieldset.add(pagesChp, new FormData(100, 0));
219 aurelien 662
	}
775 jpm 663
 
705 aurelien 664
	public void rafraichir(Object nouvellesDonnees) {
665
		if (nouvellesDonnees instanceof Publication) {
782 jpm 666
			// Si on a reçu les details d'une publication
667
			rafraichirPublication((Publication) nouvellesDonnees);
668
		} else if (nouvellesDonnees instanceof StructureListe) {
669
			// Si on a reçu une liste des editeurs
670
			rafraichirListeEditeurs((StructureListe) nouvellesDonnees);
671
		} else if (nouvellesDonnees instanceof PublicationAPersonneListe) {
672
			rafraichirListeAuteurs((PublicationAPersonneListe) nouvellesDonnees);
673
		} else if (nouvellesDonnees instanceof Information) {
674
			rafraichirInformation((Information) nouvellesDonnees);
1032 jpm 675
		} else if (nouvellesDonnees instanceof ProjetListe) {
676
			ProjetListe projets = (ProjetListe) nouvellesDonnees;
677
			Formulaire.rafraichirComboBox(projets, projetsCombo);
678
			setValeurComboProjets();
782 jpm 679
		} else {
680
			GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);
227 aurelien 681
		}
682
 
1180 jpm 683
		synchronisation();
684
	}
685
 
686
	private void synchronisation() {
687
		// Respecter l'ordre et faire attention à la réinitialisation des jetons
688
		// 1. gestion des auteurs (Modif ou Ajout)
689
		// 2. peupler le formulaire (Modif)
690
		// 3. initialisation de la gestion des auteurs ajoutés/supprimés (Modif)
691
		// 4. valider le formulaire (Modif ou Ajout)
692
 
822 jpm 693
		if (etrePretAAfficherAuteurs()) {
1131 jpm 694
			afficherAuteurs();
901 jpm 695
			initialiserAffichageAuteurs();
822 jpm 696
		}
1180 jpm 697
 
698
		if (etrePretAPeupler()) {
699
			peuplerFormulaire();
700
			genererTitreFormulaire();
701
			initialiserPeupler();
1176 jpm 702
		}
822 jpm 703
 
1180 jpm 704
		if (avoirAuteursMiseAJourCorrectement()) {
705
			miseAJourAuteursInitialListe();
706
			initialiserAuteurs();
707
			auteursValideOk = true;
708
		}
709
 
782 jpm 710
		if (etreValide()) {
822 jpm 711
			initialiserValidation();
782 jpm 712
			repandreRafraichissement();
1239 cyprien 713
			controlerFermeture();
219 aurelien 714
		}
782 jpm 715
	}
901 jpm 716
 
1133 jpm 717
	private void miseAJourAuteursInitialListe() {
901 jpm 718
		Iterator<String> clesAjoutees = auteursAjoutes.keySet().iterator();
719
		while (clesAjoutees.hasNext()) {
1284 gduche 720
			Personne auteurAjoute = auteursAjoutes.get(clesAjoutees.next());
1133 jpm 721
			auteursInitialListe.put(auteurAjoute.getId(), auteurAjoute);
901 jpm 722
		}
723
 
724
		Iterator<String> clesSupprimees = auteursSupprimes.keySet().iterator();
725
		while (clesSupprimees.hasNext()) {
1284 gduche 726
			Personne auteurSupprime = auteursSupprimes.get(clesSupprimees.next());
1133 jpm 727
			auteursInitialListe.remove(auteurSupprime.getId());
901 jpm 728
		}
729
	}
730
 
786 jpm 731
	private void rafraichirPublication(Publication publi) {
1131 jpm 732
		publicationOk = true;
786 jpm 733
		publication = publi;
782 jpm 734
	}
735
 
736
	private void rafraichirListeEditeurs(StructureListe editeurs) {
1180 jpm 737
		editeursOk = true;
792 jpm 738
		editeurCombobox.getStore().removeAll();
739
		editeurCombobox.getStore().add((List<Structure>) editeurs.toList());
782 jpm 740
	}
741
 
742
	private void rafraichirListeAuteurs(PublicationAPersonneListe auteurs) {
1133 jpm 743
		Iterator<String> it = auteurs.keySet().iterator();
744
		while (it.hasNext()) {
745
			Personne auteur = auteurs.get(it.next()).getPersonne();
746
			auteursInitialListe.put(auteur.getId(), auteur);
747
		}
1284 gduche 748
 
749
		grille.getStore().removeAll();
750
		grille.getStore().add(auteursInitialListe.toList());
751
 
822 jpm 752
		publicationAPersonneListeChargementOk = true;
782 jpm 753
	}
754
 
1284 gduche 755
	private void rafraichirInformation(Information info) {
1095 jpm 756
		String type = info.getType();
757
		if (type.equals("ajout_publication") || type.equals("modif_publication")) {
1284 gduche 758
			// On vient de soumettre le formulaire, on doit passer à l'étape suivante:
759
			// Validation des auteurs ou fermeture du formulaire
1095 jpm 760
			publicationValideOk = true;
761
			if (mode.equals(Formulaire.MODE_AJOUTER)) {
1197 jpm 762
				if (info.getDonnee(0) != null && info.getDonnee(0) instanceof String) {
763
					String publicationId = (String) info.getDonnee(0);
764
					if (publicationId.matches("[0-9]+")) {
765
						publication.setId(publicationId);
766
					}
767
				}
1284 gduche 768
				attenteAjoutAuteursOk = true;
1095 jpm 769
			}
1284 gduche 770
			soumettreAuteurs();
1095 jpm 771
		}
772
 
1284 gduche 773
 
782 jpm 774
		if (info.getType().equals("liste_personne")) {
822 jpm 775
			PersonneListe listePersonneAuteur = (PersonneListe) info.getDonnee(0);
776
 
1284 gduche 777
			/*List<Personne> liste = listePersonneAuteur.toList();
782 jpm 778
			auteursStorePartage.removeAll();
779
			auteursStorePartage.add(liste);
1284 gduche 780
			auteurStorePartageChargementOk = true;*/
781
 
782
			ListStore store = personnesSaisiesComboBox.getStore();
783
			store.removeAll();
784
			store.add(listePersonneAuteur.toList());
785
 
901 jpm 786
		} else if (info.getType().equals("ajout_publication_a_personne")) {
787
			attenteAjoutAuteursOk = false;
788
		} else if (info.getType().equals("suppression_publication_a_personne")) {
789
			attenteSuppressionAuteursOk = false;
1095 jpm 790
		} else if (info.getType().equals("modif_publication")) {
1284 gduche 791
			InfoLogger.display("Modification d'une publication", info.toString());
1095 jpm 792
		} else if (info.getType().equals("ajout_publication")) {
1197 jpm 793
			if (info.getDonnee(0) != null && info.getDonnee(0) instanceof String && ((String) info.getDonnee(0)).matches("[0-9]+")) {
1095 jpm 794
				String publicationId = (String) info.getDonnee(0);
1284 gduche 795
				InfoLogger.display("Ajout d'une publication", "La publication '"+publicationId+"' a bien été ajoutée");
1095 jpm 796
			} else {
1284 gduche 797
				InfoLogger.display("Ajout d'une publication", info.toString());
1095 jpm 798
			}
1284 gduche 799
		}
782 jpm 800
	}
801
 
901 jpm 802
	private boolean avoirAuteursMiseAJourCorrectement() {
1284 gduche 803
 
901 jpm 804
		boolean ok = false;
805
		if (attenteAjoutAuteursOk == false && attenteSuppressionAuteursOk == false) {
806
			ok = true;
807
		}
808
		return ok;
809
	}
810
 
822 jpm 811
	private void afficherAuteurs() {
1180 jpm 812
		if (mode.equals(Formulaire.MODE_AJOUTER)) {
813
			creerChampAuteurEtBoutonSupprimer(null);
814
		} else if (mode.equals(Formulaire.MODE_MODIFIER)) {
815
			Iterator<String> itap = auteursInitialListe.keySet().iterator();
816
			while (itap.hasNext()) {
817
				creerChampAuteurEtBoutonSupprimer(auteursInitialListe.get(itap.next()));
818
			}
822 jpm 819
		}
1180 jpm 820
		auteursAffiches = true;
822 jpm 821
	}
822
 
823
	private void initialiserAffichageAuteurs() {
824
		auteurStorePartageChargementOk = false;
825
		publicationAPersonneListeChargementOk = false;
826
	}
1176 jpm 827
 
1180 jpm 828
	private void initialiserPeupler() {
829
		publicationOk = false;
830
		editeursOk = false;
831
		auteursAffiches = false;
1176 jpm 832
	}
822 jpm 833
 
834
	private boolean etrePretAAfficherAuteurs() {
835
		boolean ok = false;
1180 jpm 836
		if (auteurStorePartageChargementOk
837
				&& ((mode.equals(Formulaire.MODE_MODIFIER) && publicationOk && publicationAPersonneListeChargementOk)
838
						|| (mode.equals(Formulaire.MODE_AJOUTER)))) {
822 jpm 839
			ok = true;
840
		}
841
		return ok;
842
	}
1176 jpm 843
 
1180 jpm 844
	private boolean etrePretAPeupler() {
1176 jpm 845
		boolean ok = false;
1284 gduche 846
		if (mode.equals(Formulaire.MODE_MODIFIER) && publicationOk && editeursOk) {
1176 jpm 847
			ok = true;
848
		}
849
		return ok;
850
	}
1180 jpm 851
 
782 jpm 852
	private Boolean etreValide() {
853
		Boolean valide = false;
1284 gduche 854
		if (formulaireValideOk && auteursValideOk) {
782 jpm 855
			valide = true;
856
		}
857
		return valide;
858
	}
859
 
822 jpm 860
	private void initialiserValidation() {
861
		formulaireValideOk = false;
862
		publicationValideOk = false;
901 jpm 863
		initialiserAuteurs();
822 jpm 864
		auteursValideOk = false;
782 jpm 865
	}
866
 
901 jpm 867
	private void initialiserAuteurs() {
868
		attenteAjoutAuteursOk = true;
1284 gduche 869
		auteursAjoutes = new PersonneListe();
901 jpm 870
		attenteSuppressionAuteursOk = true;
1284 gduche 871
		auteursSupprimes = new PersonneListe();
901 jpm 872
	}
873
 
782 jpm 874
	private void repandreRafraichissement() {
875
		if (vueExterneARafraichirApresValidation != null) {
786 jpm 876
			String type = "publication_modifiee";
877
			if (mode.equals(Formulaire.MODE_AJOUTER)) {
878
				type = "publication_ajoutee";
879
			}
880
			Information info = new Information(type);
881
			info.setDonnee(0, publication);
782 jpm 882
			vueExterneARafraichirApresValidation.rafraichir(info);
883
		}
884
	}
885
 
786 jpm 886
	public boolean soumettreFormulaire() {
822 jpm 887
		formulaireValideOk = verifierFormulaire();
888
		if (formulaireValideOk) {
901 jpm 889
			soumettrePublication();
1284 gduche 890
			//Les auteurs seront mis à jour lors du rafraichissement
901 jpm 891
		}
892
		return formulaireValideOk;
893
	}
894
 
895
	private void soumettrePublication() {
896
		Publication publicationCollectee = collecterPublication();
897
		if (publicationCollectee != null) {
898
			if (mode.equals(Formulaire.MODE_AJOUTER)) {
899
				mediateur.ajouterPublication(this, publicationCollectee);
900
			} else if (mode.equals(Formulaire.MODE_MODIFIER)) {
901
				mediateur.modifierPublication(this, publicationCollectee);
902
			}
903
		}
904
	}
905
 
906
	private void soumettreAuteurs() {
907
		attenteAjoutAuteursOk = false;
908
		attenteSuppressionAuteursOk = false;
909
 
1284 gduche 910
		//1) Auteurs ajoutés :
911
		// - Créer une PublicationAAuteurListe
912
		PublicationAPersonneListe listeDesAuteurs = new PublicationAPersonneListe();
913
		Iterator<String> itAuteur = auteursAjoutes.keySet().iterator();
914
		while (itAuteur.hasNext())	{
915
			PublicationAPersonne publiAPersonne = new PublicationAPersonne();
916
			String cle = itAuteur.next();
917
			publiAPersonne.setIdPersonne(cle);
918
			publiAPersonne.setIdPublication(publication.getId());
919
			listeDesAuteurs.put(cle, publiAPersonne);
920
		}
921
 
922
		// - envoyer au mediateur SSI personnes à ajouter
923
		if (listeDesAuteurs.size() > 0)	{
924
			mediateur.ajouterPublicationAPersonne(this, publication.getId(), listeDesAuteurs, PublicationAPersonne.ROLE_AUTEUR);
925
			attenteAjoutAuteursOk = true;
926
		}
927
 
928
		//2) Auteurs supprimés :
929
		// - Créer une PublicationAPersonneListe
930
		listeDesAuteurs = new PublicationAPersonneListe();
931
		itAuteur = auteursSupprimes.keySet().iterator();
932
		while (itAuteur.hasNext())	{
933
			PublicationAPersonne publiAPersonne = new PublicationAPersonne();
934
			String cle = itAuteur.next();
935
			publiAPersonne.setIdPersonne(cle);
936
			publiAPersonne.setIdPublication(publication.getId());
937
			listeDesAuteurs.put(cle, publiAPersonne);
938
		}
939
 
940
		// - Envoyer au médiateur SSI personnes à supprimer
941
		if (listeDesAuteurs.size() > 0) {
942
			mediateur.supprimerPublicationAPersonne(this, listeDesAuteurs);
943
			attenteSuppressionAuteursOk = true;
944
		}
945
 
946
		/*
947
		attenteAjoutAuteursOk = false;
948
		attenteSuppressionAuteursOk = false;
949
 
1133 jpm 950
		PersonneListe personnesInitiales = auteursInitialListe;
901 jpm 951
 
952
		PersonneListe personnesActuelles = new PersonneListe();
1131 jpm 953
		if (auteurComboboxListe != null) {
954
			Iterator<ComboBox<Personne>> itcp = auteurComboboxListe.iterator();
955
			while (itcp.hasNext()) {
1133 jpm 956
				ComboBox<Personne> combobox = itcp.next();
957
				Personne personne = combobox.getValue();
1131 jpm 958
				if (personne != null) {
959
					personnesActuelles.put(personne.getId(), personne);
960
				} else {
1134 jpm 961
					Debug.log("Etre valide :"+combobox.isValid()+" - "+combobox.getRawValue());
1131 jpm 962
				}
901 jpm 963
			}
964
		}
965
 
966
		// Auteurs ajoutés
967
		Iterator<String> clesActuelles = personnesActuelles.keySet().iterator();
968
		while (clesActuelles.hasNext()) {
969
			String idActuel = clesActuelles.next();
970
			if (personnesInitiales.size() == 0 || personnesInitiales.get(idActuel) == null) {
971
				Personne personne = personnesActuelles.get(idActuel);
972
				PublicationAPersonne publicationAAuteur = new PublicationAPersonne();
973
				if (mode.equals(Formulaire.MODE_MODIFIER)) {
974
					publicationAAuteur.setIdPublication(publication.getId());
741 aurelien 975
				}
901 jpm 976
				publicationAAuteur.setPersonne(personne);
977
				publicationAAuteur.setIdRole(PublicationAPersonne.ROLE_AUTEUR);
1284 gduche 978
				//FIXME : auteursAjoutes.put(publicationAAuteur.getId(), publicationAAuteur);
901 jpm 979
				attenteAjoutAuteursOk = true;
239 aurelien 980
			}
981
		}
901 jpm 982
 
983
		// Auteurs supprimés
984
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
985
			Iterator<String> clesInitiales = personnesInitiales.keySet().iterator();
986
			while (clesInitiales.hasNext()) {
987
				String idInitial = clesInitiales.next();
988
				if (personnesActuelles.size() == 0 || personnesActuelles.get(idInitial) == null) {
989
					Personne personne = personnesInitiales.get(idInitial);
990
					PublicationAPersonne publicationAAuteur = new PublicationAPersonne();
991
					publicationAAuteur.setIdPublication(publication.getId());
992
					publicationAAuteur.setPersonne(personne);
993
					publicationAAuteur.setIdRole(PublicationAPersonne.ROLE_AUTEUR);
1284 gduche 994
					//FIXME : auteursSupprimes.put(publicationAAuteur.getId(), publicationAAuteur);
901 jpm 995
					attenteSuppressionAuteursOk = true;
996
				}
997
			}
998
		}
999
 
1000
		// Execution de les mise à jour pour le mode MODIFICATION
1001
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
1002
			if (auteursAjoutes != null && auteursAjoutes.size() != 0) {
1284 gduche 1003
				//FIXME : mediateur.ajouterPublicationAPersonne(this, publication.getId(), auteursAjoutes, PublicationAPersonne.ROLE_AUTEUR);
901 jpm 1004
			}
1005
 
1006
			if (auteursSupprimes != null && auteursSupprimes.size() != 0) {
1284 gduche 1007
				//FIXME : mediateur.supprimerPublicationAPersonne(this, auteursSupprimes);
901 jpm 1008
			}
1284 gduche 1009
		}*/
219 aurelien 1010
	}
1011
 
934 jpm 1012
	public boolean verifierFormulaire() {
782 jpm 1013
		boolean valide = true;
1014
		ArrayList<String> messages = new ArrayList<String>();
1015
 
1284 gduche 1016
		// Tester si au moins un auteur est présent
1017
		if (grille.getStore().getModels().size() == 0) {
1018
			messages.add("Veuillez saisir au moins un auteur.");
227 aurelien 1019
		}
705 aurelien 1020
 
786 jpm 1021
		String titre = titreChp.getValue();
782 jpm 1022
		if (titre == null || titre.equals("")) {
1023
			messages.add("Veuillez saisir le titre de la publication !");
705 aurelien 1024
		}
1025
 
792 jpm 1026
		String uri = uriChp.getValue();
1027
		if (uri != null && ! uri.isEmpty() && ! uri.matches(Pattern.url)) {
1028
			messages.add("L'URL saisie n'est pas valide !");
1029
		}
1030
 
799 jpm 1031
		String datePublication = datePublicationChp.getRawValue();
1032
		if (datePublication == null || datePublication.equals("")) {
1033
			messages.add("Veuillez saisir une année de parution !");
725 aurelien 1034
		} else {
799 jpm 1035
			if (!etreDateValide(datePublication)) {
792 jpm 1036
				messages.add("Le format de l'année saisie est incorrect !");
725 aurelien 1037
			}
705 aurelien 1038
		}
717 aurelien 1039
 
792 jpm 1040
		String pages = pagesChp.getValue();
1041
		String valeurPage = "(?:[0-9]+|[IVXLCDM]+|\\?)";
799 jpm 1042
		if (pages != null && ! pages.matches("^(?:"+valeurPage+"|"+valeurPage+"-"+valeurPage+")$")) {
792 jpm 1043
			messages.add("Le format des pages est incorrect !");
1044
		}
1045
 
782 jpm 1046
		if (messages.size() != 0) {
1047
			String[] tableauDeMessages = {};
1048
			tableauDeMessages = messages.toArray(tableauDeMessages);
799 jpm 1049
			MessageBox.alert("Erreurs de saisies", UtilArray.implode(tableauDeMessages, "<br />"), null);
782 jpm 1050
			valide = false;
705 aurelien 1051
		}
782 jpm 1052
		return valide;
775 jpm 1053
	}
1054
 
822 jpm 1055
	private void peuplerFormulaire() {
1032 jpm 1056
		setValeurComboProjets();
822 jpm 1057
		titreChp.setValue(publication.getTitre());
1058
		collectionChp.setValue(publication.getCollection());
1059
		uriChp.setValue(publication.getURI());
1032 jpm 1060
		datePublicationChp.setValue(reduireDateParAnnee(publication.getDateParution()));
822 jpm 1061
		tomeChp.setValue(publication.getIndicationNvt());
1062
		fasciculeChp.setValue(publication.getFascicule());
1063
		pagesChp.setValue(publication.getPages());
1064
 
1065
		if (publication.getEditeur().matches("^[0-9]+$")) {
1066
			editeurCombobox.setValue(editeurCombobox.getStore().findModel("id_structure", publication.getEditeur()));
1067
		} else {
1068
			editeurCombobox.setRawValue(publication.getEditeur());
1069
		}
1070
	}
1071
 
786 jpm 1072
	private Publication collecterPublication() {
1284 gduche 1073
 
786 jpm 1074
		Publication publicationCollectee = (Publication) publication.cloner(new Publication());
1032 jpm 1075
		publicationCollectee.setIdProjet(getValeurComboProjets());
1124 jpm 1076
		publicationCollectee.setAuteur(construireIntituleAuteur());
786 jpm 1077
 
1078
		String titre = titreChp.getValue();
1079
		publicationCollectee.setTitre(titre);
1080
 
1081
		String collection = collectionChp.getValue();
1082
		publicationCollectee.setCollection(collection);
1083
 
1124 jpm 1084
		publicationCollectee.setNomComplet(construireNomComplet());
786 jpm 1085
 
1086
		String uri = uriChp.getValue();
1087
		publicationCollectee.setUri(uri);
1088
 
1089
		String editeur = "";
792 jpm 1090
		if (editeurCombobox.getValue() != null) {
1091
			editeur = editeurCombobox.getValue().getId();
799 jpm 1092
			publicationCollectee.setStructureEditeur(editeurCombobox.getValue());
792 jpm 1093
		} else if (editeurCombobox.getRawValue() != "") {
1094
			editeur = editeurCombobox.getRawValue();
786 jpm 1095
		}
1096
		publicationCollectee.setEditeur(editeur);
1097
 
792 jpm 1098
		String anneePublication = datePublicationChp.getRawValue();
1099
		String datePublication = anneePublication+"-00-00";
1100
		publicationCollectee.setDateParution(datePublication);
786 jpm 1101
 
1102
		String tome = tomeChp.getValue();
1103
		publicationCollectee.setIndicationNvt(tome);
1104
 
1105
		String fascicule = fasciculeChp.getValue();
1106
		publicationCollectee.setFascicule(fascicule);
1107
 
1108
		String pages = pagesChp.getValue();
1109
		publicationCollectee.setPages(pages);
1110
 
927 jpm 1111
		Publication publicationARetourner = null;
786 jpm 1112
		if (!publicationCollectee.comparer(publication)) {
1113
			publicationARetourner = publication = publicationCollectee;
1114
		}
1115
		return publicationARetourner;
1116
	}
1117
 
1124 jpm 1118
	private String construireIntituleEditeur() {
1119
		String editeur = "";
1120
		if (editeurCombobox.getValue() != null) {
1121
			editeur = editeurCombobox.getValue().getNom();
1122
		} else if (editeurCombobox.getRawValue() != "") {
1123
			editeur = editeurCombobox.getRawValue();
1124
		}
1125
		return editeur;
1126
	}
1127
 
1128
	private String construireIntituleAuteur() {
1284 gduche 1129
		String intituleAuteur = "";
1130
 
1131
		// TODO : ranger par ordre non-alphabétique
1132
		grille.getStore().sort("nom", SortDir.ASC);
1133
		List<Personne> auteurs = grille.getStore().getModels();
1134
 
1135
		Iterator<Personne> itAuteurs = auteurs.iterator();
1136
		while (itAuteurs.hasNext())	{
1137
			Personne personneCourante = itAuteurs.next();
1138
			intituleAuteur += personneCourante.getNom().toUpperCase() + " " + personneCourante.getPrenom();
1139
			if (itAuteurs.hasNext())	{
1140
				intituleAuteur+=", ";
1141
			}
1142
		}
1143
		/*
1144
		 * TO DELETE:int auteursNombre = auteurComboboxListe.size();
1145
		 *
1124 jpm 1146
		for (int i = 0; i < auteursNombre; i++) {
1147
			if (auteurComboboxListe.get(i).getValue() != null) {
1148
				Personne auteur = auteurComboboxListe.get(i).getValue();
1149
				inituleAuteur += auteur.getNom().toUpperCase()+ " "+auteur.getPrenom();
1150
				if (i != (auteursNombre - 1)) {
1151
					inituleAuteur += ", ";
1152
				}
1153
			}
1284 gduche 1154
		}*/
1155
		return intituleAuteur;
1124 jpm 1156
	}
1157
 
1158
	private String construireNomComplet() {
1159
		// Intitulé de la publication complet : fmt_auteur, date_parution(année). titre. Editeur (nom), collection, fascicule, indication_nvt. pages.
1160
		String nomComplet = "";
1161
		String auteurs = construireIntituleAuteur();
1162
		String annee = datePublicationChp.getRawValue();
1163
		String titre = titreChp.getValue();
1164
		String editeur = construireIntituleEditeur();
1165
 
1166
		nomComplet += auteurs+", "+annee+". "+titre+".";
1167
 
1168
		if (!UtilString.isEmpty(editeur)) {
1169
			nomComplet += " Éditeur "+editeur+".";
1170
		}
1171
 
1172
		if (collectionChp.getValue() != null) {
1173
			String revue = collectionChp.getValue();
1174
			nomComplet += ", "+revue;
1175
		}
1176
 
1177
		if (fasciculeChp.getValue() != null) {
1178
			String fascicule = fasciculeChp.getValue();
1179
			nomComplet += ", "+fascicule;
1180
		}
1181
 
1182
		if (tomeChp.getValue() != null) {
1183
			String tomaison = tomeChp.getValue();
1184
			nomComplet += ", "+tomaison;
1185
		}
1186
 
1187
		if (collectionChp.getValue() != null || fasciculeChp.getValue() != null || tomeChp.getValue() != null) {
1188
			nomComplet += ".";
1189
		}
1190
 
1191
		if (pagesChp.getValue() != null) {
1192
			String pages = pagesChp.getValue();
1193
			nomComplet += pages+".";
1194
		}
1195
 
1196
		return nomComplet;
1197
	}
1198
 
934 jpm 1199
	public void reinitialiserFormulaire() {
781 jpm 1200
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
786 jpm 1201
			mediateur.afficherFormPublication(publication.getId());
775 jpm 1202
		} else {
1203
			mediateur.afficherFormPublication(null);
219 aurelien 1204
		}
1205
	}
227 aurelien 1206
 
792 jpm 1207
	private boolean etreDateValide(String anneePublication) {
782 jpm 1208
		boolean valide = true;
792 jpm 1209
		if (!anneePublication.matches("^[0-2][0-9]{3}$")) {
782 jpm 1210
			valide = false;
725 aurelien 1211
		}
782 jpm 1212
		return valide;
725 aurelien 1213
	}
758 aurelien 1214
 
1215
	private String reduireDateParAnnee(String datePar) {
775 jpm 1216
		if (datePar.matches("^[0-2][0-9]{3}(-[0-9]{2}){2}$")) {
758 aurelien 1217
			return datePar.split("-")[0];
505 jp_milcent 1218
		} else {
758 aurelien 1219
			return "";
227 aurelien 1220
		}
758 aurelien 1221
	}
1032 jpm 1222
 
1223
	private String getValeurComboProjets() {
1224
		String valeur = "";
1225
		if (projetsCombo.getValue() != null) {
1226
			valeur = projetsCombo.getValue().getId();
1227
		}
1228
		return valeur;
1229
	}
1230
	private void setValeurComboProjets() {
1231
		if (projetsCombo.getStore() != null ) {
1232
			if (mode.equals(Formulaire.MODE_MODIFIER) && publication != null) {
1233
				projetsCombo.setValue(projetsCombo.getStore().findModel("id_projet", publication.getIdProjet()));
1234
			} else if (mode.equals(Formulaire.MODE_AJOUTER)) {
1235
				projetsCombo.setValue(projetsCombo.getStore().findModel("id_projet", mediateur.getProjetId()));
1236
			}
1237
		}
1238
	}
505 jp_milcent 1239
}