Subversion Repositories eFlore/Applications.del

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2211 arthur 1
package org.tela_botanica.del.client.composants.formulaires.autocompletion;
2
 
3
import org.tela_botanica.del.client.utils.InfosNomPourAutocompletion;
4
 
5
import com.google.gwt.core.client.Callback;
6
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
7
import com.google.gwt.event.dom.client.KeyPressEvent;
8
import com.google.gwt.event.dom.client.KeyPressHandler;
9
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
10
import com.google.gwt.event.logical.shared.SelectionEvent;
11
import com.google.gwt.event.logical.shared.SelectionHandler;
12
import com.google.gwt.http.client.Request;
13
import com.google.gwt.http.client.RequestBuilder;
14
import com.google.gwt.http.client.RequestCallback;
15
import com.google.gwt.http.client.RequestException;
16
import com.google.gwt.http.client.Response;
17
import com.google.gwt.http.client.URL;
18
import com.google.gwt.user.client.Timer;
19
import com.google.gwt.user.client.ui.HasText;
20
import com.google.gwt.user.client.ui.HasWidgets;
21
import com.google.gwt.user.client.ui.IsWidget;
22
import com.google.gwt.user.client.ui.SuggestOracle;
23
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
24
 
25
public abstract class AutoCompletionComboBoxPresenteur {
26
 
27
	public interface Vue extends IsWidget {
28
		public void ajouterVue(HasWidgets composite);
29
		public HasKeyPressHandlers getSuggestBoxHasKeyPressHandlers();
30
		public String getValeur();
31
		public void remplirListe(InfosNomPourAutocompletion[] suggestions);
32
		public void afficherSuggestions(SuggestOracle.Request request,SuggestOracle.Callback response);
33
		public void afficherListeDeroulante();
34
		public void nettoyer();
35
		public void setValeur(String valeur);
36
		public HasSelectionHandlers<Suggestion> getSuggestBoxHasSelectionChangeHandlers();
37
		public HasText getSuggestBox();
38
		public void afficherStyleErreur(String styleErreur);
39
		public void supprimerStyleErreur(String styleErreur);
40
		public void setHandlerCopierColler(Callback<String, String> cb);
41
	}
42
	private Vue autoCompletionComboBoxVue;
43
 
44
	SuggestOracle.Request requeteOracle;
45
    SuggestOracle.Callback callBackOracle;
46
 
47
	Timer suggestionTimer = null;
48
    int tempsAvantRequete = 500;
49
 
50
    String urlRequete = "";
51
 
52
	public AutoCompletionComboBoxPresenteur(Vue vue, String urlRequete) {
53
		this.autoCompletionComboBoxVue = vue;
54
		this.urlRequete = urlRequete;
55
		gererEvenements();
56
	}
57
 
58
	public void go(HasWidgets composite) {
59
		autoCompletionComboBoxVue.ajouterVue(composite);
60
	}
61
 
62
	public void gererEvenements() {
63
		autoCompletionComboBoxVue.getSuggestBoxHasKeyPressHandlers().addKeyPressHandler(new KeyPressHandler() {
64
			public void onKeyPress(KeyPressEvent event) {
65
				if(event.getUnicodeCharCode() != 0) {
66
					gererTimer();
67
				}
68
			}
69
		});
70
 
71
		requeteOracle = new SuggestOracle.Request();
72
		callBackOracle = new SuggestOracle.Callback() {
73
 
74
			public void onSuggestionsReady(SuggestOracle.Request request, SuggestOracle.Response response) {
75
				autoCompletionComboBoxVue.afficherListeDeroulante();
76
			}
77
	    };
78
 
79
	    autoCompletionComboBoxVue.getSuggestBoxHasSelectionChangeHandlers().addSelectionHandler(new SelectionHandler<SuggestOracle.Suggestion>(){
80
			@Override
81
			public void onSelection(SelectionEvent<Suggestion> event) {
82
				surSelectionSuggestion(event.getSelectedItem().getReplacementString());
83
			}
84
		});
85
 
86
	    autoCompletionComboBoxVue.setHandlerCopierColler(new Callback<String, String>() {
87
			@Override
88
			public void onSuccess(String result) {
89
				gererTimer();
90
			}
91
 
92
			@Override
93
			public void onFailure(String reason) {
94
				// rien à faire ça n'échoue jamais
95
			}
96
		});
97
	}
98
 
99
	public void gererTimer() {
100
		if(suggestionTimer == null) {
101
			suggestionTimer = new Timer() {
102
				public void run() {
103
					requeteSuggestions();
104
				}
105
			};
106
			suggestionTimer.schedule(tempsAvantRequete);
107
		} else {
108
			suggestionTimer.schedule(tempsAvantRequete);
109
		}
110
	}
111
 
112
	public void setTempsAvantRequete(int temps) {
113
		tempsAvantRequete = temps;
114
	}
115
 
116
	public int getTempsAvantRequete(int temps) {
117
		return tempsAvantRequete;
118
	}
119
 
120
	public String getValeur() {
121
		return autoCompletionComboBoxVue.getValeur();
122
	}
123
 
124
	public void setValeur(String taxon) {
125
		autoCompletionComboBoxVue.setValeur(taxon);
126
	}
127
 
128
	public void nettoyer() {
129
		autoCompletionComboBoxVue.nettoyer();
130
	}
131
 
132
	public void requeteSuggestions() {
133
 
134
		// Suppression des espaces et caractères inutiles
135
		String valeur = autoCompletionComboBoxVue.getValeur().trim();
136
 
137
		final String requete = URL.encodeQueryString(valeur);
138
		String requeteAjax = effectuerPreTraitementChaineRequete(requete);
139
 
140
		// ceci permet au composant qui utilise l'autocomplétion
141
		// d'annuler une requete
142
		if(requeteAjax == null) {
143
			return;
144
		}
145
 
146
		String urlProxy = urlRequete+requeteAjax;
147
 
148
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, urlProxy) ;
149
		try {
150
			rb.sendRequest(null, new RequestCallback() {
151
				public void onError(final Request request, final Throwable exception) {
152
					// TODO Auto-generated method stub
153
				}
154
 
155
				public void onResponseReceived(final Request request,
156
						final Response response) {
157
					surReponseRequete(requete, response);
158
				}
159
			}) ;
160
 
161
		} catch (RequestException e) {
162
			// TODO Auto-generated catch block
163
			e.printStackTrace();
164
		}
165
	}
