Subversion Repositories eFlore/Applications.coel

Rev

Rev 1468 | Rev 1516 | 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;
1513 jpm 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;
1513 jpm 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;
1428 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;
1513 jpm 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
 
1428 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;
1428 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
 
1428 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;
1513 jpm 123
	private GrillePaginable<ModelData> grilleAuteurs;
1375 cyprien 124
	private ChampComboBoxRechercheTempsReelPaginable personnesSaisiesComboBox = null;
1284 gduche 125
	private Button personnesBoutonSupprimer = null;
126
	private Button personnesBoutonModifier = null;
1428 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
 
1428 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
	}
1428 cyprien 148
 
782 jpm 149
 
1428 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);
1428 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
 
1428 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
	}
1428 cyprien 188
 
189
	private void initialiserAuteurs() {
190
		auteursAjoutes = new PublicationAPersonneListe();
191
		auteursSupprimes = new PublicationAPersonneListe();
192
		auteursModifies = new PublicationAPersonneListe();
193
	}
782 jpm 194
 
1428 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
 
1428 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
	}
1428 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);
1513 jpm 252
		bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {
1428 cyprien 253
			public void componentSelected(ButtonEvent ce) {
1513 jpm 254
				if (grilleAuteurs.getGrille().getSelectionModel().getSelectedItem() != null) {
1428 cyprien 255
 
1513 jpm 256
					ModelData publiAPersonneSelectionnee = grilleAuteurs.getSelectionModel().getSelectedItem();
1428 cyprien 257
 
1513 jpm 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
1428 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;
1513 jpm 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);
1428 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
 
1513 jpm 293
					ModelData publiAPersonneSelectionnee = grilleAuteurs.getSelectionModel().getSelectedItem();
1428 cyprien 294
 
1513 jpm 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
1428 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;
1513 jpm 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);
1428 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) {
1513 jpm 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)) {
1513 jpm 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) {
1513 jpm 409
				PublicationAPersonne personneSelectionnee = new PublicationAPersonne(grilleAuteurs.getSelectionModel().getSelectedItem(), false);
1428 cyprien 410
				if (personneSelectionnee == null) {
1284 gduche 411
					InfoLogger.display(i18nC.informationTitreGenerique(), i18nC.selectionnerPublication());
412
				} else {
1428 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 {
1428 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");
1428 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";
1468 jpm 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>() {
1428 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());
1513 jpm 463
					PublicationAPersonne pap = new PublicationAPersonne(false);
464
					pap.setPersonne(personneSaisieSelectionnee, true);
1468 jpm 465
					pap.setOrdreAuteurs(String.valueOf(grilleAuteurs.getStore().getCount()+1));
466
					if (modeDeCreation != Formulaire.MODE_AJOUTER) {
467
						pap.setPublicationLiee(publication);
468
						pap.setIdPublication(publicationId);
469
					}
1428 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 {
1428 cyprien 473
						ajouterDansGrille(pap);
1375 cyprien 474
						personnesSaisiesComboBox.getCombo().setValue(null);
1284 gduche 475
					}
476
				}
477
			}
478
		});
479
	}
480
 
1428 cyprien 481
	private void ajouterDansGrille(PublicationAPersonne pap) {
1468 jpm 482
		ajouterDansGrille(pap, grilleAuteurs.getStore().getCount());
1284 gduche 483
	}
484
 
1428 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
1428 cyprien 489
				if (!auteursInitialListe.containsValue(pap))	{
490
					auteursAjoutes.put(pap.getId(), pap);
1284 gduche 491
				}
492
 
493
				// L'enlever de la liste à supprimer
1428 cyprien 494
				if (auteursSupprimes.containsValue(pap))	{
495
					auteursSupprimes.remove(pap);
1284 gduche 496
				}
497
				//2) Ajouter a la grille
1428 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
	 */
1428 cyprien 509
	/*
1284 gduche 510
	private void mettreAJourGrille()	{
511
		grille.getStore().removeAll();
512
		grille.getStore().add(listePersonne.toList());
1428 cyprien 513
	}*/
1284 gduche 514
 
1428 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
 
1428 cyprien 522
			if (auteursAjoutes.containsValue(pap))	{
523
				auteursAjoutes.remove(pap);
1284 gduche 524
			}
525
 
1428 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
 
