Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / saveraster / ui / listener / SaveRasterDialogListener.java @ 18000

History | View | Annotate | Download (9.7 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.RasterLibrary;
34
import org.gvsig.raster.buffer.IQueryableRaster;
35
import org.gvsig.raster.dataset.GeoRasterWriter;
36
import org.gvsig.raster.dataset.NotSupportedExtensionException;
37
import org.gvsig.raster.dataset.Params;
38
import org.gvsig.raster.dataset.io.RasterDriverException;
39
import org.gvsig.raster.util.RasterToolsUtil;
40
import org.gvsig.raster.util.RasterUtilities;
41
import org.gvsig.rastertools.Configuration;
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
                //Comprobamos que el en la ruta de destino tengamos permisos de escritura
114
                File f = new File(fName);
115
                if(f.exists())
116
                        if(!RasterToolsUtil.messageBoxYesOrNot("raster_error_file_exists", dialog))
117
                                return false;
118
                
119
                f = new File(fName.substring(0, fName.lastIndexOf(File.separator)));
120
                                
121
                if(f.exists() && f.isDirectory() && !f.canWrite()) {
122
                        RasterToolsUtil.messageBoxError("error_file_not_writable", dialog);
123
                        return false;
124
                }
125

    
126
                dialog.getDataInputListener().resetFileName();
127
                dialog.getDataInputListener().enableButtons();
128

    
129
                double lrX = Double.parseDouble(controlPanel.getTInfDerX().getValue());
130
                double lrY = Double.parseDouble(controlPanel.getTInfDerY().getValue());
131
                double ulX = Double.parseDouble(controlPanel.getTSupIzqX().getValue());
132
                double ulY = Double.parseDouble(controlPanel.getTSupIzqY().getValue());
133
                double width = 0;
134
                if(ulX > lrX) width = (double)(ulX - lrX);
135
                else width = (double)(lrX - ulX);
136
                double height = 0;
137
                if(ulY > lrY) height = (double)(ulY - lrY);
138
                else height = (double)(lrY - ulY);
139
                Rectangle2D ext = null;
140

    
141
                if(ulY < lrY)
142
                        ext = new Rectangle2D.Double(ulX, ulY, width, height);
143
                else
144
                        ext = new Rectangle2D.Double(ulX, lrY, width, height);
145

    
146
                Params params = getWriterParams(fName);
147
                int blockSize = getBlockSize(params, layers);
148

    
149
                ViewPort viewPort = new ViewPort(layers.getProjection());
150
                viewPort.setBackColor(mapCtrl.getViewPort().getBackColor());
151
                viewPort.setImageSize(dimension);
152
                viewPort.setExtent(ext);
153

    
154
                //Creamos el servidor de datos de la vista
155
                RasterizerLayer rasterizerLayer = new RasterizerLayer(layers, viewPort, blockSize);
156

    
157
                //Creamos la clase con el proceso y lo lanzamos
158
                SaveRasterProcess saveRasterProcess = new SaveRasterProcess();
159
                saveRasterProcess.setActions(new SaveRasterActions());
160
                saveRasterProcess.addParam("viewport", viewPort);
161
                saveRasterProcess.addParam("dimension", dimension);
162
                saveRasterProcess.addParam("rasterizerlayer", rasterizerLayer);
163
                saveRasterProcess.addParam("filename", fName);
164
                saveRasterProcess.addParam("writerparams", params);
165
                saveRasterProcess.start();
166

    
167
                return true;
168
        }
169

    
170
        /**
171
         * Funci?n a ejecutar cuando se pulsa el bot?n de propiedades.
172
         * @param e ActionEvent
173
         */
174
        private void propsButtonActionPerformed(ActionEvent e){
175
                String name = dialog.getDataInputListener().getFileName();
176

    
177
                //Si no se ha seleccionado ning?n fichero salimos
178
                if(name == null || name.equals(""))
179
                        return;
180

    
181
                Params params = getWriterParams(name);
182
                PropertiesPanel panel = new PropertiesPanel();
183
                WriterPropertiesDialog dialog = new WriterPropertiesDialog(panel, params);
184
                PluginServices.getMDIManager().addWindow(dialog);
185
        }
186

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

    
207
                        if(writer == null)
208
                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
209

    
210
                        return writer.getParams();
211

    
212
                } catch (NotSupportedExtensionException e1) {
213
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
214
                        return null;
215
                } catch (RasterDriverException e1) {
216
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
217
                        return null;
218
                }
219
        }
220

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

    
231
                int blockSize = Configuration.getValue("cache_blockheight", Integer.valueOf(RasterLibrary.blockHeight)).intValue();
232
                        blockSize = RasterLibrary.blockHeight;
233

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

    
258
                return blockSize;
259
        }
260
}