Subversion Repositories eFlore/Applications.coel

Rev

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