1513 jpm 537
	private GrillePaginable<ModelData> creerGrilleAuteurs() {
1284 gduche 538
 
1513 jpm 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");
1428 cyprien 555
 
1513 jpm 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
		// ATTENTION : le constructure de cette grille est à vérifier!
590
		final GrillePaginable<ModelData> grilleAuteurs = new GrillePaginable<ModelData>(modelTypePersonnesAPublication, virtualFields, proxyPersonnesAPublication, colonnes, modeleDeColonnes);
591
		grilleAuteurs.getGrille().setHeight("100%");
592
		grilleAuteurs.getGrille().setBorders(true);
593
		grilleAuteurs.getGrille().setSelectionModel(modeleDeSelection);
594
		grilleAuteurs.getGrille().getView().setForceFit(true);
595
		grilleAuteurs.getGrille().setAutoExpandColumn("fmt_nom_complet");
596
		grilleAuteurs.getGrille().setStripeRows(true);
597
		grilleAuteurs.getGrille().setTrackMouseOver(true);
598
 
599
		// Rajouter des écouteurs
600
		grilleAuteurs.getStore().addListener(Store.Add, new Listener<StoreEvent<ModelData>>() {
601
			public void handleEvent(StoreEvent<ModelData> ce) {
602
				if (!changeOrderMarker) {
1428 cyprien 603
					actualiserEtatBoutonsBarreOutils();
604
				}
1284 gduche 605
			}
606
		});
1513 jpm 607
		grilleAuteurs.getStore().addListener(Store.Remove, new Listener<StoreEvent<ModelData>>() {
608
			public void handleEvent(StoreEvent<ModelData> ce) {
1428 cyprien 609
				if (!changeOrderMarker) {
610
					actualiserEtatBoutonsBarreOutils();
611
				}
1284 gduche 612
			}
613
		});
1513 jpm 614
		grilleAuteurs.getStore().addListener(Store.Update, new Listener<StoreEvent<ModelData>>() {
615
			public void handleEvent(StoreEvent<ModelData> ce) {
1428 cyprien 616
				if (!changeOrderMarker) {
1513 jpm 617
					if (ce.getRecord().isModified("_ordre_")) {
618
						// s'il s'agit d'un auteur que l'on vient d'ajouter à la liste, alors on a pas besoin
619
						// de faire quoique ce soit car l'auteur est déjà dans la liste des auteurs ajoutés
1428 cyprien 620
						if (ce.getModel().get("_etat_").equals(aDonnee.ETAT_AJOUTE)) {
621
							// ... do nothing
1513 jpm 622
						// s'il s'agit d'un auteur qui était déjà présent dans la liste initiale, il faut
623
						// ajouter cet auteur à la liste des auteurs modifiés
1428 cyprien 624
						} else {
1513 jpm 625
							PublicationAPersonne pap = new PublicationAPersonne(ce.getModel(), false);
626
							auteursModifies.put(pap.getId(), pap);
1428 cyprien 627
						}
628
					}
1284 gduche 629
				}
630
			}
1513 jpm 631
		});
1284 gduche 632
 
1513 jpm 633
		return grilleAuteurs;
1284 gduche 634
	}
635
 
1095 jpm 636
	private void genererTitreFormulaire() {
989 jpm 637
		String titre = i18nC.publicationTitreFormAjout();
822 jpm 638
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
1095 jpm 639
			 titre = i18nC.publicationTitreFormModif();
640
			 if (publication != null) {
1322 gduche 641
				 titre += " - "+i18nC.id()+": "+publication.getId()+" - "+publication.getTitre();
1095 jpm 642
			 }
822 jpm 643
		}
1095 jpm 644
		panneauFormulaire.setHeading(titre);
822 jpm 645
	}
1284 gduche 646
 
822 jpm 647
 
775 jpm 648
	private void creerZoneAuteurs() {
1329 cyprien 649
		auteursFieldset = new ContentPanel();
650
		auteursFieldset.setLayout(new FitLayout());
651
		auteursFieldset.setHeading("Auteurs");
652
 
822 jpm 653
		creerChampsAuteur();
775 jpm 654
	}
655
 
822 jpm 656
	private void creerChampsAuteur() {
775 jpm 657
		auteursFieldset.removeAll();
1284 gduche 658
		barreOutils = creerBarreOutilsGrille();
1329 cyprien 659
		auteursFieldset.setTopComponent(barreOutils);
1428 cyprien 660
		grilleAuteurs = creerGrilleAuteurs();
661
		auteursFieldset.add(grilleAuteurs);
1131 jpm 662
		auteursFieldset.layout();
775 jpm 663
	}
664
 
