Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extRasterTools-SE / src / org / gvsig / rastertools / saveraster / ui / listener / SaveRasterDialogListener.java @ 27772

History | View | Annotate | Download (9.99 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.io.File;
25

    
26
import javax.swing.JOptionPane;
27

    
28
import org.gvsig.fmap.geom.GeometryLocator;
29
import org.gvsig.fmap.geom.GeometryManager;
30
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
31
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
32
import org.gvsig.fmap.geom.primitive.Envelope;
33
import org.gvsig.fmap.mapcontext.ViewPort;
34
import org.gvsig.fmap.mapcontext.layers.FLayers;
35
import org.gvsig.fmap.mapcontrol.MapControl;
36
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
37
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
38
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
39
import org.gvsig.gui.beans.propertiespanel.PropertiesPanel;
40
import org.gvsig.raster.Configuration;
41
import org.gvsig.raster.RasterLibrary;
42
import org.gvsig.raster.buffer.IQueryableRaster;
43
import org.gvsig.raster.dataset.GeoRasterWriter;
44
import org.gvsig.raster.dataset.NotSupportedExtensionException;
45
import org.gvsig.raster.dataset.Params;
46
import org.gvsig.raster.dataset.io.RasterDriverException;
47
import org.gvsig.raster.util.RasterToolsUtil;
48
import org.gvsig.raster.util.RasterUtilities;
49
import org.gvsig.rastertools.saveraster.operations.RasterizerLayer;
50
import org.gvsig.rastertools.saveraster.operations.SaveRasterActions;
51
import org.gvsig.rastertools.saveraster.operations.SaveRasterProcess;
52
import org.gvsig.rastertools.saveraster.ui.SaveRasterDialog;
53
import org.gvsig.rastertools.saveraster.ui.SaveRasterPanel;
54
import org.gvsig.rastertools.saveraster.ui.properties.WriterPropertiesDialog;
55

    
56
import com.iver.andami.PluginServices;
57

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

    
72
        /**
73
         * Constructor
74
         * @param dialog
75
         */
76
        public SaveRasterDialogListener(SaveRasterDialog dialog, FLayers layers, MapControl mapCtrl) {
77
                this.dialog = dialog;
78
                this.layers = layers;
79
                this.mapCtrl = mapCtrl;
80

    
81
                dialog.addButtonPressedListener(this);
82

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

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

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

    
114
                String fName = dialog.getDataInputListener().getFileName();
115
                Dimension dimension = new Dimension((int)dialog.getDataInputListener().getWidthInPixels(),
116
                                (int)dialog.getDataInputListener().getHeightInPixels() );
117

    
118
                //Comprobamos que el en la ruta de destino tengamos permisos de escritura
119
                File f = new File(fName);
120
                if(f.exists())
121
                        if(!RasterToolsUtil.messageBoxYesOrNot("raster_error_file_exists", dialog))
122
                                return false;
123

    
124
                f = new File(fName.substring(0, fName.lastIndexOf(File.separator)));
125

    
126
                if(f.exists() && f.isDirectory() && !f.canWrite()) {
127
                        RasterToolsUtil.messageBoxError("error_file_not_writable", dialog);
128
                        return false;
129
                }
130

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

    
134
                double lrX = Double.parseDouble(controlPanel.getTInfDerX().getValue());
135
                double lrY = Double.parseDouble(controlPanel.getTInfDerY().getValue());
136
                double ulX = Double.parseDouble(controlPanel.getTSupIzqX().getValue());
137
                double ulY = Double.parseDouble(controlPanel.getTSupIzqY().getValue());
138
                /*double width = 0;
139
                if(ulX > lrX) width = (ulX - lrX);
140
                else width = (lrX - ulX);
141
                double height = 0;
142
                if(ulY > lrY) height = (ulY - lrY);
143
                else height = (lrY - ulY);*/
144
                Envelope ext = null;
145

    
146
                try{
147
                        ext = geomManager.createEnvelope(ulX, lrY, lrX, ulY, SUBTYPES.GEOM2D);
148
                }catch(CreateEnvelopeException e1){
149
                        RasterToolsUtil.debug("Error creating the envelope", null, e1);
150
                }
151
                Params params = getWriterParams(fName);
152
                int blockSize = getBlockSize(params, layers);
153

    
154
                ViewPort viewPort = new ViewPort(layers.getProjection());
155
                viewPort.setBackColor(mapCtrl.getViewPort().getBackColor());
156
                viewPort.setImageSize(dimension);
157
                viewPort.setEnvelope(ext);
158

    
159
                //Creamos el servidor de datos de la vista
160
                RasterizerLayer rasterizerLayer = new RasterizerLayer(layers, viewPort, blockSize);
161

    
162
                //Creamos la clase con el proceso y lo lanzamos
163
                SaveRasterProcess saveRasterProcess = new SaveRasterProcess();
164
                saveRasterProcess.setActions(new SaveRasterActions());
165
                saveRasterProcess.addParam("viewport", viewPort);
166
                saveRasterProcess.addParam("dimension", dimension);
167
                saveRasterProcess.addParam("rasterizerlayer", rasterizerLayer);
168
                saveRasterProcess.addParam("filename", fName);
169
                saveRasterProcess.addParam("writerparams", params);
170
                saveRasterProcess.start();
171

    
172
                return true;
173
        }
174

    
175
        /**
176
         * Funci?n a ejecutar cuando se pulsa el bot?n de propiedades.
177
         * @param e ActionEvent
178
         */
179
        private void propsButtonActionPerformed(ActionEvent e){
180
                String name = dialog.getDataInputListener().getFileName();
181

    
182
                //Si no se ha seleccionado ning?n fichero salimos
183
                if(name == null || name.equals(""))
184
                        return;
185

    
186
                Params params = getWriterParams(name);
187
                PropertiesPanel panel = new PropertiesPanel();
188
                WriterPropertiesDialog dialog = new WriterPropertiesDialog(panel, params);
189
                PluginServices.getMDIManager().addWindow(dialog);
190
        }
191

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

    
212
                        if(writer == null)
213
                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
214

    
215
                        return writer.getParams();
216

    
217
                } catch (NotSupportedExtensionException e1) {
218
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
219
                        return null;
220
                } catch (RasterDriverException e1) {
221
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
222
                        return null;
223
                }
224
        }
225

    
226
        /**
227
         * Calculo del tama?o de bloque. Para ello comprueba si el raster est? siendo tileado. Si est? siendo
228
         * tileado se aplica el alto del tile menor para no pedir un bloque mayor que lo que un servidor puede
229
         * devolver. Si no est? siendo tileado se devuelve el tama?o de bloque de los par?metros.
230
         * @param flyrs Capas
231
         * @param params Par?metros del driver de escritura
232
         * @return tama?o de bloque
233
         */
234
        private int getBlockSize(Params params, FLayers flyrs) {
235

    
236
                int blockSize = Configuration.getValue("cache_blockheight", Integer.valueOf(RasterLibrary.blockHeight)).intValue();
237
                blockSize = RasterLibrary.blockHeight;
238

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

    
261
                return blockSize;
262
        }
263
}