166
 
167
	public void surReponseRequete(String requete, Response response) {
168
		InfosNomPourAutocompletion[] valeurs = parserResultatRequete(response);
169
		autoCompletionComboBoxVue.remplirListe(valeurs);
170
		requeteOracle.setQuery(requete);
171
		autoCompletionComboBoxVue.afficherSuggestions(requeteOracle, callBackOracle);
172
	}
173
 
174
	protected void surSelectionSuggestion(String suggestion) {
175
		return;
176
	}
177
 
178
	/**
179
	 * Permet d'intervenir sur la chaine tapée par l'utilisateur avant que celle-ci ne soit passée
180
	 * à la requête asynchrone pour pouvoir la formater (pour mettre en minuscule, séparer des termes)
181
	 * par défaut renvoie la chaine telle quelle, à surcharger au besoin
182
	 * @param String requete chaine de recherche contenant ce que l'utilisateur à tapé
183
	 * @return String une chaine transformée
184
	 */
185
	protected String effectuerPreTraitementChaineRequete(String requete) {
186
		return requete;
187
	}
188
 
189
	/**
190
	 * Parse les résultats de la requete afin de pouvoir les utiliser à implémenter par le
191
	 * composants qui crée la combobox selon le contexte et le web service appelé.
192
	 * @param Response la réponse à la requête asynchrone
193
	 * @return String[] le tableau des suggestions qui sera affiché dans la combobox
194
	 */
195
	protected abstract InfosNomPourAutocompletion[] parserResultatRequete(Response response);
196
 
197
	public Vue getAutoCompletionComboBoxVue() {
198
		return autoCompletionComboBoxVue;
199
	}
200
 
201
	public void afficherStyleErreur(String styleErreur) {
202
		autoCompletionComboBoxVue.afficherStyleErreur(styleErreur);
203
	}
204
 
205
	public void supprimerStyleErreur(String styleErreur) {
206
		autoCompletionComboBoxVue.supprimerStyleErreur(styleErreur);
207
	}
208
}