Subversion Repositories eFlore/Applications.cel

Rev

Rev 2392 | 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
 
3
import java.util.ArrayList;
4
import java.util.Iterator;
1945 aurelien 5
import java.util.List;
1940 aurelien 6
import org.tela_botanica.client.interfaces.Rafraichissable;
7
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
1943 aurelien 8
import org.tela_botanica.client.modeles.objets.Configuration;
1940 aurelien 9
 
2392 aurelien 10
import com.google.gwt.core.client.Callback;
1940 aurelien 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;
2392 aurelien 24
import com.gwtext.client.widgets.ToolTip;
1940 aurelien 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
 
2392 aurelien 62
		private String description = null;
63
		private ToolTip tpDesc = null;
64
 
1940 aurelien 65
		public ChampSaisieEtendu(String label, String cle) {
2392 aurelien 66
 
1940 aurelien 67
			super(label,cle);
68
 
69
			this.cle =cle;
70
			this.label = label;
71
 
72
			setTpl(resultTplRefPerso);
73
			setMode(ComboBox.REMOTE);
74
			setItemSelector("div.search-item-ref");
1945 aurelien 75
			setTypeAhead(false);
1940 aurelien 76
			setLoadingText("Recherche...");
77
			setHideTrigger(true);
1945 aurelien 78
			setValidateOnBlur(false);
1940 aurelien 79
 
80
		    ListenerConfig listenerConfigAutocompletion=new ListenerConfig();
81
		    listenerConfigAutocompletion.setDelay(200);
82
		    listenerConfigAutocompletion.setStopPropagation(false);
83
		    listenerConfigAutocompletion.setStopEvent(false);
1967 aurelien 84
		    initStoreVide();
1940 aurelien 85
 
1943 aurelien 86
		    if(Configuration.saisieChampsEtendusActivee()) {
87
				addKeyPressListener(new EventCallback() {
88
 
89
					@Override
90
					public void execute(EventObject e) {
91
 
92
						switch(e.getKey()) {
93
 
94
						  case KEY_ALT:
95
		  	    	      case KEY_CTRL:
96
		  	    	      case KEY_END:
97
		  	    	      case KEY_ESCAPE:
98
		  	    	      case KEY_HOME:
99
		  	    	      case KEY_LEFT:
100
		  	    	      case KEY_PAGEDOWN:
101
		  	    	      case KEY_PAGEUP:
102
		  	    	      case KEY_RIGHT:
103
		  	    	      case KEY_SHIFT:
104
		  	    	      case KEY_TAB:
105
		  	    	      case KEY_UP:
106
 
107
			    	        break;
108
 
1945 aurelien 109
		  	    	      case KEY_ENTER:
110
		  	    	    	  if(rdSelectionne != null) {
111
		  	    	    		  setValue(rdSelectionne.getAsString("valeur"));
112
		  	    	    		  selectionValeur=true;
113
		  	    	    		  valeurBrute = rdSelectionne.getAsString("valeur");
114
		  	    	    	  }
115
			              break;
116
 
1943 aurelien 117
		  	    	      case KEY_DOWN:
118
		  	    	    	  if(getValueAsString().isEmpty() && !isExpanded()) {
119
		  	    	    		  obtenirListeValeurs("*");
120
		  	    	    	  }
121
		  	    	      break;
122
 
123
		  	    	      default:
124
		  	    	    	if(timer != null) {
125
			    	    		timer.cancel();
126
			    	    	}
127
			    	    	timer = new Timer() {
128
 
129
								@Override
130
								public void run() {
131
				  	    	      	obtenirListeValeurs();
132
								}
133
							};
134
							timer.schedule(300);
1945 aurelien 135
							valeurBrute = getValueAsString();
136
							setValue(valeurBrute);
1943 aurelien 137
						}
1940 aurelien 138
					}
1943 aurelien 139
			    },listenerConfigAutocompletion);
140
		    }
1940 aurelien 141
 
142
			addListener(new ComboBoxListenerAdapter() {
1945 aurelien 143
	            @Override
1940 aurelien 144
				public void onSelect(ComboBox comboBox, Record record, int index) {
1945 aurelien 145
	            	rdSelectionne = record;
1971 aurelien 146
	            	setRawValue(rdSelectionne.getAsString("valeur"));
1945 aurelien 147
	            }
148
 
149
	            @Override
150
				public void onBlur(Field field) {
1971 aurelien 151
	            	if(rdSelectionne != null && !rdSelectionne.getAsString("valeur").equals(valeurBrute)) {
152
	            		setRawValue(valeurBrute);
153
	            	}
1945 aurelien 154
	            }
1940 aurelien 155
	         });
156
 
2392 aurelien 157
			// A activer pour télécharger la description
158
			// si jamais on le décide
159
			addListener(new ComboBoxListenerAdapter() {
1940 aurelien 160
				@Override
161
				public void onRender(Component component) {
162
					setLargeurChamp();
2392 aurelien 163
					ChampSaisieEtendu.this.getEl().addListener("mouseover", new EventCallback() {
164
						@Override
165
						public void execute(EventObject e) {
166
							if(description == null) {
167
								telechargerEtAfficherDescriptionDistante();
168
							} else {
169
								afficherDescription(description);
170
							}
171
						}
172
					});
1940 aurelien 173
				}
174
			});
175
		}
