Subversion Repositories eFlore/Applications.del

Rev

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