Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
195 david 1
package org.tela_botanica.client.vues.observation;
12 david 2
 
201 david 3
// TODO Detecter redim et supprimer ajuster
12 david 4
 
221 aurelien 5
import java.util.Date;
1549 aurelien 6
import java.util.HashMap;
13 david 7
import java.util.Iterator;
1967 aurelien 8
import java.util.List;
1549 aurelien 9
import java.util.Map;
13 david 10
 
318 aurelien 11
import org.tela_botanica.client.CarnetEnLigneMediateur;
2634 aurelien 12
import org.tela_botanica.client.i18n.Msg;
13 david 13
import org.tela_botanica.client.interfaces.Rafraichissable;
2695 aurelien 14
import org.tela_botanica.client.modeles.dao.ImageInformationRepartitionAsynchroneDAO;
2392 aurelien 15
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
2609 aurelien 16
import org.tela_botanica.client.modeles.dao.ListeReferentielLocaliteAsynchroneDAO;
17
import org.tela_botanica.client.modeles.dao.ListeReferentielNomAsynchroneDAO;
2602 aurelien 18
import org.tela_botanica.client.modeles.dao.ListeReferentielPersoAsynchroneDAO;
1572 aurelien 19
import org.tela_botanica.client.modeles.objets.ChampEtendu;
989 aurelien 20
import org.tela_botanica.client.modeles.objets.Configuration;
21
import org.tela_botanica.client.modeles.objets.EntiteGeographiqueObservation;
22
import org.tela_botanica.client.modeles.objets.ListeObservation;
23
import org.tela_botanica.client.modeles.objets.Observation;
1489 aurelien 24
import org.tela_botanica.client.modeles.objets.Ontologies;
2568 aurelien 25
import org.tela_botanica.client.modeles.objets.ReferentielLocalite;
989 aurelien 26
import org.tela_botanica.client.modeles.objets.ReferentielNom;
27
import org.tela_botanica.client.modeles.objets.ListeReferentielPerso.TypesReferentiels;
12 david 28
import org.tela_botanica.client.observation.ObservationMediateur;
1940 aurelien 29
import org.tela_botanica.client.util.ChampSaisieEtendu;
30
import org.tela_botanica.client.util.FormulaireSaisieChampEtendu;
708 aurelien 31
import org.tela_botanica.client.util.Util;
2602 aurelien 32
import org.tela_botanica.client.util.autocompletion.AutoCompletionComboBox;
132 aurelien 33
 
2695 aurelien 34
import com.google.gwt.core.client.Callback;
1597 aurelien 35
import com.google.gwt.event.dom.client.ClickEvent;
36
import com.google.gwt.event.dom.client.ClickHandler;
2602 aurelien 37
import com.google.gwt.http.client.Response;
268 aurelien 38
import com.google.gwt.user.client.Timer;
216 aurelien 39
import com.google.gwt.user.client.Window;
248 aurelien 40
import com.google.gwt.user.client.ui.HTML;
1940 aurelien 41
import com.google.gwt.user.client.ui.PopupPanel;
13 david 42
import com.gwtext.client.core.EventCallback;
43
import com.gwtext.client.core.EventObject;
218 david 44
import com.gwtext.client.core.Ext;
248 aurelien 45
import com.gwtext.client.core.ExtElement;
13 david 46
import com.gwtext.client.core.ListenerConfig;
12 david 47
import com.gwtext.client.core.Position;
132 aurelien 48
import com.gwtext.client.widgets.BoxComponent;
12 david 49
import com.gwtext.client.widgets.Button;
132 aurelien 50
import com.gwtext.client.widgets.Container;
221 aurelien 51
import com.gwtext.client.widgets.DatePicker;
12 david 52
import com.gwtext.client.widgets.Panel;
248 aurelien 53
import com.gwtext.client.widgets.ToolTip;
20 david 54
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
132 aurelien 55
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
221 aurelien 56
import com.gwtext.client.widgets.event.DatePickerListenerAdapter;
201 david 57
import com.gwtext.client.widgets.event.PanelListenerAdapter;
13 david 58
import com.gwtext.client.widgets.form.ComboBox;
12 david 59
import com.gwtext.client.widgets.form.DateField;
216 aurelien 60
import com.gwtext.client.widgets.form.Field;
12 david 61
import com.gwtext.client.widgets.form.FormPanel;
268 aurelien 62
import com.gwtext.client.widgets.form.Label;
248 aurelien 63
import com.gwtext.client.widgets.form.MultiFieldPanel;
128 aurelien 64
import com.gwtext.client.widgets.form.TextArea;
12 david 65
import com.gwtext.client.widgets.form.TextField;
13 david 66
import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;
248 aurelien 67
import com.gwtext.client.widgets.form.event.TextFieldListenerAdapter;
201 david 68
import com.gwtext.client.widgets.layout.AnchorLayoutData;
12 david 69
import com.gwtext.client.widgets.layout.ColumnLayout;
70
import com.gwtext.client.widgets.layout.ColumnLayoutData;
71
import com.gwtext.client.widgets.layout.FormLayout;
230 david 72
import com.gwtext.client.widgets.layout.RowLayout;
13 david 73
import com.gwtext.client.data.Record;
12 david 74
 
75
/**
76
 * Panneau contenant les infos, les métadonnées et l'arbre des mots clés, il implémente l'interface rafraichissable
77
 * @author aurelien
78
 *
79
 */
