Subversion Repositories eFlore/Applications.coel

Rev

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