Statistics
| Revision:

svn-gvsig-desktop / branches / CqCMSDvp / libraries / libCq CMS for java.old / src / org / cresques / ui / raster / FilterRasterDialogPanel.java @ 2312

History | View | Annotate | Download (16 KB)

1
/*
2
 * Cresques Mapping Suite. Graphic Library for constructing mapping applications.
3
 * 
4
 * Copyright (C) 2004-5. 
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 2
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
19
 *
20
 * For more information, contact:
21
 * 
22
 * cresques@gmail.com
23
 */
24
package org.cresques.ui.raster;
25

    
26
import java.awt.event.ActionEvent;
27
import java.awt.event.ActionListener;
28
import java.awt.event.FocusEvent;
29
import java.awt.event.FocusListener;
30
import java.awt.event.KeyEvent;
31
import java.awt.event.KeyListener;
32
import java.awt.event.MouseEvent;
33
import java.awt.event.MouseListener;
34
import java.io.IOException;
35

    
36
import javax.swing.event.ChangeEvent;
37
import javax.swing.event.ChangeListener;
38

    
39
import org.cresques.ui.DefaultTabPanel;
40

    
41
/**
42
 * Panel que contiene todos los paneles de los tabs del cuadro de dialogo 
43
 * de bandas y transparencias
44
 * 
45
 * @author Nacho Brodin <brodin_ign@gva.es>
46
 */
