Subversion Repositories eFlore/Applications.del

Rev

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

Rev Author Line No. Line
602 aurelien 1
package org.tela_botanica.del.client.composants.formulaires.autocompletion;
261 aurelien 2
 
1886 mathias 3
import org.tela_botanica.del.client.utils.InfosNomPourAutocompletion;
4
 
1957 aurelien 5
import com.google.gwt.core.client.Callback;
450 aurelien 6
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
261 aurelien 7
import com.google.gwt.event.dom.client.KeyPressEvent;
8
import com.google.gwt.event.dom.client.KeyPressHandler;
457 aurelien 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;
261 aurelien 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;
1099 aurelien 19
import com.google.gwt.user.client.ui.HasText;
261 aurelien 20
import com.google.gwt.user.client.ui.HasWidgets;
450 aurelien 21
import com.google.gwt.user.client.ui.IsWidget;
261 aurelien 22
import com.google.gwt.user.client.ui.SuggestOracle;
457 aurelien 23
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
261 aurelien 24
 
268 aurelien 25
public abstract class AutoCompletionComboBoxPresenteur {
261 aurelien 26
 
450 aurelien 27
	public interface Vue extends IsWidget {
28
		public void ajouterVue(HasWidgets composite);
29
		public HasKeyPressHandlers getSuggestBoxHasKeyPressHandlers();
30
		public String getValeur();
1886 mathias 31
		public void remplirListe(InfosNomPourAutocompletion[] suggestions);
450 aurelien 32
		public void afficherSuggestions(SuggestOracle.Request request,SuggestOracle.Callback response);
33
		public void afficherListeDeroulante();
34
		public void nettoyer();
35
		public void setValeur(String valeur);
1099 aurelien 36
		public HasSelectionHandlers<Suggestion> getSuggestBoxHasSelectionChangeHandlers();
37
		public HasText getSuggestBox();
38
		public void afficherStyleErreur(String styleErreur);
39
		public void supprimerStyleErreur(String styleErreur);
1957 aurelien 40
		public void setHandlerCopierColler(Callback<String, String> cb);
450 aurelien 41
	}
42
	private Vue autoCompletionComboBoxVue;
43
 
261 aurelien 44
	SuggestOracle.Request requeteOracle;
45
    SuggestOracle.Callback callBackOracle;
46
 
47
	Timer suggestionTimer = null;
48
    int tempsAvantRequete = 500;
268 aurelien 49
 
50
    String urlRequete = "";
261 aurelien 51
 
450 aurelien 52
	public AutoCompletionComboBoxPresenteur(Vue vue, String urlRequete) {
53
		this.autoCompletionComboBoxVue = vue;
268 aurelien 54
		this.urlRequete = urlRequete;
450 aurelien 55
		gererEvenements();
261 aurelien 56
	}
57
 
58
	public void go(HasWidgets composite) {
450 aurelien 59
		autoCompletionComboBoxVue.ajouterVue(composite);
261 aurelien 60
	}
61
 
62
	public void gererEvenements() {
450 aurelien 63
		autoCompletionComboBoxVue.getSuggestBoxHasKeyPressHandlers().addKeyPressHandler(new KeyPressHandler() {
64
			public void onKeyPress(KeyPressEvent event) {
261 aurelien 65
				if(event.getUnicodeCharCode() != 0) {
450 aurelien 66
					gererTimer();
261 aurelien 67
				}
68
			}
69
		});
70
 
71
		requeteOracle = new SuggestOracle.Request();
72
		callBackOracle = new SuggestOracle.Callback() {
73
 
450 aurelien 74
			public void onSuggestionsReady(SuggestOracle.Request request, SuggestOracle.Response response) {
75
				autoCompletionComboBoxVue.afficherListeDeroulante();
261 aurelien 76
			}
77
	    };
457 aurelien 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
		});
1957 aurelien 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
		});
261 aurelien 97
	}
98
 
450 aurelien 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
 
