Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1940 aurelien 1
package org.tela_botanica.client.util;
2
 
3
import java.util.ArrayList;
4
import java.util.Iterator;
1945 aurelien 5
import java.util.List;
1940 aurelien 6
 
7
import org.tela_botanica.client.interfaces.Rafraichissable;
8
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
1943 aurelien 9
import org.tela_botanica.client.modeles.objets.Configuration;
1940 aurelien 10
 
11
import com.google.gwt.user.client.Timer;
12
import com.gwtext.client.core.EventCallback;
13
import com.gwtext.client.core.EventObject;
14
import com.gwtext.client.core.Ext;
15
import com.gwtext.client.core.ListenerConfig;
16
import com.gwtext.client.data.ArrayReader;
17
import com.gwtext.client.data.FieldDef;
18
import com.gwtext.client.data.MemoryProxy;
19
import com.gwtext.client.data.Record;
20
import com.gwtext.client.data.RecordDef;
21
import com.gwtext.client.data.Store;
22
import com.gwtext.client.data.StringFieldDef;
23
import com.gwtext.client.widgets.Component;
24
import com.gwtext.client.widgets.event.ComponentListenerAdapter;
25
import com.gwtext.client.widgets.form.ComboBox;
1945 aurelien 26
import com.gwtext.client.widgets.form.Field;
1940 aurelien 27
import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;
28
 
29
public class ChampSaisieEtendu extends ComboBox implements Rafraichissable {
30
		// TODO: faire un enum
31
		private final int KEY_ALT = 18;
32
		private final int KEY_BACKSPACE = 8;
33
		private final int KEY_CTRL = 17;
34
		private final int KEY_DELETE = 46;
35
		private final int KEY_DOWN = 40;
36
		private final int KEY_END = 35;
37
		private final int KEY_ENTER = 13;
38
		private final int KEY_ESCAPE = 27;
39
		private final int KEY_HOME = 36;
40
		private final int KEY_LEFT = 37;
41
		private final int KEY_PAGEDOWN = 34;
42
		private final int KEY_PAGEUP = 33;
43
		private final int KEY_RIGHT = 39;
44
		private final int KEY_SHIFT = 16;
45
		private final int KEY_TAB = 9;
46
		private final int KEY_UP = 38;
47
 
48
		private boolean selectionValeur = false;
49
		private boolean estModifie = false;
50
 
51
		private String cle = null;
52
		private String label = null;
53
 
54
		private Timer timer = null;
55
 
1968 aurelien 56
		final String resultTplRefPerso = "<div class=\"search-item-ref\">{valeur}</div>";
1940 aurelien 57
 
1945 aurelien 58
		private List<String> cacheValeurs;
59
		private Record rdSelectionne = null;
60
		private String valeurBrute = "";
61
 
1940 aurelien 62
		public ChampSaisieEtendu(String label, String cle) {
63
 
64
			// Accesskey pour debugging
65
			super(label,cle);
66
 
67
			this.cle =cle;
68
			this.label = label;
69
 
70
			setTpl(resultTplRefPerso);
71
			setMode(ComboBox.REMOTE);
72
			setItemSelector("div.search-item-ref");
1945 aurelien 73
			setTypeAhead(false);
1940 aurelien 74
			setLoadingText("Recherche...");
75
			setHideTrigger(true);
1945 aurelien 76
			setValidateOnBlur(false);
1940 aurelien 77
 
78
		    ListenerConfig listenerConfigAutocompletion=new ListenerConfig();
79
		    listenerConfigAutocompletion.setDelay(200);
80
		    listenerConfigAutocompletion.setStopPropagation(false);
81
		    listenerConfigAutocompletion.setStopEvent(false);
1967 aurelien 82
		    initStoreVide();
1940 aurelien 83
 
1943 aurelien 84
		    if(Configuration.saisieChampsEtendusActivee()) {
85
				addKeyPressListener(new EventCallback() {
86
 
87
					@Override
88
					public void execute(EventObject e) {
89
 
90
						switch(e.getKey()) {
91
 
92
						  case KEY_ALT:
93
		  	    	      case KEY_CTRL:
94
		  	    	      case KEY_END:
95
		  	    	      case KEY_ESCAPE:
96
		  	    	      case KEY_HOME:
97
		  	    	      case KEY_LEFT:
98
		  	    	      case KEY_PAGEDOWN:
99
		  	    	      case KEY_PAGEUP:
100
		  	    	      case KEY_RIGHT:
101
		  	    	      case KEY_SHIFT:
102
		  	    	      case KEY_TAB:
103
		  	    	      case KEY_UP:
104
 
105
			    	        break;
106
 
1945 aurelien 107
		  	    	      case KEY_ENTER:
108
		  	    	    	  if(rdSelectionne != null) {
109
		  	    	    		  setValue(rdSelectionne.getAsString("valeur"));
110
		  	    	    		  selectionValeur=true;
111
		  	    	    		  valeurBrute = rdSelectionne.getAsString("valeur");
112
		  	    	    	  }
113
			              break;
114
 
1943 aurelien 115
		  	    	      case KEY_DOWN:
116
		  	    	    	  if(getValueAsString().isEmpty() && !isExpanded()) {
117
		  	    	    		  obtenirListeValeurs("*");
118
		  	    	    	  }
119
		  	    	      break;
120
 
121
		  	    	      default:
122
		  	    	    	if(timer != null) {
123
			    	    		timer.cancel();
124
			    	    	}
125
			    	    	timer = new Timer() {
126
 
127
								@Override
128
								public void run() {
129
				  	    	      	obtenirListeValeurs();
130
								}
131
							};
132
							timer.schedule(300);
1945 aurelien 133
							valeurBrute = getValueAsString();
134
							setValue(valeurBrute);
1943 aurelien 135
						}
1940 aurelien 136
					}
1943 aurelien 137
			    },listenerConfigAutocompletion);
138
		    }
1940 aurelien 139
 
140
			addListener(new ComboBoxListenerAdapter() {
1945 aurelien 141
	            @Override
1940 aurelien 142
				public void onSelect(ComboBox comboBox, Record record, int index) {
1945 aurelien 143
	            	rdSelectionne = record;
144
	            }
145
 
146
	            @Override
147
				public void onBlur(Field field) {
148
	            	setRawValue(valeurBrute);
149
	            }
1940 aurelien 150
	         });
151
 
152
			this.addListener(new ComponentListenerAdapter() {
153
				@Override
154
				public void onRender(Component component) {
155
					setLargeurChamp();
156
				}
157
			});
158
		}
159
 
160
		@Override
161
		public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
162
 
163
			@SuppressWarnings("unchecked")
164
			ArrayList<String> valeurs = (ArrayList<String>)nouvelleDonnees;
1945 aurelien 165
			cacheValeurs = valeurs;
1940 aurelien 166
 
167
			int i = 0;
168
			Object[][] refData = new Object[valeurs.size()][1];
169
 
170
			for (Iterator<String> it = valeurs.iterator(); it.hasNext();)
171
			{
172
				refData[i][0]= it.next();
173
				i++;
174
			}
175
 
176
			FieldDef defValeur = new StringFieldDef("valeur");
177
			FieldDef[] defTab = {defValeur};
178
 
179
			RecordDef rd = new RecordDef(defTab);
180
 
181
			final MemoryProxy dataProxy = new MemoryProxy(refData);
182
			final ArrayReader reader = new ArrayReader(rd);
183
 
1943 aurelien 184
			Store store = new Store(dataProxy,reader);
1940 aurelien 185
 
186
			setStore(store);
187
			store.load();
188
		}
