Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2692 Rev 2734
1
package org.tela_botanica.client.util.autocompletion;
1
package org.tela_botanica.client.util.autocompletion;
2
 
2
 
3
import java.util.ArrayList;
3
import java.util.ArrayList;
4
import java.util.Iterator;
4
import java.util.Iterator;
5
import java.util.List;
5
import java.util.List;
6
import java.util.Map;
6
import java.util.Map;
7
 
7
 
8
import org.tela_botanica.client.cel2;
-
 
9
import org.tela_botanica.client.modeles.objets.Utilisateur;
8
import org.tela_botanica.client.util.Util;
10
 
-
 
11
import com.google.gwt.core.client.Callback;
9
 
12
import com.google.gwt.core.client.JavaScriptObject;
10
import com.google.gwt.core.client.Callback;
13
import com.google.gwt.event.dom.client.KeyCodes;
11
import com.google.gwt.event.dom.client.KeyCodes;
14
import com.google.gwt.event.dom.client.KeyDownEvent;
12
import com.google.gwt.event.dom.client.KeyDownEvent;
15
import com.google.gwt.event.dom.client.KeyDownHandler;
13
import com.google.gwt.event.dom.client.KeyDownHandler;
16
import com.google.gwt.event.dom.client.KeyPressEvent;
-
 
17
import com.google.gwt.event.dom.client.KeyPressHandler;
-
 
18
import com.google.gwt.event.logical.shared.SelectionEvent;
14
import com.google.gwt.event.logical.shared.SelectionEvent;
19
import com.google.gwt.event.logical.shared.SelectionHandler;
15
import com.google.gwt.event.logical.shared.SelectionHandler;
20
import com.google.gwt.event.logical.shared.ValueChangeEvent;
16
import com.google.gwt.event.logical.shared.ValueChangeEvent;
21
import com.google.gwt.event.logical.shared.ValueChangeHandler;
17
import com.google.gwt.event.logical.shared.ValueChangeHandler;
22
import com.google.gwt.http.client.Request;
18
import com.google.gwt.http.client.Request;
23
import com.google.gwt.http.client.RequestBuilder;
19
import com.google.gwt.http.client.RequestBuilder;
24
import com.google.gwt.http.client.RequestCallback;
20
import com.google.gwt.http.client.RequestCallback;
25
import com.google.gwt.http.client.RequestException;
21
import com.google.gwt.http.client.RequestException;
26
import com.google.gwt.http.client.Response;
22
import com.google.gwt.http.client.Response;
27
import com.google.gwt.http.client.URL;
23
import com.google.gwt.http.client.URL;
28
import com.google.gwt.user.client.Event;
24
import com.google.gwt.user.client.Event;
29
import com.google.gwt.user.client.Timer;
25
import com.google.gwt.user.client.Timer;
30
import com.google.gwt.user.client.Window;
26
import com.google.gwt.user.client.Window;
31
import com.google.gwt.user.client.ui.ChangeListener;
-
 
32
import com.google.gwt.user.client.ui.Label;
27
import com.google.gwt.user.client.ui.Label;
33
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
28
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
34
import com.google.gwt.user.client.ui.SuggestBox;
29
import com.google.gwt.user.client.ui.SuggestBox;
35
import com.google.gwt.user.client.ui.SuggestBox.DefaultSuggestionDisplay;
30
import com.google.gwt.user.client.ui.SuggestBox.DefaultSuggestionDisplay;
36
import com.google.gwt.user.client.ui.TextBox;
31
import com.google.gwt.user.client.ui.TextBox;
37
import com.google.gwt.user.client.ui.SuggestBox.SuggestionDisplay;
-
 
38
import com.google.gwt.user.client.ui.SuggestOracle;
32
import com.google.gwt.user.client.ui.SuggestOracle;
39
import com.google.gwt.user.client.ui.Widget;
-
 
40
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
33
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
41
import com.gwtext.client.widgets.BoxComponent;
34
import com.gwtext.client.widgets.BoxComponent;
42
import com.gwtext.client.widgets.Component;
-
 
43
import com.gwtext.client.widgets.Container;
-
 
44
import com.gwtext.client.widgets.Panel;
35
import com.gwtext.client.widgets.Panel;
45
import com.gwtext.client.widgets.event.PanelListener;
-
 
