Subversion Repositories eFlore/Applications.del

Rev

Details | Last modification | View Log | RSS feed

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