Subversion Repositories eFlore/Applications.cel

Rev

Rev 1945 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1940 aurelien 1
package org.tela_botanica.client.util;
2
 
1967 aurelien 3
import java.util.ArrayList;
1940 aurelien 4
import java.util.Date;
5
import java.util.HashMap;
6
import java.util.Iterator;
1967 aurelien 7
import java.util.List;
1940 aurelien 8
import java.util.Map;
9
 
10
import org.tela_botanica.client.interfaces.Rafraichissable;
11
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
1967 aurelien 12
import org.tela_botanica.client.modeles.objets.Configuration;
1940 aurelien 13
 
14
import com.google.gwt.user.client.Timer;
15
import com.google.gwt.user.client.Window;
1945 aurelien 16
import com.google.gwt.user.client.ui.HTML;
1940 aurelien 17
import com.google.gwt.user.client.ui.HorizontalPanel;
18
import com.gwtext.client.core.EventCallback;
19
import com.gwtext.client.core.EventObject;
20
import com.gwtext.client.core.ListenerConfig;
21
import com.gwtext.client.data.ArrayReader;
22
import com.gwtext.client.data.FieldDef;
23
import com.gwtext.client.data.MemoryProxy;
24
import com.gwtext.client.data.Record;
25
import com.gwtext.client.data.RecordDef;
1967 aurelien 26
import com.gwtext.client.data.SimpleStore;
1940 aurelien 27
import com.gwtext.client.data.Store;
28
import com.gwtext.client.data.StringFieldDef;
29
import com.gwtext.client.widgets.Button;
30
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
31
import com.gwtext.client.widgets.form.ComboBox;
1945 aurelien 32
import com.gwtext.client.widgets.form.Field;
1940 aurelien 33
import com.gwtext.client.widgets.form.FormPanel;
34
import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;
35
 
