Subversion Repositories eFlore/Applications.del

Rev

Rev 1782 | Rev 1957 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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