root / trunk / libraries / libUIComponent / src / org / gvsig / gui / beans / slidertext / SliderTextContainer.java @ 12180
History | View | Annotate | Download (12.2 KB)
1 | 10741 | nacho | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|---|---|
2 | *
|
||
3 | * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
|
||
4 | *
|
||
5 | * This program is free software; you can redistribute it and/or
|
||
6 | * modify it under the terms of the GNU General Public License
|
||
7 | * as published by the Free Software Foundation; either version 2
|
||
8 | * of the License, or (at your option) any later version.
|
||
9 | *
|
||
10 | * This program is distributed in the hope that it will be useful,
|
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
13 | * GNU General Public License for more details.
|
||
14 | *
|
||
15 | * You should have received a copy of the GNU General Public License
|
||
16 | * along with this program; if not, write to the Free Software
|
||
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
18 | */
|
||
19 | package org.gvsig.gui.beans.slidertext; |
||
20 | |||
21 | import java.awt.BorderLayout; |
||
22 | import java.awt.Dimension; |
||
23 | import java.awt.GridBagConstraints; |
||
24 | import java.awt.GridBagLayout; |
||
25 | 12180 | bsanchez | import java.awt.event.FocusEvent; |
26 | import java.awt.event.FocusListener; |
||
27 | import java.awt.event.KeyEvent; |
||
28 | 10741 | nacho | import java.awt.event.KeyListener; |
29 | 12180 | bsanchez | import java.awt.event.MouseEvent; |
30 | import java.awt.event.MouseListener; |
||
31 | import java.awt.event.MouseMotionListener; |
||
32 | import java.awt.event.MouseWheelListener; |
||
33 | import java.util.ArrayList; |
||
34 | import java.util.Iterator; |
||
35 | 10741 | nacho | |
36 | import javax.swing.JPanel; |
||
37 | import javax.swing.JSlider; |
||
38 | import javax.swing.JTextField; |
||
39 | 12180 | bsanchez | import javax.swing.event.ChangeEvent; |
40 | 10741 | nacho | import javax.swing.event.ChangeListener; |
41 | |||
42 | 12180 | bsanchez | import org.gvsig.gui.beans.slidertext.listeners.SliderEvent; |
43 | import org.gvsig.gui.beans.slidertext.listeners.SliderListener; |
||
44 | 10741 | nacho | /**
|
45 | 12153 | bsanchez | * Barra de deslizamiento con una ventana de texto que tiene el valor de la
|
46 | * posici?n de la barra. En este control podr? controlarse mediante la entrada
|
||
47 | * de datos por la caja de texto la posibilidad de introducir valores decimales.
|
||
48 | *
|
||
49 | 10741 | nacho | * Nacho Brodin (nachobrodin@gmail.com)
|
50 | */
|
||
51 | 12180 | bsanchez | public class SliderTextContainer extends JPanel implements ChangeListener, FocusListener, KeyListener, MouseListener { |
52 | private static final long serialVersionUID = 1876415954410511634L; |
||
53 | private JPanel pText = null; |
||
54 | private JSlider slider = null; |
||
55 | private JTextField text = null; |
||
56 | private int min = 0; |
||
57 | private int max = 255; |
||
58 | private double interval = 1.0; |
||
59 | private int defaultPos = 0; |
||
60 | private boolean decimal = false; |
||
61 | private ArrayList actionCommandListeners = new ArrayList(); |
||
62 | private boolean disconnectEvent = false; |
||
63 | private boolean dragged = false; |
||
64 | 12085 | bsanchez | |
65 | 10741 | nacho | /**
|
66 | * Contructor
|
||
67 | 12180 | bsanchez | *
|
68 | 10741 | nacho | * @param min Valor m?nimo de la barra
|
69 | * @param max Valor m?ximo de la barra
|
||
70 | 12180 | bsanchez | * @param defaultPos Posici?n por defecto
|
71 | 10741 | nacho | */
|
72 | public SliderTextContainer(int min, int max, int defaultPos) { |
||
73 | super();
|
||
74 | this.min = min;
|
||
75 | this.max = max;
|
||
76 | this.defaultPos = defaultPos;
|
||
77 | 12085 | bsanchez | |
78 | 10741 | nacho | initialize(); |
79 | } |
||
80 | 12085 | bsanchez | |
81 | 11707 | bsanchez | /**
|
82 | * Constructor vacio
|
||
83 | */
|
||
84 | public SliderTextContainer() {
|
||
85 | this(0, 100, 0); |
||
86 | } |
||
87 | 10741 | nacho | |
88 | /**
|
||
89 | 12180 | bsanchez | * Dispara el evento del cambio del control
|
90 | 10741 | nacho | */
|
91 | 12180 | bsanchez | protected void callChangeValue() { |
92 | Iterator acIterator = actionCommandListeners.iterator();
|
||
93 | while (acIterator.hasNext()) {
|
||
94 | SliderListener listener = (SliderListener) acIterator.next(); |
||
95 | listener.actionValueChanged(new SliderEvent(this)); |
||
96 | } |
||
97 | 10741 | nacho | } |
98 | 12085 | bsanchez | |
99 | 10741 | nacho | /**
|
100 | 12180 | bsanchez | * Dispara el evento del cambio del control
|
101 | 10741 | nacho | */
|
102 | 12180 | bsanchez | protected void callDraggedValue() { |
103 | Iterator acIterator = actionCommandListeners.iterator();
|
||
104 | while (acIterator.hasNext()) {
|
||
105 | SliderListener listener = (SliderListener) acIterator.next(); |
||
106 | listener.actionValueDragged(new SliderEvent(this)); |
||
107 | } |
||
108 | 10741 | nacho | } |
109 | 12085 | bsanchez | |
110 | 10741 | nacho | /**
|
111 | 12180 | bsanchez | * A?adir un listener a la lista de eventos
|
112 | * @param listener
|
||
113 | */
|
||
114 | public void addValueChangedListener(SliderListener listener) { |
||
115 | if (!actionCommandListeners.contains(listener))
|
||
116 | actionCommandListeners.add(listener); |
||
117 | } |
||
118 | |||
119 | /**
|
||
120 | * Borrar un listener de la lista de eventos
|
||
121 | * @param listener
|
||
122 | */
|
||
123 | public void removeValueChangedListener(SliderListener listener) { |
||
124 | actionCommandListeners.remove(listener); |
||
125 | } |
||
126 | |||
127 | /**
|
||
128 | 10741 | nacho | * Asigna un borde al componente con el texto pasado como
|
129 | * par?metro
|
||
130 | * @param name
|
||
131 | */
|
||
132 | public void setBorder(String name){ |
||
133 | setBorder(javax.swing.BorderFactory.createTitledBorder(null, name, javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null)); |
||
134 | } |
||
135 | 12085 | bsanchez | |
136 | 10741 | nacho | /**
|
137 | * This method initializes this
|
||
138 | *
|
||
139 | */
|
||
140 | private void initialize() { |
||
141 | 12085 | bsanchez | this.setLayout(new BorderLayout()); |
142 | this.add(getSlider(), BorderLayout.CENTER); |
||
143 | this.add(getPText(), BorderLayout.EAST); |
||
144 | this.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray,1)); |
||
145 | 10741 | nacho | } |
146 | |||
147 | /**
|
||
148 | * This method initializes jPanel1
|
||
149 | *
|
||
150 | * @return javax.swing.JPanel
|
||
151 | */
|
||
152 | private JPanel getPText() { |
||
153 | if (pText == null) { |
||
154 | pText = new JPanel(); |
||
155 | GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); |
||
156 | gridBagConstraints1.insets = new java.awt.Insets(0, 10, 8, 0); |
||
157 | pText.setLayout(new GridBagLayout()); |
||
158 | pText.add(getTextField(), gridBagConstraints1); |
||
159 | } |
||
160 | return pText;
|
||
161 | } |
||
162 | |||
163 | /**
|
||
164 | * This method initializes jSlider
|
||
165 | *
|
||
166 | * @return javax.swing.JSlider
|
||
167 | */
|
||
168 | public JSlider getSlider() { |
||
169 | if (slider == null) { |
||
170 | slider = new JSlider(); |
||
171 | 11707 | bsanchez | slider.setMinimum(0);
|
172 | slider.setMaximum((int) ((max - min) / interval));
|
||
173 | slider.setValue((int) ((defaultPos - min) / interval));
|
||
174 | updateTicks(); |
||
175 | 12180 | bsanchez | slider.addChangeListener(this);
|
176 | slider.addMouseListener(this);
|
||
177 | 10741 | nacho | } |
178 | return slider;
|
||
179 | } |
||
180 | |||
181 | /**
|
||
182 | * This method initializes jTextField
|
||
183 | *
|
||
184 | * @return javax.swing.JTextField
|
||
185 | */
|
||
186 | public JTextField getTextField() { |
||
187 | if (text == null) { |
||
188 | text = new JTextField(); |
||
189 | text.setText(defaultPos + "");
|
||
190 | text.setPreferredSize(new Dimension(40, 26)); |
||
191 | 11707 | bsanchez | text.setMinimumSize(new Dimension(40, 26)); |
192 | 12180 | bsanchez | text.addFocusListener(this);
|
193 | text.addKeyListener(this);
|
||
194 | 10741 | nacho | } |
195 | return text;
|
||
196 | } |
||
197 | 12085 | bsanchez | |
198 | 10741 | nacho | public void setComponentSize(int w, int h){ |
199 | } |
||
200 | 12085 | bsanchez | |
201 | 10741 | nacho | /**
|
202 | * Obtiene el valor del control.
|
||
203 | * @return Valor del control en formato double.
|
||
204 | */
|
||
205 | 11707 | bsanchez | public double getValue() { |
206 | 10741 | nacho | return Double.valueOf(getTextField().getText()).doubleValue(); |
207 | } |
||
208 | |||
209 | /**
|
||
210 | * Asigna el valor del control.
|
||
211 | * @return Valor del control en formato double.
|
||
212 | */
|
||
213 | public void setValue(double value){ |
||
214 | if(decimal)
|
||
215 | getTextField().setText(String.valueOf(value));
|
||
216 | else
|
||
217 | getTextField().setText(String.valueOf((int)value)); |
||
218 | 11707 | bsanchez | getSlider().setValue((int) ((value - min) / interval));
|
219 | 10741 | nacho | } |
220 | 12085 | bsanchez | |
221 | 10741 | nacho | /**
|
222 | * Activa o desactiva el control del panel
|
||
223 | * @param active
|
||
224 | */
|
||
225 | public void setControlEnabled(boolean active){ |
||
226 | 11707 | bsanchez | getSlider().setEnabled(active); |
227 | 10741 | nacho | getTextField().setEnabled(active); |
228 | 12138 | bsanchez | if (active == false) { |
229 | 10741 | nacho | getTextField().setBackground(pText.getBackground()); |
230 | 12138 | bsanchez | } else {
|
231 | 10741 | nacho | getTextField().setBackground(java.awt.Color.white); |
232 | 12085 | bsanchez | } |
233 | 10741 | nacho | } |
234 | 12085 | bsanchez | |
235 | 10741 | nacho | /**
|
236 | * Asigna el flag que dice si el valor del campo de texto ser?
|
||
237 | * decimal o entero
|
||
238 | * @param dec true si se admiten valores decimales y false si no se admiten
|
||
239 | */
|
||
240 | public void setDecimal (boolean dec){ |
||
241 | decimal = dec; |
||
242 | String s = getTextField().getText();
|
||
243 | if(dec)
|
||
244 | getTextField().setText((s +".0"));
|
||
245 | else{
|
||
246 | int index = s.lastIndexOf("."); |
||
247 | if(index == -1 || index == 0) |
||
248 | index = s.length() - 1;
|
||
249 | getTextField().setText(s.substring(0, index + 1)); |
||
250 | } |
||
251 | } |
||
252 | 12085 | bsanchez | |
253 | 10741 | nacho | /**
|
254 | * Obtiene el flag que dice si el valor del campo de texto es
|
||
255 | * decimal o entero
|
||
256 | * @return true si se admiten valores decimales y false si no se admiten
|
||
257 | */
|
||
258 | public boolean getDecimal (){ |
||
259 | return decimal;
|
||
260 | } |
||
261 | |||
262 | /**
|
||
263 | * Obtiene el valor m?ximo del slider
|
||
264 | * @return Entero con el valor m?ximo
|
||
265 | */
|
||
266 | public int getMax() { |
||
267 | return max;
|
||
268 | } |
||
269 | 12085 | bsanchez | |
270 | 10741 | nacho | /**
|
271 | * Asigna el valor m?ximo del slider
|
||
272 | * @param Entero con el valor m?ximo
|
||
273 | 11707 | bsanchez | * @deprecated Usar setMaximum en su lugar
|
274 | 10741 | nacho | */
|
275 | public void setMax(int max) { |
||
276 | 11707 | bsanchez | this.setMaximum(max);
|
277 | } |
||
278 | |||
279 | /**
|
||
280 | * Asigna el valor m?ximo del slider
|
||
281 | * @param Entero con el valor m?ximo
|
||
282 | */
|
||
283 | public void setMaximum(int max) { |
||
284 | 10741 | nacho | this.max = max;
|
285 | 11707 | bsanchez | updateInterval(); |
286 | 10741 | nacho | } |
287 | |||
288 | /**
|
||
289 | * Obtiene el valor m?nimo del slider
|
||
290 | * @return Entero con el valor m?nimo
|
||
291 | */
|
||
292 | public int getMin() { |
||
293 | return min;
|
||
294 | } |
||
295 | |||
296 | /**
|
||
297 | * Asigna el valor m?nimo del slider
|
||
298 | * @param Entero con el valor m?nimo
|
||
299 | 11707 | bsanchez | * @deprecated Usar setMinimum
|
300 | 10741 | nacho | */
|
301 | public void setMin(int min) { |
||
302 | 11707 | bsanchez | this.setMinimum(min);
|
303 | } |
||
304 | 12085 | bsanchez | |
305 | 11707 | bsanchez | /**
|
306 | * Asigna el valor m?nimo del slider
|
||
307 | * @param Entero con el valor m?nimo
|
||
308 | */
|
||
309 | public void setMinimum(int min) { |
||
310 | 10741 | nacho | this.min = min;
|
311 | 11707 | bsanchez | updateInterval(); |
312 | 10741 | nacho | } |
313 | 12085 | bsanchez | |
314 | 11707 | bsanchez | /**
|
315 | * Actualizar la separacion entre los Ticks
|
||
316 | */
|
||
317 | private void updateTicks() { |
||
318 | int ticks = (int) ((max-min)/interval) / 40; |
||
319 | getSlider().setMajorTickSpacing(ticks * 4);
|
||
320 | slider.setPaintTicks(true);
|
||
321 | getSlider().setMinorTickSpacing(ticks); |
||
322 | } |
||
323 | 12085 | bsanchez | |
324 | 11707 | bsanchez | private void updateInterval() { |
325 | double aux = this.getValue(); |
||
326 | getSlider().setMinimum(0);
|
||
327 | getSlider().setMaximum((int) ((max - min) / interval));
|
||
328 | setValue(aux); |
||
329 | updateTicks(); |
||
330 | } |
||
331 | /**
|
||
332 | * Definir un intervalo para el slider
|
||
333 | * @param value
|
||
334 | */
|
||
335 | public void setInterval(double value) { |
||
336 | interval = value; |
||
337 | updateInterval(); |
||
338 | } |
||
339 | 12085 | bsanchez | |
340 | 11707 | bsanchez | /**
|
341 | * Obtener el intervalo definido para el slider
|
||
342 | * @return
|
||
343 | */
|
||
344 | public double getInterval() { |
||
345 | return interval;
|
||
346 | } |
||
347 | 12180 | bsanchez | |
348 | /**
|
||
349 | * Controla que si el formato introducido en el textfield es numerico. Si lo
|
||
350 | * es se actualiza la posici?n del slider
|
||
351 | */
|
||
352 | private void checkDecimalTextAndUpdateSlider() { |
||
353 | String text = getTextField().getText();
|
||
354 | double value = 0; |
||
355 | disconnectEvent = true;
|
||
356 | |||
357 | try {
|
||
358 | if (!text.equals("")) { |
||
359 | value = (Double.parseDouble(text) * 100) / (double) (getMax() - getMin()); |
||
360 | value = Double.valueOf(text).doubleValue();
|
||
361 | if (value < getMin())
|
||
362 | value = getMin(); |
||
363 | if (value > getMax())
|
||
364 | value = getMax(); |
||
365 | } |
||
366 | setValue(value); |
||
367 | callChangeValue(); |
||
368 | } catch (NumberFormatException exc) { |
||
369 | setValue(getSlider().getValue()*interval + min); |
||
370 | } |
||
371 | } |
||
372 | |||
373 | /**
|
||
374 | * Control del evento de cambio en la posici?n del slider. Este cambio
|
||
375 | * actualiza el valor de la caja de texto y ejecuta el m?todo stateChanged de
|
||
376 | * los listener registrados.
|
||
377 | */
|
||
378 | public void stateChanged(ChangeEvent e) { |
||
379 | //Modificamos la caja de texto con el valor de la posici?n del slider
|
||
380 | if (!disconnectEvent) {
|
||
381 | double value = (getSlider().getValue() * getInterval()) + getMin();
|
||
382 | if (!getDecimal())
|
||
383 | getTextField().setText(((int) value) + ""); |
||
384 | else
|
||
385 | getTextField().setText(((int) (value * 10)) / 10.0 + ""); |
||
386 | if (dragged)
|
||
387 | callDraggedValue(); |
||
388 | else
|
||
389 | callChangeValue(); |
||
390 | } |
||
391 | disconnectEvent = false;
|
||
392 | } |
||
393 | |||
394 | /*
|
||
395 | * (non-Javadoc)
|
||
396 | * @see java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent)
|
||
397 | */
|
||
398 | public void focusLost(FocusEvent e) { |
||
399 | checkDecimalTextAndUpdateSlider(); |
||
400 | } |
||
401 | |||
402 | /*
|
||
403 | * (non-Javadoc)
|
||
404 | * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
|
||
405 | */
|
||
406 | public void keyReleased(KeyEvent e) { |
||
407 | if (e.getKeyCode() == 10) |
||
408 | checkDecimalTextAndUpdateSlider(); |
||
409 | } |
||
410 | |||
411 | /*
|
||
412 | * (non-Javadoc)
|
||
413 | * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
|
||
414 | */
|
||
415 | public void mousePressed(MouseEvent e) { |
||
416 | dragged = true;
|
||
417 | } |
||
418 | |||
419 | /*
|
||
420 | * (non-Javadoc)
|
||
421 | * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
|
||
422 | */
|
||
423 | public void mouseReleased(MouseEvent e) { |
||
424 | dragged = false;
|
||
425 | callChangeValue(); |
||
426 | } |
||
427 | |||
428 | public void focusGained(FocusEvent e) {} |
||
429 | public void keyPressed(KeyEvent e) {} |
||
430 | public void keyTyped(KeyEvent e) {} |
||
431 | public void mouseClicked(MouseEvent e) {} |
||
432 | public void mouseEntered(MouseEvent e) {} |
||
433 | public void mouseExited(MouseEvent e) {} |
||
434 | |||
435 | /**
|
||
436 | * @deprecated Usar addValueChangedListener() en su lugar
|
||
437 | */
|
||
438 | public synchronized void addFocusListener(FocusListener l) { |
||
439 | super.addFocusListener(l);
|
||
440 | } |
||
441 | |||
442 | /**
|
||
443 | * @deprecated Usar addValueChangedListener() en su lugar
|
||
444 | */
|
||
445 | public synchronized void addKeyListener(KeyListener l) { |
||
446 | super.addKeyListener(l);
|
||
447 | } |
||
448 | |||
449 | /**
|
||
450 | * @deprecated Usar addValueChangedListener() en su lugar
|
||
451 | */
|
||
452 | public synchronized void addMouseListener(MouseListener l) { |
||
453 | super.addMouseListener(l);
|
||
454 | } |
||
455 | |||
456 | /**
|
||
457 | * @deprecated Usar addValueChangedListener() en su lugar
|
||
458 | */
|
||
459 | public synchronized void addMouseMotionListener(MouseMotionListener l) { |
||
460 | super.addMouseMotionListener(l);
|
||
461 | } |
||
462 | |||
463 | /**
|
||
464 | * @deprecated Usar addValueChangedListener() en su lugar
|
||
465 | */
|
||
466 | public synchronized void addMouseWheelListener(MouseWheelListener l) { |
||
467 | super.addMouseWheelListener(l);
|
||
468 | } |
||
469 | } |