Statistics
| Revision:

root / trunk / libraries / libUIComponent / src / org / gvsig / gui / beans / slidertext / SliderTextContainer.java @ 12180

History | View | Annotate | Download (12.2 KB)

1
/* 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
import java.awt.event.FocusEvent;
26
import java.awt.event.FocusListener;
27
import java.awt.event.KeyEvent;
28
import java.awt.event.KeyListener;
29
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

    
36
import javax.swing.JPanel;
37
import javax.swing.JSlider;
38
import javax.swing.JTextField;
39
import javax.swing.event.ChangeEvent;
40
import javax.swing.event.ChangeListener;
41

    
42
import org.gvsig.gui.beans.slidertext.listeners.SliderEvent;
43
import org.gvsig.gui.beans.slidertext.listeners.SliderListener;
44
/**
45
 * 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
 * Nacho Brodin (nachobrodin@gmail.com)
50
 */
51
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

    
65
        /**
66
         * Contructor
67
         *
68
         * @param min Valor m?nimo de la barra
69
         * @param max Valor m?ximo de la barra
70
         * @param defaultPos Posici?n por defecto
71
         */
72
        public SliderTextContainer(int min, int max, int defaultPos) {
73
                super();
74
                this.min = min;
75
                this.max = max;
76
                this.defaultPos = defaultPos;
77

    
78
                initialize();
79
        }
80

    
81
        /**
82
         * Constructor vacio
83
         */
84
        public SliderTextContainer() {
85
                this(0, 100, 0);
86
        }
87

    
88
        /**
89
         * Dispara el evento del cambio del control
90
         */
91
        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
        }
98

    
99
        /**
100
         * Dispara el evento del cambio del control
101
         */
102
        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
        }
109

    
110
        /**
111
         * 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
         * 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

    
136
        /**
137
         * This method initializes this
138
         * 
139
         */
140
        private void initialize() {
141
                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
        }
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
                        slider.setMinimum(0);
172
                        slider.setMaximum((int) ((max - min) / interval));
173
                        slider.setValue((int) ((defaultPos - min) / interval));
174
                        updateTicks();
175
                        slider.addChangeListener(this);
176
                        slider.addMouseListener(this);
177
                }
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
                        text.setMinimumSize(new Dimension(40, 26));
192
                        text.addFocusListener(this);
193
                        text.addKeyListener(this);
194
                }
195
                return text;
196
        }
197

    
198
        public void setComponentSize(int w, int h){
199
        }
200

    
201
        /**
202
         * Obtiene el valor del control.
203
         * @return Valor del control en formato double.
204
         */
205
        public double getValue() {
206
                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
                getSlider().setValue((int) ((value - min) / interval));
219
        }
220

    
221
        /**
222
         * Activa o desactiva el control del panel
223
         * @param active
224
         */
225
        public void setControlEnabled(boolean active){
226
                getSlider().setEnabled(active);
227
                getTextField().setEnabled(active);
228
                if (active == false) {
229
                        getTextField().setBackground(pText.getBackground());
230
                } else {
231
                        getTextField().setBackground(java.awt.Color.white);
232
                }
233
        }
234

    
235
        /**
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

    
253
        /**
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

    
270
        /**
271
         * Asigna el valor m?ximo del slider
272
         * @param Entero con el valor m?ximo
273
         * @deprecated Usar setMaximum en su lugar
274
         */
275
        public void setMax(int max) {
276
                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
                this.max = max;
285
                updateInterval();
286
        }
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
         * @deprecated Usar setMinimum
300
         */
301
        public void setMin(int min) {
302
                this.setMinimum(min);
303
        }
304

    
305
        /**
306
         * Asigna el valor m?nimo del slider
307
         * @param Entero con el valor m?nimo
308
         */
309
        public void setMinimum(int min) {
310
                this.min = min;
311
                updateInterval();
312
        }
313

    
314
        /**
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

    
324
        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

    
340
        /**
341
         * Obtener el intervalo definido para el slider
342
         * @return
343
         */
344
        public double getInterval() {
345
                return interval;
346
        }
347

    
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
}