Subversion Repositories eFlore/Applications.cel

Rev

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

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