46
import com.gwtext.client.widgets.event.PanelListenerAdapter;
36
import com.gwtext.client.widgets.event.PanelListenerAdapter;
47
import com.gwtext.client.widgets.layout.FitLayout;
37
import com.gwtext.client.widgets.layout.FitLayout;
48
 
38
 
49
@SuppressWarnings("unchecked")
39
@SuppressWarnings("unchecked")
50
public abstract class AutoCompletionComboBox extends Panel {
40
public abstract class AutoCompletionComboBox extends Panel {
51
		
41
		
52
	Label label = null;
42
	Label label = null;
53
	MultiWordSuggestOracle msu = null;
43
	MultiWordSuggestOracle msu = null;
54
	SuggestBox suggestions = null;
44
	SuggestBox suggestions = null;
55
	DefaultSuggestionDisplay sgd = null;
45
	DefaultSuggestionDisplay sgd = null;
56
	
46
	
57
	Callback<String, String> surCopierColler = null;
47
	Callback<String, String> surCopierColler = null;
58
	
48
	
59
	SuggestOracle.Request requeteOracle;
49
	SuggestOracle.Request requeteOracle;
60
    SuggestOracle.Callback callBackOracle;
50
    SuggestOracle.Callback callBackOracle;
61
    
51
    
62
	Timer suggestionTimer = null;
52
	Timer suggestionTimer = null;
63
    int tempsAvantRequete = 500;
53
    int tempsAvantRequete = 500;
64
    
54
    
65
    Map<String, String> possibilites = null;
55
    Map<String, String> possibilites = null;
66
    
56
    
67
    String urlRequete = "";
57
    String urlRequete = "";
68
	
58
	
69
	public AutoCompletionComboBox(String nomLabel, String urlRequete) {
59
	public AutoCompletionComboBox(String nomLabel, String urlRequete) {
70
		
60
		
71
		this.setStyleName("champAutoComplete");
61
		this.setStyleName("champAutoComplete");
72
		
62
		
73
		this.label = new Label(nomLabel+":");
63
		this.label = new Label(nomLabel+":");
74
		this.urlRequete = urlRequete;
64
		this.urlRequete = urlRequete;
75
		
65
		
76
		sgd = new SuggestBox.DefaultSuggestionDisplay();
66
		sgd = new SuggestBox.DefaultSuggestionDisplay();
77
		msu = new MultiWordSuggestOracle() {
67
		msu = new MultiWordSuggestOracle() {
78
			@Override
68
			@Override
79
			public void requestSuggestions(Request request, Callback callback) {
69
			public void requestSuggestions(Request request, Callback callback) {
80
				List<MultiWordSuggestion> retenus = new ArrayList<MultiWordSuggestion>();
70
				List<MultiWordSuggestion> retenus = new ArrayList<MultiWordSuggestion>();
81
				Iterator<String> it = possibilites.keySet().iterator();
71
				Iterator<String> it = possibilites.keySet().iterator();
82
			    while (it.hasNext()) {
72
			    while (it.hasNext()) {
83
			    	String cle = it.next();
73
			    	String cle = it.next();
84
			    	String cleAffichee = preTraiterValeurAvantAffichage(possibilites.get(cle));
74
			    	String cleAffichee = preTraiterValeurAvantAffichage(cle);
85
					MultiWordSuggestion muWoSug = new MultiWordSuggestion(possibilites.get(cle), cleAffichee);
75
					MultiWordSuggestion muWoSug = new MultiWordSuggestion(cle, cleAffichee);
86
					retenus.add(muWoSug);
76
					retenus.add(muWoSug);
87
			    }
77
			    }
88
 
78
 
89
				Response reponse = new Response(retenus);
79
				Response reponse = new Response(retenus);
90
				callback.onSuggestionsReady(request, reponse);
80
				callback.onSuggestionsReady(request, reponse);
91
			}		
81
			}		
92
		};
82
		};
93
 
83
 
94
		suggestions = new SuggestBox(msu, new TextBox(), sgd) {
84
		suggestions = new SuggestBox(msu, new TextBox(), sgd) {
95
			public void onBrowserEvent(Event event) {
85
			public void onBrowserEvent(Event event) {
96
			    switch (event.getTypeInt()) {
86
			    switch (event.getTypeInt()) {
97
			        case Event.ONPASTE: {
87
			        case Event.ONPASTE: {
98
			        	if(surCopierColler != null) {
88
			        	if(surCopierColler != null) {
99
			        		surCopierColler.onSuccess(suggestions.getValueBox().getValue());
89
			        		surCopierColler.onSuccess(suggestions.getValueBox().getValue());
100
			        	}
90
			        	}
101
			        }
91
			        }
102
			        break;
92
			        break;
103
			        default:
93
			        default:
104
			        	// WTF: Curieux bloc qui est nécessaire car si on appelle pas super.onBrowserEvent
94
			        	// WTF: Curieux bloc qui est nécessaire car si on appelle pas super.onBrowserEvent
105
			        	// aucun évènement ne fonctionne et si on le fait, cela génère des nullPointerException
95
			        	// aucun évènement ne fonctionne et si on le fait, cela génère des nullPointerException
106
			        	// donc on transige en l'appelant dans un try catch
96
			        	// donc on transige en l'appelant dans un try catch
107
			        	try {
97
			        	try {
108
			        		super.onBrowserEvent(event);
98
			        		super.onBrowserEvent(event);
109
			        	} catch (Exception e) {
99
			        	} catch (Exception e) {
110
			        		// à priori rien à faire
100
			        		// à priori rien à faire
111
			        	}
101
			        	}
112
			    }
102
			    }
113
			    
103
			    
114
			}
104
			}
115
		};
105
		};
116
		
106
		
117
		suggestions.setAutoSelectEnabled(false);
107
		suggestions.setAutoSelectEnabled(false);
118
		setLayout(new FitLayout());
108
		setLayout(new FitLayout());
119
		add(label);
109
		add(label);
120
		add(suggestions);
110
		add(suggestions);
121
		gererEvenements();
111
		gererEvenements();
122
	}
112
	}
123
	
113
	
124
	public void gererEvenements() {
114
	public void gererEvenements() {
125
		suggestions.addKeyDownHandler(new KeyDownHandler() {
115
		suggestions.addKeyDownHandler(new KeyDownHandler() {
126
 
116
 
127
		    @Override
117
		    @Override
128
		    public void onKeyDown(KeyDownEvent event) {	    	
118
		    public void onKeyDown(KeyDownEvent event) {	    	
129
		    	// Lorsque la liste de suggestions est ouverte, une frappe sur entrée selectionne la valeur
119
		    	// Lorsque la liste de suggestions est ouverte, une frappe sur entrée selectionne la valeur
130
		    	// Si elle est fermée, elle déclenche la fonction abstraite de validation (utile pour les champs
120
		    	// Si elle est fermée, elle déclenche la fonction abstraite de validation (utile pour les champs
131
		    	// du genre station, milieu etc... et la saisie d'obs rapide
121
		    	// du genre station, milieu etc... et la saisie d'obs rapide
132
				if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {	
122
				if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {	
133
					if((sgd == null || !sgd.isSuggestionListShowing())) {
123
					if((sgd == null || !sgd.isSuggestionListShowing())) {
134
						onValidationSaisie();
124
						onValidationSaisie();
-
 
125
						Util.LogVersFirebug("je passe ici");
135
						event.stopPropagation();
126
						event.stopPropagation();
136
						return;
127
						return;
137
					} else {
128
					} else {
-
 
129
						Util.LogVersFirebug("je passe là");
138
						// Dans les autres cas, un appui sur entrée ne doit pas redéclencher l'autcomplétion
130
						// Dans les autres cas, un appui sur entrée ne doit pas redéclencher l'autcomplétion
139
						return;
131
						return;
140
					}
132
					}
141
				}
133
				}
142
				
134
				
143
				if(event.getNativeKeyCode() == KeyCodes.KEY_DOWN) {
135
				if(event.getNativeKeyCode() == KeyCodes.KEY_DOWN) {
144
					// Un appui sur flèche bas permet de demander toute la liste
136
					// Un appui sur flèche bas permet de demander toute la liste
145
					if(!sgd.isSuggestionListShowing()) {
137
					if(!sgd.isSuggestionListShowing()) {
146
						requeteToutesSuggestions();
138
						requeteToutesSuggestions();
147
					}
139
					}
148
				}
140
				}
149
				
141
				
150
				// Tout autre frappe d'un caractère "normal" déclenche le timer d'autocomplétion
142
				// Tout autre frappe d'un caractère "normal" déclenche le timer d'autocomplétion
151
				if(!KeyDownEvent.isArrow(event.getNativeKeyCode())) {
143
				if(!KeyDownEvent.isArrow(event.getNativeKeyCode())) {
152
					gererTimer();
144
					gererTimer();
153
				}
145
				}
154
		    }
146
		    }
155
 
147
 
156
		});
148
		});
157
		
149
		
158
		requeteOracle = new SuggestOracle.Request();
150
		requeteOracle = new SuggestOracle.Request();
159
		callBackOracle = new SuggestOracle.Callback() {
151
		callBackOracle = new SuggestOracle.Callback() {
160
 
152
 
161
			public void onSuggestionsReady(SuggestOracle.Request request, SuggestOracle.Response response) {
153
			public void onSuggestionsReady(SuggestOracle.Request request, SuggestOracle.Response response) {
162
				suggestions.showSuggestionList();
154
				suggestions.showSuggestionList();
163
			}
155
			}
164
	    };
156
	    };
165
	    
157
	    
166
	    suggestions.addSelectionHandler(new SelectionHandler<SuggestOracle.Suggestion>(){				
158
	    suggestions.addSelectionHandler(new SelectionHandler<SuggestOracle.Suggestion>(){
167
			@Override
159
			@Override
168
			public void onSelection(SelectionEvent<Suggestion> event) {
160
			public void onSelection(SelectionEvent<Suggestion> event) {
169
				onSelectionValeur();
161
				onSelectionValeur();
170
			}
162
			}
171
		});
163
		});
172
	    
164
	    
173
	    suggestions.addValueChangeHandler(new ValueChangeHandler<String>() {
165
	    suggestions.addValueChangeHandler(new ValueChangeHandler<String>() {
174
			@Override
166
			@Override
175
			public void onValueChange(ValueChangeEvent<String> event) {
167
			public void onValueChange(ValueChangeEvent<String> event) {
176
				onModificationValeur();
168
				onModificationValeur();
177
			}
169
			}
178
		});
170
		});
179
	    
171
	    
180
	    surCopierColler = new Callback<String, String>() {		
172
	    surCopierColler = new Callback<String, String>() {		
181
			@Override
173
			@Override
182
			public void onSuccess(String result) {
174
			public void onSuccess(String result) {
183
				gererTimer();
175
				gererTimer();
184
			}
176
			}
185
			
177
			
186
			@Override
178
			@Override
187
			public void onFailure(String reason) {
179
			public void onFailure(String reason) {
188
				// rien à faire ça n'échoue jamais
180
				// rien à faire ça n'échoue jamais
189
			}
181
			}
190
		};
182
		};
191
		
183
		
192
		addListener(new PanelListenerAdapter() {
184
		addListener(new PanelListenerAdapter() {
193
			
185
			
194
			@Override
186
			@Override
195
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
187
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
196
					int rawWidth, int rawHeight) {
188
					int rawWidth, int rawHeight) {
197
				redimensionner(rawWidth);
189
				redimensionner(rawWidth);
198
			}
190
			}
199
		});
191
		});
200
	}
192
	}
