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 / SaveViewToRasterDialogListener.java @ 2340

History | View | Annotate | Download (13.8 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.Component;
25
import java.awt.Dimension;
26
import java.awt.event.ActionEvent;
27
import java.io.File;
28

    
29
import javax.swing.JOptionPane;
30

    
31
import org.cresques.cts.IProjection;
32
import org.gvsig.andami.PluginServices;
33
import org.gvsig.fmap.dal.coverage.RasterLibrary;
34
import org.gvsig.fmap.dal.coverage.RasterLocator;
35
import org.gvsig.fmap.dal.coverage.RasterManager;
36
import org.gvsig.fmap.dal.coverage.datastruct.Params;
37
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
38
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
39
import org.gvsig.fmap.dal.coverage.store.RasterWriter;
40
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
41
import org.gvsig.fmap.geom.GeometryLocator;
42
import org.gvsig.fmap.geom.GeometryManager;
43
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
44
import org.gvsig.fmap.geom.primitive.Envelope;
45
import org.gvsig.fmap.mapcontext.ViewPort;
46
import org.gvsig.fmap.mapcontext.layers.FLayer;
47
import org.gvsig.fmap.mapcontext.layers.FLayers;
48
import org.gvsig.fmap.mapcontrol.MapControl;
49
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
50
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
51
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
52
import org.gvsig.gui.beans.propertiespanel.PropertiesPanel;
53
import org.gvsig.raster.algorithm.RasterBaseAlgorithmLibrary;
54
import org.gvsig.raster.algorithm.process.DataProcess;
55
import org.gvsig.raster.algorithm.process.ProcessException;
56
import org.gvsig.raster.fmap.layers.FLyrRaster;
57
import org.gvsig.raster.mainplugin.config.Configuration;
58
import org.gvsig.raster.swing.RasterSwingLibrary;
59
import org.gvsig.raster.tools.algorithm.swing.saveraster.SaveRasterPanel;
60
import org.gvsig.raster.tools.app.basic.tool.saveraster.ui.property.WriterPropertiesDialog;
61
import org.gvsig.raster.tools.app.basic.tool.saveviewtoraster.ui.SaveViewToRasterDialog;
62
import org.slf4j.Logger;
63
import org.slf4j.LoggerFactory;
64

    
65

    
66
/**
67
 * Clase que gestiona los eventos de los botones del dialogo de Salvar a raster.
68
 *
69
 * @author Nacho Brodin (nachobrodin@gmail.com)
70
 *
71
 */
72
public class SaveViewToRasterDialogListener implements ButtonsPanelListener {
73
        private static final GeometryManager         geomManager        = GeometryLocator.getGeometryManager();
74
        private Logger                          log         = LoggerFactory.getLogger(SaveViewToRasterDialogListener.class);
75
        private SaveViewToRasterDialog          dialog                 = null;
76
        private FLayers                                                        layers                = null;
77
        private MapControl                                                mapCtrl         = null;
78
        private RasterWriter                    writer                 = null;
79

    
80
        /**
81
         * Constructor
82
         * @param dialog
83
         */
84
        public SaveViewToRasterDialogListener(SaveViewToRasterDialog dialog, FLayers layers, MapControl mapCtrl) {
85
                this.dialog = dialog;
86
                this.layers = layers;
87
                this.mapCtrl = mapCtrl;
88

    
89
                dialog.addButtonPressedListener(this);
90

    
91
                //Captura de eventos para el bot?n de propiedades
92
                (dialog.getSaveRasterPanel()).getBProperties().addActionListener(new java.awt.event.ActionListener() {
93
                        public void actionPerformed(java.awt.event.ActionEvent evt) {
94
                                propsButtonActionPerformed(evt);
95
                        }
96
                });
97
        }
98
        
99
        public boolean isCorrectlyConfigured() {
100
                SaveRasterPanel controlPanel = dialog.getSaveRasterPanel();
101
                try {
102
                        double ulx = Double.parseDouble(controlPanel.getValueULX());
103
                        double uly = Double.parseDouble(controlPanel.getValueULY());
104
                        double lrx = Double.parseDouble(controlPanel.getValueLRX());
105
                        double lry = Double.parseDouble(controlPanel.getValueLRY());
106
                        if(Math.abs(uly - ulx) == 0 || Math.abs(lry - lrx) == 0) {
107
                                RasterSwingLibrary.messageBoxError("wc_wrong", controlPanel);
108
                                return false;
109
                        } 
110
                        
111
                        if(controlPanel.isPixelMethodSelected()) {
112
                                int wpx = Integer.parseInt(controlPanel.getWidthPxValue());
113
                                int hpx = Integer.parseInt(controlPanel.getHeightPxValue());
114
                                double cellsize = Double.parseDouble(controlPanel.getCellSize());
115
                                if(wpx == 0) {
116
                                        RasterSwingLibrary.messageBoxError("width_cannot_be_zero", controlPanel);
117
                                        return false;
118
                                }
119
                                if(hpx == 0) {
120
                                        RasterSwingLibrary.messageBoxError("height_cannot_be_zero", controlPanel);
121
                                        return false;
122
                                }
123
                                if(cellsize == 0) {
124
                                        RasterSwingLibrary.messageBoxError("cellsize_cannot_be_zero", controlPanel);
125
                                        return false;
126
                                }
127
                        } else {
128
                                int cmsx = Integer.parseInt(controlPanel.getValueXCms());
129
                                int cmsy = Integer.parseInt(controlPanel.getValueYCms());
130
                                int scale = Integer.parseInt(controlPanel.getScaleValue());
131
                                if(cmsx == 0) {
132
                                        RasterSwingLibrary.messageBoxError("width_cannot_be_zero", controlPanel);
133
                                        return false;
134
                                }
135
                                if(cmsy == 0) {
136
                                        RasterSwingLibrary.messageBoxError("height_cannot_be_zero", controlPanel);
137
                                        return false;
138
                                }
139
                                if(scale == 0) {
140
                                        RasterSwingLibrary.messageBoxError("scale_cannot_be_zero", controlPanel);
141
                                        return false;
142
                                }
143
                        }
144

    
145
                        String fName = controlPanel.getLFileName().getText();
146
                        if(fName == null || fName.equals("")) {
147
                                RasterSwingLibrary.messageBoxError("filename_cannot_be_empty", controlPanel);
148
                                return false;
149
                        }
150

    
151
                } catch (NumberFormatException e) {
152
                        RasterSwingLibrary.messageBoxError("some_parameter_is_not_correct", controlPanel);
153
                        return false;
154
                }
155

    
156
                return true;
157
        }
158

    
159

    
160
        /**
161
         * Eventos para los botones de aplicar, aceptar y cancelar
162
         * @param e
163
         */
164
        public void actionButtonPressed(ButtonsPanelEvent e) {
165
                switch (e.getButton()) {
166
                case ButtonsPanel.BUTTON_APPLY:
167
                        if(isCorrectlyConfigured()) {
168
                                checkProjections();
169
                                acceptButtonActionPerformed(e);
170
                        }
171
                        break;
172
                case ButtonsPanel.BUTTON_CLOSE:
173
                        dialog.closeJDialog();
174
                        break;
175
                }
176
        }
177
        
178
        /**
179
         * Checks that the view projection be the same that every layer 
180
         * loaded in the TOC and shows a message if not
181
         * @return
182
         */
183
        private boolean checkProjections() {
184
                IProjection viewProj = mapCtrl.getProjection();
185
                for (int i = 0; i < layers.getLayersCount(); i++) {
186
                        FLayer lyr = layers.getLayer(i);
187
                        if(lyr.getProjection() == null || !lyr.getProjection().getAbrev().equals(viewProj.getAbrev())) {
188
                                RasterSwingLibrary.messageBoxInfo("different_projection", dialog);
189
                                return false;
190
                        }
191
                }
192
                return true;
193
        }
194

    
195
        /**
196
         * Acciones realizadas al aceptar.
197
         * @param e
198
         * @return true si se ha completado la operaci?n de escritura y false si no se ha hecho
199
         */
200
        private boolean acceptButtonActionPerformed(ButtonsPanelEvent e) {
201
                SaveRasterPanel controlPanel = dialog.getSaveRasterPanel();
202

    
203
                String fName = dialog.getDataInputListener().getFileName();
204
                int wpx = 0;
205
                int hpx = 0;
206
                if(controlPanel.isPixelMethodSelected()) {
207
                        wpx = Integer.valueOf(controlPanel.getWidthPxValue());
208
                        hpx = Integer.valueOf(controlPanel.getHeightPxValue());
209
                } else {
210
                        wpx = Integer.valueOf(controlPanel.getWidthPxPrint());
211
                        hpx = Integer.valueOf(controlPanel.getHeightPxPrint());
212
                }
213
                
214
                Dimension dimension = new Dimension(wpx, hpx);
215

    
216
                //Limitamos el tama?o
217
                if(wpx > 20000 || wpx > 20000) {
218
                        if(!RasterSwingLibrary.messageBoxYesOrNot("output_file_too_big", null))
219
                                return false;
220
                }
221
                
222
                //Comprobamos que el en la ruta de destino tengamos permisos de escritura
223
                File f = new File(fName);
224
                if(f.exists())
225
                        if(!RasterSwingLibrary.messageBoxYesOrNot("raster_error_file_exists", dialog))
226
                                return false;
227

    
228
                f = new File(fName.substring(0, fName.lastIndexOf(File.separator)));
229

    
230
                if(f.exists() && f.isDirectory() && !f.canWrite()) {
231
                        RasterSwingLibrary.messageBoxError("error_file_not_writable", dialog);
232
                        return false;
233
                }
234

    
235
                double lrX = Double.parseDouble(controlPanel.getValueLRX());
236
                double lrY = Double.parseDouble(controlPanel.getValueLRY());
237
                double ulX = Double.parseDouble(controlPanel.getValueULX());
238
                double ulY = Double.parseDouble(controlPanel.getValueULY());
239

    
240
                Envelope ext = null;
241
                try{
242
                        ext = geomManager.createEnvelope(ulX, lrY, lrX, ulY, SUBTYPES.GEOM2D);
243
                }catch(CreateEnvelopeException e1){
244
                        log.debug("Error creating the envelope", null, e1);
245
                }
246
                
247
                // Controlamos el tama?o en caso de un jpeg2000
248
                long bytes = RasterLocator.getManager().getRasterUtils().getBytesFromRaster((int)dimension.getWidth(),
249
                                (int)dimension.getHeight(), 0, 3);        
250
                
251
                long maxJp2 = 13000 * 12500 * 3;
252
                if (fName.endsWith(".jp2")) {
253
                        if (bytes > maxJp2) {
254
                                if(!RasterSwingLibrary.messageBoxYesOrNot("output_file_too_big_jpeg2000", null))
255
                                        return false;
256
                        }
257
                }
258
                
259
                Params params = getWriterParams(fName);
260
                int blockSize = getBlockSize(params, layers);
261

    
262
                ViewPort viewPort = new ViewPort(mapCtrl.getViewPort().getProjection());
263
                viewPort.setBackColor(mapCtrl.getViewPort().getBackColor());
264
                viewPort.setImageSize(dimension);
265
                viewPort.setEnvelope(ext);
266

    
267
                try {
268
                        DataProcess saveRasterProcess = RasterBaseAlgorithmLibrary.getManager().createRasterTask("SaveRasterProcess");
269
                        saveRasterProcess.setActions(new SaveRasterActions(dialog.getViewName()));
270
                        saveRasterProcess.addParam("ViewPort", viewPort);
271
                        saveRasterProcess.addParam("Dimension", dimension);
272
                        saveRasterProcess.addParam("Blocksize", blockSize);
273
                        saveRasterProcess.addParam("FileName", fName);
274
                        saveRasterProcess.addParam("FLyrs", layers);
275
                        saveRasterProcess.addParam("writerparams", params);
276
                        saveRasterProcess.addParam("Projection", mapCtrl.getProjection());
277
                        saveRasterProcess.start();
278
                } catch (ProcessException e1) {
279
                        RasterSwingLibrary.messageBoxError("error_processing", this, e1);
280
                }
281

    
282
                return true;
283
        }
284

    
285
        /**
286
         * Funci?n a ejecutar cuando se pulsa el bot?n de propiedades.
287
         * @param e ActionEvent
288
         */
289
        private void propsButtonActionPerformed(ActionEvent e){
290
                String name = dialog.getDataInputListener().getFileName();
291

    
292
                //Si no se ha seleccionado ning?n fichero salimos
293
                if(name == null || name.equals(""))
294
                        return;
295

    
296
                Params params = getWriterParams(name);
297
                PropertiesPanel panel = new PropertiesPanel();
298
                WriterPropertiesDialog dialog = new WriterPropertiesDialog(panel, params);
299
                PluginServices.getMDIManager().addWindow(dialog);
300
        }
301

    
302
        /**
303
         * Obtiene los par?metros del driver de escritura. Si el driver no se ha creado a?n se obtienen
304
         * unos par?metros con la inicializaci?n por defecto. Si se ha creado ya y se han modificado se
305
         * devuelven los par?metros con las modificaciones. Si se cambia de driver se devolver? un WriterParams
306
         * como si fuera la primera vez que se abre.
307
         * @param name Nombre del fichero sobre el que se salva.
308
         * @return WriterParams
309
         */
310
        private Params getWriterParams(String name) {
311
                RasterManager rManager = RasterLocator.getManager();
312
                String ext = rManager.getFileUtils().getExtensionFromFileName(name);
313
                try {
314
                        if(writer == null) //La primera vez que se obtiene el driver
315
                                writer = rManager.createWriter(name);
316
                        else {
317
                                String newType = rManager.getProviderServices().getWriteDriverType(ext);
318
                                String oldType = writer.getDriverName();
319
                                if(!newType.equals(oldType))  //Cambio de driver despu?s de haber seleccionado y modificado las propiedades de uno
320
                                        writer = rManager.createWriter(name);
321
                        }
322

    
323
                        if(writer == null)
324
                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
325

    
326
                        return writer.getParams();
327

    
328
                } catch (NotSupportedExtensionException e1) {
329
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
330
                        return null;
331
                } catch (RasterDriverException e1) {
332
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
333
                        return null;
334
                }
335
        }
336

    
337
        /**
338
         * Calculo del tama?o de bloque. Para ello comprueba si el raster est? siendo tileado. Si est? siendo
339
         * tileado se aplica el alto del tile menor para no pedir un bloque mayor que lo que un servidor puede
340
         * devolver. Si no est? siendo tileado se devuelve el tama?o de bloque de los par?metros.
341
         * @param flyrs Capas
342
         * @param params Par?metros del driver de escritura
343
         * @return tama?o de bloque
344
         */
345
        private int getBlockSize(Params params, FLayers flyrs) {
346

    
347
                int blockSize = Configuration.getValue("cache_blockheight", Integer.valueOf(RasterLibrary.blockHeight)).intValue();
348
                blockSize = RasterLibrary.blockHeight;
349

    
350
                //Recorremos todas las capas comprobando si alguna de ellas implementa RasterOperations y tilea.
351
                //En ese caso se obtiene el ancho de bloque. El ancho de bloque total ser? el menor obtenido.
352
                //Esto lo hacemos para que las capas que tilean WebMapService, WebCoverageService, ... no hagan demasiadas peticiones al servidor
353
                //por tener un ancho de bloque muy peque?o de modo que el ancho del bloque se ajuste al Tile menor
354
                //soportado por los servidores que intervienen en el salvado.
355
                int[] wBlock = null;
356
                boolean isTiling = false;
357
                int block = Integer.MAX_VALUE;
358
                for(int i = 0; i < flyrs.getLayersCount(); i++)
359
                        if(flyrs.getLayer(i) instanceof FLyrRaster)
360
                                if(((FLyrRaster)flyrs.getLayer(i)).isTiled()){
361
                                        wBlock = ((FLyrRaster)flyrs.getLayer(i)).getTileSize();
362
                                        if((wBlock[0] - 1)< block){
363
                                                block = wBlock[0] - 1;
364
                                                isTiling = true;
365
                                        }
366
                                }
367
                if(isTiling) {
368
                        params.changeParamValue("blocksize", String.valueOf(block));
369
                        return block;
370
                }
371

    
372
                return blockSize;
373
        }
374
}