176
 
2392 aurelien 177
		private void telechargerEtAfficherDescriptionDistante() {
178
			ListeReferentielChampsEtendusDAO.telechargerDescriptionWikini(cle, new Callback<String, String>() {
179
				@Override
180
				public void onSuccess(String description) {
181
					ChampSaisieEtendu.this.description = description;
182
					afficherDescription(description);
183
				}
184
 
185
				@Override
186
				public void onFailure(String description) {
187
					afficherDescription(description);
188
				}
189
			});
190
		}
191
 
192
		private void afficherDescription(String description) {
193
			if(!description.trim().isEmpty()) {
194
				if(tpDesc == null) {
195
					tpDesc = new ToolTip(description);
196
					tpDesc.applyTo(this.getElement());
197
					tpDesc.showAt(ChampSaisieEtendu.this.getEl().getX(), ChampSaisieEtendu.this.getEl().getY());
198
				} else {
199
					tpDesc.show();
200
				}
201
			}
202
		}
203
 
1940 aurelien 204
		@Override
205
		public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
206
 
207
			@SuppressWarnings("unchecked")
208
			ArrayList<String> valeurs = (ArrayList<String>)nouvelleDonnees;
1945 aurelien 209
			cacheValeurs = valeurs;
2033 aurelien 210
 
1940 aurelien 211
			int i = 0;
212
			Object[][] refData = new Object[valeurs.size()][1];
213
 
214
			for (Iterator<String> it = valeurs.iterator(); it.hasNext();)
215
			{
216
				refData[i][0]= it.next();
217
				i++;
218
			}
219
 
220
			FieldDef defValeur = new StringFieldDef("valeur");
221
			FieldDef[] defTab = {defValeur};
222
 
223
			RecordDef rd = new RecordDef(defTab);
224
 
225
			final MemoryProxy dataProxy = new MemoryProxy(refData);
226
			final ArrayReader reader = new ArrayReader(rd);
227
 
1943 aurelien 228
			Store store = new Store(dataProxy,reader);
1940 aurelien 229
 
230
			setStore(store);
231
			store.load();
232
		}
233
 
234
		private void obtenirListeValeurs() {
2033 aurelien 235
			String valeurChamp = getRawValue();
1940 aurelien 236
			obtenirListeValeurs(valeurChamp);
237
		}
238
 
239
		private void obtenirListeValeurs(String valeurChamp) {
240
			if(valeurChamp == null) {
241
				valeurChamp = "";
242
			} else {
243
				valeurChamp += "*";
244
			}
245
			ListeReferentielChampsEtendusDAO lrceDao = new ListeReferentielChampsEtendusDAO(null);
246
			lrceDao.obtenirListeValeursChampEtendu(this, cle, valeurChamp);
247
		}
248
 
249
		public void setLargeurChamp() {
250
			// Correction un peu moche pour améliorer l'affichage du champ
251
			String idElementEnfant = Ext.get(("x-form-el-"+cle)).getFirstChild().getId();
252
			Ext.get(idElementEnfant).setWidth("90%", false);
253
			Ext.get(cle).setWidth("100%", false);
254
		}
1943 aurelien 255
 
256
		private void initStoreVide() {
257
			Object[][] refData = new Object[0][1];
258
 
259
			FieldDef defValeur = new StringFieldDef("valeur");
260
			FieldDef[] defTab = {defValeur};
261
 
262
			RecordDef rd = new RecordDef(defTab);
263
 
264
			final MemoryProxy dataProxy = new MemoryProxy(refData);
265
			final ArrayReader reader = new ArrayReader(rd);
266
 
267
			Store store = new Store(dataProxy,reader);
268
 
269
			setStore(store);
270
			store.load();
271
		}
1967 aurelien 272
 
273
		@Override
274
		public void setValue(String valeur) {
275
			valeurBrute = valeur;
276
			super.setValue(valeur);
277
		}
2033 aurelien 278
 
279
		public String getCle() {
280
			return cle;
281
		}
282
 
283
		public String getLabel() {
284
			return label;
285
		}
1967 aurelien 286
}