Subversion Repositories eFlore/Applications.del

Rev

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