Statistics
| Revision:

gvsig-raster / org.gvsig.raster.mosaic / trunk / org.gvsig.raster.mosaic / org.gvsig.raster.mosaic.app / src / main / java / org / gvsig / raster / mosaic / app / gui / MosaicPropertiesListener.java @ 723

History | View | Annotate | Download (12.1 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.mosaic.app.gui;
23

    
24
import java.awt.Component;
25
import java.awt.event.ActionEvent;
26
import java.awt.event.ActionListener;
27
import java.awt.geom.Point2D;
28
import java.io.File;
29
import java.io.IOException;
30
import java.util.ArrayList;
31

    
32
import javax.swing.event.TableModelEvent;
33
import javax.swing.event.TableModelListener;
34

    
35
import org.gvsig.andami.PluginServices;
36
import org.gvsig.andami.ui.mdiManager.WindowInfo;
37
import org.gvsig.fmap.dal.DALLocator;
38
import org.gvsig.fmap.dal.DataServerExplorer;
39
import org.gvsig.fmap.dal.DataServerExplorerParameters;
40
import org.gvsig.fmap.dal.DataStoreParameters;
41
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
42
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
43
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
44
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
45
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
46
import org.gvsig.fmap.dal.spi.DataStoreProvider;
47
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
48
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
49
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
50
import org.gvsig.gui.beans.swing.JFileChooser;
51
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
52
import org.gvsig.raster.mosaic.io.MosaicDataParameters;
53
import org.gvsig.raster.mosaic.io.MosaicProvider;
54
import org.gvsig.raster.mosaic.io.MosaicRasterFormat;
55
import org.gvsig.raster.mosaic.io.MosaicRasterFormatSerializer;
56
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
57

    
58

    
59
/**
60
 * Class for listen to events in mosaic GUI
61
 * @author Nacho Brodin (nachobrodin@gmail.com)
62
 */
63
public class MosaicPropertiesListener implements TableModelListener, ActionListener, ButtonsPanelListener {
64
        private MosaicPropertiesPanel                panel                  = null;
65
        private String                               layerName              = null;
66
        
67
        
68
        public MosaicPropertiesListener(MosaicPropertiesPanel panel) {
69
                this.panel = panel;
70
                panel.getAddButton().addActionListener(this);
71
                panel.getCreateButton().addActionListener(this);
72
                panel.getSeeListCheck().addActionListener(this);
73
                panel.getDeleteButton().addActionListener(this);
74
                panel.getModel().addTableModelListener(this);
75
        }
76

    
77
        /**
78
         * Events in the table
79
         */
80
        public void tableChanged(TableModelEvent e) {
81
                if(e.getColumn() == 0) {
82
                        MosaicDataParameters params = (MosaicDataParameters)panel.getfLayer().getDataStore().getParameters();
83
                        Object[][] data = panel.getModel().getDataWithoutPath();
84
                        for (int i = 0; i < data.length; i++) {
85
                                boolean b = ((Boolean)data[i][0]).booleanValue();
86
                                params.getProviders().get(i).getDataParameters().setVisible(b);
87
                        }
88
                }
89
        }
90

    
91
        public void accept() {
92
                apply();
93
                
94
        }
95

    
96
        @SuppressWarnings("deprecation")
97
        public void apply() {
98
                try {
99
                        RasterDataStore dataStore = panel.getfLayer().getDataStore();
100
                        RasterDataParameters paramFirstFile = (RasterDataParameters)dataStore.getParameters();
101
                        boolean create = !(paramFirstFile instanceof MosaicDataParameters);
102
                        DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
103
                        
104
                        String basePath = paramFirstFile.getURI().substring(0, paramFirstFile.getURI().lastIndexOf(File.separator) + 1);
105
                        String path = basePath + layerName + ".mrf";
106
                        
107
                        MosaicDataParameters newParamsMosaic = null;
108
                        
109
                        //Gets the mosaic provider parameters if we are creating a new mosaic
110
                        if(create) {
111
                                DataServerExplorerParameters explParams = dataManager.createServerExplorerParameters(MosaicProvider.NAME);
112
                                DataServerExplorer explorer = dataManager.openServerExplorer(MosaicProvider.NAME, explParams);
113
                                newParamsMosaic = (MosaicDataParameters)dataManager.createStoreParameters(explorer.getProviderName());
114

    
115
                                newParamsMosaic.setURI(path);
116
                                //Temporal hasta que est? el cuadro de configuraci?n. Se pone el tama?o de pixel de la imagen maestra
117
                                newParamsMosaic.setPixelSize(dataStore.getCellSize());
118
                        } else
119
                                newParamsMosaic = (MosaicDataParameters)paramFirstFile;
120
                        
121
                        Object[][] data = panel.getModel().getDataWithPath();
122
                        ArrayList<File> uriList = new ArrayList<File>();
123
                        
124
                        DataServerExplorerParameters param = (DataServerExplorerParameters) dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
125
                        FilesystemServerExplorer fsexplorer = (FilesystemServerExplorer) dataManager.createServerExplorer(param);
126
                        
127
                        //Iterates all files and builds a new provider for each one
128
                        for (int i = 0; i < data.length; i++) {
129
                                String file = (String)data[i][1];
130
                                uriList.add(new File(file));
131
                                if(!newParamsMosaic.existsProvider(file)) {
132
                                        File f = new File(file);
133
                                        fsexplorer.setCurrentPath(new File(basePath));
134

    
135
                                        ArrayList<String> provName = fsexplorer.getProviderNameList(f);
136
                                        if(provName.size() > 0) {
137
                                                for (int j = 0; j < provName.size(); j++) {
138
                                                        DataStoreParameters newparams = fsexplorer.createStoreParameters(f, provName.get(j));
139
                                                        ((FilesystemStoreParameters)newparams).setFile(f); 
140
                                                        DataStoreProvider prov = dataManager.createProvider((DataStoreProviderServices)dataStore, newparams);
141
                                                        if(newParamsMosaic.addNotTiledProvider(prov))
142
                                                                break;
143
                                                }
144
                                        }
145
                                }
146
                        }
147
                        
148
                        if(create) {
149
                                MosaicProvider provMosaic = (MosaicProvider)dataManager.createProvider((DataStoreProviderServices)dataStore, newParamsMosaic);
150
                                ((DefaultFLyrRaster)panel.getfLayer()).setName(layerName);
151
                                //Assigns the MultifileProvider to the store
152
                                dataStore.setProvider(provMosaic);
153
                        }
154
                        
155
                        //((DefaultFLyrRaster)panel.getfLayer()).getRender().setLastTransparency(null);
156
                        saveMosaicFileLayer(layerName, paramFirstFile.getURI(), uriList);
157
                        panel.setCreateStatus();
158
                } catch (Exception exc) {
159
                        RasterToolsUtil.messageBoxError("addband_error", panel, exc);
160
                }
161
        }
162
        
163
        /**
164
         * Saves the new layer in disk
165
         * @param layerName
166
         * @param file
167
         * @param uriList
168
         * @throws IOException
169
         */
170
        private String saveMosaicFileLayer(String layerName, String file, ArrayList<File> uriList) throws IOException {
171
                String path = file.substring(0, file.lastIndexOf(File.separator) + 1);
172
                path = path + layerName + ".mrf";
173
                
174
                MosaicRasterFormat format = new MosaicRasterFormat();
175
                for (int i = 0; i < uriList.size(); i++) {
176
                        format.addFile(uriList.get(i));
177
                }
178
                format.setName(layerName);
179
                
180
                MosaicRasterFormatSerializer.write(format, path);
181
                return path;
182
        }
183

    
184
        public void cancel() {
185
                
186
        }
187

    
188
        public void selected() {
189
                
190
        }
191

    
192
        /*
193
         * (non-Javadoc)
194
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
195
         */
196
        public void actionPerformed(ActionEvent e) {
197
                if(e.getSource() == panel.getCreateButton()) {
198
                        WindowInfo wi = PluginServices.getMDIManager().getActiveWindow().getWindowInfo();
199
                        LayerNameDialog dialog = new LayerNameDialog(new Point2D.Double(wi.getX(), wi.getY()), 300, 80, this);
200
                        RasterToolsUtil.addWindow(dialog);
201
                        return;
202
                }
203
                
204
                if(e.getSource() == panel.getAddButton()) {
205
                        if(panel.getAddFilesRadio().isSelected()) {
206
                                selectFiles();
207
                        } else {
208
                                selectDirectory();
209
                        }
210
                }
211
                
212
                if(e.getSource() == panel.getDeleteButton()) {
213
                        int[] index = panel.getFileList().getSelectedRows();
214
                        panel.getModel().delete(index);
215
                }
216
                
217
                if(e.getSource() == panel.getSeeListCheck()) {
218
                        panel.getModel().setSeeFlag(panel.getSeeListCheck().isSelected());
219
                        panel.getFileList().repaint();
220
                }
221
                
222
                panel.setCreateStatus();
223
        }
224
        
225
        /**
226
         * Selects a list of files
227
         */
228
        private void selectFiles() {
229
                JFileChooser chooser = new JFileChooser("DATA_INPUT_LISTENER", JFileChooser.getLastPath("DATA_INPUT_LISTENER", null));
230
                chooser.setDialogTitle(PluginServices.getText(this, "select_file"));
231
                chooser.setAcceptAllFileFilterUsed(true);
232
                chooser.setMultiSelectionEnabled(true);
233
                
234
                int returnVal = chooser.showOpenDialog((Component)panel);
235
                if (returnVal == JFileChooser.APPROVE_OPTION) {
236
                        File[] fileList = chooser.getSelectedFiles();
237
                        ArrayList<File> fileArray = new ArrayList<File>();
238
                        for (int i = 0; i < fileList.length; i++) {
239
                                if(!existsFile(fileList[i]))
240
                                        fileArray.add(fileList[i]);
241
                        }
242
                        addData(fileArray);
243
                }
244
        }
245
        
246
        /**
247
         * Returns true if exists the file in the table
248
         * @param file
249
         * @return
250
         */
251
        private boolean existsFile(File file) {
252
                for (int i = 0; i < panel.getModel().getRowCount(); i++) {
253
                        String path = (String)panel.getModel().getDataWithPath()[i][1];
254
                        if(path.compareTo(file.getAbsolutePath()) == 0)
255
                                return true;
256
                }
257
                return false;
258
        }
259
        
260
        /**
261
         * Selects the files of a directory
262
         */
263
        private void selectDirectory() {
264
                JFileChooser chooser = new JFileChooser("DATA_INPUT_LISTENER", JFileChooser.getLastPath("DATA_INPUT_LISTENER", null));
265
                chooser.setDialogTitle(PluginServices.getText(this, "select_directory"));
266
                chooser.setAcceptAllFileFilterUsed(true);
267
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
268
                
269
                int returnVal = chooser.showOpenDialog((Component)panel);
270
                if (returnVal == JFileChooser.APPROVE_OPTION) {
271
                        File dir = chooser.getSelectedFile();
272
                        if(dir.isDirectory()) {
273
                                String[] files = dir.list();
274
                                ArrayList<File> fileArray = new ArrayList<File>();
275
                                for (int j = 0; j < files.length; j++) {
276
                                        File f = new File(dir + File.separator + files[j]);
277
                                        if(!existsFile(f)) {
278
                                                fileArray.add(f);
279
                                        }
280
                                }
281
                                addData(fileArray);
282
                        }
283
                }
284
        }
285
        
286
        /**
287
         * Adds data to the array of data
288
         * @param fileList
289
         * @param data
290
         * @return
291
         */
292
        public void addData(ArrayList<File> fileArray) {
293
                for (int i = fileArray.size() - 1; i >= 0; i--) {
294
                        if(fileArray.get(i).isDirectory())
295
                                fileArray.remove(i);
296
                }
297
                
298
                Object[][] dataOld = panel.getModel().getDataWithPath();
299
                Object[][] dataWithoutOld = panel.getModel().getDataWithoutPath();
300
                
301
                Object[][] newdata = null;
302
                Object[][] newdataWithout = null;
303
                
304
                if(dataOld == null) {
305
                        newdata = new Object[fileArray.size()][2];
306
                        newdataWithout = new Object[fileArray.size()][2];
307
                        for (int i = 0; i < newdata.length; i++) {
308
                                if(!fileArray.get(i).isDirectory()) {
309
                                        newdata[i][0] = newdataWithout[i][0] = new Boolean(true);
310
                                        newdata[i][1] = fileArray.get(i).getAbsolutePath();
311
                                        newdataWithout[i][1] = fileArray.get(i).getName();
312
                                }
313
                        }
314
                } else {
315
                        newdata = new Object[dataOld.length + fileArray.size()][2];
316
                        newdataWithout = new Object[dataWithoutOld.length + fileArray.size()][2];
317
                        for (int i = 0; i < dataOld.length; i++) {
318
                                newdata[i][0] = newdataWithout[i][0] = dataOld[i][0];
319
                                newdata[i][1] = dataOld[i][1];
320
                                newdataWithout[i][1] = dataWithoutOld[i][1];
321
                        }
322
                        for (int i = dataOld.length; i < dataOld.length + fileArray.size(); i++) {
323
                                newdata[i][0] = newdataWithout[i][0] = new Boolean(true);
324
                                if(!fileArray.get(i - dataOld.length).isDirectory()) {
325
                                        newdata[i][1] = fileArray.get(i - dataOld.length).getAbsolutePath();
326
                                        newdataWithout[i][1] = fileArray.get(i - dataOld.length).getName();
327
                                }
328
                        }
329
                }
330
                
331
                panel.getModel().setData(newdata, newdataWithout);
332
                panel.getFileList().repaint();
333
        }
334

    
335
        public void actionButtonPressed(ButtonsPanelEvent e) {
336
                //After introduce the name of the new layer
337
                layerName = (String)e.getSource();
338
                
339
                panel.getModel().clearModel();
340
                if(panel.getfLayer() != null) {
341
                        ArrayList<File> f = new ArrayList<File>();
342
                        f.add(new File(panel.getfLayer().getDataStore().getName()));
343
                        addData(f);
344
                }
345
                
346
                if(panel.getAddFilesRadio().isSelected()) {
347
                        selectFiles();
348
                } else {
349
                        selectDirectory();
350
                }
351
        }
352
        
353
}