Subversion Repositories eFlore/Applications.coel

Rev

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