665
	private void creerZoneGeneralites() {
666
		FormLayout layout = new FormLayout();
667
		layout.setLabelWidth(200);
219 aurelien 668
 
669
		// Fieldset Infos Générales
775 jpm 670
		generalitesFieldset = new FieldSet();
671
		generalitesFieldset.setHeading("Informations générales");
672
		generalitesFieldset.setCollapsible(true);
673
		generalitesFieldset.setLayout(layout);
1329 cyprien 674
 
675
		ModelType modelTypeProjets = new ModelType();
676
		modelTypeProjets.setRoot("projets");
677
		modelTypeProjets.setTotalName("nbElements");
678
		modelTypeProjets.addField("cpr_nom");
679
		modelTypeProjets.addField("cpr_id_projet");
219 aurelien 680
 
1329 cyprien 681
		String displayNameProjets = "cpr_nom";
1468 jpm 682
		ProxyProjets<ModelData> proxyProjets = new ProxyProjets<ModelData>(null);
1329 cyprien 683
 
684
		projetsCombo = new ChampComboBoxRechercheTempsReelPaginable(proxyProjets, modelTypeProjets, displayNameProjets);
685
		projetsCombo.setWidth(200, 600);
686
		projetsCombo.getCombo().setTabIndex(tabIndex++);
687
		projetsCombo.getCombo().setFieldLabel(i18nC.projetChamp());
688
		projetsCombo.getCombo().setForceSelection(true);
689
		projetsCombo.getCombo().addStyleName(ComposantClass.OBLIGATOIRE);
690
		projetsCombo.getCombo().addListener(Events.Valid, Formulaire.creerEcouteurChampObligatoire());
691
 
692
		projetsCombo.getCombo().setValidator(new Validator() {
1032 jpm 693
			public String validate(Field<?> field, String value) {
694
				String retour = null;
695
				if (field.getRawValue().equals("")) {
696
					field.setValue(null);
1329 cyprien 697
				} else if (projetsCombo.getStore().findModel("cpr_nom", field.getRawValue()) == null) {
1032 jpm 698
					String contenuBrut = field.getRawValue();
699
					field.setValue(null);
700
					field.setRawValue(contenuBrut);
701
					retour = "Veuillez sélectionner une valeur ou laisser le champ vide";
702
				}
703
				return retour;
704
			}
1329 cyprien 705
		});
706
		generalitesFieldset.add(projetsCombo, new FormData(600, 0));
1032 jpm 707
 
786 jpm 708
		titreChp = new TextField<String>();
709
		titreChp.setName("cpu");
710
		titreChp.setFieldLabel("Titre de l'article ou de l'ouvrage");
981 jpm 711
		titreChp.addStyleName(ComposantClass.OBLIGATOIRE);
980 jpm 712
		titreChp.addListener(Events.Valid, creerEcouteurChampObligatoire());
792 jpm 713
		generalitesFieldset.add(titreChp, new FormData(450, 0));
219 aurelien 714
 
786 jpm 715
		collectionChp = new TextField<String>();
792 jpm 716
		collectionChp.setFieldLabel("Intitulé de la revue ou de la collection");
717
		generalitesFieldset.add(collectionChp, new FormData(450, 0));
219 aurelien 718
 
786 jpm 719
		uriChp = new TextField<String>();
792 jpm 720
		uriChp.setFieldLabel("URL de la publication");
721
		generalitesFieldset.add(uriChp, new FormData(450, 0));
775 jpm 722
	}
723
 
724
	private void creerZoneEdition() {
725
		FormLayout layout = new FormLayout();
726
		layout.setLabelWidth(200);
727
 
219 aurelien 728
		// Fieldset Edition
775 jpm 729
		editionFieldset = new FieldSet();
792 jpm 730
		editionFieldset.setHeading("Édition");
775 jpm 731
		editionFieldset.setCollapsible(true);
732
		editionFieldset.setLayout(layout);
219 aurelien 733
 
1329 cyprien 734
		/*****************************************************/
735
		/**			Champ 'Editeur de la publication'		**/
736
		/*****************************************************/
737
		ModelType modelTypeStructures = new ModelType();
738
		modelTypeStructures.setRoot("structures");
739
		modelTypeStructures.setTotalName("nbElements");
740
		modelTypeStructures.addField("cs_nom");
741
		modelTypeStructures.addField("cs_id_structure");
219 aurelien 742
 
1329 cyprien 743
		String displayNameStructures = "cs_nom";
1468 jpm 744
		ProxyStructures<ModelData> proxyStructures = new ProxyStructures<ModelData>(null);
1329 cyprien 745
 
746
		editeurCombobox = new ChampComboBoxRechercheTempsReelPaginable(proxyStructures, modelTypeStructures, displayNameStructures);
747
		editeurCombobox.setWidth(200, 600);
748
		editeurCombobox.getCombo().setTabIndex(tabIndex++);
749
		editeurCombobox.getCombo().setEmptyText("Sélectionner un éditeur...");
750
		editeurCombobox.getCombo().setFieldLabel("Éditeur de la publication");
751
		editeurCombobox.getCombo().setEditable(true);
752
		editionFieldset.add(editeurCombobox, new FormData(600, 0));
753
 
754
		/*********************************************/
755
		/**			Champ 'Date de publication'		**/
756
		/*********************************************/
786 jpm 757
		datePublicationChp = new TextField<String>();
758
		datePublicationChp.setMaxLength(4);
759
		datePublicationChp.setMinLength(4);
760
		datePublicationChp.setFieldLabel("Année de publication");
981 jpm 761
		datePublicationChp.addStyleName(ComposantClass.OBLIGATOIRE);
980 jpm 762
		datePublicationChp.addListener(Events.Valid, creerEcouteurChampObligatoire());
792 jpm 763
		editionFieldset.add(datePublicationChp, new FormData(40, 0));
219 aurelien 764
 
1513 jpm 765
		/*********************************/
766
		/**			Champ 'Tome'		**/
767
		/*********************************/
786 jpm 768
		tomeChp = new TextField<String>();
792 jpm 769
		tomeChp.setFieldLabel("Série de la revue ou tome");
770
		editionFieldset.add(tomeChp, new FormData(75, 0));
1329 cyprien 771
 
1513 jpm 772
		/*************************************/
773
		/**			Champ 'Fascicule'		**/
774
		/*************************************/
786 jpm 775
		fasciculeChp = new TextField<String>();
792 jpm 776
		fasciculeChp.setFieldLabel("Fascicule de la revue");
777
		editionFieldset.add(fasciculeChp, new FormData(75, 0));
1329 cyprien 778
 
1513 jpm 779
		/*********************************/
780
		/**			Champ 'Pages'		**/
781
		/*********************************/
786 jpm 782
		pagesChp = new TextField<String>();
783
		pagesChp.setFieldLabel("Pages");
887 aurelien 784
		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 785
		editionFieldset.add(pagesChp, new FormData(100, 0));
219 aurelien 786
	}
