Subversion Repositories eFlore/Applications.del

Rev

Rev 1782 | 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
 
1782 mathias 5
import com.google.gwt.core.shared.GWT;
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;
1782 mathias 19
import com.google.gwt.user.client.Window;
1099 aurelien 20
import com.google.gwt.user.client.ui.HasText;
261 aurelien 21
import com.google.gwt.user.client.ui.HasWidgets;
450 aurelien 22
import com.google.gwt.user.client.ui.IsWidget;
261 aurelien 23
import com.google.gwt.user.client.ui.SuggestOracle;
457 aurelien 24
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
261 aurelien 25
 
268 aurelien 26
public abstract class AutoCompletionComboBoxPresenteur {
261 aurelien 27
 
450 aurelien 28
	public interface Vue extends IsWidget {
29
		public void ajouterVue(HasWidgets composite);
30
		public HasKeyPressHandlers getSuggestBoxHasKeyPressHandlers();
31
		public String getValeur();
1886 mathias 32
		public void remplirListe(InfosNomPourAutocompletion[] suggestions);
450 aurelien 33
		public void afficherSuggestions(SuggestOracle.Request request,SuggestOracle.Callback response);
34
		public void afficherListeDeroulante();
35
		public void nettoyer();
36
		public void setValeur(String valeur);
1099 aurelien 37
		public HasSelectionHandlers<Suggestion> getSuggestBoxHasSelectionChangeHandlers();
38
		public HasText getSuggestBox();
39
		public void afficherStyleErreur(String styleErreur);
40
		public void supprimerStyleErreur(String styleErreur);
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
		});
261 aurelien 85
	}
86
 
450 aurelien 87
	public void gererTimer() {
88
		if(suggestionTimer == null) {
89
			suggestionTimer = new Timer() {
90
				public void run() {
91
					requeteSuggestions();
92
				}
93
			};
94
			suggestionTimer.schedule(tempsAvantRequete);
95
		} else {
96
			suggestionTimer.schedule(tempsAvantRequete);
97
		}
98
	}
99
 
261 aurelien 100
	public void setTempsAvantRequete(int temps) {
101
		tempsAvantRequete = temps;
102
	}
103
 
104
	public int getTempsAvantRequete(int temps) {
105
		return tempsAvantRequete;
106
	}
107
 
108
	public String getValeur() {
450 aurelien 109
		return autoCompletionComboBoxVue.getValeur();
261 aurelien 110
	}
111
 
415 gduche 112
	public void setValeur(String taxon) {
113
		autoCompletionComboBoxVue.setValeur(taxon);
114
	}
115
 
116
	public void nettoyer() {
117
		autoCompletionComboBoxVue.nettoyer();
118
	}
119
 
450 aurelien 120
	public void requeteSuggestions() {
261 aurelien 121
 
1437 aurelien 122
		final String requete = URL.encodeQueryString(autoCompletionComboBoxVue.getValeur());
1367 aurelien 123
		String requeteAjax = effectuerPreTraitementChaineRequete(requete);
124
 
125
		// ceci permet au composant qui utilise l'autocomplétion
126
		// d'annuler une requete
127
		if(requeteAjax == null) {
128
			return;
129
		}
130
 
1437 aurelien 131
		String urlProxy = urlRequete+requeteAjax;
261 aurelien 132
 
133
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, urlProxy) ;
450 aurelien 134
		try {
261 aurelien 135
			rb.sendRequest(null, new RequestCallback() {
136
				public void onError(final Request request, final Throwable exception) {
137
					// TODO Auto-generated method stub
138
 
139
				}
140
 
141
				public void onResponseReceived(final Request request,
142
						final Response response) {
450 aurelien 143
					surReponseRequete(requete, response);
261 aurelien 144
				}
145
			}) ;
146
 
147
		} catch (RequestException e) {
148
			// TODO Auto-generated catch block
149
			e.printStackTrace();
150
		}
151
	}
268 aurelien 152
 
450 aurelien 153
	public void surReponseRequete(String requete, Response response) {
1886 mathias 154
		InfosNomPourAutocompletion[] valeurs = parserResultatRequete(response);
450 aurelien 155
		autoCompletionComboBoxVue.remplirListe(valeurs);
156
		requeteOracle.setQuery(requete);
157
		autoCompletionComboBoxVue.afficherSuggestions(requeteOracle, callBackOracle);
158
	}
159
 
457 aurelien 160
	protected void surSelectionSuggestion(String suggestion) {
161
		return;
162
	}
163
 
328 aurelien 164
	/**
165
	 * Permet d'intervenir sur la chaine tapée par l'utilisateur avant que celle-ci ne soit passée
166
	 * à la requête asynchrone pour pouvoir la formater (pour mettre en minuscule, séparer des termes)
167
	 * par défaut renvoie la chaine telle quelle, à surcharger au besoin
168
	 * @param String requete chaine de recherche contenant ce que l'utilisateur à tapé
169
	 * @return String une chaine transformée
170
	 */
171
	protected String effectuerPreTraitementChaineRequete(String requete) {
172
		return requete;
173
	}
174
 
175
	/**
176
	 * Parse les résultats de la requete afin de pouvoir les utiliser à implémenter par le
177
	 * composants qui crée la combobox selon le contexte et le web service appelé.
178
	 * @param Response la réponse à la requête asynchrone
179
	 * @return String[] le tableau des suggestions qui sera affiché dans la combobox
180
	 */
1886 mathias 181
	protected abstract InfosNomPourAutocompletion[] parserResultatRequete(Response response);
564 benjamin 182
 
183
	public Vue getAutoCompletionComboBoxVue() {
184
		return autoCompletionComboBoxVue;
185
	}
1099 aurelien 186
 
187
	public void afficherStyleErreur(String styleErreur) {
188
		autoCompletionComboBoxVue.afficherStyleErreur(styleErreur);
189
	}
190
 
191
	public void supprimerStyleErreur(String styleErreur) {
192
		autoCompletionComboBoxVue.supprimerStyleErreur(styleErreur);
193
	}
261 aurelien 194
}