Subversion Repositories eFlore/Applications.del

Rev

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

Rev Author Line No. Line
261 aurelien 1
package org.tela_botanica.del.client.composants.formulaires;
2
 
450 aurelien 3
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
261 aurelien 4
import com.google.gwt.event.dom.client.KeyPressEvent;
5
import com.google.gwt.event.dom.client.KeyPressHandler;
6
import com.google.gwt.http.client.Request;
7
import com.google.gwt.http.client.RequestBuilder;
8
import com.google.gwt.http.client.RequestCallback;
9
import com.google.gwt.http.client.RequestException;
10
import com.google.gwt.http.client.Response;
11
import com.google.gwt.http.client.URL;
12
import com.google.gwt.user.client.Timer;
13
import com.google.gwt.user.client.ui.HasWidgets;
450 aurelien 14
import com.google.gwt.user.client.ui.IsWidget;
261 aurelien 15
import com.google.gwt.user.client.ui.SuggestOracle;
16
 
268 aurelien 17
public abstract class AutoCompletionComboBoxPresenteur {
261 aurelien 18
 
450 aurelien 19
	public interface Vue extends IsWidget {
20
		public void ajouterVue(HasWidgets composite);
21
		public HasKeyPressHandlers getSuggestBoxHasKeyPressHandlers();
22
		public String getValeur();
23
		public void remplirListe(String[] suggestions);
24
		public void afficherSuggestions(SuggestOracle.Request request,SuggestOracle.Callback response);
25
		public void afficherListeDeroulante();
26
		public void nettoyer();
27
		public void setValeur(String valeur);
28
	}
29
	private Vue autoCompletionComboBoxVue;
30
 
261 aurelien 31
	SuggestOracle.Request requeteOracle;
32
    SuggestOracle.Callback callBackOracle;
33
 
34
	Timer suggestionTimer = null;
35
    int tempsAvantRequete = 500;
268 aurelien 36
 
37
    String urlRequete = "";
261 aurelien 38
 
450 aurelien 39
	public AutoCompletionComboBoxPresenteur(Vue vue, String urlRequete) {
40
		this.autoCompletionComboBoxVue = vue;
268 aurelien 41
		this.urlRequete = urlRequete;
450 aurelien 42
		gererEvenements();
261 aurelien 43
	}
44
 
45
	public void go(HasWidgets composite) {
450 aurelien 46
		autoCompletionComboBoxVue.ajouterVue(composite);
261 aurelien 47
	}
48
 
49
	public void gererEvenements() {
450 aurelien 50
		autoCompletionComboBoxVue.getSuggestBoxHasKeyPressHandlers().addKeyPressHandler(new KeyPressHandler() {
51
			public void onKeyPress(KeyPressEvent event) {
261 aurelien 52
				if(event.getUnicodeCharCode() != 0) {
450 aurelien 53
					gererTimer();
261 aurelien 54
				}
55
			}
56
		});
57
 
58
		requeteOracle = new SuggestOracle.Request();
59
		callBackOracle = new SuggestOracle.Callback() {
60
 
450 aurelien 61
			public void onSuggestionsReady(SuggestOracle.Request request, SuggestOracle.Response response) {
62
				autoCompletionComboBoxVue.afficherListeDeroulante();
261 aurelien 63
			}
64
	    };
65
	}
66
 
450 aurelien 67
	public void gererTimer() {
68
		if(suggestionTimer == null) {
69
			suggestionTimer = new Timer() {
70
				public void run() {
71
					requeteSuggestions();
72
				}
73
			};
74
			suggestionTimer.schedule(tempsAvantRequete);
75
		} else {
76
			suggestionTimer.schedule(tempsAvantRequete);
77
		}
78
	}
79
 
261 aurelien 80
	public void setTempsAvantRequete(int temps) {
81
		tempsAvantRequete = temps;
82
	}
83
 
84
	public int getTempsAvantRequete(int temps) {
85
		return tempsAvantRequete;
86
	}
87
 
88
	public String getValeur() {
450 aurelien 89
		return autoCompletionComboBoxVue.getValeur();
261 aurelien 90
	}
91
 
415 gduche 92
	public void setValeur(String taxon) {
93
		autoCompletionComboBoxVue.setValeur(taxon);
94
	}
95
 
96
	public void nettoyer() {
97
		autoCompletionComboBoxVue.nettoyer();
98
	}
99
 
450 aurelien 100
	public void requeteSuggestions() {
261 aurelien 101
 
450 aurelien 102
		final String requete = autoCompletionComboBoxVue.getValeur();
328 aurelien 103
		String requeteAjax = effectuerPreTraitementChaineRequete(requete);
375 aurelien 104
		String urlProxy = URL.encode(urlRequete+requeteAjax);
261 aurelien 105
 
106
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, urlProxy) ;
450 aurelien 107
		try {
261 aurelien 108
			rb.sendRequest(null, new RequestCallback() {
109
				public void onError(final Request request, final Throwable exception) {
110
					// TODO Auto-generated method stub
111
 
112
				}
113
 
114
				public void onResponseReceived(final Request request,
115
						final Response response) {
450 aurelien 116
					surReponseRequete(requete, response);
261 aurelien 117
				}
118
			}) ;
119
 
120
		} catch (RequestException e) {
121
			// TODO Auto-generated catch block
122
			e.printStackTrace();
123
		}
124
	}
268 aurelien 125
 
450 aurelien 126
	public void surReponseRequete(String requete, Response response) {
127
		String[] valeurs = parserResultatRequete(response);
128
 
129
		autoCompletionComboBoxVue.remplirListe(valeurs);
130
		requeteOracle.setQuery(requete);
131
		autoCompletionComboBoxVue.afficherSuggestions(requeteOracle, callBackOracle);
132
	}
133
 
328 aurelien 134
	/**
135
	 * Permet d'intervenir sur la chaine tapée par l'utilisateur avant que celle-ci ne soit passée
136
	 * à la requête asynchrone pour pouvoir la formater (pour mettre en minuscule, séparer des termes)
137
	 * par défaut renvoie la chaine telle quelle, à surcharger au besoin
138
	 * @param String requete chaine de recherche contenant ce que l'utilisateur à tapé
139
	 * @return String une chaine transformée
140
	 */
141
	protected String effectuerPreTraitementChaineRequete(String requete) {
142
		return requete;
143
	}
144
 
145
	/**
146
	 * Parse les résultats de la requete afin de pouvoir les utiliser à implémenter par le
147
	 * composants qui crée la combobox selon le contexte et le web service appelé.
148
	 * @param Response la réponse à la requête asynchrone
149
	 * @return String[] le tableau des suggestions qui sera affiché dans la combobox
150
	 */
268 aurelien 151
	protected abstract String[] parserResultatRequete(Response response);
261 aurelien 152
}