36
@SuppressWarnings("unchecked")
37
public abstract class FormulaireSaisieChampEtendu extends FormPanel implements Rafraichissable {
38
 
39
	private final int KEY_ALT = 18;
40
	private final int KEY_BACKSPACE = 8;
41
	private final int KEY_CTRL = 17;
42
	private final int KEY_DELETE = 46;
43
	private final int KEY_DOWN = 40;
44
	private final int KEY_END = 35;
45
	private final int KEY_ENTER = 13;
46
	private final int KEY_ESCAPE = 27;
47
	private final int KEY_HOME = 36;
48
	private final int KEY_LEFT = 37;
49
	private final int KEY_PAGEDOWN = 34;
50
	private final int KEY_PAGEUP = 33;
51
	private final int KEY_RIGHT = 39;
52
	private final int KEY_SHIFT = 16;
53
	private final int KEY_TAB = 9;
54
	private final int KEY_UP = 38;
55
 
56
	final ComboBox nChamp;
1967 aurelien 57
	final String champsListeTpl = "<div class=\"x-combo-list-item search-item-tpl search-c-field-tpl\" title=\"{label}\">{label}</div>";
1945 aurelien 58
	Button ajouterChampsEtenduEtFermer;
59
	Button ajouterChampsEtendu;
60
	Button annulerAjouterChampEtendu;
1940 aurelien 61
	String idChamp = null;
62
 
1967 aurelien 63
	final ComboBox groupesChampsEtendus;
64
 
1940 aurelien 65
	private Timer timer = null;
66
 
67
	private Map<String, String> cacheClesValeur;
1945 aurelien 68
	private Record rdSelectionne = null;
1967 aurelien 69
    private Record groupeSelectionne = null;
1945 aurelien 70
	private String valeurBrute = "";
1940 aurelien 71
 
72
	public FormulaireSaisieChampEtendu() {
73
		super();
74
		setPaddings(3);
75
		setBodyBorder(false);
76
 
1967 aurelien 77
		HTML indicationSaisieGroupe = new HTML("Vous pouvez ajouter plusieurs champs à la fois correspondant à un groupe "+
78
				"par exemple les champs du projet sauvage de ma rue ou florilèges, ou bien "+
79
				"les champs phytosociolgiques ");
80
		indicationSaisieGroupe.addStyleName("aideCreerChampEtendu");
81
 
82
		groupesChampsEtendus = new ComboBox();
83
		groupesChampsEtendus.setLabel("Ajouter un groupe de champs");
84
		groupesChampsEtendus.setStore(getGroupesChampsEtendusStore());
85
		groupesChampsEtendus.setDisplayField("label") ;
86
		groupesChampsEtendus.setValueField("valeur");
87
		groupesChampsEtendus.setEditable(false);
88
		groupesChampsEtendus.setHideTrigger(false);
89
		groupesChampsEtendus.setForceSelection(true);
90
		groupesChampsEtendus.setCls("champ-separation");
91
		groupesChampsEtendus.setValue("");
92
 
93
		if(groupesChampsEtendusSontDefinis()) {
94
			add(indicationSaisieGroupe);
95
			add(groupesChampsEtendus);
96
		}
97
 
1945 aurelien 98
		HTML indicationSaisie = new HTML("Saisissez un nom de champ ou choisisez un nom proposé par l'autocomplétion "+
99
				"Si vous choissisez un nom de champ existant vous pourrez profiter d'une autocomplétion "+
100
				"sur les valeur déjà saisies pour ce champ par les autres utilisateurs");
101
		indicationSaisie.addStyleName("aideCreerChampEtendu");
102
		add(indicationSaisie);
103
 
1940 aurelien 104
		HorizontalPanel hp = new HorizontalPanel();
105
		hp.setBorderWidth(0);
1967 aurelien 106
 
1940 aurelien 107
		nChamp = new ComboBox("Nom du champ", "nom_champ_etendu");
108
		add(nChamp);
109
 
1967 aurelien 110
		ajouterChampsEtenduEtFermer = new Button("Ajouter et fermer");
111
		ajouterChampsEtenduEtFermer.setTooltip("Ajouter un champ étendu ou un groupe de champs et fermer la fenêtre");
1940 aurelien 112
		ajouterChampsEtendu = new Button("Ajouter");
1967 aurelien 113
		ajouterChampsEtendu.setTooltip("Ajouter un champ étendu ou un groupe de champ");
1940 aurelien 114
		annulerAjouterChampEtendu = new Button("Annuler");
1945 aurelien 115
		annulerAjouterChampEtendu.setTooltip("Fermer la fenêtre sans ajouter de champ");
1940 aurelien 116
 
1945 aurelien 117
		hp.add(ajouterChampsEtenduEtFermer);
1940 aurelien 118
		hp.add(ajouterChampsEtendu);
119
		hp.add(annulerAjouterChampEtendu);
120
		add(hp);
121
 
122
		nChamp.setMode(ComboBox.REMOTE);
1945 aurelien 123
		nChamp.setTypeAhead(false);
1940 aurelien 124
		nChamp.setLoadingText("Recherche...");
125
		nChamp.setHideTrigger(true);
1967 aurelien 126
		nChamp.setWidth("250px");
1940 aurelien 127
		nChamp.setValue("");
128
		nChamp.focus();
129
 
130
		ajouterListeners();
131
	}
132
 
133
	private void ajouterListeners() {
134
		ListenerConfig listenerConfigAutocompletion=new ListenerConfig();
135
	    listenerConfigAutocompletion.setDelay(200);
136
	    listenerConfigAutocompletion.setStopPropagation(false);
137
	    listenerConfigAutocompletion.setStopEvent(true);
138
 
139
	    nChamp.addKeyPressListener(new EventCallback() {
140
 
141
			@Override
142
			public void execute(EventObject e) {
143
 
144
				switch(e.getKey()) {
145
 
146
					case KEY_ALT:
147
		    	      case KEY_CTRL:
148
		    	      case KEY_END:
149
		    	      case KEY_HOME:
150
		    	      case KEY_LEFT:
151
		    	      case KEY_PAGEDOWN:
152
		    	      case KEY_PAGEUP:
153
		    	      case KEY_RIGHT:
154
		    	      case KEY_SHIFT:
155
		    	      case KEY_TAB:
156
		    	      case KEY_UP:
157
	    	        break;
158
 
1945 aurelien 159
		    	  case KEY_ENTER:
160
  	    	    	  if(rdSelectionne != null) {
161
  	    	    		  nChamp.setValue(rdSelectionne.getAsString("label"));
162
  	    	    		  idChamp = rdSelectionne.getAsString("cle");
163
  	    	    		  valeurBrute = rdSelectionne.getAsString("label");
164
  	    	    	  }
165
	              break;
166
 
1940 aurelien 167
		    	    case KEY_DOWN:
168
  	    	    	  if(nChamp.getValueAsString().isEmpty() && !nChamp.isExpanded()) {
1945 aurelien 169
  	    	    		obtenirListeValeurs("*");
1940 aurelien 170
  	    	    	  }
171
  	    	    	break;
172
 
173
		    	    case KEY_ESCAPE:
174
		    	    	surAnnulation();
175
		    	    break;
176
 
177
		    	    default:
178
		    	    	if(timer != null) {
179
		    	    		timer.cancel();
180
		    	    	}
181
		    	    	timer = new Timer() {
182
 
183
							@Override
184
							public void run() {
1945 aurelien 185
			  	    	      	obtenirListeValeurs();
1940 aurelien 186
							}
187
						};
188
						timer.schedule(300);
1945 aurelien 189
						valeurBrute = nChamp.getValueAsString();
190
						nChamp.setValue(valeurBrute);
1940 aurelien 191
				}
192
			}
193
	    },listenerConfigAutocompletion);
194
 
195
		// Listener completion
196
	    nChamp.addListener(new ComboBoxListenerAdapter() {
1945 aurelien 197
            @Override
1940 aurelien 198
			public void onSelect(ComboBox comboBox, Record record, int index) {
1945 aurelien 199
            	rdSelectionne = record;
200
            }
201
 
202
            @Override
203
			public void onBlur(Field field) {
204
            	nChamp.setRawValue(valeurBrute);
205
            	nChamp.collapse();
206
            }
1940 aurelien 207
	     });
208
 
1967 aurelien 209
	    groupesChampsEtendus.addListener(new ComboBoxListenerAdapter() {
210
			@Override
211
			public void onSelect(ComboBox comboBox, Record record, int index) {
212
            	groupeSelectionne = record;
213
            }
214
	     });
215
 
1945 aurelien 216
	    ajouterChampsEtenduEtFermer.addListener(new ButtonListenerAdapter() {
217
			@Override
218
			public void onClick(Button button, EventObject e) {
1967 aurelien 219
				if(doitAjouterGroupe()) {
220
					surValidationMultiple(renvoyerListeChampsEtendus(groupeSelectionne.getAsString("valeur")));
1945 aurelien 221
				} else {
1967 aurelien 222
					if(champEtenduEstValide()) {
223
						surValidation(validerEtRenvoyerChampEtendu());
224
					} else {
225
						Window.alert("Le nom du champ étendu ne peut pas être vide");
226
					}
227
				}
1945 aurelien 228
			}
229
		});
230
 
1940 aurelien 231
	    ajouterChampsEtendu.addListener(new ButtonListenerAdapter() {
232
			@Override
233
			public void onClick(Button button, EventObject e) {
1945 aurelien 234
				if(champEtenduEstValide()) {
235
					surAjout(validerEtRenvoyerChampEtendu());
236
					raz();
237
				} else {
238
					Window.alert("Le nom du champ étendu ne peut pas être vide");
239
				}
1940 aurelien 240
			}
241
		});
242
 
243
	    annulerAjouterChampEtendu.addListener(new ButtonListenerAdapter() {
244
			@Override
245
			public void onClick(Button button, EventObject e) {
246
				surAnnulation();
247
			}
248
		});
249
	}
250
 
1945 aurelien 251
	private void raz() {
252
		timer = null;
253
		idChamp = null;
254
		nChamp.clearValue();
255
		nChamp.focus();
256
	}
257
 
258
	private ChampSaisieEtendu validerEtRenvoyerChampEtendu() {
1940 aurelien 259
		String valeurChamp = nChamp.getValueAsString();
1945 aurelien 260
		String idNouveauChamp = "";
261
		if(!estUnChampSelectionne(valeurChamp)) {
262
			Date date = new Date();
263
			// affectation d'un id temporaire qui sera remplacé par l'id auto généré à partir
264
			// du label
265
			idNouveauChamp = "tempid_"+date.getTime();
1940 aurelien 266
		} else {
1945 aurelien 267
			idNouveauChamp = idChamp;
1940 aurelien 268
		}
1945 aurelien 269
		ChampSaisieEtendu retour = new ChampSaisieEtendu(valeurChamp, idNouveauChamp);
270
		retour.setId(idNouveauChamp);
271
		return retour;
1940 aurelien 272
	}
273
 
1967 aurelien 274
	private List<ChampSaisieEtendu> renvoyerListeChampsEtendus(String groupe) {
275
		List<ChampSaisieEtendu> champsDuGroupe = new ArrayList<ChampSaisieEtendu>();
276
		HashMap<String, String> listeChampsEtendus = Configuration.getGroupesChampsEtendus().get(groupe);
277
		for (Iterator<String> iterator = listeChampsEtendus.keySet().iterator(); iterator.hasNext();) {
278
			String cle = iterator.next();
279
			String label = listeChampsEtendus.get(cle);
280
			ChampSaisieEtendu champ = new ChampSaisieEtendu(label, cle);
281
			champsDuGroupe.add(champ);
282
		}
283
 
284
		return champsDuGroupe;
285
	}
286
 
287
	private boolean doitAjouterGroupe() {
288
		return groupeSelectionne != null && !groupeSelectionne.getAsString("valeur").equals("");
289
	}
290
 
1945 aurelien 291
	private boolean champEtenduEstValide() {
292
		String valeurChamp = nChamp.getValueAsString();
293
		return (valeurChamp != null && !valeurChamp.isEmpty());
294
	}
295
 
1940 aurelien 296
	private boolean estUnChampSelectionne(String valeur) {
297
		return cacheClesValeur.containsValue(valeur);
298
	}
299
 
1945 aurelien 300
	private void obtenirListeValeurs() {
301
		obtenirListeValeurs(nChamp.getValueAsString());
1940 aurelien 302
	}
303
 
1945 aurelien 304
	private void obtenirListeValeurs(String valeur) {
1940 aurelien 305
		ListeReferentielChampsEtendusDAO lrce = new ListeReferentielChampsEtendusDAO(null);
306
		lrce.obtenirListeNomsChampsEtendus(this, valeur+"*");
307
	}
308
 
1945 aurelien 309
	public abstract void surAjout(ChampSaisieEtendu champ);
1967 aurelien 310
	public abstract void surAjoutMultiple(List<ChampSaisieEtendu> champs);
1940 aurelien 311
	public abstract void surValidation(ChampSaisieEtendu champ);
1967 aurelien 312
	public abstract void surValidationMultiple(List<ChampSaisieEtendu> champs);
1940 aurelien 313
	public abstract void surAnnulation();
314
 
315
	public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
316
		int i = 0;
317
 
318
		HashMap<String, String> clesLabels = (HashMap<String, String>)nouvelleDonnees;
319
		cacheClesValeur = clesLabels;
320
		Object[][] refData = new Object[clesLabels.keySet().size()][2];
321
 
322
		for (Iterator<String> it = clesLabels.keySet().iterator(); it.hasNext();)
323
		{
324
			String cle = it.next();
325
			String label= clesLabels.get(cle);
326
			refData[i][0]= cle;
327
			refData[i][1]= label;
328
			i++;
329
		}
330
 
331
		FieldDef defCle = new StringFieldDef("cle");
332
		FieldDef defLabel = new StringFieldDef("label");
333
		FieldDef[] defTab = {defCle, defLabel};
334
 
335
		RecordDef rd = new RecordDef(defTab);
336
 
337
		final MemoryProxy dataProxy = new MemoryProxy(refData);
338
		final ArrayReader reader = new ArrayReader(rd);
339
 
340
		Store store=new Store(dataProxy,reader);
341
 
342
		nChamp.setStore(store);
343
		store.load();
344
	}
1967 aurelien 345
 
346
	private boolean groupesChampsEtendusSontDefinis() {
347
		return Configuration.getGroupesChampsEtendus().size() > 0;
348
	}
349
 
350
	private Store getGroupesChampsEtendusStore() {
351
		int i = 1;
352
 
353
		Map<String, HashMap<String, String>> listeGroupesChampsEtendus = Configuration.getGroupesChampsEtendus();
354
		Object[][] valeurs = new Object[listeGroupesChampsEtendus.size()+1][2];
355
 
356
		valeurs[0][0] = "...";
357
		valeurs[0][1] = "";
358
		if(listeGroupesChampsEtendus.size() > 0) {
359
			for (Iterator<String> it = listeGroupesChampsEtendus.keySet().iterator(); it.hasNext();)
360
			{
361
				String cle = it.next();
362
				valeurs[i][0]= cle;
363
				valeurs[i][1]= cle;
364
				i++;
365
			}
366
		}
367
		SimpleStore store = new SimpleStore(new String[] {"label","valeur"},valeurs);
368
		store.load();
369
		return store;
370
	}
1940 aurelien 371
}