Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.fmap.mapcontext.raster.swing / org.gvsig.fmap.mapcontext.raster.swing.impl / src / main / java / org / gvsig / fmap / mapcontext / raster / swing / impl / bands / BandsPanelController.java @ 6701

History | View | Annotate | Download (15.7 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2017 gvSIG Association
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., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.mapcontext.raster.swing.impl.bands;
24

    
25
import java.awt.event.ActionEvent;
26
import java.awt.event.ActionListener;
27
import java.io.File;
28
import java.util.ArrayList;
29
import java.util.List;
30
import java.util.Locale;
31

    
32
import javax.swing.JComponent;
33
import javax.swing.JFileChooser;
34
import javax.swing.JOptionPane;
35
import javax.swing.ListSelectionModel;
36
import javax.swing.event.ListSelectionEvent;
37
import javax.swing.event.ListSelectionListener;
38
import javax.swing.filechooser.FileFilter;
39
import javax.swing.table.DefaultTableColumnModel;
40
import javax.swing.table.TableColumn;
41
import javax.swing.table.TableColumnModel;
42

    
43
import org.slf4j.Logger;
44
import org.slf4j.LoggerFactory;
45

    
46
import org.gvsig.fmap.dal.DALLocator;
47
import org.gvsig.fmap.dal.DataManager;
48
import org.gvsig.fmap.dal.DataServerExplorerParameters;
49
import org.gvsig.fmap.dal.exception.DataException;
50
import org.gvsig.fmap.dal.exception.InitializeException;
51
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
52
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
53
import org.gvsig.fmap.dal.raster.api.BandDescriptor;
54
import org.gvsig.fmap.dal.raster.api.RasterStore;
55
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter;
56
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
57
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
58
import org.gvsig.fmap.mapcontext.exceptions.LegendLayerException;
59
import org.gvsig.fmap.mapcontext.layers.FLayer;
60
import org.gvsig.fmap.mapcontext.raster.api.RasterLayer;
61
import org.gvsig.fmap.mapcontext.raster.swing.bands.BandsPanel;
62
import org.gvsig.raster.lib.buffer.api.BufferLocator;
63
import org.gvsig.raster.lib.buffer.api.BufferManager;
64
import org.gvsig.raster.lib.buffer.api.NoData;
65
import org.gvsig.raster.lib.legend.api.ColorInterpretation;
66
import org.gvsig.raster.lib.legend.api.RasterLegend;
67
import org.gvsig.raster.lib.legend.api.RasterLegendLocator;
68
import org.gvsig.raster.lib.legend.api.RasterLegendManager;
69
import org.gvsig.tools.ToolsLocator;
70
import org.gvsig.tools.dynobject.DynObject;
71
import org.gvsig.tools.i18n.I18nManager;
72
import org.gvsig.tools.swing.api.ToolsSwingLocator;
73
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
74

    
75
/**
76
 * @author fdiaz
77
 *
78
 */
79
public class BandsPanelController extends BandsPanelView implements BandsPanel, ActionListener, ListSelectionListener {
80

    
81
    /**
82
     *
83
     */
84
    private static final long serialVersionUID = 8255630092178065352L;
85
    @SuppressWarnings("unused")
86
    private static final Logger LOG = LoggerFactory.getLogger(BandsPanelController.class);
87
    private RasterLayer layer;
88

    
89
    private static final String RASTER_FILTER = "All_raster_supported";
90

    
91
    // FLayer layer;
92

    
93
    /**
94
     * @param layer
95
     */
96
    @SuppressWarnings("unchecked")
97
    public BandsPanelController() {
98
        translate();
99
        initializeComponents();
100
    }
101

    
102
    private void initializeComponents() {
103
        this.btnAdd.addActionListener(this);
104
        this.btnRemove.addActionListener(this);
105
        tblBands.setRowSelectionAllowed(true);
106
        tblBands.setColumnSelectionAllowed(false);
107
        tblBands.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
108
        tblBands.getSelectionModel().addListSelectionListener(this);
109
        BandsTableModel model = new BandsTableModel();
110
        tblBands.setModel(model);
111

    
112
        tblBands.setColumnModel(new DefaultTableColumnModel());
113
        TableColumnModel columnModel = tblBands.getColumnModel();
114
        columnModel.setColumnSelectionAllowed(false);
115
        for (int i=0; i<model.getColumnCount(); i++) {
116
            TableColumn tableColumn = new TableColumn(i);
117
            tableColumn.setIdentifier(model.getColumnName(i));
118
            tableColumn.setHeaderValue(model.getColumnName(i));
119
            columnModel.addColumn(tableColumn);
120
        }
121

    
122
        //FIXME: esto ser?a lo que habr?a que cambiar si se desea implementar otros espacios de color
123
        columnModel.getColumn(0).setCellEditor(new ColorInterpretationCellEditor(BandsTableModel.RGBColorSpace));
124
        columnModel.getColumn(0).setCellRenderer(new ColorInterpretationCellRenderer());
125

    
126
        columnModel.getColumn(1).setCellRenderer(new NoDataCellRenderer());
127
//        columnModel.getColumn(1).setCellEditor(new NoDataCellEditor());
128

    
129
        columnModel.getColumn(2).setCellRenderer(new DataTypeCellRenderer());
130

    
131

    
132

    
133
    }
134

    
135
    private void translate() {
136
        I18nManager i18nManager = ToolsLocator.getI18nManager();
137
        lblBands.setText(i18nManager.getTranslation(lblBands.getText()));
138
        btnAdd.setText(i18nManager.getTranslation(btnAdd.getText()));
139
        btnAdd.setToolTipText(i18nManager.getTranslation(btnAdd.getToolTipText()));
140
        btnRemove.setText(i18nManager.getTranslation(btnRemove.getText()));
141
        btnRemove.setToolTipText(i18nManager.getTranslation(btnRemove.getToolTipText()));
142
    }
143

    
144
    /**
145
     * @param locale
146
     *
147
     */
148
    public void setLocate(Locale locale) {
149
        Locale l = super.getLocale();
150
        if (!l.equals(locale)) {
151
            translate();
152
        }
153
        super.setLocale(locale);
154
    }
155

    
156
    /**
157
     * @param layer
158
     */
159
    @SuppressWarnings("unchecked")
160
    public void set(FLayer layer) {
161
        this.layer = (RasterLayer) layer;
162
        RasterLegend legend = null;
163
        try {
164
            legend = (RasterLegend) this.layer.getLegend();
165
        } catch (LegendLayerException e) {
166
            LOG.warn("Can't get legend from '" + layer + "' layer.", e);
167
        }
168
        ColorInterpretation colorInterpretation = null;
169
        if(legend!=null){
170
            colorInterpretation = legend.getColorInterpretation();
171
        }
172
        RasterStore store = this.layer.getRasterStore();
173
        addBands(store, colorInterpretation);
174
    }
175

    
176
    /**
177
     * @param colorInterpretation
178
     * @param store
179
     * @param model
180
     */
181
    private void addBands(RasterStore store, ColorInterpretation colorInterpretation) {
182
        BandsTableModel model = ((BandsTableModel)tblBands.getModel());
183
        for (int i = 0; i < store.getBands(); i++) {
184
            BandDescriptor bandDescriptor = store.getBandDescriptor(i);
185

    
186
            RasterStoreBand rasterStoreBand = new RasterStoreBand(bandDescriptor.getStore(), bandDescriptor.getBand());
187
            NoData noData = bandDescriptor.getNoData();
188
            if(noData!=null){
189
                rasterStoreBand.setNoDataNumber(noData.getValue());
190
            }
191
            rasterStoreBand.setBandName(bandDescriptor.getName());
192
            rasterStoreBand.setDataType(bandDescriptor.getDataType());
193

    
194
            if(colorInterpretation!=null){
195
                rasterStoreBand.setBandColorInterpretation(colorInterpretation.get(i));
196
            } else {
197
                rasterStoreBand.setBandColorInterpretation(ColorInterpretation.UNDEFINED_BAND);
198
            }
199
            model.add(rasterStoreBand);
200
            model.fireTableDataChanged();
201
        }
202
    }
203

    
204
    /**
205
     * @param layer
206
     */
207
    public boolean fetch(FLayer layer) {
208
        RasterLayer rasterLayer = (RasterLayer) layer;
209
        RasterStore store = rasterLayer.getRasterStore();
210
        store.clearAdditionalBands();
211
        BandsTableModel model = (BandsTableModel)tblBands.getModel();
212
        RasterLegendManager rasterLegendManager = RasterLegendLocator.getRasterLegendManager();
213
        BufferManager bufferManager = BufferLocator.getBufferManager();
214
        List<String> colorInterpretations = new ArrayList();
215

    
216
        for (int index = 0; index < model.getRowCount(); index++) {
217
            RasterStoreBand rasterStoreBand = model.getElementAt(index);
218
            RasterStore subStore = rasterStoreBand.getStore();
219
            int band = rasterStoreBand.getBand();
220
            if (subStore != store) {
221
                try {
222
                    store.addBand(subStore, band);
223
                } catch (DataException e) {
224
                    ThreadSafeDialogsManager dlgManager = ToolsSwingLocator.getThreadSafeDialogsManager();
225
                    String message = "_cant_add_band_XbandX_from_store_XsourceX_to_store_XtargetX";
226
                    String title = "_error_adding_bands";
227
                    dlgManager.messageDialog(
228
                        message,
229
                        new String[] {
230
                            String.valueOf(band),
231
                            subStore.getName(),
232
                            store.getName() },
233
                        title, JOptionPane.WARNING_MESSAGE);
234
                    LOG.warn(message, e);
235
                    return false;
236
                }
237
            }
238
            BandDescriptor bandDescriptor = store.getBandDescriptor(index);
239
            NoData noData = bandDescriptor.getNoData();
240
            Number value = null;
241
//            try {
242
                value = rasterStoreBand.getNoDataNumber();
243

    
244
//                value = (Number)bufferManager.coerce(rasterStoreBand.getDataType(), rasterStoreBand.getNoData());
245
//            } catch (CoercionException e) {
246
//                ThreadSafeDialogsManager dlgManager = ToolsSwingLocator.getThreadSafeDialogsManager();
247
//                String message = "_it_cant_be_reconized_XvalueX_as_a_XdatatypenameX.";
248
//                String title = "_error_adding_bands";
249
//                dlgManager.messageDialog(
250
//                    message,
251
//                    new String[] {
252
//                        String.valueOf(band),
253
//                        subStore.getName(),
254
//                        store.getName() },
255
//                    title, JOptionPane.WARNING_MESSAGE);
256
//                LOG.warn(message, e);
257
//                return false;
258
//            }
259
            if(noData==null){
260
                noData = bufferManager.createNoData(value, null);
261
            } else {
262
                noData.setValue((Number)value);
263
            }
264
            bandDescriptor.setNoData(noData);
265
            colorInterpretations.add(rasterStoreBand.getBandColorInterpretation());
266
        }
267

    
268

    
269
        ColorInterpretation colorInterpretation = null;
270
        colorInterpretation =
271
            rasterLegendManager.createColorInterpretation(colorInterpretations.toArray(new String[0]));
272

    
273
        RasterLegend legend = rasterLegendManager.createLegend(colorInterpretation);
274
        rasterLayer.setLegend(legend);
275
        rasterLayer.getMapContext().invalidate();
276
        rasterLayer.recalculateStatistics();
277
        return true;
278
    }
279

    
280
    @Override
281
    public JComponent asJComponent() {
282
        return this;
283
    }
284

    
285
    @SuppressWarnings("unchecked")
286
    @Override
287
    public void actionPerformed(ActionEvent e) {
288
        if (e.getSource() == btnRemove) {
289
            BandsTableModel model = (BandsTableModel) tblBands.getModel();
290
            model.removeElementAt(tblBands.getSelectedRow());
291
            model.fireTableDataChanged();
292

    
293
        } else if (e.getSource() == btnAdd) {
294
            DataManager manager = DALLocator.getDataManager();
295

    
296
            JFileChooser fileChooser = createJFileChooser();
297
            int result = fileChooser.showOpenDialog(this);
298

    
299
            if (result == JFileChooser.APPROVE_OPTION) {
300
                File[] files = fileChooser.getSelectedFiles();
301
                for (File file : files) {
302

    
303
                    DataServerExplorerParameters fileExplorerParams;
304
                    try {
305
                        fileExplorerParams = manager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
306
                        FilesystemServerExplorer explorer =
307
                            (FilesystemServerExplorer) manager.openServerExplorer(FilesystemServerExplorer.NAME,
308
                                fileExplorerParams);
309
                        String type = explorer.getProviderName(file);
310
                        DynObject params = manager.createStoreParameters(type);
311
                        if (params.getDynClass().getDynField("file") != null) {
312
                            params.setDynValue("file", file);
313
                        }
314
                        // FIXME: ?se le pone la proyecci?n del raster principal
315
                        // o se busca la que tenga el archivo si la tiene?
316
                        if (params.getDynClass().getDynField("crs") != null) {
317
                            params.setDynValue("crs", this.layer.getProjection());
318
                        }
319
                        RasterStore store = (RasterStore) manager.openStore(type, params);
320

    
321
                        addBands(store, null);
322

    
323
                    } catch (InitializeException | ProviderNotRegisteredException | ValidateDataParametersException e1) {
324
                        LOG.warn("Can't add bands from the file '" + file.getName() + "'", e1);
325
                        // e1.printStackTrace();
326
                    }
327
                }
328
            }
329
        }
330
    }
331

    
332
    @Override
333
    public void valueChanged(ListSelectionEvent e) {
334
        if (e.getSource() == tblBands.getSelectionModel()) {
335
            if (tblBands.getSelectedRow() >= 0) {
336
                if (this.layer.getRasterStore() != ((BandsTableModel) tblBands.getModel()).getElementAt(tblBands.getSelectedRow()).getStore()) {
337
                    btnRemove.setEnabled(true);
338
                } else {
339
                    btnRemove.setEnabled(false);
340
                }
341
            } else {
342
                btnRemove.setEnabled(false);
343
            }
344
        }
345
    }
346

    
347
    private JFileChooser createJFileChooser() {
348
        I18nManager i18nManager = ToolsLocator.getI18nManager();
349
        JFileChooser fileChooser = new JFileChooser();
350

    
351
        int mode = FilesystemServerExplorer.MODE_RASTER;
352
        FilesystemServerExplorer explorer;
353

    
354
        DataManager dm = DALLocator.getDataManager();
355
        FilesystemServerExplorerParameters param;
356
        try {
357
            param =
358
                (FilesystemServerExplorerParameters) dm.createServerExplorerParameters(FilesystemServerExplorer.NAME);
359
            explorer = (FilesystemServerExplorer) dm.openServerExplorer(FilesystemServerExplorer.NAME, param);
360
        } catch (Exception e) {
361
            throw new RuntimeException(e);
362
        }
363

    
364
        FilesystemFileFilter filter = explorer.getFilter(mode, i18nManager.getTranslation(RASTER_FILTER));
365

    
366
        fileChooser.setMultiSelectionEnabled(true);
367
        fileChooser.setAcceptAllFileFilterUsed(false);
368
        fileChooser.setFileFilter(new MyFileFilter(filter));
369

    
370
        return fileChooser;
371
    }
372

    
373
    public class MyFileFilter extends FileFilter {
374

    
375
        public FilesystemFileFilter filter = null;
376

    
377
        public MyFileFilter(FilesystemFileFilter params) {
378
            this.filter = params;
379
        }
380

    
381
        /**
382
         * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
383
         */
384
        public boolean accept(File f) {
385
            if (f.isDirectory()) {
386
                return true;
387
            }
388
            return filter.accept(f);
389

    
390
        }
391

    
392
        /**
393
         * @see javax.swing.filechooser.FileFilter#getDescription()
394
         */
395
        public String getDescription() {
396
            return filter.getDescription();
397
        }
398

    
399
        public String getName() {
400
            return filter.getDataStoreProviderName();
401
        }
402
    }
403
}