Subversion Repositories eFlore/Applications.coel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
877 aurelien 1
package org.tela_botanica.client.vues;
2
 
3
import java.util.ArrayList;
4
import java.util.Iterator;
5
import java.util.List;
6
 
7
import org.tela_botanica.client.Mediateur;
878 aurelien 8
import org.tela_botanica.client.i18n.Constantes;
877 aurelien 9
import org.tela_botanica.client.images.Images;
10
import org.tela_botanica.client.interfaces.Rafraichissable;
878 aurelien 11
import org.tela_botanica.client.modeles.Configuration;
877 aurelien 12
import org.tela_botanica.client.modeles.Information;
13
import org.tela_botanica.client.modeles.MenuApplicationId;
14
import org.tela_botanica.client.modeles.Personne;
15
import org.tela_botanica.client.modeles.PersonneListe;
16
import org.tela_botanica.client.modeles.Projet;
17
import org.tela_botanica.client.modeles.Structure;
18
import org.tela_botanica.client.modeles.StructureListe;
878 aurelien 19
import org.tela_botanica.client.modeles.Valeur;
20
import org.tela_botanica.client.modeles.ValeurListe;
877 aurelien 21
import org.tela_botanica.client.util.Pattern;
22
import org.tela_botanica.client.util.UtilArray;
23
 
878 aurelien 24
import com.extjs.gxt.ui.client.Style.SortDir;
877 aurelien 25
import com.extjs.gxt.ui.client.event.ButtonEvent;
26
import com.extjs.gxt.ui.client.event.SelectionListener;
27
import com.extjs.gxt.ui.client.store.ListStore;
28
import com.extjs.gxt.ui.client.widget.HorizontalPanel;
29
import com.extjs.gxt.ui.client.widget.LayoutContainer;
30
import com.extjs.gxt.ui.client.widget.MessageBox;
31
import com.extjs.gxt.ui.client.widget.button.Button;
32
import com.extjs.gxt.ui.client.widget.form.CheckBox;
33
import com.extjs.gxt.ui.client.widget.form.ComboBox;
886 aurelien 34
import com.extjs.gxt.ui.client.widget.form.Field;
877 aurelien 35
import com.extjs.gxt.ui.client.widget.form.FieldSet;
36
import com.extjs.gxt.ui.client.widget.form.TextArea;
37
import com.extjs.gxt.ui.client.widget.form.TextField;
38
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
39
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
40
import com.extjs.gxt.ui.client.widget.layout.FormData;
41
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
42
import com.google.gwt.core.client.GWT;
878 aurelien 43
import com.google.gwt.user.client.Window;
877 aurelien 44
 
45
 