13 david 80
public class FormulaireSaisieObservationVue extends Panel implements Rafraichissable  {
12 david 81
 
82
 
83
	/**
84
	 * Le médiateur associé à la vue
85
	 */
86
	private ObservationMediateur	observationMediateur		= null;
1858 raphael 87
 
205 aurelien 88
	FormPanel panneauFormulaire = null;
20 david 89
 
13 david 90
	private DateField date = null;
2602 aurelien 91
	private AutoCompletionComboBox lieudit = null;
92
	private AutoCompletionComboBox station = null;
93
	private AutoCompletionComboBox milieu = null;
12 david 94
	private TextField comment = null;
2609 aurelien 95
	private AutoCompletionComboBox  localite = null;
2734 mathias 96
	private Button effacerLocalite = null;
2558 aurelien 97
 
2568 aurelien 98
	private String codeLocalite = null;
99
	private String pays = null;
2558 aurelien 100
 
2609 aurelien 101
	private AutoCompletionComboBox  espece = null;
102
	private Map<String, ReferentielNom> referentielNom = null;
103
	private Map<String, ReferentielLocalite> referentielLocalite = null;
104
 
39 david 105
	private String numeroNom = null;
74 david 106
	private String numeroOrdre = null;
1542 aurelien 107
	private String referentielTaxo = null;
264 aurelien 108
	private String referentielGeo = null;
2695 aurelien 109
 
110
	private Map<String, String> avertissementPresence = new HashMap<String, String>();
111
	private boolean enRequeteChrologie = false;
20 david 112
 
118 david 113
	// Pour remise a zero partielle lors d'une validation
1858 raphael 114
 
2609 aurelien 115
	private enum Champs {
2568 aurelien 116
	    DATE, LIEUDIT, STATION, MILIEU, COMMENT, LOCALITE, ESPECE, TOUT, LATITUDE, LONGITUDE, ALTITUDE, ABONDANCE, CERTITUDE, REFERENTIELTAXO, PHENOLOGIE;
1858 raphael 117
 
1292 aurelien 118
	    @Override
119
		public String toString() {
1858 raphael 120
 
216 aurelien 121
	    	switch(this) {
122
	    	case DATE:
123
	    		return "date";
1858 raphael 124
 
2568 aurelien 125
	    	case LOCALITE:
126
	    		return "localite";
1858 raphael 127
 
216 aurelien 128
    		case LIEUDIT:
129
    			return "lieu dit";
1858 raphael 130
 
216 aurelien 131
    		case STATION:
132
    			return "station";
1858 raphael 133
 
216 aurelien 134
    		case MILIEU:
135
    			return "milieu";
1858 raphael 136
 
216 aurelien 137
    		case COMMENT:
2644 aurelien 138
    			return "notes";
1858 raphael 139
 
216 aurelien 140
	    	case ESPECE:
141
	    		return "espèce";
1858 raphael 142
 
264 aurelien 143
	    	case LATITUDE:
144
	    		return "latitude";
1858 raphael 145
 
264 aurelien 146
	    	case LONGITUDE:
147
	    		return "longitude";
1858 raphael 148
 
1572 aurelien 149
	    	case ALTITUDE:
150
	    		return "altitude";
1858 raphael 151
 
1488 aurelien 152
	    	case ABONDANCE:
153
	    		return "abondance";
1858 raphael 154
 
1488 aurelien 155
	    	case CERTITUDE:
1489 aurelien 156
	    		return "identification";
1858 raphael 157
 
1542 aurelien 158
	    	case REFERENTIELTAXO:
159
	    		return "referentiel";
1858 raphael 160
 
1542 aurelien 161
	    	case PHENOLOGIE:
162
	    		return "phenologie";
1858 raphael 163
 
216 aurelien 164
	    	case TOUT:
2644 aurelien 165
	    		return "date, localite, lieu dit, station, milieu, espèce, notes, latitude, longitude, altitude, abondance, identification, referentiel, phenologie";
216 aurelien 166
	    	}
167
			return TOUT.toString();
168
	    }
118 david 169
	};
1858 raphael 170
 
110 aurelien 171
	private String formatDate = null ;
2634 aurelien 172
	private Button boutonOK = new Button(Msg.get("creer"));
173
	private Button boutonModifier = new Button(Msg.get("modifier"));
174
	private Button boutonSupprimer = new Button(Msg.get("supprimer"));
175
	private Button boutonReinitialiser = new Button(Msg.get("reinitialiser"));
20 david 176
 
2568 aurelien 177
	private boolean selectionlocalite=false;
20 david 178
	private boolean selectionEspece=false;
1488 aurelien 179
	private boolean selectionAbondance = false;
180
	private boolean selectionCertitude = false;
1542 aurelien 181
	private boolean selectionPhenologie = false;
1858 raphael 182
 
2634 aurelien 183
	private final String VALEURS_MULTIPLES = "("+Msg.get("valeurs-multiples")+")";
2644 aurelien 184
	private final String modeleMessageModif = "localite:lieu-dit:station:milieu:latitude:longitude:altitude:date:espece:notes:abondance:identification:referentiel:phenologie";
2568 aurelien 185
	private boolean localiteModifiee = false;
221 aurelien 186
	private boolean lieuDitModifie = false;
187
	private boolean stationModifiee = false;
216 aurelien 188
	private boolean milieuModifie = false;
189
	private boolean dateModifiee = false;
190
	private boolean especeModifiee = false;
191
	private boolean commModifie = false;
1488 aurelien 192
	private boolean abondanceModifiee = false;
193
	private boolean certitudeModifiee = false;
1542 aurelien 194
	private boolean referentielTaxoModifie = false;
195
	private boolean phenologieModifiee = false;;
1858 raphael 196
 
20 david 197
	private final int KEY_ALT = 18;
198
	private final int KEY_BACKSPACE = 8;
199
	private final int KEY_CTRL = 17;
200
	private final int KEY_DELETE = 46;
201
	private final int KEY_DOWN = 40;
202
	private final int KEY_END = 35;
203
	private final int KEY_ENTER = 13;
204
	private final int KEY_ESCAPE = 27;
205
	private final int KEY_HOME = 36;
206
	private final int KEY_LEFT = 37;
207
	private final int KEY_PAGEDOWN = 34;
208
	private final int KEY_PAGEUP = 33;
209
	private final int KEY_RIGHT = 39;
210
	private final int KEY_SHIFT = 16;
211
	private final int KEY_TAB = 9;
212
	private final int KEY_UP = 38;
1858 raphael 213
 
71 jpm 214
	/**
12 david 215
	 * Booleen d'instanciation
216
	 */
217
	boolean estInstancie = false ;
205 aurelien 218
 
219
	private Panel panneauIntermediaire;
220
 
221
	private Panel panneauPremierColonne;
222
 
223
	private Panel panneauSecondeColonne;
216 aurelien 224
 
248 aurelien 225
	private TextField longitude;
226
 
227
	private TextField latitude;
1858 raphael 228
 
1572 aurelien 229
	private TextField altitude;
1858 raphael 230
 
2568 aurelien 231
	private MultiFieldPanel htmllocalitePanel = null;
248 aurelien 232
 
233
	private MultiFieldPanel coordPanel;
234
 
235
	private TextField coordonnees;
1858 raphael 236
 
2568 aurelien 237
	private Label lienSelectionlocalite = null;
248 aurelien 238
 
681 aurelien 239
	private HTML afficherFormulaireLatLon;
248 aurelien 240
 
241
	private HTML basculerverscarto;
1858 raphael 242
 
248 aurelien 243
	private boolean longlatAjoutee;
264 aurelien 244
 
245
	private boolean latModifiee;
246
 
247
	private boolean longModifiee;
1858 raphael 248
 
1572 aurelien 249
	private boolean altModifiee;
268 aurelien 250
 
2568 aurelien 251
	protected boolean recherchelocaliteEnCours = false;
268 aurelien 252
 
253
	private Timer tCoord;
1858 raphael 254
 
255
	private ComboBox selecteurAbondance = null;
256
 
257
	private ComboBox selecteurCertitude = null;
258
 
1542 aurelien 259
	private ComboBox selecteurReferentielTaxo = null;
1858 raphael 260
 
1542 aurelien 261
	private ComboBox selecteurStadePheno = null;
1858 raphael 262
 
1641 aurelien 263
	private boolean selectionMultiple = false;
1858 raphael 264
 
1597 aurelien 265
	private HTML lienAfficherChampsEtendus = null;
1940 aurelien 266
	private HTML lienAjouterChampsEtendus = null;
1858 raphael 267
 
1810 aurelien 268
	Panel conteneurChampEtenduGauche = null;
269
	Panel conteneurChampEtenduDroite = null;
1858 raphael 270
 
1597 aurelien 271
	private boolean afficherChampsEtendus = false;
1940 aurelien 272
	private boolean afficherLienAjoutChampsEtendus = false;
1597 aurelien 273
	private boolean premierAffichage = true;
1858 raphael 274
 
1940 aurelien 275
	private PopupPanel popUpAjoutChampEtendu = new PopupPanel();
276
 
277
	private Map<String, ChampSaisieEtendu> listeChampsEtendus;
1858 raphael 278
 
12 david 279
	/**
280
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
281
	 */
71 jpm 282
	@SuppressWarnings("unused")
12 david 283
	private FormulaireSaisieObservationVue()
284
	{
285
		super() ;
286
	}
1858 raphael 287
 
12 david 288
	/**
289
	 * Constructeur avec argument
290
	 * @param im
291
	 */
292
	public FormulaireSaisieObservationVue(ObservationMediateur obs)
1858 raphael 293
	{
2634 aurelien 294
		super(Msg.get("saisie"));
12 david 295
		// on associe le médiateur
296
		observationMediateur = obs ;
1858 raphael 297
 
1542 aurelien 298
		referentielTaxo = obs.getRefTaxSelectionne().getCode();
1858 raphael 299
 
205 aurelien 300
		panneauFormulaire = new FormPanel(Position.RIGHT);
12 david 301
		panneauFormulaire.setBorder(false);
1858 raphael 302
 
12 david 303
		// Panneau intermediaire qui contient deux colonnes de formulaire
1858 raphael 304
		panneauIntermediaire = new Panel();
305
 
230 david 306
		if (Window.getClientWidth()> Window.getClientHeight()) {
1858 raphael 307
			panneauIntermediaire.setLayout(new ColumnLayout());
230 david 308
		}
309
		else {
1858 raphael 310
			panneauIntermediaire.setLayout(new RowLayout());
230 david 311
		}
1858 raphael 312
 
12 david 313
		panneauIntermediaire.setBorder(false);
218 david 314
 
282 aurelien 315
		//création du panneau formulaire de gauche auquels on ajoute les champs
1858 raphael 316
		panneauPremierColonne = new Panel();
317
		panneauPremierColonne.setLayout(new FormLayout());
12 david 318
		panneauPremierColonne.setBorder(false);
319
 
282 aurelien 320
		//création du panneau formulaire de droite
1858 raphael 321
	    panneauSecondeColonne = new Panel();
322
		panneauSecondeColonne.setLayout(new FormLayout());
12 david 323
		panneauSecondeColonne.setBorder(false);
1858 raphael 324
 
42 jpm 325
		this.setPaddings(5) ;
1858 raphael 326
 
195 david 327
		// Accesskey pour debugging
2634 aurelien 328
		localite = new AutoCompletionComboBox(Msg.get("localite"), ListeReferentielLocaliteAsynchroneDAO.getUrlReferentielLocalites()) {
2609 aurelien 329
			@Override
330
			protected Map<String, String> parserResultatRequete(Response response) {
331
				referentielLocalite = Util.parserRetourReferentielLocaliteIndexeParNom(response);
332
				return Util.convertirListeReferentielLocaliteVersMap(referentielLocalite);
333
			}
334
 
335
			@Override
336
			public void onSelectionValeur() {
337
				localiteModifiee = true;
338
				surSelectionLocalite();
2695 aurelien 339
				verifierPresenceTaxonSaisi();
2609 aurelien 340
			}
341
 
342
			@Override
343
			protected void onModificationValeur() {
2734 mathias 344
				localiteModifiee = true;
2695 aurelien 345
				verifierPresenceTaxonSaisi();
2609 aurelien 346
			}
1858 raphael 347
 
2609 aurelien 348
			@Override
349
			public void onValidationSaisie() {
350
				validerSaisie(Champs.LOCALITE);
2637 aurelien 351
			}
2609 aurelien 352
		};
1858 raphael 353
 
2734 mathias 354
		// Bouton pour supprimer totalement la localisation d'une obs (zone géo + coords)
355
		effacerLocalite = new Button("X", new ButtonListenerAdapter() {
356
			public void onClick(Button button, EventObject e) {
357
				localite.setText("");
358
				localite.setValue("");
359
				localiteModifiee = true;
360
				latitude.setValue("");
361
				latModifiee = true;
362
				longitude.setValue("");
363
				longModifiee = true;
364
				altitude.setValue("");
365
				altModifiee = true;
366
			}
367
		});
368
		effacerLocalite.setTooltip("Supprimer la localisation de l'observation (localité, coordonnées, altitude)");
2609 aurelien 369
 
2637 aurelien 370
		//création du lien "Accès carto" dans le formulaire;
371
		basculerverscarto = new HTML(" <a id=\"lien_carto\" title=\""+Msg.get("aide-lien-localiser")+"\" href=\"#\" tabindex=\"2\">"+Msg.get("localiser-zone")+"</a>");
268 aurelien 372
		basculerverscarto.addStyleName("lien_actif");
1858 raphael 373
 
268 aurelien 374
		//création info bulle sur le lien "accès carto"
1858 raphael 375
		ToolTip tip2 = new ToolTip();
2637 aurelien 376
		tip2.setHtml(Msg.get("aide-lien-localiser"));
268 aurelien 377
		tip2.applyTo(basculerverscarto.getElement());
1858 raphael 378
 
268 aurelien 379
		//Sur une meme ligne, ajout de plusieurs champs
2568 aurelien 380
		htmllocalitePanel = new MultiFieldPanel();
1858 raphael 381
 
2734 mathias 382
		//int largeurlocalite = Window.getClientWidth()/5;
383
		htmllocalitePanel.addToRow(localite, 280);
384
		htmllocalitePanel.addToRow(effacerLocalite, 150);
385
		htmllocalitePanel.addToRow(basculerverscarto, 130);
276 aurelien 386
 
2568 aurelien 387
		htmllocalitePanel.setBorder(false);
388
		htmllocalitePanel.setId("x-localite-panel");
13 david 389
 
2568 aurelien 390
		panneauPremierColonne.add(htmllocalitePanel);
268 aurelien 391
 
2634 aurelien 392
	    station = new AutoCompletionComboBox(Msg.get("station"), ListeReferentielPersoAsynchroneDAO.getUrlReferentielPerso(TypesReferentiels.REFERENTIEL_STATION)) {
1292 aurelien 393
			@Override
2602 aurelien 394
			protected Map<String, String> parserResultatRequete(Response response) {
395
				return Util.parserRetourReferentielPerso(response);
396
			}
397
 
398
			@Override
399
			public void onSelectionValeur() {
728 aurelien 400
				stationModifiee = true;
401
			}
2602 aurelien 402
 
403
			@Override
404
			protected void onModificationValeur() {
405
				stationModifiee = true;
406
			}
728 aurelien 407
 
1292 aurelien 408
			@Override
728 aurelien 409
			public void onValidationSaisie() {
410
				validerSaisie(Champs.STATION);
2609 aurelien 411
			}
412
 
413
			@Override
414
			protected String preTraiterUrlRequete(String urlRequete, String valeur) {
415
				return ListeReferentielPersoAsynchroneDAO.formaterUrlRequeteAutoCompletionPerso(urlRequete, valeur);
1858 raphael 416
			}
2602 aurelien 417
		};
1858 raphael 418
	    panneauPremierColonne.add(station, new AnchorLayoutData("95%"));
419
 
2634 aurelien 420
		latitude = new TextField(Msg.get("lat"), "lat");
282 aurelien 421
		latitude.setGrowMax(70);
264 aurelien 422
		latitude.setAllowBlank(true);
1858 raphael 423
 
2634 aurelien 424
	    longitude = new TextField(Msg.get("lon"), "lon");
282 aurelien 425
	    longitude.setGrowMax(70);
248 aurelien 426
		longitude.setAllowBlank(true);
1858 raphael 427
 
2634 aurelien 428
		altitude = new TextField(Msg.get("alt"), "alt");
1572 aurelien 429
		altitude.setGrowMax(70);
430
		altitude.setAllowBlank(true);
1858 raphael 431
 
2568 aurelien 432
		lienSelectionlocalite = new Label("");
1858 raphael 433
 
434
 
2568 aurelien 435
		lienSelectionlocalite.setId("conteneur_selection_localite");
436
		lienSelectionlocalite.setStyleName("conteneur_selection_localite");
437
		lienSelectionlocalite.addStyleName("lien_actif");
1858 raphael 438
 
783 aurelien 439
		// Panneau de type plusieurs champs de formulaire sur une meme ligne, où seront renseignés Lat/Lon
1858 raphael 440
		coordPanel = new MultiFieldPanel();
282 aurelien 441
		coordPanel.setPaddings(0, 0, 0, 10);
248 aurelien 442
		coordPanel.setVisible(false);
1858 raphael 443
 
276 aurelien 444
		final double largeur ;
282 aurelien 445
		largeur = 120;
1858 raphael 446
 
447
		coordPanel.addToRow(latitude, new ColumnLayoutData(largeur));
448
		coordPanel.addToRow(longitude, new ColumnLayoutData(largeur));
2568 aurelien 449
		coordPanel.addToRow(lienSelectionlocalite, new ColumnLayoutData(largeur));
450
		lienSelectionlocalite.addClass("lien_decale");
248 aurelien 451
		coordPanel.setBorder(false);
1858 raphael 452
 
1572 aurelien 453
		coordPanel.addToRow(altitude, new ColumnLayoutData(largeur));
1858 raphael 454
 
455
		  //création du champs coordonnées
264 aurelien 456
		referentielGeo = Configuration.getReferentielGeo();
1858 raphael 457
 
2634 aurelien 458
		coordonnees = new TextField(Msg.get("coordonnees"), "", 0);
248 aurelien 459
		coordonnees.setMaxLength(0);
460
		coordonnees.setReadOnly(true);
461
		coordonnees.setCls("fieldname");
1858 raphael 462
 
276 aurelien 463
		//création du lien "saisie X/Y" dans le formulaire
681 aurelien 464
		afficherFormulaireLatLon = new HTML("<span style=\"padding-left:30px;\" class=\"conteneur_lien_afficher_lat_lon\">" +
2637 aurelien 465
				"<a title=\""+Msg.get("indication-formulaire-lat-lon")+"\" class=\"lien_actif\" id=\"lien_coord\" href=\"#\" tabindex=\"6\">"+Msg.get("saisie-lat-lon")+" ("+referentielGeo+")</a>" +
681 aurelien 466
				"<span><span style=\"padding-left:20px\" class=\"conteneur_lien_localiser_lat_lon\">"+
2637 aurelien 467
				"<a title=\""+Msg.get("indication-formulaire-localiser")+"\" class=\"lien_actif\" id=\"lien_carto_coord\" href=\"#\" tabindex=\"7\">"+Msg.get("localiser-la-carte")+"</a>"+
681 aurelien 468
				"</span>");
1858 raphael 469
 
470
			//ajout d'un listener sur le lien "saisie X/Y"
248 aurelien 471
			coordPanel.addListener(new PanelListenerAdapter() {
1858 raphael 472
 
1292 aurelien 473
				@Override
248 aurelien 474
				public void onAfterLayout(Container c) {
1542 aurelien 475
					surPremierAffichageCoordPanel(largeur);
248 aurelien 476
				}
477
			});
1858 raphael 478
 
276 aurelien 479
		//Sur une meme ligne, ajout de plusieurs champs
1858 raphael 480
		final MultiFieldPanel htmlPanel = new MultiFieldPanel();
481
 
482
		htmlPanel.addToRow(coordonnees, 100);
483
		htmlPanel.addToRow(afficherFormulaireLatLon, new ColumnLayoutData(0.9));
276 aurelien 484
		htmlPanel.setBorder(false);
485
		htmlPanel.setId("x-coord-panel");
1858 raphael 486
 
248 aurelien 487
		panneauPremierColonne.add(htmlPanel);
488
		panneauPremierColonne.add(coordPanel);
1858 raphael 489
 
2634 aurelien 490
	    date = new DateField(Msg.get("date"), "date", 250);
12 david 491
	    date.setAllowBlank(true);
110 aurelien 492
	    formatDate = "d/m/Y";
2637 aurelien 493
	    date.setFormat(formatDate);
494
	    date.setTitle(Msg.get("indication-format-date"));
1628 raphael 495
	    date.setMaxValue(new Date());
248 aurelien 496
	    //date.setTabIndex(5);
1858 raphael 497
	    panneauPremierColonne.add(date, new AnchorLayoutData("55%"));
498
 
499
 
500
	    final String champsListeTpl = "<div class=\"x-combo-list-item search-item-tpl\" title=\"{label}\">{label}</div>";
501
 
1542 aurelien 502
	    // Selection d'un référentiel par défaut (le premier spécifié dans la config)
503
	    referentielTaxo = Configuration.getReferentielsDispos().get(0).getCode();
504
	    selecteurReferentielTaxo = new ComboBox();
505
	    selecteurReferentielTaxo.setCls("champ-separation");
2634 aurelien 506
	    selecteurReferentielTaxo.setLabel(Msg.get("referentiel"));
1542 aurelien 507
	    selecteurReferentielTaxo.setStore(Ontologies.getValeursReferentiel());
508
	    selecteurReferentielTaxo.setValue(referentielTaxo);
509
	    selecteurReferentielTaxo.setDisplayField("label") ;
510
	    selecteurReferentielTaxo.setValueField("valeur");
511
	    selecteurReferentielTaxo.setEditable(false);
512
	    selecteurReferentielTaxo.setHideTrigger(false);
513
	    selecteurReferentielTaxo.setForceSelection(true);
1559 aurelien 514
	    selecteurReferentielTaxo.setTpl(champsListeTpl);
1858 raphael 515
 
2634 aurelien 516
		espece = new AutoCompletionComboBox(Msg.get("espece"), ListeReferentielNomAsynchroneDAO.getBaseUrlReferentielNom()) {
2609 aurelien 517
			@Override
518
			protected Map<String, String> parserResultatRequete(Response response) {
2644 aurelien 519
				// TODO: bien penser à l'unicité des clés, ici on suppose que
520
				// genre espèce auteur suffit mais quelquefois on peut avoir des doublons
2609 aurelien 521
				referentielNom = Util.parserRetourReferentielNomIndexeParNom(response);
522
				return Util.convertirListeReferentielNomVersMap(referentielNom);
523
			}
524
 
525
			@Override
526
			public void onSelectionValeur() {
527
				especeModifiee = true;
528
				surSelectionEspece();
2695 aurelien 529
				verifierPresenceTaxonSaisi();
2609 aurelien 530
			}
531
 
532
			@Override
533
			protected void onModificationValeur() {
534
				especeModifiee = true;
2695 aurelien 535
				// Pour éviter qu'un mauvais nn ne soit gardé lors d'une modification
536
				// vers un nom ne faisant pas partie du référentiel
537
				numeroNom = null;
2734 mathias 538
				String cle = espece.getValue();
539
				if(referentielNom.containsKey(cle)) {
540
					numeroNom = referentielNom.get(cle).getNumeroNom();
2695 aurelien 541
				}
542
				verifierPresenceTaxonSaisi();
2609 aurelien 543
			}
20 david 544
 
2609 aurelien 545
			@Override
546
			public void onValidationSaisie() {
547
				validerSaisie(Champs.ESPECE);
548
			}
549
 
550
			@Override
551
			protected String preTraiterUrlRequete(String urlRequete, String valeur) {
552
				return ListeReferentielNomAsynchroneDAO.formaterUrlAutoCompletionReferentielNom(urlRequete, referentielTaxo, valeur);
553
			}
554
 
555
			@Override
2734 mathias 556
			protected String preTraiterValeurAvantAffichage(String cle) {
557
				ReferentielNom nomValeur = referentielNom.get(cle);
2609 aurelien 558
				String valeurAffichee = nomValeur.getNom();
559
				// Pour afficher les noms retenus en gras
560
				if (nomValeur.estRetenu()) {
2695 aurelien 561
					valeurAffichee = "<span class=\"nomRetenu\">"+nomValeur.getNom().trim()+"</span>";
2609 aurelien 562
				}
563
				return valeurAffichee;
564
			}
565
	    };
1858 raphael 566
 
1489 aurelien 567
	    Panel panelSeparationPp = new Panel();
568
	    panelSeparationPp.setHeight(15);
569
	    panelSeparationPp.setBorder(false);
1858 raphael 570
 
1489 aurelien 571
	    panneauPremierColonne.add(panelSeparationPp);
1858 raphael 572
	    panneauPremierColonne.add(selecteurReferentielTaxo, new AnchorLayoutData("85%"));
573
	    panneauPremierColonne.add(espece, new AnchorLayoutData("95%"));
574
 
1488 aurelien 575
	    selecteurAbondance = new ComboBox();
1489 aurelien 576
	    selecteurAbondance.setCls("champ-separation");
2634 aurelien 577
	    selecteurAbondance.setLabel(Msg.get("abondance"));
1489 aurelien 578
	    selecteurAbondance.setStore(Ontologies.getValeursAbondance());
1488 aurelien 579
	    selecteurAbondance.setDisplayField("label") ;
580
	    selecteurAbondance.setValueField("valeur");
581
	    selecteurAbondance.setEditable(true);
582
	    selecteurAbondance.setHideTrigger(false);
583
	    selecteurAbondance.setForceSelection(false);
1559 aurelien 584
	    selecteurAbondance.setTpl(champsListeTpl);
1858 raphael 585
	    panneauPremierColonne.add(selecteurAbondance,  new AnchorLayoutData("95%"));
586
 
2634 aurelien 587
	    lieudit = new AutoCompletionComboBox(Msg.get("lieu-dit"), ListeReferentielPersoAsynchroneDAO.getUrlReferentielPerso(TypesReferentiels.REFERENTIEL_LIEU_DIT)) {
1292 aurelien 588
			@Override
2602 aurelien 589
			protected Map<String, String> parserResultatRequete(Response response) {
590
				return Util.parserRetourReferentielPerso(response);
591
			}
592
 
593
			@Override
594
			public void onSelectionValeur() {
1858 raphael 595
				lieuDitModifie = true;
728 aurelien 596
			}
2602 aurelien 597
 
598
			@Override
599
			protected void onModificationValeur() {
600
				lieuDitModifie = true;
601
			}
728 aurelien 602
 
1292 aurelien 603
			@Override
728 aurelien 604
			public void onValidationSaisie() {
605
				validerSaisie(Champs.LIEUDIT);
2602 aurelien 606
			}
2609 aurelien 607
 
608
			@Override
609
			protected String preTraiterUrlRequete(String urlRequete, String valeur) {
610
				return ListeReferentielPersoAsynchroneDAO.formaterUrlRequeteAutoCompletionPerso(urlRequete, valeur);
611
			}
2602 aurelien 612
		};
1858 raphael 613
	    panneauSecondeColonne.add(lieudit,  new AnchorLayoutData("95%"));
614
 
2634 aurelien 615
	    milieu = new AutoCompletionComboBox(Msg.get("milieu"), ListeReferentielPersoAsynchroneDAO.getUrlReferentielPerso(TypesReferentiels.REFERENTIEL_MILIEU)) {
1292 aurelien 616
			@Override
2602 aurelien 617
			protected Map<String, String> parserResultatRequete(Response response) {
618
				return Util.parserRetourReferentielPerso(response);
619
			}
620
 
621
			@Override
622
			public void onSelectionValeur() {
728 aurelien 623
				milieuModifie = true;
624
			}
2602 aurelien 625
 
626
			@Override
627
			protected void onModificationValeur() {
628
				milieuModifie = true;
629
			}
728 aurelien 630
 
1292 aurelien 631
			@Override
728 aurelien 632
			public void onValidationSaisie() {
633
				validerSaisie(Champs.MILIEU);
2602 aurelien 634
			}
2609 aurelien 635
 
636
			@Override
637
			protected String preTraiterUrlRequete(String urlRequete, String valeur) {
638
				return ListeReferentielPersoAsynchroneDAO.formaterUrlRequeteAutoCompletionPerso(urlRequete, valeur);
639
			}
728 aurelien 640
	    };
201 david 641
	    panneauSecondeColonne.add(milieu,  new AnchorLayoutData("95%"));
1858 raphael 642
 
2634 aurelien 643
	    comment = new TextArea(Msg.get("notes"), "comment");
128 aurelien 644
	    comment.setAllowBlank(true);
645
	    comment.setHeight(50);
1858 raphael 646
 
201 david 647
	    panneauSecondeColonne.add(comment, new AnchorLayoutData("95%") );
1858 raphael 648
 
1489 aurelien 649
	    Panel panelSeparationPs = new Panel();
1542 aurelien 650
	    panelSeparationPs.setHeight(39);
1489 aurelien 651
	    panelSeparationPs.setBorder(false);
1858 raphael 652
 
1489 aurelien 653
	    panneauSecondeColonne.add(panelSeparationPs);
1858 raphael 654
 
1489 aurelien 655
	    selecteurCertitude = new ComboBox();
2634 aurelien 656
	    selecteurCertitude.setLabel(Msg.get("identification"));
1489 aurelien 657
	    selecteurCertitude.setStore(Ontologies.getValeursCertitude());
658
	    selecteurCertitude.setDisplayField("label") ;
659
	    selecteurCertitude.setValueField("valeur");
660
	    selecteurCertitude.setEditable(true);
661
	    selecteurCertitude.setHideTrigger(false);
662
	    selecteurCertitude.setForceSelection(false);
1559 aurelien 663
	    selecteurCertitude.setTpl(champsListeTpl);
1858 raphael 664
	    panneauSecondeColonne.add(selecteurCertitude, new AnchorLayoutData("95%"));
665
 
1542 aurelien 666
	    selecteurStadePheno = new ComboBox();
2634 aurelien 667
	    selecteurStadePheno.setLabel(Msg.get("phenologie"));
1542 aurelien 668
	    selecteurStadePheno.setStore(Ontologies.getValeursPhenologie());
669
	    selecteurStadePheno.setDisplayField("label") ;
670
	    selecteurStadePheno.setValueField("valeur");
671
	    selecteurStadePheno.setEditable(true);
672
	    selecteurStadePheno.setHideTrigger(false);
673
	    selecteurStadePheno.setForceSelection(false);
1559 aurelien 674
	    selecteurStadePheno.setTpl(champsListeTpl);
1858 raphael 675
	    panneauSecondeColonne.add(selecteurStadePheno, new AnchorLayoutData("95%"));
676
 
276 aurelien 677
	    if (Window.getClientWidth() > Window.getClientHeight() || Window.getClientWidth() < 800) {
230 david 678
			panneauIntermediaire.add(panneauPremierColonne, new ColumnLayoutData(.5));
679
			panneauIntermediaire.add(panneauSecondeColonne, new ColumnLayoutData(.5));
680
	    }
681
	    else {
682
			panneauIntermediaire.add(panneauPremierColonne);
1858 raphael 683
			panneauIntermediaire.add(panneauSecondeColonne);
230 david 684
	    }
1858 raphael 685
 
12 david 686
		panneauFormulaire.add(panneauIntermediaire);
1940 aurelien 687
 
276 aurelien 688
		if (Ext.isIE()) {
218 david 689
			panneauPremierColonne.setButtonAlign(Position.RIGHT);
690
			panneauPremierColonne.addButton(boutonOK);
1641 aurelien 691
			panneauPremierColonne.addButton(boutonModifier);
692
			panneauPremierColonne.addButton(boutonSupprimer);
218 david 693
			panneauSecondeColonne.setButtonAlign(Position.LEFT);
2634 aurelien 694
			panneauPremierColonne.addButton(boutonReinitialiser);
218 david 695
		}
1858 raphael 696
		else {
218 david 697
			panneauFormulaire.addButton(boutonOK);
1641 aurelien 698
			panneauFormulaire.addButton(boutonModifier);
699
			panneauFormulaire.addButton(boutonSupprimer);
2634 aurelien 700
			panneauFormulaire.addButton(boutonReinitialiser);
218 david 701
		}
1858 raphael 702
 
12 david 703
		this.add(panneauFormulaire) ;
1858 raphael 704
 
120 aurelien 705
		this.setAutoScroll(true);
1858 raphael 706
 
707
 
201 david 708
		panneauFormulaire.addListener(new PanelListenerAdapter() {
1292 aurelien 709
	        @Override
710
			public void onResize(BoxComponent component, int adjWidth, int adjHeight, int rawWidth, int rawHeight) {
201 david 711
	        	panneauIntermediaire.setWidth(rawWidth);
712
	        	panneauIntermediaire.setHeight(rawHeight);
1858 raphael 713
 
276 aurelien 714
	        	panneauPremierColonne.doLayout();
715
	        	panneauSecondeColonne.doLayout();
1858 raphael 716
 
2568 aurelien 717
	        	htmllocalitePanel.doLayout();
276 aurelien 718
	        	htmlPanel.doLayout();
2602 aurelien 719
 
2603 aurelien 720
				redimensionnerChampsEtendus();
1858 raphael 721
 
318 aurelien 722
	        	doLayout();
1542 aurelien 723
	        }
724
	    });
1858 raphael 725
 
2634 aurelien 726
		lienAfficherChampsEtendus = new HTML(Msg.get("afficher-champs-etendus"));
1597 aurelien 727
		lienAfficherChampsEtendus.setStyleName("img-curseur-depl");
728
		lienAfficherChampsEtendus.setStyleName("lienAfficherChampsEtendus");
729
		lienAfficherChampsEtendus.setVisible(false);
730
 
731
		lienAfficherChampsEtendus.addClickHandler(new ClickHandler() {
732
			@Override
733
			public void onClick(ClickEvent event) {
734
				if(afficherChampsEtendus) {
735
					afficherChampsEtendus = false;
736
					if(conteneurChampEtenduGauche != null && conteneurChampEtenduDroite != null) {
737
						conteneurChampEtenduGauche.hide();
738
						conteneurChampEtenduDroite.hide();
739
					}
2634 aurelien 740
					lienAfficherChampsEtendus.setText(Msg.get("afficher-champs-etendus"));
1858 raphael 741
 
1597 aurelien 742
				} else {
743
					afficherChampsEtendus = true;
744
					if(conteneurChampEtenduGauche != null && conteneurChampEtenduDroite != null) {
745
						conteneurChampEtenduGauche.show();
746
						conteneurChampEtenduDroite.show();
2602 aurelien 747
						redimensionnerChampsEtendus();
1597 aurelien 748
					}
2634 aurelien 749
					lienAfficherChampsEtendus.setText(Msg.get("cacher-champs-etendus"));
1597 aurelien 750
				}
751
			}
752
		});
1940 aurelien 753
 
754
		if(Configuration.saisieChampsEtendusActivee()) {
2392 aurelien 755
			// Chargement du cache des correspondances cles/labels du catalogue
756
			ListeReferentielChampsEtendusDAO lrceDao = new ListeReferentielChampsEtendusDAO(null);
757
			lrceDao.obtenirGroupesChampsEtendus(this);
758
			lrceDao.obtenirCatalogueChampsEtendus(this);
759
 
2634 aurelien 760
			lienAjouterChampsEtendus = new HTML(Msg.get("ajouter-champ-etendu"));
1940 aurelien 761
			lienAjouterChampsEtendus.addStyleName("lienAjouterChampEtendu");
762
			lienAjouterChampsEtendus.setVisible(true);
763
			panneauPremierColonne.add(lienAjouterChampsEtendus);
764
			gererLienAjoutChampsEtendus();
765
		}
766
 
1597 aurelien 767
		panneauPremierColonne.add(lienAfficherChampsEtendus);
768
		panneauPremierColonne.addListener(new PanelListenerAdapter() {
769
			@Override
770
			public void onAfterLayout(Container c) {
771
				if(premierAffichage) {
772
					lienAfficherChampsEtendus.setVisible(false);
773
					premierAffichage = false;
774
				}
775
			}
776
		});
1641 aurelien 777
 
12 david 778
		ajouterListeners() ;
1641 aurelien 779
		ajouterToolTipsBoutons();
248 aurelien 780
		saisieTabindex();
12 david 781
	}
1940 aurelien 782
 
2609 aurelien 783
	protected void surSelectionEspece() {
2734 mathias 784
		//String cle = espece.getText();
785
		String cle = espece.getValue();
786
		ReferentielNom nom = referentielNom.get(cle);
787
		// Bricolage immonde : sans ça, la combobox affiche la clef au lieu d'afficher
788
		// la valeur - WTF?? - pas trouvé moyen de faire mieux (attention aux effets
789
		// de bord dégueus)
790
		espece.setText(nom.getNom());
791
		// retour à la vie normale
2609 aurelien 792
		numeroNom = nom.getNumeroNom();
793
		selectionEspece = true;
794
		observationMediateur.obtenirImageInformationExternes(referentielTaxo, numeroNom);
795
	}
796
 
797
	protected void surSelectionLocalite() {
798
		ReferentielLocalite infosLoc = referentielLocalite.get(localite.getText());
799
        codeLocalite = infosLoc.getCodeLocalite();
800
        selectionlocalite=true;
801
	}
802
 
1940 aurelien 803
	private void gererLienAjoutChampsEtendus() {
804
		popUpAjoutChampEtendu.setStylePrimaryName("popup_champ_etendu");
805
		lienAjouterChampsEtendus.addClickHandler(new ClickHandler() {
806
			@Override
807
			public void onClick(ClickEvent event) {
1945 aurelien 808
				FormulaireSaisieChampEtendu formChamp = new FormulaireSaisieChampEtendu() {
809
 
1940 aurelien 810
					@Override
811
					public void surValidation(ChampSaisieEtendu champ) {
1945 aurelien 812
						ajouterChampEtenduAuFormulaire(champ, true);
1967 aurelien 813
						popUpAjoutChampEtendu.clear();
814
						popUpAjoutChampEtendu.hide();
1940 aurelien 815
					}
1945 aurelien 816
 
817
					@Override
818
					public void surAjout(ChampSaisieEtendu champ) {
819
						ajouterChampEtenduAuFormulaire(champ, false);
820
					}
1858 raphael 821
 
1940 aurelien 822
					@Override
823
					public void surAnnulation() {
824
						popUpAjoutChampEtendu.clear();
825
						popUpAjoutChampEtendu.hide();
826
					}
1967 aurelien 827
 
828
					@Override
829
					public void surAjoutMultiple(List<ChampSaisieEtendu> champs) {
830
						for (Iterator<ChampSaisieEtendu> iterator = champs.iterator(); iterator.hasNext();) {
831
							ChampSaisieEtendu champSaisieEtendu = (ChampSaisieEtendu) iterator.next();
832
							ajouterChampEtenduAuFormulaire(champSaisieEtendu, false);
833
						}
834
					}
835
 
836
					@Override
837
					public void surValidationMultiple(List<ChampSaisieEtendu> champs) {
838
						for (Iterator<ChampSaisieEtendu> iterator = champs.iterator(); iterator.hasNext();) {
839
							ChampSaisieEtendu champSaisieEtendu = (ChampSaisieEtendu) iterator.next();
840
							ajouterChampEtenduAuFormulaire(champSaisieEtendu, false);
841
						}
842
						popUpAjoutChampEtendu.clear();
843
						popUpAjoutChampEtendu.hide();
844
					}
1940 aurelien 845
				};
846
				popUpAjoutChampEtendu.add(formChamp);
847
				popUpAjoutChampEtendu.center();
1945 aurelien 848
				popUpAjoutChampEtendu.setModal(true);
1940 aurelien 849
				popUpAjoutChampEtendu.show();
2603 aurelien 850
				formChamp.redimensionner(popUpAjoutChampEtendu.getOffsetWidth() - 13);
1940 aurelien 851
			}
852
		});
853
	}
854
 
1945 aurelien 855
	private void ajouterChampEtenduAuFormulaire(ChampSaisieEtendu nChamp, boolean fermerPopup) {
2602 aurelien 856
		ChampEtendu chet = new ChampEtendu(nChamp.getCle(), nChamp.getLabel(), "");
1940 aurelien 857
		Map<String, ChampEtendu> champsEt = getValeursChampsEtendus();
1945 aurelien 858
		if(!champsEt.containsKey(chet.getCle())) {
859
			champsEt.put(chet.getCle(), chet);
860
			afficherChampsEtendus = true;
861
			if(fermerPopup) {
862
				afficherChampsEtendus(champsEt, chet);
863
				popUpAjoutChampEtendu.clear();
864
				popUpAjoutChampEtendu.hide();
865
			} else {
866
				afficherChampsEtendus(champsEt, null);
867
			}
868
		} else {
2634 aurelien 869
			String[] stParams = {chet.getLabel()};
870
			Window.alert(Msg.get("indication-champ-etendu-existe-deja", stParams));
1945 aurelien 871
		}
1940 aurelien 872
	}
873
 
1641 aurelien 874
	private void ajouterToolTipsBoutons() {
2634 aurelien 875
		boutonOK.setTitle(Msg.get("indication-bouton-creer-obs"));
876
		boutonModifier.setTitle(Msg.get("indication-bouton-modifier-obs"));
877
		boutonSupprimer.setTitle(Msg.get("indication-bouton-supprimer-obs"));
878
		boutonReinitialiser.setTitle(Msg.get("indication-bouton-reinitialiser-obs"));
1641 aurelien 879
	}
1858 raphael 880
 
1542 aurelien 881
	private void surPremierAffichageCoordPanel(final double largeur) {
882
		ExtElement lienCoord = Ext.get("lien_coord");
883
		lienCoord.removeAllListeners();
884
		lienCoord.addListener("click", new EventCallback() {
885
			@Override
886
			public void execute(EventObject e) {
1858 raphael 887
 
1542 aurelien 888
				coordPanel.setVisible(!coordPanel.isVisible());
1858 raphael 889
 
1542 aurelien 890
				if(Ext.isIE()) {
891
					latitude.focus();
120 aurelien 892
				}
1858 raphael 893
 
1542 aurelien 894
				CarnetEnLigneMediateur.fireResize();
895
			}
896
		}) ;
1858 raphael 897
 
1542 aurelien 898
		ExtElement lienCartoCoord = Ext.get("lien_carto_coord");
899
		lienCartoCoord.removeAllListeners();
900
		lienCartoCoord.addListener("click", new EventCallback() {
901
			@Override
902
			public void execute(EventObject e) {
903
				obtenirInformationCoord();
904
			}
905
		}) ;
1858 raphael 906
 
1542 aurelien 907
		ExtElement lienCarto = Ext.get("lien_carto");
908
		lienCarto.removeAllListeners();
909
		lienCarto.addListener("click", new EventCallback() {
20 david 910
 
1542 aurelien 911
			@Override
912
			public void execute(EventObject e) {
1858 raphael 913
 
2609 aurelien 914
				if(localite.getText() != null && !localite.getText().equals("")) {
2568 aurelien 915
					obtenirInformationLocalite();
1542 aurelien 916
					longlatAjoutee = true;
917
				} else {
2637 aurelien 918
					Window.alert(Msg.get("indication-localite-vide-invalide"));
264 aurelien 919
				}
1542 aurelien 920
			}
921
		});
1858 raphael 922
 
1542 aurelien 923
		if(!Ext.isIE() && Window.getClientWidth() < 1200) {
1858 raphael 924
 
1542 aurelien 925
			int largeurN = (int)largeur;
1858 raphael 926
 
1542 aurelien 927
			latitude.setWidth(largeurN+"px");
928
			longitude.setWidth(largeurN+"px");
2568 aurelien 929
			lienSelectionlocalite.setWidth(largeurN+"px");
1542 aurelien 930
		}
931
	}
1858 raphael 932
 
1542 aurelien 933
	private void ajouterListeners()
1858 raphael 934
	{
935
		// Listener completion communne
1542 aurelien 936
		final Rafraichissable r = this;
1858 raphael 937
 
2568 aurelien 938
		ListenerConfig listenerConfiglocalite=new ListenerConfig();
939
		listenerConfiglocalite.setDelay(200);
940
		listenerConfiglocalite.setStopPropagation(false);
941
		listenerConfiglocalite.setStopEvent(false);
1488 aurelien 942
 
1542 aurelien 943
	    date.addListener(new DatePickerListenerAdapter() {
1488 aurelien 944
 
1542 aurelien 945
			@Override
946
			public void onSelect(DatePicker dataPicker, Date date) {
947
				dateModifiee = true;
948
			}
949
	    });
1858 raphael 950
 
1542 aurelien 951
	    ListenerConfig listenerConfigAutocompletion=new ListenerConfig();
952
	    listenerConfigAutocompletion.setDelay(200);
953
	    listenerConfigAutocompletion.setStopPropagation(false);
954
	    listenerConfigAutocompletion.setStopEvent(false);
1858 raphael 955
 
1542 aurelien 956
		ListenerConfig listenerConfigEspece=new ListenerConfig();
957
		listenerConfigEspece.setDelay(10);
958
		listenerConfigEspece.setStopPropagation(false);
959
		listenerConfigEspece.setStopEvent(false);
1858 raphael 960
 
1542 aurelien 961
		tCoord = new Timer() {
1488 aurelien 962
 
1542 aurelien 963
			@Override
964
			public void run() {
965
	        	double[] coord = coordonneesValides();
2568 aurelien 966
	        	if(!recherchelocaliteEnCours && coord != null && (longModifiee || latModifiee)) {
967
	        		recherchelocaliteEnCours = true;
2634 aurelien 968
	        		Ext.get(lienSelectionlocalite.getElement()).mask(Msg.get("recherche"));
1958 aurelien 969
	        		observationMediateur.obtenirInformationCoord(r,coord[0], coord[1]);
1542 aurelien 970
	        	}
971
			}
1858 raphael 972
 
1542 aurelien 973
		};
1858 raphael 974
 
1542 aurelien 975
	    ajouterListenerChampEvenementsClavier(date);
976
		ajouterListenerChampEvenementsClavier(selecteurReferentielTaxo);
977
		ajouterListenerChampEvenementsClavier(comment);
978
		ajouterListenerChampEvenementsClavier(latitude);
979
		ajouterListenerChampEvenementsClavier(longitude);
1572 aurelien 980
		ajouterListenerChampEvenementsClavier(altitude);
1858 raphael 981
		ajouterListenerChampEvenementsClavier(selecteurAbondance);
982
		ajouterListenerChampEvenementsClavier(selecteurCertitude);
1542 aurelien 983
		ajouterListenerChampEvenementsClavier(selecteurStadePheno);
984
		ajouterListenerChampsCombobox();
1858 raphael 985
 
20 david 986
		boutonOK.addListener(new ButtonListenerAdapter() {
1292 aurelien 987
			@Override
1858 raphael 988
			public void onClick(Button button, EventObject e) {
1641 aurelien 989
				ajouterObservation();
1858 raphael 990
			}
1641 aurelien 991
		});
1858 raphael 992
 
1641 aurelien 993
		boutonModifier.addListener(new ButtonListenerAdapter() {
994
			@Override
1858 raphael 995
			public void onClick(Button button, EventObject e) {
1641 aurelien 996
				if(selectionMultiple) {
2644 aurelien 997
					modifierObservationEnMasse();
1641 aurelien 998
				} else {
999
					modifierObservation() ;
71 jpm 1000
				}
1858 raphael 1001
			}
1641 aurelien 1002
		});
1858 raphael 1003
 
1641 aurelien 1004
		boutonSupprimer.addListener(new ButtonListenerAdapter() {
1005
			@Override
1858 raphael 1006
			public void onClick(Button button, EventObject e) {
1641 aurelien 1007
				if(!selectionMultiple) {
1008
					supprimerObservation();
1009
				} else {
1010
					observationMediateur.supprimerObservations();
71 jpm 1011
				}
1858 raphael 1012
			}
20 david 1013
		});
1858 raphael 1014
 
2634 aurelien 1015
		boutonReinitialiser.addListener(new ButtonListenerAdapter() {
1292 aurelien 1016
			@Override
1858 raphael 1017
			public void onClick(Button button, EventObject e) {
1641 aurelien 1018
					setSelectionMultiple(false);
104 jpm 1019
					raz();
1858 raphael 1020
			}
12 david 1021
		});
1858 raphael 1022
 
132 aurelien 1023
		this.addListener(new ContainerListenerAdapter() {
1292 aurelien 1024
			@Override
132 aurelien 1025
			public void onAfterLayout(Container self) {
2568 aurelien 1026
				localite.focus();
132 aurelien 1027
			}
1858 raphael 1028
		});
12 david 1029
	}
1858 raphael 1030
 
1542 aurelien 1031
	private void ajouterListenerChampsCombobox() {
1858 raphael 1032
		selecteurReferentielTaxo.addListener(new ComboBoxListenerAdapter() {
1542 aurelien 1033
             @Override
1672 aurelien 1034
			public void onSelect(ComboBox comboBox, Record record, int index) {
1542 aurelien 1035
            	 referentielTaxo = record.getAsString("valeur");
1036
                 observationMediateur.setRefTaxSelectionne(index);
1037
                 referentielTaxoModifie = true;
1858 raphael 1038
             }
1039
         });
1040
 
1041
		selecteurAbondance.addListener(new ComboBoxListenerAdapter() {
1542 aurelien 1042
			@Override
1858 raphael 1043
			public void onSelect(ComboBox comboBox, Record record, int index) {
1542 aurelien 1044
                 selectionAbondance=true;
1045
                 abondanceModifiee = true;
1046
             }
1047
         });
708 aurelien 1048
 
1858 raphael 1049
		selecteurCertitude.addListener(new ComboBoxListenerAdapter() {
1050
 
1542 aurelien 1051
			@Override
1858 raphael 1052
			public void onSelect(ComboBox comboBox, Record record, int index) {
1542 aurelien 1053
                 selectionCertitude=true;
1054
                 certitudeModifiee = true;
1055
             }
1858 raphael 1056
         });
1057
 
1058
		selecteurStadePheno.addListener(new ComboBoxListenerAdapter() {
1542 aurelien 1059
			@Override
1858 raphael 1060
			public void onSelect(ComboBox comboBox, Record record, int index) {
1542 aurelien 1061
                 selectionPhenologie=true;
1062
                 phenologieModifiee = true;
1063
             }
1858 raphael 1064
         });
1542 aurelien 1065
	}
1858 raphael 1066
 
1542 aurelien 1067
	private void ajouterListenerChampEvenementsClavier(final TextField champ) {
1068
		champ.addKeyPressListener(new EventCallback() {
1069
			@Override
1070
			public void execute(EventObject e) {
1071
				surEvenementClavier(e, champ);
1072
			}
1073
	    });
1074
	}
1858 raphael 1075
 
1542 aurelien 1076
	private void ajouterListenerChampEvenementsClavier(final TextField champ, final ListenerConfig config) {
1077
		champ.addKeyPressListener(new EventCallback() {
1078
			@Override
1079
			public void execute(EventObject e) {
1080
				surEvenementClavier(e, champ);
1081
			}
1082
	    }, config);
1083
	}
1858 raphael 1084
 
1542 aurelien 1085
	private void surEvenementClavier(EventObject e, TextField champ) {
1858 raphael 1086
		switch(e.getKey()) {
1542 aurelien 1087
			case KEY_ALT:
1088
			case KEY_CTRL:
1089
			case KEY_DOWN:
1090
			case KEY_END:
1091
			case KEY_ESCAPE:
1092
			case KEY_HOME:
1093
			case KEY_LEFT:
1094
			case KEY_PAGEDOWN:
1095
			case KEY_PAGEUP:
1096
			case KEY_RIGHT:
1097
			case KEY_SHIFT:
1098
			case KEY_TAB:
1099
			case KEY_UP:
1100
	        break;
1858 raphael 1101
 
1542 aurelien 1102
		    case KEY_ENTER:
1103
		    	surEvenementClavierToucheEntree(champ);
1104
		    	break;
1858 raphael 1105
 
1542 aurelien 1106
	        default:
1107
	        	gererEvenementClavierDefaut(champ);
1108
	        break;
1109
		}
1110
	}
1858 raphael 1111
 
1542 aurelien 1112
	private void surEvenementClavierToucheEntree(TextField champ) {
1113
		//TODO: faire un switch ou une enum
1114
		if(champ.equals(selecteurStadePheno)) {
1858 raphael 1115
			if(!selectionPhenologie) {
1116
  	    		validerSaisie(Champs.PHENOLOGIE);
1542 aurelien 1117
	    	} else {
1118
	    		selectionPhenologie = false;
1119
	    	}
1120
		}
1858 raphael 1121
 
1542 aurelien 1122
		if(champ.equals(selecteurCertitude)) {
1858 raphael 1123
			if(!selectionCertitude) {
1124
		    		validerSaisie(Champs.CERTITUDE);
1542 aurelien 1125
	    	} else {
1126
	    		selectionCertitude = false;
1127
	    	}
1128
		}
1858 raphael 1129
 
1542 aurelien 1130
		if(champ.equals(selecteurAbondance)) {
1858 raphael 1131
			if(!selectionAbondance) {
1132
		    	validerSaisie(Champs.ABONDANCE);
1542 aurelien 1133
	    	} else {
1134
	    		selectionAbondance = false;
1135
	    	}
1136
		}
1858 raphael 1137
 
1542 aurelien 1138
		if(champ.equals(longitude)) {
1139
			validerSaisie(Champs.LONGITUDE);
1140
		}
1858 raphael 1141
 
1142
		if(champ.equals(latitude)) {
1143
	    	validerSaisie(Champs.LATITUDE);
1542 aurelien 1144
		}
1858 raphael 1145
 
1146
		if(champ.equals(altitude)) {
1147
	    	validerSaisie(Champs.ALTITUDE);
1572 aurelien 1148
		}
1858 raphael 1149
 
1542 aurelien 1150
		if(champ.equals(espece)) {
1151
			if(selectionEspece) {
1152
	    		especeModifiee = true;
1153
	    		selectionEspece=false;
1154
	    	}
1155
	    	else {
1858 raphael 1156
	    		validerSaisie(Champs.ESPECE);
1542 aurelien 1157
	    	}
1158
		}
1858 raphael 1159
 
1542 aurelien 1160
		if(champ.equals(selecteurReferentielTaxo)) {
1858 raphael 1161
			validerSaisie(Champs.REFERENTIELTAXO);
1542 aurelien 1162
		}
1858 raphael 1163
 
1542 aurelien 1164
		if(champ.equals(date)) {
1858 raphael 1165
			validerSaisie(Champs.DATE);
1542 aurelien 1166
		}
1858 raphael 1167
 
2568 aurelien 1168
		if(champ.equals(localite)) {
1169
			if(champ.equals(localite)) {
1170
				if (selectionlocalite) {
1171
		    		 localiteModifiee= true;
1172
		    		 selectionlocalite=false;
1542 aurelien 1173
		    	 }
1174
		    	else {
2568 aurelien 1175
		    		validerSaisie(Champs.LOCALITE);
1542 aurelien 1176
		    	 }
1177
			}
1178
		}
1179
	}
1858 raphael 1180
 
1542 aurelien 1181
	private void gererEvenementClavierDefaut(TextField champ) {
1182
		//TODO: faire un switch ou une enum
1183
		if(champ.equals(selecteurStadePheno)) {
1184
			selecteurStadePheno.setRawValue(selecteurStadePheno.getRawValue());
1185
			selecteurStadePheno.setValue(selecteurStadePheno.getRawValue());
1186
			phenologieModifiee = true;
1187
			selectionPhenologie = false;
1188
		}
1858 raphael 1189
 
1542 aurelien 1190
		if(champ.equals(selecteurCertitude)) {
1191
			selecteurCertitude.setRawValue(selecteurCertitude.getRawValue());
1192
	    	selecteurCertitude.setValue(selecteurCertitude.getRawValue());
1193
	    	certitudeModifiee = true;
1194
	    	selectionCertitude = false;
1195
		}
1858 raphael 1196
 
1542 aurelien 1197
		if(champ.equals(selecteurAbondance)) {
1198
			selecteurAbondance.setRawValue(selecteurAbondance.getRawValue());
1199
	    	selecteurAbondance.setValue(selecteurAbondance.getRawValue());
1200
	    	abondanceModifiee = true;
1201
	    	selectionAbondance = false;
1202
		}
1858 raphael 1203
 
1542 aurelien 1204
		if(champ.equals(longitude)) {
1205
			longModifiee = true;
1206
        	tCoord.cancel();
1207
        	tCoord.schedule(250);
1208
		}
1858 raphael 1209
 
1210
		if(champ.equals(latitude)) {
1542 aurelien 1211
			latModifiee = true;
1212
	      	tCoord.cancel();
1213
	      	tCoord.schedule(250);
1214
		}
1858 raphael 1215
 
1216
		if(champ.equals(altitude)) {
1217
			altModifiee = true;
1572 aurelien 1218
		}
1858 raphael 1219
 
1542 aurelien 1220
		if(champ.equals(comment)) {
1221
			commModifie = true;
1222
		}
1858 raphael 1223
 
1542 aurelien 1224
		if(champ.equals(espece)) {
1225
			numeroNom="";
1226
	    	especeModifiee = true;
1227
		}
1858 raphael 1228
 
1542 aurelien 1229
		if(champ.equals(selecteurReferentielTaxo)) {
1230
			referentielTaxoModifie = true;
1231
		}
1858 raphael 1232
 
1542 aurelien 1233
		if(champ.equals(date)) {
1234
			dateModifiee = true;
1235
		}
1858 raphael 1236
 
2568 aurelien 1237
		if(champ.equals(localite)) {
1238
			codeLocalite="";
1239
	    	localite.collapse();
1240
	    	localiteModifiee= true;
1542 aurelien 1241
		}
1242
	}
1243
 
12 david 1244
	/**
1858 raphael 1245
	 * Validation de la saisie
118 david 1246
	 */
1858 raphael 1247
 
118 david 1248
	private void validerSaisie(Champs champs) {
1641 aurelien 1249
		if(!selectionMultiple) {
118 david 1250
			ajouterObservation();
1251
			raz(champs);
1641 aurelien 1252
		} else {
2644 aurelien 1253
			modifierObservationEnMasse();
118 david 1254
		}
1255
	}
1858 raphael 1256
 
118 david 1257
	/**
12 david 1258
	 * Desactive visuellement ce panneau
1259
	 */
1260
	public void desactiverPanneau()
1261
	{
1262
		this.setDisabled(true) ;
1263
	}
1858 raphael 1264
 
12 david 1265
	/**
1266
	 * Active visuellement ce panneau
1267
	 */
1268
	public void activerPanneau()
1269
	{
1270
		this.setDisabled(false) ;
1271
	}
13 david 1272
 
1292 aurelien 1273
	@Override
13 david 1274
	public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
1858 raphael 1275
 
1276
		// On recoit une observation dont on veut afficher le detail
1672 aurelien 1277
		if(nouvelleDonnees instanceof Observation)
1278
		{
1279
			Observation obs = (Observation)nouvelleDonnees ;
1280
			setSelectionMultiple(false);
1281
			afficherDetailsObservation(obs) ;
1282
		}
1858 raphael 1283
 
1672 aurelien 1284
		if(nouvelleDonnees instanceof ListeObservation) {
1858 raphael 1285
 
1672 aurelien 1286
			ListeObservation listeObs = (ListeObservation)nouvelleDonnees;
1287
			setSelectionMultiple(true);
1288
			calculerAfficherDifferences(listeObs);
1289
		}
1858 raphael 1290
 
1672 aurelien 1291
		if(nouvelleDonnees instanceof String)
1292
		{
1293
			String str = (String)nouvelleDonnees ;
1294
			observationMediateur.obtenirNombreObservation() ;
1295
		}
1858 raphael 1296
 
1672 aurelien 1297
		if(nouvelleDonnees instanceof String[]) {
1298
			String[] anumNom = (String[])nouvelleDonnees ;
1299
			numeroNom = anumNom[1];
1300
			espece.setValue(anumNom[0]);
1301
		}
1858 raphael 1302
 
1672 aurelien 1303
		if(nouvelleDonnees instanceof EntiteGeographiqueObservation)
1304
		{
1305
			EntiteGeographiqueObservation infosComm = (EntiteGeographiqueObservation)nouvelleDonnees ;
2568 aurelien 1306
			if(recherchelocaliteEnCours) {
1307
				afficherIndicationlocalite(infosComm);
1672 aurelien 1308
			} else {
2568 aurelien 1309
				rafraichirlocaliteEtCoord(infosComm);
248 aurelien 1310
			}
1672 aurelien 1311
		}
13 david 1312
	}
