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;
1971 aurelien 144
	            	setRawValue(rdSelectionne.getAsString("valeur"));
1945 aurelien 145
	            }
146
 
147
	            @Override
148
				public void onBlur(Field field) {
1971 aurelien 149
	            	if(rdSelectionne != null && !rdSelectionne.getAsString("valeur").equals(valeurBrute)) {
150
	            		setRawValue(valeurBrute);
151
	            	}
1945 aurelien 152
	            }
1940 aurelien 153
	         });
154
 
155
			this.addListener(new ComponentListenerAdapter() {
156
				@Override
157
				public void onRender(Component component) {
158
					setLargeurChamp();
159
				}
160
			});
161
		}
162
 
163
		@Override
164
		public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
165
 
166
			@SuppressWarnings("unchecked")
167
			ArrayList<String> valeurs = (ArrayList<String>)nouvelleDonnees;
1945 aurelien 168
			cacheValeurs = valeurs;
1940 aurelien 169
 
170
			int i = 0;
171
			Object[][] refData = new Object[valeurs.size()][1];
172
 
173
			for (Iterator<String> it = valeurs.iterator(); it.hasNext();)
174
			{
175
				refData[i][0]= it.next();
176
				i++;
177
			}
178
 
179
			FieldDef defValeur = new StringFieldDef("valeur");
180
			FieldDef[] defTab = {defValeur};
181
 
182
			RecordDef rd = new RecordDef(defTab);
183
 
184
			final MemoryProxy dataProxy = new MemoryProxy(refData);
185
			final ArrayReader reader = new ArrayReader(rd);
186
 
1943 aurelien 187
			Store store = new Store(dataProxy,reader);
1940 aurelien 188
 
189
			setStore(store);
190
			store.load();
191
		}
192
 
193
		private void obtenirListeValeurs() {
194
			String valeurChamp = getValue();
195
			obtenirListeValeurs(valeurChamp);
196
		}
197
 
198
		private void obtenirListeValeurs(String valeurChamp) {
199
			if(valeurChamp == null) {
200
				valeurChamp = "";
201
			} else {
202
				valeurChamp += "*";
203
			}
204
			ListeReferentielChampsEtendusDAO lrceDao = new ListeReferentielChampsEtendusDAO(null);
205
			lrceDao.obtenirListeValeursChampEtendu(this, cle, valeurChamp);
206
		}
207
 
208
		public void setLargeurChamp() {
209
			// Correction un peu moche pour améliorer l'affichage du champ
210
			String idElementEnfant = Ext.get(("x-form-el-"+cle)).getFirstChild().getId();
211
			Ext.get(idElementEnfant).setWidth("90%", false);
212
			Ext.get(cle).setWidth("100%", false);
213
		}
1943 aurelien 214
 
215
		private void initStoreVide() {
216
			Object[][] refData = new Object[0][1];
217
 
218
			FieldDef defValeur = new StringFieldDef("valeur");
219
			FieldDef[] defTab = {defValeur};
220
 
221
			RecordDef rd = new RecordDef(defTab);
222
 
223
			final MemoryProxy dataProxy = new MemoryProxy(refData);
224
			final ArrayReader reader = new ArrayReader(rd);
225
 
226
			Store store = new Store(dataProxy,reader);
227
 
228
			setStore(store);
229
			store.load();
230
		}
1967 aurelien 231
 
232
		@Override
233
		public void setValue(String valeur) {
234
			valeurBrute = valeur;
235
			super.setValue(valeur);
236
		}
237
}