46
public class ProjetForm extends Formulaire implements Rafraichissable {
47
 
48
	private Projet projet;
878 aurelien 49
 
50
	private String listeValeurIndexationDureeId = "dureesIndexation";
51
	private int listeValeurIndexationDureeInt = 1072;
52
	private String listeValeurIndexationFrequenceId = "frequencesIndexation";
53
	private int listeValeurIndexationFrequenceInt = 1073;
887 aurelien 54
	private String listeLanguesId = "langues";
55
	private int listeLanguesInt = 1071;
878 aurelien 56
 
57
	private ListStore<Valeur> listeIndexationDuree = null;
58
	private ListStore<Valeur> listeIndexationFrequence = null;
887 aurelien 59
	private ListStore<Valeur> listeLangue = null;
878 aurelien 60
 
887 aurelien 61
	private ValeurListe valeurListeIndexationDuree = null;
62
	private ValeurListe valeurListeIndexationFrequence = null;
63
	private ValeurListe valeurListeLangue = null;
64
 
877 aurelien 65
	private FieldSet generalitesFieldset = null;
66
	private TextField<String> nomChp = null;
67
	private TextField<String> abreviationChp = null;
886 aurelien 68
	private TextArea descriptionChp = null;
877 aurelien 69
	private TextArea resumeChp = null;
70
	private TextField<String> urlChp = null;
71
 
72
	private FieldSet complementFieldset = null;
73
	private TextField<String> motsClesChp = null;
74
	private TextField<String> citationChp = null;
75
	private TextField<String> licenceChp = null;
887 aurelien 76
	private ComboBox<Valeur> langueChp = null;
877 aurelien 77
	private CheckBox markPublicChp = null;
78
 
79
	private FieldSet indexationFieldset = null;
80
	private TextField<String> indexationHeureChp = null;
878 aurelien 81
	private ComboBox<Valeur> indexationDureeChp = null;
82
	private ComboBox<Valeur> indexationFrequenceChp = null;
877 aurelien 83
 
84
	private boolean formulaireValideOk = false;
85
	private boolean projetValideOk = false;
86
 
87
	private Rafraichissable vueExterneARafraichirApresValidation = null;
88
 
89
 
90
	public ProjetForm(Mediateur mediateurCourrant, String projetId) {
91
		initialiserProjetForm(mediateurCourrant, projetId);
92
	}
93
 
94
	public ProjetForm(Mediateur mediateurCourrant, String projetId, Rafraichissable vueARafraichirApresValidation) {
95
		vueExterneARafraichirApresValidation = vueARafraichirApresValidation;
96
		initialiserProjetForm(mediateurCourrant, projetId);
97
	}
98
 
878 aurelien 99
	private void initialiserProjetForm(Mediateur mediateurCourant, String projetId) {
877 aurelien 100
		projet = new Projet();
101
		projet.setId(projetId);
102
 
103
		String modeDeCreation = (projet.getId().isEmpty() ? Formulaire.MODE_AJOUTER : Formulaire.MODE_MODIFIER);
878 aurelien 104
		initialiserFormulaire(mediateurCourant, modeDeCreation, MenuApplicationId.PROJET);
877 aurelien 105
 
106
		panneauFormulaire.setLayout(new FlowLayout());
107
		String titre = genererTitreFormulaire();
108
		panneauFormulaire.setHeading(titre);
109
 
110
		creerZoneGeneralites();
111
		panneauFormulaire.add(generalitesFieldset);
112
 
113
		creerZoneComplement();
114
		panneauFormulaire.add(complementFieldset);
115
 
116
		creerZoneIndexation();
117
		panneauFormulaire.add(indexationFieldset);
118
 
886 aurelien 119
		creerTabIndex();
120
 
877 aurelien 121
		if (modeDeCreation.equals(Formulaire.MODE_MODIFIER)) {
878 aurelien 122
			mediateurCourant.selectionnerProjet(this, projetId);
877 aurelien 123
		}
878 aurelien 124
 
125
		mediateurCourant.obtenirListeValeurEtRafraichir(this, listeValeurIndexationDureeId);
126
		mediateurCourant.obtenirListeValeurEtRafraichir(this, listeValeurIndexationFrequenceId);
887 aurelien 127
		mediateurCourant.obtenirListeValeurEtRafraichir(this, listeLanguesId);
877 aurelien 128
	}
129
 
130
	private String genererTitreFormulaire() {
887 aurelien 131
		String titre = "Ajout d'un projet";
877 aurelien 132
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
878 aurelien 133
			 titre = "Modification d'un projet - "+i18nC.id()+": "+projet.getId();
877 aurelien 134
		}
135
		return titre;
136
	}
137
 
138
	private void creerZoneGeneralites() {
139
		FormLayout layout = new FormLayout();
140
		layout.setLabelWidth(100);
141
 
142
		// Fieldset Infos Générales
143
		generalitesFieldset = new FieldSet();
144
		generalitesFieldset.setHeading("Informations générales");
145
		generalitesFieldset.setCollapsible(true);
146
		generalitesFieldset.setLayout(layout);
147
 
148
		nomChp = new TextField<String>();
149
		nomChp.setName("cpu");
150
		nomChp.setFieldLabel("Nom");
151
		generalitesFieldset.add(nomChp, new FormData(450, 0));
152
 
153
		abreviationChp = new TextField<String>();
154
		abreviationChp.setFieldLabel("Abréviation");
155
		generalitesFieldset.add(abreviationChp, new FormData(450, 0));
156
 
886 aurelien 157
		descriptionChp = new TextArea();
877 aurelien 158
		descriptionChp.setFieldLabel("Description");
159
		generalitesFieldset.add(descriptionChp, new FormData(450, 0));
160
 
161
		resumeChp = new TextArea();
162
		resumeChp.setFieldLabel("Résumé");
163
		generalitesFieldset.add(resumeChp, new FormData(450, 0));
164
 
165
		urlChp = new TextField<String>();
166
		urlChp.setFieldLabel("URL du projet");
167
		generalitesFieldset.add(urlChp, new FormData(450, 0));
168
	}
