Subversion Repositories eFlore/Applications.coel

Rev

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