47
public class FilterRasterDialogPanel extends DefaultTabPanel implements ActionListener, ChangeListener, MouseListener, FocusListener, KeyListener{
48
        
49
        //Tama?o de panel interior. El tab de dentro es proporcional
50
        protected int                                                sizePanelX = 450;
51
        protected int                                                 sizePanelY = 260;
52
        private RasterTransparencyPanel         pTrans = null;
53
        protected BandSetupPanel                         pSetup = null;
54
        private EnhancedPanel                                pEnhan = null;
55
        private InfoPanel                                        pInfo = null;
56
        private        int[][]                                                rangeRed = null;
57
        private        int[][]                                                rangeGreen = null;
58
        private        int[][]                                                rangeBlue = null;
59
        
60
        /**
61
         * Propiedades guardadas en una matriz Nx2 con la forma proiedad/valor
62
         */
63
        public Object[][]                                        props = null;
64
        protected        int                                                nbands = 0;
65
        
66
        /**
67
         * Constructor. Inicializa los paneles y propiedades
68
         * @param props        Propiedades
69
         */
70
        public FilterRasterDialogPanel(Object[][] props) {
71
                super();
72
                init(props);
73
        }
74
 
75
        /**
76
         * Constructor
77
         */
78
        public FilterRasterDialogPanel(){
79
                super();
80
        }
81
        
82
        /**
83
         * Inicializa las propiedades
84
         * @param props        Propiedades. Guardadas en una matriz Nx2 con la forma proiedad/valor
85
         */
86
        public void init(Object[][] props){
87
                contentPane.setPreferredSize(new java.awt.Dimension(sizePanelX, sizePanelY));
88
                this.tabbedPane.setPreferredSize(new java.awt.Dimension(sizePanelX, sizePanelY-5));
89
                this.props = props;
90
                initPanels();
91
        }
92
        
93
        /**
94
         * This method initializes this
95
         * 
96
         * @return void
97
         */
98
        protected void initPanels() {
99

    
100
                this.setBounds(0, 0, 355, 230);
101
                pTrans = new RasterTransparencyPanel(this);
102
                pSetup = new BandSetupPanel();
103
                pEnhan = new EnhancedPanel(this);
104
                pInfo = new InfoPanel(this);
105
                this.addTab(pInfo.nom,pInfo);
106
                this.addTab(pSetup.nom, pSetup);
107
                this.addTab(pTrans.nom, pTrans);
108
                this.addTab(pEnhan.nom, pEnhan);
109

    
110
                pTrans.getOpacityCheck().addActionListener(this);
111
                pTrans.getTransparencyCheck().addActionListener(this);
112
                pTrans.getTRojo().addActionListener(this);
113
                pTrans.getTVerde().addActionListener(this);
114
                pTrans.getTAzul().addActionListener(this);
115
                pTrans.getOpacitySlider().addChangeListener(this);
116
                pTrans.getOpacityText().addActionListener(this);
117
                pTrans.getOpacityText().addFocusListener(this);
118
                pTrans.getTRojo().addFocusListener(this);
119
                pTrans.getTVerde().addFocusListener(this);
120
                pTrans.getTAzul().addFocusListener(this);
121
                pTrans.getTRojo().addMouseListener(this);
122
                pTrans.getTVerde().addMouseListener(this);
123
                pTrans.getTAzul().addMouseListener(this);
124
                pTrans.addFocusListener(this);
125
                this.getTab().addFocusListener(this);
126
                
127
                pEnhan.getTailCheck().addActionListener(this);
128
                pEnhan.getTailSlider().addChangeListener(this);
129
                pEnhan.getSinRealceRadioButton().addMouseListener(this);
130
                pEnhan.getLinealDirectoRadioButton().addMouseListener(this);
131
                pEnhan.getTailText().addActionListener(this);
132
                pEnhan.getTailText().addFocusListener(this);
133
                
134
                
135
                //Ocultamos el bot?n de aplicar
136

    
137
                //this.getApplyButton().setVisible(false);
138

    
139
        }
140
        
141
        /**
142
         * Selecciona el panel indicado por index
143
         * @param index        panel seleccionado
144
         */
145
        public void setSelectedIndex(int index){
146
                tabbedPane.setSelectedIndex(index);
147
        }
148
        
149
        /**
150
         * Obtiene el panel que corresponde a la selecci?n de bandas
151
         * @return Panel de selecci?n de bandas
152
         */
153
        public BandSetupPanel getBandSetup(){
154
                return this.pSetup;
155
        }
156
        
157
        /**
158
         * Obtiene el panel que corresponde a la selecci?n de transparencia y opacidad
159
         * @return Panel de transparencia y opacidad
160
         */
161
        public RasterTransparencyPanel getTransparencyPanel(){
162
                return this.pTrans;
163
        }
164
         
165
        /**
166
         * Obtiene el panel que corresponde al filtro de realce
167
         * @return Panel del filtro de realce
168
         */
169
        public EnhancedPanel getEnhancedPanel(){
170
                return this.pEnhan;
171
        }
172
        
173
        /**
174
         * Obtiene el panel Info
175
         * @return InfoPanel
176
         */
177
        public InfoPanel getInfoPanel(){
178
                return this.pInfo;
179
        }
180
        
181
        /**
182
         * Eventos sobre TextField y CheckBox. Controla eventos de checkbox de opacidad, transparencia,
183
         * recorte de colas y los textfield de opacidad, valores de transparencia por banda y
184
         * porcentaje de recorte.
185
         */
186
        public void actionPerformed(ActionEvent e){
187
                
188
                //Evento sobre el checkbox de opacidad
189
                
190
                if(        e.getSource().equals(pTrans.getOpacityCheck())){
191
                        
192
                        //Check de opacidad activado -> Activar controles de opacidad
193
                        if(pTrans.getOpacityCheck().isSelected()){
194
                                pTrans.getOpacitySlider().setEnabled(true);
195
                                pTrans.getOpacityText().setEnabled(true);
196
                        }else{
197
                                pTrans.getOpacitySlider().setEnabled(false);
198
                                pTrans.getOpacityText().setEnabled(false);
199
                        }
200
                        
201
                }
202
                
203
                //Evento sobre el checkbox de transparencia
204
                
205
                if(        e.getSource().equals(pTrans.getTransparencyCheck())){
206
                        
207
                        //Check de opacidad activado -> Activar controles de opacidad
208
                        if(pTrans.getTransparencyCheck().isSelected()){
209
                                if(nbands==1){
210
                                        pTrans.getTRojo().setEnabled(true);
211
                                        pTrans.getTVerde().setEnabled(false);
212
                                        pTrans.getTAzul().setEnabled(false);
213
                             }
214
                             
215
                             if(nbands==2){
216
                                     pTrans.getTRojo().setEnabled(true);
217
                                        pTrans.getTVerde().setEnabled(true);
218
                                        pTrans.getTAzul().setEnabled(false);
219
                             }
220
                             
221
                             if(nbands>=3){
222
                                     pTrans.getTRojo().setEnabled(true);
223
                                        pTrans.getTVerde().setEnabled(true);
224
                                        pTrans.getTAzul().setEnabled(true);
225
                             }
226
                                
227
                        }else{
228
                                pTrans.getTRojo().setEnabled(false);
229
                                pTrans.getTVerde().setEnabled(false);
230
                                pTrans.getTAzul().setEnabled(false);
231
                        }
232
                        
233
                }
234
                
235
                //Evento sobre el textfield de opacidad
236
                
237
                if(        e.getSource().equals(pTrans.getOpacityText())){
238
                        checkOpacityText();
239
                }
240
                
241
                //Evento sobre el textfield de valor para el Rojo
242
                
243
                if(        e.getSource().equals(pTrans.getTRojo())){
244
                        try{
245
                                rangeRed = getTransparencyValues(pTrans.getTRojo().getText());
246
                        }catch(IOException exc){
247
                                pTrans.getTRojo().setText("");
248
                        }
249
                }
250
                
251
                //Evento sobre el textfield de valor para el Verde
252
                
253
                if(        e.getSource().equals(pTrans.getTVerde())){
254
                        try{
255
                                rangeGreen = getTransparencyValues(pTrans.getTVerde().getText());
256
                        }catch(IOException exc){
257
                                pTrans.getTVerde().setText("");
258
                        }
259
                }
260
                        
261
                //Evento sobre el textfield de valor para el Azul
262
                
263
                if(        e.getSource().equals(pTrans.getTAzul())){
264
                        try{
265
                                rangeBlue = getTransparencyValues(pTrans.getTAzul().getText());
266
                        }catch(IOException exc){
267
                                pTrans.getTAzul().setText("");
268
                        }
269
                }
270
                
271
                //Evento sobre el checkbox de Recorte de colas
272
                
273
                if(        e.getSource().equals(pEnhan.getTailCheck())){
274
                        if(pEnhan.getTailCheck().isSelected())
275
                                pEnhan.setActiveTailControl(true);
276
                        else
277
                                pEnhan.setActiveTailControl(false);
278
                        
279
                }
280
                
281
                //Evento sobre el textfield de porcentaje de recorte
282
                
283
                if(        e.getSource().equals(pEnhan.getTailText())){
284
                        checkTailText();
285
                }
286
                                
287
        }
288
        
289
        /**
290
         * Obtiene el rango de valores a partir de la cadena de
291
         * texto introducida por el usuario.
292
         * @param values
293
         */
294
        private int[][] getTransparencyValues(String values)throws IOException{
295
                
296
                int[][]        rangeTransparency = null;
297
                
298
                for(int i=0;i<values.length();i++){
299
                        char c = values.charAt(i);
300
                        
301
                        //Control de caracter valido
302
                        if(c != ':' && c != ','){
303
                                try{
304
                                        Integer.parseInt(String.valueOf(c));
305
                                }catch(Exception exp){
306
                                        System.err.println("Caracteres incorrectos en la cadena:"+c);
307
                                        throw new IOException("Caracteres incorrectos en la cadena.");
308
                                }
309
                        }
310
                                                
311
                        //Control de comienzo por un simbolo
312
                        if(        values.startsWith(",") || values.startsWith(":") ||
313
                                values.endsWith(",") || values.endsWith(":")){
314
                                System.err.println("La cadena empieza o acaba con simbolos incorrectos");
315
                                throw new IOException();
316
                        }
317
                        
318
                        //Control de signos consecutivos
319
                        if(i<values.length()-1){
320
                        
321
                                char cmas = values.charAt(i+1);
322
                                if((c == ',' || c == ':') && (cmas == ',' || cmas == ':')){
323
                                        System.err.println("Signos consecutivos");
324
                                        throw new IOException();
325
                                }
326
                        
327
                        }
328
                                   
329
                        //Control de dos : seguidos con un n?mero en el medio
330
                        if(i<values.length()-3 && c==':'){
331
                                int n=i+1;
332
                                while(n<values.length()-1 && values.charAt(n) != ',' && values.charAt(n) != ':')
333
                                        n++;
334
                                
335
                                char signoSgte = values.charAt(n);
336
                                if(signoSgte == ':'){
337
                                        System.err.println("Dos separadores de rango consecutivos");
338
                                        throw new IOException();
339
                                }
340
                        }
341
                        
342
                }
343
                
344
                //Obtenemos los valores de los intervalos
345
                
346
                if(!values.equals("")){
347
                        String[] t1 = null;
348
                        t1 = values.split("\\,");
349
                        rangeTransparency = new int[t1.length][2];
350
                        for(int i=0;i<t1.length;i++){
351
                                if(t1[i].indexOf(":")==-1){
352
                                        rangeTransparency[i][0] = rangeTransparency[i][1] = Integer.parseInt(t1[i]);
353
                                }else{
354
                                        String[] t2 = null;
355
                                        t2 = t1[i].split("\\:");
356
                                        if(Integer.parseInt(t2[1])>Integer.parseInt(t2[0])){
357
                                                rangeTransparency[i][0] = Integer.parseInt(t2[0]);
358
                                                rangeTransparency[i][1] = Integer.parseInt(t2[1]);
359
                                        }else{
360
                                                rangeTransparency[i][0] = Integer.parseInt(t2[1]);
361
                                                rangeTransparency[i][1] = Integer.parseInt(t2[0]);
362
                                        }
363
                                }
364
                                if(        rangeTransparency[i][0]<0 || rangeTransparency[i][0]>255 ||
365
                                                rangeTransparency[i][1]<0 || rangeTransparency[i][1]>255){
366
                                        System.err.println("Valores fuera de rango (0-255)");
367
                                        throw new IOException();
368
                                }
369
                        }
370
                        return rangeTransparency;
371
                        //for(int i=0;i<rangeTransparency.length;i++)
372
                        //        System.out.println("("+rangeTransparency[i][0]+":"+rangeTransparency[i][1]+")");
373
                }
374
                
375
                return null;
376
        }
377
        
378
        /**
379
         * Devuelve el rango de valores para poner transparencia en el Rojo
380
         * @return
381
         */
382
        public int[][] getRangeRed(){
383
                return rangeRed;
384
        }
385
        
386
        /**
387
         * Devuelve el rango de valores para poner transparencia en el Verde
388
         * @return
389
         */
390
        public int[][] getRangeGreen(){
391
                return rangeGreen;
392
        }
393
        
394
        /**
395
         * Devuelve el rango de valores para poner transparencia en el Azul
396
         * @return
397
         */
398
        public int[][] getRangeBlue(){
399
                return rangeBlue;
400
        }
401
        
402
        /**
403
         * Asigna valore para los rangos
404
         * @param red
405
         * @param green
406
         * @param blue
407
         */
408
        public void setRanges(int[][] red, int[][] green, int[][] blue){
409
                rangeRed = red;
410
                rangeGreen = green;
411
                rangeBlue = blue;
412
                if(pTrans!=null){
413
                        StringBuffer rango = new StringBuffer();
414
                        if(red!=null){
415
                                for(int i=0;i<red.length;i++){
416
                                        if(red[i][0] == red[i][1])
417
                                                rango.append(String.valueOf(red[i][0])+",");
418
                                        else
419
                                                rango.append(String.valueOf(red[i][0])+":"+String.valueOf(red[i][1])+",");
420
                                }
421
                                String t = rango.toString();
422
                                if(t.endsWith(","))
423
                                        t = t.substring(0, t.length()-1);
424
                                pTrans.getTRojo().setText(t);
425
                                pTrans.setActiveTransparencyControl(true);
426
                        }
427
                        
428
                        if(green!=null){
429
                                rango = new StringBuffer();
430
                                for(int i=0;i<green.length;i++){
431
                                        if(green[i][0] == green[i][1])
432
                                                rango.append(String.valueOf(green[i][0])+",");
433
                                        else
434
                                                rango.append(String.valueOf(green[i][0])+":"+String.valueOf(green[i][1])+",");
435
                                }
436
                                String t = rango.toString();
437
                                if(t.endsWith(","))
438
                                        t = t.substring(0, t.length()-1);
439
                                pTrans.getTVerde().setText(t);
440
                                pTrans.setActiveTransparencyControl(true);
441
                        }
442
                        
443
                        if(blue!=null){
444
                                rango = new StringBuffer();
445
                                for(int i=0;i<blue.length;i++){
446
                                        if(blue[i][0] == blue[i][1])
447
                                                rango.append(String.valueOf(blue[i][0])+",");
448
                                        else
449
                                                rango.append(String.valueOf(blue[i][0])+":"+String.valueOf(blue[i][1])+",");
450
                                }
451
                                String t = rango.toString();
452
                                if(t.endsWith(","))
453
                                        t = t.substring(0, t.length()-1);
454
                                pTrans.setActiveTransparencyControl(true);
455
                                pTrans.getTAzul().setText(t);
456
                        }
457
                        
458
                }
459
                
460
        }
461
        
462
        /** 
463
         * Controla que si el formato introducido en el textfield
464
         * de opacidad es numerico se actualiza la posici?n del 
465
         * slider. 
466
         */
467
        private void checkOpacityText(){
468
                String op = pTrans.getOpacityText().getText();
469
                int value = 0;
470
                try{
471
                        if(!op.equals(""))
472
                                value = Integer.parseInt(op);        
473
                        pTrans.getOpacitySlider().setValue(value);
474
                }catch(NumberFormatException exc){
475
                        System.err.println("Formato no numerico");
476
                        pTrans.getOpacityText().setText("100");
477
                        pTrans.getOpacitySlider().setValue(100);
478
                }
479
        }
480
        
481
        /**
482
         * Controla que si el formato introducido en el textfield 
483
         * de Recorte de colas es numerico se actualiza la posici?n del
484
         * slider
485
         */
486
        private void checkTailText(){
487
                String op = pEnhan.getTailText().getText();
488
                double value = 0;
489
                try{
490
                        if(!op.equals(""))
491
                                value = (Double.parseDouble(op)*100)/50;        
492
                        pEnhan.getTailSlider().setValue((int)Math.round(value));
493
                        pEnhan.getTailText().setText(op);
494
                }catch(NumberFormatException exc){
495
                        System.err.println("Formato no numerico");
496
                        pEnhan.getTailText().setText("0.0");
497
                        pEnhan.getTailSlider().setValue(0);
498
                }
499
        }
500
        
501
        /**
502
         * Llama a las funciones que obtienen los valores de los pixels a los que se
503
         * quiere aplicar transparencia desde las cajas de texto.
504
         */
505
        public void checkTransparencyValues(){
506
                
507
                if(!pTrans.getTRojo().getText().equals("")){
508
                        try{
509
                                rangeRed = getTransparencyValues(pTrans.getTRojo().getText());
510
                        }catch(IOException exc){
511
                                pTrans.getTRojo().setText("");
512
                        }
513
                }
514
                if(!pTrans.getTVerde().getText().equals("")){
515
                        try{
516
                                rangeGreen = getTransparencyValues(pTrans.getTVerde().getText());
517
                        }catch(IOException exc){
518
                                pTrans.getTVerde().setText("");
519
                        }
520
                }
521
                if(!pTrans.getTAzul().getText().equals("")){
522
                        try{
523
                                rangeBlue = getTransparencyValues(pTrans.getTAzul().getText());
524
                        }catch(IOException exc){
525
                                pTrans.getTAzul().setText("");
526
                        }
527
                }
528
        }
529
        
530
        /*
531
         * 
532
         */
533
        public void stateChanged(ChangeEvent e){
534
                
535
                //Ponemos el valor del texto de la opacidad de pendiendo de la posici?n del Slider
536
                if(e.getSource().equals(pTrans.getOpacitySlider()))
537
                        pTrans.getOpacityText().setText(String.valueOf(pTrans.getOpacitySlider().getValue()));
538
                
539
                if(e.getSource().equals(pEnhan.getTailSlider()))
540
                        pEnhan.getTailText().setText(String.valueOf((pEnhan.getTailSlider().getValue()>>1))+".0");
541
        }
542
        
543
        public void focusGained(FocusEvent e) {
544
                //pTrans.updateTextBox();
545
        }
546

    
547
        public void focusLost(FocusEvent e) {
548
                checkOpacityText();
549
                checkTailText();
550
                checkTransparencyValues();
551
        }
552
        
553
        public void mouseExited(MouseEvent e){}
554
        public void mouseReleased(MouseEvent e){}        
555
        public void mouseEntered(MouseEvent e){}
556
        
557
        public void mouseClicked(MouseEvent e){}
558
        
559
        public void mousePressed(MouseEvent e){
560
                checkTransparencyValues();
561
                
562
                //Evento sobre los radio button de Realce 
563
                
564
                if(e.getSource().equals(pEnhan.getSinRealceRadioButton())){
565
                        if(pEnhan.getSinRealceRadioButton().isEnabled()){
566
                                pEnhan.getTailCheck().setEnabled(false);
567
                                pEnhan.setActiveTailControl(false);
568
                                pEnhan.getSinRealceRadioButton().setSelected(true);
569
                                pEnhan.setActiveRemoveCheck(false);
570
                        }
571
                }
572
                
573
                if(e.getSource().equals(pEnhan.getLinealDirectoRadioButton())){
574
                        pEnhan.getTailCheck().setEnabled(true);
575
                        pEnhan.setActiveRemoveCheck(true);
576
                        if(pEnhan.getTailCheck().isSelected()){
577
                                pEnhan.setActiveTailControl(true);
578
                        }
579
                }
580
        }
581
        
582
        public void keyTyped(KeyEvent e){
583
        }
584
        public void keyPressed(KeyEvent e){        
585
        }
586
        public void keyReleased(KeyEvent e){}
587
        
588
}
589

    
590

    
591

    
592

    
593

    
594