Subversion Repositories eFlore/Applications.cel

Rev

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