root / trunk / libraries / libUI / src / org / gvsig / gui / beans / comboBoxItemsSeeker / JComboBoxItemsSeekerConfigurable.java @ 6754
History | View | Annotate | Download (60.9 KB)
1 | 6721 | ppiqueras | package org.gvsig.gui.beans.comboBoxItemsSeeker; |
---|---|---|---|
2 | |||
3 | import java.awt.Color; |
||
4 | import java.awt.event.ActionEvent; |
||
5 | import java.awt.event.FocusAdapter; |
||
6 | import java.awt.event.FocusEvent; |
||
7 | import java.awt.event.FocusListener; |
||
8 | import java.awt.event.KeyAdapter; |
||
9 | import java.awt.event.KeyEvent; |
||
10 | import java.awt.event.KeyListener; |
||
11 | import java.beans.PropertyChangeEvent; |
||
12 | import java.beans.PropertyChangeListener; |
||
13 | |||
14 | import javax.swing.ComboBoxEditor; |
||
15 | import javax.swing.ComboBoxModel; |
||
16 | import javax.swing.JComboBox; |
||
17 | import javax.swing.JOptionPane; |
||
18 | import javax.swing.event.DocumentEvent; |
||
19 | import javax.swing.event.DocumentListener; |
||
20 | import javax.swing.event.ListDataEvent; |
||
21 | import javax.swing.event.ListDataListener; |
||
22 | import javax.swing.event.PopupMenuEvent; |
||
23 | import javax.swing.event.PopupMenuListener; |
||
24 | import javax.swing.text.AttributeSet; |
||
25 | import javax.swing.text.BadLocationException; |
||
26 | import javax.swing.text.JTextComponent; |
||
27 | import javax.swing.text.PlainDocument; |
||
28 | |||
29 | 6732 | ppiqueras | import org.apache.log4j.Logger; |
30 | 6721 | ppiqueras | |
31 | 6732 | ppiqueras | |
32 | 6721 | ppiqueras | import com.iver.andami.PluginServices; |
33 | |||
34 | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
||
35 | *
|
||
36 | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
||
37 | *
|
||
38 | * This program is free software; you can redistribute it and/or
|
||
39 | * modify it under the terms of the GNU General Public License
|
||
40 | * as published by the Free Software Foundation; either version 2
|
||
41 | * of the License, or (at your option) any later version.
|
||
42 | *
|
||
43 | * This program is distributed in the hope that it will be useful,
|
||
44 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
45 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
46 | * GNU General Public License for more details.
|
||
47 | *
|
||
48 | * You should have received a copy of the GNU General Public License
|
||
49 | * along with this program; if not, write to the Free Software
|
||
50 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
51 | *
|
||
52 | * For more information, contact:
|
||
53 | *
|
||
54 | * Generalitat Valenciana
|
||
55 | * Conselleria d'Infraestructures i Transport
|
||
56 | * Av. Blasco Ib??ez, 50
|
||
57 | * 46010 VALENCIA
|
||
58 | * SPAIN
|
||
59 | *
|
||
60 | * +34 963862235
|
||
61 | * gvsig@gva.es
|
||
62 | * www.gvsig.gva.es
|
||
63 | *
|
||
64 | * or
|
||
65 | *
|
||
66 | * IVER T.I. S.A
|
||
67 | * Salamanca 50
|
||
68 | * 46005 Valencia
|
||
69 | * Spain
|
||
70 | *
|
||
71 | * +34 963163400
|
||
72 | * dac@iver.es
|
||
73 | */
|
||
74 | |||
75 | /** VERSI?N EN DESARROLLO
|
||
76 | * REVISAR COMENTARIOS Y C?DIGO QUE PUEDA SOBRAR
|
||
77 | * This class allows users to insert a chain of characters and show all the sentences of the JComboBox that match its first ones characters with it.
|
||
78 | * This class is also a Java Bean, and is made according the MVC (Model - View - Controller) pattern.
|
||
79 | * This class has the View, the Control and can access to the Model.
|
||
80 | * The behavior of this componet can be configurated by 7 flags: (Esto lo cambio!!!!!)
|
||
81 | * + The appearence of the items showed at the beginning and when the user presses the ESCAPE key: (This is configured with 2 flags -> 3 different states are possible)
|
||
82 | * -> maintainPositionItems -> When we see the list of all items, this are showed in the ordenation as they have been introduced (if true); (if false) each new item
|
||
83 | * when we write on the TextField of this Component will be showed at the end (esto ?ltimo creo q. no -> revisarlo)
|
||
84 | * -> all_Alphanumeric_Sorted -> All items we can see in this Component will be showed in alphanumeric ordenation (if true)
|
||
85 | * + The list of the items showed when the user makes a search writting or pressing the BACK-SPACE key (This is configured with 1 flag -> 2 different states are possible)
|
||
86 | * -> alphanumericSortedSearches -> When we write on the TextField of this Component all results (items) are showed in alphanumeric ordenation (if true)
|
||
87 | * + Key Sensitive or not when the user writes
|
||
88 | * -> key_Sensitive -> When we write on the TextField it can discriminate upper cases from down cases (if true) or not (if false) (This is configured with 1 flag -> 2 different states are possible)
|
||
89 | * + Show all items always
|
||
90 | * -> showAllItems -> If true -> this component shows all items always; if false -> this component only shows items that their first characters match with the string written by the user
|
||
91 | * + Use one color (black) or 2 colors (black by default and red if the string written doesn't match with the beginning of all items)
|
||
92 | * -> only_One_Color -> The text on the textField only will be showed on black color (if true); false -> if the text on the textField doesn't match with any current item of this component -> the text
|
||
93 | * will be showed on red color
|
||
94 | * + * @param boolean (completeMatchedItem (explicar))
|
||
95 | * + @param boolean (useBeep (explicar))
|
||
96 | *
|
||
97 | * Default Values of the Flags:
|
||
98 | * -> maintainPositionItems -> true
|
||
99 | * -> all_Alphanumeric_Sorted -> true
|
||
100 | * -> alphanumericSortedSearches -> false
|
||
101 | * -> key_Sensitive -> false
|
||
102 | * -> showAllItems -> false
|
||
103 | * -> only_One_Color -> false
|
||
104 | *
|
||
105 | * The flags are distributed in two classes:
|
||
106 | * -> ComboBoxSearcheableDynamicModel -> maintainPositionItems, all_Alphanumeric_Sorted, alphanumericSortedSearches, key_Sensitive, showAllItems
|
||
107 | * -> JComboBoxSearcheableDynamic -> only_One_Color
|
||
108 | *
|
||
109 | * Combinations of flags not allowed:
|
||
110 | * -> maintainPositionItems == allAlphanumericSorted == true
|
||
111 | * -> ((maintain_Position_Items == false) && (all_Alphanumeric_Sorted == true) && (alphanumeric_Sorted_Searches == false))
|
||
112 | * -> showAllItems == true && maintainPositionItems == false (Creo que esta mal)
|
||
113 | *
|
||
114 | * Limitations:
|
||
115 | * -> When we add more than one item with the same name (string value) -> the behavior of this component only considers one item in most of the cases when it does a search
|
||
116 | * -> If this component has Hundreds,Thousands or even Million/s of items is probably that had quite delay to respond the evens of the user; this also depends of the machine where it's executed and other factors
|
||
117 | *
|
||
118 | * @author Pablo Piqueras Bartolom? (p_queras@hotmail.com)
|
||
119 | */
|
||
120 | public class JComboBoxItemsSeekerConfigurable extends JComboBox implements java.io.Serializable { |
||
121 | //private static final long serialVersionUID = -1853812970336818959L;
|
||
122 | // PONER SERIALIZACI?N
|
||
123 | |||
124 | // eSTAS HAY QUE BORRARLAS!
|
||
125 | /* private Vector defaultItems;
|
||
126 | private Set notRemovedItems;
|
||
127 | private Set removedItems;*/
|
||
128 | |||
129 | private final int BEGINNING_VIEW_STATE = 0; |
||
130 | private final int START_VIEW_STATE = 1; |
||
131 | private final int SEARCH_VIEW_STATE = 2; |
||
132 | private int currentShowState; // 0 -> at the beginning; 1 -> when is showing the start list of items; 2 -> when is showing a search list of items |
||
133 | |||
134 | |||
135 | // CONFIGURATION FLAGS
|
||
136 | private boolean onlyOneColor; |
||
137 | private boolean completeMatchedItem; |
||
138 | 6732 | ppiqueras | private boolean beepEnabled; |
139 | 6721 | ppiqueras | // END FLAGS
|
140 | |||
141 | // PUEDE QUE TB. sOBren
|
||
142 | // private boolean allItemsAreSorted;
|
||
143 | |||
144 | // Last selected item
|
||
145 | private Object selectedItem; |
||
146 | private Object lastSelectedItem; // This is used for only update (refresh) de popup when a different item is selected |
||
147 | |||
148 | |||
149 | // pueDE QUE TB. SOBRE
|
||
150 | private int num = 0; |
||
151 | // private JTextField txtField;
|
||
152 | |||
153 | private final int POPUP_LIST_ITEMS_HEIGHT = 8; |
||
154 | // Reference to the ui
|
||
155 | //private MetalComboBoxItemsSeekerUI ui;
|
||
156 | |||
157 | // Reference to the model
|
||
158 | private ComboBoxItemsSeekerConfigurableModel model;
|
||
159 | |||
160 | // Some listeners for the Control between the View and de Model
|
||
161 | private KeyListener editorKeyListener; |
||
162 | private FocusListener editorFocusListener; |
||
163 | private DocumentListener documentListener; |
||
164 | private ListDataListener modelListDataListener; |
||
165 | private PopupMenuListener popupMenuListener; |
||
166 | |||
167 | // Reference to the document of the Editor of this component for optimize the seeks
|
||
168 | private PlainDocumentSeeker document;
|
||
169 | |||
170 | // private String writtenString;
|
||
171 | |||
172 | private boolean continueOnStartViewState; |
||
173 | // private boolean specialKeys; // ESC and TAB keys
|
||
174 | private boolean textKeyPressed; |
||
175 | private boolean lastWasTheBeginningState; |
||
176 | // private boolean keyPressed;
|
||
177 | // private boolean updatePopUp;
|
||
178 | // private boolean upOrDownKeyPressed;
|
||
179 | // private boolean deleteKeyPressed;
|
||
180 | // private boolean escapeKeyPressed;
|
||
181 | |||
182 | // OTRAS FLAGS que puede que sobren alguNAS
|
||
183 | private boolean selecting=false; |
||
184 | private boolean hidePopupOnFocusLoss; |
||
185 | private boolean hitBackspace=false; |
||
186 | private boolean hitBackspaceOnSelection; |
||
187 | 6732 | ppiqueras | |
188 | // TRAZA - DEBUG
|
||
189 | 6733 | ppiqueras | private Logger logger = Logger.getLogger(JComboBoxItemsSeekerConfigurable.class.getClass()); |
190 | 6721 | ppiqueras | |
191 | |||
192 | /**
|
||
193 | * Default Constructor
|
||
194 | */
|
||
195 | public JComboBoxItemsSeekerConfigurable() {
|
||
196 | // Invokes to the parent class constructor
|
||
197 | super();
|
||
198 | |||
199 | // Create attributes and set initial values
|
||
200 | this.initialize();
|
||
201 | |||
202 | // Set the default values of the flags
|
||
203 | this.onlyOneColor = false; |
||
204 | this.completeMatchedItem = false; //true; |
||
205 | 6732 | ppiqueras | this.beepEnabled = false; //true; |
206 | 6721 | ppiqueras | |
207 | // Other configuration tasks
|
||
208 | this.createDefaultListeners();
|
||
209 | this.configure();
|
||
210 | //this.configure();
|
||
211 | } |
||
212 | |||
213 | /**
|
||
214 | * Default Constructor with four parameters: configure the 4 flags
|
||
215 | *
|
||
216 | * @param boolean (true -> maintains the position of the items; false -> don't maintains the position of the items)
|
||
217 | * @param boolean (true -> all items showed when we write on the textfield will be showed in alphanumeric ordenation; false -> they don't have to be in alphanumeric ordenation)
|
||
218 | * @param boolean (true -> all items showed will be in alphanumeric ordenation; false -> they don't have to be in alphanumeric ordenation)
|
||
219 | * @param boolean (true -> discriminates capital letters from small letters; false -> don't discriminates capital letters from small letters)
|
||
220 | */
|
||
221 | public JComboBoxItemsSeekerConfigurable(int start_Behavior, int search_Behavior, boolean key_Sensitive) { |
||
222 | // Invokes to the parent class constructor
|
||
223 | super();
|
||
224 | |||
225 | // Create attributes and set initial values
|
||
226 | this.initialize();
|
||
227 | |||
228 | // Sets the options selected by the user
|
||
229 | // this.model.setMaintainPositionItems(maintain_Position_Items);
|
||
230 | // this.model.setAllAlphanumericSorted(all_Alphanumeric_Sorted);
|
||
231 | // this.model.setAlphanumericSortedSearches(alphanumeric_Sorted_Searches);
|
||
232 | this.model.setStartBehavior(start_Behavior);
|
||
233 | this.model.setStartBehavior(search_Behavior);
|
||
234 | this.model.setKeySensitive(key_Sensitive);
|
||
235 | 6732 | ppiqueras | // this.model.setShowAllItems(false);
|
236 | 6721 | ppiqueras | this.onlyOneColor = false; |
237 | this.completeMatchedItem = false; //true; |
||
238 | 6732 | ppiqueras | this.beepEnabled = true; |
239 | 6721 | ppiqueras | |
240 | if (!testFlagsConfigurationOK())
|
||
241 | JOptionPane.showMessageDialog(this, PluginServices.getText(this, "errorMessageJComboBoxItemsSeekerConfigurable"), PluginServices.getText(this, "exportJOP2Title"), JOptionPane.ERROR_MESSAGE); |
||
242 | else
|
||
243 | this.configure();
|
||
244 | } |
||
245 | |||
246 | /**
|
||
247 | * Default Constructor with six parameters: configure the 6 flags
|
||
248 | *
|
||
249 | * @param boolean (true -> maintains the position of the items; false -> don't maintains the position of the items)
|
||
250 | * @param boolean (true -> all items showed when we write on the textfield will be showed in alphanumeric ordenation; false -> they don't have to be in alphanumeric ordenation)
|
||
251 | * @param boolean (true -> all items showed will be in alphanumeric ordenation; false -> they don't have to be in alphanumeric ordenation)
|
||
252 | * @param boolean (true -> discriminates capital letters from small letters; false -> don't discriminates capital letters from small letters)
|
||
253 | * @param boolean (true -> the text on the textField only will be showed on black color (if true); false -> if the text on the textField doesn't match with any current item of this component -> the text
|
||
254 | * will be showed on red color)
|
||
255 | * @param boolean (true -> this component shows all items always; false -> this component only shows items that their first characters match with the string written by the user)
|
||
256 | * @param boolean (completeMatchedItem (explicar))
|
||
257 | 6732 | ppiqueras | * @param boolean (beepEnabled (explicar))
|
258 | 6721 | ppiqueras | */
|
259 | public JComboBoxItemsSeekerConfigurable(int start_Behavior, int search_Behavior, boolean key_Sensitive, boolean only_One_Color, boolean show_All_Items, boolean complete_Matched_Item, boolean use_Beep) { |
||
260 | // Invokes to the parent class constructor
|
||
261 | super();
|
||
262 | |||
263 | // Create attributes and set initial values
|
||
264 | this.initialize();
|
||
265 | |||
266 | // Sets the options selected by the user
|
||
267 | // this.model.setMaintainPositionItems(maintain_Position_Items);
|
||
268 | // this.model.setAllAlphanumericSorted(all_Alphanumeric_Sorted);
|
||
269 | // this.model.setAlphanumericSortedSearches(alphanumeric_Sorted_Searches);
|
||
270 | this.model.setStartBehavior(start_Behavior);
|
||
271 | this.model.setStartBehavior(search_Behavior);
|
||
272 | this.model.setKeySensitive(key_Sensitive);
|
||
273 | 6732 | ppiqueras | // this.model.setShowAllItems(show_All_Items);
|
274 | 6721 | ppiqueras | this.onlyOneColor = only_One_Color;
|
275 | this.completeMatchedItem = complete_Matched_Item;
|
||
276 | 6732 | ppiqueras | this.beepEnabled = use_Beep;
|
277 | 6721 | ppiqueras | |
278 | if (!testFlagsConfigurationOK())
|
||
279 | JOptionPane.showMessageDialog(this, PluginServices.getText(this, "errorMessageJComboBoxItemsSeekerConfigurable"), PluginServices.getText(this, "exportJOP2Title"), JOptionPane.ERROR_MESSAGE); |
||
280 | else
|
||
281 | this.configure();
|
||
282 | } |
||
283 | |||
284 | |||
285 | /**
|
||
286 | *
|
||
287 | */
|
||
288 | private void initialize() { |
||
289 | // // Creates the ui for this component and gets it reference
|
||
290 | // super.setUI(new MetalComboBoxItemsSeekerUI());
|
||
291 | // this.ui = (MetalComboBoxItemsSeekerUI) super.getUI();
|
||
292 | // super.setUI(new MetalComboBoxItemsSeekerUI());
|
||
293 | |||
294 | // Creates the model for this component and gets it reference
|
||
295 | super.setModel(new ComboBoxItemsSeekerConfigurableModel()); |
||
296 | this.model = (ComboBoxItemsSeekerConfigurableModel) super.getModel(); |
||
297 | |||
298 | // Allows user to edit on the combobox
|
||
299 | super.setEditable(true); |
||
300 | |||
301 | // By default the last state of showign items was showing all the items (at the beginning of this component)
|
||
302 | currentShowState = BEGINNING_VIEW_STATE; |
||
303 | |||
304 | // Set the last selected item -> if there isn't any item -> -1; else -> this will be 0
|
||
305 | super.setSelectedIndex(-1); |
||
306 | this.selectedItem = null; |
||
307 | 6732 | ppiqueras | // logger.debug("selectedItem: " + this.getSelectedIndex());
|
308 | 6721 | ppiqueras | |
309 | // By default the keys Up and Down aren't pressed
|
||
310 | // this.upOrDownKeyPressed = false;
|
||
311 | |||
312 | // By default the keys Delete aren't pressed
|
||
313 | // this.escapeKeyPressed = false;
|
||
314 | |||
315 | // By default any text key has been pressed
|
||
316 | textKeyPressed = false;
|
||
317 | |||
318 | |||
319 | |||
320 | |||
321 | // // By default any key has been pressed
|
||
322 | // keyPressed = false;
|
||
323 | |||
324 | // specialKeys = false;
|
||
325 | // updatePopUp = false;
|
||
326 | |||
327 | // Remove the default mouse listener
|
||
328 | // super.removeMouseListener(super.getMouseListeners()[0]);
|
||
329 | } |
||
330 | |||
331 | /**
|
||
332 | *
|
||
333 | */
|
||
334 | private void createDefaultListeners() { |
||
335 | // TODO Auto-generated method stub
|
||
336 | |||
337 | // Define the key listener for the editor of this component
|
||
338 | this.defineEditorKeyListener(this); |
||
339 | |||
340 | // Define the focus listener for the editor of this component
|
||
341 | this.defineEditorFocusListener(this); |
||
342 | |||
343 | // Define a document listener for changes of text
|
||
344 | this.defineDocumentListener();
|
||
345 | |||
346 | // Define the list data listener for the model of this component
|
||
347 | this.defineModelListDataListener();
|
||
348 | |||
349 | // Define a popup menu listener for the popup of this component
|
||
350 | this.definePopUpMenuListener(this); |
||
351 | } |
||
352 | |||
353 | /**
|
||
354 | * Define a document listener for changes of text
|
||
355 | */
|
||
356 | private void defineDocumentListener() { |
||
357 | // TODO Auto-generated method stub
|
||
358 | documentListener = new DocumentListener() { |
||
359 | |||
360 | public void changedUpdate(DocumentEvent arg0) { |
||
361 | // TODO Auto-generated method stub
|
||
362 | } |
||
363 | |||
364 | public void insertUpdate(DocumentEvent arg0) { |
||
365 | // TODO Auto-generated method stub
|
||
366 | 6732 | ppiqueras | logger.debug("NUM: " + num + " DocumentListener->insertUpdate"); |
367 | 6721 | ppiqueras | try {
|
368 | 6732 | ppiqueras | logger.debug("Texto insertado: ->" + document.getText(0, document.getLength()) + "<-"); |
369 | 6721 | ppiqueras | |
370 | } catch (BadLocationException e) { |
||
371 | // TODO Auto-generated catch block
|
||
372 | e.printStackTrace(); |
||
373 | } |
||
374 | num++; |
||
375 | |||
376 | // Indicate to the model that now is disabled the start view
|
||
377 | // This is used for the first text inserted to the document when the component is loaded and it does setSelectedIndex(0), to avoid use a search view
|
||
378 | if (currentShowState == BEGINNING_VIEW_STATE)
|
||
379 | { |
||
380 | currentShowState = START_VIEW_STATE; |
||
381 | lastWasTheBeginningState = true;
|
||
382 | continueOnStartViewState = true;
|
||
383 | 6732 | ppiqueras | logger.debug("Pasa al estado 1 (de vista inicial)");
|
384 | 6721 | ppiqueras | } |
385 | } |
||
386 | |||
387 | public void removeUpdate(DocumentEvent arg0) { |
||
388 | // TODO Auto-generated method stub
|
||
389 | 6732 | ppiqueras | logger.debug("NUM: " + num + " DocumentListener->removeUpdate"); |
390 | 6721 | ppiqueras | num++; |
391 | } |
||
392 | }; |
||
393 | } |
||
394 | |||
395 | private void updateLastSelectionItem() { |
||
396 | setSelectedItem(selectedItem); |
||
397 | } |
||
398 | |||
399 | /**
|
||
400 | *
|
||
401 | */
|
||
402 | private void configure() { |
||
403 | // TODO Auto-generated method stub
|
||
404 | |||
405 | // Configure the document of the editor of this component
|
||
406 | this.configureDocument();
|
||
407 | |||
408 | // Configure the editor (ComboBoxEditor) of this component
|
||
409 | this.configureEditor(this.getEditor()); |
||
410 | |||
411 | // Configure the model of this component
|
||
412 | this.configureModel();
|
||
413 | |||
414 | // Configure the popup of this component
|
||
415 | this.configurePopUp();
|
||
416 | |||
417 | } |
||
418 | |||
419 | /**
|
||
420 | *
|
||
421 | *
|
||
422 | */
|
||
423 | private void configurePopUp() { |
||
424 | // TODO Auto-generated method stub
|
||
425 | this.addPopupMenuListener(this.popupMenuListener); |
||
426 | } |
||
427 | |||
428 | // /**
|
||
429 | // *
|
||
430 | // */
|
||
431 | // private void uninstallDefaultListeners() {
|
||
432 | //
|
||
433 | //
|
||
434 | // }
|
||
435 | |||
436 | /**
|
||
437 | *
|
||
438 | */
|
||
439 | private void configureModel() { |
||
440 | // TODO Auto-generated method stub
|
||
441 | this.model.addListDataListener(this.modelListDataListener); |
||
442 | } |
||
443 | |||
444 | /**
|
||
445 | *
|
||
446 | */
|
||
447 | private void configureDocument() { |
||
448 | // TODO Auto-generated method stub
|
||
449 | |||
450 | // Creates the document of the editor of this component
|
||
451 | document = new PlainDocumentSeeker();
|
||
452 | document.setJComboBoxItemsSeekerDynamicReference(this);
|
||
453 | |||
454 | // Set the written String
|
||
455 | // writtenString = "";
|
||
456 | |||
457 | // Remove all Previous document Listeners
|
||
458 | // DocumentListener documentListener[] = document.getDocumentListeners();
|
||
459 | // for (int i=0; i < documentListener.length; i++)
|
||
460 | // document.removeDocumentListener(documentListener[i]);
|
||
461 | |||
462 | // Defines and add a Document listener for changes on the document of the editor of this component
|
||
463 | document.addDocumentListener(this.documentListener);
|
||
464 | } |
||
465 | |||
466 | |||
467 | /**
|
||
468 | * Define the list data listener for the model of this component
|
||
469 | */
|
||
470 | public void defineModelListDataListener() { |
||
471 | |||
472 | this.modelListDataListener = new ListDataListener() { |
||
473 | |||
474 | public void contentsChanged(ListDataEvent e) { |
||
475 | // TODO Auto-generated method stub
|
||
476 | 6732 | ppiqueras | // logger.debug("ContentsChanged");
|
477 | 6721 | ppiqueras | |
478 | // This flag indicates to the 'insertString' and 'remove' methods of the PlainDocumentSeeker that the text of the item selected or written by the user
|
||
479 | // hasn't been written on the TextEditor of ths component
|
||
480 | selecting = false;
|
||
481 | } |
||
482 | |||
483 | public void intervalAdded(ListDataEvent e) { |
||
484 | // TODO Auto-generated method stub
|
||
485 | 6732 | ppiqueras | // logger.debug("intervalAdded");
|
486 | 6721 | ppiqueras | } |
487 | |||
488 | public void intervalRemoved(ListDataEvent e) { |
||
489 | // TODO Auto-generated method stub
|
||
490 | 6732 | ppiqueras | // logger.debug("intervalRemoved");
|
491 | 6721 | ppiqueras | } |
492 | |||
493 | }; |
||
494 | |||
495 | } |
||
496 | |||
497 | /**
|
||
498 | * ?Sobra? Contiene c?digo interesante
|
||
499 | */
|
||
500 | private void defineAndAddPropertyChangeListener() { |
||
501 | // Define and add a Listener for changes on the editor or the model of the JComboBox
|
||
502 | super.addPropertyChangeListener(new PropertyChangeListener() { |
||
503 | public void propertyChange(PropertyChangeEvent ev) { |
||
504 | if (ev.getPropertyName().equals("editor")) |
||
505 | configureEditor((ComboBoxEditor) ev.getNewValue());
|
||
506 | if (ev.getPropertyName().equals("model")) |
||
507 | model = (ComboBoxItemsSeekerConfigurableModel) ev.getNewValue(); |
||
508 | } |
||
509 | }); |
||
510 | } |
||
511 | |||
512 | /**
|
||
513 | * ?SOBRA? De momento la estoy usando, pero no s? si sobra o no (S? SE EST? USANDO)
|
||
514 | */
|
||
515 | private void defineEditorFocusListener(JComboBoxItemsSeekerConfigurable combo_Box) { |
||
516 | final JComboBoxItemsSeekerConfigurable comboBox = combo_Box;
|
||
517 | |||
518 | // TODO Auto-generated method stub
|
||
519 | // Highlight whole text when gaining focus
|
||
520 | editorFocusListener = new FocusAdapter() { |
||
521 | public void focusGained(FocusEvent e) { |
||
522 | highlightCompletedText(0);
|
||
523 | } |
||
524 | |||
525 | public void focusLost(FocusEvent e) { |
||
526 | // Workaround for Bug 5100422 - Hide Popup on focus loss
|
||
527 | if (hidePopupOnFocusLoss) comboBox.setPopupVisible(false); |
||
528 | } |
||
529 | }; |
||
530 | } |
||
531 | |||
532 | /**
|
||
533 | *
|
||
534 | */
|
||
535 | private void defineEditorKeyListener(JComboBoxItemsSeekerConfigurable combo_Box) { |
||
536 | final JComboBoxItemsSeekerConfigurable comboBoxReference = combo_Box;
|
||
537 | |||
538 | // keyPressed = true;
|
||
539 | |||
540 | |||
541 | // This flag indicates to the 'insertString' and 'remove' methods of the PlainDocumentSeeker that the text of the item selected or written by the user
|
||
542 | // hasn't been written on the TextEditor of ths component
|
||
543 | |||
544 | // TODO Auto-generated method stub
|
||
545 | editorKeyListener = new KeyAdapter() |
||
546 | { |
||
547 | public void keyPressed(KeyEvent ke) // Executed on the Start view state or Search view state |
||
548 | { |
||
549 | 6754 | ppiqueras | logger.debug("Tecla apretada: ->" + ke.getKeyChar() + "<- ; Su keyCode es: " + ke.getKeyCode()); |
550 | 6721 | ppiqueras | |
551 | if (model.getParentSize() == 0) |
||
552 | { |
||
553 | 6732 | ppiqueras | if (beepEnabled)
|
554 | 6721 | ppiqueras | comboBoxReference.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
|
555 | } |
||
556 | else
|
||
557 | { |
||
558 | // This flag indicates to the 'insertString' and 'remove' methods of the PlainDocumentSeeker that the text of the item selected or written by the user
|
||
559 | // hasn't been written on the TextEditor of ths component
|
||
560 | selecting = false;
|
||
561 | |||
562 | // This resolves the bug when the popup wasn't seen any time and the uses press a key that updates the view of the popup (the bug is that popup has the items but
|
||
563 | // aren't seen
|
||
564 | if (lastWasTheBeginningState)
|
||
565 | { |
||
566 | // This maintains visible the popup
|
||
567 | if (comboBoxReference.isDisplayable())
|
||
568 | comboBoxReference.setPopupVisible(true);
|
||
569 | lastWasTheBeginningState = false;
|
||
570 | } |
||
571 | |||
572 | hitBackspace=false;
|
||
573 | |||
574 | JTextComponent editor = (JTextComponent) comboBoxReference.getEditor().getEditorComponent(); |
||
575 | |||
576 | switch (ke.getKeyCode())
|
||
577 | { |
||
578 | // determine if the pressed key is backspace (needed by the remove method)
|
||
579 | case KeyEvent.VK_BACK_SPACE : |
||
580 | hitBackspace=true;
|
||
581 | hitBackspaceOnSelection=editor.getSelectionStart()!=editor.getSelectionEnd(); |
||
582 | |||
583 | break;
|
||
584 | // ignore delete key
|
||
585 | case KeyEvent.VK_DELETE : // supr key in spanish keyboard |
||
586 | // specialKeys = true;
|
||
587 | // This avoids that popup listener could report about it detected item (Este no va)
|
||
588 | // textKeyPressed = true;
|
||
589 | |||
590 | 6754 | ppiqueras | |
591 | 6721 | ppiqueras | // Remove selected text:
|
592 | 6732 | ppiqueras | logger.debug("GETMARK: " + editor.getCaret().getMark() + "GETCARETPOSITION" + editor.getCaretPosition()); |
593 | 6721 | ppiqueras | |
594 | try {
|
||
595 | // If no characters are selected
|
||
596 | if (editor.getCaret().getMark() == editor.getCaretPosition())
|
||
597 | { |
||
598 | // Remove the character which is on the right of the caret position
|
||
599 | if (editor.getCaretPosition() < document.getLength())
|
||
600 | document.remove(editor.getCaretPosition(), 1);
|
||
601 | } |
||
602 | else // If there are characters selected |
||
603 | { |
||
604 | // Remove the characters which are selected
|
||
605 | // int documentLength = document.getLength();
|
||
606 | int length = Math.abs(editor.getCaret().getMark() - editor.getCaretPosition()); |
||
607 | |||
608 | // Remove the characters which are selected
|
||
609 | document.remove(Math.min(editor.getCaret().getMark(), editor.getCaretPosition()), length);
|
||
610 | } |
||
611 | } catch (BadLocationException e) { |
||
612 | // TODO Auto-generated catch block
|
||
613 | e.printStackTrace(); |
||
614 | } |
||
615 | |||
616 | switch(currentShowState)
|
||
617 | { |
||
618 | case START_VIEW_STATE :
|
||
619 | if (document.getLength() > 0) |
||
620 | { |
||
621 | // If dynamic searches:
|
||
622 | try {
|
||
623 | // If the search will be dynamic:
|
||
624 | if (isDynamicSearchConfiguration())
|
||
625 | { |
||
626 | model.setWrittenText(document.getText(0, document.getLength()));
|
||
627 | 6732 | ppiqueras | logger.debug("Texto que se le env?a al modelo desde SUPR: ->" + document.getText(0, document.getLength()) + "<-"); |
628 | 6721 | ppiqueras | } |
629 | } catch (BadLocationException e) { |
||
630 | // TODO Auto-generated catch block
|
||
631 | e.printStackTrace(); |
||
632 | } |
||
633 | |||
634 | // Indicate to the model that now is disabled the start view
|
||
635 | if (currentShowState == START_VIEW_STATE)
|
||
636 | { |
||
637 | model.setStartViewFlag(false);
|
||
638 | currentShowState = SEARCH_VIEW_STATE; |
||
639 | // updateLastSelectionItem();
|
||
640 | } |
||
641 | } |
||
642 | break;
|
||
643 | case SEARCH_VIEW_STATE :
|
||
644 | // If there isn't characters
|
||
645 | if (document.getLength() == 0) |
||
646 | { |
||
647 | // This instruction avoids popup could failure when got invisible
|
||
648 | hidePopup(); |
||
649 | |||
650 | // If it's a dynamic search
|
||
651 | if (isDynamicSearchConfiguration())
|
||
652 | { |
||
653 | model.setWrittenText("");
|
||
654 | 6732 | ppiqueras | logger.debug("Texto que se le env?a al modelo desde SUPR: ->\"\"<-");
|
655 | 6721 | ppiqueras | } |
656 | |||
657 | // Return to the start view state
|
||
658 | model.setStartViewFlag(true);
|
||
659 | currentShowState = START_VIEW_STATE; |
||
660 | |||
661 | // Select the first Item
|
||
662 | setSelectedIndex(0);
|
||
663 | |||
664 | highlightCompletedText(0);
|
||
665 | } |
||
666 | else
|
||
667 | { |
||
668 | // If dynamic searches:
|
||
669 | try {
|
||
670 | // If the search will be dynamic:
|
||
671 | if (isDynamicSearchConfiguration())
|
||
672 | { |
||
673 | model.setWrittenText(document.getText(0, document.getLength()));
|
||
674 | 6732 | ppiqueras | logger.debug("Texto que se le env?a al modelo desde SUPR: ->" + document.getText(0, document.getLength()) + "<-"); |
675 | 6721 | ppiqueras | } |
676 | } catch (BadLocationException e) { |
||
677 | // TODO Auto-generated catch block
|
||
678 | e.printStackTrace(); |
||
679 | } |
||
680 | } |
||
681 | break;
|
||
682 | } |
||
683 | |||
684 | 6754 | ppiqueras | // If we remove characters by default if we use two color -> set color red ; and if the item would match in the lookUp algorithm of the PlainDocumentSeeker
|
685 | // text will be on black color
|
||
686 | if (!isOnlyOneColor())
|
||
687 | { |
||
688 | if (isKeySensitive())
|
||
689 | { |
||
690 | try {
|
||
691 | if (document.getText(0, document.getLength()).compareTo(getSelectedItem().toString()) == 0) |
||
692 | comboBoxReference.getEditor().getEditorComponent().setForeground(Color.BLACK);
|
||
693 | else
|
||
694 | comboBoxReference.getEditor().getEditorComponent().setForeground(Color.RED);
|
||
695 | } catch (BadLocationException e2) { |
||
696 | // TODO Auto-generated catch block
|
||
697 | e2.printStackTrace(); |
||
698 | } |
||
699 | } |
||
700 | else
|
||
701 | { |
||
702 | try {
|
||
703 | if (document.getText(0, document.getLength()).compareToIgnoreCase(getSelectedItem().toString()) == 0) |
||
704 | comboBoxReference.getEditor().getEditorComponent().setForeground(Color.BLACK);
|
||
705 | else
|
||
706 | comboBoxReference.getEditor().getEditorComponent().setForeground(Color.RED);
|
||
707 | } catch (BadLocationException e2) { |
||
708 | // TODO Auto-generated catch block
|
||
709 | e2.printStackTrace(); |
||
710 | } |
||
711 | } |
||
712 | } |
||
713 | |||
714 | 6721 | ppiqueras | updatePopUpView(); |
715 | |||
716 | break;
|
||
717 | case KeyEvent.VK_ENTER : |
||
718 | // try {
|
||
719 | // specialKeys = true;
|
||
720 | 6732 | ppiqueras | logger.debug("ENTRA EN EL C?DIGO DE ENTER");
|
721 | 6721 | ppiqueras | |
722 | // Reports about the written text to the model
|
||
723 | try {
|
||
724 | // Reports about the written text to the model
|
||
725 | if (model.isDynamicSearch())
|
||
726 | model.setWrittenText(document.getText(0, document.getLength()));
|
||
727 | } catch (BadLocationException e1) { |
||
728 | // TODO Auto-generated catch block
|
||
729 | e1.printStackTrace(); |
||
730 | } |
||
731 | |||
732 | // Indicate to the model that now is disabled the start view
|
||
733 | if (currentShowState == START_VIEW_STATE)
|
||
734 | { |
||
735 | model.setStartViewFlag(false);
|
||
736 | currentShowState = SEARCH_VIEW_STATE; |
||
737 | // updateLastSelectionItem();
|
||
738 | } |
||
739 | |||
740 | |||
741 | // String text = document.getText(0, document.getLength());
|
||
742 | // document.remove(0, document.getLength());
|
||
743 | // document.insertString(0, text, null);
|
||
744 | //
|
||
745 | //
|
||
746 | //
|
||
747 | //// // If the text doesn't completely match with the selectedItem.toString() -> if allow 2 colors -> set foreground color to red
|
||
748 | //// if (!onlyOneColor)
|
||
749 | //// {
|
||
750 | //// if (model.isKeySensitive())
|
||
751 | //// {
|
||
752 | //// if (text.compareTo(getSelectedItem().toString()) != 0)
|
||
753 | //// editor.setForeground(Color.RED);
|
||
754 | //// }
|
||
755 | //// else
|
||
756 | //// {
|
||
757 | //// if (text.toUpperCase().compareTo(getSelectedItem().toString().toUpperCase()) != 0)
|
||
758 | //// editor.setForeground(Color.RED);
|
||
759 | //// }
|
||
760 | //// }
|
||
761 | // } catch (BadLocationException e1) {
|
||
762 | // // TODO Auto-generated catch block
|
||
763 | // e1.printStackTrace();
|
||
764 | // }
|
||
765 | hidePopup(); |
||
766 | break;
|
||
767 | case KeyEvent.VK_DOWN : |
||
768 | // If the key (typed, pressed and) released has been the Down Key -> when there isn't any text (item of the list) selected, select the first
|
||
769 | // ke.consume();
|
||
770 | // selecting = true; // For indicate to the 'insertString' of the 'PlainDocumentSeeker' class that an item has been selected
|
||
771 | // upOrDownKeyPressed = true;
|
||
772 | // continueOnStartViewState = true;
|
||
773 | |||
774 | // This allows user press the key DOWN for select another item of the start view list
|
||
775 | // if ((model.isStartViewFlag()) && (lastWasStartShow))
|
||
776 | // lastWasStartShow = true;
|
||
777 | |||
778 | // // Reports about the written text to the model
|
||
779 | // try {
|
||
780 | // if (model.isDynamicSearch())
|
||
781 | // model.setWrittenText(document.getText(0, document.getLength()));
|
||
782 | // } catch (BadLocationException e2) {
|
||
783 | // // TODO Auto-generated catch block
|
||
784 | // e2.printStackTrace();
|
||
785 | // }
|
||
786 | |||
787 | // If items are disordered -> get the index of the selected item
|
||
788 | if (model.nowItemsAreDisordered())
|
||
789 | updateLastSelectionItem(); |
||
790 | |||
791 | if (getItemCount() > 0) |
||
792 | { |
||
793 | if (getSelectedIndex() == (getItemCount()-1)) |
||
794 | ((JComboBox)comboBoxReference).setSelectedIndex(0); |
||
795 | else
|
||
796 | ((JComboBox)comboBoxReference).setSelectedIndex(getSelectedIndex()+1); |
||
797 | } |
||
798 | |||
799 | // model.setCurrentString(getSelectedItem().toString());
|
||
800 | |||
801 | // lastSelectedIndex = getSelectedIndex();
|
||
802 | selectedItem = getSelectedItem(); |
||
803 | showPopup(); |
||
804 | break;
|
||
805 | case KeyEvent.VK_UP : |
||
806 | // If the key (typed, pressed and) released has been the Up Key -> when there isn't any text (item of the list) selected, select the last
|
||
807 | // ke.consume();
|
||
808 | // selecting = true; // For indicate to the 'insertString' of the 'PlainDocumentSeeker' class that an item has been selected
|
||
809 | // upOrDownKeyPressed = true;
|
||
810 | // continueOnStartViewState = true;
|
||
811 | |||
812 | // This allows user press the key UP for select another item of the start view list
|
||
813 | // if ((model.isStartViewFlag()) && (lastWasStartShow))
|
||
814 | // lastWasStartShow = true;
|
||
815 | |||
816 | // // Reports about the written text to the model
|
||
817 | // try {
|
||
818 | // if (model.isDynamicSearch())
|
||
819 | // model.setWrittenText(document.getText(0, document.getLength()));
|
||
820 | // } catch (BadLocationException e2) {
|
||
821 | // // TODO Auto-generated catch block
|
||
822 | // e2.printStackTrace();
|
||
823 | // }
|
||
824 | |||
825 | // If items are disordered -> get the index of the selected item
|
||
826 | if (model.nowItemsAreDisordered())
|
||
827 | updateLastSelectionItem(); |
||
828 | |||
829 | switch(getSelectedIndex())
|
||
830 | { |
||
831 | case -1: case 0: |
||
832 | ((JComboBox)comboBoxReference).setSelectedIndex(getItemCount()-1); |
||
833 | break;
|
||
834 | default:
|
||
835 | ((JComboBox)comboBoxReference).setSelectedIndex(getSelectedIndex()-1); |
||
836 | } |
||
837 | |||
838 | // model.setCurrentString(getSelectedItem().toString());
|
||
839 | selectedItem = getSelectedItem(); |
||
840 | // lastSelectedIndex = getSelectedIndex();
|
||
841 | showPopup(); |
||
842 | break;
|
||
843 | case KeyEvent.VK_LEFT : |
||
844 | // Move the caret to left
|
||
845 | if (editor.getCaretPosition() > 0) |
||
846 | editor.setCaretPosition(editor.getCaretPosition() - 1);
|
||
847 | else
|
||
848 | { |
||
849 | // User hit backspace with the cursor positioned on the start => beep
|
||
850 | 6732 | ppiqueras | if (beepEnabled)
|
851 | 6721 | ppiqueras | getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
|
852 | } |
||
853 | //ke.consume();
|
||
854 | break;
|
||
855 | case KeyEvent.VK_RIGHT : |
||
856 | // Move the caret to right
|
||
857 | try {
|
||
858 | if (editor.getCaretPosition() < (document.getText(0, document.getLength())).length()) |
||
859 | editor.setCaretPosition(editor.getCaretPosition() + 1);
|
||
860 | else
|
||
861 | { |
||
862 | // User hit backspace with the cursor positioned on the start => beep
|
||
863 | 6732 | ppiqueras | if (beepEnabled)
|
864 | 6721 | ppiqueras | getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
|
865 | } |
||
866 | } catch (BadLocationException e) { |
||
867 | // TODO Auto-generated catch block
|
||
868 | e.printStackTrace(); |
||
869 | } |
||
870 | //ke.consume();
|
||
871 | break;
|
||
872 | case KeyEvent.VK_PAGE_DOWN : |
||
873 | if (getSelectedIndex() != -1) |
||
874 | { |
||
875 | // // Reports about the written text to the model
|
||
876 | // try {
|
||
877 | // if (model.isDynamicSearch())
|
||
878 | // model.setWrittenText(document.getText(0, document.getLength()));
|
||
879 | // } catch (BadLocationException e2) {
|
||
880 | // // TODO Auto-generated catch block
|
||
881 | // e2.printStackTrace();
|
||
882 | // }
|
||
883 | |||
884 | int index = getSelectedIndex() + POPUP_LIST_ITEMS_HEIGHT;
|
||
885 | |||
886 | if (index < getItemCount())
|
||
887 | setSelectedIndex(index); |
||
888 | else
|
||
889 | setSelectedIndex(getItemCount()-1);
|
||
890 | |||
891 | selectedItem = getSelectedItem(); |
||
892 | } |
||
893 | |||
894 | // ke.consume();
|
||
895 | break;
|
||
896 | case KeyEvent.VK_PAGE_UP : |
||
897 | if (getSelectedIndex() != -1) |
||
898 | { |
||
899 | // // Reports about the written text to the model
|
||
900 | // try {
|
||
901 | // if (model.isDynamicSearch())
|
||
902 | // model.setWrittenText(document.getText(0, document.getLength()));
|
||
903 | // } catch (BadLocationException e2) {
|
||
904 | // // TODO Auto-generated catch block
|
||
905 | // e2.printStackTrace();
|
||
906 | // }
|
||
907 | |||
908 | int index = getSelectedIndex() - POPUP_LIST_ITEMS_HEIGHT;
|
||
909 | |||
910 | if (index > -1) |
||
911 | setSelectedIndex(index); |
||
912 | else
|
||
913 | setSelectedIndex(0);
|
||
914 | |||
915 | selectedItem = getSelectedItem(); |
||
916 | } |
||
917 | |||
918 | // ke.consume();
|
||
919 | break;
|
||
920 | case KeyEvent.VK_HOME : // 'Inicio' key on the spanish keyboard |
||
921 | editor.setCaretPosition(0);
|
||
922 | break;
|
||
923 | case KeyEvent.VK_END : // 'Fin' key on the spanish keyboard |
||
924 | editor.setCaretPosition(document.getLength()); |
||
925 | break;
|
||
926 | case KeyEvent.VK_TAB : |
||
927 | // specialKeys = true;
|
||
928 | |||
929 | // This avoids that popup listener could report about it detected item
|
||
930 | textKeyPressed = true;
|
||
931 | |||
932 | if (model.getSize() > 0) |
||
933 | { |
||
934 | 6732 | ppiqueras | // logger.debug("SelectedIndex: " + getSelectedIndex());
|
935 | 6721 | ppiqueras | // boolean update = false;
|
936 | |||
937 | if (((JComboBox)comboBoxReference).getSelectedIndex() == -1) |
||
938 | { |
||
939 | // lastSelectedIndex = 0;
|
||
940 | // ((JComboBox)comboBoxReference).setSelectedIndex(0);
|
||
941 | //updatePopUp = true; // Indicate to the document.insertString that has update the popup after insert
|
||
942 | // updatePopUpView();
|
||
943 | // comboBoxReference.setSelectedIndex(0);
|
||
944 | selectedItem = comboBoxReference.getItemAt(0); //.getSelectedItem(); |
||
945 | } |
||
946 | else
|
||
947 | { |
||
948 | // lastSelectedIndex = getSelectedIndex();
|
||
949 | // updatePopUp = true; // Indicate to the document.insertString that has update the popup after insert
|
||
950 | // updatePopUpView();
|
||
951 | selectedItem = comboBoxReference.getSelectedItem(); |
||
952 | |||
953 | // setSelectedIndex()); // Complete the item string value in the document of the editor
|
||
954 | // update = true;
|
||
955 | } |
||
956 | |||
957 | document.setText(selectedItem.toString()); |
||
958 | |||
959 | // Reports about the written text to the model
|
||
960 | // try {
|
||
961 | if (model.isDynamicSearch()) {
|
||
962 | model.setWrittenText(selectedItem.toString()); |
||
963 | 6732 | ppiqueras | logger.debug("Texto que se le env?a al modelo: ->" + selectedItem.toString() + "<-"); |
964 | 6721 | ppiqueras | } |
965 | |||
966 | // } catch (BadLocationException e2) {
|
||
967 | // // TODO Auto-generated catch block
|
||
968 | // e2.printStackTrace();
|
||
969 | // }
|
||
970 | //
|
||
971 | if (currentShowState == START_VIEW_STATE)
|
||
972 | { |
||
973 | model.setStartViewFlag(false);
|
||
974 | currentShowState = SEARCH_VIEW_STATE; |
||
975 | // updatePopUpView(); // Update to the new popup view
|
||
976 | } |
||
977 | |||
978 | |||
979 | // It's supposed that the text on the document is equal as the string value of the selected item -> then text must be on black color
|
||
980 | comboBoxReference.getEditor().getEditorComponent().setForeground(Color.BLACK);
|
||
981 | |||
982 | updatePopUpView(); |
||
983 | |||
984 | |||
985 | // document.setText(selectedItem.toString());
|
||
986 | |||
987 | // continueOnStartViewState = false;
|
||
988 | |||
989 | // HidePopUp + ShowPopUp to force update the popup list of items
|
||
990 | // hidePopup();
|
||
991 | // showPopup();
|
||
992 | //// hidePopup();
|
||
993 | } |
||
994 | break;
|
||
995 | case KeyEvent.VK_ESCAPE : |
||
996 | // Reset to the Start View State
|
||
997 | // model.setStartViewFlag(true);
|
||
998 | |||
999 | // Force update the popup
|
||
1000 | if (isPopupVisible())
|
||
1001 | hidePopup(); |
||
1002 | |||
1003 | model.setWrittenText("");
|
||
1004 | selectedItem = null;
|
||
1005 | |||
1006 | // currentShowState = START_VIEW_STATE;
|
||
1007 | if (currentShowState == SEARCH_VIEW_STATE)
|
||
1008 | { |
||
1009 | try {
|
||
1010 | document.remove(0, document.getLength());
|
||
1011 | } catch (BadLocationException e) { |
||
1012 | // TODO Auto-generated catch block
|
||
1013 | e.printStackTrace(); |
||
1014 | } |
||
1015 | |||
1016 | // setSelectedItem(selectedItem);
|
||
1017 | // setSelectedIndex(model.getIndexOf(selectedItem));
|
||
1018 | |||
1019 | // Return to the start view state
|
||
1020 | model.setStartViewFlag(true);
|
||
1021 | currentShowState = START_VIEW_STATE; |
||
1022 | // escapeKeyPressed = true;
|
||
1023 | // continueOnStartViewState = true;
|
||
1024 | |||
1025 | // If items are disordered -> get the index of the selected item
|
||
1026 | // if (model.nowItemsAreDisordered())
|
||
1027 | // updateLastSelectionItem();
|
||
1028 | |||
1029 | // Select the first Item
|
||
1030 | setSelectedIndex(0);
|
||
1031 | // selectFirstItemAddedToModel();
|
||
1032 | |||
1033 | // updatePopUp = true;
|
||
1034 | // updatePopUpView();
|
||
1035 | |||
1036 | //updateLastSelectionItem();
|
||
1037 | // setSelectedIndex(lastSelectedIndex);
|
||
1038 | highlightCompletedText(0);
|
||
1039 | // HidePopUp + ShowPopUp to force update the popup list of items
|
||
1040 | // hidePopup();
|
||
1041 | // showPopup();
|
||
1042 | } |
||
1043 | else
|
||
1044 | { |
||
1045 | // Select the first Item
|
||
1046 | setSelectedIndex(0);
|
||
1047 | // selectFirstItemAddedToModel();
|
||
1048 | |||
1049 | highlightCompletedText(0);
|
||
1050 | } |
||
1051 | updatePopUpView(); |
||
1052 | break;
|
||
1053 | case KeyEvent.VK_SHIFT : // Do nothing |
||
1054 | break;
|
||
1055 | case KeyEvent.VK_ALT_GRAPH : // Do nothing |
||
1056 | break;
|
||
1057 | case KeyEvent.VK_ALT : // Do nothing |
||
1058 | break;
|
||
1059 | case KeyEvent.VK_CONTROL : // Do nothing |
||
1060 | break;
|
||
1061 | case KeyEvent.VK_NUM_LOCK : // Do nothing |
||
1062 | break;
|
||
1063 | case KeyEvent.VK_CAPS_LOCK : // Do nothing |
||
1064 | break;
|
||
1065 | default:
|
||
1066 | 6732 | ppiqueras | logger.debug("Actualiza view flag a false");
|
1067 | 6721 | ppiqueras | |
1068 | 6732 | ppiqueras | logger.debug("LASTITEM1 :" + lastSelectedItem);
|
1069 | 6721 | ppiqueras | |
1070 | 6732 | ppiqueras | logger.debug("GETMARK: " + editor.getCaret().getMark() + "GETCARETPOSITION" + editor.getCaretPosition()); |
1071 | 6754 | ppiqueras | |
1072 | if (!isOnlyOneColor())
|
||
1073 | comboBoxReference.getEditor().getEditorComponent().setForeground(Color.RED);
|
||
1074 | 6721 | ppiqueras | |
1075 | if (model.isDynamicSearch())
|
||
1076 | { |
||
1077 | // Force update the popup
|
||
1078 | // hidePopup();
|
||
1079 | |||
1080 | String text;
|
||
1081 | if (editor.getCaretPosition() == editor.getCaret().getMark())
|
||
1082 | text = editor.getText().substring(0, editor.getCaretPosition()) + ke.getKeyChar() + editor.getText().substring(editor.getCaretPosition(), editor.getText().length());
|
||
1083 | else
|
||
1084 | { |
||
1085 | text = "" + editor.getText().substring(0, (int) Math.min(editor.getCaretPosition(), editor.getCaret().getMark())) + ke.getKeyChar(); |
||
1086 | text += editor.getText().substring((int) Math.max(editor.getCaretPosition(), editor.getCaret().getMark()), editor.getText().length()); |
||
1087 | } |
||
1088 | |||
1089 | // Reports about the written text to the model
|
||
1090 | 6732 | ppiqueras | logger.debug("Texto que se le env?a KEY al modelo: ->" + text + "<-"); |
1091 | 6721 | ppiqueras | model.setWrittenText(text); |
1092 | |||
1093 | |||
1094 | // Indicate to the model that now is disabled the start view
|
||
1095 | if (currentShowState == START_VIEW_STATE)
|
||
1096 | { |
||
1097 | model.setStartViewFlag(false);
|
||
1098 | currentShowState = SEARCH_VIEW_STATE; |
||
1099 | // updateLastSelectionItem();
|
||
1100 | } |
||
1101 | |||
1102 | |||
1103 | // textKeyPressed = false;
|
||
1104 | } |
||
1105 | |||
1106 | updatePopUpView(); |
||
1107 | textKeyPressed = true;
|
||
1108 | |||
1109 | |||
1110 | 6732 | ppiqueras | logger.debug("Key Pressed:" + ke.getKeyCode());
|
1111 | 6721 | ppiqueras | } |
1112 | |||
1113 | // Consume the key event for not to use the handler of the keyboard of other components
|
||
1114 | ke.consume(); |
||
1115 | } |
||
1116 | } |
||
1117 | }; |
||
1118 | |||
1119 | // keyPressed = false;
|
||
1120 | } |
||
1121 | |||
1122 | /**
|
||
1123 | *
|
||
1124 | */
|
||
1125 | private void definePopUpMenuListener(JComboBoxItemsSeekerConfigurable combo_Box) { |
||
1126 | final JComboBoxItemsSeekerConfigurable comboBoxReference = combo_Box;
|
||
1127 | |||
1128 | this.popupMenuListener = new PopupMenuListener() { |
||
1129 | |||
1130 | /*
|
||
1131 | * (non-Javadoc)
|
||
1132 | * @see javax.swing.event.PopupMenuListener#popupMenuCanceled(javax.swing.event.PopupMenuEvent)
|
||
1133 | */
|
||
1134 | public void popupMenuCanceled(PopupMenuEvent e) { |
||
1135 | // TODO Auto-generated method stub
|
||
1136 | 6732 | ppiqueras | logger.debug("MenuCANCELED");
|
1137 | 6721 | ppiqueras | } |
1138 | |||
1139 | /*
|
||
1140 | * (non-Javadoc)
|
||
1141 | * @see javax.swing.event.PopupMenuListener#popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent)
|
||
1142 | */
|
||
1143 | public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { |
||
1144 | // TODO Auto-generated method stub
|
||
1145 | 6732 | ppiqueras | logger.debug("MenuBECOMEINVISIBLE");
|
1146 | 6721 | ppiqueras | |
1147 | if (!textKeyPressed)
|
||
1148 | { |
||
1149 | if (lastSelectedItem != null) |
||
1150 | { |
||
1151 | // If the user has select a different item with the mouse, and this is in the Start View State -> change to the Search View State
|
||
1152 | if (!getSelectedItem().equals(lastSelectedItem))
|
||
1153 | { |
||
1154 | 6732 | ppiqueras | logger.debug("POPUP: NO SON IGUALES");
|
1155 | 6721 | ppiqueras | |
1156 | // Reports about the written text to the model
|
||
1157 | if (model.isDynamicSearch())
|
||
1158 | { |
||
1159 | model.setWrittenText(getSelectedItem().toString()); |
||
1160 | 6732 | ppiqueras | logger.debug("Texto que le envia POPUP al modelo: ->" + getSelectedItem().toString() + "<-"); |
1161 | 6721 | ppiqueras | } |
1162 | |||
1163 | if (currentShowState == START_VIEW_STATE)
|
||
1164 | { |
||
1165 | model.setStartViewFlag(false);
|
||
1166 | currentShowState = SEARCH_VIEW_STATE; |
||
1167 | // updateLastSelectionItem();
|
||
1168 | } |
||
1169 | 6732 | ppiqueras | logger.debug("Selected index of item: " + lastSelectedItem.toString() + " is " + getSelectedIndex()); |
1170 | 6721 | ppiqueras | // updatePopUpView();
|
1171 | // setSelectedIndex(1);
|
||
1172 | } |
||
1173 | else
|
||
1174 | 6732 | ppiqueras | logger.debug("POPUP: SON IGUALES");
|
1175 | 6721 | ppiqueras | } |
1176 | } |
||
1177 | } |
||
1178 | |||
1179 | /*
|
||
1180 | * (non-Javadoc)
|
||
1181 | * @see javax.swing.event.PopupMenuListener#popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent)
|
||
1182 | */
|
||
1183 | public void popupMenuWillBecomeVisible(PopupMenuEvent e) { |
||
1184 | // TODO Auto-generated method stub
|
||
1185 | 6732 | ppiqueras | logger.debug("MenuBECOMEVISIBLE");
|
1186 | 6721 | ppiqueras | lastSelectedItem = selectedItem; // This object is used for know if the user has select a different item with the mouse
|
1187 | } |
||
1188 | }; |
||
1189 | } |
||
1190 | |||
1191 | |||
1192 | /**
|
||
1193 | * Returns true if the model has a dynamic search configuration
|
||
1194 | *
|
||
1195 | * @return
|
||
1196 | */
|
||
1197 | private boolean isDynamicSearchConfiguration() { |
||
1198 | switch(model.getSearchBehavior())
|
||
1199 | { |
||
1200 | case ComboBoxItemsSeekerConfigurableModel.MAINTAIN_ORIGINAL_POSITION_DYNAMIC_SEARCH :
|
||
1201 | case ComboBoxItemsSeekerConfigurableModel.ORDERED_DYNAMIC_SEARCH :
|
||
1202 | case ComboBoxItemsSeekerConfigurableModel.DISORDERED_DYNAMIC_SEARCH :
|
||
1203 | return true; |
||
1204 | } |
||
1205 | |||
1206 | return false; |
||
1207 | } |
||
1208 | |||
1209 | |||
1210 | // comboBoxReference.getUI().
|
||
1211 | // for (int i=0; i<comboBoxReference.getComponentCount(); i++) {
|
||
1212 | 6732 | ppiqueras | // logger.debug("Componente: " + comboBoxReference.getComponent(i).getName());
|
1213 | 6721 | ppiqueras | // comboBoxReference.getComponent(i).addMouseListener(editorMouseListener);
|
1214 | //
|
||
1215 | // }
|
||
1216 | // this.addMouseListener(editorMouseListener);
|
||
1217 | // }
|
||
1218 | |||
1219 | /**
|
||
1220 | * Selects the first item added to the model
|
||
1221 | */
|
||
1222 | public void selectFirstItemAddedToModel() { |
||
1223 | // Select the first Item added
|
||
1224 | Object item = model.getFirstItemAdded();
|
||
1225 | if (item != null) |
||
1226 | setSelectedItem(item); |
||
1227 | } |
||
1228 | |||
1229 | private void configureEditor(ComboBoxEditor newEditor) { |
||
1230 | JTextComponent editor = (JTextComponent) this.getEditor().getEditorComponent(); |
||
1231 | |||
1232 | // If there isn't any change on the editor
|
||
1233 | if (editor == newEditor)
|
||
1234 | return;
|
||
1235 | |||
1236 | // Remove the default or last keyListener and FocusListener of the editor of this component
|
||
1237 | if (editor != null) { |
||
1238 | editor.removeKeyListener(this.editorKeyListener);
|
||
1239 | // editor.removeMouseListener(this.editorMouseListener);
|
||
1240 | editor.removeFocusListener(this.editorFocusListener);
|
||
1241 | } |
||
1242 | |||
1243 | // Add the new keyListener and FocusListener for this editor and sets
|
||
1244 | // it document as a PlainDocument to optimize the searches of items
|
||
1245 | // when user writes on this editor
|
||
1246 | if (newEditor != null) { |
||
1247 | editor = (JTextComponent) newEditor.getEditorComponent();
|
||
1248 | editor.addKeyListener(this.editorKeyListener);
|
||
1249 | // editor.addMouseListener(this.editorMouseListener);
|
||
1250 | editor.addFocusListener(this.editorFocusListener);
|
||
1251 | editor.setDocument(this.document);
|
||
1252 | |||
1253 | // Disable the focus transversal keys (Example: CTRL+TAB) for enable the TAB key
|
||
1254 | editor.setFocusTraversalKeysEnabled(false);
|
||
1255 | } |
||
1256 | } |
||
1257 | |||
1258 | /**
|
||
1259 | * Marks text since 'start' position to its end on a grey color
|
||
1260 | *
|
||
1261 | * @param start Start position for mark the text
|
||
1262 | */
|
||
1263 | private void highlightCompletedText(int start) { |
||
1264 | JTextComponent editor = (JTextComponent) this.getEditor().getEditorComponent(); |
||
1265 | |||
1266 | editor.setCaretPosition(document.getLength()); |
||
1267 | editor.moveCaretPosition(start); |
||
1268 | } |
||
1269 | |||
1270 | /**
|
||
1271 | *
|
||
1272 | */
|
||
1273 | private void updatePopUpView() { |
||
1274 | // HidePopUp + ShowPopUp to force update the popup list of items
|
||
1275 | hidePopup(); |
||
1276 | showPopup(); |
||
1277 | this.setVisible(true); |
||
1278 | } |
||
1279 | |||
1280 | ////// REDEFINITION OF SOME METHODS OF JCOMBOBOX //////
|
||
1281 | |||
1282 | |||
1283 | /*
|
||
1284 | * (non-Javadoc)
|
||
1285 | * @see javax.swing.JComboBox#actionPerformed(java.awt.event.ActionEvent)
|
||
1286 | */
|
||
1287 | public void actionPerformed(ActionEvent e) |
||
1288 | { |
||
1289 | super.actionPerformed(e);
|
||
1290 | 6732 | ppiqueras | // logger.debug("Action-Performed");
|
1291 | 6721 | ppiqueras | |
1292 | // This flag indicates to the 'insertString' method of the PlainDocumentSeeker that the text of the item selected or written by the user
|
||
1293 | // hasn't been written on the TextEditor of ths component
|
||
1294 | selecting = false;
|
||
1295 | } |
||
1296 | |||
1297 | |||
1298 | /*
|
||
1299 | * (non-Javadoc)
|
||
1300 | * @see javax.swing.JComboBox#addItem(java.lang.Object)
|
||
1301 | */
|
||
1302 | public void addItem(Object anObject) { |
||
1303 | // Adds the item to this component
|
||
1304 | model.addElement(anObject); |
||
1305 | |||
1306 | 6732 | ppiqueras | // logger.debug("LastSelectedIndexWas: " + this.lastSelectedIndex);
|
1307 | 6721 | ppiqueras | |
1308 | // Set the last selected item -> by default select the first item:
|
||
1309 | // This is used to show the first item that model returns when we add a new item. This also
|
||
1310 | // corrects the 'mistake' produced by 'ComboBoxModel' when is added a new item and there wasn't
|
||
1311 | // any selected -> that the 'ComboBoxModel' selects by default the first added (that in our case
|
||
1312 | // might not be the same as the first item seen in the popup list)
|
||
1313 | if (this.getSelectedIndex() != 0) |
||
1314 | { |
||
1315 | this.setSelectedIndex(0); |
||
1316 | this.selectedItem = this.getSelectedItem(); |
||
1317 | } |
||
1318 | } |
||
1319 | |||
1320 | /*
|
||
1321 | * (non-Javadoc)
|
||
1322 | * @see javax.swing.JComboBox#removeAllItems()
|
||
1323 | */
|
||
1324 | public void removeAllItems() { |
||
1325 | // Removes all items from the model
|
||
1326 | model.removeAllElements(); |
||
1327 | |||
1328 | currentShowState = BEGINNING_VIEW_STATE; |
||
1329 | } |
||
1330 | |||
1331 | /*
|
||
1332 | * (non-Javadoc)
|
||
1333 | * @see javax.swing.JComboBox#removeItem(java.lang.Object)
|
||
1334 | */
|
||
1335 | public void removeItem(Object anObject) { |
||
1336 | // Removes an object from the model
|
||
1337 | model.removeElement(anObject); |
||
1338 | |||
1339 | if (model.getSize() == 0) |
||
1340 | currentShowState = BEGINNING_VIEW_STATE; |
||
1341 | } |
||
1342 | |||
1343 | /*
|
||
1344 | * (non-Javadoc)
|
||
1345 | * @see javax.swing.JComboBox#removeItemAt(int)
|
||
1346 | */
|
||
1347 | public void removeItemAt(int anIndex) { |
||
1348 | // Removes an object, which is in a determinated position (index), from the model
|
||
1349 | model.removeElementAt(anIndex); |
||
1350 | |||
1351 | if (model.getSize() == 0) |
||
1352 | currentShowState = BEGINNING_VIEW_STATE; |
||
1353 | } |
||
1354 | |||
1355 | // /*
|
||
1356 | // * (non-Javadoc)
|
||
1357 | // * @see javax.swing.JComboBox#getSelectedIndex()
|
||
1358 | // */
|
||
1359 | // public int getSelectedIndex() {
|
||
1360 | // // ??Modificarlo??
|
||
1361 | // return super.getSelectedIndex();
|
||
1362 | // }
|
||
1363 | |||
1364 | /*
|
||
1365 | * (non-Javadoc)
|
||
1366 | * @see javax.swing.JComboBox#getItemCount()
|
||
1367 | */
|
||
1368 | public int getItemCount() { |
||
1369 | return model.getSize();
|
||
1370 | } |
||
1371 | |||
1372 | /*
|
||
1373 | * (non-Javadoc)
|
||
1374 | * @see javax.swing.JComboBox#getItemAt(int)
|
||
1375 | */
|
||
1376 | public Object getItemAt(int index) { |
||
1377 | return model.getElementAt(index);
|
||
1378 | } |
||
1379 | |||
1380 | /*
|
||
1381 | * (non-Javadoc)
|
||
1382 | * @see javax.swing.JComboBox#setModel(javax.swing.ComboBoxModel)
|
||
1383 | */
|
||
1384 | public void setModel(ComboBoxModel aModel) { //PROBLEMA |
||
1385 | |||
1386 | // Depending on the type of class of the current object, this object will execute different code
|
||
1387 | if (aModel instanceof ComboBoxItemsSeekerConfigurableModel) |
||
1388 | { |
||
1389 | 6732 | ppiqueras | // logger.debug("A");
|
1390 | 6721 | ppiqueras | //super.setModel(aModel);
|
1391 | super.setModel(aModel);
|
||
1392 | model = (ComboBoxItemsSeekerConfigurableModel)super.getModel();
|
||
1393 | |||
1394 | // If we insert a model with items -> select by default the first
|
||
1395 | if (aModel.getSize() > 0) |
||
1396 | { |
||
1397 | this.setSelectedIndex(0); |
||
1398 | this.selectedItem = this.getSelectedItem(); |
||
1399 | // model.setCurrentString(this.getSelectedItem().toString());
|
||
1400 | } |
||
1401 | else
|
||
1402 | { |
||
1403 | // Else -> set the default index (-1) and current showed string ("")
|
||
1404 | this.selectedItem = null; |
||
1405 | this.setSelectedIndex(-1); |
||
1406 | // model.setCurrentString("");
|
||
1407 | } |
||
1408 | |||
1409 | this.configureModel();
|
||
1410 | } |
||
1411 | else
|
||
1412 | { |
||
1413 | // If it's an instance of DefaultComboBoxModel:
|
||
1414 | |||
1415 | 6732 | ppiqueras | // logger.debug("B");
|
1416 | 6721 | ppiqueras | super.setModel(aModel);
|
1417 | } |
||
1418 | } |
||
1419 | |||
1420 | /*
|
||
1421 | * (non-Javadoc)
|
||
1422 | * @see javax.swing.JComboBox#setSelectedIndex(int)
|
||
1423 | */
|
||
1424 | public void setSelectedIndex(int anIndex) { |
||
1425 | super.setSelectedIndex(anIndex);
|
||
1426 | this.selectedItem = super.getSelectedItem(); |
||
1427 | |||
1428 | // this.lastSelectedIndex = anIndex;
|
||
1429 | |||
1430 | try {
|
||
1431 | document.remove(0, document.getLength());
|
||
1432 | if (getSelectedIndex() > -1) |
||
1433 | document.insertString(0, getSelectedItem().toString(), null); |
||
1434 | // else
|
||
1435 | // this.lastSelectedIndex = -1;
|
||
1436 | |||
1437 | } catch (BadLocationException e) { |
||
1438 | // TODO Auto-generated catch block
|
||
1439 | e.printStackTrace(); |
||
1440 | } |
||
1441 | } |
||
1442 | |||
1443 | /*
|
||
1444 | * (non-Javadoc)
|
||
1445 | * @see javax.swing.JComboBox#getSelectedIndex()
|
||
1446 | */
|
||
1447 | public int getSelectedIndex() { |
||
1448 | Object item = this.getSelectedItem(); |
||
1449 | |||
1450 | if (item == null) |
||
1451 | return -1; |
||
1452 | else
|
||
1453 | return model.getIndexOf(item);
|
||
1454 | } |
||
1455 | |||
1456 | /*
|
||
1457 | * (non-Javadoc)
|
||
1458 | * @see javax.swing.JComboBox#setSelectedItem(java.lang.Object)
|
||
1459 | */
|
||
1460 | public void setSelectedItem(Object anObject) { |
||
1461 | super.setSelectedItem(anObject);
|
||
1462 | this.selectedItem = super.getSelectedItem(); |
||
1463 | // this.lastSelectedIndex = model.getIndexOf(anObject);
|
||
1464 | 6732 | ppiqueras | // logger.debug("Posici?n: " + this.lastSelectedIndex);
|
1465 | 6721 | ppiqueras | |
1466 | //super.setSelectedIndex(this.lastSelectedIndex);
|
||
1467 | |||
1468 | // try {
|
||
1469 | // document.remove(0, document.getLength());
|
||
1470 | // if (getSelectedIndex() > -1)
|
||
1471 | // document.insertString(0, getSelectedItem().toString(), null);
|
||
1472 | // else
|
||
1473 | // this.lastSelectedIndex = -1;
|
||
1474 | //
|
||
1475 | // } catch (BadLocationException e) {
|
||
1476 | // // TODO Auto-generated catch block
|
||
1477 | // e.printStackTrace();
|
||
1478 | // }
|
||
1479 | } |
||
1480 | |||
1481 | //
|
||
1482 | ////// END REDEFINITION OF SOME METHODS OF JCOMBOBOX //////
|
||
1483 | |||
1484 | |||
1485 | |||
1486 | |||
1487 | |||
1488 | ////// METHODS FOR THE BEHAVIOR FLAGS //////
|
||
1489 | |||
1490 | /**
|
||
1491 | * This method tests the configuration of the flags and returns true or false if its ok or not with the
|
||
1492 | * logical behavior of this component
|
||
1493 | *
|
||
1494 | * @return boolean True if the configuration of the flags is oks, false if not
|
||
1495 | */
|
||
1496 | public boolean testFlagsConfigurationOK() { |
||
1497 | return this.model.testFlagsConfigurationOK(); |
||
1498 | } |
||
1499 | |||
1500 | public int getStartBehavior() { |
||
1501 | return this.model.getStartBehavior(); |
||
1502 | } |
||
1503 | |||
1504 | public void setStartBehavior(int start_Behavior) { |
||
1505 | this.model.setStartBehavior(start_Behavior);
|
||
1506 | |||
1507 | if (!this.model.testFlagsConfigurationOK()) |
||
1508 | JOptionPane.showMessageDialog(this, PluginServices.getText(this, "errorMessageJComboBoxItemsSeekerConfigurable"), PluginServices.getText(this, "exportJOP2Title"), JOptionPane.ERROR_MESSAGE); |
||
1509 | else
|
||
1510 | updateLastSelectionItem(); |
||
1511 | } |
||
1512 | |||
1513 | public int getSearchBehavior() { |
||
1514 | return this.model.getSearchBehavior(); |
||
1515 | } |
||
1516 | |||
1517 | public void setSearchBehavior(int search_Behavior) { |
||
1518 | this.model.setSearchBehavior(search_Behavior);
|
||
1519 | |||
1520 | if (!this.model.testFlagsConfigurationOK()) |
||
1521 | JOptionPane.showMessageDialog(this, PluginServices.getText(this, "errorMessageJComboBoxItemsSeekerConfigurable"), PluginServices.getText(this, "exportJOP2Title"), JOptionPane.ERROR_MESSAGE); |
||
1522 | else
|
||
1523 | updateLastSelectionItem(); |
||
1524 | } |
||
1525 | |||
1526 | |||
1527 | /**
|
||
1528 | * Gets the flag of the configuration of the keySensitive flag of this component
|
||
1529 | * (true -> discriminates capital letters from small letters ,false -> don't discriminates capital letters from small letters)
|
||
1530 | *
|
||
1531 | * @return boolean The value of the flag
|
||
1532 | */
|
||
1533 | public boolean isKeySensitive() { |
||
1534 | return this.model.isKeySensitive(); |
||
1535 | } |
||
1536 | |||
1537 | /**
|
||
1538 | * Sets the flag of the configuration of the keySensitive flag of this component
|
||
1539 | * (true -> discriminates capital letters from small letters ,false -> don't discriminates capital letters from small letters)
|
||
1540 | *
|
||
1541 | * @param boolean The value of the flag
|
||
1542 | */
|
||
1543 | public void setKeySensitive(boolean key_Sensitive) { |
||
1544 | this.model.setKeySensitive(key_Sensitive);
|
||
1545 | |||
1546 | if (!this.model.testFlagsConfigurationOK()) |
||
1547 | JOptionPane.showMessageDialog(this, PluginServices.getText(this, "errorMessageJComboBoxItemsSeekerConfigurable"), PluginServices.getText(this, "exportJOP2Title"), JOptionPane.ERROR_MESSAGE); |
||
1548 | } |
||
1549 | |||
1550 | /**
|
||
1551 | * Gets the flag of the configuration of the onlyOneColor flag of this component
|
||
1552 | * (true -> The text on the textField only will be showed on black color; false -> if the text on the textField doesn't match with any current item of this
|
||
1553 | * component -> the text will be showed on red color)
|
||
1554 | *
|
||
1555 | * @return boolean The value of the flag
|
||
1556 | */
|
||
1557 | public boolean isOnlyOneColor() { |
||
1558 | return onlyOneColor;
|
||
1559 | } |
||
1560 | |||
1561 | |||
1562 | /**
|
||
1563 | * Sets the flag of the configuration of the onlyOneColor flag of this component
|
||
1564 | * (true -> discriminates capital letters from small letters ,false -> don't discriminates capital letters from small letters)
|
||
1565 | *
|
||
1566 | * @param boolean The value of the flag
|
||
1567 | */
|
||
1568 | public void setOnlyOneColor(boolean only_One_Color) { |
||
1569 | this.onlyOneColor = only_One_Color;
|
||
1570 | |||
1571 | if (!this.model.testFlagsConfigurationOK()) |
||
1572 | JOptionPane.showMessageDialog(this, PluginServices.getText(this, "errorMessageJComboBoxItemsSeekerConfigurable"), PluginServices.getText(this, "exportJOP2Title"), JOptionPane.ERROR_MESSAGE); |
||
1573 | } |
||
1574 | |||
1575 | |||
1576 | 6732 | ppiqueras | public boolean isBeepEnabled() { |
1577 | return this.beepEnabled; |
||
1578 | 6721 | ppiqueras | } |
1579 | |||
1580 | 6732 | ppiqueras | public void setBeepEnabled(boolean beep_Enabled) { |
1581 | this.beepEnabled = beep_Enabled;
|
||
1582 | } |
||
1583 | |||
1584 | public boolean isCompleteMatchedItem() { |
||
1585 | return this.completeMatchedItem; |
||
1586 | } |
||
1587 | |||
1588 | public void setCompleteMatchedItem(boolean Complete_Matched_Item) { |
||
1589 | this.completeMatchedItem = Complete_Matched_Item;
|
||
1590 | } |
||
1591 | |||
1592 | |||
1593 | 6721 | ppiqueras | ////// END METHODS FOR THE BEHAVIOR FLAGS //////
|
1594 | |||
1595 | |||
1596 | /** REVISAR COMENTARIOS Y C?DIGO
|
||
1597 | * Inner class for optimize the seek of items
|
||
1598 | *
|
||
1599 | * @author Pablo Piqueras Bartolom? (p_queras@hotmail.com)
|
||
1600 | *
|
||
1601 | */
|
||
1602 | private class PlainDocumentSeeker extends PlainDocument{ |
||
1603 | private JComboBoxItemsSeekerConfigurable comboBox;
|
||
1604 | |||
1605 | /**
|
||
1606 | * Default Constructor
|
||
1607 | */
|
||
1608 | public PlainDocumentSeeker() {
|
||
1609 | super();
|
||
1610 | } |
||
1611 | |||
1612 | /**
|
||
1613 | * Sets a reference of the combo_Box
|
||
1614 | *
|
||
1615 | * @param combo_Box
|
||
1616 | */
|
||
1617 | public void setJComboBoxItemsSeekerDynamicReference(JComboBoxItemsSeekerConfigurable combo_Box) { |
||
1618 | comboBox = combo_Box; |
||
1619 | } |
||
1620 | |||
1621 | /* REVISAR
|
||
1622 | * (non-Javadoc)
|
||
1623 | * @see javax.swing.text.Document#remove(int, int)
|
||
1624 | */
|
||
1625 | public void remove(int offs, int len) throws BadLocationException { |
||
1626 | // return immediately when selecting an item
|
||
1627 | if (selecting) return; |
||
1628 | |||
1629 | if (hitBackspace)
|
||
1630 | { |
||
1631 | // user hit backspace => move the selection backwards
|
||
1632 | // old item keeps being selected
|
||
1633 | if (offs>0) |
||
1634 | { |
||
1635 | if (hitBackspaceOnSelection)
|
||
1636 | offs--; |
||
1637 | } |
||
1638 | else
|
||
1639 | { |
||
1640 | // User hit backspace with the cursor positioned on the start => beep
|
||
1641 | 6732 | ppiqueras | if (beepEnabled)
|
1642 | 6721 | ppiqueras | comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
|
1643 | } |
||
1644 | |||
1645 | highlightCompletedText(offs); |
||
1646 | } |
||
1647 | else
|
||
1648 | { |
||
1649 | super.remove(offs, len);
|
||
1650 | } |
||
1651 | //
|
||
1652 | // if (updatePopUp)
|
||
1653 | // {
|
||
1654 | // updatePopUpView();
|
||
1655 | // updatePopUp = false;
|
||
1656 | // }
|
||
1657 | |||
1658 | } |
||
1659 | |||
1660 | /*REVISAR
|
||
1661 | * (non-Javadoc)
|
||
1662 | * @see javax.swing.text.Document#insertString(int, java.lang.String, javax.swing.text.AttributeSet)
|
||
1663 | */
|
||
1664 | public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { |
||
1665 | // super.insertString(offs, str, a);
|
||
1666 | 6732 | ppiqueras | logger.debug("INSERTSTRING: " + str);
|
1667 | 6721 | ppiqueras | // model.setCurrentString(str);
|
1668 | |||
1669 | if (model.getParentSize() > 0) |
||
1670 | { |
||
1671 | // Insert the string into the document
|
||
1672 | |||
1673 | // If we aren't in the particular case of show al items at the beginning and is enabled the flag for complete the matched item:
|
||
1674 | // this is for not insert two strings to the document of the editor of this component
|
||
1675 | if (!((completeMatchedItem) && (model.isStartViewFlag())))
|
||
1676 | // if (!completeMatchedItem)
|
||
1677 | super.insertString(offs, str, a);
|
||
1678 | |||
1679 | |||
1680 | // Lookup and select a matching item
|
||
1681 | Object item = lookupItem(getText(0, getLength())); |
||
1682 | |||
1683 | if (item != null) |
||
1684 | { |
||
1685 | 6732 | ppiqueras | logger.debug("ITEM NOT NULL");
|
1686 | if ((completeMatchedItem) || (getSearchBehavior() == ComboBoxItemsSeekerConfigurableModel.MAINTAIN_ORIGINAL_POSITION_ALL_ITEMS_SEARCH))
|
||
1687 | 6721 | ppiqueras | setSelectedItem(item); |
1688 | |||
1689 | |||
1690 | // model.setCurrentString(getSelectedItem().toString());
|
||
1691 | // lastSelectedIndex = getSelectedIndex();
|
||
1692 | } |
||
1693 | else
|
||
1694 | { |
||
1695 | 6732 | ppiqueras | logger.debug("ITEM NULL");
|
1696 | 6721 | ppiqueras | // Keep old item selected if there is no match
|
1697 | item = comboBox.getSelectedItem(); |
||
1698 | 6732 | ppiqueras | logger.debug("ITEM QUE SELECCIONA CUANDO NULL: ->" + item.toString() + "<-"); |
1699 | 6721 | ppiqueras | |
1700 | // Imitate no insert (later on offs will be incremented by str.length(): selection won't move forward)
|
||
1701 | offs = offs-str.length(); |
||
1702 | |||
1703 | // Provide feedback to the user that his input has been received but can not be accepted
|
||
1704 | 6732 | ppiqueras | if (beepEnabled)
|
1705 | 6721 | ppiqueras | comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
|
1706 | } |
||
1707 | |||
1708 | // Set the complete item value matched
|
||
1709 | if (completeMatchedItem)
|
||
1710 | setText(item.toString()); |
||
1711 | |||
1712 | // Select the completed part
|
||
1713 | highlightCompletedText(offs+str.length()); |
||
1714 | |||
1715 | if (textKeyPressed)
|
||
1716 | { |
||
1717 | // updatePopUpView();
|
||
1718 | |||
1719 | textKeyPressed = false;
|
||
1720 | } |
||
1721 | } |
||
1722 | } |
||
1723 | |||
1724 | /** ?Sobra?
|
||
1725 | * This method sets the string value of the item to the PlainDocument removing the previous value of the PlainDocument
|
||
1726 | *
|
||
1727 | * @param text The string value of the item
|
||
1728 | */
|
||
1729 | private void setText(String text) { |
||
1730 | try
|
||
1731 | { |
||
1732 | // remove all text and insert the completed string
|
||
1733 | super.remove(0, super.getLength()); |
||
1734 | super.insertString(0, text, null); |
||
1735 | } |
||
1736 | catch (BadLocationException e) |
||
1737 | { |
||
1738 | throw new RuntimeException(e.toString()); |
||
1739 | } |
||
1740 | } |
||
1741 | |||
1742 | |||
1743 | |||
1744 | |||
1745 | |||
1746 | |||
1747 | |||
1748 | |||
1749 | |||
1750 | |||
1751 | |||
1752 | |||
1753 | |||
1754 | |||
1755 | |||
1756 | |||
1757 | |||
1758 | |||
1759 | /**
|
||
1760 | *
|
||
1761 | */
|
||
1762 | private Object lookupItem(String pattern) { |
||
1763 | 6732 | ppiqueras | logger.debug("LOOKUP -> patr?n ->" + pattern + "<-"); |
1764 | 6721 | ppiqueras | // Reset the color to the default
|
1765 | // editor.getEditorComponent().setForeground(Color.BLACK);
|
||
1766 | |||
1767 | // If no item starts with the pattern => return null and set the text written on red color if it's allowed
|
||
1768 | |||
1769 | Object selectedItem = model.getSelectedItem();
|
||
1770 | |||
1771 | // if (selectedItem.toString().length() >= pattern.length())
|
||
1772 | // {
|
||
1773 | // only search for a different item if the currently selected does not match
|
||
1774 | if ((selectedItem != null) && (startsWithIgnoreCase(selectedItem.toString(), pattern))) |
||
1775 | { |
||
1776 | editor.getEditorComponent().setForeground(Color.BLACK);
|
||
1777 | return selectedItem;
|
||
1778 | } |
||
1779 | else
|
||
1780 | { |
||
1781 | // iterate over all items
|
||
1782 | for (int i=0, n=model.getSize(); i < n; i++) |
||
1783 | { |
||
1784 | Object currentItem = model.getElementAt(i);
|
||
1785 | |||
1786 | // current item starts with the pattern?
|
||
1787 | if ((currentItem != null) && (startsWithIgnoreCase(currentItem.toString(), pattern))) |
||
1788 | { |
||
1789 | editor.getEditorComponent().setForeground(Color.BLACK);
|
||
1790 | return currentItem;
|
||
1791 | } |
||
1792 | } |
||
1793 | } |
||
1794 | |||
1795 | return null; |
||
1796 | } |
||
1797 | |||
1798 | |||
1799 | /**
|
||
1800 | * Checks if the starts of two strings agrees
|
||
1801 | */
|
||
1802 | private boolean startsWithIgnoreCase(String str1, String str2) { |
||
1803 | if (comboBox.isKeySensitive())
|
||
1804 | return str1.startsWith(str2);
|
||
1805 | else
|
||
1806 | return str1.toUpperCase().startsWith(str2.toUpperCase());
|
||
1807 | } |
||
1808 | } |
||
1809 | } |