1858 raphael 1313
 
2568 aurelien 1314
	private void afficherIndicationlocalite(
268 aurelien 1315
			final EntiteGeographiqueObservation infosCom) {
1858 raphael 1316
 
2568 aurelien 1317
		String nlocalite = "";
2589 aurelien 1318
		if(infosCom != null && infosCom.getZoneGeo() != null && !infosCom.getZoneGeo().trim().isEmpty()) {
2568 aurelien 1319
			nlocalite += infosCom.getZoneGeo();
2589 aurelien 1320
			if(infosCom.getIdZoneGeo() != null && !infosCom.getIdZoneGeo().trim().isEmpty()) {
2695 aurelien 1321
				if(Util.estUnDepartement(infosCom.getIdZoneGeo())) {
2568 aurelien 1322
					nlocalite += " ("+Util.convertirChaineZoneGeoVersDepartement(infosCom.getIdZoneGeo())+")";
2589 aurelien 1323
				} else if(infosCom.getPays() != null && !infosCom.getPays().trim().isEmpty()) {
1324
					nlocalite += " ("+infosCom.getPays()+")";
2558 aurelien 1325
				}
2568 aurelien 1326
			} else if(infosCom.getPays() != null && !infosCom.getPays().trim().isEmpty()) {
1327
				nlocalite += " ("+infosCom.getPays()+")";
2558 aurelien 1328
			}
1858 raphael 1329
 
2568 aurelien 1330
			lienSelectionlocalite.setHtml("<a id=\"lien_selection_localite\" tabindex=\"9\">"+nlocalite+"</a>");
1331
			lienSelectionlocalite.setStyleName("img-curseur-depl");
1858 raphael 1332
 
2568 aurelien 1333
			Ext.get("lien_selection_localite").addListener("click",new EventCallback() {
1292 aurelien 1334
				@Override
681 aurelien 1335
				public void execute(EventObject e) {
2568 aurelien 1336
					rafraichirlocalite(infosCom);
1858 raphael 1337
				}
681 aurelien 1338
			});
1858 raphael 1339
 
2568 aurelien 1340
			Ext.get("lien_selection_localite").addListener("keypress",new EventCallback() {
1292 aurelien 1341
				@Override
681 aurelien 1342
				public void execute(EventObject e) {
1343
					if(e.getCharCode() == KEY_ENTER) {
2568 aurelien 1344
						rafraichirlocalite(infosCom);
681 aurelien 1345
					}
1858 raphael 1346
				}
681 aurelien 1347
			});
1858 raphael 1348
 
2568 aurelien 1349
			Ext.get("lien_selection_localite").addListener("focus",new EventCallback() {
1292 aurelien 1350
				@Override
681 aurelien 1351
				public void execute(EventObject e) {
2568 aurelien 1352
					Ext.get("lien_selection_localite").toggleClass("lien_sel");
1858 raphael 1353
				}
681 aurelien 1354
			});
1858 raphael 1355
 
2568 aurelien 1356
			Ext.get("lien_selection_localite").addListener("blur",new EventCallback() {
1292 aurelien 1357
				@Override
681 aurelien 1358
				public void execute(EventObject e) {
2568 aurelien 1359
					Ext.get("lien_selection_localite").toggleClass("lien_sel");
1858 raphael 1360
				}
681 aurelien 1361
			});
1858 raphael 1362
 
681 aurelien 1363
		} else {
2568 aurelien 1364
			if(recherchelocaliteEnCours) {
2634 aurelien 1365
				lienSelectionlocalite.setHtml("<span id=\"aucune_selection_localite\"> "+Msg.get("erreur-localisation")+" </span>");
681 aurelien 1366
			} else {
2568 aurelien 1367
				lienSelectionlocalite.setHtml("<span id=\"aucune_selection_localite\"> </span>");
681 aurelien 1368
			}
268 aurelien 1369
		}
248 aurelien 1370
 
2568 aurelien 1371
		Ext.get(lienSelectionlocalite.getElement()).unmask();
1372
		recherchelocaliteEnCours = false;
268 aurelien 1373
	}
