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

History | View | Annotate | Download (15 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
123
        // otros espacios de color
124
        columnModel.getColumn(0).setCellEditor(new ColorInterpretationCellEditor(BandsTableModel.RGBColorSpace));
125
        columnModel.getColumn(0).setCellRenderer(new ColorInterpretationCellRenderer());
126

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

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

    
132
    }
133

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

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

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

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

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

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

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

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

    
238
            if (noData == null) {
239
                noData = bufferManager.createNoData(value, null);
240
            } else {
241
                noData.setValue((Number) value);
242
            }
243
            bandDescriptor.setNoData(noData);
244
            colorInterpretations.add(rasterStoreBand.getBandColorInterpretation());
245
        }
246

    
247
        ColorInterpretation colorInterpretation = null;
248
        colorInterpretation =
249
            rasterLegendManager.createColorInterpretation(colorInterpretations.toArray(new String[0]));
250

    
251
        RasterLegend legend = rasterLegendManager.createLegend(colorInterpretation);
252
        rasterLayer.setLegend(legend);
253
        rasterLayer.getMapContext().invalidate();
254
        rasterLayer.recalculateStatistics();
255
        return true;
256
    }
257

    
258
    @Override
259
    public JComponent asJComponent() {
260
        return this;
261
    }
262

    
263
    @SuppressWarnings("unchecked")
264
    @Override
265
    public void actionPerformed(ActionEvent e) {
266
        if (e.getSource() == btnRemove) {
267
            BandsTableModel model = (BandsTableModel) tblBands.getModel();
268
            model.removeElementAt(tblBands.getSelectedRow());
269
            model.fireTableDataChanged();
270

    
271
        } else if (e.getSource() == btnAdd) {
272
            DataManager manager = DALLocator.getDataManager();
273

    
274
            JFileChooser fileChooser = createJFileChooser();
275
            int result = fileChooser.showOpenDialog(this);
276

    
277
            if (result == JFileChooser.APPROVE_OPTION) {
278
                File[] files = fileChooser.getSelectedFiles();
279
                for (File file : files) {
280

    
281
                    DataServerExplorerParameters fileExplorerParams;
282
                    try {
283
                        fileExplorerParams = manager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
284
                        FilesystemServerExplorer explorer =
285
                            (FilesystemServerExplorer) manager.openServerExplorer(FilesystemServerExplorer.NAME,
286
                                fileExplorerParams);
287
                        String type = explorer.getProviderName(file);
288
                        DynObject params = manager.createStoreParameters(type);
289
                        if (params.getDynClass().getDynField("file") != null) {
290
                            params.setDynValue("file", file);
291
                        }
292
                        // FIXME: ?se le pone la proyecci?n del raster principal
293
                        // o se busca la que tenga el archivo si la tiene?
294
                        if (params.getDynClass().getDynField("crs") != null) {
295
                            params.setDynValue("crs", this.layer.getProjection());
296
                        }
297
                        RasterStore store = (RasterStore) manager.openStore(type, params);
298

    
299
                        addBands(store, null);
300

    
301
                    } catch (InitializeException | ProviderNotRegisteredException | ValidateDataParametersException e1) {
302
                        LOG.warn("Can't add bands from the file '" + file.getName() + "'", e1);
303
                        // e1.printStackTrace();
304
                    }
305
                }
306
            }
307
        }
308
    }
309

    
310
    @Override
311
    public void valueChanged(ListSelectionEvent e) {
312
        if (e.getSource() == tblBands.getSelectionModel()) {
313
            if (tblBands.getSelectedRow() >= 0) {
314
                if (this.layer.getRasterStore() != ((BandsTableModel) tblBands.getModel()).getElementAt(
315
                    tblBands.getSelectedRow()).getStore()) {
316
                    btnRemove.setEnabled(true);
317
                } else {
318
                    btnRemove.setEnabled(false);
319
                }
320
            } else {
321
                btnRemove.setEnabled(false);
322
            }
323
        }
324
    }
325

    
326
    private JFileChooser createJFileChooser() {
327
        I18nManager i18nManager = ToolsLocator.getI18nManager();
328
        JFileChooser fileChooser = new JFileChooser();
329

    
330
        int mode = FilesystemServerExplorer.MODE_RASTER;
331
        FilesystemServerExplorer explorer;
332

    
333
        DataManager dm = DALLocator.getDataManager();
334
        FilesystemServerExplorerParameters param;
335
        try {
336
            param =
337
                (FilesystemServerExplorerParameters) dm.createServerExplorerParameters(FilesystemServerExplorer.NAME);
338
            explorer = (FilesystemServerExplorer) dm.openServerExplorer(FilesystemServerExplorer.NAME, param);
339
        } catch (Exception e) {
340
            throw new RuntimeException(e);
341
        }
342

    
343
        FilesystemFileFilter filter = explorer.getFilter(mode, i18nManager.getTranslation(RASTER_FILTER));
344

    
345
        fileChooser.setMultiSelectionEnabled(true);
346
        fileChooser.setAcceptAllFileFilterUsed(false);
347
        fileChooser.setFileFilter(new MyFileFilter(filter));
348

    
349
        return fileChooser;
350
    }
351

    
352
    /**
353
     * @author fdiaz
354
     *
355
     */
356
    public class MyFileFilter extends FileFilter {
357

    
358
        public FilesystemFileFilter filter = null;
359

    
360
        /**
361
         * @param params
362
         */
363
        public MyFileFilter(FilesystemFileFilter params) {
364
            this.filter = params;
365
        }
366

    
367
        /**
368
         * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
369
         */
370
        public boolean accept(File f) {
371
            if (f.isDirectory()) {
372
                return true;
373
            }
374
            return filter.accept(f);
375

    
376
        }
377

    
378
        /**
379
         * @see javax.swing.filechooser.FileFilter#getDescription()
380
         */
381
        public String getDescription() {
382
            return filter.getDescription();
383
        }
384

    
385
        /**
386
         * @return
387
         */
388
        public String getName() {
389
            return filter.getDataStoreProviderName();
390
        }
391
    }
392
}