201
	
193
	
202
	public void redimensionner(final int largeur) {
194
	public void redimensionner(final int largeur) {
203
		suggestions.setWidth((largeur - label.getOffsetWidth() - 13)+"px");
195
		suggestions.setWidth((largeur - label.getOffsetWidth() - 13)+"px");
204
	}
196
	}
205
	
197
	
206
	public void gererTimer() {
198
	public void gererTimer() {
207
		if(suggestionTimer == null) {
199
		if(suggestionTimer == null) {
208
			suggestionTimer = new Timer() {
200
			suggestionTimer = new Timer() {
209
				public void run() {
201
				public void run() {
210
					requeteSuggestions();
202
					requeteSuggestions();
211
				}	
203
				}	
212
			};					
204
			};					
213
			suggestionTimer.schedule(tempsAvantRequete);
205
			suggestionTimer.schedule(tempsAvantRequete);
214
		} else {
206
		} else {
215
			suggestionTimer.schedule(tempsAvantRequete);
207
			suggestionTimer.schedule(tempsAvantRequete);
216
		}
208
		}
217
	}
209
	}
218
	
210
	
219
	public void setTempsAvantRequete(int temps) {
211
	public void setTempsAvantRequete(int temps) {
220
		tempsAvantRequete = temps;
212
		tempsAvantRequete = temps;
221
	}
213
	}
