Statistics
| Revision:

gvsig-raster / org.gvsig.raster.app / trunk / org.gvsig.raster.app / org.gvsig.raster.app.tools / src / main / java / org / gvsig / raster / app / extension / tool / saveas / SaveAsTocMenuEntry.java @ 453

History | View | Annotate | Download (12.4 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.app.extension.tool.saveas;
23
import java.awt.Component;
24
import java.beans.PropertyChangeEvent;
25
import java.beans.PropertyChangeListener;
26
import java.util.ArrayList;
27

    
28
import javax.swing.Icon;
29
import javax.swing.JOptionPane;
30
import javax.swing.filechooser.FileFilter;
31

    
32
import org.gvsig.andami.PluginServices;
33
import org.gvsig.andami.ui.mdiManager.IWindow;
34
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
35
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
36
import org.gvsig.app.project.documents.view.toc.AbstractTocContextMenuAction;
37
import org.gvsig.app.project.documents.view.toc.ITocItem;
38
import org.gvsig.fmap.dal.coverage.RasterLocator;
39
import org.gvsig.fmap.dal.coverage.RasterManager;
40
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
41
import org.gvsig.fmap.dal.coverage.datastruct.Params;
42
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
43
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
44
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
45
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
46
import org.gvsig.fmap.dal.coverage.util.ProviderServices;
47
import org.gvsig.fmap.geom.primitive.Envelope;
48
import org.gvsig.fmap.mapcontext.layers.FLayer;
49
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
50
import org.gvsig.gui.beans.swing.JFileChooser;
51
import org.gvsig.raster.app.extension.raster.gui.IGenericToolBarMenuItem;
52
import org.gvsig.raster.app.extension.raster.process.ClippingProcess;
53
import org.gvsig.raster.app.extension.raster.process.RasterProcess;
54
import org.gvsig.raster.fmap.layers.FLyrRaster;
55
import org.gvsig.raster.fmap.layers.ILayerState;
56
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
57
import org.gvsig.raster.util.ExtendedFileFilter;
58
import org.gvsig.raster.util.RasterToolsUtil;
59

    
60

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

    
85
        /**
86
         * Nadie puede crear una instancia a esta clase ?nica, hay que usar el
87
         * getSingleton()
88
         */
89
        private SaveAsTocMenuEntry() {}
90

    
91
        /**
92
         * Devuelve un objeto unico a dicha clase
93
         * @return
94
         */
95
        static public SaveAsTocMenuEntry getSingleton() {
96
                if (singleton == null)
97
                        singleton = new SaveAsTocMenuEntry();
98
                return singleton;
99

    
100
        }
101

    
102
        /*
103
         * (non-Javadoc)
104
         * @see com.iver.cit.gvsig.project.documents.contextMenu.AbstractContextMenuAction#getGroup()
105
         */
106
        public String getGroup() {
107
                return "RasterExport";
108
        }
109

    
110
        /*
111
         * (non-Javadoc)
112
         * @see com.iver.cit.gvsig.project.documents.contextMenu.AbstractContextMenuAction#getGroupOrder()
113
         */
114
        public int getGroupOrder() {
115
                return 50;
116
        }
117

    
118
        /*
119
         * (non-Javadoc)
120
         * @see com.iver.cit.gvsig.project.documents.contextMenu.AbstractContextMenuAction#getOrder()
121
         */
122
        public int getOrder() {
123
                return 1;
124
        }
125

    
126
        /*
127
         * (non-Javadoc)
128
         * @see com.iver.cit.gvsig.project.documents.IContextMenuAction#getText()
129
         */
130
        public String getText() {
131
                return PluginServices.getText(this, "saveas");
132
        }
133

    
134
        /*
135
         * (non-Javadoc)
136
         * @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[])
137
         */
138
        public boolean isEnabled(ITocItem item, FLayer[] selectedItems) {
139
                if ((selectedItems == null) || (selectedItems.length != 1))
140
                        return false;
141

    
142
                if (!(selectedItems[0] instanceof ILayerState))
143
                        return false;
144

    
145
                if (!((ILayerState) selectedItems[0]).isOpen())
146
                        return false;
147

    
148
                return true;
149
        }
150

    
151
        /*
152
         * (non-Javadoc)
153
         * @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[])
154
         */
155
        public boolean isVisible(ITocItem item, FLayer[] selectedItems) {
156
                if ((selectedItems == null) || (selectedItems.length != 1))
157
                        return false;
158

    
159
                if (!(selectedItems[0] instanceof IRasterLayerActions))
160
                        return false;
161

    
162
                return (((IRasterLayerActions) selectedItems[0]).isActionEnabled(IRasterLayerActions.SAVEAS));
163
        }
164

    
165
        /*
166
         * (non-Javadoc)
167
         * @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[])
168
         */
169
        public void execute(ITocItem item, FLayer[] selectedItems) {
170
                FLayer lyr = null;
171
                IWindow w = PluginServices.getMDIManager().getActiveWindow();
172
                RasterManager rManager = RasterLocator.getManager();
173

    
174
                if (selectedItems.length != 1)
175
                        return;
176

    
177
                lyr = selectedItems[0];
178

    
179
                if (!(lyr instanceof FLyrRaster))
180
                        return;
181
                
182
                FLyrRaster fLayer = (FLyrRaster)lyr;
183
                
184
                chooser = new JFileChooser("SAVE_AS_TOC_MENU_ENTRY",JFileChooser.getLastPath("SAVE_AS_TOC_MENU_ENTRY", null));
185
                chooser.addPropertyChangeListener(this);
186
                chooser.setDialogTitle(PluginServices.getText(this, "seleccionar_fichero"));
187

    
188
                // Cargamos las extensiones en la lista
189
                ArrayList<String> extList = new ArrayList<String>();
190
                try {
191
                        ProviderServices serv = rManager.getProviderServices();
192
                        extList = serv.getExtensionsSupported(fLayer.getDataStore().getDataType()[0], fLayer.getDataStore().getBandCount(), false);
193
                } catch (RasterDriverException e2) {
194
                        RasterToolsUtil.messageBoxError("error_extensiones_soportadas", chooser, e2);
195
                        e2.printStackTrace();
196
                        return;
197
                }
198

    
199
                int selected_id = extList.size() - 1;
200
                FileFilter selected = null;
201
                for (int i = 0; i < extList.size(); i++) {
202
                        FileFilter filter = new ExtendedFileFilter((String) extList.get(i));
203
                        if (extList.get(i).equals("tif")) {
204
                                selected = filter;
205
                                selected_id = i;
206
                        }
207
                        chooser.addChoosableFileFilter(filter);
208
                }
209
                if (selected != null)
210
                        chooser.setFileFilter(selected);
211

    
212
                // Cargamos el panel de propiedades en el selector
213
                panelProperty = loadPanelProperties((String) extList.get(selected_id));
214
                chooser.setAccessory(panelProperty);
215
                chooser.setAcceptAllFileFilterUsed(false);
216

    
217
                if (w instanceof DefaultViewPanel) {
218
                        if (chooser.showSaveDialog(((AbstractViewPanel) w).getComponent(0)) == JFileChooser.APPROVE_OPTION) {
219
                                // Creaci?n de par?metros
220
                                String tit = PluginServices.getMDIManager().getWindowInfo(w).getTitle();
221
                                DataServerWriter dataWriter = rManager.createDataServerWriter();
222
                                RasterDataStore datastore = ((FLyrRaster)fLayer).getDataStore();
223
                                int[] drawableBands = new int[fLayer.getDataStore().getBandCount()];
224
                                for (int i = 0; i < fLayer.getDataStore().getBandCount(); i++)
225
                                        drawableBands[i] = i;
226
                                JFileChooser.setLastPath("SAVE_AS_TOC_MENU_ENTRY", chooser.getCurrentDirectory());
227
                                String file =  ((ExtendedFileFilter) chooser.getFileFilter()).getNormalizedFilename(chooser.getSelectedFile());
228
                                
229
                                long bytes = rManager.getRasterUtils().getBytesFromRaster((int)fLayer.getPxWidth(),
230
                                                (int) fLayer.getPxHeight(),
231
                                                fLayer.getDataStore().getDataType()[0],
232
                                                fLayer.getDataStore().getBandCount());
233
                                
234
                                long maxJp2 = 13000 * 12500 * 3;
235
                                if (bytes > (20000 * 20000 * 3)) {
236
                                        if(!RasterToolsUtil.messageBoxYesOrNot("output_file_too_big", null))
237
                                                return;
238
                                }
239
                                if (file.endsWith(".jp2")) {
240
                                        if (bytes > maxJp2) {
241
                                                if(!RasterToolsUtil.messageBoxYesOrNot("output_file_too_big_jpeg2000", null))
242
                                                        return;
243
                                        }
244
                                }
245
                                
246
                                if (!RasterToolsUtil.canWrite(chooser.getCurrentDirectory().toString(), this))
247
                                        return;
248
                                Params params = null;
249
                                try {
250
                                        params = rManager.createWriter(file).getParams();
251
                                } catch (NotSupportedExtensionException e1) {
252
                                        RasterToolsUtil.messageBoxError("no_driver_escritura", this, e1);
253
                                } catch (RasterDriverException e1) {
254
                                        RasterToolsUtil.messageBoxError("no_driver_escritura", this, e1);
255
                                }
256

    
257
                                // Lanzamiento del proceso de guardado
258
                                RasterProcess clippingProcess = new ClippingProcess();
259
                                clippingProcess.setActions(new SaveAsActions());
260
                                clippingProcess.addParam("viewname", tit);
261
                                if(fLayer.isRemote()) {
262
                                        Envelope env = ((DefaultViewPanel)w).getMapControl().getViewPort().getEnvelope();
263
                                        clippingProcess.addParam("realcoordinates", new double[] { env.getMinimum(0), env.getMaximum(1), env.getMaximum(0), env.getMinimum(1)});
264
                                        clippingProcess.addParam("resolution", new int[]{(int) fLayer.getPxWidth(),
265
                                                                                                                                          (int) fLayer.getPxHeight()});
266
                                } else {
267
                                        clippingProcess.addParam("pixelcoordinates", new int[] { 0, (int) fLayer.getPxHeight(), (int) fLayer.getPxWidth(), 0 });
268
                                        clippingProcess.addParam("resolution", new int[]{(int) fLayer.getPxWidth(),
269
                                                                                                                                          (int) fLayer.getPxHeight()});
270
                                }
271
                                clippingProcess.addParam("filename", file);
272
                                clippingProcess.addParam("datawriter", dataWriter);
273
                                clippingProcess.addParam("layer", fLayer);
274
                                clippingProcess.addParam("drawablebands", drawableBands);
275
                                clippingProcess.addParam("colorInterpretation", datastore.getColorInterpretation());
276
                                clippingProcess.addParam("onelayerperband", new Boolean(false));
277
                                clippingProcess.addParam("interpolationmethod", new Integer(Buffer.INTERPOLATION_NearestNeighbour));
278
                                clippingProcess.addParam("affinetransform", datastore.getAffineTransform());
279

    
280

    
281
                                if (params != null)
282
                                        RasterToolsUtil.loadWriterParamsFromPropertiesPanel(panelProperty, params);
283
                                clippingProcess.addParam("driverparams", params);
284
                                clippingProcess.start();
285
                        }
286
                }
287
        }
288

    
289
        /**
290
         * Evento que se produce al cambiar el driver de escritura. Esto
291
         * sustituye el panel properties por el del nuevo driver seleccionado
292
         */
293
        public void propertyChange(PropertyChangeEvent evt) {
294
                if (evt.getNewValue() instanceof ExtendedFileFilter) {
295
                        String ext = ((ExtendedFileFilter) evt.getNewValue()).getExtensions().get(0).toString();
296
                        panelProperty = loadPanelProperties(ext);
297
                        chooser.setAccessory(panelProperty);
298
                        chooser.revalidate();
299
                }
300
        }
301

    
302
        /**
303
         * Obtiene el objeto PropertiesComponent para una extensi?n concreta de fichero
304
         * sobre el que se va a escribir.
305
         * @param file Fichero raster sobre el que se escribir?
306
         * @return PropertiesComponent
307
         */
308
        private PropertiesComponent loadPanelProperties(String file) {
309
                PropertiesComponent panelProperty = new PropertiesComponent();
310
                Params params = null;
311
                try {
312
                        params = RasterLocator.getManager().createWriter(file).getParams();
313
                } catch (NotSupportedExtensionException e1) {
314
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
315
                        return null;
316
                } catch (RasterDriverException e1) {
317
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
318
                        return null;
319
                }
320
                RasterToolsUtil.loadPropertiesFromWriterParams(panelProperty, params, null);
321
                return panelProperty;
322
        }
323

    
324
        /*
325
         * (non-Javadoc)
326
         * @see org.gvsig.rastertools.generictoolbar.IGenericToolBarMenuItem#getIcon()
327
         */
328
        public Icon getIcon() {
329
                return PluginServices.getIconTheme().get("save-icon");
330
        }
331
}