1180 jpm 787
 
901 jpm 788
 
1428 cyprien 789
	 //-------------------------//
790
	//    Méthodes privées     //------------------------------------------------------------
791
 
1133 jpm 792
	private void miseAJourAuteursInitialListe() {
901 jpm 793
		Iterator<String> clesAjoutees = auteursAjoutes.keySet().iterator();
794
		while (clesAjoutees.hasNext()) {
1428 cyprien 795
			PublicationAPersonne auteurAjoute = auteursAjoutes.get(clesAjoutees.next());
1133 jpm 796
			auteursInitialListe.put(auteurAjoute.getId(), auteurAjoute);
901 jpm 797
		}
798
 
799
		Iterator<String> clesSupprimees = auteursSupprimes.keySet().iterator();
800
		while (clesSupprimees.hasNext()) {
1428 cyprien 801
			PublicationAPersonne auteurSupprime = auteursSupprimes.get(clesSupprimees.next());
1133 jpm 802
			auteursInitialListe.remove(auteurSupprime.getId());
901 jpm 803
		}
804
	}
805
 
786 jpm 806
	public boolean soumettreFormulaire() {
1322 gduche 807
		boolean formulaireValideOk = verifierFormulaire();
822 jpm 808
		if (formulaireValideOk) {
901 jpm 809
			soumettrePublication();
810
		}
811
		return formulaireValideOk;
812
	}
1322 gduche 813
 
901 jpm 814
	private void soumettrePublication() {
815
		Publication publicationCollectee = collecterPublication();
816
		if (publicationCollectee != null) {
1428 cyprien 817
			// Pour l'enregistrement des publications, on utilise le séquenceur
1322 gduche 818
			// Il doit attendre le retour de l'enregistrement pour poursuivre
819
			sequenceur = new Sequenceur();
820
			int seqId = sequenceur.lancerRequeteSynchrone(this);
901 jpm 821
			if (mode.equals(Formulaire.MODE_AJOUTER)) {
1322 gduche 822
				mediateur.ajouterPublication(sequenceur, publicationCollectee, seqId);
901 jpm 823
			} else if (mode.equals(Formulaire.MODE_MODIFIER)) {
1322 gduche 824
				mediateur.modifierPublication(sequenceur, publicationCollectee, seqId);
901 jpm 825
			}
1428 cyprien 826
 
827
		// si l'on est en mode MODIFIER, on soumet les auteurs meme si les informations de la publication
828
		// restent inchangées car il se peut que les auteurs aient été modifiés
829
		} else if (mode.equals(Formulaire.MODE_MODIFIER)) {
830
			soumettreAuteurs();
901 jpm 831
		}
832
	}
833
 
