Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / saveraster / ui / listener / SaveRasterDialogListener.java @ 2123

History | View | Annotate | Download (11 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.saveraster.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.gvsig.andami.PluginServices;
32
import org.gvsig.fmap.dal.coverage.RasterLibrary;
33
import org.gvsig.fmap.dal.coverage.RasterLocator;
34
import org.gvsig.fmap.dal.coverage.RasterManager;
35
import org.gvsig.fmap.dal.coverage.datastruct.Params;
36
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
37
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
38
import org.gvsig.fmap.dal.coverage.store.RasterWriter;
39
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
40
import org.gvsig.fmap.geom.GeometryLocator;
41
import org.gvsig.fmap.geom.GeometryManager;
42
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
43
import org.gvsig.fmap.geom.primitive.Envelope;
44
import org.gvsig.fmap.mapcontext.ViewPort;
45
import org.gvsig.fmap.mapcontext.layers.FLayers;
46
import org.gvsig.fmap.mapcontrol.MapControl;
47
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
48
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
49
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
50
import org.gvsig.gui.beans.propertiespanel.PropertiesPanel;
51
import org.gvsig.raster.fmap.layers.FLyrRaster;
52
import org.gvsig.raster.mainplugin.config.Configuration;
53
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
54
import org.gvsig.raster.tools.app.basic.tool.saveraster.operation.RasterizerLayer;
55
import org.gvsig.raster.tools.app.basic.tool.saveraster.operation.SaveRasterActions;
56
import org.gvsig.raster.tools.app.basic.tool.saveraster.operation.SaveRasterProcess;
57
import org.gvsig.raster.tools.app.basic.tool.saveraster.ui.SaveRasterDialog;
58
import org.gvsig.raster.tools.app.basic.tool.saveraster.ui.SaveRasterPanel;
59
import org.gvsig.raster.tools.app.basic.tool.saveraster.ui.property.WriterPropertiesDialog;
60

    
61

    
62
/**
63
 * Clase que gestiona los eventos de los botones del dialogo de Salvar a raster.
64
 *
65
 * @version 19/04/2007
66
 * @author Nacho Brodin (nachobrodin@gmail.com)
67
 *
68
 */
69
public class SaveRasterDialogListener implements ButtonsPanelListener {
70
        private static final GeometryManager         geomManager        = GeometryLocator.getGeometryManager();
71
        private SaveRasterDialog                                 dialog                 = null;
72
        private FLayers                                                        layers                = null;
73
        private MapControl                                                mapCtrl         = null;
74
        private RasterWriter                    writer                 = null;
75

    
76
        /**
77
         * Constructor
78
         * @param dialog
79
         */
80
        public SaveRasterDialogListener(SaveRasterDialog dialog, FLayers layers, MapControl mapCtrl) {
81
                this.dialog = dialog;
82
                this.layers = layers;
83
                this.mapCtrl = mapCtrl;
84

    
85
                dialog.addButtonPressedListener(this);
86

    
87
                //Captura de eventos para el bot?n de propiedades
88
                (dialog.getControlsPanel()).getBProperties().addActionListener(new java.awt.event.ActionListener() {
89
                        public void actionPerformed(java.awt.event.ActionEvent evt) {
90
                                propsButtonActionPerformed(evt);
91
                        }
92
                });
93
        }
94

    
95
        /**
96
         * Eventos para los botones de aplicar, aceptar y cancelar
97
         * @param e
98
         */
99
        public void actionButtonPressed(ButtonsPanelEvent e) {
100
                switch (e.getButton()) {
101
                case ButtonsPanel.BUTTON_APPLY:
102
                        acceptButtonActionPerformed(e);
103
                        break;
104
                case ButtonsPanel.BUTTON_CLOSE:
105
                        dialog.closeJDialog();
106
                        break;
107
                }
108
        }
109

    
110
        /**
111
         * Acciones realizadas al aceptar.
112
         * @param e
113
         * @return true si se ha completado la operaci?n de escritura y false si no se ha hecho
114
         */
115
        private boolean acceptButtonActionPerformed(ButtonsPanelEvent e) {
116
                SaveRasterPanel controlPanel = dialog.getControlsPanel();
117

    
118
                String fName = dialog.getDataInputListener().getFileName();
119
                Dimension dimension = new Dimension((int)dialog.getDataInputListener().getWidthInPixels(),
120
                                (int)dialog.getDataInputListener().getHeightInPixels() );
121

    
122
                //Limitamos el tama?o
123
                if(dialog.getDataInputListener().getWidthInPixels() > 20000 || dialog.getDataInputListener().getHeightInPixels() > 20000) {
124
                        if(!RasterToolsUtil.messageBoxYesOrNot("output_file_too_big", null))
125
                                return false;
126
                }
127
                
128
                //Comprobamos que el en la ruta de destino tengamos permisos de escritura
129
                File f = new File(fName);
130
                if(f.exists())
131
                        if(!RasterToolsUtil.messageBoxYesOrNot("raster_error_file_exists", dialog))
132
                                return false;
133

    
134
                f = new File(fName.substring(0, fName.lastIndexOf(File.separator)));
135

    
136
                if(f.exists() && f.isDirectory() && !f.canWrite()) {
137
                        RasterToolsUtil.messageBoxError("error_file_not_writable", dialog);
138
                        return false;
139
                }
140

    
141
                dialog.getDataInputListener().resetFileName();
142
                dialog.getDataInputListener().enableButtons();
143

    
144
                double lrX = Double.parseDouble(controlPanel.getTInfDerX().getValue());
145
                double lrY = Double.parseDouble(controlPanel.getTInfDerY().getValue());
146
                double ulX = Double.parseDouble(controlPanel.getTSupIzqX().getValue());
147
                double ulY = Double.parseDouble(controlPanel.getTSupIzqY().getValue());
148
                /*double width = 0;
149
                if(ulX > lrX) width = (ulX - lrX);
150
                else width = (lrX - ulX);
151
                double height = 0;
152
                if(ulY > lrY) height = (ulY - lrY);
153
                else height = (lrY - ulY);*/
154
                Envelope ext = null;
155

    
156
                try{
157
                        ext = geomManager.createEnvelope(ulX, lrY, lrX, ulY, SUBTYPES.GEOM2D);
158
                }catch(CreateEnvelopeException e1){
159
                        RasterToolsUtil.debug("Error creating the envelope", null, e1);
160
                }
161
                
162
                // Controlamos el tama?o en caso de un jpeg2000
163
                long bytes = RasterLocator.getManager().getRasterUtils().getBytesFromRaster((int)dimension.getWidth(),
164
                                (int)dimension.getHeight(), 0, 3);        
165
                
166
                long maxJp2 = 13000 * 12500 * 3;
167
                if (fName.endsWith(".jp2")) {
168
                        if (bytes > maxJp2) {
169
                                if(!RasterToolsUtil.messageBoxYesOrNot("output_file_too_big_jpeg2000", null))
170
                                        return false;
171
                        }
172
                }
173
                
174
                
175
                Params params = getWriterParams(fName);
176
                int blockSize = getBlockSize(params, layers);
177

    
178
                ViewPort viewPort = new ViewPort(mapCtrl.getViewPort().getProjection());
179
                viewPort.setBackColor(mapCtrl.getViewPort().getBackColor());
180
                viewPort.setImageSize(dimension);
181
                viewPort.setEnvelope(ext);
182

    
183
                //Creamos el servidor de datos de la vista
184
                RasterizerLayer rasterizerLayer = new RasterizerLayer(layers, viewPort, blockSize);
185

    
186
                //Creamos la clase con el proceso y lo lanzamos
187
                SaveRasterProcess saveRasterProcess = new SaveRasterProcess();
188
                saveRasterProcess.setActions(new SaveRasterActions());
189
                saveRasterProcess.addParam("viewport", viewPort);
190
                saveRasterProcess.addParam("dimension", dimension);
191
                saveRasterProcess.addParam("rasterizerlayer", rasterizerLayer);
192
                saveRasterProcess.addParam("filename", fName);
193
                saveRasterProcess.addParam("writerparams", params);
194
                saveRasterProcess.start();
195

    
196
                return true;
197
        }
198

    
199
        /**
200
         * Funci?n a ejecutar cuando se pulsa el bot?n de propiedades.
201
         * @param e ActionEvent
202
         */
203
        private void propsButtonActionPerformed(ActionEvent e){
204
                String name = dialog.getDataInputListener().getFileName();
205

    
206
                //Si no se ha seleccionado ning?n fichero salimos
207
                if(name == null || name.equals(""))
208
                        return;
209

    
210
                Params params = getWriterParams(name);
211
                PropertiesPanel panel = new PropertiesPanel();
212
                WriterPropertiesDialog dialog = new WriterPropertiesDialog(panel, params);
213
                PluginServices.getMDIManager().addWindow(dialog);
214
        }
215

    
216
        /**
217
         * Obtiene los par?metros del driver de escritura. Si el driver no se ha creado a?n se obtienen
218
         * unos par?metros con la inicializaci?n por defecto. Si se ha creado ya y se han modificado se
219
         * devuelven los par?metros con las modificaciones. Si se cambia de driver se devolver? un WriterParams
220
         * como si fuera la primera vez que se abre.
221
         * @param name Nombre del fichero sobre el que se salva.
222
         * @return WriterParams
223
         */
224
        private Params getWriterParams(String name) {
225
                RasterManager rManager = RasterLocator.getManager();
226
                String ext = rManager.getFileUtils().getExtensionFromFileName(name);
227
                try {
228
                        if(writer == null) //La primera vez que se obtiene el driver
229
                                writer = rManager.createWriter(name);
230
                        else {
231
                                String newType = rManager.getProviderServices().getWriteDriverType(ext);
232
                                String oldType = writer.getDriverName();
233
                                if(!newType.equals(oldType))  //Cambio de driver despu?s de haber seleccionado y modificado las propiedades de uno
234
                                        writer = rManager.createWriter(name);
235
                        }
236

    
237
                        if(writer == null)
238
                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
239

    
240
                        return writer.getParams();
241

    
242
                } catch (NotSupportedExtensionException e1) {
243
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
244
                        return null;
245
                } catch (RasterDriverException e1) {
246
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
247
                        return null;
248
                }
249
        }
250

    
251
        /**
252
         * Calculo del tama?o de bloque. Para ello comprueba si el raster est? siendo tileado. Si est? siendo
253
         * tileado se aplica el alto del tile menor para no pedir un bloque mayor que lo que un servidor puede
254
         * devolver. Si no est? siendo tileado se devuelve el tama?o de bloque de los par?metros.
255
         * @param flyrs Capas
256
         * @param params Par?metros del driver de escritura
257
         * @return tama?o de bloque
258
         */
259
        private int getBlockSize(Params params, FLayers flyrs) {
260

    
261
                int blockSize = Configuration.getValue("cache_blockheight", Integer.valueOf(RasterLibrary.blockHeight)).intValue();
262
                blockSize = RasterLibrary.blockHeight;
263

    
264
                //Recorremos todas las capas comprobando si alguna de ellas implementa RasterOperations y tilea.
265
                //En ese caso se obtiene el ancho de bloque. El ancho de bloque total ser? el menor obtenido.
266
                //Esto lo hacemos para que las capas que tilean WebMapService, WebCoverageService, ... no hagan demasiadas peticiones al servidor
267
                //por tener un ancho de bloque muy peque?o de modo que el ancho del bloque se ajuste al Tile menor
268
                //soportado por los servidores que intervienen en el salvado.
269
                int[] wBlock = null;
270
                boolean isTiling = false;
271
                int block = Integer.MAX_VALUE;
272
                for(int i = 0; i < flyrs.getLayersCount(); i++)
273
                        if(flyrs.getLayer(i) instanceof FLyrRaster)
274
                                if(((FLyrRaster)flyrs.getLayer(i)).isTiled()){
275
                                        wBlock = ((FLyrRaster)flyrs.getLayer(i)).getTileSize();
276
                                        if((wBlock[0] - 1)< block){
277
                                                block = wBlock[0] - 1;
278
                                                isTiling = true;
279
                                        }
280
                                }
281
                if(isTiling) {
282
                        params.changeParamValue("blocksize", String.valueOf(block));
283
                        return block;
284
                }
285

    
286
                return blockSize;
287
        }
288
}