Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / saveas / SaveAsTocMenuEntry.java @ 13328

History | View | Annotate | Download (10.1 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.saveas;
20

    
21
import java.awt.Component;
22
import java.beans.PropertyChangeEvent;
23
import java.beans.PropertyChangeListener;
24
import java.io.File;
25
import java.util.ArrayList;
26

    
27
import javax.swing.JFileChooser;
28
import javax.swing.JOptionPane;
29

    
30
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
31
import org.gvsig.fmap.raster.layers.IRasterLayerActions;
32
import org.gvsig.gui.beans.incrementabletask.IncrementableTask;
33
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
34
import org.gvsig.raster.buffer.BufferInterpolation;
35
import org.gvsig.raster.dataset.GeoRasterWriter;
36
import org.gvsig.raster.dataset.IRasterDataSource;
37
import org.gvsig.raster.dataset.NotSupportedExtensionException;
38
import org.gvsig.raster.dataset.Params;
39
import org.gvsig.raster.dataset.RasterDriverException;
40
import org.gvsig.raster.hierarchy.IRasterDataset;
41
import org.gvsig.raster.hierarchy.IRasterGeoOperations;
42
import org.gvsig.raster.hierarchy.IRasterOperations;
43
import org.gvsig.rastertools.RasterModule;
44
import org.gvsig.rastertools.RasterToolsUtil;
45
import org.gvsig.rastertools.cutting.CuttingProcess;
46
import org.gvsig.rastertools.cutting.WriterBufferServer;
47

    
48
import com.iver.andami.PluginServices;
49
import com.iver.andami.messages.NotificationManager;
50
import com.iver.andami.ui.mdiManager.IWindow;
51
import com.iver.cit.gvsig.fmap.layers.FLayer;
52
import com.iver.cit.gvsig.project.documents.view.gui.View;
53
import com.iver.cit.gvsig.project.documents.view.toc.AbstractTocContextMenuAction;
54
import com.iver.cit.gvsig.project.documents.view.toc.ITocItem;
55

    
56
/**
57
 * <p>
58
 * Entrada del TOC que corresponde con la opci?n "Salvar Como" de raster. Esta se apoya
59
 * en el proceso de recorte de raster para salvar datos.
60
 * </p>
61
 * <p>
62
 * Cuando se abre el dialogo de "Salvar como" se cargan las extensiones soportadas en el
63
 * selector. Cada tipo de datos de la fuente soporta unas extensiones de escritura u otras.
64
 * Por ejemplo, si la capa de entrada  es FLOAT no podremos escribir a JPG2000 porque no
65
 * lo soporta, tendriamos que convertila primero a RGB.
66
 * </p>
67
 * <p>
68
 * Cambiando el tipo de extensi?n en el selector cambian el panel de propiedades asociado.
69
 * El fichero de salidad se salvar? con las propiedades ajustadas.
70
 * </P>
71
 * @version 30/05/2007
72
 * @author Nacho Brodin (nachobrodin@gmail.com)
73
 *
74
 */
75
public class SaveAsTocMenuEntry extends AbstractTocContextMenuAction implements PropertyChangeListener {
76

    
77
        private JFileChooser chooser = null;
78
        private PropertiesComponent panelProperty = null;
79

    
80
        /*
81
         * (non-Javadoc)
82
         * @see com.iver.cit.gvsig.project.documents.contextMenu.AbstractContextMenuAction#getGroup()
83
         */
84
        public String getGroup() {
85
                return "Save";
86
        }
87

    
88
        /*
89
         * (non-Javadoc)
90
         * @see com.iver.cit.gvsig.project.documents.contextMenu.AbstractContextMenuAction#getGroupOrder()
91
         */
92
        public int getGroupOrder() {
93
                return 50;
94
        }
95

    
96
        /*
97
         * (non-Javadoc)
98
         * @see com.iver.cit.gvsig.project.documents.contextMenu.AbstractContextMenuAction#getOrder()
99
         */
100
        public int getOrder() {
101
                return 1;
102
        }
103

    
104
        /*
105
         * (non-Javadoc)
106
         * @see com.iver.cit.gvsig.project.documents.IContextMenuAction#getText()
107
         */
108
        public String getText() {
109
                return PluginServices.getText(this, "saveas");
110
        }
111

    
112
        /*
113
         * (non-Javadoc)
114
         * @see com.iver.cit.gvsig.project.documents.view.toc.AbstractTocContextMenuAction#isEnabled(com.iver.cit.gvsig.project.documents.view.toc.ITocItem, com.iver.cit.gvsig.fmap.layers.FLayer[])
115
         */
116
        public boolean isEnabled(ITocItem item, FLayer[] selectedItems) {
117
                return selectedItems.length == 1;
118
        }
119

    
120
        /*
121
         * (non-Javadoc)
122
         * @see com.iver.cit.gvsig.project.documents.view.toc.AbstractTocContextMenuAction#isVisible(com.iver.cit.gvsig.project.documents.view.toc.ITocItem, com.iver.cit.gvsig.fmap.layers.FLayer[])
123
         */
124
        public boolean isVisible(ITocItem item, FLayer[] selectedItems) {
125
                if (isTocItemBranch(item))
126
                        return( getNodeLayer(item) instanceof FLyrRasterSE && 
127
                                    ((FLyrRasterSE)getNodeLayer(item)).isActionEnabled(IRasterLayerActions.SAVEAS));
128
                return false;
129
        }
130

    
131
        /*
132
         * (non-Javadoc)
133
         * @see com.iver.cit.gvsig.project.documents.view.toc.AbstractTocContextMenuAction#execute(com.iver.cit.gvsig.project.documents.view.toc.ITocItem, com.iver.cit.gvsig.fmap.layers.FLayer[])
134
         */
135
        public void execute(ITocItem item, FLayer[] selectedItems) {
136
                FLayer fLayer = null;
137
                IWindow w = PluginServices.getMDIManager().getActiveWindow();
138

    
139
                if (selectedItems.length != 1)
140
                        return;
141

    
142
                fLayer = selectedItems[0];
143

    
144
                if (!(fLayer instanceof IRasterOperations))
145
                        return;
146

    
147
                chooser = new JFileChooser(RasterModule.getPath());
148
                chooser.addPropertyChangeListener(this);
149
                chooser.setDialogTitle(PluginServices.getText(this, "seleccionar_fichero"));
150

    
151
                // Cargamos las extensiones en la lista
152
                ArrayList extList = new ArrayList();
153
                try {
154
                        extList = GeoRasterWriter.getExtensionsSupported(((IRasterGeoOperations) fLayer).getDataType()[0], ((IRasterGeoOperations) fLayer).getBandCount());
155
                } catch (RasterDriverException e2) {
156
                        RasterToolsUtil.messageBoxError("extensiones_soportadas_error", chooser);
157
                        NotificationManager.addError("Error al obtener la lista de extensiones soportadas. No se puede exportar la capa", e2);
158
                }
159
                for (int i = 0; i < extList.size(); i++)
160
                        chooser.addChoosableFileFilter(new WriterFilter((String) extList.get(i)));
161

    
162
                // Cargamos el panel de propiedades en el selector
163
                panelProperty = loadPanelProperties((String) extList.get(extList.size() - 1));
164
                chooser.setAccessory(panelProperty);
165

    
166
                if (w instanceof View) {
167
                        if (chooser.showOpenDialog(((View) w).getComponent(0)) == JFileChooser.APPROVE_OPTION) {
168
                                // Creaci?n de par?metros
169
                                String tit = PluginServices.getMDIManager().getWindowInfo(w).getTitle();
170
                                WriterBufferServer dataWriter = new WriterBufferServer();
171
                                int[] dValues = new int[] { 0, (int) ((IRasterOperations) fLayer).getPxHeight(), (int) ((IRasterOperations) fLayer).getPxWidth(), 0 };
172
                                IRasterDataSource dataset = (IRasterDataSource)((IRasterDataset) fLayer).getDataSource();
173
                                int[] drawableBands = new int[((IRasterOperations) fLayer).getBandCount()];
174
                                for (int i = 0; i < ((IRasterOperations) fLayer).getBandCount(); i++)
175
                                        drawableBands[i] = i;
176
                                RasterModule.setPath(chooser.getCurrentDirectory().toString());
177
                                String file = chooser.getSelectedFile().toString() + chooser.getFileFilter().getDescription();
178
                                if (!RasterToolsUtil.canWrite(chooser.getCurrentDirectory().toString(), this))
179
                                        return;
180
                                Params params = null;
181
                                try {
182
                                        params = GeoRasterWriter.getWriter(file).getParams();
183
                                } catch (NotSupportedExtensionException e1) {
184
                                        RasterToolsUtil.messageBoxError("no_driver_escritura", this);
185
                                        NotificationManager.addError(PluginServices.getText(this, "no_driver_escritura"), e1);
186
                                } catch (RasterDriverException e1) {
187
                                        RasterToolsUtil.messageBoxError("no_driver_escritura", this);
188
                                        NotificationManager.addError(PluginServices.getText(this, "no_driver_escritura"), e1);
189
                                }
190

    
191
                                // Lanzamiento del proceso de guardado
192
                                CuttingProcess cuttingProcess = new CuttingProcess(false, tit, dValues, file, dataWriter, dataset, dataset.getAffineTransform(), drawableBands, false, BufferInterpolation.INTERPOLATION_NearestNeighbour);
193
                                if (params != null)
194
                                        RasterToolsUtil.loadWriterParamsFromPropertiesPanel(panelProperty, params);
195
                                cuttingProcess.setParams(params);
196
                                cuttingProcess.setResolution((int) ((IRasterOperations) fLayer).getPxWidth(), (int) ((IRasterOperations) fLayer).getPxHeight());
197
                                IncrementableTask incrementableTask = new IncrementableTask(dataWriter);
198
                                cuttingProcess.setIncrementableTask(incrementableTask);
199
                                incrementableTask.showWindow();
200
                                cuttingProcess.start();
201
                                incrementableTask.start();
202
                        }
203
                }
204
        }
205

    
206
        /**
207
         * Evento que se produce al cambiar el driver de escritura. Esto
208
         * sustituye el panel properties por el del nuevo driver seleccionado
209
         */
210
        public void propertyChange(PropertyChangeEvent evt) {
211
                if(evt.getNewValue() instanceof WriterFilter) {
212
                        String ext = ((WriterFilter)evt.getNewValue()).getDescription();
213
                        panelProperty = loadPanelProperties(ext);
214
                        chooser.setAccessory(panelProperty);
215
                        chooser.revalidate();
216
                }
217
        }
218

    
219
        /**
220
         * Obtiene el objeto PropertiesComponent para una extensi?n concreta de fichero
221
         * sobre el que se va a escribir.
222
         * @param file Fichero raster sobre el que se escribir?
223
         * @return PropertiesComponent
224
         */
225
        private PropertiesComponent loadPanelProperties(String file) {
226
                PropertiesComponent panelProperty = new PropertiesComponent();
227
                Params params = null;
228
                try {
229
                        params = GeoRasterWriter.getWriter(file).getParams();
230
                } catch (NotSupportedExtensionException e1) {
231
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
232
                        return null;
233
                } catch (RasterDriverException e1) {
234
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
235
                        return null;
236
                }
237
                RasterToolsUtil.loadPropertiesFromWriterParams(panelProperty, params);
238
                return panelProperty;
239
        }
240

    
241
        /**
242
         * @author Nacho Brodin (nachobrodin@gmail.com) Filtro para el selector de
243
         *         formatos de escritura
244
         */
245
        class WriterFilter extends javax.swing.filechooser.FileFilter {
246
                        private String filter;
247

    
248
                        public WriterFilter(String fil) {
249
                                        this.filter = fil;
250
                        }
251

    
252
                        public boolean accept(File f) {
253
                                        return f.isDirectory() || f.getName().toLowerCase().endsWith("." + filter);
254
                        }
255

    
256
                        public String getDescription() {
257
                                        return "." + filter;
258
                        }
259
        }
260

    
261
}