834
	private void soumettreAuteurs() {
835
 
1428 cyprien 836
		formaterOrdreAuteurs();
837
 
1284 gduche 838
		//1) Auteurs ajoutés :
1428 cyprien 839
		PublicationAPersonneListe listeAuteursAAjouter = new PublicationAPersonneListe();
1284 gduche 840
		Iterator<String> itAuteur = auteursAjoutes.keySet().iterator();
1428 cyprien 841
		while (itAuteur.hasNext())	{
1284 gduche 842
			String cle = itAuteur.next();
1428 cyprien 843
			PublicationAPersonne publiAPersonne = auteursAjoutes.get(cle);
844
			publiAPersonne.setIdPublication(this.publicationId);
845
			publiAPersonne.setOrdreAuteurs(publiAPersonne.getOrdreAuteurs());
846
			listeAuteursAAjouter.put(cle, publiAPersonne);
1284 gduche 847
		}
848
 
849
		// - envoyer au mediateur SSI personnes à ajouter
1428 cyprien 850
		if (listeAuteursAAjouter.size() > 0)	{
1322 gduche 851
			int seqId = sequenceur.lancerRequeteSynchrone(this);
1428 cyprien 852
			mediateur.ajouterPublicationAPersonne(sequenceur, this.publicationId, listeAuteursAAjouter, PublicationAPersonne.ROLE_AUTEUR, seqId);
1284 gduche 853
		}
854
 
855
		//2) Auteurs supprimés :
1428 cyprien 856
		PublicationAPersonneListe listeAuteursASupprimer = new PublicationAPersonneListe();
1284 gduche 857
		itAuteur = auteursSupprimes.keySet().iterator();
858
		while (itAuteur.hasNext())	{
859
			String cle = itAuteur.next();
1428 cyprien 860
			PublicationAPersonne publiAPersonne = auteursSupprimes.get(cle);
861
			listeAuteursASupprimer.put(cle, publiAPersonne);
1284 gduche 862
		}
863
 
864
		// - Envoyer au médiateur SSI personnes à supprimer
1428 cyprien 865
		if (listeAuteursASupprimer.size() > 0) {
1322 gduche 866
			// Pour une suppression des auteurs, on a pas besoin d'attendre le retour
1428 cyprien 867
			mediateur.supprimerPublicationAPersonne(this, listeAuteursASupprimer);
1284 gduche 868
		}
869
 
1428 cyprien 870
		//3) Auteurs modifiés :
871
		PublicationAPersonneListe listeAuteursAModifier = new PublicationAPersonneListe();
872
		itAuteur = auteursModifies.keySet().iterator();
873
		while (itAuteur.hasNext())	{
874
			String cle = itAuteur.next();
875
			PublicationAPersonne publiAPersonne = auteursModifies.get(cle);
876
			listeAuteursAModifier.put(cle, publiAPersonne);
227 aurelien 877
		}
705 aurelien 878
 
1428 cyprien 879
		// - Envoyer au médiateur SSI personnes à modifier
880
		if (listeAuteursAModifier.size() > 0) {
881
			int seqId = sequenceur.lancerRequeteSynchrone(this);
1468 jpm 882
			mediateur.modifierPublicationAPersonne(sequenceur, this.publicationId, listeAuteursAModifier, PublicationAPersonne.ROLE_AUTEUR, seqId);
705 aurelien 883
		}
884
 
1428 cyprien 885
		sequenceur.enfilerRafraichissement(this, new Information("auteurs_enregistres"));
886
	}
887
 
888
	private void formaterOrdreAuteurs() {
1513 jpm 889
		ListStore<ModelData> store = grilleAuteurs.getStore();
890
		List<ModelData> auteurs = grilleAuteurs.getStore().getModels();
792 jpm 891
 
1513 jpm 892
		Iterator<ModelData> itAuteurs = auteurs.iterator();
1428 cyprien 893
		while (itAuteurs.hasNext())	{
1513 jpm 894
			ModelData selection = itAuteurs.next();
895
 
896
			PublicationAPersonne pap = new PublicationAPersonne(selection, false);
897
			int ordre = store.indexOf(selection) + 1;
898
 
1428 cyprien 899
			if (pap.getOrdreAuteurs() != String.valueOf(ordre)) {
1513 jpm 900
				pap.setOrdreAuteurs(String.valueOf(ordre));
1428 cyprien 901
				auteursModifies.put(pap.getId(), pap);
725 aurelien 902
			}
1428 cyprien 903
		}
775 jpm 904
	}
905
 
822 jpm 906
	private void peuplerFormulaire() {
1032 jpm 907
		setValeurComboProjets();
822 jpm 908
		titreChp.setValue(publication.getTitre());
909
		collectionChp.setValue(publication.getCollection());
910
		uriChp.setValue(publication.getURI());
1032 jpm 911
		datePublicationChp.setValue(reduireDateParAnnee(publication.getDateParution()));
822 jpm 912
		tomeChp.setValue(publication.getIndicationNvt());
913
		fasciculeChp.setValue(publication.getFascicule());
914
		pagesChp.setValue(publication.getPages());
915
 
916
		if (publication.getEditeur().matches("^[0-9]+$")) {
1329 cyprien 917
			editeurCombobox.getCombo().setValue(editeurCombobox.getStore().findModel("cs_id_structure", publication.getEditeur()));
822 jpm 918
		} else {
1329 cyprien 919
			editeurCombobox.getCombo().setRawValue(publication.getEditeur());
822 jpm 920
		}
921
	}