222
	
214
	
223
	public int getTempsAvantRequete(int temps) {
215
	public int getTempsAvantRequete(int temps) {
224
		return tempsAvantRequete;
216
		return tempsAvantRequete;
225
	}
217
	}
226
	
218
	
227
	public void requeteToutesSuggestions() {
219
	public void requeteToutesSuggestions() {
228
		// Cette méthode permet de demander l'autocomplétion même si 
220
		// Cette méthode permet de demander l'autocomplétion même si 
229
		// la valeur saisie est vide (cas de l'appui sur flèche bas)
221
		// la valeur saisie est vide (cas de l'appui sur flèche bas)
230
		envoyerRequeteSuggestions("*");
222
		envoyerRequeteSuggestions("*");
231
	}
223
	}
232
	
224
	
233
	public void requeteSuggestions() {
225
	public void requeteSuggestions() {
234
		// Suppression des espaces et caractères inutiles
226
		// Suppression des espaces et caractères inutiles
235
		String valeur = suggestions.getValue().trim().isEmpty() ? null : suggestions.getValue().trim(); 
227
		String valeur = suggestions.getValue().trim().isEmpty() ? null : suggestions.getValue().trim(); 
236
		
228
		
237
		// ceci permet au composant qui utilise l'autocomplétion
229
		// ceci permet au composant qui utilise l'autocomplétion
238
		// d'annuler une requete et également d'éviter de faire une requête lors du vidage du champ
230
		// d'annuler une requete et également d'éviter de faire une requête lors du vidage du champ
239
		if(valeur == null) {
231
		if(valeur == null) {
240
			return;
232
			return;
241
		}
233
		}
242
		envoyerRequeteSuggestions(valeur);
234
		envoyerRequeteSuggestions(valeur);
243
	}
235
	}