169
 
170
	private void creerZoneComplement() {
171
		FormLayout layout = new FormLayout();
172
		layout.setLabelWidth(100);
173
 
174
		// Fieldset Edition
175
		complementFieldset = new FieldSet();
176
		complementFieldset.setHeading("Informations complémentaires");
177
		complementFieldset.setCollapsible(true);
178
		complementFieldset.setLayout(layout);
179
 
180
		motsClesChp = new TextField<String>();
181
		motsClesChp.setFieldLabel("Mots Clés");
182
 
183
		complementFieldset.add(motsClesChp);
184
 
185
		citationChp = new TextField<String>();
186
		citationChp.setFieldLabel("Citation");
187
 
188
		complementFieldset.add(citationChp);
189
 
190
		licenceChp = new TextField<String>();
191
		licenceChp.setFieldLabel("Licence");
192
 
193
		complementFieldset.add(licenceChp);
194
 
887 aurelien 195
		listeLangue = new ListStore<Valeur>();
196
		langueChp = new ComboBox<Valeur>();
197
		langueChp.setStore(listeLangue);
198
		langueChp.setDisplayField("nom");
199
		langueChp.setEditable(true);
200
		langueChp.setForceSelection(true);
201
		langueChp.setTypeAhead(true);
202
		langueChp.setFieldLabel("Langue");
203
 
204
		complementFieldset.add(langueChp);
205
 
877 aurelien 206
		markPublicChp = new CheckBox();
207
		markPublicChp.setFieldLabel("Public");
208
 
209
		complementFieldset.add(markPublicChp);
210
	}
211
 
212
	private void creerZoneIndexation() {
213
		FormLayout layout = new FormLayout();
214
		layout.setLabelWidth(100);
215
 
216
		// Fieldset Edition
217
		indexationFieldset = new FieldSet();
218
		indexationFieldset.setHeading("Indexation");
219
		indexationFieldset.setCollapsible(true);
220
		indexationFieldset.setLayout(layout);
221
 
222
		indexationHeureChp = new TextField<String>();
878 aurelien 223
		indexationHeureChp.setFieldLabel(i18nC.projetIndexationHeure());
877 aurelien 224
 
225
		indexationFieldset.add(indexationHeureChp, new FormData(80, 0));
226
 
878 aurelien 227
		// liste 1073
228
		listeIndexationFrequence = new ListStore<Valeur>();
229
		indexationFrequenceChp = new ComboBox<Valeur>();
230
		indexationFrequenceChp.setStore(listeIndexationFrequence);
231
		indexationFrequenceChp.setDisplayField("nom");
887 aurelien 232
		indexationFrequenceChp.setEditable(true);
233
		indexationFrequenceChp.setForceSelection(true);
234
		indexationFrequenceChp.setTypeAhead(true);
878 aurelien 235
		indexationFrequenceChp.setFieldLabel(i18nC.projetIndexationFrequence());
236
 
237
		indexationFieldset.add(indexationFrequenceChp, new FormData(120, 0));
238
 
877 aurelien 239
		// liste 1072
878 aurelien 240
		listeIndexationDuree = new ListStore<Valeur>();
241
		indexationDureeChp = new ComboBox<Valeur>();
242
		indexationDureeChp.setStore(listeIndexationDuree);
243
		indexationDureeChp.setDisplayField("nom");
887 aurelien 244
		indexationDureeChp.setEditable(true);
245
		indexationDureeChp.setForceSelection(true);
246
		indexationDureeChp.setTypeAhead(true);
878 aurelien 247
		indexationDureeChp.setFieldLabel(i18nC.projetIndexationDuree());
877 aurelien 248
 
249
		indexationFieldset.add(indexationDureeChp, new FormData(80, 0));
250
 
251
	}