1858 raphael 1374
 
2568 aurelien 1375
	private void rafraichirlocalite(EntiteGeographiqueObservation infosCom) {
1376
		String nlocalite = "";
1858 raphael 1377
 
962 aurelien 1378
		if(infosCom.getZoneGeo() != null && !infosCom.getZoneGeo().equals("")) {
2568 aurelien 1379
			nlocalite += infosCom.getZoneGeo();
248 aurelien 1380
		}
2558 aurelien 1381
 
2695 aurelien 1382
		if(infosCom.getIdZoneGeo() != null && Util.estUnDepartement(infosCom.getIdZoneGeo())) {
1332 aurelien 1383
			String codeGeoFormate = Util.convertirChaineZoneGeoVersDepartement(infosCom.getIdZoneGeo());
2568 aurelien 1384
			nlocalite += " ("+codeGeoFormate+")";
1385
			codeLocalite = Util.convertirChaineZoneGeoVersDepartement(infosCom.getIdZoneGeo());
1386
		} else if(infosCom.getPays() != null && !infosCom.getPays().trim().isEmpty()) {
1387
			nlocalite += " ("+infosCom.getPays()+")";
248 aurelien 1388
		}
2558 aurelien 1389
 
2589 aurelien 1390
		if (!nlocalite.isEmpty()) {
1391
			// Vide ou null, on remplace !
2609 aurelien 1392
			if(localite.getText() == null || localite.getText().trim().isEmpty()) {
2568 aurelien 1393
				localite.setValue(nlocalite);
2589 aurelien 1394
			} else {
1395
				// Afin de pas effacer un pays précédemment saisi, si on a déjà saisi une localité
1396
				// avec le même nom mais avec un pays, on ne remplace rien
2609 aurelien 1397
				if(localite.getText() != null && !localite.getText().contains(nlocalite)) {
2589 aurelien 1398
					localite.setValue(nlocalite);
1399
				}
2568 aurelien 1400
			}
2589 aurelien 1401
 
2568 aurelien 1402
			localiteModifiee = true;
2270 mathias 1403
		}
268 aurelien 1404
	}
