Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / saveraster / ui / listener / SaveRasterDialogListener.java @ 28487

History | View | Annotate | Download (9.96 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.rastertools.saveraster.ui.listener;
20

    
21
import java.awt.Component;
22
import java.awt.Dimension;
23
import java.awt.event.ActionEvent;
24
import java.awt.geom.Rectangle2D;
25
import java.io.File;
26

    
27
import javax.swing.JOptionPane;
28

    
29
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
30
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
31
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
32
import org.gvsig.gui.beans.propertiespanel.PropertiesPanel;
33
import org.gvsig.raster.Configuration;
34
import org.gvsig.raster.RasterLibrary;
35
import org.gvsig.raster.buffer.IQueryableRaster;
36
import org.gvsig.raster.dataset.GeoRasterWriter;
37
import org.gvsig.raster.dataset.NotSupportedExtensionException;
38
import org.gvsig.raster.dataset.Params;
39
import org.gvsig.raster.dataset.io.RasterDriverException;
40
import org.gvsig.raster.util.RasterToolsUtil;
41
import org.gvsig.raster.util.RasterUtilities;
42
import org.gvsig.rastertools.saveraster.operations.RasterizerLayer;
43
import org.gvsig.rastertools.saveraster.operations.SaveRasterActions;
44
import org.gvsig.rastertools.saveraster.operations.SaveRasterProcess;
45
import org.gvsig.rastertools.saveraster.ui.SaveRasterDialog;
46
import org.gvsig.rastertools.saveraster.ui.SaveRasterPanel;
47
import org.gvsig.rastertools.saveraster.ui.properties.WriterPropertiesDialog;
48

    
49
import com.iver.andami.PluginServices;
50
import com.iver.cit.gvsig.fmap.MapControl;
51
import com.iver.cit.gvsig.fmap.ViewPort;
52
import com.iver.cit.gvsig.fmap.layers.FLayers;
53

    
54
/**
55
 * Clase que gestiona los eventos de los botones del dialogo de Salvar a raster.
56
 *
57
 * @version 19/04/2007
58
 * @author Nacho Brodin (nachobrodin@gmail.com)
59
 *
60
 */
61
public class SaveRasterDialogListener implements ButtonsPanelListener {
62
        private SaveRasterDialog         dialog = null;
63
        private FLayers                                layers = null;
64
        private MapControl                        mapCtrl = null;
65
        private GeoRasterWriter         writer = null;
66

    
67
        /**
68
         * Constructor
69
         * @param dialog
70
         */
71
        public SaveRasterDialogListener(SaveRasterDialog dialog, FLayers layers, MapControl mapCtrl) {
72
                this.dialog = dialog;
73
                this.layers = layers;
74
                this.mapCtrl = mapCtrl;
75

    
76
                dialog.addButtonPressedListener(this);
77

    
78
                //Captura de eventos para el bot?n de propiedades
79
                ((SaveRasterPanel)dialog.getControlsPanel()).getBProperties().addActionListener(new java.awt.event.ActionListener() {
80
                                                public void actionPerformed(java.awt.event.ActionEvent evt) {
81
                                                        propsButtonActionPerformed(evt);
82
                                                 }
83
                                });
84
        }
85

    
86
        /**
87
         * Eventos para los botones de aplicar, aceptar y cancelar
88
         * @param e
89
         */
90
        public void actionButtonPressed(ButtonsPanelEvent e) {
91
                switch (e.getButton()) {
92
                case ButtonsPanel.BUTTON_APPLY:
93
                        acceptButtonActionPerformed(e);
94
                        break;
95
                case ButtonsPanel.BUTTON_CLOSE:
96
                        dialog.closeJDialog();
97
                        break;
98
                }
99
        }
100

    
101
        /**
102
         * Acciones realizadas al aceptar.
103
         * @param e
104
         * @return true si se ha completado la operaci?n de escritura y false si no se ha hecho
105
         */
106
        private boolean acceptButtonActionPerformed(ButtonsPanelEvent e) {
107
                SaveRasterPanel controlPanel = dialog.getControlsPanel();
108

    
109
                String fName = dialog.getDataInputListener().getFileName();
110
                Dimension dimension = new Dimension((int)dialog.getDataInputListener().getWidthInPixels(),
111
                                (int)dialog.getDataInputListener().getHeightInPixels() );
112

    
113
                //Limitamos el tama?o
114
                if(dialog.getDataInputListener().getWidthInPixels() > 20000 || dialog.getDataInputListener().getHeightInPixels() > 20000) {
115
                        RasterToolsUtil.messageBoxInfo("output_file_too_big", dialog);
116
                        return false;
117
                }
118
                
119
                //Comprobamos que el en la ruta de destino tengamos permisos de escritura
120
                File f = new File(fName);
121
                if(f.exists())
122
                        if(!RasterToolsUtil.messageBoxYesOrNot("raster_error_file_exists", dialog))
123
                                return false;
124
                
125
                f = new File(fName.substring(0, fName.lastIndexOf(File.separator)));
126
                                
127
                /*if(f.exists() && f.isDirectory() && !f.canWrite()) {
128
                        RasterToolsUtil.messageBoxError("error_file_not_writable", dialog);
129
                        return false;
130
                }*/
131

    
132
                dialog.getDataInputListener().resetFileName();
133
                dialog.getDataInputListener().enableButtons();
134

    
135
                double lrX = Double.parseDouble(controlPanel.getTInfDerX().getValue());
136
                double lrY = Double.parseDouble(controlPanel.getTInfDerY().getValue());
137
                double ulX = Double.parseDouble(controlPanel.getTSupIzqX().getValue());
138
                double ulY = Double.parseDouble(controlPanel.getTSupIzqY().getValue());
139
                
140
                double width = 0;
141
                if(ulX > lrX) 
142
                        width = (double)(ulX - lrX);
143
                else 
144
                        width = (double)(lrX - ulX);
145
                
146
                double height = 0;
147
                if(ulY > lrY) 
148
                        height = (double)(ulY - lrY);
149
                else 
150
                        height = (double)(lrY - ulY);
151
                
152
                Rectangle2D ext = null;
153

    
154
                if(ulY < lrY)
155
                        ext = new Rectangle2D.Double(ulX, ulY, width, height);
156
                else
157
                        ext = new Rectangle2D.Double(ulX, lrY, width, height);
158

    
159
                Params params = getWriterParams(fName);
160
                int blockSize = getBlockSize(params, layers);
161

    
162
                ViewPort viewPort = new ViewPort(layers.getProjection());
163
                viewPort.setBackColor(mapCtrl.getViewPort().getBackColor());
164
                viewPort.setImageSize(dimension);
165
                viewPort.setExtent(ext);
166

    
167
                //Creamos el servidor de datos de la vista
168
                RasterizerLayer rasterizerLayer = new RasterizerLayer(layers, viewPort, blockSize);
169

    
170
                //Creamos la clase con el proceso y lo lanzamos
171
                SaveRasterProcess saveRasterProcess = new SaveRasterProcess();
172
                saveRasterProcess.setActions(new SaveRasterActions());
173
                saveRasterProcess.addParam("viewport", viewPort);
174
                saveRasterProcess.addParam("dimension", dimension);
175
                saveRasterProcess.addParam("rasterizerlayer", rasterizerLayer);
176
                saveRasterProcess.addParam("filename", fName);
177
                saveRasterProcess.addParam("writerparams", params);
178
                saveRasterProcess.start();
179

    
180
                return true;
181
        }
182

    
183
        /**
184
         * Funci?n a ejecutar cuando se pulsa el bot?n de propiedades.
185
         * @param e ActionEvent
186
         */
187
        private void propsButtonActionPerformed(ActionEvent e){
188
                String name = dialog.getDataInputListener().getFileName();
189

    
190
                //Si no se ha seleccionado ning?n fichero salimos
191
                if(name == null || name.equals(""))
192
                        return;
193

    
194
                Params params = getWriterParams(name);
195
                PropertiesPanel panel = new PropertiesPanel();
196
                WriterPropertiesDialog dialog = new WriterPropertiesDialog(panel, params);
197
                PluginServices.getMDIManager().addWindow(dialog);
198
        }
199

    
200
        /**
201
         * Obtiene los par?metros del driver de escritura. Si el driver no se ha creado a?n se obtienen
202
         * unos par?metros con la inicializaci?n por defecto. Si se ha creado ya y se han modificado se
203
         * devuelven los par?metros con las modificaciones. Si se cambia de driver se devolver? un WriterParams
204
         * como si fuera la primera vez que se abre.
205
         * @param name Nombre del fichero sobre el que se salva.
206
         * @return WriterParams
207
         */
208
        private Params getWriterParams(String name) {
209
                String ext = RasterUtilities.getExtensionFromFileName(name);
210
                try {
211
                        if(writer == null) //La primera vez que se obtiene el driver
212
                                writer = GeoRasterWriter.getWriter(name);
213
                        else {
214
                                String newType = GeoRasterWriter.getDriverType(ext);
215
                                String oldType = writer.getDriverName();
216
                                if(!newType.equals(oldType))  //Cambio de driver despu?s de haber seleccionado y modificado las propiedades de uno
217
                                        writer = GeoRasterWriter.getWriter(name);
218
                        }
219

    
220
                        if(writer == null)
221
                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
222

    
223
                        return writer.getParams();
224

    
225
                } catch (NotSupportedExtensionException e1) {
226
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
227
                        return null;
228
                } catch (RasterDriverException e1) {
229
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
230
                        return null;
231
                }
232
        }
233

    
234
        /**
235
         * Calculo del tama?o de bloque. Para ello comprueba si el raster est? siendo tileado. Si est? siendo
236
         * tileado se aplica el alto del tile menor para no pedir un bloque mayor que lo que un servidor puede
237
         * devolver. Si no est? siendo tileado se devuelve el tama?o de bloque de los par?metros.
238
         * @param flyrs Capas
239
         * @param params Par?metros del driver de escritura
240
         * @return tama?o de bloque
241
         */
242
        private int getBlockSize(Params params, FLayers flyrs) {
243

    
244
                int blockSize = Configuration.getValue("cache_blockheight", Integer.valueOf(RasterLibrary.blockHeight)).intValue();
245
                        blockSize = RasterLibrary.blockHeight;
246

    
247
                //Recorremos todas las capas comprobando si alguna de ellas implementa RasterOperations y tilea.
248
                //En ese caso se obtiene el ancho de bloque. El ancho de bloque total ser? el menor obtenido.
249
                //Esto lo hacemos para que las capas que tilean WMS, WCS, ... no hagan demasiadas peticiones al servidor
250
                //por tener un ancho de bloque muy peque?o de modo que el ancho del bloque se ajuste al Tile menor
251
                //soportado por los servidores que intervienen en el salvado.
252
                int[] wBlock = null;
253
                boolean isTiling = false;
254
                int block = Integer.MAX_VALUE;
255
                for(int i = 0; i < flyrs.getLayersCount(); i++){
256
                        if(flyrs.getLayer(i) instanceof IQueryableRaster){
257
                                if(((IQueryableRaster)flyrs.getLayer(i)).isTiled()){
258
                                        wBlock = ((IQueryableRaster)flyrs.getLayer(i)).getTileSize();
259
                                        if((wBlock[0] - 1)< block){
260
                                                block = wBlock[0] - 1;
261
                                                isTiling = true;
262
                                        }
263
                                }
264
                        }
265
                }
266
                if(isTiling) {
267
                        params.changeParamValue("blocksize", String.valueOf(block));
268
                        return block;
269
                }
270

    
271
                return blockSize;
272
        }
273
}