886 aurelien 252
 
253
	private void creerTabIndex() {
254
 
887 aurelien 255
		nomChp.setTabIndex(1);
256
		abreviationChp.setTabIndex(2);
257
		descriptionChp.setTabIndex(3);
258
		resumeChp.setTabIndex(4);
259
		urlChp.setTabIndex(5);
886 aurelien 260
 
261
		motsClesChp.setTabIndex(6);
262
		citationChp.setTabIndex(7);
263
		licenceChp.setTabIndex(8);
887 aurelien 264
		langueChp.setTabIndex(9);
265
		markPublicChp.setTabIndex(10);
886 aurelien 266
 
887 aurelien 267
		indexationHeureChp.setTabIndex(11);
268
		indexationFrequenceChp.setTabIndex(12);
269
		indexationDureeChp.setTabIndex(13);
886 aurelien 270
 
271
		nomChp.focus();
272
	}
877 aurelien 273
 
274
	public void rafraichir(Object nouvellesDonnees) {
275
		if (nouvellesDonnees instanceof Projet) {
276
			// Si on a reçu les details d'une projet
277
			rafraichirProjet((Projet) nouvellesDonnees);
878 aurelien 278
			GWT.log("Un projet est arrivé : "+((Projet) nouvellesDonnees).getNom(), null);
877 aurelien 279
		}
280
 
878 aurelien 281
		if(nouvellesDonnees instanceof ValeurListe) {
282
			ValeurListe nValeurListe = (ValeurListe)nouvellesDonnees;
283
 
284
			if(nValeurListe.getId() == listeValeurIndexationDureeInt) {
887 aurelien 285
 
286
				valeurListeIndexationDuree = nValeurListe;
287
 
878 aurelien 288
				for(Iterator<String> it  = nValeurListe.keySet().iterator(); it.hasNext();) {
289
					listeIndexationDuree.add(nValeurListe.get(it.next()));
290
					listeIndexationDuree.sort("id_valeur", SortDir.ASC);
291
				}
887 aurelien 292
 
293
				if(mode.equals(MODE_MODIFIER)) {
294
					indexationDureeChp.setRawValue(valeurListeIndexationDuree.get(projet.getIndexationDuree()).getNom());
295
				}
296
 
297
				indexationDureeChp.expand();
878 aurelien 298
 
299
			}
300
 
301
			if(nValeurListe.getId() == listeValeurIndexationFrequenceInt) {
887 aurelien 302
 
303
				valeurListeIndexationFrequence = nValeurListe;
304
 
878 aurelien 305
				for(Iterator<String> it  = nValeurListe.keySet().iterator(); it.hasNext();) {
306
					listeIndexationFrequence.add(nValeurListe.get(it.next()));
307
					listeIndexationFrequence.sort("id_valeur", SortDir.ASC);
308
				}
887 aurelien 309
 
310
				if(mode.equals(MODE_MODIFIER)) {
311
					indexationFrequenceChp.setRawValue(valeurListeIndexationFrequence.get(projet.getIndexationFreq()).getNom());
312
				}
313
 
314
				indexationFrequenceChp.expand();
878 aurelien 315
			}
887 aurelien 316
 
317
			if(nValeurListe.getId() == listeLanguesInt) {
318
 
319
				valeurListeLangue = nValeurListe;
320
 
321
				for(Iterator<String> it  = nValeurListe.keySet().iterator(); it.hasNext();) {
322
					listeLangue.add(nValeurListe.get(it.next()));
323
					listeLangue.sort("id_valeur", SortDir.ASC);
324
				}
325
 
326
				if(mode.equals(MODE_MODIFIER)) {
327
					langueChp.setRawValue(valeurListeLangue.get(projet.getLangue()).getNom());
328
					GWT.log(valeurListeLangue.get(projet.getLangue()).getNom(),null);
329
				}
330
			}
331
 
332
			GWT.log("une liste de valeurs est arrivée "+nValeurListe.getId(), null);
878 aurelien 333
		}
334
 
877 aurelien 335
		if (etreValide()) {
336
			initialiserValidation();
337
			repandreRafraichissement();
338
			controlerFermetureApresRafraichissement();
339
		}
340
	}