248 aurelien 1405
 
2276 mathias 1406
	// Se déclenche au retour de la "localisation sur la carte"
2568 aurelien 1407
	private void rafraichirlocaliteEtCoord(EntiteGeographiqueObservation infosCom) {
2558 aurelien 1408
 
2568 aurelien 1409
		rafraichirlocalite(infosCom);
248 aurelien 1410
		if(infosCom.getLat() != null && !infosCom.getLat().equals("")) {
2276 mathias 1411
			latitude.setValue(Util.tronquerNombrePourAffichage("" + infosCom.getLat(), 5));
248 aurelien 1412
		}
1413
 
1414
		if(infosCom.getLon() != null && !infosCom.getLon().equals("")) {
2276 mathias 1415
			longitude.setValue(Util.tronquerNombrePourAffichage("" + infosCom.getLon(), 5));
248 aurelien 1416
		}
1858 raphael 1417
 
357 aurelien 1418
		latModifiee = true;
1419
		longModifiee = true;
1858 raphael 1420
 
264 aurelien 1421
		coordPanel.setVisible(true);
248 aurelien 1422
	}
1423
 
39 david 1424
	public void ajouterObservation() {
1858 raphael 1425
 
1672 aurelien 1426
		if(date.getRawValue() != null && !date.getRawValue().equals("") && !Util.verifierDateFormatCel(date.getRawValue())) {
2637 aurelien 1427
			Window.alert(Msg.get("indication-date-invalide"));
1428
			date.setInvalidText(Msg.get("date-invalide"));
681 aurelien 1429
			return;
1430
		}
1858 raphael 1431
 
2568 aurelien 1432
		affecterCodeLocaliteOuPays();
1858 raphael 1433
 
681 aurelien 1434
		String dateObs = Util.remplacerSeparateursDateFormatCel(date.getRawValue());
39 david 1435
 
2568 aurelien 1436
		Observation obs=new Observation(espece.getText(),numeroNom,localite.getText(),codeLocalite,lieudit.getText(),station.getText(),milieu.getText(), comment.getText(),dateObs);
1858 raphael 1437
 
264 aurelien 1438
		String[] coords = getValeurCoordonnees();
2568 aurelien 1439
		obs.setPays(pays);
971 aurelien 1440
		obs.setLatitude(coords[0]);
1441
		obs.setLongitude(coords[1]);
1572 aurelien 1442
		obs.setAltitude(altitude.getText());
1542 aurelien 1443
 
1488 aurelien 1444
		obs.setAbondance(getAbondance());
1445
		obs.setCertitude(getCertitude());
1542 aurelien 1446
		obs.setPhenologie(getPhenologie());
1858 raphael 1447
 
1542 aurelien 1448
		obs.setReferentielTaxo(Ontologies.getInfosReferentielNomParCode(referentielTaxo).getCodeVersionComplet());
1549 aurelien 1449
		obs.setChampsEtendus(getValeursChampsEtendus());
1858 raphael 1450
 
46 david 1451
		observationMediateur.ajouterObservation(obs);
39 david 1452
	}
1542 aurelien 1453
 
71 jpm 1454
	private void modifierObservation() {
2637 aurelien 1455
		if(!Window.confirm(Msg.get("question-modifier-observation")+" ?")) {
1672 aurelien 1456
			return;
1457
		}
1858 raphael 1458
 
1672 aurelien 1459
		if(date.getRawValue() != null && !date.getRawValue().equals("") && !Util.verifierDateFormatCel(date.getRawValue())) {
2637 aurelien 1460
			Window.alert(Msg.get("indication-date-invalide"));
1461
			date.setInvalidText(Msg.get("date-invalide"));
681 aurelien 1462
			return;
1463
		}
1858 raphael 1464
 
2568 aurelien 1465
		affecterCodeLocaliteOuPays();
1466
 
681 aurelien 1467
		String dateObs = Util.remplacerSeparateursDateFormatCel(date.getRawValue());
1858 raphael 1468
 
2568 aurelien 1469
		Observation obs=new Observation(espece.getText(),numeroNom,localite.getText(),codeLocalite,lieudit.getText(),station.getText(),milieu.getText(), comment.getText(),dateObs);
79 david 1470
		obs.setNumeroOrdre(numeroOrdre);
1858 raphael 1471
 
264 aurelien 1472
		String[] coords = getValeurCoordonnees();
1858 raphael 1473
 
2568 aurelien 1474
		obs.setPays(pays);
971 aurelien 1475
		obs.setLatitude(coords[0]);
1476
		obs.setLongitude(coords[1]);
1572 aurelien 1477
		obs.setAltitude(altitude.getText());
1858 raphael 1478
 
1488 aurelien 1479
		obs.setAbondance(getAbondance());
1480
		obs.setCertitude(getCertitude());
1542 aurelien 1481
		obs.setPhenologie(getPhenologie());
1482
		obs.setReferentielTaxo(getReferentielTaxo());
1549 aurelien 1483
		obs.setChampsEtendus(getValeursChampsEtendus());
1858 raphael 1484
 
79 david 1485
		observationMediateur.modifierObservation(obs);
71 jpm 1486
	}