922
 
786 jpm 923
	private Publication collecterPublication() {
1428 cyprien 924
 
786 jpm 925
		Publication publicationCollectee = (Publication) publication.cloner(new Publication());
1032 jpm 926
		publicationCollectee.setIdProjet(getValeurComboProjets());
1124 jpm 927
		publicationCollectee.setAuteur(construireIntituleAuteur());
786 jpm 928
 
929
		String titre = titreChp.getValue();
930
		publicationCollectee.setTitre(titre);
931
 
932
		String collection = collectionChp.getValue();
933
		publicationCollectee.setCollection(collection);
934
 
1124 jpm 935
		publicationCollectee.setNomComplet(construireNomComplet());
786 jpm 936
 
937
		String uri = uriChp.getValue();
938
		publicationCollectee.setUri(uri);
939
 
940
		String editeur = "";
1329 cyprien 941
		if (editeurCombobox.getValeur() != null) {
942
			Structure structure = new Structure(editeurCombobox.getValeur());
943
			editeur = structure.getId();
944
			publicationCollectee.setStructureEditeur(structure);
945
		} else if (!UtilString.isEmpty(editeurCombobox.getCombo().getRawValue())) {
946
			editeur = editeurCombobox.getCombo().getRawValue();
786 jpm 947
		}
948
		publicationCollectee.setEditeur(editeur);
949
 
792 jpm 950
		String anneePublication = datePublicationChp.getRawValue();
951
		String datePublication = anneePublication+"-00-00";
952
		publicationCollectee.setDateParution(datePublication);
786 jpm 953
 
954
		String tome = tomeChp.getValue();
955
		publicationCollectee.setIndicationNvt(tome);
956
 
957
		String fascicule = fasciculeChp.getValue();
958
		publicationCollectee.setFascicule(fascicule);
959
 
960
		String pages = pagesChp.getValue();
961
		publicationCollectee.setPages(pages);
962
 
927 jpm 963
		Publication publicationARetourner = null;
786 jpm 964
		if (!publicationCollectee.comparer(publication)) {
965
			publicationARetourner = publication = publicationCollectee;
966
		}
967
		return publicationARetourner;
968
	}
969
 
1124 jpm 970
	private String construireIntituleEditeur() {
971
		String editeur = "";
1329 cyprien 972
		if (editeurCombobox.getValeur() != null) {
973
			Structure structure = new Structure(editeurCombobox.getValeur());
1428 cyprien 974
			if (structure == null) editeur = editeurCombobox.getCombo().getRawValue();
975
			else editeur = structure.getNom();
1329 cyprien 976
		} else if (!UtilString.isEmpty(editeurCombobox.getCombo().getRawValue())) {
977
			editeur = editeurCombobox.getCombo().getRawValue();
1124 jpm 978
		}
979
		return editeur;
980
	}
981
 
982
	private String construireIntituleAuteur() {
1284 gduche 983
		String intituleAuteur = "";
984
 
1513 jpm 985
		// rangé par ordre désigné par le champ 'cpuap_ordre' de la table PublicationAPersonne
986
		grilleAuteurs.getStore().sort("_ordre_", SortDir.ASC);
987
		List<ModelData> auteurs = grilleAuteurs.getStore().getModels();
988
		Iterator<ModelData> itAuteurs = auteurs.iterator();
989
 
1284 gduche 990
		while (itAuteurs.hasNext())	{
1513 jpm 991
			Personne personneCourante = new PublicationAPersonne(itAuteurs.next(), false).getPersonne();
1284 gduche 992
			intituleAuteur += personneCourante.getNom().toUpperCase() + " " + personneCourante.getPrenom();
993
			if (itAuteurs.hasNext())	{
994
				intituleAuteur+=", ";
995
			}
996
		}
997
		return intituleAuteur;
1124 jpm 998
	}
999
 
