Rev 962 | Blame | Last modification | View Log | RSS feed
package org.tela_botanica.client.vues.observation;// TODO Detecter redim et supprimer ajusterimport java.util.Date;import java.util.Iterator;import org.tela_botanica.client.CarnetEnLigneMediateur;import org.tela_botanica.client.interfaces.Rafraichissable;import org.tela_botanica.client.modeles.Configuration;import org.tela_botanica.client.modeles.EntiteGeographiqueObservation;import org.tela_botanica.client.modeles.ListeObservation;import org.tela_botanica.client.modeles.ListeReferentielCommune;import org.tela_botanica.client.modeles.ListeReferentielNom;import org.tela_botanica.client.modeles.ListeReferentielPerso;import org.tela_botanica.client.modeles.Observation;import org.tela_botanica.client.modeles.ReferentielCommune;import org.tela_botanica.client.modeles.ReferentielNom;import org.tela_botanica.client.modeles.ListeReferentielPerso.TypesReferentiels;import org.tela_botanica.client.observation.ObservationMediateur;import org.tela_botanica.client.util.AutoCompletionRefComboBox;import org.tela_botanica.client.util.Util;import com.google.gwt.core.client.GWT;import com.google.gwt.core.client.JavaScriptObject;import com.google.gwt.event.dom.client.KeyPressEvent;import com.google.gwt.maps.client.geom.LatLng;import com.google.gwt.user.client.Timer;import com.google.gwt.user.client.Window;import com.google.gwt.user.client.ui.HTML;import com.gwtext.client.core.EventCallback;import com.gwtext.client.core.EventObject;import com.gwtext.client.core.Ext;import com.gwtext.client.core.ExtElement;import com.gwtext.client.core.Function;import com.gwtext.client.core.ListenerConfig;import com.gwtext.client.core.Position;import com.gwtext.client.data.ArrayReader;import com.gwtext.client.data.FieldDef;import com.gwtext.client.data.MemoryProxy;import com.gwtext.client.data.RecordDef;import com.gwtext.client.data.SimpleStore;import com.gwtext.client.data.Store;import com.gwtext.client.data.StringFieldDef;import com.gwtext.client.widgets.BoxComponent;import com.gwtext.client.widgets.Button;import com.gwtext.client.widgets.Component;import com.gwtext.client.widgets.Container;import com.gwtext.client.widgets.DatePicker;import com.gwtext.client.widgets.Panel;import com.gwtext.client.widgets.ToolTip;import com.gwtext.client.widgets.Toolbar;import com.gwtext.client.widgets.event.ButtonListenerAdapter;import com.gwtext.client.widgets.event.ContainerListenerAdapter;import com.gwtext.client.widgets.event.DatePickerListenerAdapter;import com.gwtext.client.widgets.event.PanelListenerAdapter;import com.gwtext.client.widgets.form.ComboBox;import com.gwtext.client.widgets.form.DateField;import com.gwtext.client.widgets.form.Field;import com.gwtext.client.widgets.form.FormPanel;import com.gwtext.client.widgets.form.Label;import com.gwtext.client.widgets.form.MultiFieldPanel;import com.gwtext.client.widgets.form.TextArea;import com.gwtext.client.widgets.form.TextField;import com.gwtext.client.widgets.form.event.ComboBoxCallback;import com.gwtext.client.widgets.form.event.ComboBoxListener;import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;import com.gwtext.client.widgets.form.event.TextFieldListener;import com.gwtext.client.widgets.form.event.TextFieldListenerAdapter;import com.gwtext.client.widgets.layout.AnchorLayoutData;import com.gwtext.client.widgets.layout.ColumnLayout;import com.gwtext.client.widgets.layout.ColumnLayoutData;import com.gwtext.client.widgets.layout.FormLayout;import com.gwtext.client.widgets.layout.RowLayout;import com.gwtext.client.data.Record;/*** Panneau contenant les infos, les métadonnées et l'arbre des mots clés, il implémente l'interface rafraichissable* @author aurelien**/public class FormulaireSaisieObservationVue extends Panel implements Rafraichissable {/*** Le médiateur associé à la vue*/private ObservationMediateur observationMediateur = null;FormPanel panneauFormulaire = null;private DateField date = null;private ComboBox lieudit = null;private ComboBox station = null;private ComboBox milieu = null;private TextField comment = null;private ComboBox commune = null;private String departement = null;private ComboBox espece = null;private String numeroNom = null;private String numeroOrdre = null;private String codeInseeCommune = null;private String referentielGeo = null;// Pour remise a zero partielle lors d'une validationprivate enum Champs {DATE, LIEUDIT, STATION, MILIEU, COMMENT, COMMUNE, ESPECE, TOUT, LATITUDE, LONGITUDE ;public String toString() {switch(this) {case DATE:return "date";case COMMUNE:return "commune";case LIEUDIT:return "lieu dit";case STATION:return "station";case MILIEU:return "milieu";case COMMENT:return "commentaire";case ESPECE:return "espèce";case LATITUDE:return "latitude";case LONGITUDE:return "longitude";case TOUT:return "date, commune, lieu dit, station, milieu, espèce, commentaire, latitude, longitude";}return TOUT.toString();}};private String formatDate = null ;private Button boutonOK = new Button("Créer");private Button boutonAnnuler = new Button("Réinitialiser");private boolean selectionCommune=false;private boolean selectionEspece=false;private boolean modification = false ;private Toolbar bt = null ;private final String VALEURS_MULTIPLES = "(Valeurs multiples)";private final String modeleMessageModif = "commune:lieu-dit:station:milieu:latitude:longitude:date:espece:commentaire";private boolean communeModifiee = false;private boolean lieuDitModifie = false;private boolean stationModifiee = false;private boolean milieuModifie = false;private boolean dateModifiee = false;private boolean especeModifiee = false;private boolean commModifie = false;private final int KEY_ALT = 18;private final int KEY_BACKSPACE = 8;private final int KEY_CTRL = 17;private final int KEY_DELETE = 46;private final int KEY_DOWN = 40;private final int KEY_END = 35;private final int KEY_ENTER = 13;private final int KEY_ESCAPE = 27;private final int KEY_HOME = 36;private final int KEY_LEFT = 37;private final int KEY_PAGEDOWN = 34;private final int KEY_PAGEUP = 33;private final int KEY_RIGHT = 39;private final int KEY_SHIFT = 16;private final int KEY_TAB = 9;private final int KEY_UP = 38;/*** Combobox permettant de selectionner le mode* modification ou bien création*/private ComboBox selecteurMode = new ComboBox();Store storeMode = null ;/*** Booleen d'instanciation*/boolean estInstancie = false ;private Panel panneauIntermediaire;private Panel panneauPremierColonne;private Panel panneauSecondeColonne;private boolean masseModification =false ;private TextField longitude;private TextField latitude;private MultiFieldPanel htmlCommunePanel = null;private MultiFieldPanel coordPanel;private TextField coordonnees;private Label lienSelectionCommune = null;private HTML afficherFormulaireLatLon;private HTML basculerverscarto;private boolean longlatAjoutee;private boolean latModifiee;private boolean longModifiee;protected boolean rechercheCommuneEnCours = false;private Timer tCoord;final String resultTplRefPerso = "<div class=\"search-item-commune\">{element_referentiel}</div>";/*** Constructeur sans argument (privé car ne doit pas être utilisé)*/@SuppressWarnings("unused")private FormulaireSaisieObservationVue(){super() ;}/*** Constructeur avec argument* @param im*/public FormulaireSaisieObservationVue(ObservationMediateur obs){super("Saisie");// on associe le médiateurobservationMediateur = obs ;panneauFormulaire = new FormPanel(Position.RIGHT);panneauFormulaire.setBorder(false);// Panneau intermediaire qui contient deux colonnes de formulairepanneauIntermediaire = new Panel();if (Window.getClientWidth()> Window.getClientHeight()) {panneauIntermediaire.setLayout(new ColumnLayout());}else {panneauIntermediaire.setLayout(new RowLayout());}panneauIntermediaire.setBorder(false);//création du panneau formulaire de gauche auquels on ajoute les champspanneauPremierColonne = new Panel();panneauPremierColonne.setLayout(new FormLayout());panneauPremierColonne.setBorder(false);//création du panneau formulaire de droitepanneauSecondeColonne = new Panel();panneauSecondeColonne.setLayout(new FormLayout());panneauSecondeColonne.setBorder(false);this.setPaddings(5) ;// Accesskey pour debuggingcommune=new ComboBox("Commune","commune\" accesskey=\"1");final String resultTplCommune = "<div class=\"search-item-commune\">{commune}</div>";commune.setTpl(resultTplCommune);commune.setMode(ComboBox.REMOTE);// commune.setPageSize(10); // Ne fonctionne pascommune.setItemSelector("div.search-item-commune");commune.setTypeAhead(true);commune.setLoadingText("Recherche...");commune.setHideTrigger(true);//commune.setTabIndex(1);//création du lien "Accès carto" dans le formulairebasculerverscarto = new HTML(" <a id=\"lien_carto\" href=\"#\" tabindex=\"2\">Localiser la commune</a>");basculerverscarto.addStyleName("lien_actif");//création info bulle sur le lien "accès carto"ToolTip tip2 = new ToolTip();tip2.setHtml("Via une carte, obtenez les coordonnées (latitude/longitude) de votre observation ");tip2.applyTo(basculerverscarto.getElement());//Sur une meme ligne, ajout de plusieurs champshtmlCommunePanel = new MultiFieldPanel();int largeurCommune = Window.getClientWidth()/4;htmlCommunePanel.addToRow(commune, largeurCommune);htmlCommunePanel.addToRow(basculerverscarto, 160);htmlCommunePanel.setBorder(false);htmlCommunePanel.setId("x-commune-panel");panneauPremierColonne.add(htmlCommunePanel);station = new AutoCompletionRefComboBox("Station", "station", observationMediateur, TypesReferentiels.REFERENTIEL_STATION) {public void onModificationValeur() {stationModifiee = true;}public void onValidationSaisie() {validerSaisie(Champs.STATION);}};panneauPremierColonne.add(station, new AnchorLayoutData("95%"));latitude = new TextField("Lat", "lat");latitude.setGrowMax(70);latitude.setAllowBlank(true);longitude = new TextField("Lon", "lon");longitude.setGrowMax(70);longitude.setAllowBlank(true);lienSelectionCommune = new Label("");lienSelectionCommune.setId("conteneur_selection_commune");lienSelectionCommune.setStyleName("conteneur_selection_commune");lienSelectionCommune.addStyleName("lien_actif");// Panneau de type plusieurs champs de formulaire sur une meme ligne, où seront renseignés Lat/LoncoordPanel = new MultiFieldPanel();coordPanel.setPaddings(0, 0, 0, 10);coordPanel.setVisible(false);final double largeur ;largeur = 120;coordPanel.addToRow(latitude, new ColumnLayoutData(largeur));coordPanel.addToRow(longitude, new ColumnLayoutData(largeur));coordPanel.addToRow(lienSelectionCommune, new ColumnLayoutData(largeur));lienSelectionCommune.addClass("lien_decale");coordPanel.setBorder(false);//création du champs coordonnéesreferentielGeo = Configuration.getReferentielGeo();coordonnees = new TextField("Coordonnées", "", 0);coordonnees.setMaxLength(0);coordonnees.setReadOnly(true);coordonnees.setCls("fieldname");//création du lien "saisie X/Y" dans le formulaireafficherFormulaireLatLon = new HTML("<span style=\"padding-left:30px;\" class=\"conteneur_lien_afficher_lat_lon\">" +"<a title=\"Lat / Lon sont les latitudes / longitudes, à remplir en degrés décimaux\" class=\"lien_actif\" id=\"lien_coord\" href=\"#\" tabindex=\"6\">Saisie Lat/Lon ("+referentielGeo+")</a>" +"<span><span style=\"padding-left:20px\" class=\"conteneur_lien_localiser_lat_lon\">"+"<a title=\"Cliquez pour obtenir les coordonnées de votre observation à partir de la carte\" class=\"lien_actif\" id=\"lien_carto_coord\" href=\"#\" tabindex=\"7\">Localiser sur la carte</a>"+"</span>");//ajout d'un listener sur le lien "saisie X/Y"coordPanel.addListener(new PanelListenerAdapter() {public void onAfterLayout(Container c) {ExtElement lienCoord = Ext.get("lien_coord");lienCoord.removeAllListeners();lienCoord.addListener("click", new EventCallback() {public void execute(EventObject e) {coordPanel.setVisible(!coordPanel.isVisible());if(Ext.isIE()) {latitude.focus();}CarnetEnLigneMediateur.fireResize();}}) ;ExtElement lienCartoCoord = Ext.get("lien_carto_coord");lienCartoCoord.removeAllListeners();lienCartoCoord.addListener("click", new EventCallback() {public void execute(EventObject e) {obtenirInformationCoord();}}) ;ExtElement lienCarto = Ext.get("lien_carto");lienCarto.removeAllListeners();lienCarto.addListener("click", new EventCallback() {public void execute(EventObject e) {if(commune.getValue() != null && !commune.getValue().equals("") && !getDepartement().equals("")) {obtenirInformationCommune();longlatAjoutee = true;} else {Window.alert("Veuillez renseigner une commune et un numéro de département sous la forme : Commune (departement)");}}});if(!Ext.isIE() && Window.getClientWidth() < 1200) {int largeurN = (int)largeur;latitude.setWidth(largeurN+"px");longitude.setWidth(largeurN+"px");lienSelectionCommune.setWidth(largeurN+"px");}}});//Sur une meme ligne, ajout de plusieurs champsfinal MultiFieldPanel htmlPanel = new MultiFieldPanel();htmlPanel.addToRow(coordonnees, 100);htmlPanel.addToRow(afficherFormulaireLatLon, new ColumnLayoutData(0.9));htmlPanel.setBorder(false);htmlPanel.setId("x-coord-panel");panneauPremierColonne.add(htmlPanel);panneauPremierColonne.add(coordPanel);date = new DateField("Date", "date", 200);date.setAllowBlank(true);formatDate = "d/m/Y";date.setFormat(formatDate) ;date.setTitle("Date de l'observation au format jj/mm/aaaa");//date.setTabIndex(5);panneauPremierColonne.add(date, new AnchorLayoutData("55%"));espece=new ComboBox("Espèce","nom");final String resultTplEspece = "<div class=\"search-item-espece {indicateurNomRetenu}\">{nom}</div>";espece.setTpl(resultTplEspece);espece.setMode(ComboBox.REMOTE);// espece.setPageSize(10); // Ne fonctionne pasespece.setItemSelector("div.search-item-espece");espece.setTypeAhead(true);espece.setLoadingText("Recherche...");espece.setHideTrigger(true);//espece.setTabIndex(6);panneauPremierColonne.add(espece, new AnchorLayoutData("95%"));lieudit = new AutoCompletionRefComboBox("Lieu-dit", "lieudit",observationMediateur,TypesReferentiels.REFERENTIEL_LIEU_DIT) {public void onModificationValeur() {lieuDitModifie = true;}public void onValidationSaisie() {validerSaisie(Champs.LIEUDIT);}};panneauSecondeColonne.add(lieudit, new AnchorLayoutData("95%"));milieu = new AutoCompletionRefComboBox("Milieu","milieu",observationMediateur,TypesReferentiels.REFERENTIEL_MILIEU) {public void onModificationValeur() {milieuModifie = true;}public void onValidationSaisie() {validerSaisie(Champs.MILIEU);}};panneauSecondeColonne.add(milieu, new AnchorLayoutData("95%"));comment = new TextArea("Notes", "comment");comment.setAllowBlank(true);comment.setHeight(50);//comment.setTabIndex(7);panneauSecondeColonne.add(comment, new AnchorLayoutData("95%") );if (Window.getClientWidth() > Window.getClientHeight() || Window.getClientWidth() < 800) {panneauIntermediaire.add(panneauPremierColonne, new ColumnLayoutData(.5));panneauIntermediaire.add(panneauSecondeColonne, new ColumnLayoutData(.5));}else {panneauIntermediaire.add(panneauPremierColonne);panneauIntermediaire.add(panneauSecondeColonne);}panneauFormulaire.add(panneauIntermediaire);Object[][] mode = {{"création",false} , {"modification", true} };storeMode = new SimpleStore(new String[] { "nom_mode", "mode" },mode);storeMode.load();selecteurMode.setStore(storeMode);selecteurMode.setDisplayField("nom_mode") ;selecteurMode.setLabel("mode ") ;selecteurMode.setForceSelection(true) ;selecteurMode.setValue("création") ;selecteurMode.setEditable(false) ;selecteurMode.setCls("x-selec-crea") ;bt = new Toolbar() ;bt.addSpacer() ;bt.addText("Mode de saisie ") ;bt.addField(selecteurMode) ;if (Ext.isIE()) {panneauPremierColonne.setButtonAlign(Position.RIGHT);panneauPremierColonne.addButton(boutonOK);panneauSecondeColonne.setButtonAlign(Position.LEFT);panneauPremierColonne.addButton(boutonAnnuler);}else {panneauFormulaire.addButton(boutonOK);panneauFormulaire.addButton(boutonAnnuler);}selecteurMode.addListener(new ComboBoxListenerAdapter() {public void onSelect(ComboBox comboBox, Record record, int index) {// et on met la valeur à jour dans la comboboxcomboBox.setValue(record.getAsString("nom_mode"));setModification(record.getAsString("mode")) ;}});this.add(panneauFormulaire) ;this.setTopToolbar(bt) ;this.setAutoScroll(true);panneauFormulaire.addListener(new PanelListenerAdapter() {public void onResize(BoxComponent component, int adjWidth, int adjHeight, int rawWidth, int rawHeight) {panneauIntermediaire.setWidth(rawWidth);panneauIntermediaire.setHeight(rawHeight);panneauPremierColonne.doLayout();panneauSecondeColonne.doLayout();htmlCommunePanel.doLayout();htmlPanel.doLayout();doLayout();}});// on ajoute les listenersajouterListeners() ;saisieTabindex();}private void ajouterListeners(){// Listener completion communnefinal Rafraichissable r = this;commune.addListener(new ComboBoxListenerAdapter() {public void onSelect(ComboBox comboBox, Record record, int index) {commune.setValue(record.getAsString("commune"));departement=record.getAsString("departement");selectionCommune=true;commune.collapse();}public void onExpand(ComboBox comboBox) {comboBox.focus();}});ListenerConfig listenerConfigCommune=new ListenerConfig();listenerConfigCommune.setDelay(200);listenerConfigCommune.setStopPropagation(false);listenerConfigCommune.setStopEvent(false);commune.addKeyPressListener(new EventCallback() {public void execute(EventObject e) {switch(e.getKey()) {case KEY_ALT:case KEY_CTRL:case KEY_DOWN:case KEY_END:case KEY_ESCAPE:case KEY_HOME:case KEY_LEFT:case KEY_PAGEDOWN:case KEY_PAGEUP:case KEY_RIGHT:case KEY_SHIFT:case KEY_TAB:case KEY_UP:break;case KEY_ENTER:if (selectionCommune) {communeModifiee= true;selectionCommune=false;}else {validerSaisie(Champs.COMMUNE);// lancer mise a jour}break;default:departement="";commune.collapse();obtenirListeReferentielCommune();communeModifiee= true;break;}}}, listenerConfigCommune);date.addKeyPressListener(new EventCallback() {public void execute(EventObject e) {// TODO Auto-generated method stubswitch(e.getKey()) {case KEY_ALT:case KEY_CTRL:case KEY_DOWN:case KEY_END:case KEY_ESCAPE:case KEY_HOME:case KEY_LEFT:case KEY_PAGEDOWN:case KEY_PAGEUP:case KEY_RIGHT:case KEY_SHIFT:case KEY_TAB:if(date.getRawValue().equals(VALEURS_MULTIPLES)) {date.clearInvalid();}case KEY_UP:break;case KEY_ENTER:validerSaisie(Champs.DATE);break;default:dateModifiee = true;}}});date.addListener(new DatePickerListenerAdapter() {public void onSelect(DatePicker dataPicker, Date date) {dateModifiee = true;}});ListenerConfig listenerConfigAutocompletion=new ListenerConfig();listenerConfigAutocompletion.setDelay(200);listenerConfigAutocompletion.setStopPropagation(false);listenerConfigAutocompletion.setStopEvent(false);// Listener completion especeespece.addListener(new ComboBoxListenerAdapter() {public void onSelect(ComboBox comboBox, Record record, int index) {espece.setValue(record.getAsString("nom"));numeroNom=record.getAsString("numeroNom");selectionEspece=true;observationMediateur.obtenirImageInformationExternes(numeroNom);}});ListenerConfig listenerConfigEspece=new ListenerConfig();listenerConfigEspece.setDelay(10);listenerConfigEspece.setStopPropagation(false);listenerConfigEspece.setStopEvent(false);espece.addKeyPressListener(new EventCallback() {public void execute(EventObject e) {switch(e.getKey()) {case KEY_ALT:case KEY_CTRL:case KEY_DOWN:case KEY_END:case KEY_ESCAPE:case KEY_HOME:case KEY_LEFT:case KEY_PAGEDOWN:case KEY_PAGEUP:case KEY_RIGHT:case KEY_SHIFT:case KEY_TAB:case KEY_UP:break;case KEY_ENTER:if(selectionEspece) {especeModifiee = true;selectionEspece=false;}else {validerSaisie(Champs.ESPECE);}break;default:numeroNom="";obtenirListeReferentielNom();especeModifiee = true;break;}}}, listenerConfigEspece);comment.addKeyPressListener(new EventCallback() {public void execute(EventObject e) {switch(e.getKey()) {case KEY_ALT:case KEY_CTRL:case KEY_DOWN:case KEY_END:case KEY_ESCAPE:case KEY_HOME:case KEY_LEFT:case KEY_PAGEDOWN:case KEY_PAGEUP:case KEY_RIGHT:case KEY_SHIFT:case KEY_TAB:case KEY_UP:break;default:commModifie = true;}}});tCoord = new Timer() {public void run() {double[] coord = coordonneesValides();if(!rechercheCommuneEnCours && coord != null && (longModifiee || latModifiee)) {rechercheCommuneEnCours = true;Ext.get(lienSelectionCommune.getElement()).mask("recherche");observationMediateur.obtenirInformationCoord(r,LatLng.newInstance(coord[0], coord[1]));}}};latitude.addKeyPressListener(new EventCallback() {public void execute(EventObject e) {switch(e.getKey()) {case KEY_ALT:case KEY_CTRL:case KEY_DOWN:case KEY_END:case KEY_ESCAPE:case KEY_HOME:case KEY_LEFT:case KEY_PAGEDOWN:case KEY_PAGEUP:case KEY_RIGHT:case KEY_SHIFT:case KEY_TAB:case KEY_UP:break;case KEY_ENTER:validerSaisie(Champs.LATITUDE);break;default:latModifiee = true;tCoord.cancel();tCoord.schedule(250);}}});longitude.addKeyPressListener(new EventCallback() {public void execute(EventObject e) {switch(e.getKey()) {case KEY_ALT:case KEY_CTRL:case KEY_DOWN:case KEY_END:case KEY_ESCAPE:case KEY_HOME:case KEY_LEFT:case KEY_PAGEDOWN:case KEY_PAGEUP:case KEY_RIGHT:case KEY_SHIFT:case KEY_UP:case KEY_TAB:break;case KEY_ENTER:validerSaisie(Champs.LONGITUDE);break;default:longModifiee = true;tCoord.cancel();tCoord.schedule(250);}}});boutonOK.addListener(new ButtonListenerAdapter() {public void onClick(Button button, EventObject e) {if(modification) {if(masseModification) {modifierObservationEnMasse(null);} else {modifierObservation() ;}}else {ajouterObservation();}}});boutonAnnuler.addListener(new ButtonListenerAdapter() {public void onClick(Button button, EventObject e) {if(modification){supprimerObservation() ;}else{raz();}}});this.addListener(new ContainerListenerAdapter() {public void onAfterLayout(Container self) {commune.focus();}});}/*** Validation de la saisie*/private void validerSaisie(Champs champs) {if(modification) {if(masseModification) {modifierObservationEnMasse(champs);} else {modifierObservation();}raz(champs);}else {ajouterObservation();raz(champs);}}/*** Desactive visuellement ce panneau*/public void desactiverPanneau(){this.setDisabled(true) ;}/*** Active visuellement ce panneau*/public void activerPanneau(){this.setDisabled(false) ;}public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {// si l'on a reçu une liste du referentiel commune (completion referentiel commune)if(nouvelleDonnees instanceof ListeReferentielCommune){ListeReferentielCommune data = (ListeReferentielCommune) nouvelleDonnees ;Object[][] communeData = new Object[data.size()][2];int i = 0 ;// on la parse et on récupère les informations quiç nous interessentfor (Iterator it = data.keySet().iterator(); it.hasNext();){ReferentielCommune ref=(ReferentielCommune) data.get(it.next());communeData[i][0]= ref.getCommune();communeData[i][1]= ref.getDepartement();i++ ;}// creation du storeFieldDef defCommune = new StringFieldDef("commune");FieldDef defDepartement = new StringFieldDef("departement");FieldDef[] defTab = { defCommune, defDepartement};RecordDef rd = new RecordDef(defTab);final MemoryProxy dataProxy = new MemoryProxy(communeData);final ArrayReader reader = new ArrayReader(rd);Store store=new Store(dataProxy,reader);commune.setStore(store);store.load();}// si l'on a reçu une liste du référentiel nom (complétion referentiel nom)if(nouvelleDonnees instanceof ListeReferentielNom){ListeReferentielNom data = (ListeReferentielNom) nouvelleDonnees ;Object[][] nomData = new Object[data.size()][3];int i = 0 ;// on la parse et on récupère les informations quiç nous interessentfor (Iterator it = data.keySet().iterator(); it.hasNext();){ReferentielNom ref=(ReferentielNom) data.get(it.next());nomData[i][0]= ref.getNom();nomData[i][1]= ref.getNumeroNom();if (ref.getStatut().equals("3")) {nomData[i][2]="nom_retenu";}else {nomData[i][2]="";}i++ ;}// creation du storeFieldDef defNom = new StringFieldDef("nom");FieldDef defNumeroNom = new StringFieldDef("numeroNom");FieldDef indicateurNomRetenu = new StringFieldDef("indicateurNomRetenu");FieldDef[] defTab = { defNom, defNumeroNom, indicateurNomRetenu};RecordDef rd = new RecordDef(defTab);final MemoryProxy dataProxy = new MemoryProxy(nomData);final ArrayReader reader = new ArrayReader(rd);Store store=new Store(dataProxy,reader);store.load() ;espece.setStore(store);}// On recoit une observation dont on veut afficher le detailif(nouvelleDonnees instanceof Observation){Observation obs = (Observation)nouvelleDonnees ;afficherDetailsObservation(obs) ;}if(nouvelleDonnees instanceof ListeObservation) {ListeObservation listeObs = (ListeObservation)nouvelleDonnees;calculerAfficherDifferences(listeObs);}// Sur Mise à jour ou suppression d'une suppression ?if(nouvelleDonnees instanceof String){String str = (String)nouvelleDonnees ;observationMediateur.obtenirNombreObservation() ;}if(nouvelleDonnees instanceof String[]) {String[] anumNom = (String[])nouvelleDonnees ;numeroNom = anumNom[1];espece.setValue(anumNom[0]);setModification("false");}if(nouvelleDonnees instanceof EntiteGeographiqueObservation){EntiteGeographiqueObservation infosComm = (EntiteGeographiqueObservation)nouvelleDonnees ;if(rechercheCommuneEnCours) {afficherIndicationCommune(infosComm);} else {rafraichirCommuneEtCoord(infosComm);}}}private void afficherIndicationCommune(final EntiteGeographiqueObservation infosCom) {String nCommune = "";if(infosCom != null && !infosCom.getZoneGeo().trim().equals("")){nCommune += infosCom.getZoneGeo();if(!infosCom.getIdZoneGeo().trim().equals(""))nCommune += " ("+Util.convertirChaineZoneGeoVersCodeInsee(infosCom.getIdZoneGeo())+")";lienSelectionCommune.setHtml("<a id=\"lien_selection_commune\" tabindex=\"9\">"+nCommune+"</a>");lienSelectionCommune.setStyleName("img-curseur-depl");Ext.get("lien_selection_commune").addListener("click",new EventCallback() {public void execute(EventObject e) {rafraichirCommune(infosCom);}});Ext.get("lien_selection_commune").addListener("keypress",new EventCallback() {public void execute(EventObject e) {if(e.getCharCode() == KEY_ENTER) {rafraichirCommune(infosCom);}}});Ext.get("lien_selection_commune").addListener("focus",new EventCallback() {public void execute(EventObject e) {Ext.get("lien_selection_commune").toggleClass("lien_sel");}});Ext.get("lien_selection_commune").addListener("blur",new EventCallback() {public void execute(EventObject e) {Ext.get("lien_selection_commune").toggleClass("lien_sel");}});} else {if(rechercheCommuneEnCours) {lienSelectionCommune.setHtml("<span id=\"aucune_selection_commune\"> Erreur de localisation </span>");} else {lienSelectionCommune.setHtml("<span id=\"aucune_selection_commune\"> </span>");}}Ext.get(lienSelectionCommune.getElement()).unmask();rechercheCommuneEnCours = false;}private void rafraichirCommune(EntiteGeographiqueObservation infosCom) {String nCommune = "";if(infosCom.getZoneGeo() != null && !infosCom.getZoneGeo().equals("")) {nCommune += infosCom.getZoneGeo();}if(infosCom.getIdZoneGeo() != null && !infosCom.getIdZoneGeo().equals("")) {String codeGeoFormate = Util.convertirChaineZoneGeoVersCodeInsee(infosCom.getIdZoneGeo());nCommune += " ("+codeGeoFormate+")";departement = Util.convertirChaineZoneGeoVersCodeInsee(infosCom.getIdZoneGeo());;}commune.setValue(nCommune);communeModifiee = true;}private void rafraichirCommuneEtCoord(EntiteGeographiqueObservation infosCom) {;// on ne remplace la commune que si le champ était videif(commune.getRawValue() == null || commune.getRawValue().equals("")) {rafraichirCommune(infosCom);}if(infosCom.getLat() != null && !infosCom.getLat().equals("")) {latitude.setValue(infosCom.getLat());}if(infosCom.getLon() != null && !infosCom.getLon().equals("")) {longitude.setValue(infosCom.getLon());}latModifiee = true;longModifiee = true;coordPanel.setVisible(true);}public void obtenirListeReferentielCommune() {String com=commune.getText();com=com.replaceAll("%","");observationMediateur.obtenirListeReferentielCommune(this,com);}public void obtenirListeReferentielNom() {// FIXME : trouver un autre moyen que le hack "/*" pour rechercher les taxons lors de la saisie d'un espace apres le genreString esp=espece.getText().replaceAll(" ","/*");esp=esp.replaceAll("%","");observationMediateur.obtenirListeReferentielNom(this,esp);}protected void obtenirReferentielStation() {observationMediateur.obtenirListeReferentielPerso(this,TypesReferentiels.REFERENTIEL_STATION,station.getText());}protected void obtenirListeReferentielMilieu() {observationMediateur.obtenirListeReferentielPerso(this,TypesReferentiels.REFERENTIEL_MILIEU,milieu.getText());}protected void obtenirReferentielLieuDit() {observationMediateur.obtenirListeReferentielPerso(this,TypesReferentiels.REFERENTIEL_LIEU_DIT,lieudit.getText());}public void ajouterObservation() {if(!Util.verifierDateFormatCel(date.getRawValue()) && !date.getRawValue().equals("")) {Window.alert("Attention la date saisie est invalide, la date doit être au format jj/mm/aaaa");date.setInvalidText("Date invalide");return;}if(departement != null) {// TODO : regler le probleme a la base plutot que ce patchif(departement.equals("000null") || departement.equals("")) {String[] depCom = commune.getText().split(" ");if(depCom.length > 1) {String dep = depCom[1].replace('(', ' ');dep =dep.replace(')', ' ');dep = dep.trim();dep = dep.replace('\\',' ');dep = dep.trim();try{int nDep = Integer.parseInt(dep);if(nDep > 0 && nDep < 110) {departement = dep ;}}catch(NumberFormatException e){departement = "" ;}}}}String dateObs = Util.remplacerSeparateursDateFormatCel(date.getRawValue());Observation obs=new Observation(espece.getText(),numeroNom,commune.getText(),departement,lieudit.getText(),station.getText(),milieu.getText(), comment.getText(),dateObs);String[] coords = getValeurCoordonnees();obs.setLatitude(coords[0]);obs.setLongitude(coords[1]);observationMediateur.ajouterObservation(obs);}private void modifierObservation() {if(!Util.verifierDateFormatCel(date.getRawValue()) && !date.getRawValue().equals("")) {Window.alert("Attention la date saisie est invalide, la date doit être au format jj/mm/aaaa");date.setInvalidText("Date invalide");return;}if(departement.equals("000null") || departement.equals("")) {String[] depCom = commune.getText().split(" ");if(depCom.length > 1) {String dep = depCom[1].replace('(', ' ');dep =dep.replace(')', ' ');dep = dep.trim();dep = dep.replace('\\',' ');dep = dep.trim();try{int nDep = Integer.parseInt(dep);if(nDep > 0 && nDep < 110) {departement = dep ;}}catch(NumberFormatException e){departement = "" ;}}}String dateObs = Util.remplacerSeparateursDateFormatCel(date.getRawValue());Observation obs=new Observation(espece.getText(),numeroNom,commune.getText(),departement,lieudit.getText(),station.getText(),milieu.getText(), comment.getText(),dateObs);obs.setNumeroOrdre(numeroOrdre);String[] coords = getValeurCoordonnees();obs.setLatitude(coords[0]);obs.setLongitude(coords[1]);observationMediateur.modifierObservation(obs);selecteurMode.setValue("création");setModification("false");}private void modifierObservationEnMasse(Champs champModifie) {String communeM = null;String departementM = null;String numNomSelM = null;String lieuDitM = null;String stationM = null;String milieuM = null;String dateM = null;String especeM = null;String commM = null;String latM = null;String longM = null;String champs = modeleMessageModif;if(communeModifiee) {communeM = commune.getText();if(departement.equals("000null") || departement.equals("")) {String[] depCom = commune.getText().split(" ");if(depCom.length > 1) {String dep = depCom[1].replace('(', ' ');dep =dep.replace(')', ' ');dep = dep.trim();dep = dep.replace('\\',' ');dep = dep.trim();try{int nDep = Integer.parseInt(dep);if(nDep > 0 && nDep < 110) {departement = dep ;}}catch(NumberFormatException e){departement = "" ;}}}departementM = departement;} else {champs = champs.replaceAll("commune", "");}if(lieuDitModifie) {lieuDitM = lieudit.getText();}else {champs = champs.replaceAll(":lieu-dit", "");}if(stationModifiee) {stationM = station.getText();}else {champs = champs.replaceAll(":station", "");}if(milieuModifie) {milieuM = milieu.getText();}else {champs = champs.replaceAll(":milieu", "");}if(dateModifiee && !date.getRawValue().equals(VALEURS_MULTIPLES)) {dateM = date.getRawValue();dateM = Util.remplacerSeparateursDateFormatCel(dateM);}else {champs = champs.replaceAll(":date", "");}if(especeModifiee) {especeM = espece.getText();numNomSelM = numeroNom;}else {champs = champs.replaceAll(":espece", "");}if(commModifie) {commM = comment.getText();}else {champs = champs.replaceAll(":commentaire", "");}if(latModifiee) {latM = latitude.getText();}else {champs = champs.replaceAll(":latitude", "");}if(longModifiee) {longM = longitude.getText();}else {champs = champs.replaceAll(":longitude", "");}champs = champs.replaceAll(":",", ");if(champs.startsWith(",")) {champs = champs.replaceFirst(",", "");}String message = "Voulez vous modifier le(s) champ(s) suivant(s) : "+champs+" pour les observations selectionnées ?" ;if(champs.trim().equals("")) {Window.alert("Aucun champ n'a été modifié");} else {Observation obs = new Observation(especeM,numNomSelM,communeM,departementM,lieuDitM,stationM,milieuM, commM,dateM);obs.setNumeroOrdre(numeroOrdre);obs.setLatitude(latM);obs.setLongitude(longM);if(Window.confirm(message)) {observationMediateur.modifierObservationEnMasse(obs);reinitialiserValeurModifiees();}}}private void supprimerObservation() {observationMediateur.supprimerObservation(this, numeroOrdre);}public void afficherDetailsObservation(Observation obs){raz() ;String idLoc ;if(obs.getIdentifiantLocalite() != VALEURS_MULTIPLES) {idLoc =obs.getIdentifiantLocalite().replaceAll(" ","/");idLoc = idLoc.replaceAll("%","");idLoc = idLoc.replaceAll("\"","");idLoc = idLoc.replace('\\',' ');idLoc = idLoc.trim();} else {idLoc = obs.getIdentifiantLocalite();}if(!obs.getDate().equals("null") && !obs.getDate().equals("000null") && !obs.getDate().equals(VALEURS_MULTIPLES)) {String[] dateEtHeure = obs.getDate().split(" ", 2);if(verifierFormatDate(dateEtHeure[0])) {date.setValue(dateEtHeure[0]) ;}else{date.setRawValue("");}} else {date.setRawValue(VALEURS_MULTIPLES);date.clearInvalid();}if(!obs.getLieudit().equals("null") && !obs.getLieudit().equals("000null")) {lieudit.setValue(obs.getLieudit()) ;}if(!obs.getStation().equals("null") && !obs.getStation().equals("000null")) {station.setValue(obs.getStation()) ;}if(!obs.getMilieu().equals("null") && !obs.getMilieu().equals("000null")) {milieu.setValue(obs.getMilieu()) ;}if(!obs.getCommentaire().equals("null") && !obs.getCommentaire().equals("000null")) {comment.setRawValue(Util.remplacerSautsDeligneMalEncodes(obs.getCommentaire()));}if(!obs.getLocalite().equals("null") && !obs.getLocalite().equals("000null")) {if(!idLoc.equals("000null") && !idLoc.equals("")) {if(!idLoc.equals(VALEURS_MULTIPLES)) {commune.setValue(obs.getLocalite()+" ("+idLoc+")") ;} else {commune.setValue(VALEURS_MULTIPLES);}}else{commune.setValue(obs.getLocalite());}}if(!obs.getIdentifiantLocalite().equals("null") && !obs.getIdentifiantLocalite().equals("000null")) {departement = idLoc;}if(!obs.getNomSaisi().equals("null") && !obs.getNomSaisi().equals("000null")) {espece.setValue(obs.getNomSaisi()) ;}if(!obs.getNumeroNomenclaturalSaisi().equals("null") && !obs.getNumeroNomenclaturalSaisi().equals("000null")) {numeroNom = obs.getNumeroNomenclaturalSaisi() ;}if(!obs.getNumeroOrdre().equals("null") && !obs.getNumeroOrdre().equals("000nu2ll")) {numeroOrdre = obs.getNumeroOrdre() ;}if(!obs.getLatitude().equals("null") && !obs.getLatitude().equals("000null")&& !obs.getLongitude().equals("null") && !obs.getLongitude().equals("000null")) {latitude.setValue(obs.getLatitude()) ;longitude.setValue(obs.getLongitude()) ;}}public void raz(){raz(Champs.TOUT);}public void raz(Champs champs){switch (champs) {case DATE:date.reset() ;break;case LIEUDIT:lieudit.reset() ;break;case STATION:station.reset() ;break;case MILIEU:milieu.reset() ;break;case COMMENT:comment.reset() ;break;case COMMUNE:commune.reset() ;departement ="";latitude.reset();longitude.reset();break;case ESPECE:espece.reset();numeroNom = "" ;numeroOrdre = "";break;case LATITUDE:latitude.reset();afficherIndicationCommune(null);break;case LONGITUDE:longitude.reset();afficherIndicationCommune(null);break;case TOUT:commune.reset();date.reset() ;lieudit.reset() ;station.reset() ;milieu.reset() ;comment.reset() ;milieu.reset() ;latitude.reset();longitude.reset();departement ="";espece.reset();numeroNom = "" ;numeroOrdre = "";afficherIndicationCommune(null);break;}}private void setModification(String mode){if(mode.equals("true")) {boutonOK.setText("Modifier") ;setTitle("Modification") ;boutonAnnuler.setText("Supprimer") ;modification = true ;selecteurMode.removeClass("x-selec-crea") ;selecteurMode.setCls("x-selec-modif") ;observationMediateur.onModeModification();}else{boutonOK.setText("Créer") ;setTitle("Saisir") ;boutonAnnuler.setText("Réinitialiser") ;modification = false ;selecteurMode.removeClass("x-selec-modif") ;selecteurMode.setCls("x-selec-crea") ;observationMediateur.onModeCreation();}}/*** renvoie vrai si on est en mode modification, faux si on est en mode création* @return*/public boolean getModification(){return modification ;}/*** renvoie vrai si on est en mode modification de masse, faux sinon* @return*/public boolean getMasseModification(){return masseModification ;}public boolean verifierFormatDate(String date) {String regex = "[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}" ;if(date.matches(regex) && !date.equals("0000-00-00")) {return true ;}else {return false;}}public void setMasseModification(boolean masseModification) {this.masseModification = masseModification;if(masseModification) {reinitialiserValeurModifiees();}}private void calculerAfficherDifferences(ListeObservation listeObs) {String departement = null;String commune = null;String lieuDit = null;String station = null;String milieu = null;String espece = null;String date = null;String notes = null;String lat = null;String lon = null;String ordreObs = "";for(Iterator<String> it = listeObs.keySet().iterator();it.hasNext();) {Observation obsEnCours = listeObs.get(it.next());departement = comparerDifferencesChamps(departement, obsEnCours.getIdentifiantLocalite());commune = comparerDifferencesChamps(commune, obsEnCours.getLocalite());lieuDit = comparerDifferencesChamps(lieuDit, obsEnCours.getLieudit());station = comparerDifferencesChamps(station, obsEnCours.getStation());milieu = comparerDifferencesChamps(milieu, obsEnCours.getMilieu());espece = comparerDifferencesChamps(espece, obsEnCours.getNomSaisi());date = comparerDifferencesChamps(date, obsEnCours.getDate());notes = comparerDifferencesChamps(notes, obsEnCours.getCommentaire());lat = comparerDifferencesChamps(lat, obsEnCours.getLatitude());lon = comparerDifferencesChamps(lon, obsEnCours.getLongitude());ordreObs += obsEnCours.getNumeroOrdre()+",";}Observation obs=new Observation(espece,numeroNom,commune,departement,lieuDit,station,milieu, notes,date);obs.setNumeroOrdre(ordreObs);obs.setLatitude(lat);obs.setLongitude(lon);rafraichir(obs, false);}private String comparerDifferencesChamps(String valeurActuelle, String nouvelleValeur) {String retour = "000null";if(valeurActuelle == null) {retour = nouvelleValeur;} else {if(valeurActuelle.equals(nouvelleValeur)) {retour = valeurActuelle;} else {retour = VALEURS_MULTIPLES;}}return retour;}private void reinitialiserValeurModifiees() {communeModifiee = false;lieuDitModifie = false;stationModifiee = false;milieuModifie = false;dateModifiee = false;especeModifiee = false;commModifie = false;latModifiee = false;longModifiee = false;}public void saisieTabindex(){selecteurMode.setTabIndex(0);commune.setTabIndex(1);lieudit.setTabIndex(3);station.setTabIndex(4);milieu.setTabIndex(5);coordonnees.setTabIndex(-1);coordonnees.addListener(new TextFieldListenerAdapter() {public void onFocus(Field field) {if(coordPanel.isVisible()) {latitude.focus();} else {Ext.get("lien_carto").focus();}}});latitude.setTabIndex(8);longitude.setTabIndex(9);comment.setTabIndex(10);date.setTabIndex(11);espece.setTabIndex(12);boutonOK.setTabIndex(13);boutonAnnuler.setTabIndex(14);}private void obtenirInformationCoord() {if(coordonneesValides() != null) {observationMediateur.obtenirInformationCoord(LatLng.newInstance(coordonneesValides()[0],coordonneesValides()[1]));} else {observationMediateur.afficherFenetreCarto();}}private void obtenirInformationCommune() {observationMediateur.obtenirInformationCommune(getCommuneSansDepartement(), obtenirDepartementAPartirChampCommune());}public double[] coordonneesValides() {try {double lat = Double.parseDouble(latitude.getValueAsString().replaceAll(",", "."));double lon = Double.parseDouble(longitude.getValueAsString().replaceAll(",", "."));double[] coord = {lat, lon};return coord;} catch (NumberFormatException ne) {return null;}}private String[] getValeurCoordonnees() {double[] coDouble = coordonneesValides();if(coDouble != null) {String[] coord = {coDouble[0]+"",coDouble[1]+""};return coord;} else {String[] coord = {"000null","000null" };return coord;}}private String obtenirDepartementAPartirChampCommune() {String dep = "";if(departement == null) {departement = "";}if(departement.equals("000null") || departement.equals("")) {String[] depCom = commune.getText().split(" ");if(depCom.length > 1) {dep = depCom[1].replace('(', ' ');} else {dep = "";}} else {dep = departement;}dep = dep.replace(')', ' ');dep = dep.trim();dep = dep.replace('\\',' ');dep = dep.trim();try{int nDep = Integer.parseInt(dep);if(nDep > 0 && nDep < 110) {departement = dep ;}if(departement.length() == 4) {departement = "0"+departement;}departement = departement.substring(0,2);}catch(NumberFormatException e){departement = "" ;}return departement;}public String getCommune() {String valeurCommune = "";if(commune.getValue() != null) {valeurCommune = commune.getValue();}return valeurCommune;}public String getDepartement() {return obtenirDepartementAPartirChampCommune();}public String getCommuneSansDepartement() {return Util.supprimerNumDepartementChaineLocalite(getCommune());}public boolean communeInitialisee() {return communeModifiee;}public void redimensionnerFormulaire() {//htmlCommunePanel.setWidth(panneauPremierColonne.getWidth() - 10);afficherFormulaireLatLon.setWidth(panneauIntermediaire.getWidth()+"px");panneauPremierColonne.doLayout();panneauSecondeColonne.doLayout();panneauIntermediaire.doLayout();/*if(panneauPremierColonne.getWidth() < 450 ) {basculerverscarto.setHTML("<a id=\"lien_carto\" href=\"#\" tabindex=\"2\">Localiser</a>");commune.setWidth(180);basculerverscarto.setWidth("60px");htmlCommunePanel.doLayout();} else {basculerverscarto.setHTML("<a id=\"lien_carto\" href=\"#\" tabindex=\"2\">Localiser la commune</a>");commune.setWidth(290);basculerverscarto.setWidth("160px");htmlCommunePanel.doLayout();}*/doLayout();}}