Subversion Repositories eFlore/Applications.coel

Rev

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