1000
	private String construireNomComplet() {
1001
		// Intitulé de la publication complet : fmt_auteur, date_parution(année). titre. Editeur (nom), collection, fascicule, indication_nvt. pages.
1002
		String nomComplet = "";
1003
		String auteurs = construireIntituleAuteur();
1004
		String annee = datePublicationChp.getRawValue();
1005
		String titre = titreChp.getValue();
1006
		String editeur = construireIntituleEditeur();
1007
 
1008
		nomComplet += auteurs+", "+annee+". "+titre+".";
1009
 
1010
		if (!UtilString.isEmpty(editeur)) {
1011
			nomComplet += " Éditeur "+editeur+".";
1012
		}
1013
 
1014
		if (collectionChp.getValue() != null) {
1015
			String revue = collectionChp.getValue();
1016
			nomComplet += ", "+revue;
1017
		}
1018
 
1019
		if (fasciculeChp.getValue() != null) {
1020
			String fascicule = fasciculeChp.getValue();
1021
			nomComplet += ", "+fascicule;
1022
		}
1023
 
1024
		if (tomeChp.getValue() != null) {
1025
			String tomaison = tomeChp.getValue();
1026
			nomComplet += ", "+tomaison;
1027
		}
1028
 
1029
		if (collectionChp.getValue() != null || fasciculeChp.getValue() != null || tomeChp.getValue() != null) {
1030
			nomComplet += ".";
1031
		}
1032
 
1033
		if (pagesChp.getValue() != null) {
1034
			String pages = pagesChp.getValue();
1035
			nomComplet += pages+".";
1036
		}
1037
 
1038
		return nomComplet;
1039
	}
1040
 
934 jpm 1041
	public void reinitialiserFormulaire() {
781 jpm 1042
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
786 jpm 1043
			mediateur.afficherFormPublication(publication.getId());
775 jpm 1044
		} else {
1045
			mediateur.afficherFormPublication(null);
219 aurelien 1046
		}
1047
	}
227 aurelien 1048
 
792 jpm 1049
	private boolean etreDateValide(String anneePublication) {
782 jpm 1050
		boolean valide = true;
792 jpm 1051
		if (!anneePublication.matches("^[0-2][0-9]{3}$")) {
782 jpm 1052
			valide = false;
725 aurelien 1053
		}
782 jpm 1054
		return valide;
725 aurelien 1055
	}
758 aurelien 1056
 
1057
	private String reduireDateParAnnee(String datePar) {
775 jpm 1058
		if (datePar.matches("^[0-2][0-9]{3}(-[0-9]{2}){2}$")) {
758 aurelien 1059
			return datePar.split("-")[0];
505 jp_milcent 1060
		} else {
758 aurelien 1061
			return "";
227 aurelien 1062
		}
758 aurelien 1063
	}
1032 jpm 1064
 
1428 cyprien 1065
	 //---------------------------//
1066
	//    Méthodes publiques     //------------------------------------------------------------
1067
 
1068
	public boolean verifierFormulaire() {
1069
		boolean valide = true;
1070
		ArrayList<String> messages = new ArrayList<String>();
1071
 
1072
		// Tester si au moins un auteur est présent
1073
		if (grilleAuteurs.getStore().getModels().size() == 0) {
1074
			messages.add("Veuillez saisir au moins un auteur.");
1075
		}
1076
 
1077
		String titre = titreChp.getValue();
1078
		if (titre == null || titre.equals("")) {
1079
			messages.add("Veuillez saisir le titre de la publication !");
1080
		}
1081
 
1082
		String uri = uriChp.getValue();
1083
		if (uri != null && ! uri.isEmpty() && ! uri.matches(Pattern.url)) {
1084
			messages.add("L'URL saisie n'est pas valide !");
1085
		}
1086
 
1087
		String datePublication = datePublicationChp.getRawValue();
1088
		if (datePublication == null || datePublication.equals("")) {
1089
			messages.add("Veuillez saisir une année de parution !");
1090
		} else {
1091
			if (!etreDateValide(datePublication)) {
1092
				messages.add("Le format de l'année saisie est incorrect !");
1093
			}
1094
		}
1095
 
1096
		String pages = pagesChp.getValue();
1097
		String valeurPage = "(?:[0-9]+|[IVXLCDM]+|\\?)";
1098
		if (pages != null && ! pages.matches("^(?:"+valeurPage+"|"+valeurPage+"-"+valeurPage+")$")) {
1099
			messages.add("Le format des pages est incorrect !");
1100
		}
1101
 
1102
		if (messages.size() != 0) {
1103
			String[] tableauDeMessages = {};
1104
			tableauDeMessages = messages.toArray(tableauDeMessages);
1105
			MessageBox.alert("Erreurs de saisies", UtilArray.implode(tableauDeMessages, "<br />"), null);
1106
			valide = false;
1107
		}
1108
		return valide;
1109
	}
1110
 
1111
 
1112
	 //-------------------//
1113
	//    Accesseurs     //------------------------------------------------------------
1114
 
1032 jpm 1115
	private String getValeurComboProjets() {
1116
		String valeur = "";
1329 cyprien 1117
		if (projetsCombo.getValeur() != null) {
1118
			Projet projet = new Projet(projetsCombo.getValeur());
1119
			valeur = projet.getId();
1032 jpm 1120
		}
1121
		return valeur;
1122
	}