1858 raphael 1487
 
2568 aurelien 1488
	private void affecterCodeLocaliteOuPays() {
1489
 
1490
		codeLocalite = "";
1491
		pays = "";
1492
 
1493
		// Soit un numéro de département, soit un code de pays à deux lettres
1494
		String[] codeCom = localite.getText().split(" ");
2595 aurelien 1495
		if(codeCom.length > 1 && ressembleAUnCodePaysOuDepartement(codeCom[codeCom.length - 1])) {
1496
			String codeLoc = codeCom[codeCom.length - 1].replace('(', ' ');
2568 aurelien 1497
			codeLoc = codeLoc.replace(')', ' ').trim().replace('\\',' ').trim();
1498
 
2695 aurelien 1499
			if(Util.estUnDepartement(codeLoc)) {
2568 aurelien 1500
				codeLocalite = codeLoc ;
1501
			} else {
2595 aurelien 1502
				pays = codeLoc.toUpperCase();
2568 aurelien 1503
			}
1504
		}
1505
	}
2595 aurelien 1506
 
1507
	private boolean ressembleAUnCodePaysOuDepartement(String s) {
1508
		String sP = s.replace("(", "").replace(")", "").trim();
1509
 
1510
		boolean contientDesParentheses = s.contains("(") && s.contains(")");
1511
		boolean estUnCodePays = !Util.estUnNombre(sP) && (sP.length() == 2);
1512
		boolean estUnCodeDepartement = Util.estUnNombre(sP) && (sP.length() >= 1 && sP.length() <= 5);
1513
 
1514
		return contientDesParentheses && (estUnCodePays || estUnCodeDepartement);
1515
	}
2568 aurelien 1516
 
2644 aurelien 1517
	private void modifierObservationEnMasse() {
1858 raphael 1518
 
1542 aurelien 1519
		//TODO: factoriser
2568 aurelien 1520
		String paysM = null;
1521
		String localiteM = null;
1522
		String codeLocaliteM = null;
221 aurelien 1523
		String numNomSelM = null;
216 aurelien 1524
		String lieuDitM = null;
1525
		String stationM = null;
1526
		String milieuM = null;
1527
		String dateM = null;
1528
		String especeM = null;
1858 raphael 1529
		String commM = null;
264 aurelien 1530
		String latM = null;
1531
		String longM = null;
1572 aurelien 1532
		String altM = null;
1488 aurelien 1533
		String abondanceM = null;
1534
		String certitudeM = null;
1542 aurelien 1535
		String referentielTaxoM = null;
1536
		String phenologieM = null;
1858 raphael 1537
 
216 aurelien 1538
		String champs = modeleMessageModif;
1858 raphael 1539
 
2568 aurelien 1540
		if(localiteModifiee && ! localite.getRawValue().equals(VALEURS_MULTIPLES)) {
1541
 
1542
			localiteM = localite.getText();
1543
 
1544
			// Soit un numéro de département, soit un code de pays à deux lettres
1545
			String[] codeCom = localite.getText().split(" ");
1546
			if(codeCom.length > 1) {
1547
				String codeLoc = codeCom[1].replace('(', ' ');
1548
				codeLoc = codeLoc.replace(')', ' ').trim().replace('\\',' ').trim();
1858 raphael 1549
 
2695 aurelien 1550
				if(Util.estUnDepartement(codeLoc)) {
2568 aurelien 1551
					codeLocaliteM = codeLoc ;
1552
				} else {
1553
					paysM = codeLoc;
221 aurelien 1554
				}
1555
			}
1858 raphael 1556
		}
1557
		else {
2568 aurelien 1558
			champs = champs.replaceAll("localite", "");
216 aurelien 1559
		}
1858 raphael 1560
 
1561
		if(lieuDitModifie && ! lieudit.getRawValue().equals(VALEURS_MULTIPLES)) {
216 aurelien 1562
			lieuDitM = lieudit.getText();
1858 raphael 1563
		} else {
221 aurelien 1564
			champs = champs.replaceAll(":lieu-dit", "");
216 aurelien 1565
		}
1858 raphael 1566
 
1567
		if(stationModifiee && ! station.getRawValue().equals(VALEURS_MULTIPLES)) {
216 aurelien 1568
			stationM = station.getText();
1858 raphael 1569
		} else {
221 aurelien 1570
			champs = champs.replaceAll(":station", "");
216 aurelien 1571
		}
1572
 
1858 raphael 1573
		if(milieuModifie && ! milieu.getRawValue().equals(VALEURS_MULTIPLES)) {
216 aurelien 1574
			milieuM = milieu.getText();
1858 raphael 1575
		} else {
221 aurelien 1576
			champs = champs.replaceAll(":milieu", "");
216 aurelien 1577
		}
1578
 
1858 raphael 1579
		if(dateModifiee && ! date.getRawValue().equals(VALEURS_MULTIPLES)) {
216 aurelien 1580
			dateM = date.getRawValue();
681 aurelien 1581
			dateM = Util.remplacerSeparateursDateFormatCel(dateM);
1858 raphael 1582
		} else {
221 aurelien 1583
			champs = champs.replaceAll(":date", "");
216 aurelien 1584
		}
1585
 
1858 raphael 1586
		if(especeModifiee && ! espece.getRawValue().equals(VALEURS_MULTIPLES)) {
216 aurelien 1587
			especeM = espece.getText();
221 aurelien 1588
			numNomSelM = numeroNom;
1858 raphael 1589
		} else {
221 aurelien 1590
			champs = champs.replaceAll(":espece", "");
216 aurelien 1591
		}
1592
 
1858 raphael 1593
		if(commModifie && ! comment.getRawValue().equals(VALEURS_MULTIPLES)) {
216 aurelien 1594
			commM = comment.getText();
1858 raphael 1595
		} else {
2644 aurelien 1596
			champs = champs.replaceAll(":notes", "");
216 aurelien 1597
		}
1858 raphael 1598
 
1599
		if(latModifiee && ! latitude.getRawValue().equals(VALEURS_MULTIPLES)) {
264 aurelien 1600
			latM = latitude.getText();
1858 raphael 1601
		} else {
264 aurelien 1602
			champs = champs.replaceAll(":latitude", "");
1603
		}
1858 raphael 1604
 
1605
		if(altModifiee && ! altitude.getRawValue().equals(VALEURS_MULTIPLES)) {
1572 aurelien 1606
			altM = altitude.getText();
1858 raphael 1607
		} else {
1572 aurelien 1608
			champs = champs.replaceAll(":altitude", "");
1609
		}
1858 raphael 1610
 
1611
		if(longModifiee && ! longitude.getRawValue().equals(VALEURS_MULTIPLES)) {
264 aurelien 1612
			longM = longitude.getText();
1858 raphael 1613
		} else {
264 aurelien 1614
			champs = champs.replaceAll(":longitude", "");
1615
		}
1858 raphael 1616
 
1488 aurelien 1617
		if(abondanceModifiee && !selecteurAbondance.getRawValue().equals(VALEURS_MULTIPLES)) {
1618
			abondanceM = getAbondance();
1619
		} else {
1620
			champs = champs.replaceAll(":abondance", "");
1621
		}
1858 raphael 1622
 
1488 aurelien 1623
		if(certitudeModifiee && !selecteurCertitude.getRawValue().equals(VALEURS_MULTIPLES)) {
1624
			certitudeM = getCertitude();
1625
		} else {
1489 aurelien 1626
			champs = champs.replaceAll(":identification", "");
1488 aurelien 1627
		}
1858 raphael 1628
 
1542 aurelien 1629
		if(referentielTaxoModifie && !selecteurReferentielTaxo.getRawValue().equals(VALEURS_MULTIPLES)) {
1630
			referentielTaxoM = getReferentielTaxo();
1631
		} else {
1632
			champs = champs.replaceAll(":referentiel", "");
1633
		}
1858 raphael 1634
 
1542 aurelien 1635
		if(phenologieModifiee && !selecteurStadePheno.getRawValue().equals(VALEURS_MULTIPLES)) {
1636
			phenologieM = getPhenologie();
1637
		} else {
1638
			champs = champs.replaceAll(":phenologie", "");
1639
		}
2644 aurelien 1640
 
1641
		// TODO : trouver un meilleur système que ça pour gérer le message
1642
		// affiché
1643
		String[] champsSt = champs.split(":");
1644
		String champsTraduits = "";
1645
		for (int i = 0; i < champsSt.length; i++) {
1646
			// TODO: vérifier pourquoi des fois la chaîne est vide
1647
			// ou faire mieux, trouver un meilleur système comme écrit au dessus !
1648
			if(!champsSt[i].trim().isEmpty()) {
1649
				champsTraduits += Msg.get(champsSt[i]);
1650
				champsTraduits += (i != champsSt.length - 1) ? ", " : "";
1651
			}
221 aurelien 1652
		}
1858 raphael 1653
 
2644 aurelien 1654
		String[] stParams = {champsTraduits};
2637 aurelien 1655
		String message = Msg.get("question-modifier-champs-observation", stParams)+" ?" ;
1858 raphael 1656
 
216 aurelien 1657
		if(champs.trim().equals("")) {
2637 aurelien 1658
			Window.alert(Msg.get("indication-aucun-champ-modifie"));
216 aurelien 1659
		} else {
2568 aurelien 1660
			Observation obs = new Observation(especeM,numNomSelM,localiteM,codeLocaliteM,lieuDitM,stationM,milieuM, commM,dateM);
1661
			obs.setPays(paysM);
216 aurelien 1662
			obs.setNumeroOrdre(numeroOrdre);
971 aurelien 1663
			obs.setLatitude(latM);
1664
			obs.setLongitude(longM);
1572 aurelien 1665
			obs.setAltitude(altM);
1488 aurelien 1666
			obs.setAbondance(abondanceM);
1667
			obs.setCertitude(certitudeM);
2644 aurelien 1668
			// Afin de transmettre un ensemble cohérent on force aussi
1669
			// l'envoi du référentiel en cas de maj de l'espèce
1670
			if(especeModifiee) {
1671
				referentielTaxoM = getReferentielTaxo();
1672
			}
1542 aurelien 1673
			obs.setReferentielTaxo(referentielTaxoM);
1674
			obs.setPhenologie(phenologieM);
216 aurelien 1675
			if(Window.confirm(message)) {
1676
				observationMediateur.modifierObservationEnMasse(obs);
221 aurelien 1677
				reinitialiserValeurModifiees();
216 aurelien 1678
			}
1679
		}
1680
	}
1858 raphael 1681
 
1682
	private void supprimerObservation() {
216 aurelien 1683
		observationMediateur.supprimerObservation(this, numeroOrdre);
77 jpm 1684
	}
1858 raphael 1685
 
71 jpm 1686
	public void afficherDetailsObservation(Observation obs)
1687
	{
104 jpm 1688
		raz() ;
216 aurelien 1689
		String idLoc ;
1690
		if(obs.getIdentifiantLocalite() != VALEURS_MULTIPLES) {
1332 aurelien 1691
			idLoc = obs.getIdentifiantLocalite().replaceAll(" ","/");
216 aurelien 1692
			idLoc = idLoc.replaceAll("%","");
1693
			idLoc = idLoc.replaceAll("\"","");
1694
			idLoc = idLoc.replace('\\',' ');
1695
			idLoc = idLoc.trim();
1332 aurelien 1696
			if(idLoc.length() == 5) {
1697
				idLoc = idLoc.substring(0,2);
1698
			}
216 aurelien 1699
		} else {
1700
			idLoc = obs.getIdentifiantLocalite();
1332 aurelien 1701
			if(idLoc.length() == 5) {
1702
				idLoc = idLoc.substring(0,2);
1703
			}
216 aurelien 1704
		}
2568 aurelien 1705
 
1706
		if(obs.getIdentifiantLocalite().isEmpty() && !obs.getPays().isEmpty()) {
1707
			idLoc = obs.getPays();
1708
		}
1858 raphael 1709
 
221 aurelien 1710
		if(!obs.getDate().equals("null") && !obs.getDate().equals("000null") && !obs.getDate().equals(VALEURS_MULTIPLES)) {
71 jpm 1711
			String[] dateEtHeure = obs.getDate().split(" ", 2);
110 aurelien 1712
			if(verifierFormatDate(dateEtHeure[0])) {
1713
				date.setValue(dateEtHeure[0]) ;
1714
			}
1715
			else
1716
			{
1858 raphael 1717
				date.setRawValue("");
110 aurelien 1718
			}
221 aurelien 1719
		} else {
1720
			date.setRawValue(VALEURS_MULTIPLES);
1721
			date.clearInvalid();
71 jpm 1722
		}
1723
		if(!obs.getLieudit().equals("null") && !obs.getLieudit().equals("000null")) {
1724
			lieudit.setValue(obs.getLieudit()) ;
1725
		}
1726
		if(!obs.getStation().equals("null") && !obs.getStation().equals("000null")) {
1727
			station.setValue(obs.getStation()) ;
1728
		}
1729
		if(!obs.getMilieu().equals("null") && !obs.getMilieu().equals("000null")) {
1730
			milieu.setValue(obs.getMilieu()) ;
1731
		}
1732
		if(!obs.getCommentaire().equals("null") && !obs.getCommentaire().equals("000null")) {
461 aurelien 1733
 
681 aurelien 1734
			comment.setRawValue(Util.remplacerSautsDeligneMalEncodes(obs.getCommentaire()));
1858 raphael 1735
 
71 jpm 1736
		}
1737
		if(!obs.getLocalite().equals("null") && !obs.getLocalite().equals("000null")) {
962 aurelien 1738
			if(!idLoc.equals("000null") && !idLoc.equals("")) {
221 aurelien 1739
				if(!idLoc.equals(VALEURS_MULTIPLES)) {
2568 aurelien 1740
					localite.setValue(obs.getLocalite()+" ("+idLoc+")") ;
221 aurelien 1741
				} else {
2568 aurelien 1742
					localite.setValue(VALEURS_MULTIPLES);
221 aurelien 1743
				}
140 aurelien 1744
			}
1745
			else
1746
			{
2568 aurelien 1747
				localite.setValue(obs.getLocalite());
140 aurelien 1748
			}
71 jpm 1749
		}
1750
		if(!obs.getIdentifiantLocalite().equals("null") && !obs.getIdentifiantLocalite().equals("000null")) {
2568 aurelien 1751
			codeLocalite = idLoc;
71 jpm 1752
		}
1753
		if(!obs.getNomSaisi().equals("null") && !obs.getNomSaisi().equals("000null")) {
1754
			espece.setValue(obs.getNomSaisi()) ;
1755
		}
1756
		if(!obs.getNumeroNomenclaturalSaisi().equals("null") && !obs.getNumeroNomenclaturalSaisi().equals("000null")) {
1757
			numeroNom = obs.getNumeroNomenclaturalSaisi() ;
1758
		}
1332 aurelien 1759
		if(!obs.getNumeroOrdre().equals("null") && !obs.getNumeroOrdre().equals("000null")) {
74 david 1760
			numeroOrdre = obs.getNumeroOrdre() ;
1761
		}
1858 raphael 1762
 
1572 aurelien 1763
		if(doitAfficherLatLon(obs)) {
1764
			latitude.setValue(Util.formaterNombre(obs.getLatitude())) ;
1765
			longitude.setValue(Util.formaterNombre(obs.getLongitude())) ;
391 aurelien 1766
		}
1858 raphael 1767
 
1572 aurelien 1768
		if(!obs.getAltitude().isEmpty() && !obs.getAltitude().equals("null") && !obs.getAltitude().equals("000null")) {
1769
			altitude.setValue(Util.formaterNombre(obs.getAltitude())) ;
1770
		}
1858 raphael 1771
 
1488 aurelien 1772
		selecteurAbondance.getStore().load();
1773
		selecteurAbondance.setValue(obs.getAbondance());
1858 raphael 1774
 
1488 aurelien 1775
		selecteurCertitude.getStore().load();
1776
		selecteurCertitude.setValue(obs.getCertitude());
1858 raphael 1777
 
1542 aurelien 1778
		selecteurStadePheno.getStore().load();
1779
		selecteurStadePheno.setValue(obs.getPhenologie());
1858 raphael 1780
 
1542 aurelien 1781
		selecteurReferentielTaxo.getStore().load();
1782
		if(obs.getReferentielTaxo() != VALEURS_MULTIPLES) {
1783
			referentielTaxo = obs.getCodeCourtReferentielTaxo();
1559 aurelien 1784
			if(referentielTaxo == null || referentielTaxo.isEmpty()) {
1785
			    referentielTaxo = Configuration.getReferentielsDispos().get(0).getCode();
1786
			}
1542 aurelien 1787
			selecteurReferentielTaxo.setValue(referentielTaxo);
1788
		} else {
1789
			referentielTaxo = "";
1790
			selecteurReferentielTaxo.setRawValue(VALEURS_MULTIPLES);
1791
		}
1858 raphael 1792
 
1940 aurelien 1793
		afficherChampsEtendus(obs.getChampsEtendus(), null);
71 jpm 1794
	}