189
 
190
		private void obtenirListeValeurs() {
191
			String valeurChamp = getValue();
192
			obtenirListeValeurs(valeurChamp);
193
		}
194
 
195
		private void obtenirListeValeurs(String valeurChamp) {
196
			if(valeurChamp == null) {
197
				valeurChamp = "";
198
			} else {
199
				valeurChamp += "*";
200
			}
201
			ListeReferentielChampsEtendusDAO lrceDao = new ListeReferentielChampsEtendusDAO(null);
202
			lrceDao.obtenirListeValeursChampEtendu(this, cle, valeurChamp);
203
		}
204
 
205
		public void setLargeurChamp() {
206
			// Correction un peu moche pour améliorer l'affichage du champ
207
			String idElementEnfant = Ext.get(("x-form-el-"+cle)).getFirstChild().getId();
208
			Ext.get(idElementEnfant).setWidth("90%", false);
209
			Ext.get(cle).setWidth("100%", false);
210
		}
1943 aurelien 211
 
212
		private void initStoreVide() {
213
			Object[][] refData = new Object[0][1];
214
 
215
			FieldDef defValeur = new StringFieldDef("valeur");
216
			FieldDef[] defTab = {defValeur};
217
 
218
			RecordDef rd = new RecordDef(defTab);
219
 
220
			final MemoryProxy dataProxy = new MemoryProxy(refData);
221
			final ArrayReader reader = new ArrayReader(rd);
222
 
223
			Store store = new Store(dataProxy,reader);
224
 
225
			setStore(store);
226
			store.load();
227
		}
1967 aurelien 228
 
229
		@Override
230
		public void setValue(String valeur) {
231
			valeurBrute = valeur;
232
			super.setValue(valeur);
233
		}
234
}