Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 2601 → Rev 2602

/trunk/src/org/tela_botanica/client/util/AutoCompletionRefComboBox.java
7,6 → 7,7
import org.tela_botanica.client.modeles.objets.ListeReferentielPerso.TypesReferentiels;
import org.tela_botanica.client.observation.ObservationMediateur;
 
import com.google.gwt.user.client.Window;
import com.gwtext.client.core.EventCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.ListenerConfig;
18,6 → 19,7
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.widgets.form.ComboBox;
import com.gwtext.client.widgets.form.Field;
import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;
 
public abstract class AutoCompletionRefComboBox extends ComboBox implements Rafraichissable {
45,6 → 47,9
private boolean selectionValeur = false;
private boolean estModifie = false;
private Record rdSelectionne = null;
private String valeurBrute = null;
final String resultTplRefPerso = "<div class=\"search-item-ref\">{element_referentiel}</div>";
public AutoCompletionRefComboBox(String label, String nom, ObservationMediateur oMediateur, TypesReferentiels typeRef) {
94,6 → 99,10
if (selectionValeur) {
estModifie= true;
selectionValeur=false;
if(rdSelectionne != null) {
Window.alert("ergregegegegergre");
setRawValue(rdSelectionne.getAsString("element_referentiel"));
}
onModificationValeur();
}
else {
113,13 → 122,21
// Listener completion
addListener(new ComboBoxListenerAdapter() {
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
setValue(record.getAsString("element_referentiel"));
public void onSelect(ComboBox comboBox, Record record, int index) {
Window.alert(rdSelectionne.getAsString("element_referentiel")+" "+getRawValue());
valeurBrute = getRawValue();
rdSelectionne = record;
selectionValeur=true;
collapse();
}
}
@Override
public void onBlur(Field field) {
/*if(rdSelectionne == null || rdSelectionne.getAsString("element_referentiel").equals(getRawValue())) {
setValue(getRawValue());
}*/
}
});
}
 
@Override
/trunk/src/org/tela_botanica/client/util/ChampSaisieEtendu.java
3,11 → 3,16
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
 
import org.tela_botanica.client.cel2;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
import org.tela_botanica.client.modeles.objets.Configuration;
import org.tela_botanica.client.util.autocompletion.AutoCompletionComboBox;
 
import com.google.gwt.core.client.Callback;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Timer;
import com.gwtext.client.core.EventCallback;
import com.gwtext.client.core.EventObject;
26,140 → 31,25
import com.gwtext.client.widgets.form.Field;
import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;
 
public class ChampSaisieEtendu extends ComboBox implements Rafraichissable {
// TODO: faire un enum
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;
public class ChampSaisieEtendu extends AutoCompletionComboBox {
private boolean selectionValeur = false;
private boolean estModifie = false;
private String cle = null;
private String label = null;
private Timer timer = null;
final String resultTplRefPerso = "<div class=\"search-item-ref\">{valeur}</div>";
private List<String> cacheValeurs;
private Record rdSelectionne = null;
private String valeurBrute = "";
private String description = null;
private ToolTip tpDesc = null;
public ChampSaisieEtendu(String label, String cle) {
public ChampSaisieEtendu(String label, String cle, String urlRequete) {
 
super(label,cle);
 
super(label, urlRequete);
this.cle =cle;
this.label = label;
setTpl(resultTplRefPerso);
setMode(ComboBox.REMOTE);
setItemSelector("div.search-item-ref");
setTypeAhead(false);
setLoadingText("Recherche...");
setHideTrigger(true);
setValidateOnBlur(false);
ListenerConfig listenerConfigAutocompletion=new ListenerConfig();
listenerConfigAutocompletion.setDelay(200);
listenerConfigAutocompletion.setStopPropagation(false);
listenerConfigAutocompletion.setStopEvent(false);
initStoreVide();
if(Configuration.saisieChampsEtendusActivee()) {
addKeyPressListener(new EventCallback() {
@Override
public void execute(EventObject e) {
switch(e.getKey()) {
case KEY_ALT:
case KEY_CTRL:
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(rdSelectionne != null) {
setValue(rdSelectionne.getAsString("valeur"));
selectionValeur=true;
valeurBrute = rdSelectionne.getAsString("valeur");
}
break;
case KEY_DOWN:
if(getValueAsString().isEmpty() && !isExpanded()) {
obtenirListeValeurs("*");
}
break;
default:
if(timer != null) {
timer.cancel();
}
timer = new Timer() {
@Override
public void run() {
obtenirListeValeurs();
}
};
timer.schedule(300);
valeurBrute = getValueAsString();
setValue(valeurBrute);
}
}
},listenerConfigAutocompletion);
}
addListener(new ComboBoxListenerAdapter() {
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
rdSelectionne = record;
setRawValue(rdSelectionne.getAsString("valeur"));
}
@Override
public void onBlur(Field field) {
if(rdSelectionne != null && !rdSelectionne.getAsString("valeur").equals(valeurBrute)) {
setRawValue(valeurBrute);
}
}
});
// A activer pour télécharger la description
// si jamais on le décide
addListener(new ComboBoxListenerAdapter() {
@Override
public void onRender(Component component) {
setLargeurChamp();
ChampSaisieEtendu.this.getEl().addListener("mouseover", new EventCallback() {
@Override
public void execute(EventObject e) {
201,86 → 91,32
}
}
@Override
public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
@SuppressWarnings("unchecked")
ArrayList<String> valeurs = (ArrayList<String>)nouvelleDonnees;
cacheValeurs = valeurs;
 
int i = 0;
Object[][] refData = new Object[valeurs.size()][1];
for (Iterator<String> it = valeurs.iterator(); it.hasNext();)
{
refData[i][0]= it.next();
i++;
}
FieldDef defValeur = new StringFieldDef("valeur");
FieldDef[] defTab = {defValeur};
RecordDef rd = new RecordDef(defTab);
final MemoryProxy dataProxy = new MemoryProxy(refData);
final ArrayReader reader = new ArrayReader(rd);
Store store = new Store(dataProxy,reader);
setStore(store);
store.load();
public String getCle() {
return cle;
}
private void obtenirListeValeurs() {
String valeurChamp = getRawValue();
obtenirListeValeurs(valeurChamp);
public String getLabel() {
return label;
}
private void obtenirListeValeurs(String valeurChamp) {
if(valeurChamp == null) {
valeurChamp = "";
} else {
valeurChamp += "*";
}
ListeReferentielChampsEtendusDAO lrceDao = new ListeReferentielChampsEtendusDAO(null);
lrceDao.obtenirListeValeursChampEtendu(this, cle, valeurChamp);
 
@Override
protected Map<String, String> parserResultatRequete(Response response) {
return ListeReferentielChampsEtendusDAO.parserRetourListeValeursChampsEtendus(response);
}
public void setLargeurChamp() {
// Correction un peu moche pour améliorer l'affichage du champ
String idElementEnfant = Ext.get(("x-form-el-"+cle)).getFirstChild().getId();
Ext.get(idElementEnfant).setWidth("90%", false);
Ext.get(cle).setWidth("100%", false);
 
@Override
protected void onModificationValeur() {
// TODO Auto-generated method stub
}
private void initStoreVide() {
Object[][] refData = new Object[0][1];
FieldDef defValeur = new StringFieldDef("valeur");
FieldDef[] defTab = {defValeur};
RecordDef rd = new RecordDef(defTab);
final MemoryProxy dataProxy = new MemoryProxy(refData);
final ArrayReader reader = new ArrayReader(rd);
Store store = new Store(dataProxy,reader);
setStore(store);
store.load();
@Override
protected void onSelectionValeur() {
// TODO Auto-generated method stub
}
 
@Override
public void setValue(String valeur) {
valeurBrute = valeur;
super.setValue(valeur);
protected void onValidationSaisie() {
// TODO Auto-generated method stub
}
public String getCle() {
return cle;
}
public String getLabel() {
return label;
}
}
/trunk/src/org/tela_botanica/client/util/Util.java
14,9 → 14,12
import org.tela_botanica.client.modeles.objets.Observation;
 
import com.google.gwt.dom.client.Element;
import com.google.gwt.http.client.Response;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.RootPanel;
 
438,4 → 441,28
public static void curseurParDefaut() {
RootPanel.getBodyElement().getStyle().setProperty("cursor", "default");
}
public static Map<String, String> parserRetourReferentielPerso(Response response) {
final Map<String, String> referentielData = new HashMap<String, String>();
final JSONValue responseValue = JSONParser.parse(response.getText());
JSONArray reponse = null;
 
// si c'est un tableau
if ((reponse = responseValue.isArray()) != null) {
JSONString elementsRef;
final int taillemax = reponse.size();
for (int i = 0; i < taillemax; i++) {
if ((elementsRef = reponse.get(i).isString()) != null) {
String valeur = elementsRef.stringValue();
referentielData.put(i+"", valeur);
}
}
}
return referentielData;
}
}
/trunk/src/org/tela_botanica/client/util/FormulaireSaisieChampEtendu.java
8,57 → 8,31
 
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
import org.tela_botanica.client.modeles.objets.ListeChampsEtendus;
import org.tela_botanica.client.modeles.objets.ListeGroupesChampsEtendus;
import org.tela_botanica.client.util.autocompletion.AutoCompletionComboBox;
 
import com.google.gwt.core.client.Callback;
import com.google.gwt.user.client.Timer;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.gwtext.client.core.EventCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Ext;
import com.gwtext.client.core.ListenerConfig;
import com.gwtext.client.data.ArrayReader;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.MemoryProxy;
import com.gwtext.client.data.Record;
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.Button;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.ComboBox;
import com.gwtext.client.widgets.form.Field;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;
import com.gwtext.client.widgets.layout.FormLayout;
 
@SuppressWarnings("unchecked")
public abstract class FormulaireSaisieChampEtendu extends FormPanel implements Rafraichissable {
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;
final ComboBox nChamp;
final String resultTplRefPerso = "<div class=\"search-item-ref\">{label_fmt}</div>";
final AutoCompletionComboBox nChamp;
Button ajouterChampsEtenduEtFermer;
Button ajouterChampsEtendu;
Button annulerAjouterChampEtendu;
65,20 → 39,16
String idChamp = null;
Panel conteneurGroupesChampsEtendus;
final ComboBox groupesChampsEtendus;
Panel conteneurlabelGroupe;
ListBox listeGroupeChampsEtendus;
HTML indicationSaisieGroupe;
private static ListeGroupesChampsEtendus cacheGroupes;
private static Map<String, String> cacheLabelsCle;
private Timer timer = null;
private static Map<String, String> cacheClesValeur;
private HTML descriptionChamp = null;
private String groupeSelectionne = null;
private Record rdSelectionne = null;
private Record groupeSelectionne = null;
private String valeurBrute = "";
public FormulaireSaisieChampEtendu() {
super();
setPaddings(3);
89,16 → 59,15
"De nouveaux groupes seront ajoutés régulièrement en fonction des champs les plus utilisés");
indicationSaisieGroupe.addStyleName("aideCreerChampEtendu");
groupesChampsEtendus = new ComboBox();
groupesChampsEtendus.setWidth("350px");
groupesChampsEtendus.setLabel("Ajouter un groupe de champs");
groupesChampsEtendus.setDisplayField("label") ;
groupesChampsEtendus.setValueField("cle");
groupesChampsEtendus.setEditable(false);
groupesChampsEtendus.setHideTrigger(false);
groupesChampsEtendus.setForceSelection(true);
groupesChampsEtendus.setCls("champ-separation");
groupesChampsEtendus.setValue("");
conteneurlabelGroupe = new Panel();
conteneurlabelGroupe.setStyleName("panneauEnLigne");
conteneurlabelGroupe.addStyleName("selecteurGroupeEtendus");
conteneurlabelGroupe.setBorder(false);
Label labelGroupeChampsEtendus = new Label("Ajouter un groupe de champs :");
listeGroupeChampsEtendus = new ListBox();
listeGroupeChampsEtendus.setWidth("315px");
conteneurlabelGroupe.add(labelGroupeChampsEtendus);
conteneurlabelGroupe.add(listeGroupeChampsEtendus);
conteneurGroupesChampsEtendus = new Panel();
conteneurGroupesChampsEtendus.setBorder(false);
126,19 → 95,38
HorizontalPanel hp = new HorizontalPanel();
hp.setBorderWidth(0);
nChamp = new ComboBox("Nom du champ", "nom_champ_etendu");
nChamp.setWidth("350px");
nChamp.setTpl(resultTplRefPerso);
nChamp.setMode(ComboBox.REMOTE);
nChamp.setItemSelector("div.search-item-ref");
nChamp.setTypeAhead(false);
nChamp.setLoadingText("Recherche...");
nChamp.setHideTrigger(true);
nChamp.setValidateOnBlur(false);
Store store = initStoreChampsEtendusVide();
store.load();
nChamp.setStore(store);
nChamp = new AutoCompletionComboBox("Nom du champ", ListeReferentielChampsEtendusDAO.getUrlRequeteNomsChampsEtendus()) {
@Override
protected Map<String, String> parserResultatRequete(
Response response) {
Map<String, String> clesLabels = ListeReferentielChampsEtendusDAO.parserRetourListeNomsChampsEtendus(response);
cacheLabelsCle = new HashMap<String, String>();
for(Map.Entry<String, String> entry : clesLabels.entrySet()){
cacheLabelsCle.put(entry.getValue(), entry.getKey());
}
return clesLabels;
}
 
@Override
protected void onSelectionValeur() {
telechargerEtAfficherDescriptionChamps(cacheLabelsCle.get(nChamp.getRawValue()));
}
 
@Override
protected void onValidationSaisie() {
// rien à faire ici
}
 
@Override
protected void onModificationValeur() {
// rien à faire ici non plus
}
};
nChamp.addStyleName("panneauEnLigne");
add(nChamp);
descriptionChamp = new HTML();
161,96 → 149,19
}
 
private void ajouterListeners() {
ListenerConfig listenerConfigAutocompletion=new ListenerConfig();
listenerConfigAutocompletion.setDelay(200);
listenerConfigAutocompletion.setStopPropagation(false);
listenerConfigAutocompletion.setStopEvent(true);
nChamp.addKeyPressListener(new EventCallback() {
 
listeGroupeChampsEtendus.addChangeHandler(new ChangeHandler() {
@Override
public void execute(EventObject e) {
 
switch(e.getKey()) {
case KEY_ALT:
case KEY_CTRL:
case KEY_END:
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(rdSelectionne != null) {
nChamp.setValue(rdSelectionne.getAsString("label"));
valeurBrute = rdSelectionne.getAsString("cle");
}
break;
case KEY_DOWN:
if(nChamp.getValueAsString().isEmpty() && !nChamp.isExpanded()) {
obtenirListeValeurs("*");
}
break;
case KEY_ESCAPE:
surAnnulation();
break;
default:
if(timer != null) {
timer.cancel();
}
timer = new Timer() {
@Override
public void run() {
obtenirListeValeurs();
}
};
timer.schedule(300);
valeurBrute = nChamp.getRawValue();
nChamp.setRawValue(valeurBrute);
}
public void onChange(ChangeEvent event) {
groupeSelectionne = listeGroupeChampsEtendus.getValue(listeGroupeChampsEtendus.getSelectedIndex());
}
},listenerConfigAutocompletion);
nChamp.addListener(new ComboBoxListenerAdapter() {
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
rdSelectionne = record;
telechargerEtAfficherDescriptionChamps(rdSelectionne.getAsString("cle"));
nChamp.setRawValue(rdSelectionne.getAsString("label"));
valeurBrute = rdSelectionne.getAsString("cle");
}
 
@Override
public void onBlur(Field field) {
if(rdSelectionne != null && !rdSelectionne.getAsString("cle").equals(valeurBrute)) {
nChamp.setRawValue(valeurBrute);
}
telechargerEtAfficherDescriptionChamps(valeurBrute);
}
});
});
groupesChampsEtendus.addListener(new ComboBoxListenerAdapter() {
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
groupeSelectionne = record;
}
});
ajouterChampsEtenduEtFermer.addListener(new ButtonListenerAdapter() {
@Override
public void onClick(Button button, EventObject e) {
if(doitAjouterGroupe()) {
surValidationMultiple(renvoyerListeChampsEtendus(groupeSelectionne.getAsString("cle")));
surValidationMultiple(renvoyerListeChampsEtendus(groupeSelectionne));
} else {
if(champEtenduEstValide()) {
surValidation(validerEtRenvoyerChampEtendu());
282,19 → 193,16
}
private void raz() {
timer = null;
idChamp = null;
nChamp.clearValue();
nChamp.reset();
nChamp.focus();
}
private ChampSaisieEtendu validerEtRenvoyerChampEtendu() {
String valeurChamp = nChamp.getRawValue();
// Valeur contient soit la clé, soit le label s'il existe
// valeur brute contient toujours la clé
// TODO: utiliser les champs de google et pas ceux de GWT-EXT qui puent du cul
ChampSaisieEtendu retour = new ChampSaisieEtendu(valeurChamp, valeurBrute);
retour.setId(valeurBrute);
String labelChamp = nChamp.getRawValue();
String cleChamp = cacheLabelsCle.containsKey(labelChamp) ? cacheLabelsCle.get(labelChamp) : labelChamp;
ChampSaisieEtendu retour = new ChampSaisieEtendu(labelChamp, cleChamp, ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(cleChamp));
retour.setId(cleChamp);
return retour;
}
304,7 → 212,7
for (Iterator<String> iterator = listeChampsEtendus.keySet().iterator(); iterator.hasNext();) {
String cle = iterator.next();
String label = listeChampsEtendus.get(cle);
ChampSaisieEtendu champ = new ChampSaisieEtendu(label, cle);
ChampSaisieEtendu champ = new ChampSaisieEtendu(label, cle, ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(cle));
champsDuGroupe.add(champ);
}
 
312,7 → 220,7
}
private boolean doitAjouterGroupe() {
return groupeSelectionne != null && !groupeSelectionne.getAsString("cle").equals("");
return groupeSelectionne != null && !groupeSelectionne.equals("");
}
private boolean champEtenduEstValide() {
320,19 → 228,6
return (valeurChamp != null && !valeurChamp.isEmpty());
}
private boolean estUnChampSelectionne(String valeur) {
return cacheClesValeur.containsValue(valeur);
}
private void obtenirListeValeurs() {
obtenirListeValeurs(nChamp.getRawValue());
}
private void obtenirListeValeurs(String valeur) {
ListeReferentielChampsEtendusDAO lrce = new ListeReferentielChampsEtendusDAO(null);
lrce.obtenirListeNomsChampsEtendus(this, valeur+"*");
}
public abstract void surAjout(ChampSaisieEtendu champ);
public abstract void surAjoutMultiple(List<ChampSaisieEtendu> champs);
public abstract void surValidation(ChampSaisieEtendu champ);
339,53 → 234,17
public abstract void surValidationMultiple(List<ChampSaisieEtendu> champs);
public abstract void surAnnulation();
public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
if(nouvelleDonnees instanceof ListeChampsEtendus) {
int i = 0;
ListeChampsEtendus clesLabels = (ListeChampsEtendus)nouvelleDonnees;
cacheClesValeur = clesLabels;
Object[][] refData = new Object[clesLabels.keySet().size()][3];
for (Iterator<String> it = clesLabels.keySet().iterator(); it.hasNext();)
{
String cle = it.next();
String label = clesLabels.get(cle);
refData[i][0]= cle;
refData[i][1]= label;
if(cle.equals(label.toLowerCase())) {
refData[i][2]= label;
} else {
refData[i][2]= label+" ("+cle+")";
}
 
i++;
}
FieldDef defCle = new StringFieldDef("cle");
FieldDef defLabel = new StringFieldDef("label");
FieldDef defLabelFmt = new StringFieldDef("label_fmt");
FieldDef[] defTab = {defCle, defLabel, defLabelFmt};
RecordDef rd = new RecordDef(defTab);
final MemoryProxy dataProxy = new MemoryProxy(refData);
final ArrayReader reader = new ArrayReader(rd);
Store store=new Store(dataProxy,reader);
nChamp.setStore(store);
store.load();
}
public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
if(nouvelleDonnees instanceof ListeGroupesChampsEtendus) {
cacheGroupes = (ListeGroupesChampsEtendus)nouvelleDonnees;
groupesChampsEtendus.setStore(getGroupesChampsEtendusStore(cacheGroupes));
listeGroupeChampsEtendus.addItem("...");
for (Iterator<String> iterator = cacheGroupes.keySet().iterator(); iterator.hasNext();) {
listeGroupeChampsEtendus.addItem(iterator.next());
}
 
if(cacheGroupes.size() > 0) {
conteneurGroupesChampsEtendus.add(indicationSaisieGroupe);
conteneurGroupesChampsEtendus.add(groupesChampsEtendus);
conteneurGroupesChampsEtendus.add(conteneurlabelGroupe);
doLayout();
}
}
422,41 → 281,4
descriptionChamp.setHTML("<span class=\"descriptionChampEtenduTitre\">Description :</span> "+description);
}
}
private Store getGroupesChampsEtendusStore(ListeGroupesChampsEtendus listeGroupesChampsEtendus) {
int i = 1;
Object[][] valeurs = new Object[listeGroupesChampsEtendus.size()+1][2];
valeurs[0][0] = "...";
valeurs[0][1] = "";
if(listeGroupesChampsEtendus.size() > 0) {
for (Iterator<String> it = listeGroupesChampsEtendus.keySet().iterator(); it.hasNext();)
{
String cle = it.next();
valeurs[i][0]= cle;
valeurs[i][1]= cle;
i++;
}
}
SimpleStore store = new SimpleStore(new String[] {"label","cle"},valeurs);
store.load();
return store;
}
private Store initStoreChampsEtendusVide() {
Object[][] refData = new Object[0][1];
FieldDef defLabel = new StringFieldDef("label");
FieldDef defCle = new StringFieldDef("cle");
FieldDef[] defTab = {defLabel, defCle};
RecordDef rd = new RecordDef(defTab);
final MemoryProxy dataProxy = new MemoryProxy(refData);
final ArrayReader reader = new ArrayReader(rd);
Store store = new Store(dataProxy,reader);
return store;
}
}
/trunk/src/org/tela_botanica/client/util/autocompletion/AutoCompletionComboBox.java
New file
0,0 → 1,282
package org.tela_botanica.client.util.autocompletion;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
 
import org.tela_botanica.client.cel2;
import org.tela_botanica.client.modeles.objets.Utilisateur;
 
import com.google.gwt.core.client.Callback;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestBox.DefaultSuggestionDisplay;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.SuggestBox.SuggestionDisplay;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.gwtext.client.widgets.BoxComponent;
import com.gwtext.client.widgets.Component;
import com.gwtext.client.widgets.Container;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.event.PanelListener;
import com.gwtext.client.widgets.event.PanelListenerAdapter;
import com.gwtext.client.widgets.layout.FitLayout;
 
@SuppressWarnings("unchecked")
public abstract class AutoCompletionComboBox extends Panel {
Label label = null;
MultiWordSuggestOracle msu = null;
SuggestBox suggestions = null;
DefaultSuggestionDisplay sgd = null;
Callback<String, String> surCopierColler = null;
SuggestOracle.Request requeteOracle;
SuggestOracle.Callback callBackOracle;
Timer suggestionTimer = null;
int tempsAvantRequete = 500;
Map<String, String> possibilites = null;
String urlRequete = "";
public AutoCompletionComboBox(String nomLabel, String urlRequete) {
this.setStyleName("champAutoComplete");
this.label = new Label(nomLabel+":");
this.urlRequete = urlRequete;
sgd = new SuggestBox.DefaultSuggestionDisplay();
msu = new MultiWordSuggestOracle() {
@Override
public void requestSuggestions(Request request, Callback callback) {
List<MultiWordSuggestion> retenus = new ArrayList<MultiWordSuggestion>();
Iterator<String> it = possibilites.keySet().iterator();
while (it.hasNext()) {
String cle = it.next();
MultiWordSuggestion muWoSug = new MultiWordSuggestion(possibilites.get(cle), possibilites.get(cle));
retenus.add(muWoSug);
}
 
Response reponse = new Response(retenus);
callback.onSuggestionsReady(request, reponse);
}
};
 
suggestions = new SuggestBox(msu, new TextBox(), sgd) {
public void onBrowserEvent(Event event) {
switch (event.getTypeInt()) {
case Event.ONPASTE: {
if(surCopierColler != null) {
surCopierColler.onSuccess(suggestions.getValueBox().getValue());
}
}
break;
default:
super.onBrowserEvent(event);
}
}
};
suggestions.setAutoSelectEnabled(false);
setLayout(new FitLayout());
add(label);
add(suggestions);
gererEvenements();
}
public void gererEvenements() {
suggestions.addKeyDownHandler(new KeyDownHandler() {
 
@Override
public void onKeyDown(KeyDownEvent event) {
// Lorsque la liste de suggestions est ouverte, une frappe sur entrée selectionne la valeur
// Si elle est fermée, elle déclenche la fonction abstraite de validation (utile pour les champs
// du genre station, milieu etc... et la saisie d'obs rapide
if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
if((sgd == null || !sgd.isSuggestionListShowing())) {
onValidationSaisie();
event.stopPropagation();
return;
} else {
// Dans les autres cas, un appui sur entrée ne doit pas redéclencher l'autcomplétion
return;
}
}
// Tout autre frappe d'un caractère "normal" déclenche le timer d'autocomplétion
if(!KeyDownEvent.isArrow(event.getNativeKeyCode())) {
gererTimer();
}
}
 
});
requeteOracle = new SuggestOracle.Request();
callBackOracle = new SuggestOracle.Callback() {
 
public void onSuggestionsReady(SuggestOracle.Request request, SuggestOracle.Response response) {
suggestions.showSuggestionList();
}
};
suggestions.addSelectionHandler(new SelectionHandler<SuggestOracle.Suggestion>(){
@Override
public void onSelection(SelectionEvent<Suggestion> event) {
onSelectionValeur();
}
});
suggestions.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
onModificationValeur();
}
});
surCopierColler = new Callback<String, String>() {
@Override
public void onSuccess(String result) {
gererTimer();
}
@Override
public void onFailure(String reason) {
// rien à faire ça n'échoue jamais
}
};
addListener(new PanelListenerAdapter() {
@Override
public void onResize(BoxComponent component, int adjWidth, int adjHeight,
int rawWidth, int rawHeight) {
redimensionner(rawWidth);
}
});
}
public void redimensionner(final int largeur) {
suggestions.setWidth((largeur - label.getOffsetWidth() - 13)+"px");
}
public void gererTimer() {
if(suggestionTimer == null) {
suggestionTimer = new Timer() {
public void run() {
requeteSuggestions();
}
};
suggestionTimer.schedule(tempsAvantRequete);
} else {
suggestionTimer.schedule(tempsAvantRequete);
}
}
public void setTempsAvantRequete(int temps) {
tempsAvantRequete = temps;
}
public int getTempsAvantRequete(int temps) {
return tempsAvantRequete;
}
public void requeteSuggestions() {
// Suppression des espaces et caractères inutiles
String valeur = suggestions.getValue().trim().isEmpty() ? "*" : suggestions.getValue().trim();
final String requeteAjax = URL.encodeQueryString(valeur);
// ceci permet au composant qui utilise l'autocomplétion
// d'annuler une requete
if(requeteAjax == null) {
return;
}
String urlRequeteUtil = urlRequete.replace("{utilisateur}", Utilisateur.getInstance().getIdentifiantUtilisateurConsulte());
String urlProxy = urlRequeteUtil+requeteAjax;
RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, urlProxy) ;
try {
rb.sendRequest(null, new RequestCallback() {
public void onError(final Request request, final Throwable exception) {
// TODO Auto-generated method stub
}
 
public void onResponseReceived(final Request request,
final Response response) {
surReponseRequete(requeteAjax, response);
}
}) ;
 
} catch (RequestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void surReponseRequete(String requete, Response response) {
possibilites = parserResultatRequete(response);
msu.clear();
Iterator<String> it = possibilites.keySet().iterator();
while (it.hasNext()) {
msu.add(possibilites.get(it.next()));
}
requeteOracle.setQuery(requete);
msu.requestSuggestions(requeteOracle, callBackOracle);
}
public String getText() {
return suggestions.getText();
}
public String getRawValue() {
return suggestions.getText();
}
public void setValue(String texte) {
suggestions.setText(texte);
}
public void reset() {
suggestions.setValue("");
}
public void setTabIndex(int index) {
suggestions.setTabIndex(index);
}
protected abstract Map<String, String> parserResultatRequete(Response response);
protected abstract void onModificationValeur();
protected abstract void onSelectionValeur();
protected abstract void onValidationSaisie();
}
/trunk/src/org/tela_botanica/client/vues/observation/FormulaireSaisieObservationVue.java
12,6 → 12,7
import org.tela_botanica.client.cel2;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
import org.tela_botanica.client.modeles.dao.ListeReferentielPersoAsynchroneDAO;
import org.tela_botanica.client.modeles.objets.ChampEtendu;
import org.tela_botanica.client.modeles.objets.Configuration;
import org.tela_botanica.client.modeles.objets.EntiteGeographiqueObservation;
18,10 → 19,12
import org.tela_botanica.client.modeles.objets.ListeObservation;
import org.tela_botanica.client.modeles.objets.ListeReferentielLocalite;
import org.tela_botanica.client.modeles.objets.ListeReferentielNom;
import org.tela_botanica.client.modeles.objets.ListeReferentielPerso;
import org.tela_botanica.client.modeles.objets.Observation;
import org.tela_botanica.client.modeles.objets.Ontologies;
import org.tela_botanica.client.modeles.objets.ReferentielLocalite;
import org.tela_botanica.client.modeles.objets.ReferentielNom;
import org.tela_botanica.client.modeles.objets.Utilisateur;
import org.tela_botanica.client.modeles.objets.ListeReferentielPerso.TypesReferentiels;
import org.tela_botanica.client.observation.ObservationMediateur;
import org.tela_botanica.client.util.AutoCompletionRefComboBox;
28,9 → 31,15
import org.tela_botanica.client.util.ChampSaisieEtendu;
import org.tela_botanica.client.util.FormulaireSaisieChampEtendu;
import org.tela_botanica.client.util.Util;
import org.tela_botanica.client.util.autocompletion.AutoCompletionComboBox;
 
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.Response;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
49,6 → 58,7
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;
91,9 → 101,9
FormPanel panneauFormulaire = null;
 
private DateField date = null;
private ComboBox lieudit = null;
private ComboBox station = null;
private ComboBox milieu = null;
private AutoCompletionComboBox lieudit = null;
private AutoCompletionComboBox station = null;
private AutoCompletionComboBox milieu = null;
private TextField comment = null;
private ComboBox localite = null;
358,18 → 368,27
 
panneauPremierColonne.add(htmllocalitePanel);
 
station = new AutoCompletionRefComboBox("Station", "station", observationMediateur, TypesReferentiels.REFERENTIEL_STATION) {
 
station = new AutoCompletionComboBox("Station", ListeReferentielPersoAsynchroneDAO.getUrlReferentielPerso(TypesReferentiels.REFERENTIEL_STATION)) {
@Override
public void onModificationValeur() {
protected Map<String, String> parserResultatRequete(Response response) {
return Util.parserRetourReferentielPerso(response);
}
@Override
public void onSelectionValeur() {
stationModifiee = true;
}
@Override
protected void onModificationValeur() {
stationModifiee = true;
}
 
@Override
public void onValidationSaisie() {
validerSaisie(Champs.STATION);
}
};
};
panneauPremierColonne.add(station, new AnchorLayoutData("95%"));
 
latitude = new TextField("Lat", "lat");
500,32 → 519,49
selecteurAbondance.setTpl(champsListeTpl);
panneauPremierColonne.add(selecteurAbondance, new AnchorLayoutData("95%"));
lieudit = new AutoCompletionRefComboBox("Lieu-dit", "lieudit",observationMediateur,TypesReferentiels.REFERENTIEL_LIEU_DIT) {
 
lieudit = new AutoCompletionComboBox("Lieu-dit", ListeReferentielPersoAsynchroneDAO.getUrlReferentielPerso(TypesReferentiels.REFERENTIEL_LIEU_DIT)) {
@Override
public void onModificationValeur() {
protected Map<String, String> parserResultatRequete(Response response) {
return Util.parserRetourReferentielPerso(response);
}
@Override
public void onSelectionValeur() {
lieuDitModifie = true;
}
@Override
protected void onModificationValeur() {
lieuDitModifie = true;
}
 
@Override
public void onValidationSaisie() {
validerSaisie(Champs.LIEUDIT);
}
};
}
};
panneauSecondeColonne.add(lieudit, new AnchorLayoutData("95%"));
milieu = new AutoCompletionRefComboBox("Milieu","milieu",observationMediateur,TypesReferentiels.REFERENTIEL_MILIEU) {
 
milieu = new AutoCompletionComboBox("Milieu", ListeReferentielPersoAsynchroneDAO.getUrlReferentielPerso(TypesReferentiels.REFERENTIEL_MILIEU)) {
@Override
public void onModificationValeur() {
protected Map<String, String> parserResultatRequete(Response response) {
return Util.parserRetourReferentielPerso(response);
}
@Override
public void onSelectionValeur() {
milieuModifie = true;
}
@Override
protected void onModificationValeur() {
milieuModifie = true;
}
 
@Override
public void onValidationSaisie() {
validerSaisie(Champs.MILIEU);
}
}
};
panneauSecondeColonne.add(milieu, new AnchorLayoutData("95%"));
 
605,6 → 641,8
htmllocalitePanel.doLayout();
htmlPanel.doLayout();
redimensionnerChampsEtendus();
doLayout();
}
631,6 → 669,7
if(conteneurChampEtenduGauche != null && conteneurChampEtenduDroite != null) {
conteneurChampEtenduGauche.show();
conteneurChampEtenduDroite.show();
redimensionnerChampsEtendus();
}
lienAfficherChampsEtendus.setText("Cacher les champs étendus");
}
718,7 → 757,7
}
private void ajouterChampEtenduAuFormulaire(ChampSaisieEtendu nChamp, boolean fermerPopup) {
ChampEtendu chet = new ChampEtendu(nChamp.getName(), nChamp.getFieldLabel(), "");
ChampEtendu chet = new ChampEtendu(nChamp.getCle(), nChamp.getLabel(), "");
Map<String, ChampEtendu> champsEt = getValeursChampsEtendus();
if(!champsEt.containsKey(chet.getCle())) {
champsEt.put(chet.getCle(), chet);
860,7 → 899,7
@Override
public void onClick(Button button, EventObject e) {
if(selectionMultiple) {
modifierObservationEnMasse(null);
modifierObservationEnMasse(null);
} else {
modifierObservation() ;
}
1408,10 → 1447,6
observationMediateur.obtenirListeReferentielNom(this,referentiel ,esp);
}
 
protected void obtenirReferentielStation() {
observationMediateur.obtenirListeReferentielPerso(this,TypesReferentiels.REFERENTIEL_STATION,station.getText());
}
 
protected void obtenirListeReferentielMilieu() {
observationMediateur.obtenirListeReferentielPerso(this,TypesReferentiels.REFERENTIEL_MILIEU,milieu.getText());
}
1793,7 → 1828,7
private void viderChampsEtendus() {
if(listeChampsEtendus != null) {
for (Iterator<String> it = listeChampsEtendus.keySet().iterator(); it.hasNext();) {
TextField champEtendu = listeChampsEtendus.get(it.next());
ChampSaisieEtendu champEtendu = listeChampsEtendus.get(it.next());
champEtendu.destroy();
}
if(conteneurChampEtenduGauche != null && conteneurChampEtenduDroite != null) {
1852,7 → 1887,7
label = Util.formaterCleChampsEtenduPourAffichage(label);
}
 
ChampSaisieEtendu champTexteEtendu = new ChampSaisieEtendu(label, id);
ChampSaisieEtendu champTexteEtendu = new ChampSaisieEtendu(label, id, ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(id));
if(champ.equals(champsAFocus)) {
champTexteEtendu.focus();
}
1874,6 → 1909,8
if(!afficherChampsEtendus) {
conteneurChampEtenduGauche.setVisible(false);
conteneurChampEtenduDroite.setVisible(false);
} else {
redimensionnerChampsEtendus();
}
} else {
lienAfficherChampsEtendus.setVisible(false);
1880,6 → 1917,25
}
doLayout();
}
private void redimensionnerChampsEtendus() {
int largeur = conteneurChampEtenduGauche.getWidth();
if(largeur <= 0) {
Timer t = new Timer() {
@Override
public void run() {
redimensionnerChampsEtendus();
}
};
t.schedule(150);
} else {
for (Iterator<String> iterator = listeChampsEtendus.keySet().iterator(); iterator
.hasNext();) {
ChampSaisieEtendu ch = listeChampsEtendus.get(iterator.next());
ch.redimensionner(largeur - 15);
}
}
}
 
private Map<String, ChampEtendu> getValeursChampsEtendus() {
Map<String, ChampEtendu> valeursChampsEtendus = new HashMap<String, ChampEtendu>();
1886,9 → 1942,9
if(listeChampsEtendus != null) {
for (Iterator<String> it = listeChampsEtendus.keySet().iterator(); it.hasNext();) {
String cle = it.next();
TextField champTexteEtendu = listeChampsEtendus.get(cle);
String label = champTexteEtendu.getFieldLabel();
String valeur = champTexteEtendu.getValueAsString();
ChampSaisieEtendu champTexteEtendu = listeChampsEtendus.get(cle);
String label = champTexteEtendu.getLabel();
String valeur = champTexteEtendu.getRawValue();
ChampEtendu champEtendu = new ChampEtendu(cle, label, valeur);
valeursChampsEtendus.put(cle, champEtendu);
}
/trunk/src/org/tela_botanica/client/modeles/dao/ListeReferentielPersoAsynchroneDAO.java
100,4 → 100,12
e.printStackTrace();
}
}
public static String getUrlReferentielPerso(TypesReferentiels refDemande) {
return Configuration.getServiceBaseUrl() +
"/SelfRefList/"+
"{utilisateur}/"+
refDemande.toString()+
"?start=0&limit=50&recherche=";
}
}
/trunk/src/org/tela_botanica/client/modeles/dao/ListeReferentielChampsEtendusDAO.java
3,6 → 3,7
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
 
import org.tela_botanica.client.cel2;
import org.tela_botanica.client.interfaces.Rafraichissable;
255,4 → 256,49
protected static String obtenirNomPageChampEtendu(String cle) {
return prefixePageChampEtendu+Util.convertirEnChaMot(cle);
}
public static String getUrlRequeteValeursChampEtendu(String cle) {
return Configuration.getServiceBaseUrl() +
"/NomsChampsEtendus/valeur"+
"?cle="+URL.encode(cle)+"&recherche=";
}
public static String getUrlRequeteNomsChampsEtendus() {
return Configuration.getServiceBaseUrl()+
"/NomsChampsEtendus/cle?recherche=";
}
public static Map<String, String> parserRetourListeValeursChampsEtendus(Response response) {
Map<String, String> valeurs = new HashMap<String, String>();
final JSONValue responseValue = JSONParser.parse(response.getText());
JSONArray reponse = null;
if ((reponse = responseValue.isArray()) != null) {
for(int i = 0; i < reponse.size(); i++) {
valeurs.put(reponse.get(i).isString().stringValue(), reponse.get(i).isString().stringValue());
}
}
return valeurs;
}
public static Map<String, String> parserRetourListeNomsChampsEtendus(Response response) {
final JSONValue responseValue = JSONParser.parse(response.getText());
JSONObject reponse = null;
cacheClesLabels = new HashMap<String, String>();
if ((reponse = responseValue.isObject()) != null) {
Iterator<String> it = reponse.keySet().iterator();
while(it.hasNext()) {
String cle = it.next();
String valeur = reponse.get(cle).isString().stringValue();
cacheClesLabels.put(cle, valeur);
}
}
return cacheClesLabels;
}
}