1858 raphael 1795
 
1572 aurelien 1796
	private boolean doitAfficherLatLon(Observation obs) {
1797
		return !obs.getLatitude().isEmpty() &&
1858 raphael 1798
				!obs.getLatitude().equals("null") &&
1572 aurelien 1799
				!obs.getLatitude().equals("000null") &&
1858 raphael 1800
				!Util.estZero(obs.getLatitude()) &&
1801
				!obs.getLongitude().isEmpty() &&
1802
				!obs.getLongitude().equals("null") &&
1572 aurelien 1803
				!obs.getLongitude().equals("000null") &&
1804
				!Util.estZero(obs.getLongitude());
1805
	}
1858 raphael 1806
 
1549 aurelien 1807
	private void viderChampsEtendus() {
1808
		if(listeChampsEtendus != null) {
1809
			for (Iterator<String> it = listeChampsEtendus.keySet().iterator(); it.hasNext();) {
2602 aurelien 1810
				ChampSaisieEtendu champEtendu = listeChampsEtendus.get(it.next());
1549 aurelien 1811
				champEtendu.destroy();
1812
			}
1597 aurelien 1813
			if(conteneurChampEtenduGauche != null && conteneurChampEtenduDroite != null) {
1814
				conteneurChampEtenduGauche.clear();
1815
				conteneurChampEtenduDroite.clear();
1816
				panneauPremierColonne.remove(conteneurChampEtenduGauche);
1817
				panneauSecondeColonne.remove(conteneurChampEtenduDroite);
1818
			}
1549 aurelien 1819
			listeChampsEtendus = null;
1820
		}
1821
	}
1858 raphael 1822
 
1940 aurelien 1823
	private void afficherChampsEtendus(Map<String, ChampEtendu> champsEtendus, ChampEtendu champsAFocus) {
2392 aurelien 1824
		champsEtendus = Util.trierListeChampsEtendus(champsEtendus);
1549 aurelien 1825
		viderChampsEtendus();
1858 raphael 1826
 
1810 aurelien 1827
		FormLayout flmd = new FormLayout();
1828
		flmd.setLabelWidth(150);
1858 raphael 1829
 
1810 aurelien 1830
		FormLayout flmg = new FormLayout();
1831
		flmg.setLabelWidth(150);
1858 raphael 1832
 
1810 aurelien 1833
		conteneurChampEtenduGauche = new Panel();
1834
		conteneurChampEtenduGauche.setLayout(flmg);
1835
		conteneurChampEtenduDroite = new Panel();
1836
		conteneurChampEtenduDroite.setLayout(flmd);
1858 raphael 1837
 
1810 aurelien 1838
		conteneurChampEtenduGauche.setAutoWidth(true);
1839
		conteneurChampEtenduGauche.setStyle("conteneurChampsEtendus");
1840
		conteneurChampEtenduGauche.setBodyBorder(false);
1841
		conteneurChampEtenduDroite.setAutoWidth(true);
1842
		conteneurChampEtenduDroite.setStyle("conteneurChampsEtendus");
1843
		conteneurChampEtenduDroite.setBodyBorder(false);
1858 raphael 1844
 
1810 aurelien 1845
		// pour corriger le décalage sur le panneau induit par le lien d'affichage
1940 aurelien 1846
		conteneurChampEtenduDroite.setPaddings(42, 0, 0, 0);
1858 raphael 1847
 
1940 aurelien 1848
		if(champsEtendus != null && champsEtendus.size() > 0) {
1597 aurelien 1849
			lienAfficherChampsEtendus.setVisible(true);
1940 aurelien 1850
			listeChampsEtendus = new HashMap<String, ChampSaisieEtendu>(champsEtendus.size());
2392 aurelien 1851
			HashMap<String, String> correspondancesClesLabel = ListeReferentielChampsEtendusDAO.cacheClesLabels;
1810 aurelien 1852
			boolean gauche = true;
1940 aurelien 1853
			for (Iterator<String> iterator = champsEtendus.keySet().iterator(); iterator.hasNext();) {
2392 aurelien 1854
 
1810 aurelien 1855
				String id = iterator.next();
1940 aurelien 1856
				ChampEtendu champ = champsEtendus.get(id);
2392 aurelien 1857
 
1810 aurelien 1858
				String valeur = champ.getValeur();
2392 aurelien 1859
				String label = id;
1860
 
1861
				// Si le champ possède un clé déjà définie par le catalogue, elle lui sera affectée
1862
				// sinon on la formate en la "déchamotant" et en ajoutant des espaces
1863
				if(correspondancesClesLabel.containsKey(id)) {
1864
					label = correspondancesClesLabel.get(id);
1865
				} else {
1866
					label = Util.formaterCleChampsEtenduPourAffichage(label);
1867
				}
1858 raphael 1868
 
2602 aurelien 1869
				ChampSaisieEtendu champTexteEtendu = new ChampSaisieEtendu(label, id, ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(id));
1940 aurelien 1870
				if(champ.equals(champsAFocus)) {
1871
					champTexteEtendu.focus();
1872
				}
2392 aurelien 1873
 
1810 aurelien 1874
				champTexteEtendu.setId(id);
1875
				champTexteEtendu.setValue(valeur);
1876
				if(gauche) {
1877
					conteneurChampEtenduGauche.add(champTexteEtendu);
1878
				} else {
1879
					conteneurChampEtenduDroite.add(champTexteEtendu);
1549 aurelien 1880
				}
1810 aurelien 1881
				listeChampsEtendus.put(id, champTexteEtendu);
1882
				gauche = !gauche;
1883
			}
1858 raphael 1884
 
1597 aurelien 1885
			panneauPremierColonne.add(conteneurChampEtenduGauche);
1886
			panneauSecondeColonne.add(conteneurChampEtenduDroite);
1858 raphael 1887
 
1597 aurelien 1888
			if(!afficherChampsEtendus) {
1889
				conteneurChampEtenduGauche.setVisible(false);
1890
				conteneurChampEtenduDroite.setVisible(false);
2602 aurelien 1891
			} else {
1892
				redimensionnerChampsEtendus();
1549 aurelien 1893
			}
1597 aurelien 1894
		} else {
1895
			lienAfficherChampsEtendus.setVisible(false);
1549 aurelien 1896
		}
1897
		doLayout();
1898
	}
2602 aurelien 1899
 
1900
	private void redimensionnerChampsEtendus() {
1901
		int largeur = conteneurChampEtenduGauche.getWidth();
1902
		if(largeur <= 0) {
1903
			Timer t = new Timer() {
1904
				@Override
1905
				public void run() {
1906
					redimensionnerChampsEtendus();
1907
				}
1908
			};
1909
			t.schedule(150);
1910
		} else {
1911
			for (Iterator<String> iterator = listeChampsEtendus.keySet().iterator(); iterator
1912
					.hasNext();) {
1913
				ChampSaisieEtendu ch = listeChampsEtendus.get(iterator.next());
2603 aurelien 1914
				ch.redimensionner(largeur - 15);
1915
				if(ch.getFieldWidth() < ch.getLabelWidth()) {
1916
					ch.addClass("panneauModePetiteLargeur");
1917
					ch.agrandirChamp(largeur - 82);
1918
				} else {
1919
					//ch.removeClass("panneauModePetiteLargeur");
1920
				}
2602 aurelien 1921
			}
1922
		}
1923
	}
1858 raphael 1924
 
1572 aurelien 1925
	private Map<String, ChampEtendu> getValeursChampsEtendus() {
1926
		Map<String, ChampEtendu> valeursChampsEtendus = new HashMap<String, ChampEtendu>();
1549 aurelien 1927
		if(listeChampsEtendus != null) {
1928
			for (Iterator<String> it = listeChampsEtendus.keySet().iterator(); it.hasNext();) {
1572 aurelien 1929
				String cle = it.next();
2602 aurelien 1930
				ChampSaisieEtendu champTexteEtendu = listeChampsEtendus.get(cle);
1931
				String label = champTexteEtendu.getLabel();
1932
				String valeur = champTexteEtendu.getRawValue();
1572 aurelien 1933
				ChampEtendu champEtendu = new ChampEtendu(cle, label, valeur);
1934
				valeursChampsEtendus.put(cle, champEtendu);
1549 aurelien 1935
			}
1936
		}
1937
		return valeursChampsEtendus;
1938
	}
1858 raphael 1939
 
104 jpm 1940
	public void raz()
71 jpm 1941
	{
118 david 1942
		raz(Champs.TOUT);
1858 raphael 1943
 
118 david 1944
	}
1945
	public void raz(Champs champs)
1946
	{
1947
		switch (champs) {
1948
			case DATE:
1949
				date.reset() ;
1950
				break;
1858 raphael 1951
 
118 david 1952
			case LIEUDIT:
1953
				lieudit.reset() ;
1954
				break;
1858 raphael 1955
 
118 david 1956
			case STATION:
1957
				station.reset() ;
1958
				break;
1858 raphael 1959
 
118 david 1960
			case MILIEU:
1961
				milieu.reset() ;
1962
				break;
1858 raphael 1963
 
118 david 1964
			case COMMENT:
1965
				comment.reset() ;
1966
				break;
1967
 
2568 aurelien 1968
			case LOCALITE:
1969
				localite.reset() ;
1970
				codeLocalite ="";
1971
				pays="";
268 aurelien 1972
				latitude.reset();
1973
				longitude.reset();
118 david 1974
				break;
1858 raphael 1975
 
118 david 1976
			case ESPECE:
1977
				espece.reset();
1978
				numeroNom = "" ;
1979
				numeroOrdre = "";
1980
				break;
1858 raphael 1981
 
264 aurelien 1982
			case LATITUDE:
1983
				latitude.reset();
2568 aurelien 1984
				afficherIndicationlocalite(null);
264 aurelien 1985
				break;
1858 raphael 1986
 
264 aurelien 1987
			case LONGITUDE:
1988
				longitude.reset();
2568 aurelien 1989
				afficherIndicationlocalite(null);
264 aurelien 1990
				break;
1858 raphael 1991
 
1572 aurelien 1992
			case ALTITUDE:
1993
				altitude.reset();
1994
				break;
1858 raphael 1995
 
1488 aurelien 1996
			case ABONDANCE:
1997
				selecteurAbondance.setValue("");
1998
				break;
1858 raphael 1999
 
1488 aurelien 2000
			case CERTITUDE:
2001
				selecteurCertitude.setValue("");
2002
				break;
1858 raphael 2003
 
1542 aurelien 2004
			case REFERENTIELTAXO:
2005
				selecteurReferentielTaxo.setValue("");
2006
				break;
1858 raphael 2007
 
1542 aurelien 2008
			case PHENOLOGIE:
2009
				selecteurStadePheno.setValue("");
2010
				break;
1858 raphael 2011
 
118 david 2012
			case TOUT:
2568 aurelien 2013
				localite.reset();
118 david 2014
				date.reset() ;
2015
				lieudit.reset() ;
2016
				station.reset() ;
2017
				milieu.reset() ;
2018
				comment.reset() ;
2019
				milieu.reset() ;
248 aurelien 2020
				latitude.reset();
2021
				longitude.reset();
1572 aurelien 2022
				altitude.reset();
2568 aurelien 2023
				pays="";
2024
				codeLocalite ="";
118 david 2025
				espece.reset();
1488 aurelien 2026
				selecteurAbondance.clearValue();
2027
				selecteurCertitude.clearValue();
1542 aurelien 2028
				selecteurReferentielTaxo.clearValue();
2029
				selecteurStadePheno.clearValue();
2030
				referentielTaxo = "";
118 david 2031
				numeroNom = "" ;
2032
				numeroOrdre = "";
2568 aurelien 2033
				afficherIndicationlocalite(null);
118 david 2034
				break;
2035
 
2036
		}
1858 raphael 2037
 
71 jpm 2038
	}
1858 raphael 2039
 
110 aurelien 2040
	public boolean verifierFormatDate(String date) {
1858 raphael 2041
 
132 aurelien 2042
		String regex = "[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}" ;
110 aurelien 2043
		if(date.matches(regex) && !date.equals("0000-00-00")) {
2044
			return true ;
2045
		}
2046
		else {
2047
			return false;
2048
		}
2049
	}
216 aurelien 2050
 
1641 aurelien 2051
	public void setSelectionMultiple(boolean selectionMultiple) {
2052
		this.selectionMultiple = selectionMultiple;
2053
		if(!selectionMultiple) {
2634 aurelien 2054
			boutonReinitialiser.enable();
1641 aurelien 2055
			boutonOK.enable();
2056
		} else {
2634 aurelien 2057
			boutonReinitialiser.disable();
1641 aurelien 2058
			boutonOK.disable();
216 aurelien 2059
		}
2060
	}
1858 raphael 2061
 
1641 aurelien 2062
	public boolean getSelectionMultiple() {
2063
		return selectionMultiple;
2064
	}
1858 raphael 2065
 
