Statistics
| Revision:

root / trunk / libraries / libCq_CMS_praster / src / org / cresques / ui / raster / listener / CutRasterListener.java @ 8026

History | View | Annotate | Download (14.2 KB)

1
package org.cresques.ui.raster.listener;
2

    
3
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener;
5
import java.awt.event.FocusEvent;
6
import java.awt.event.FocusListener;
7
import java.awt.event.KeyEvent;
8
import java.awt.event.KeyListener;
9
import java.awt.geom.Rectangle2D;
10

    
11
import javax.swing.ImageIcon;
12
import javax.swing.JPanel;
13

    
14
import org.cresques.io.data.ICutRaster;
15
import org.cresques.ui.raster.CutRasterPanel;
16
import org.cresques.util.Utilities;
17

    
18
/**
19
 * Listener para el panel de recorte de imagen.
20
 * @author Nacho Brodin (brodin_ign@gva.es)
21
 */
22
public class CutRasterListener extends JPanel implements ActionListener, KeyListener, FocusListener{
23

    
24
        private CutRasterPanel        panel = null;
25
        private Rectangle2D         extent = null;
26
        private int                         widthPx = 0;
27
        private int                         heightPx = 0;
28
        /**
29
         * Clase que instancia a esta y que implemente ITailRaster.
30
         */
31
        private ICutRaster                                        parent = null;
32
        
33
        
34
        /**
35
         * Contructor
36
         * @param panel
37
         */
38
        public CutRasterListener(CutRasterPanel panel, Rectangle2D extent, int widthPx, int heightPx, ICutRaster parent){
39
                this.panel = panel;
40
                this.extent = extent;
41
                this.widthPx = widthPx;
42
                this.heightPx = heightPx;
43
                this.parent = parent;
44
                
45
                panel.getPCoordPixel().getPDataInput11().getJTextField().addKeyListener(this);
46
                panel.getPCoordPixel().getPDataInput11().getJTextField().addFocusListener(this);
47
                panel.getPCoordPixel().getPDataInput12().getJTextField().addKeyListener(this);
48
                panel.getPCoordPixel().getPDataInput12().getJTextField().addFocusListener(this);
49
                panel.getPCoordPixel().getPDataInput21().getJTextField().addKeyListener(this);
50
                panel.getPCoordPixel().getPDataInput21().getJTextField().addFocusListener(this);
51
                panel.getPCoordPixel().getPDataInput22().getJTextField().addKeyListener(this);
52
                panel.getPCoordPixel().getPDataInput22().getJTextField().addFocusListener(this);
53
                
54
                panel.getPCoordReal().getPDataInput11().getJTextField().addKeyListener(this);
55
                panel.getPCoordReal().getPDataInput11().getJTextField().addFocusListener(this);
56
                panel.getPCoordReal().getPDataInput12().getJTextField().addKeyListener(this);
57
                panel.getPCoordReal().getPDataInput12().getJTextField().addFocusListener(this);
58
                panel.getPCoordReal().getPDataInput21().getJTextField().addKeyListener(this);
59
                panel.getPCoordReal().getPDataInput21().getJTextField().addFocusListener(this);
60
                panel.getPCoordReal().getPDataInput22().getJTextField().addKeyListener(this);
61
                panel.getPCoordReal().getPDataInput22().getJTextField().addFocusListener(this);
62
                
63
                panel.getPResolution().getCCellSize().getJTextField().addKeyListener(this);
64
                panel.getPResolution().getCCellSize().getJTextField().addFocusListener(this);
65
                panel.getPResolution().getCWidth().getJTextField().addKeyListener(this);
66
                panel.getPResolution().getCWidth().getJTextField().addFocusListener(this);
67
                panel.getPResolution().getCHeight().getJTextField().addKeyListener(this);
68
                panel.getPResolution().getCHeight().getJTextField().addFocusListener(this);
69
        
70
                panel.getPResize().getButton(0).addActionListener(this);
71
                panel.getPResize().getButton(1).addActionListener(this);
72
                panel.getPResize().getButton(2).addActionListener(this);
73
        }
74
        
75
        /**
76
         * Comprueba si todos los campos de coordenadas est?n llenos
77
         * @return true si todos los campos de coordenadas est?n llenos y false si hay alguno vacio.
78
         */
79
        private boolean isFieldsFill(){
80
                if(        panel.getPCoordPixel().getPDataInput11().getJTextField().equals("") ||
81
                        panel.getPCoordPixel().getPDataInput12().getJTextField().equals("") ||
82
                        panel.getPCoordPixel().getPDataInput21().getJTextField().equals("") ||
83
                        panel.getPCoordPixel().getPDataInput22().getJTextField().equals("") ||
84
                        panel.getPCoordReal().getPDataInput11().getJTextField().equals("") ||
85
                        panel.getPCoordReal().getPDataInput12().getJTextField().equals("") ||
86
                        panel.getPCoordReal().getPDataInput21().getJTextField().equals("") ||
87
                        panel.getPCoordReal().getPDataInput22().getJTextField().equals(""))
88
                        return false;
89
                return true;
90
        }
91
        
92
        /**
93
         * Obtiene un rectangulo con la ventana en pixeles. Estos datos son leidos desde el interfaz.
94
         * @return Rectangle2D
95
         */
96
        private Rectangle2D getPxWindow(){        
97
                if(panel.getPxMinX() == 0 && panel.getPxMinY() == 0 && panel.getPxMaxX() == 0 && panel.getPxMaxY() == 0)
98
                        return null;
99
                return new Rectangle2D.Double(panel.getPxMinX(), panel.getPxMinY(), Math.abs(panel.getPxMaxX() - panel.getPxMinX()), Math.abs(panel.getPxMaxY() - panel.getPxMinY()));
100
        }
101
        
102
        /**
103
         * Obtiene un rectangulo con la ventana en coordenadas reales. Estos datos son leidos desde el interfaz.
104
         * @return Rectangle2D
105
         */
106
        private Rectangle2D getMapWindow(){
107
                if(panel.getWcMinX() == 0 && panel.getWcMinY() == 0 && panel.getWcMaxX() == 0 && panel.getWcMaxY() == 0)
108
                        return null;
109
                return new Rectangle2D.Double(panel.getWcMinX(), panel.getWcMaxY(), Math.abs(panel.getWcMaxX() - panel.getWcMinX()), Math.abs(panel.getWcMaxY() - panel.getWcMinY()));
110
        }
111
        
112
        /**
113
         * Recalcula el valor de los campos de coordenadas reales y pixel. Cuando modificamos alg?n campo
114
         * de las coordenadas reales se modifican los pixeles y viceversa.
115
         * @param modifyPx true si se ha modificado alg?n campo de coordenadas pixel y false si se ha modificado
116
         * alg?n campo de las coordenadas reales.
117
         */
118
        private void recalcCoordFields(boolean modifyPx){
119
                if(isFieldsFill()){
120
                        try{
121
                                if(modifyPx){
122
                                        Rectangle2D pxWindow = getPxWindow();        
123
                                        if(pxWindow == null)
124
                                                return;
125
                                        Rectangle2D newWC = Utilities.getMapRectFromPxRect(extent, widthPx, heightPx, pxWindow);
126
                                        panel.setCoorRealFromDouble(newWC.getMinX(), newWC.getMaxY(), newWC.getMaxX(), newWC.getMinY(), 6);
127
                                        panel.setWidthText(pxWindow.getWidth(), 0);
128
                                        panel.setHeightText(pxWindow.getHeight(), 0);
129
                                        panel.setCellSizeText((newWC.getWidth() / pxWindow.getWidth()), 4);
130
                                        panel.setRelWidthHeight((double)(pxWindow.getWidth() / pxWindow.getHeight()));
131
                                        parent.setInitValuesToSize(pxWindow.getWidth(), pxWindow.getHeight());
132
                                }else{
133
                                        Rectangle2D mapWindow = getMapWindow();
134
                                        if(mapWindow == null)
135
                                                return;
136
                                        Rectangle2D newPx = Utilities.getPxRectFromMapRect(extent, widthPx, heightPx, mapWindow);
137
                                        panel.setCoorPixelFromDouble(newPx.getMinX(), newPx.getMinY(), newPx.getMaxX(), newPx.getMaxY(), 3);
138
                                        panel.setWidthText(newPx.getWidth(), 0);
139
                                        panel.setHeightText(newPx.getHeight(), 0);
140
                                        panel.setCellSizeText((mapWindow.getWidth() / newPx.getWidth()), 4);
141
                                        panel.setRelWidthHeight((double)(newPx.getWidth() / newPx.getHeight()));
142
                                        parent.setInitValuesToSize(newPx.getWidth(), newPx.getHeight());
143
                                }
144
                                                                
145
                        }catch(NumberFormatException ex){
146
                                return;
147
                        }
148
                }
149
        }
150

    
151
        
152
        public void actionPerformed(ActionEvent e) {
153
                //Bot?n de selecci?n del extent completo
154
                //Modificamos las coordenadas reales y recalculamos las coordenadas pixel
155
                if (e.getSource() == panel.getPResize().getButton(0)){
156
                        panel.setCoorRealFromDouble(extent.getMinX(), extent.getMaxY(), extent.getMaxX(), extent.getMinY(), 6);
157
                           Rectangle2D r = org.cresques.util.Utilities.getPxRectFromMapRect(extent, widthPx, heightPx, extent);
158
                           panel.setCoorPixelFromDouble(r.getMinX(), r.getMinY(), r.getMaxX(), r.getMaxY(), 3);
159
                           panel.setWidthText(r.getWidth(), 0);
160
                           panel.setHeightText(r.getHeight(), 0);
161
                           panel.setCellSizeText((extent.getWidth() / r.getWidth()), 4);
162
                           panel.setRelWidthHeight((double)(r.getWidth() / r.getHeight()));
163
                           parent.setInitValuesToSize(r.getWidth(), r.getHeight());
164
                }
165
                
166
                //Bot?n de selecci?n de la herramienta de seleccionar desde la vista
167
                if (e.getSource() == panel.getPResize().getButton(1)){
168
                        parent.selectToolButton();
169
                }
170
                        
171
                //Bot?n de contraer y expandir el panel
172
                if (e.getSource() == panel.getPResize().getButton(2))
173
                        panel.contractExpandPanel();
174
        }
175

    
176
        public void keyPressed(KeyEvent e) {
177
                // TODO Auto-generated method stub
178
                
179
        }
180

    
181
        /**
182
         * Al producirse un evento de perdida de foco o pulsaci?n de "enter" en un campo de texto de coordenadas
183
         * hay que asignar el nuevo valor introducido. 
184
         * @param obj
185
         */
186
        private void eventJTextField(Object obj){
187
                try{
188
                        if(        obj == panel.getPCoordPixel().getPDataInput11().getJTextField())
189
                                panel.setCoorPixelFromDouble(Double.valueOf(panel.getPCoordPixel().getPDataInput11().getJTextField().getText()).doubleValue(), 
190
                                                panel.getPxMinY(), panel.getPxMaxX(), panel.getPxMaxY(), 3);
191
                        if(        obj == panel.getPCoordPixel().getPDataInput12().getJTextField())
192
                                panel.setCoorPixelFromDouble(panel.getPxMinX(), Double.valueOf(panel.getPCoordPixel().getPDataInput12().getJTextField().getText()).doubleValue(), 
193
                                                panel.getPxMaxX(), panel.getPxMaxY(), 3);
194
                        if(        obj == panel.getPCoordPixel().getPDataInput21().getJTextField())
195
                                panel.setCoorPixelFromDouble(panel.getPxMinX(), panel.getPxMinY(),
196
                                                Double.valueOf(panel.getPCoordPixel().getPDataInput21().getJTextField().getText()).doubleValue(), panel.getPxMaxY(), 3);
197
                        if(        obj == panel.getPCoordPixel().getPDataInput22().getJTextField())
198
                                panel.setCoorPixelFromDouble(panel.getPxMinX(), panel.getPxMinY(),
199
                                                panel.getPxMaxX(), Double.valueOf(panel.getPCoordPixel().getPDataInput22().getJTextField().getText()).doubleValue(), 3);
200
                        
201
                        if(        obj == panel.getPCoordReal().getPDataInput11().getJTextField())
202
                                panel.setCoorRealFromDouble(Double.valueOf(panel.getPCoordReal().getPDataInput11().getJTextField().getText()).doubleValue(), 
203
                                                panel.getWcMinY(), panel.getWcMaxX(), panel.getWcMaxY(), 6);
204
                        if(        obj == panel.getPCoordReal().getPDataInput12().getJTextField())
205
                                panel.setCoorRealFromDouble(panel.getWcMinX(), Double.valueOf(panel.getPCoordReal().getPDataInput12().getJTextField().getText()).doubleValue(), 
206
                                                panel.getWcMaxX(), panel.getWcMaxY(), 6);
207
                        if(        obj == panel.getPCoordReal().getPDataInput21().getJTextField())
208
                                panel.setCoorRealFromDouble(panel.getWcMinX(), panel.getWcMinY(),
209
                                                Double.valueOf(panel.getPCoordReal().getPDataInput21().getJTextField().getText()).doubleValue(), panel.getWcMaxY(), 6);
210
                        if(        obj == panel.getPCoordReal().getPDataInput22().getJTextField())
211
                                panel.setCoorRealFromDouble(panel.getWcMinX(), panel.getWcMinY(),
212
                                                panel.getWcMaxX(), Double.valueOf(panel.getPCoordReal().getPDataInput22().getJTextField().getText()).doubleValue(), 6);
213
                }catch(NumberFormatException ex1){
214
                        //No hay valores parseables a decimal en las cajas de texto. No hacemos nada
215
                }
216
        }
217
        
218
        /**
219
         * Cuando se presiona la tecla enter sobre los campos de texto se recalculan las
220
         * coordenadas. Si se ha presionado sobre los cuadro correspondientes a las coordenadas
221
         * pixel se recalculan las coordenadas del mundo real y viceversa.
222
         */
223
        public void keyReleased(KeyEvent e) {
224
                if(e.getKeyCode() == 10){
225
                        if(        e.getSource() == panel.getPCoordPixel().getPDataInput11().getJTextField() ||
226
                                e.getSource() == panel.getPCoordPixel().getPDataInput12().getJTextField() ||
227
                                e.getSource() == panel.getPCoordPixel().getPDataInput21().getJTextField() ||
228
                                e.getSource() == panel.getPCoordPixel().getPDataInput22().getJTextField()){
229
                                eventJTextField(e.getSource());
230
                                recalcCoordFields(true);
231
                        }
232
                        if(        e.getSource() == panel.getPCoordReal().getPDataInput11().getJTextField() ||
233
                                e.getSource() == panel.getPCoordReal().getPDataInput12().getJTextField() ||
234
                                e.getSource() == panel.getPCoordReal().getPDataInput21().getJTextField() ||
235
                                e.getSource() == panel.getPCoordReal().getPDataInput22().getJTextField()){
236
                                eventJTextField(e.getSource());
237
                                recalcCoordFields(false);
238
                        }
239
                        if(e.getSource() == panel.getPResolution().getCCellSize().getJTextField()){
240
                                //Cambiamos PS ==> wPx=wWC/PS  &   hPx=wPx/rel
241
                                double ps = 0;
242
                                try{
243
                                        ps = Double.parseDouble(panel.getPResolution().getCCellSize().getJTextField().getText());
244
                                }catch(NumberFormatException ex){
245
                                        return;
246
                                }
247
                                Rectangle2D mapWindow = getMapWindow();
248
                                Rectangle2D pxWindow = getPxWindow();
249
                                if(mapWindow == null || pxWindow ==  null)
250
                                        return;
251
                                panel.setWidthText(mapWindow.getWidth() / ps, 0);
252
                                panel.setHeightText((mapWindow.getWidth() / ps) / panel.getRelWidthHeight(), 0);
253
                        }
254
                        
255
                        if(e.getSource() == panel.getPResolution().getCWidth().getJTextField()){
256
                                //Cambiamos wPx ==> hPx=wPx/rel  &   PS=wWC/wPx
257
                                double wPx = 0;
258
                                try{
259
                                        wPx = Double.parseDouble(panel.getPResolution().getCWidth().getJTextField().getText());
260
                                }catch(NumberFormatException ex){
261
                                        return;
262
                                }
263
                                Rectangle2D mapWindow = getMapWindow();
264
                                Rectangle2D pxWindow = getPxWindow();
265
                                if(mapWindow == null || pxWindow ==  null)
266
                                        return;
267
                                panel.setWidthText(wPx, 0);
268
                                panel.setHeightText(wPx / panel.getRelWidthHeight(), 0);
269
                                panel.setCellSizeText((mapWindow.getWidth() / wPx), 4);
270
                        }
271
                        
272
                        if(e.getSource() == panel.getPResolution().getCHeight().getJTextField()){
273
                                //Cambiamos hPx ==> wPx=rel*wPx  &   PS=hWC/hPx                        
274
                                double hPx = 0;
275
                                try{
276
                                        hPx = Double.parseDouble(panel.getPResolution().getCHeight().getJTextField().getText());
277
                                }catch(NumberFormatException ex){
278
                                        return;
279
                                }
280
                                Rectangle2D mapWindow = getMapWindow();
281
                                Rectangle2D pxWindow = getPxWindow();
282
                                if(mapWindow == null || pxWindow ==  null)
283
                                        return;
284
                                panel.setWidthText(hPx * panel.getRelWidthHeight(), 0);
285
                                panel.setHeightText(hPx, 0);
286
                                panel.setCellSizeText((mapWindow.getHeight() / hPx), 4);
287
                        }
288
                }
289
        }
290

    
291
        public void keyTyped(KeyEvent e) {
292

    
293
        }
294

    
295
        public void focusGained(FocusEvent e) {
296
                // TODO Auto-generated method stub
297
                
298
        }
299

    
300
        /**
301
         * Cuando se pierde el foco alguno de los campos de texto se recalculan las
302
         * coordenadas. Si lo han perdido los cuadros correspondientes a las coordenadas
303
         * pixel se recalculan las coordenadas del mundo real y viceversa.
304
         */
305
        public void focusLost(FocusEvent e) {
306
                if(        e.getSource() == panel.getPCoordPixel().getPDataInput11().getJTextField() ||
307
                                e.getSource() == panel.getPCoordPixel().getPDataInput12().getJTextField() ||
308
                                e.getSource() == panel.getPCoordPixel().getPDataInput21().getJTextField() ||
309
                                e.getSource() == panel.getPCoordPixel().getPDataInput22().getJTextField()){
310
                                eventJTextField(e.getSource());
311
                                recalcCoordFields(true);
312
                }
313
                if(        e.getSource() == panel.getPCoordReal().getPDataInput11().getJTextField() ||
314
                        e.getSource() == panel.getPCoordReal().getPDataInput12().getJTextField() ||
315
                        e.getSource() == panel.getPCoordReal().getPDataInput21().getJTextField() ||
316
                        e.getSource() == panel.getPCoordReal().getPDataInput22().getJTextField()){
317
                        eventJTextField(e.getSource());
318
                        recalcCoordFields(false);
319
                }
320
        }
321
        
322
        
323
}