261 aurelien 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() {
450 aurelien 121
		return autoCompletionComboBoxVue.getValeur();
261 aurelien 122
	}
123
 
415 gduche 124
	public void setValeur(String taxon) {
125
		autoCompletionComboBoxVue.setValeur(taxon);
126
	}
127
 
128
	public void nettoyer() {
129
		autoCompletionComboBoxVue.nettoyer();
130
	}
131
 
450 aurelien 132
	public void requeteSuggestions() {
261 aurelien 133
 
1957 aurelien 134
		// Suppression des espaces et caractères inutiles
135
		String valeur = autoCompletionComboBoxVue.getValeur().trim();
136
		autoCompletionComboBoxVue.setValeur(valeur);
137
 
138
		final String requete = URL.encodeQueryString(valeur);
1367 aurelien 139
		String requeteAjax = effectuerPreTraitementChaineRequete(requete);
140
 
141
		// ceci permet au composant qui utilise l'autocomplétion
142
		// d'annuler une requete
143
		if(requeteAjax == null) {
144
			return;
145
		}
146
 
1437 aurelien 147
		String urlProxy = urlRequete+requeteAjax;
261 aurelien 148
 
149
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, urlProxy) ;
450 aurelien 150
		try {
261 aurelien 151
			rb.sendRequest(null, new RequestCallback() {
152
				public void onError(final Request request, final Throwable exception) {
1957 aurelien 153
					// TODO Auto-generated method stub
261 aurelien 154
				}
155
 
156
				public void onResponseReceived(final Request request,
157
						final Response response) {
450 aurelien 158
					surReponseRequete(requete, response);
261 aurelien 159
				}
160
			}) ;
161
 
162
		} catch (RequestException e) {
163
			// TODO Auto-generated catch block
164
			e.printStackTrace();
165
		}
166
	}
268 aurelien 167
 
450 aurelien 168
	public void surReponseRequete(String requete, Response response) {
1886 mathias 169
		InfosNomPourAutocompletion[] valeurs = parserResultatRequete(response);
450 aurelien 170
		autoCompletionComboBoxVue.remplirListe(valeurs);
171
		requeteOracle.setQuery(requete);
172
		autoCompletionComboBoxVue.afficherSuggestions(requeteOracle, callBackOracle);
173
	}
174
 
457 aurelien 175
	protected void surSelectionSuggestion(String suggestion) {
176
		return;
177
	}
178
 
328 aurelien 179
	/**
180
	 * Permet d'intervenir sur la chaine tapée par l'utilisateur avant que celle-ci ne soit passée
181
	 * à la requête asynchrone pour pouvoir la formater (pour mettre en minuscule, séparer des termes)
182
	 * par défaut renvoie la chaine telle quelle, à surcharger au besoin
183
	 * @param String requete chaine de recherche contenant ce que l'utilisateur à tapé
184
	 * @return String une chaine transformée
185
	 */
186
	protected String effectuerPreTraitementChaineRequete(String requete) {
187
		return requete;
188
	}
189
 
190
	/**
191
	 * Parse les résultats de la requete afin de pouvoir les utiliser à implémenter par le
192
	 * composants qui crée la combobox selon le contexte et le web service appelé.
193
	 * @param Response la réponse à la requête asynchrone
194
	 * @return String[] le tableau des suggestions qui sera affiché dans la combobox
195
	 */
1886 mathias 196
	protected abstract InfosNomPourAutocompletion[] parserResultatRequete(Response response);
564 benjamin 197
 
198
	public Vue getAutoCompletionComboBoxVue() {
199
		return autoCompletionComboBoxVue;
200
	}
1099 aurelien 201
 
202
	public void afficherStyleErreur(String styleErreur) {
203
		autoCompletionComboBoxVue.afficherStyleErreur(styleErreur);
204
	}
205
 
206
	public void supprimerStyleErreur(String styleErreur) {
207
		autoCompletionComboBoxVue.supprimerStyleErreur(styleErreur);
208
	}
261 aurelien 209
}