341
 
342
	private void rafraichirProjet(Projet proj) {
343
		projet = proj;
344
		peuplerFormulaire();
345
	}
346
 
347
	private Boolean etreValide() {
348
		Boolean valide = false;
349
		GWT.log("formulaire"+formulaireValideOk+" - Projet :"+projetValideOk, null);
350
		if (formulaireValideOk && projetValideOk) {
351
			valide = true;
352
		}
353
		return valide;
354
	}
355
 
356
	private void initialiserValidation() {
357
		formulaireValideOk = false;
358
		projetValideOk = false;
359
	}
360
 
361
	private void repandreRafraichissement() {
362
		if (vueExterneARafraichirApresValidation != null) {
878 aurelien 363
			String type = "projet_modifie";
877 aurelien 364
			if (mode.equals(Formulaire.MODE_AJOUTER)) {
878 aurelien 365
				type = "projet_ajoute";
877 aurelien 366
			}
367
			Information info = new Information(type);
368
			info.setDonnee(0, projet);
369
			vueExterneARafraichirApresValidation.rafraichir(info);
370
		}
371
	}
372
 
373
	public boolean soumettreFormulaire() {
374
		formulaireValideOk = verifierFormulaire();
375
		GWT.log("Form?"+formulaireValideOk, null);
376
		if (formulaireValideOk) {
377
			Projet projetCollecte = collecterProjet();
378
			if (projetCollecte != null) {
379
				GWT.log("Info collectée ? ok", null);
380
				if (mode.equals(Formulaire.MODE_AJOUTER)) {
381
					mediateur.ajouterProjet(this, projetCollecte);
382
				} else if (mode.equals(Formulaire.MODE_MODIFIER)) {
383
					mediateur.modifierProjet(this, projetCollecte);
384
				}
385
			}
386
		}
387
		return formulaireValideOk;
388
	}
389
 
390
	protected boolean verifierFormulaire() {
391
		boolean valide = true;
392
		ArrayList<String> messages = new ArrayList<String>();
393
 
394
		String titre = nomChp.getValue();
395
		if (titre == null || titre.equals("")) {
396
			messages.add("Veuillez saisir le nom du projet !");
397
		}
398
 
886 aurelien 399
		String abr = abreviationChp.getValue();
400
		if (abr == null || abr.equals("")) {
401
			messages.add("Veuillez saisir l'abréviation du projet !");
402
		}
403
 
404
		String desc = descriptionChp.getValue();
405
		if (desc == null || desc.equals("")) {
406
			messages.add("Veuillez saisir la description du projet !");
407
		}
408
 
409
		String resume = resumeChp.getValue();
410
		if (resume == null || resume.equals("")) {
411
			messages.add("Veuillez saisir le résumé du projet !");
412
		}
413
 
877 aurelien 414
		String uri = urlChp.getValue();
886 aurelien 415
		if (uri != null && ! uri.trim().isEmpty() && ! uri.matches(Pattern.url)) {
877 aurelien 416
			messages.add("L'URL saisie n'est pas valide !");
417
		}
418
 
886 aurelien 419
		String heure = indexationHeureChp.getValue();
887 aurelien 420
		if (heure != null && ! heure.isEmpty() && !heure.matches(Pattern.heureMinute)) {
421
			messages.add("L'heureMinute d'indexation saisie n'est pas valide !");
422
		} else {
423
			if(heure.matches(Pattern.heureMinute)) {
424
				heure += ":00";
425
			}
886 aurelien 426
		}
427
 
877 aurelien 428
		if (messages.size() != 0) {
429
			String[] tableauDeMessages = {};
430
			tableauDeMessages = messages.toArray(tableauDeMessages);
431
			MessageBox.alert("Erreurs de saisies", UtilArray.implode(tableauDeMessages, "<br />"), null);
432
			valide = false;
433
		}
434
		return valide;
435
	}