216 aurelien 2066
	private void calculerAfficherDifferences(ListeObservation listeObs) {
1858 raphael 2067
 
2568 aurelien 2068
		String codeLocalite = null;
2069
		String pays = null;
2070
		String localite = null;
216 aurelien 2071
		String lieuDit = null;
2072
		String station = null;
2073
		String milieu = null;
2074
		String espece = null;
2075
		String date = null;
2076
		String notes = null;
264 aurelien 2077
		String lat = null;
2078
		String lon = null;
1572 aurelien 2079
		String alt = null;
1488 aurelien 2080
		String abondance = null;
2081
		String certitude = null;
1542 aurelien 2082
		String referentielTaxo = null;
2083
		String phenologie = null;
1858 raphael 2084
 
216 aurelien 2085
		String ordreObs = "";
1858 raphael 2086
 
216 aurelien 2087
		for(Iterator<String> it = listeObs.keySet().iterator();it.hasNext();) {
2088
			Observation obsEnCours = listeObs.get(it.next());
2568 aurelien 2089
			pays = comparerDifferencesChamps(pays, obsEnCours.getPays());
2090
			codeLocalite = comparerDifferencesChamps(codeLocalite, obsEnCours.getIdentifiantLocalite());
2091
			localite = comparerDifferencesChamps(localite, obsEnCours.getLocalite());
216 aurelien 2092
			lieuDit = comparerDifferencesChamps(lieuDit, obsEnCours.getLieudit());
2093
			station = comparerDifferencesChamps(station, obsEnCours.getStation());
2094
			milieu = comparerDifferencesChamps(milieu, obsEnCours.getMilieu());
1858 raphael 2095
			espece = comparerDifferencesChamps(espece, obsEnCours.getNomSaisi());
216 aurelien 2096
			date = comparerDifferencesChamps(date, obsEnCours.getDate());
2097
			notes = comparerDifferencesChamps(notes, obsEnCours.getCommentaire());
962 aurelien 2098
			lat = comparerDifferencesChamps(lat, obsEnCours.getLatitude());
2099
			lon = comparerDifferencesChamps(lon, obsEnCours.getLongitude());
1572 aurelien 2100
			alt = comparerDifferencesChamps(alt, obsEnCours.getAltitude());
1488 aurelien 2101
			abondance = comparerDifferencesChamps(abondance, obsEnCours.getAbondance());
2102
			certitude = comparerDifferencesChamps(certitude, obsEnCours.getCertitude());
1542 aurelien 2103
			referentielTaxo = comparerDifferencesChamps(referentielTaxo, obsEnCours.getReferentielTaxo());
2104
			phenologie = comparerDifferencesChamps(phenologie, obsEnCours.getPhenologie());
1858 raphael 2105
 
216 aurelien 2106
			ordreObs += obsEnCours.getNumeroOrdre()+",";
2107
		}
1858 raphael 2108
 
2568 aurelien 2109
		Observation obs=new Observation(espece,numeroNom,localite,codeLocalite,lieuDit,station,milieu, notes,date);
2110
		obs.setPays(pays);
216 aurelien 2111
		obs.setNumeroOrdre(ordreObs);
971 aurelien 2112
		obs.setLatitude(lat);
2113
		obs.setLongitude(lon);
1572 aurelien 2114
		obs.setAltitude(alt);
1488 aurelien 2115
		obs.setAbondance(abondance);
2116
		obs.setCertitude(certitude);
1542 aurelien 2117
		obs.setReferentielTaxo(referentielTaxo);
2118
		obs.setPhenologie(phenologie);
1858 raphael 2119
		afficherDetailsObservation(obs);
216 aurelien 2120
	}
1858 raphael 2121
 
216 aurelien 2122
	private String comparerDifferencesChamps(String valeurActuelle, String nouvelleValeur) {
1858 raphael 2123
 
2539 aurelien 2124
		String retour = "";
1858 raphael 2125
 
216 aurelien 2126
			if(valeurActuelle == null) {
2127
				retour = nouvelleValeur;
2128
			} else {
2129
				if(valeurActuelle.equals(nouvelleValeur)) {
2130
					retour = valeurActuelle;
2131
				} else {
2132
					retour = VALEURS_MULTIPLES;
2133
				}
2134
			}
2135
		return retour;
2136
	}
1858 raphael 2137
 
2138
	private void reinitialiserValeurModifiees() {
2568 aurelien 2139
		localiteModifiee = false;
221 aurelien 2140
		lieuDitModifie = false;
2141
		stationModifiee = false;
216 aurelien 2142
		milieuModifie = false;
2143
		dateModifiee = false;
2144
		especeModifiee = false;
2145
		commModifie = false;
264 aurelien 2146
		latModifiee = false;
2147
		longModifiee = false;
1572 aurelien 2148
		altModifiee = false;
1488 aurelien 2149
		abondanceModifiee = false;
2150
		certitudeModifiee = false;
1542 aurelien 2151
		referentielTaxoModifie = false;
2152
		phenologieModifiee = false;
216 aurelien 2153
	}
1858 raphael 2154
 
248 aurelien 2155
	public void saisieTabindex()
2156
	{
2568 aurelien 2157
		localite.setTabIndex(1);
268 aurelien 2158
		lieudit.setTabIndex(3);
2159
		station.setTabIndex(4);
2160
		milieu.setTabIndex(5);
248 aurelien 2161
		coordonnees.setTabIndex(-1);
2162
		coordonnees.addListener(new TextFieldListenerAdapter() {
2163
 
1292 aurelien 2164
			@Override
248 aurelien 2165
			public void onFocus(Field field) {
2166
				if(coordPanel.isVisible()) {
264 aurelien 2167
					latitude.focus();
248 aurelien 2168
				} else {
2169
					Ext.get("lien_carto").focus();
2170
				}
1858 raphael 2171
			}
248 aurelien 2172
		});
1858 raphael 2173
 
681 aurelien 2174
		latitude.setTabIndex(8);
2175
		longitude.setTabIndex(9);
1572 aurelien 2176
		altitude.setTabIndex(10);
2177
		comment.setTabIndex(11);
2178
		date.setTabIndex(12);
2179
		espece.setTabIndex(13);
2180
		selecteurCertitude.setTabIndex(14);
2181
		selecteurAbondance.setTabIndex(15);
2182
		selecteurStadePheno.setTabIndex(16);
2183
		boutonOK.setTabIndex(17);
2634 aurelien 2184
		boutonReinitialiser.setTabIndex(18);
1858 raphael 2185
 
248 aurelien 2186
	}
1858 raphael 2187
 
248 aurelien 2188
	private void obtenirInformationCoord() {
2189
		if(coordonneesValides() != null) {
1958 aurelien 2190
			observationMediateur.obtenirInformationCoord(coordonneesValides()[0],coordonneesValides()[1]);
248 aurelien 2191
		} else {
2553 mathias 2192
			// Centrage de la carte sur une zone correspondant plus ou moins au référentiel.
2193
			// En dur car la config est tellement mal foutue que j'ai envie de me pendre.
2194
			String referentiel = this.getReferentielTaxo();
2195
			String referentielRacine = referentiel.substring(0, referentiel.indexOf(':'));
2196
			Double lat = null, lon = null;
2197
			int zoom = 6;
2198
			switch(referentielRacine) {
2594 aurelien 2199
				case "bdtre" :
2200
					lat = -21.10;
2201
					lon = 55.30;
2202
					zoom = 7;
2203
				break;
2553 mathias 2204
				case "isfan" :
2205
					lat = 29.28358;
2206
					lon = 10.21884;
2207
					zoom = 5;
2208
					break;
2209
				case "apd" :
2210
					lat = 8.75624;
2211
					lon = 1.80176;
2212
					zoom = 5;
2213
					break;
2214
				case "bdtxa" :
2215
					lat = 14.6;
2216
					lon = -61.08334;
2217
					zoom = 7;
2218
					break;
2558 aurelien 2219
				case "lbf" :
2220
					lat = 33.53;
2221
					lon = 35.30;
2222
					zoom = 7;
2223
					break;
2553 mathias 2224
				case "bdtfx" :
2225
				default:
2226
					lat = 47.0504;
2227
					lon = 2.2347;
2228
					zoom = 6;
2229
			}
2230
			if (lat != null && lon != null) {
2231
				// centrage sur la zone
2232
				EntiteGeographiqueObservation infos = new EntiteGeographiqueObservation();
2233
				infos.setLon("" + lon);
2234
				infos.setLat("" + lat);
2235
				infos.setZoom(zoom);
2236
				observationMediateur.rafraichirFenetreCartoSurPoint(infos);
2237
			} else {
2238
				// affichage par défaut au cas où on n'aurait pas trouvé de coordonnées pour centrer
2239
				observationMediateur.afficherFenetreCarto();
2240
			}
248 aurelien 2241
		}
2242
	}
1858 raphael 2243
 
2568 aurelien 2244
	private void obtenirInformationLocalite() {
2695 aurelien 2245
		String idLoc = obtenirIdLocalite();
2246
		observationMediateur.obtenirInformationLocalite(getlocaliteSansIdLoc(), idLoc);
2247
	}
2248
 
2249
	private String obtenirIdLocalite() {
2558 aurelien 2250
		String idLoc = "";
2695 aurelien 2251
 
2252
		// Soit un numéro de département, soit un code de pays à deux lettres
2253
		String[] codeCom = localite.getText().split(" ");
2254
		if(codeCom.length > 1 && ressembleAUnCodePaysOuDepartement(codeCom[codeCom.length - 1])) {
2255
			String codeLoc = codeCom[codeCom.length - 1].replace('(', ' ');
2256
			codeLoc = codeLoc.replace(')', ' ').trim().replace('\\',' ').trim();
2257
 
2258
			if(Util.estUnNombre(codeLoc)) {
2259
				idLoc = codeLoc ;
2260
			} else {
2261
				idLoc = codeLoc.toUpperCase();
2558 aurelien 2262
			}
2263
		}
2695 aurelien 2264
 
2265
		return idLoc;
248 aurelien 2266
	}
1858 raphael 2267
 
391 aurelien 2268
	public double[] coordonneesValides() {
248 aurelien 2269
		try {
1858 raphael 2270
 
248 aurelien 2271
			double lat = Double.parseDouble(latitude.getValueAsString().replaceAll(",", "."));
2272
			double lon = Double.parseDouble(longitude.getValueAsString().replaceAll(",", "."));
1858 raphael 2273
 
248 aurelien 2274
			double[] coord = {lat, lon};
2275
			return coord;
1858 raphael 2276
 
248 aurelien 2277
		} catch (NumberFormatException ne) {
2278
			return null;
2279
		}
2280
	}
1858 raphael 2281
 
264 aurelien 2282
	private String[] getValeurCoordonnees() {
2283
		double[] coDouble = coordonneesValides();
1858 raphael 2284
 
264 aurelien 2285
		if(coDouble != null) {
2286
			String[] coord = {coDouble[0]+"",coDouble[1]+""};
2287
			return coord;
2288
		} else {
2539 aurelien 2289
			String[] coord = {"","" };
264 aurelien 2290
			return coord;
2291
		}
2292
	}
1858 raphael 2293
 
2568 aurelien 2294
	public String getlocalite() {
1858 raphael 2295
 
2568 aurelien 2296
		String valeurlocalite = "";
1858 raphael 2297
 
2609 aurelien 2298
		if(localite.getText() != null) {
2299
			valeurlocalite = localite.getText();
656 aurelien 2300
		}
2568 aurelien 2301
		return valeurlocalite;
268 aurelien 2302
	}
1858 raphael 2303
 
2568 aurelien 2304
	public String getlocaliteSansIdLoc() {
2305
		return Util.supprimerChaineIdLocalite(getlocalite());
268 aurelien 2306
	}
1858 raphael 2307
 
1542 aurelien 2308
	private String getValeurChampListeLibre(ComboBox champ) {
2309
		String valeurChamp = champ.getValue();
2310
		String valeurChampBrute = champ.getRawValue();
1858 raphael 2311
 
1488 aurelien 2312
		// Test idiot qui permet de savoir si l'on utilise la valeur saisie directement ou bien la valeur
1858 raphael 2313
		// selectionnee car lors du setValue sur le keypress, gwtext ne prends pas en compte le dernier
1488 aurelien 2314
		// caractère
1559 aurelien 2315
		if(valeurChampBrute.trim().length() == 0) {
2316
			valeurChamp = "";
2317
		} else {
2318
			if(valeurChamp != null && valeurChamp.length() > 0) {
2319
				if(valeurChamp.equals(valeurChampBrute.substring(0, valeurChampBrute.length() -1))) {
2320
					valeurChamp = champ.getRawValue();
2321
				}
1542 aurelien 2322
			}
1488 aurelien 2323
		}
1542 aurelien 2324
		return valeurChamp;
1488 aurelien 2325
	}
1542 aurelien 2326
 
2327
	public String getAbondance() {
2328
		return getValeurChampListeLibre(selecteurAbondance);
2329
	}
1858 raphael 2330
 
1488 aurelien 2331
	public String getCertitude() {
1542 aurelien 2332
		return getValeurChampListeLibre(selecteurCertitude);
1488 aurelien 2333
	}
1858 raphael 2334
 
1542 aurelien 2335
	public String getPhenologie() {
2336
		return getValeurChampListeLibre(selecteurStadePheno);
2337
	}
1858 raphael 2338
 
1542 aurelien 2339
	public String getReferentielTaxo() {
2340
		String codeCourt = getValeurChampListeLibre(selecteurReferentielTaxo);
2341
		return Ontologies.getInfosReferentielNomParCode(codeCourt).getCodeVersionComplet();
2342
	}
268 aurelien 2343
 
2568 aurelien 2344
	public boolean localiteInitialisee() {
2345
		return localiteModifiee;
268 aurelien 2346
	}
1858 raphael 2347
 
318 aurelien 2348
	public void redimensionnerFormulaire() {
681 aurelien 2349
		afficherFormulaireLatLon.setWidth(panneauIntermediaire.getWidth()+"px");
2350
		panneauPremierColonne.doLayout();
2351
		panneauSecondeColonne.doLayout();
2352
		panneauIntermediaire.doLayout();
1858 raphael 2353
 
708 aurelien 2354
		doLayout();
318 aurelien 2355
	}
2695 aurelien 2356
 
2357
	private void verifierPresenceTaxonSaisi() {
2358
		affecterCodeLocaliteOuPays();
2359
		if(!enRequeteChrologie && !codeLocalite.isEmpty() && numeroNom != null && !numeroNom.isEmpty()) {
2360
			enRequeteChrologie = true;
2361
			// Pour le moment, si on a un code localité, c'est qu'on est en France
2362
			final String paysStr = pays.isEmpty() ? "FR" : pays;
2363
			final String cleCache = numeroNom.trim()+paysStr.trim()+codeLocalite.trim();
2364
 
2365
			// Pour éviter de vérifier et d'afficher plus d'une fois l'avertissement de présence
2366
			if(!avertissementPresence.containsKey(numeroNom.trim()+paysStr.trim()+codeLocalite.trim())) {
2367
				// Pour l'instant c'est toujours France mais il serait bon un jour d'avoir une chorologie multi pays.
2368
				// donc ça ne coute rien de le gérer déjà ici dans l'interface
2369
				ImageInformationRepartitionAsynchroneDAO.taxonEstPresentDansZoneGeo(referentielTaxo, numeroNom, paysStr, codeLocalite, new Callback<String, String>() {
2370
					@Override
2371
					public void onSuccess(String result) {
2372
 
2373
						// En cas d'absence d'infos sur la zone le service retourne "" (chaîne vide)
2374
						// En cas de non signalement dans la zone, il retourne 0,
2375
						// En cas de présence, il retourne 1
2376
						if(result.equals("0")) {
2377
							// L'absence explicite est le seul cas qui nous interesse
2378
							String[] stParams = {espece.getText(), codeLocalite, Configuration.getChorologieAvertissementCourriel()};
2379
							String message = Msg.get("indication-premiere-presence", stParams);
2380
 
2381
							Window.alert(message);
2382
						}
2383
 
2384
						avertissementPresence.put(cleCache, result);
2385
						enRequeteChrologie = false;
2386
					}
2387
 
2388
					@Override
2389
					public void onFailure(String reason) {
2390
						enRequeteChrologie = false;
2391
					}
2392
				});
2724 aurelien 2393
			} else {
2394
				enRequeteChrologie = false;
2695 aurelien 2395
			}
2396
		}
2397
	}
12 david 2398
}