Subversion Repositories eFlore/Applications.coel

Rev

Rev 1516 | Rev 1561 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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