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 @ 2358

History | View | Annotate | Download (18.2 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
import java.util.List;
32

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

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

    
59

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

    
82
        /**
83
         * Events in the table
84
         */
85
        public void tableChanged(TableModelEvent e) {
86
                if(e.getColumn() == 0) {
87
                        MosaicDataParameters params = (MosaicDataParameters)panel.getfLayer().getDataStore().getParameters();
88
                        Object[][] data = panel.getModel().getDataWithoutPath();
89
                        for (int i = 0; i < data.length; i++) {
90
                                boolean b = ((Boolean)data[i][0]).booleanValue();
91
                                params.setVisibleProvider(i, b);
92
                        }
93
                }
94
        }
95

    
96
        public void accept() {
97
                apply();
98
        }
99

    
100
        public void apply() {
101
                addFilesToProviderFromTable();
102
        }
103
        
104
        /**
105
         * Gets the name of the layer
106
         * @return
107
         */
108
        public String getLayerName() {
109
                if(layerName == null) {
110
                        layerName = panel.getfLayer().getName();
111
                        if(layerName.endsWith(suffix)) {
112
                                int index = layerName.lastIndexOf(suffix);
113
                                layerName = layerName.substring(0, index);
114
                        }
115
                }
116
                return layerName;
117
        }
118
        
119
        /**
120
         * Adds all files in the table to the MosaicProvider or creates one if this doesn't exist.
121
         */
122
        @SuppressWarnings("deprecation")
123
        private void addFilesToProviderFromTable() {
124
                if(panel.getModel().getRowCount() == 0)
125
                        return;
126
                try {
127
                        RasterDataStore dataStore = panel.getfLayer().getDataStore();
128
                        RasterDataParameters paramFirstFile = (RasterDataParameters)dataStore.getParameters();
129
                        boolean create = !(paramFirstFile instanceof MosaicDataParameters);
130
                        DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
131
                        
132
                        String basePath = paramFirstFile.getURI().substring(0, paramFirstFile.getURI().lastIndexOf(File.separator) + 1);
133
                        String path = basePath + layerName + suffix;
134
                        
135
                        MosaicDataParameters newParamsMosaic = null;
136
                        
137
                        //Gets the mosaic provider parameters if we are creating a new mosaic
138
                        if(create) {
139
                                DataServerExplorerParameters explParams = dataManager.createServerExplorerParameters(MosaicProvider.NAME);
140
                                DataServerExplorer explorer = dataManager.openServerExplorer(MosaicProvider.NAME, explParams);
141
                                newParamsMosaic = (MosaicDataParameters)dataManager.createStoreParameters(explorer.getProviderName());
142

    
143
                                newParamsMosaic.setURI(path);
144
                                //Temporal hasta que est? el cuadro de configuraci?n. Se pone el tama?o de pixel de la imagen maestra
145
                                newParamsMosaic.setPixelSize(dataStore.getCellSize());
146
                        } else
147
                                newParamsMosaic = (MosaicDataParameters)paramFirstFile;
148
                        
149
                        Object[][] data = panel.getModel().getDataWithPath();
150
                        ArrayList<File> uriList = new ArrayList<File>();
151
                        
152
                        DataServerExplorerParameters param = (DataServerExplorerParameters) dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
153
                        FilesystemServerExplorer fsexplorer = (FilesystemServerExplorer) dataManager.createServerExplorer(param);
154
                        
155
                        //Iterates all files and builds a new provider for each one
156
                        for (int i = 0; i < data.length; i++) {
157
                                String file = (String)data[i][1];
158
                                uriList.add(new File(file));
159
                                if(!newParamsMosaic.existsProvider(file)) {
160
                                        File f = new File(file);
161
                                        fsexplorer.setCurrentPath(new File(basePath));
162

    
163
                                        List<String> provName = fsexplorer.getProviderNameList(f);
164
                                        if(provName.size() > 0) {
165
                                                for (int j = 0; j < provName.size(); j++) {
166
                                                        DataStoreParameters newparams = fsexplorer.createStoreParameters(f, provName.get(j));
167
                                                        ((FilesystemStoreParameters)newparams).setFile(f); 
168
                                                        DataStoreProvider prov = dataManager.createProvider((DataStoreProviderServices)dataStore, newparams);
169
                                                        if(newParamsMosaic.addNotTiledProvider(prov))
170
                                                                break;
171
                                                }
172
                                        }
173
                                }
174
                        }
175
                        
176
                        if(create) {
177
                                DataStoreProvider provMosaic = dataManager.createProvider((DataStoreProviderServices)dataStore, newParamsMosaic);
178
                                ((DefaultFLyrRaster)panel.getfLayer()).setName(layerName);
179
                                //Assigns the MultifileProvider to the store
180
                                dataStore.setProvider((CoverageStoreProvider)provMosaic);
181
                                //panel.getfLayer().getRender().setLastTransparency(panel.getfLayer().getDataStore().getTransparency());
182
                        }
183
                        
184
                        saveMosaicFileLayer(layerName, paramFirstFile.getURI(), uriList);
185
                        panel.setCreateStatus();
186
                } catch (Exception exc) {
187
                        RasterSwingLibrary.messageBoxError("addfile_mosaic_error", panel, exc);
188
                }
189
        }
190
        
191
        /**
192
         * Removes a provider from the MosaicProvider
193
         * @param fileName
194
         */
195
        private void removeFileFromProvider(String fileName) {
196
                try {
197
                        RasterDataStore dataStore = panel.getfLayer().getDataStore();
198
                        RasterDataParameters params = (RasterDataParameters)dataStore.getParameters();
199
                        if(params instanceof MosaicDataParameters) {
200
                                MosaicDataParameters paramsMosaic = (MosaicDataParameters)params;
201
                                ArrayList<File> uriList = new ArrayList<File>();
202
                                
203
                                for (int i = paramsMosaic.getProviderCount() - 1; i >= 0; i--) {
204
                                        String uri = paramsMosaic.getURIByProvider(i);
205
                                        if(fileName.compareTo(uri) == 0)
206
                                                paramsMosaic.removeProvider(i);
207
                                        else
208
                                                uriList.add(new File(uri));
209
                                }
210
                                saveMosaicFileLayer(layerName, params.getURI(), uriList);
211
                                panel.setCreateStatus();
212
                        }
213
                } catch (Exception exc) {
214
                        RasterSwingLibrary.messageBoxError("removefile_mosaic_error", panel, exc);
215
                }
216
        }
217
        
218
        /**
219
         * Goes a provider up in the list
220
         * @param fileName
221
         */
222
        private void upProviders(int[] indexes) {
223
                try {
224
                        RasterDataStore dataStore = panel.getfLayer().getDataStore();
225
                        RasterDataParameters params = (RasterDataParameters)dataStore.getParameters();
226
                        if(params instanceof MosaicDataParameters) {
227
                                MosaicDataParameters paramsMosaic = (MosaicDataParameters)params;
228
                                ArrayList<File> uriList = new ArrayList<File>();
229
                                
230
                                for (int i = 0; i < indexes.length; i++) {
231
                                        int row = indexes[i];
232
                                        
233
                                        if(row == 0)
234
                                        continue;
235
                                        
236
                                        paramsMosaic.swapProvider(row, row - 1);
237
                                }
238
                                for (int i = 0; i < paramsMosaic.getProviderCount(); i++) {
239
                                        uriList.add(new File(paramsMosaic.getURIByProvider(i)));
240
                                }
241
                                saveMosaicFileLayer(getLayerName(), params.getURI(), uriList);
242
                                panel.setCreateStatus();
243
                        }
244
                } catch (Exception exc) {
245
                        RasterSwingLibrary.messageBoxError("removefile_mosaic_error", panel, exc);
246
                }
247
        }
248
        
249
        /**
250
         * Goes a provider up in the list
251
         * @param fileName
252
         */
253
        private void downProviders(int[] indexes) {
254
                try {
255
                        RasterDataStore dataStore = panel.getfLayer().getDataStore();
256
                        RasterDataParameters params = (RasterDataParameters)dataStore.getParameters();
257
                        if(params instanceof MosaicDataParameters) {
258
                                MosaicDataParameters paramsMosaic = (MosaicDataParameters)params;
259
                                ArrayList<File> uriList = new ArrayList<File>();
260
                                
261
                                for (int i = indexes.length - 1; i >= 0; i--) {
262
                                        int row = indexes[i];
263
                                        
264
                                        if(row == paramsMosaic.getProviderCount() - 1)
265
                                        continue;
266
                                        
267
                                        paramsMosaic.swapProvider(row, row + 1);
268
                                }
269
                                for (int i = 0; i < paramsMosaic.getProviderCount(); i++) {
270
                                        uriList.add(new File(paramsMosaic.getURIByProvider(i)));
271
                                }
272
                                saveMosaicFileLayer(getLayerName(), params.getURI(), uriList);
273
                                panel.setCreateStatus();
274
                        }
275
                } catch (Exception exc) {
276
                        RasterSwingLibrary.messageBoxError("removefile_mosaic_error", panel, exc);
277
                }
278
        }
279
        
280
        /**
281
         * Saves the new layer in disk
282
         * @param layerName
283
         * @param file
284
         * @param uriList
285
         * @throws IOException
286
         */
287
        private String saveMosaicFileLayer(String layerName, String file, ArrayList<File> uriList) throws IOException {
288
                String path = file.substring(0, file.lastIndexOf(File.separator) + 1);
289
                path = path + layerName + suffix;
290
                
291
                MosaicRasterFormat format = new MosaicRasterFormat();
292
                for (int i = 0; i < uriList.size(); i++) {
293
                        format.addFile(uriList.get(i));
294
                }
295
                format.setName(layerName);
296
                
297
                format.write(path);
298
                return path;
299
        }
300

    
301
        public void cancel() {
302
                
303
        }
304

    
305
        public void selected() {
306
                
307
        }
308

    
309
        /*
310
         * (non-Javadoc)
311
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
312
         */
313
        public void actionPerformed(ActionEvent e) {
314
                if(e.getSource() == panel.getCreateButton()) {
315
                        WindowInfo wi = PluginServices.getMDIManager().getActiveWindow().getWindowInfo();
316
                        LayerNameDialog dialog = new LayerNameDialog(new Point2D.Double(wi.getX(), wi.getY()), 300, 80, this);
317
                        PluginServices.getMDIManager().addWindow(dialog);
318
                        return;
319
                }
320
                
321
                //Adds a new file
322
                if(e.getSource() == panel.getAddButton()) {
323
                        if(RasterSwingLibrary.messageBoxYesOrNot("delete_cache", panel)) {
324
                                if(panel.getAddFilesRadio().isSelected()) {
325
                                        selectFiles();
326
                                } else {
327
                                        selectDirectory();
328
                                }
329
                                panel.getfLayer().getDataStore().deleteLayerFromCache();
330
                        }
331
                }
332
                
333
                //Removes a file
334
                if(e.getSource() == panel.getDeleteButton()) {
335
                        int[] index = panel.getFileList().getSelectedRows();
336
                        if(index != null && index.length > 0) {
337
                                if(RasterSwingLibrary.messageBoxYesOrNot("delete_cache", panel)) {
338
                                        if(index.length == panel.getModel().getRowCount())
339
                                                RasterSwingLibrary.messageBoxError("table_cant_be_empty", panel);
340
                                        for (int i = 0; i < index.length; i++) {
341
                                                String fileName = (String)panel.getModel().getDataWithPath()[index[i]][1];
342
                                                removeFileFromProvider(fileName);
343
                                        }
344
                                        panel.getModel().delete(index);
345
                                        
346
                                        panel.getfLayer().getDataStore().deleteLayerFromCache();
347
                                }
348
                        }
349
                }
350

    
351
                //Shows or hides the complete path in the table
352
                if(e.getSource() == panel.getSeeListCheck()) {
353
                        panel.getModel().setSeeFlag(panel.getSeeListCheck().isSelected());
354
                        panel.getFileList().repaint();
355
                }
356

    
357
                //Deletes the cache
358
                if(e.getSource() == panel.getDeleteCacheButton()) {
359
                        if(RasterSwingLibrary.messageBoxYesOrNot("deleting_cache", panel)) {
360
                                panel.getfLayer().getDataStore().deleteLayerFromCache();
361
                        }
362
                }
363

    
364
                //Goes a row up in the table 
365
                if(e.getSource() == panel.getUpArrowButton()) {
366
                        //Table
367
                        int[] indexes = panel.getFileList().getSelectedRows();
368
                        panel.getModel().upRows(indexes);
369
                        //Selection
370
                        for (int i = 0; i < indexes.length; i++) {
371
                                if(indexes[i] != 0)
372
                                        panel.getFileList().getSelectionModel().addSelectionInterval(indexes[i] - 1, indexes[i] - 1);
373
                                else 
374
                                        panel.getFileList().getSelectionModel().addSelectionInterval(indexes[i], indexes[i]);
375
                        }
376
                        //Providers
377
                        upProviders(indexes);
378
                        //Delete cache
379
                        panel.getfLayer().getDataStore().deleteLayerFromCache();
380
                }
381

    
382
                //Goes a row down in the table
383
                if(e.getSource() == panel.getDownArrowButton()) {
384
                        //Table
385
                        int[] indexes = panel.getFileList().getSelectedRows();
386
                        panel.getModel().downRows(indexes);
387
                        //Selection
388
                        for (int i = 0; i < indexes.length; i++) {
389
                                if(indexes[i] != panel.getModel().getRowCount() - 1)
390
                                        panel.getFileList().getSelectionModel().addSelectionInterval(indexes[i] + 1, indexes[i] + 1);
391
                                else 
392
                                        panel.getFileList().getSelectionModel().addSelectionInterval(indexes[i], indexes[i]);
393
                        }
394
                        //Provider
395
                        downProviders(indexes);
396
                        //Delete cache
397
                        panel.getfLayer().getDataStore().deleteLayerFromCache();
398
                }
399
                
400
                panel.setCreateStatus();
401
        }
402
        
403
        /**
404
         * Selects a list of files
405
         */
406
        private void selectFiles() {
407
                JFileChooser chooser = new JFileChooser("DATA_INPUT_LISTENER", JFileChooser.getLastPath("DATA_INPUT_LISTENER", null));
408
                chooser.setDialogTitle(PluginServices.getText(this, "select_file"));
409
                chooser.setAcceptAllFileFilterUsed(true);
410
                chooser.setMultiSelectionEnabled(true);
411
                
412
                int returnVal = chooser.showOpenDialog((Component)panel);
413
                if (returnVal == JFileChooser.APPROVE_OPTION) {
414
                        File[] fileList = chooser.getSelectedFiles();
415
                        ArrayList<File> fileArray = new ArrayList<File>();
416
                        for (int i = 0; i < fileList.length; i++) {
417
                                if(!existsFileInTable(fileList[i]))
418
                                        fileArray.add(fileList[i]);
419
                        }
420
                        addDataToTableDataModel(fileArray);
421
                }
422
        }
423
        
424
        /**
425
         * Returns true if exists the file in the table
426
         * @param file
427
         * @return
428
         */
429
        private boolean existsFileInTable(File file) {
430
                for (int i = 0; i < panel.getModel().getRowCount(); i++) {
431
                        String path = (String)panel.getModel().getDataWithPath()[i][1];
432
                        if(path.compareTo(file.getAbsolutePath()) == 0)
433
                                return true;
434
                }
435
                return false;
436
        }
437
        
438
        /**
439
         * Selects the files of a directory
440
         */
441
        private void selectDirectory() {
442
                JFileChooser chooser = new JFileChooser("DATA_INPUT_LISTENER", JFileChooser.getLastPath("DATA_INPUT_LISTENER", null));
443
                chooser.setDialogTitle(PluginServices.getText(this, "select_directory"));
444
                chooser.setAcceptAllFileFilterUsed(true);
445
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
446
                
447
                int returnVal = chooser.showOpenDialog((Component)panel);
448
                if (returnVal == JFileChooser.APPROVE_OPTION) {
449
                        File dir = chooser.getSelectedFile();
450
                        if(dir.isDirectory()) {
451
                                String[] files = dir.list();
452
                                ArrayList<File> fileArray = new ArrayList<File>();
453
                                for (int j = 0; j < files.length; j++) {
454
                                        File f = new File(dir + File.separator + files[j]);
455
                                        if(!existsFileInTable(f)) {
456
                                                fileArray.add(f);
457
                                        }
458
                                }
459
                                addDataToTableDataModel(fileArray);
460
                        }
461
                }
462
        }
463
        
464
        /**
465
         * Adds data to the array of data
466
         * @param fileList
467
         * @param data
468
         * @return
469
         */
470
        public void addDataToTableDataModel(ArrayList<File> fileArray) {
471
                for (int i = fileArray.size() - 1; i >= 0; i--) {
472
                        if(fileArray.get(i).isDirectory())
473
                                fileArray.remove(i);
474
                }
475
                
476
                Object[][] dataOld = panel.getModel().getDataWithPath();
477
                Object[][] dataWithoutOld = panel.getModel().getDataWithoutPath();
478
                
479
                Object[][] newdata = null;
480
                Object[][] newdataWithout = null;
481
                
482
                if(dataOld == null) {
483
                        newdata = new Object[fileArray.size()][2];
484
                        newdataWithout = new Object[fileArray.size()][2];
485
                        for (int i = 0; i < newdata.length; i++) {
486
                                if(!fileArray.get(i).isDirectory()) {
487
                                        newdata[i][0] = newdataWithout[i][0] = new Boolean(true);
488
                                        newdata[i][1] = fileArray.get(i).getAbsolutePath();
489
                                        newdataWithout[i][1] = fileArray.get(i).getName();
490
                                }
491
                        }
492
                } else {
493
                        newdata = new Object[dataOld.length + fileArray.size()][2];
494
                        newdataWithout = new Object[dataWithoutOld.length + fileArray.size()][2];
495
                        for (int i = 0; i < dataOld.length; i++) {
496
                                newdata[i][0] = newdataWithout[i][0] = dataOld[i][0];
497
                                newdata[i][1] = dataOld[i][1];
498
                                newdataWithout[i][1] = dataWithoutOld[i][1];
499
                        }
500
                        for (int i = dataOld.length; i < dataOld.length + fileArray.size(); i++) {
501
                                newdata[i][0] = newdataWithout[i][0] = new Boolean(true);
502
                                if(!fileArray.get(i - dataOld.length).isDirectory()) {
503
                                        newdata[i][1] = fileArray.get(i - dataOld.length).getAbsolutePath();
504
                                        newdataWithout[i][1] = fileArray.get(i - dataOld.length).getName();
505
                                }
506
                        }
507
                }
508
                
509
                panel.getModel().setData(newdata, newdataWithout);
510
                panel.getFileList().repaint();
511
        }
512
        
513
        /*
514
         * (non-Javadoc)
515
         * @see org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener#actionButtonPressed(org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent)
516
         */
517
        public void actionButtonPressed(ButtonsPanelEvent e) {
518
                //After introduce the name of the new layer, we adds the main file to 
519
                //the table and it shows the dialog to select a file or directory
520
                layerName = (String)e.getSource();
521
                
522
                panel.getModel().clearModel();
523
                if(panel.getfLayer() != null) {
524
                        ArrayList<File> f = new ArrayList<File>();
525
                        f.add(new File(panel.getfLayer().getDataStore().getName()));
526
                        addDataToTableDataModel(f);
527
                }
528
                
529
                if(panel.getAddFilesRadio().isSelected()) {
530
                        selectFiles();
531
                } else {
532
                        selectDirectory();
533
                }
534
        }
535
        
536
}