436
 
437
	private void peuplerFormulaire() {
438
 
878 aurelien 439
		nomChp.setValue(projet.getNom());
440
		abreviationChp.setValue(projet.getAbreviation());
441
		descriptionChp.setValue(projet.getDescription());
442
		resumeChp.setValue(projet.getResume());
443
		urlChp.setValue(projet.getUrl());
444
 
445
		motsClesChp.setValue(projet.getMotsCles());
446
		citationChp.setValue(projet.getCitation());
447
		licenceChp.setValue(projet.getLicence());
887 aurelien 448
 
449
		if(projet.getMarkPublic().equals("1")) {
450
			markPublicChp.setValue(true);
451
		} else {
452
			markPublicChp.setValue(false);
453
		}
878 aurelien 454
 
887 aurelien 455
		String[] heureTab = projet.getIndexationHeure().split(":");
456
		String heure = heureTab[0]+":"+heureTab[1];
457
		if(heure.matches(Pattern.heureMinute)) {
458
			indexationHeureChp.setValue(heure);
459
		}
878 aurelien 460
 
461
		doLayout(true);
462
 
877 aurelien 463
	}
464
 
465
	private Projet collecterProjet() {
887 aurelien 466
		Projet projetARetourner = new Projet();
467
		Projet projetCollecte = (Projet) projet.cloner(new Projet());
877 aurelien 468
 
887 aurelien 469
		projetARetourner.setNom(nomChp.getValue());
470
		projetARetourner.setAbreviation(abreviationChp.getValue());
471
		projetARetourner.setDescription(descriptionChp.getValue());
472
		projetARetourner.setResume(resumeChp.getValue());
473
		projetARetourner.setUrl(urlChp.getValue());
877 aurelien 474
 
887 aurelien 475
		projetARetourner.setMotsCles(motsClesChp.getValue());
476
		projetARetourner.setCitation(citationChp.getValue());
477
		projetARetourner.setLicence(licenceChp.getValue());
478
 
479
		if(markPublicChp.getValue()) {
480
			projetCollecte.setMarkPublic("1");
481
		} else {
482
			projetCollecte.setMarkPublic("0");
877 aurelien 483
		}
484
 
887 aurelien 485
		projetARetourner.setIndexationHeure(indexationHeureChp.getValue());
486
		projetARetourner.setIndexationDuree(indexationDureeChp.getValue().getId());
487
		projetARetourner.setIndexationFreq(indexationFrequenceChp.getValue().getId());
488
 
489
		if (!projetCollecte.comparer(projet)) {
490
			projetARetourner = projet = projetCollecte;
491
		}
492
 
493
		//GWT.log(projetARetourner.toString()+" "+projetARetourner., null)
494
 
877 aurelien 495
		return projetARetourner;
496
	}
497
 
498
	protected void reinitialiserFormulaire() {
499
		if (mode.equals(Formulaire.MODE_MODIFIER)) {
500
			mediateur.afficherFormProjet(projet.getId());
501
		} else {
502
			mediateur.afficherFormProjet(null);
503
		}
504
	}
505
 
506
	@Override
507
	protected SelectionListener<ButtonEvent> creerEcouteurValidation() {
508
		SelectionListener<ButtonEvent> ecouteur = new SelectionListener<ButtonEvent>() {
509
			@Override
510
			public void componentSelected(ButtonEvent ce) {
511
				String code = ((Button) ce.getComponent()).getData("code");
512
				if (code.equals(FormulaireBarreValidation.CODE_BOUTON_VALIDER)) {
513
					soumettreFormulaire();
514
					clicBoutonvalidation = true;
515
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_APPLIQUER)) {
516
					soumettreFormulaire();
517
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_ANNULER)) {
518
					mediateur.clicMenu(menuIdCourant);
519
				} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_REINITIALISER)) {
520
					reinitialiserFormulaire();
521
				}
522
			}
523
		};
524
 
525
		return ecouteur;
526
	}
527
}