Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 2211 → Rev 2212

/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/formulaires/autocompletion/AutoCompletionComboBoxVue.java
New file
0,0 → 1,105
package org.tela_botanica.del.client.composants.formulaires.autocompletion;
 
import org.tela_botanica.del.client.utils.InfosNomPourAutocompletion;
import org.tela_botanica.del.client.utils.TBSuggestOracle;
 
import com.google.gwt.core.client.Callback;
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
 
public class AutoCompletionComboBoxVue extends LayoutPanel implements AutoCompletionComboBoxPresenteur.Vue {
 
TBSuggestOracle msu = new TBSuggestOracle();
SuggestBox suggestions = new SuggestBox(msu);
Callback<String, String> surCopierColler = null;
 
public AutoCompletionComboBoxVue() {
add(suggestions);
setHeight("25px");
setWidth("100%");
sinkEvents(Event.ONPASTE);
}
@Override
public SuggestBox getSuggestBox() {
return suggestions;
}
public void remplirListe(InfosNomPourAutocompletion[] listePropositions) {
msu.clear();
for (int i = 0; i < listePropositions.length; i++) {
msu.add(listePropositions[i]);
}
}
@Override
public void afficherSuggestions(SuggestOracle.Request requeteOracle, SuggestOracle.Callback callBackOracle) {
msu.requestSuggestions(requeteOracle, callBackOracle);
}
@Override
public void afficherListeDeroulante() {
suggestions.showSuggestionList();
}
public void nettoyer() {
suggestions.setText("");
}
public void setValeur(String taxon) {
suggestions.setValue(taxon);
}
 
@Override
public HasKeyPressHandlers getSuggestBoxHasKeyPressHandlers() {
return suggestions;
}
@Override
public HasSelectionHandlers<Suggestion> getSuggestBoxHasSelectionChangeHandlers() {
return suggestions;
}
 
@Override
public String getValeur() {
return suggestions.getText();
}
 
@Override
public void ajouterVue(HasWidgets composite) {
composite.add(this.asWidget());
}
 
@Override
public void afficherStyleErreur(String styleErreur) {
suggestions.addStyleName(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
suggestions.removeStyleName(styleErreur);
}
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
switch (event.getTypeInt()) {
case Event.ONPASTE: {
if(surCopierColler != null) {
surCopierColler.onSuccess(suggestions.getValueBox().getValue());
}
}
}
}
 
@Override
public void setHandlerCopierColler(Callback<String, String> cb) {
surCopierColler = cb;
}
}
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/formulaires/autocompletion/AutoCompletionComboBoxPresenteur.java
New file
0,0 → 1,208
package org.tela_botanica.del.client.composants.formulaires.autocompletion;
 
import org.tela_botanica.del.client.utils.InfosNomPourAutocompletion;
 
import com.google.gwt.core.client.Callback;
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
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.Timer;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
 
public abstract class AutoCompletionComboBoxPresenteur {
public interface Vue extends IsWidget {
public void ajouterVue(HasWidgets composite);
public HasKeyPressHandlers getSuggestBoxHasKeyPressHandlers();
public String getValeur();
public void remplirListe(InfosNomPourAutocompletion[] suggestions);
public void afficherSuggestions(SuggestOracle.Request request,SuggestOracle.Callback response);
public void afficherListeDeroulante();
public void nettoyer();
public void setValeur(String valeur);
public HasSelectionHandlers<Suggestion> getSuggestBoxHasSelectionChangeHandlers();
public HasText getSuggestBox();
public void afficherStyleErreur(String styleErreur);
public void supprimerStyleErreur(String styleErreur);
public void setHandlerCopierColler(Callback<String, String> cb);
}
private Vue autoCompletionComboBoxVue;
SuggestOracle.Request requeteOracle;
SuggestOracle.Callback callBackOracle;
Timer suggestionTimer = null;
int tempsAvantRequete = 500;
String urlRequete = "";
public AutoCompletionComboBoxPresenteur(Vue vue, String urlRequete) {
this.autoCompletionComboBoxVue = vue;
this.urlRequete = urlRequete;
gererEvenements();
}
public void go(HasWidgets composite) {
autoCompletionComboBoxVue.ajouterVue(composite);
}
public void gererEvenements() {
autoCompletionComboBoxVue.getSuggestBoxHasKeyPressHandlers().addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if(event.getUnicodeCharCode() != 0) {
gererTimer();
}
}
});
requeteOracle = new SuggestOracle.Request();
callBackOracle = new SuggestOracle.Callback() {
 
public void onSuggestionsReady(SuggestOracle.Request request, SuggestOracle.Response response) {
autoCompletionComboBoxVue.afficherListeDeroulante();
}
};
autoCompletionComboBoxVue.getSuggestBoxHasSelectionChangeHandlers().addSelectionHandler(new SelectionHandler<SuggestOracle.Suggestion>(){
@Override
public void onSelection(SelectionEvent<Suggestion> event) {
surSelectionSuggestion(event.getSelectedItem().getReplacementString());
}
});
autoCompletionComboBoxVue.setHandlerCopierColler(new Callback<String, String>() {
@Override
public void onSuccess(String result) {
gererTimer();
}
@Override
public void onFailure(String reason) {
// rien à faire ça n'échoue jamais
}
});
}
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 String getValeur() {
return autoCompletionComboBoxVue.getValeur();
}
public void setValeur(String taxon) {
autoCompletionComboBoxVue.setValeur(taxon);
}
public void nettoyer() {
autoCompletionComboBoxVue.nettoyer();
}
public void requeteSuggestions() {
// Suppression des espaces et caractères inutiles
String valeur = autoCompletionComboBoxVue.getValeur().trim();
final String requete = URL.encodeQueryString(valeur);
String requeteAjax = effectuerPreTraitementChaineRequete(requete);
// ceci permet au composant qui utilise l'autocomplétion
// d'annuler une requete
if(requeteAjax == null) {
return;
}
String urlProxy = urlRequete+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(requete, response);
}
}) ;
 
} catch (RequestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void surReponseRequete(String requete, Response response) {
InfosNomPourAutocompletion[] valeurs = parserResultatRequete(response);
autoCompletionComboBoxVue.remplirListe(valeurs);
requeteOracle.setQuery(requete);
autoCompletionComboBoxVue.afficherSuggestions(requeteOracle, callBackOracle);
}
protected void surSelectionSuggestion(String suggestion) {
return;
}
/**
* Permet d'intervenir sur la chaine tapée par l'utilisateur avant que celle-ci ne soit passée
* à la requête asynchrone pour pouvoir la formater (pour mettre en minuscule, séparer des termes)
* par défaut renvoie la chaine telle quelle, à surcharger au besoin
* @param String requete chaine de recherche contenant ce que l'utilisateur à tapé
* @return String une chaine transformée
*/
protected String effectuerPreTraitementChaineRequete(String requete) {
return requete;
}
/**
* Parse les résultats de la requete afin de pouvoir les utiliser à implémenter par le
* composants qui crée la combobox selon le contexte et le web service appelé.
* @param Response la réponse à la requête asynchrone
* @return String[] le tableau des suggestions qui sera affiché dans la combobox
*/
protected abstract InfosNomPourAutocompletion[] parserResultatRequete(Response response);
 
public Vue getAutoCompletionComboBoxVue() {
return autoCompletionComboBoxVue;
}
public void afficherStyleErreur(String styleErreur) {
autoCompletionComboBoxVue.afficherStyleErreur(styleErreur);
}
public void supprimerStyleErreur(String styleErreur) {
autoCompletionComboBoxVue.supprimerStyleErreur(styleErreur);
}
}