1123
	private void setValeurComboProjets() {
1513 jpm 1124
		if (mode.equals(Formulaire.MODE_MODIFIER) && publication != null) {
1125
			if (projetsCombo.getCombo().getStore() != null
1126
					&& publication != null
1127
					&& publication.getIdProjet() != null
1128
					&& !UtilString.isEmpty(publication.getIdProjet())) {
1129
				projetsCombo.chargerValeurInitiale(publication.getIdProjet(), "cpr_id_projet");
1032 jpm 1130
			}
1513 jpm 1131
		} else if (mode.equals(Formulaire.MODE_AJOUTER)) {
1132
			projetsCombo.getCombo().setValue(projetsCombo.getStore().findModel("cpr_id_projet", mediateur.getProjetId()));
1133
		} else {
1134
			projetsCombo.getCombo().setValue(null);
1032 jpm 1135
		}
1136
	}
1428 cyprien 1137
 
1138
	 //-------------------//
1139
	//    Rafraichir     //------------------------------------------------------------
1140
 
1141
	public void rafraichir(Object nouvellesDonnees) {
1142
		if (nouvellesDonnees instanceof Publication) {
1143
			publication = (Publication) nouvellesDonnees;
1144
		} else if (nouvellesDonnees instanceof Information) {
1145
			rafraichirInformation((Information) nouvellesDonnees);
1146
		} else {
1147
			GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);
1148
		}
1149
	}
1150
 
1513 jpm 1151
	private void rafraichirInformation(Information info) {
1428 cyprien 1152
 
1153
		String type = info.getType();
1154
		if (type.equals("auteurs_enregistres")) {
1155
			miseAJourAuteursInitialListe();
1156
			initialiserAuteurs();
1157
			repandreRafraichissement();
1158
			controlerFermeture();
1159
		} else if (type.equals("chargement_modifier_ok"))	{
1160
			peuplerFormulaire();
1161
			genererTitreFormulaire();
1162
		}
1163
 
1164
		if (type.equals("personne_ajoutee")) {
1165
			if (info.getDonnee(0) != null) {
1166
				Personne personne = (Personne) info.getDonnee(0);
1167
				PublicationAPersonne pap = new PublicationAPersonne();
1168
				pap.setPersonne(personne);
1169
				if (modeDeCreation != Formulaire.MODE_AJOUTER) pap.setPublicationLiee(publication);
1170
				ajouterDansGrille(pap);
1171
			}
1172
		} else if (type.equals("personne_modifiee")) {
1173
			if (info.getDonnee(0) != null) {
1174
 
1175
				// créer la nouvelle entrée
1176
				Personne personne = (Personne) info.getDonnee(0);
1177
				PublicationAPersonne pap = new PublicationAPersonne();
1178
				pap.setPersonne(personne);
1179
				if (modeDeCreation != Formulaire.MODE_AJOUTER) pap.setPublicationLiee(publication);
1180
 
1181
				// supprimer l'entrée précédente
1513 jpm 1182
				PublicationAPersonne personneDansGrille = new PublicationAPersonne(grilleAuteurs.getStore().findModel("cp_id_personne", personne.getId()), false);
1428 cyprien 1183
				int index = grilleAuteurs.getStore().indexOf(personneDansGrille);
1184
				grilleAuteurs.getStore().remove(personneDansGrille);
1185
 
1186
				// ajouter la nouvelle entrée dans la grille
1187
				ajouterDansGrille(pap, index);
1188
			}
1189
		} else if (info.getType().equals("modif_publication")) {
1190
			InfoLogger.display("Modification d'une publication", info.toString());
1191
			soumettreAuteurs();
1192
		} else if (info.getType().equals("ajout_publication")) {
1193
			if (info.getDonnee(0) != null && info.getDonnee(0) instanceof String && ((String) info.getDonnee(0)).matches("[0-9]+")) {
1194
				String idPublication = (String) info.getDonnee(0);
1195
				this.publicationId = idPublication;
1468 jpm 1196
				this.publication.setId(idPublication);
1428 cyprien 1197
				soumettreAuteurs();
1198
				InfoLogger.display("Ajout d'une publication", "La publication '"+publicationId+"' a bien été ajoutée");
1199
			} else {
1200
				InfoLogger.display("Ajout d'une publication", info.toString());
1201
			}
1513 jpm 1202
		}
1428 cyprien 1203
	}
1204
 
1205
	private void repandreRafraichissement() {
1206
		if (vueExterneARafraichirApresValidation != null) {
1207
			String type = "publication_modifiee";
1208
			if (mode.equals(Formulaire.MODE_AJOUTER)) {
1209
				type = "publication_ajoutee";
1210
			}
1211
			Information info = new Information(type);
1212
			info.setDonnee(0, publication);
1213
			vueExterneARafraichirApresValidation.rafraichir(info);
1214
		}
1215
	}
1216
 
505 jp_milcent 1217
}