244
	
236
	
245
	private void envoyerRequeteSuggestions(final String valeur) {
237
	private void envoyerRequeteSuggestions(final String valeur) {
246
		final String urlRequeteFmt = preTraiterUrlRequete(urlRequete, valeur);	
238
		final String urlRequeteFmt = preTraiterUrlRequete(urlRequete, valeur);	
247
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, urlRequeteFmt) ;
239
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, urlRequeteFmt) ;
248
		try {		
240
		try {		
249
			rb.sendRequest(null, new RequestCallback() {
241
			rb.sendRequest(null, new RequestCallback() {
250
				public void onError(final Request request, final Throwable exception) {
242
				public void onError(final Request request, final Throwable exception) {
251
					// TODO Auto-generated method stub		
243
					// TODO Auto-generated method stub		
252
				}
244
				}
253
 
245
 
254
				public void onResponseReceived(final Request request,
246
				public void onResponseReceived(final Request request,
255
						final Response response) {
247
						final Response response) {
256
					surReponseRequete(valeur, response);
248
					surReponseRequete(valeur, response);
257
				}
249
				}
258
			}) ;
250
			}) ;
259
 
251
 
260
		} catch (RequestException e) {
252
		} catch (RequestException e) {
261
			// TODO Auto-generated catch block
253
			// TODO Auto-generated catch block
262
			e.printStackTrace();
254
			e.printStackTrace();
263
		}
255
		}
264
	}
256
	}
265
	
257
	
