Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / branches / org.gvsig.raster.tools_dataaccess_refactoring / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / saveviewtoraster / ui / listener / DataInputListener.java @ 2340

History | View | Annotate | Download (16 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
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., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.tools.app.basic.tool.saveviewtoraster.ui.listener;
23

    
24
import java.awt.event.ActionEvent;
25
import java.awt.event.ActionListener;
26
import java.awt.event.FocusEvent;
27
import java.awt.event.FocusListener;
28
import java.awt.event.KeyEvent;
29
import java.awt.event.KeyListener;
30
import java.awt.event.MouseEvent;
31
import java.awt.event.MouseListener;
32
import java.beans.PropertyChangeEvent;
33
import java.beans.PropertyChangeListener;
34
import java.io.File;
35
import java.util.EventObject;
36

    
37
import org.gvsig.andami.PluginServices;
38
import org.gvsig.fmap.dal.coverage.RasterLocator;
39
import org.gvsig.fmap.dal.coverage.util.MathUtils;
40
import org.gvsig.fmap.mapcontext.layers.FLayers;
41
import org.gvsig.gui.beans.datainput.DataInputContainerListener;
42
import org.gvsig.gui.beans.swing.JFileChooser;
43
import org.gvsig.raster.swing.RasterSwingLibrary;
44
import org.gvsig.raster.tools.algorithm.swing.saveraster.SaveRasterPanel;
45
import org.gvsig.raster.util.ExtendedFileFilter;
46

    
47
/**
48
 * Listener to synchronize the components in the main panel
49
 *
50
 * @author Nacho Brodin (nachobrodin@gmail.com)
51
 */
52
public class DataInputListener implements ActionListener, MouseListener, FocusListener, KeyListener, DataInputContainerListener, PropertyChangeListener {
53
        final private static long        serialVersionUID         = -3370601314380922368L;
54
        private SaveRasterPanel          controlPanel             = null;
55
        private String                   fName                    = null;
56
        private boolean                  enableEventValueChanged  = true;
57
        private MathUtils                math                     = RasterLocator.getManager().getMathUtils();
58
        //private ViewPort                 viewPort                 = null;
59
        //private FLayers                  layers                   = null;
60
        
61
        /**
62
         * This method initializes
63
         *
64
         */
65
        public DataInputListener(SaveRasterPanel controlPanel) {
66
                super();
67
                this.controlPanel = controlPanel;
68
                initialize();
69
        }
70
        
71
        public void setLayers(FLayers layers) {
72
                //this.layers = layers;
73
                //this.viewPort = layers.getMapContext().getViewPort();
74
        }
75

    
76
        /**
77
         * This method initializes this
78
         *
79
         * @return void
80
         */
81
        void initialize() {
82
                controlPanel.addPropertiesChangeListener(this);
83
                controlPanel.addValueChangedListener(this);
84
                controlPanel.getCbResolution().addKeyListener(this);
85
                controlPanel.addActionListener(this);
86
        }
87
        
88
        /**
89
         * Checks a integer value
90
         * @param value
91
         * @return
92
         */
93
        private boolean checkInteger(String value) {
94
                if(value == null)
95
                        return false;
96
                if(value.length() > 8) {
97
                        RasterSwingLibrary.messageBoxError("output_too_big", controlPanel);
98
                        return false;
99
                }
100
                int v = 0;
101
                try {
102
                        v = Integer.parseInt(value);
103
                } catch (NumberFormatException e) {
104
                        return false;
105
                }
106
                if(v <= 0)
107
                        return false;
108
                return true;
109
        }
110
        
111
        /**
112
         * Checks a double value
113
         * @param value
114
         * @return
115
         */
116
        private boolean checkDouble(String value) {
117
                if(value == null)
118
                        return false;
119
                double v = 0;
120
                try {
121
                        v = Double.parseDouble(value);
122
                } catch (NumberFormatException e) {
123
                        return false;
124
                }
125
                if(v <= 0)
126
                        return false;
127
                return true;
128
        }
129

    
130
        /**
131
         * Calculo del tama?o en pixels de la imagen a partir de las coordenadas del
132
         * mundo real, la escala y los puntos por pulgada
133
         */
134
        private void recalcParams(Object obj, Object oldValue) {
135
                controlPanel.validateFields();
136
                double widthMts = 0;
137
                double heightMts = 0;
138
                try {
139
                        double[] size = calcSizeInMts();
140
                        if(size != null) {
141
                                widthMts = size[0];
142
                                heightMts = size[1];
143
                        } else {
144
                                return;
145
                        }
146
                } catch (NumberFormatException e) {
147
                        return;
148
                }
149

    
150
                //M?todo por tama?o seleccionado
151
                if(controlPanel.isPixelMethodSelected()) {
152
                        modifyPixelMethod(obj, widthMts, heightMts, oldValue);
153
                } else {
154
                        modifyPrintMethod(obj, widthMts, heightMts, oldValue);
155
                }
156
                calculateFileSize();
157
        }
158
        
159
        /**
160
         * When the event comes from a component in the pixel size method
161
         * @param obj
162
         * @param widthMts
163
         * @param heightMts
164
         * @param oldValue
165
         */
166
        private void modifyPixelMethod(Object obj, double widthMts, double heightMts, Object oldValue) {
167
                double rel = (widthMts / heightMts);
168
                if(        controlPanel.getComponentID(obj) == SaveRasterPanel.WIDTH_COMPONENT &&
169
                                !controlPanel.getWidthPxValue().equals("")) {
170
                        if(!checkInteger(controlPanel.getWidthPxValue())) {
171
                                controlPanel.setWidthPxValue(String.valueOf(oldValue));
172
                                return;
173
                        }
174
                        int w = Integer.parseInt(controlPanel.getWidthPxValue());
175
                        int h = (int)Math.floor(w / rel);
176
                        controlPanel.setHeightPxValue(String.valueOf(h));
177
                        controlPanel.setCellSize(String.valueOf(widthMts / w));
178
                } else if(        controlPanel.getComponentID(obj) == SaveRasterPanel.HEIGHT_COMPONENT &&
179
                                !controlPanel.getHeightPxValue().equals("")) {
180
                        if(!checkInteger(controlPanel.getHeightPxValue())) {
181
                                controlPanel.setHeightPxValue(String.valueOf(oldValue));
182
                                return;
183
                        }
184
                        int h = Integer.parseInt(controlPanel.getHeightPxValue());
185
                        int w = (int)Math.ceil(h * rel);
186
                        controlPanel.setWidthPxValue(String.valueOf(w));
187
                        controlPanel.setCellSize(String.valueOf(widthMts / w));
188
                } else if(        controlPanel.getComponentID(obj) == SaveRasterPanel.CELLSIZE_COMPONENT &&
189
                                !controlPanel.getScaleValue().equals("")) {
190
                        if(!checkDouble(controlPanel.getCellSize())) {
191
                                controlPanel.setCellSize(String.valueOf(oldValue));
192
                                return;
193
                        }
194
                        double cellsize = Double.parseDouble(controlPanel.getCellSize());
195
                        int w = (int)Math.round(widthMts / cellsize);
196
                        int h = (int)Math.round(heightMts / cellsize);
197
                        if((widthMts / cellsize) >= Integer.MAX_VALUE || (heightMts / cellsize) >= Integer.MAX_VALUE) {
198
                                RasterSwingLibrary.messageBoxError("output_too_big", controlPanel);
199
                                controlPanel.setCellSize(String.valueOf(oldValue));
200
                                return;
201
                        }
202
                        controlPanel.setWidthPxValue(String.valueOf(w));
203
                        controlPanel.setHeightPxValue(String.valueOf(h));
204
                        controlPanel.setCellSize(String.valueOf(widthMts / w));
205
                } else if(controlPanel.getComponentID(obj) == SaveRasterPanel.ULX_COMPONENT || 
206
                        controlPanel.getComponentID(obj) == SaveRasterPanel.ULY_COMPONENT ||
207
                        controlPanel.getComponentID(obj) == SaveRasterPanel.LRX_COMPONENT ||
208
                        controlPanel.getComponentID(obj) == SaveRasterPanel.LRY_COMPONENT) {
209
                        int w = Integer.parseInt(controlPanel.getWidthPxValue());
210
                        if(w == 0)
211
                                return;
212
                        controlPanel.setCellSize(String.valueOf(widthMts / w));
213
                }
214
        }
215
        
216
        /**
217
         * When the event comes from a component in the print method
218
         * @param obj
219
         * @param widthMts
220
         * @param heightMts
221
         * @param oldValue
222
         */
223
        private void modifyPrintMethod(Object obj, double widthMts, double heightMts, Object oldValue) {
224
                double rel = (widthMts / heightMts);
225
                if(        controlPanel.getComponentID(obj) == SaveRasterPanel.WCMS_COMPONENT &&
226
                                !controlPanel.getValueXCms().equals("")) {
227
                        if(!checkInteger(controlPanel.getValueXCms())) {
228
                                controlPanel.setValueXCms(String.valueOf(oldValue));
229
                                return;
230
                        }
231
                        int cmsx = Integer.parseInt(controlPanel.getValueXCms());
232
                        int cmsy = (int)Math.round(cmsx / rel);
233
                        int scale = (int)Math.round(widthMts / (cmsx / 100D));
234
                        controlPanel.setValueYCms(String.valueOf(cmsy));
235
                        controlPanel.setScaleValue(String.valueOf(scale));
236
                } else if(        controlPanel.getComponentID(obj) == SaveRasterPanel.HCMS_COMPONENT &&
237
                                !controlPanel.getValueYCms().equals("")) {
238
                        if(!checkInteger(controlPanel.getValueYCms())) {
239
                                controlPanel.setValueYCms(String.valueOf(oldValue));
240
                                return;
241
                        }
242
                        int cmsy = Integer.parseInt(controlPanel.getValueYCms());
243
                        int cmsx = (int)Math.round(cmsy * rel);
244
                        int scale = (int)Math.round(widthMts / (cmsx / 100D));
245
                        controlPanel.setValueXCms(String.valueOf(cmsx));
246
                        controlPanel.setScaleValue(String.valueOf(scale));
247
                } else if(        controlPanel.getComponentID(obj) == SaveRasterPanel.SCALE_COMPONENT &&
248
                                !controlPanel.getScaleValue().equals("")) {
249
                        if(!checkInteger(controlPanel.getScaleValue())) {
250
                                controlPanel.setScaleValue(String.valueOf(oldValue));
251
                                return;
252
                        }
253
                        int scale = Integer.parseInt(controlPanel.getScaleValue());
254
                        int cmsx = (int)Math.round((widthMts / scale) * 100D);
255
                        int cmsy = (int)Math.round((heightMts / scale) * 100D);
256
                        controlPanel.setValueXCms(String.valueOf(cmsx));
257
                        controlPanel.setValueYCms(String.valueOf(cmsy));
258
                        scale = (int)Math.round(widthMts / (cmsx / 100D));
259
                        controlPanel.setScaleValue(String.valueOf(scale));
260
                } else if(controlPanel.getComponentID(obj) == SaveRasterPanel.ULX_COMPONENT || 
261
                                controlPanel.getComponentID(obj) == SaveRasterPanel.ULY_COMPONENT ||
262
                                controlPanel.getComponentID(obj) == SaveRasterPanel.LRX_COMPONENT ||
263
                                controlPanel.getComponentID(obj) == SaveRasterPanel.LRY_COMPONENT) {
264
                        int cmsx = Integer.parseInt(controlPanel.getValueXCms());
265
                        if(cmsx == 0)
266
                                return;
267
                        int scale = (int)Math.round(widthMts / (cmsx / 100D));
268
                        controlPanel.setScaleValue(String.valueOf(scale));
269
                }
270
                calculateSizePxResult();
271
        }
272

    
273
        /**
274
         * Calculates the size in pixels for the print method
275
         */
276
        private void calculateSizePxResult() {
277
                int resolution = Integer.parseInt((String)controlPanel.getCbResolution().getSelectedItem());
278
                int cmsx = Integer.parseInt(controlPanel.getValueXCms());
279
                int cmsy = Integer.parseInt(controlPanel.getValueYCms());
280
                int wpx = (int)Math.round((cmsx * MathUtils.INCHESCM) * resolution);
281
                int hpx = (int)Math.round((cmsy * MathUtils.INCHESCM) * resolution);
282
                controlPanel.setSizePxPrintResult(wpx, hpx);
283
        }
284

    
285
        /**
286
         * Calculates the output file size in megabytes
287
         */
288
        private void calculateFileSize() {
289
                int w = 0;
290
                int h = 0;
291
                if(controlPanel.isPixelMethodSelected()) {
292
                        w = Integer.parseInt(controlPanel.getWidthPxValue());
293
                        h = Integer.parseInt(controlPanel.getHeightPxValue());
294
                } else {
295
                        w = controlPanel.getWidthPxPrint();
296
                        h = controlPanel.getHeightPxPrint();
297
                }
298
                controlPanel.setSizeMB(math.clipDecimals((((long)w * (long)h * (long)3) / 1048576D), 1));
299
        }
300

    
301
        /**
302
         * Calcula el tama?o en mtrs a partir de las coordenadas.
303
         * 
304
         * @return
305
         * @throws NumberFormatException
306
         */
307
        private double[] calcSizeInMts()throws NumberFormatException {
308
                double lrx = Double.parseDouble(controlPanel.getValueLRX());
309
                double lry = Double.parseDouble(controlPanel.getValueLRY());
310
                double ulx = Double.parseDouble(controlPanel.getValueULX());
311
                double uly = Double.parseDouble(controlPanel.getValueULY());
312

    
313
                double distWidth = 0;
314
                double distHeight = 0;
315
                
316
                /*if(!controlPanel.isPixelMethodSelected() && !viewPort.getProjection().isProjected()) {
317
                        Point2D pUL = new Point2D.Double(ulx, uly);
318
                        Point2D pUR = new Point2D.Double(lrx, uly);
319
                        Point2D pLR = new Point2D.Double(lrx, lry);
320
                        distWidth = viewPort.distanceWorld(pUL, pUR);
321
                        distHeight = viewPort.distanceWorld(pUR, pLR);
322
                        double[] trans2Meter = MapContext.getDistanceTrans2Meter();
323
                        distWidth = distWidth / trans2Meter[viewPort.getDistanceUnits()];
324
                        distHeight = distHeight / trans2Meter[viewPort.getDistanceUnits()];
325
                } else {*/
326
                        if (ulx > lrx)
327
                                distWidth = ulx - lrx;
328
                        else
329
                                distWidth = lrx - ulx;
330

    
331
                        if (uly > lry)
332
                                distHeight = uly - lry;
333
                        else
334
                                distHeight = lry - uly;
335
                //}
336

    
337
                return new double[]{distWidth, distHeight};
338
        }
339

    
340
        /**
341
         * Gestiona los eventos del cambio de escala de la imagen y lla apertura del
342
         * dialogo de selecci?n del nombre del fichero.
343
         */
344
        public void actionPerformed(ActionEvent e) {
345
                Object obj = e.getSource();
346

    
347
                // Selector de Fichero sobre el cual se va a salvar a raster
348
                if (obj.equals(controlPanel.getBSelect())) {
349
                        JFileChooser chooser = new JFileChooser("DATA_INPUT_LISTENER", JFileChooser.getLastPath("DATA_INPUT_LISTENER", null));
350
                        chooser.setDialogTitle(PluginServices.getText(this, "seleccionar_fichero"));
351
                        chooser.setAcceptAllFileFilterUsed(false);
352

    
353
                        // A?adimos las extensiones que hayan sido registradas en el driver
354
                        String[] extList = RasterLocator.getManager().getProviderServices().getDriversExtensions();
355
                        ExtendedFileFilter selectedFilter = null;
356
                        for (int i = 0; i < extList.length; i++) {
357
                                ExtendedFileFilter fileFilter = new ExtendedFileFilter(extList[i]);
358
                                chooser.addChoosableFileFilter(fileFilter);
359
                                if (extList[i].toLowerCase().equals("tif"))
360
                                        selectedFilter = fileFilter;
361
                        }
362
                        if (selectedFilter != null)
363
                                chooser.setFileFilter(selectedFilter);
364

    
365
                        int returnVal = chooser.showOpenDialog(controlPanel.getComponent());
366

    
367
                        if (returnVal == JFileChooser.APPROVE_OPTION) {
368
                                ExtendedFileFilter fileFilter = ((ExtendedFileFilter) chooser.getFileFilter());
369

    
370
                                fName = chooser.getSelectedFile().toString();
371
                                fName = fileFilter.getNormalizedFilename(chooser.getSelectedFile());
372
                                String ext = RasterLocator.getManager().getFileUtils().getExtensionFromFileName(fName);
373

    
374
                                controlPanel.getBProperties().setText(
375
                                                PluginServices.getText(this, "props") + " " + RasterLocator.getManager().getProviderServices().getWriteDriverType(ext));
376

    
377
                                controlPanel.getBProperties().setEnabled(true);
378
                                controlPanel.getLFileName().setText(
379
                                                fName.substring(fName.lastIndexOf(File.separator) + 1, fName.length()));
380

    
381
                                JFileChooser.setLastPath("DATA_INPUT_LISTENER", chooser.getSelectedFile());
382
                        }
383
                }
384
                
385
                if(        controlPanel.getComponentID(obj) == SaveRasterPanel.RESOLUTION_COMPONENT) {
386
                        if(!enableEventValueChanged)
387
                                return;
388
                        enableEventValueChanged = false;
389
                        this.recalcParams(e.getSource(), null);
390
                        enableEventValueChanged = true;
391
                }
392
                
393
                /*if(controlPanel.getComponentID(obj) == SaveRasterPanel.PRINT_SELECTOR) {
394
                        IProjection viewProj = viewPort.getProjection();
395
                        for (int i = 0; i < layers.getLayersCount(); i++) {
396
                                FLayer lyr = layers.getLayer(i);
397
                                if(lyr.getProjection() == null || !lyr.getProjection().getAbrev().equals(viewProj.getAbrev())) {
398
                                        RasterToolsUtil.messageBoxInfo("different_projection", controlPanel);
399
                                        break;
400
                                }
401
                        }
402
                        
403
                }*/
404
                
405
                if(        controlPanel.getComponentID(obj) == SaveRasterPanel.PIXEL_SELECTOR || 
406
                        controlPanel.getComponentID(obj) == SaveRasterPanel.PRINT_SELECTOR) {
407
                        calculateFileSize();
408
                }
409
        }
410

    
411
        /**
412
         * Devuelve el nombre del fichero seleccionado
413
         *
414
         * @return Nombre del fichero seleccionado
415
         */
416
        public String getFileName() {
417
                return fName;
418
        }
419

    
420
        /**
421
         * Pone a null el valor de la variable con el valor del fichero de texto.
422
         */
423
        public void resetFileName() {
424
                fName = null;
425
                controlPanel.getLFileName().setText("");
426
        }
427

    
428
        public void mouseClicked(MouseEvent e) {
429
        }
430

    
431
        /**
432
         * Recalcula el tama?o de la imagen con los datos existentes y activa o
433
         * desactiva los botones.
434
         */
435
        public void focusLost(FocusEvent e) {
436
        }
437

    
438
        /**
439
         * Activa o Desactiva los botones a trav?s de la funci?n que valida los
440
         * campos
441
         */
442
        public void keyTyped(KeyEvent e) {
443
        }
444

    
445
        /**
446
         * Activa o Desactiva los botones a trav?s de la funci?n que valida los
447
         * campos
448
         */
449
        public void keyPressed(KeyEvent e) {
450
        }
451

    
452
        /**
453
         * Activa o Desactiva los botones a trav?s de la funci?n que valida los
454
         * campos
455
         */
456
        public void keyReleased(KeyEvent e) {
457
        }
458

    
459
        public void actionValueChanged(EventObject e) {
460
                if(!enableEventValueChanged)
461
                        return;
462
                enableEventValueChanged = false;
463
                this.recalcParams(e.getSource(), "0");
464
                enableEventValueChanged = true;
465
        }
466

    
467
        public void propertyChange(PropertyChangeEvent e) {
468
                if(!enableEventValueChanged)
469
                        return;
470
                enableEventValueChanged = false;
471
                this.recalcParams(e.getSource(), e.getOldValue());
472
                enableEventValueChanged = true;
473
        }
474

    
475
        public void mouseExited(MouseEvent e) {}
476
        public void mouseReleased(MouseEvent e) {}
477
        public void mouseEntered(MouseEvent e) {}
478
        public void mousePressed(MouseEvent e) {}
479
        public void focusGained(FocusEvent e) {}
480
}