Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libUIComponent / src / org / gvsig / gui / beans / slidertext / SliderTextContainer.java @ 22758

History | View | Annotate | Download (12 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.util.ArrayList;
32
import java.util.Iterator;
33

    
34
import javax.swing.BorderFactory;
35
import javax.swing.JPanel;
36
import javax.swing.JSlider;
37
import javax.swing.JTextField;
38
import javax.swing.border.TitledBorder;
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 ArrayList<SliderListener> actionCommandListeners = new ArrayList<SliderListener>();
54
        private JPanel     pText           = null;
55
        private JSlider    slider          = null;
56
        private JTextField text            = null;
57
        private int        min             = 0;
58
        private int        max             = 255;
59
        private double     interval        = 1.0;
60
        private int        defaultPos      = 0;
61
        private boolean    decimal         = false;
62
        private boolean    disconnectEvent = false;
63
        private boolean    dragged         = false;
64
        private boolean    showBorder      = false;
65

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

    
95

    
96
        /**
97
         * Constructor vacio
98
         */
99
        public SliderTextContainer() {
100
                this(0, 100, 0);
101
        }
102

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

    
116
        /**
117
         * Dispara el evento del cambio del control
118
         */
119
        protected void callDraggedValue() {
120
                Iterator<SliderListener> acIterator = actionCommandListeners.iterator();
121
                while (acIterator.hasNext()) {
122
                        SliderListener listener = (SliderListener) acIterator.next();
123
                        listener.actionValueDragged(new SliderEvent(this));
124
                }
125
        }
126

    
127
        /**
128
         * A?adir un listener a la lista de eventos
129
         * @param listener
130
         */
131
        public void addValueChangedListener(SliderListener listener) {
132
                if (!actionCommandListeners.contains(listener))
133
                        actionCommandListeners.add(listener);
134
        }
135

    
136
        /**
137
         * Borrar un listener de la lista de eventos
138
         * @param listener
139
         */
140
        public void removeValueChangedListener(SliderListener listener) {
141
                actionCommandListeners.remove(listener);
142
        }
143

    
144
        /**
145
         * Asigna un borde al componente con el texto pasado como
146
         * par?metro
147
         * @param name
148
         */
149
        public void setBorder(String name){
150
                setBorder(BorderFactory.createTitledBorder(null, name, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
151
        }
152

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

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

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

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

    
216
        public void setComponentSize(int w, int h){
217
        }
218

    
219
        /**
220
         * Obtiene el valor del control.
221
         * @return Valor del control en formato double.
222
         */
223
        public double getValue() {
224
                return new Double(getTextField().getText()).doubleValue();
225
        }
226

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

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

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

    
271
        /**
272
         * Obtiene el flag que dice si el valor del campo de texto es
273
         * decimal o entero
274
         * @return true si se admiten valores decimales y false si no se admiten
275
         */
276
        public boolean getDecimal (){
277
                return decimal;
278
        }
279

    
280
        /**
281
         * Obtiene el valor m?ximo del slider
282
         * @return Entero con el valor m?ximo
283
         */
284
        public int getMax() {
285
                return max;
286
        }
287

    
288
        /**
289
         * Asigna el valor m?ximo del slider
290
         * @param Entero con el valor m?ximo
291
         * @deprecated Usar setMaximum en su lugar
292
         */
293
        public void setMax(int max) {
294
                this.setMaximum(max);
295
        }
296

    
297
        /**
298
         * Asigna el valor m?ximo del slider
299
         * @param Entero con el valor m?ximo
300
         */
301
        public void setMaximum(int max) {
302
                this.max = max;
303
                updateInterval();
304
        }
305

    
306
        /**
307
         * Obtiene el valor m?nimo del slider
308
         * @return Entero con el valor m?nimo
309
         */
310
        public int getMin() {
311
                return min;
312
        }
313

    
314
        /**
315
         * Asigna el valor m?nimo del slider
316
         * @param Entero con el valor m?nimo
317
         * @deprecated Usar setMinimum
318
         */
319
        public void setMin(int min) {
320
                this.setMinimum(min);
321
        }
322

    
323
        /**
324
         * Asigna el valor m?nimo del slider
325
         * @param Entero con el valor m?nimo
326
         */
327
        public void setMinimum(int min) {
328
                this.min = min;
329
                updateInterval();
330
        }
331

    
332
        /**
333
         * Actualizar la separacion entre los Ticks
334
         */
335
        private void updateTicks() {
336
                int ticks = (int) ((max-min)/interval) / 40;
337
                getSlider().setMajorTickSpacing(ticks * 4);
338
                slider.setPaintTicks(true);
339
                getSlider().setMinorTickSpacing(ticks);
340
        }
341

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

    
358
        /**
359
         * Obtener el intervalo definido para el slider
360
         * @return
361
         */
362
        public double getInterval() {
363
                return interval;
364
        }
365

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

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

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

    
412
        /*
413
         * (non-Javadoc)
414
         * @see java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent)
415
         */
416
        public void focusLost(FocusEvent e) {
417
                checkDecimalTextAndUpdateSlider();
418
        }
419

    
420
        /*
421
         * (non-Javadoc)
422
         * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
423
         */
424
        public void keyReleased(KeyEvent e) {
425
                if (e.getKeyCode() == 10)
426
                        checkDecimalTextAndUpdateSlider();
427
        }
428

    
429
        /*
430
         * (non-Javadoc)
431
         * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
432
         */
433
        public void mousePressed(MouseEvent e) {
434
                dragged = true;
435
        }
436

    
437
        /*
438
         * (non-Javadoc)
439
         * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
440
         */
441
        public void mouseReleased(MouseEvent e) {
442
                dragged = false;
443
                callChangeValue(false);
444
        }
445

    
446
        public void focusGained(FocusEvent e) {}
447
        public void keyPressed(KeyEvent e) {}
448
        public void keyTyped(KeyEvent e) {}
449
        public void mouseClicked(MouseEvent e) {}
450
        public void mouseEntered(MouseEvent e) {}
451
        public void mouseExited(MouseEvent e) {}
452
}