Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.ui / src / main / java / org / gvsig / gui / beans / slidertext / SliderTextContainer.java @ 40561

History | View | Annotate | Download (12.1 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.gui.beans.slidertext;
25

    
26
import java.awt.BorderLayout;
27
import java.awt.Dimension;
28
import java.awt.GridBagConstraints;
29
import java.awt.GridBagLayout;
30
import java.awt.event.FocusEvent;
31
import java.awt.event.FocusListener;
32
import java.awt.event.KeyEvent;
33
import java.awt.event.KeyListener;
34
import java.awt.event.MouseEvent;
35
import java.awt.event.MouseListener;
36
import java.util.ArrayList;
37
import java.util.Iterator;
38

    
39
import javax.swing.BorderFactory;
40
import javax.swing.JPanel;
41
import javax.swing.JSlider;
42
import javax.swing.JTextField;
43
import javax.swing.border.TitledBorder;
44
import javax.swing.event.ChangeEvent;
45
import javax.swing.event.ChangeListener;
46

    
47
import org.gvsig.gui.beans.slidertext.listeners.SliderEvent;
48
import org.gvsig.gui.beans.slidertext.listeners.SliderListener;
49
/**
50
 * Barra de deslizamiento con una ventana de texto que tiene el valor de la
51
 * posici?n de la barra. En este control podr? controlarse mediante la entrada
52
 * de datos por la caja de texto la posibilidad de introducir valores decimales.
53
 *
54
 * Nacho Brodin (nachobrodin@gmail.com)
55
 */
56
public class SliderTextContainer extends JPanel implements ChangeListener, FocusListener, KeyListener, MouseListener {
57
        private static final long serialVersionUID = 1876415954410511634L;
58
        private ArrayList<SliderListener> actionCommandListeners = new ArrayList<SliderListener>();
59
        private JPanel     pText           = null;
60
        private JSlider    slider          = null;
61
        private JTextField text            = null;
62
        private int        min             = 0;
63
        private int        max             = 255;
64
        private double     interval        = 1.0;
65
        private int        defaultPos      = 0;
66
        private boolean    decimal         = false;
67
        private boolean    disconnectEvent = false;
68
        private boolean    dragged         = false;
69
        private boolean    showBorder      = false;
70

    
71
        /**
72
         * Contructor
73
         * @param min Valor m?nimo de la barra
74
         * @param max Valor m?ximo de la barra
75
         * @param defaultPos Posici?n por defecto
76
         * @deprecated Es recomendable el uso del constructor con el par?metro border. Tiene la misma funcionalidad 
77
         * si se pone ese par?metro a true. Se mantiene este constructor por compatibilidad con versiones 
78
         * anteriores.
79
         */
80
        public SliderTextContainer(int min, int max, int defaultPos) {
81
                this(min, max, defaultPos, false);
82
        }
83
        
84
        /**
85
         * Contructor
86
         * @param min Valor m?nimo de la barra
87
         * @param max Valor m?ximo de la barra
88
         * @param defaultPos Posici?n por defecto
89
         * @param border Flag que obliga a mostrar u ocultar el borde
90
         */
91
        public SliderTextContainer(int min, int max, int defaultPos, boolean border) {
92
                super();
93
                this.min = min;
94
                this.max = max;
95
                this.defaultPos = defaultPos;
96
                this.showBorder = border;
97
                initialize();
98
        }
99

    
100

    
101
        /**
102
         * Constructor vacio
103
         */
104
        public SliderTextContainer() {
105
                this(0, 100, 0);
106
        }
107

    
108
        /**
109
         * Dispara el evento del cambio del control
110
         */
111
        protected void callChangeValue(boolean forceEvent) {
112
                if (!getSlider().isEnabled() && !forceEvent)
113
                        return;
114
                Iterator<SliderListener> acIterator = actionCommandListeners.iterator();
115
                while (acIterator.hasNext()) {
116
                        SliderListener listener = (SliderListener) acIterator.next();
117
                        listener.actionValueChanged(new SliderEvent(this));
118
                }
119
        }
120

    
121
        /**
122
         * Dispara el evento del cambio del control
123
         */
124
        protected void callDraggedValue() {
125
                Iterator<SliderListener> acIterator = actionCommandListeners.iterator();
126
                while (acIterator.hasNext()) {
127
                        SliderListener listener = (SliderListener) acIterator.next();
128
                        listener.actionValueDragged(new SliderEvent(this));
129
                }
130
        }
131

    
132
        /**
133
         * A?adir un listener a la lista de eventos
134
         * @param listener
135
         */
136
        public void addValueChangedListener(SliderListener listener) {
137
                if (!actionCommandListeners.contains(listener))
138
                        actionCommandListeners.add(listener);
139
        }
140

    
141
        /**
142
         * Borrar un listener de la lista de eventos
143
         * @param listener
144
         */
145
        public void removeValueChangedListener(SliderListener listener) {
146
                actionCommandListeners.remove(listener);
147
        }
148

    
149
        /**
150
         * Asigna un borde al componente con el texto pasado como
151
         * par?metro
152
         * @param name
153
         */
154
        public void setBorder(String name){
155
                setBorder(BorderFactory.createTitledBorder(null, name, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
156
        }
157

    
158
        /**
159
         * This method initializes this
160
         *
161
         */
162
        private void initialize() {
163
                this.setLayout(new BorderLayout());
164
                this.add(getSlider(), BorderLayout.CENTER);
165
                this.add(getPText(), BorderLayout.EAST);
166
                if(showBorder)
167
                        this.setBorder(BorderFactory.createLineBorder(java.awt.Color.gray,1));
168
        }
169

    
170
        /**
171
         * This method initializes jPanel1
172
         *
173
         * @return javax.swing.JPanel
174
         */
175
        private JPanel getPText() {
176
                if (pText == null) {
177
                        pText = new JPanel();
178
                        GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
179
                        gridBagConstraints1.insets = new java.awt.Insets(0, 10, 8, 0);
180
                        pText.setLayout(new GridBagLayout());
181
                        pText.add(getTextField(), gridBagConstraints1);
182
                }
183
                return pText;
184
        }
185

    
186
        /**
187
         * This method initializes jSlider
188
         *
189
         * @return javax.swing.JSlider
190
         */
191
        public JSlider getSlider() {
192
                if (slider == null) {
193
                        slider = new JSlider();
194
                        slider.setMinimum(0);
195
                        slider.setMaximum((int) ((max - min) / interval));
196
                        slider.setValue((int) ((defaultPos - min) / interval));
197
                        updateTicks();
198
                        slider.addChangeListener(this);
199
                        slider.addMouseListener(this);
200
                }
201
                return slider;
202
        }
203

    
204
        /**
205
         * This method initializes jTextField
206
         *
207
         * @return javax.swing.JTextField
208
         */
209
        public JTextField getTextField() {
210
                if (text == null) {
211
                        text = new JTextField();
212
                        text.setText(defaultPos + "");
213
                        text.setPreferredSize(new Dimension(40, 26));
214
                        text.setMinimumSize(new Dimension(40, 26));
215
                        text.addFocusListener(this);
216
                        text.addKeyListener(this);
217
                }
218
                return text;
219
        }
220

    
221
        public void setComponentSize(int w, int h){
222
        }
223

    
224
        /**
225
         * Obtiene el valor del control.
226
         * @return Valor del control en formato double.
227
         */
228
        public double getValue() {
229
                return new Double(getTextField().getText()).doubleValue();
230
        }
231

    
232
        /**
233
         * Asigna el valor del control.
234
         * @return Valor del control en formato double.
235
         */
236
        public void setValue(double value){
237
                if(decimal)
238
                        getTextField().setText(String.valueOf(value));
239
                else
240
                        getTextField().setText(String.valueOf((int)value));
241
                getSlider().setValue((int) ((value - min) / interval));
242
        }
243

    
244
        /**
245
         * Activa o desactiva el control del panel
246
         * @param active
247
         */
248
        public void setControlEnabled(boolean active){
249
                getSlider().setEnabled(active);
250
                getTextField().setEnabled(active);
251
                if (active == false) {
252
                        getTextField().setBackground(pText.getBackground());
253
                } else {
254
                        getTextField().setBackground(java.awt.Color.white);
255
                }
256
        }
257

    
258
        /**
259
         * Asigna el flag que dice si el valor del campo de texto ser?
260
         * decimal o entero
261
         * @param dec true si se admiten valores decimales y false si no se admiten
262
         */
263
        public void setDecimal (boolean dec){
264
                decimal = dec;
265
                String s = getTextField().getText();
266
                if(dec)
267
                        getTextField().setText((s +".0"));
268
                else{
269
                        int index = s.lastIndexOf(".");
270
                        if(index == -1 || index == 0)
271
                                index = s.length() - 1;
272
                        getTextField().setText(s.substring(0, index + 1));
273
                }
274
        }
275

    
276
        /**
277
         * Obtiene el flag que dice si el valor del campo de texto es
278
         * decimal o entero
279
         * @return true si se admiten valores decimales y false si no se admiten
280
         */
281
        public boolean getDecimal (){
282
                return decimal;
283
        }
284

    
285
        /**
286
         * Obtiene el valor m?ximo del slider
287
         * @return Entero con el valor m?ximo
288
         */
289
        public int getMax() {
290
                return max;
291
        }
292

    
293
        /**
294
         * Asigna el valor m?ximo del slider
295
         * @param Entero con el valor m?ximo
296
         * @deprecated Usar setMaximum en su lugar
297
         */
298
        public void setMax(int max) {
299
                this.setMaximum(max);
300
        }
301

    
302
        /**
303
         * Asigna el valor m?ximo del slider
304
         * @param Entero con el valor m?ximo
305
         */
306
        public void setMaximum(int max) {
307
                this.max = max;
308
                updateInterval();
309
        }
310

    
311
        /**
312
         * Obtiene el valor m?nimo del slider
313
         * @return Entero con el valor m?nimo
314
         */
315
        public int getMin() {
316
                return min;
317
        }
318

    
319
        /**
320
         * Asigna el valor m?nimo del slider
321
         * @param Entero con el valor m?nimo
322
         * @deprecated Usar setMinimum
323
         */
324
        public void setMin(int min) {
325
                this.setMinimum(min);
326
        }
327

    
328
        /**
329
         * Asigna el valor m?nimo del slider
330
         * @param Entero con el valor m?nimo
331
         */
332
        public void setMinimum(int min) {
333
                this.min = min;
334
                updateInterval();
335
        }
336

    
337
        /**
338
         * Actualizar la separacion entre los Ticks
339
         */
340
        private void updateTicks() {
341
                int ticks = (int) ((max-min)/interval) / 40;
342
                getSlider().setMajorTickSpacing(ticks * 4);
343
                slider.setPaintTicks(true);
344
                getSlider().setMinorTickSpacing(ticks);
345
        }
346

    
347
        private void updateInterval() {
348
                double aux = this.getValue();
349
                getSlider().setMinimum(0);
350
                getSlider().setMaximum((int) ((max - min) / interval));
351
                setValue(aux);
352
                updateTicks();
353
        }
354
        /**
355
         * Definir un intervalo para el slider
356
         * @param value
357
         */
358
        public void setInterval(double value) {
359
                interval = value;
360
                updateInterval();
361
        }
362

    
363
        /**
364
         * Obtener el intervalo definido para el slider
365
         * @return
366
         */
367
        public double getInterval() {
368
                return interval;
369
        }
370

    
371
        /**
372
         * Controla que si el formato introducido en el textfield es numerico. Si lo
373
         * es se actualiza la posici?n del slider
374
         */
375
        private void checkDecimalTextAndUpdateSlider() {
376
                String text = getTextField().getText();
377
                double value = 0;
378
                disconnectEvent = true;
379

    
380
                try {
381
                        if (!text.equals("")) {
382
                                value = (Double.parseDouble(text) * 100) / (double) (getMax() - getMin());
383
                                value = Double.valueOf(text).doubleValue();
384
                                if (value < getMin())
385
                                        value = getMin();
386
                                if (value > getMax())
387
                                        value = getMax();
388
                        }
389
                        setValue(value);
390
                        callChangeValue(true);
391
                } catch (NumberFormatException exc) {
392
                        setValue(getSlider().getValue()*interval + min);
393
                }
394
        }
395

    
396
        /**
397
         * Control del evento de cambio en la posici?n del slider. Este cambio
398
         * actualiza el valor de la caja de texto y ejecuta el m?todo stateChanged de
399
         * los listener registrados.
400
         */
401
        public void stateChanged(ChangeEvent e) {
402
                //Modificamos la caja de texto con el valor de la posici?n del slider
403
                if (!disconnectEvent) {
404
                        double value = (getSlider().getValue() * getInterval()) + getMin();
405
                        if (!getDecimal())
406
                                getTextField().setText(((int) value) + "");
407
                        else
408
                                getTextField().setText(((int) (value * 10)) / 10.0 + "");
409
                        if (dragged)
410
                                callDraggedValue();
411
                        else
412
                                callChangeValue(true);
413
                }
414
                disconnectEvent = false;
415
        }
416

    
417
        /*
418
         * (non-Javadoc)
419
         * @see java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent)
420
         */
421
        public void focusLost(FocusEvent e) {
422
                checkDecimalTextAndUpdateSlider();
423
        }
424

    
425
        /*
426
         * (non-Javadoc)
427
         * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
428
         */
429
        public void keyReleased(KeyEvent e) {
430
                if (e.getKeyCode() == 10)
431
                        checkDecimalTextAndUpdateSlider();
432
        }
433

    
434
        /*
435
         * (non-Javadoc)
436
         * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
437
         */
438
        public void mousePressed(MouseEvent e) {
439
                dragged = true;
440
        }
441

    
442
        /*
443
         * (non-Javadoc)
444
         * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
445
         */
446
        public void mouseReleased(MouseEvent e) {
447
                dragged = false;
448
                callChangeValue(false);
449
        }
450

    
451
        public void focusGained(FocusEvent e) {}
452
        public void keyPressed(KeyEvent e) {}
453
        public void keyTyped(KeyEvent e) {}
454
        public void mouseClicked(MouseEvent e) {}
455
        public void mouseEntered(MouseEvent e) {}
456
        public void mouseExited(MouseEvent e) {}
457
}