266
	public void surReponseRequete(String requete, Response response) {
258
	public void surReponseRequete(String requete, Response response) {
267
		possibilites = parserResultatRequete(response);
259
		possibilites = parserResultatRequete(response);
268
		msu.clear();
260
		msu.clear();
269
		Iterator<String> it = possibilites.keySet().iterator();
261
		Iterator<String> it = possibilites.keySet().iterator();
270
	    while (it.hasNext()) {
262
	    while (it.hasNext()) {
271
	    	msu.add(possibilites.get(it.next()));
263
	    	msu.add(possibilites.get(it.next()));
272
	    }
264
	    }
273
			
265
			
274
		requeteOracle.setQuery(requete);
266
		requeteOracle.setQuery(requete);
275
		if(requete.equals("*")) {
267
		if(requete.equals("*")) {
276
			// TODO : il y a peut être une méthode plus simple
268
			// TODO : il y a peut être une méthode plus simple
277
			// mais ceci permet d'afficher les suggestions en cas d'appui
269
			// mais ceci permet d'afficher les suggestions en cas d'appui
278
			// sur bas lorsque la liste est vide
270
			// sur bas lorsque la liste est vide
279
			msu.setDefaultSuggestionsFromText(possibilites.values());	
271
			msu.setDefaultSuggestionsFromText(possibilites.values());	
280
			SuggestOracle.Request rq = new SuggestOracle.Request();
272
			SuggestOracle.Request rq = new SuggestOracle.Request();
281
			rq.setQuery(null);
273
			rq.setQuery(null);
282
			msu.requestDefaultSuggestions(rq, callBackOracle);
274
			msu.requestDefaultSuggestions(rq, callBackOracle);
283
		} else {
275
		} else {
284
			msu.requestSuggestions(requeteOracle, callBackOracle);	
276
			msu.requestSuggestions(requeteOracle, callBackOracle);	
285
		}
277
		}
286
	}
278
	}
287
	
279
	
288
	public String getText() {
280
	public String getText() {
289
		return suggestions.getText();
281
		return suggestions.getText();
290
	}
282
	}
-
 
283
	
-
 
284
	public void setText(String texte) {
-
 
285
		suggestions.setText(texte);
-
 
286
	}
291
	
287
	
292
	public String getRawValue() {
288
	public String getRawValue() {
293
		return suggestions.getText();
289
		return suggestions.getText();
294
	}
290
	}
-
 
291
 
-
 
292
	public String getValue() {
-
 
293
		return suggestions.getValue();
-
 
294
	}
295
	
295
	
296
	public void setValue(String texte) {
296
	public void setValue(String valeur) {
297
		suggestions.setText(texte);
297
		suggestions.setText(valeur);
298
	}
298
	}
299
	
299
	
300
	public void reset() {
300
	public void reset() {
301
		suggestions.setValue("");
301
		suggestions.setValue("");
302
	}
302
	}
303
	
303
	
304
	public void setTabIndex(int index) {
304
	public void setTabIndex(int index) {
305
		suggestions.setTabIndex(index);
305
		suggestions.setTabIndex(index);
306
	}
306
	}
307
	
307
	
308
	public String getLabelText() {
308
	public String getLabelText() {
309
		return label.getText();
309
		return label.getText();
310
	}
310
	}
311
	
311
	
312
	public int getFieldWidth() {
312
	public int getFieldWidth() {
313
		return suggestions.getOffsetWidth();
313
		return suggestions.getOffsetWidth();
314
	}
314
	}
315
	
315
	
316
	public int getLabelWidth() {
316
	public int getLabelWidth() {
317
		return label.getOffsetWidth();
317
		return label.getOffsetWidth();
318
	}
318
	}
319
	
319
	
320
	public void agrandirChamp(int largeur) {
320
	public void agrandirChamp(int largeur) {
321
		suggestions.setWidth(largeur+"px");
321
		suggestions.setWidth(largeur+"px");
322
	}
322
	}
323
	
323
	
324
	protected String preTraiterValeurAvantAffichage(String valeur) {
324
	protected String preTraiterValeurAvantAffichage(String cle) {
325
		return valeur;
325
		return possibilites.get(cle);
326
	}
326
	}
327
	protected String preTraiterUrlRequete(String urlRequete, String valeur) {
327
	protected String preTraiterUrlRequete(String urlRequete, String valeur) {
328
		return urlRequete+URL.encodeQueryString(valeur);
328
		return urlRequete+URL.encodeQueryString(valeur);
329
	}
329
	}
330
	protected abstract Map<String, String> parserResultatRequete(Response response);	
330
	protected abstract Map<String, String> parserResultatRequete(Response response);	
331
	protected abstract void onModificationValeur();
331
	protected abstract void onModificationValeur();
332
	protected abstract void onSelectionValeur();
332
	protected abstract void onSelectionValeur();
333
	protected abstract void onValidationSaisie();
333
	protected abstract void onValidationSaisie();
334
}
334
}