Subversion Repositories eFlore/Applications.cel

Rev

Rev 1943 | 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
 
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
 
56
		final String resultTplRefPerso = "<div class=\"search-item-ref\">{valeur}</div>";
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);
82
 
1943 aurelien 83
		    if(Configuration.saisieChampsEtendusActivee()) {
84
				addKeyPressListener(new EventCallback() {
85
 
86
					@Override
87
					public void execute(EventObject e) {
88
 
89
						switch(e.getKey()) {
90
 
91
						  case KEY_ALT:
92
		  	    	      case KEY_CTRL:
93
		  	    	      case KEY_END:
94
		  	    	      case KEY_ESCAPE:
95
		  	    	      case KEY_HOME:
96
		  	    	      case KEY_LEFT:
97
		  	    	      case KEY_PAGEDOWN:
98
		  	    	      case KEY_PAGEUP:
99
		  	    	      case KEY_RIGHT:
100
		  	    	      case KEY_SHIFT:
101
		  	    	      case KEY_TAB:
102
		  	    	      case KEY_UP:
103
 
104
			    	        break;
105
 
1945 aurelien 106
		  	    	      case KEY_ENTER:
107
		  	    	    	  if(rdSelectionne != null) {
108
		  	    	    		  setValue(rdSelectionne.getAsString("valeur"));
109
		  	    	    		  selectionValeur=true;
110
		  	    	    		  valeurBrute = rdSelectionne.getAsString("valeur");
111
		  	    	    	  }
112
			              break;
113
 
1943 aurelien 114
		  	    	      case KEY_DOWN:
115
		  	    	    	  if(getValueAsString().isEmpty() && !isExpanded()) {
116
		  	    	    		  obtenirListeValeurs("*");
117
		  	    	    	  }
118
		  	    	      break;
119
 
120
		  	    	      default:
121
		  	    	    	if(timer != null) {
122
			    	    		timer.cancel();
123
			    	    	}
124
			    	    	timer = new Timer() {
125
 
126
								@Override
127
								public void run() {
128
				  	    	      	obtenirListeValeurs();
129
								}
130
							};
131
							timer.schedule(300);
1945 aurelien 132
							valeurBrute = getValueAsString();
133
							setValue(valeurBrute);
1943 aurelien 134
						}
1940 aurelien 135
					}
1943 aurelien 136
			    },listenerConfigAutocompletion);
137
		    } else {
138
		    	initStoreVide();
139
		    }
1940 aurelien 140
 
141
			addListener(new ComboBoxListenerAdapter() {
1945 aurelien 142
	            @Override
1940 aurelien 143
				public void onSelect(ComboBox comboBox, Record record, int index) {
1945 aurelien 144
	            	rdSelectionne = record;
145
	            }
146
 
147
	            @Override
148
				public void onBlur(Field field) {
149
	            	setRawValue(valeurBrute);
150
	            }
1940 aurelien 151
	         });
152
 
153
			this.addListener(new ComponentListenerAdapter() {
154
				@Override
155
				public void onRender(Component component) {
156
					setLargeurChamp();
157
				}
158
			});
159
		}
160
 
161
		@Override
162
		public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
163
 
164
			@SuppressWarnings("unchecked")
165
			ArrayList<String> valeurs = (ArrayList<String>)nouvelleDonnees;
1945 aurelien 166
			cacheValeurs = valeurs;
1940 aurelien 167
 
168
			int i = 0;
169
			Object[][] refData = new Object[valeurs.size()][1];
170
 
171
			for (Iterator<String> it = valeurs.iterator(); it.hasNext();)
172
			{
173
				refData[i][0]= it.next();
174
				i++;
175
			}
176
 
177
			FieldDef defValeur = new StringFieldDef("valeur");
178
			FieldDef[] defTab = {defValeur};
179
 
180
			RecordDef rd = new RecordDef(defTab);
181
 
182
			final MemoryProxy dataProxy = new MemoryProxy(refData);
183
			final ArrayReader reader = new ArrayReader(rd);
184
 
1943 aurelien 185
			Store store = new Store(dataProxy,reader);
1940 aurelien 186
 
187
			setStore(store);
188
			store.load();
189
		}
190
 
191
		private void obtenirListeValeurs() {
192
			String valeurChamp = getValue();
193
			obtenirListeValeurs(valeurChamp);
194
		}
195
 
196
		private void obtenirListeValeurs(String valeurChamp) {
197
			if(valeurChamp == null) {
198
				valeurChamp = "";
199
			} else {
200
				valeurChamp += "*";
201
			}
202
			ListeReferentielChampsEtendusDAO lrceDao = new ListeReferentielChampsEtendusDAO(null);
203
			lrceDao.obtenirListeValeursChampEtendu(this, cle, valeurChamp);
204
		}
205
 
206
		public void setLargeurChamp() {
207
			// Correction un peu moche pour améliorer l'affichage du champ
208
			String idElementEnfant = Ext.get(("x-form-el-"+cle)).getFirstChild().getId();
209
			Ext.get(idElementEnfant).setWidth("90%", false);
210
			Ext.get(cle).setWidth("100%", false);
211
		}
1943 aurelien 212
 
213
		private void initStoreVide() {
214
			Object[][] refData = new Object[0][1];
215
 
216
			FieldDef defValeur = new StringFieldDef("valeur");
217
			FieldDef[] defTab = {defValeur};
218
 
219
			RecordDef rd = new RecordDef(defTab);
220
 
221
			final MemoryProxy dataProxy = new MemoryProxy(refData);
222
			final ArrayReader reader = new ArrayReader(rd);
223
 
224
			Store store = new Store(dataProxy,reader);
225
 
226
			setStore(store);
227
			store.load();
228
		}
1940 aurelien 229
}