Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.mainplugin / src / main / java / org / gvsig / raster / tools / app / mainplugin / HistogramExtension.java @ 47394

History | View | Annotate | Download (14.8 KB)

1
package org.gvsig.raster.tools.app.mainplugin;
2

    
3
import java.awt.Color;
4
import java.awt.Dimension;
5
import java.awt.event.ItemEvent;
6
import java.awt.event.ItemListener;
7
import java.util.ArrayList;
8
import java.util.List;
9

    
10
import javax.swing.JComboBox;
11
import javax.swing.JOptionPane;
12
import javax.swing.event.AncestorEvent;
13
import javax.swing.event.AncestorListener;
14

    
15
import org.apache.commons.lang3.StringUtils;
16
import org.cresques.cts.ICoordTrans;
17
import org.slf4j.Logger;
18
import org.slf4j.LoggerFactory;
19

    
20
import org.gvsig.andami.IconThemeHelper;
21
import org.gvsig.andami.plugins.Extension;
22
import org.gvsig.app.ApplicationLocator;
23
import org.gvsig.app.ApplicationManager;
24
import org.gvsig.app.project.documents.view.ViewDocument;
25
import org.gvsig.app.project.documents.view.gui.IView;
26
import org.gvsig.fmap.dal.DALLocator;
27
import org.gvsig.fmap.dal.exception.DataException;
28
import org.gvsig.fmap.dal.exception.ReadException;
29
import org.gvsig.fmap.dal.raster.BandDescriptor;
30
import org.gvsig.fmap.dal.raster.RasterQuery;
31
import org.gvsig.fmap.dal.raster.RasterStore;
32
import org.gvsig.fmap.geom.Geometry;
33
import org.gvsig.fmap.geom.primitive.Envelope;
34
import org.gvsig.fmap.mapcontext.ViewPort;
35
import org.gvsig.fmap.mapcontext.events.ColorEvent;
36
import org.gvsig.fmap.mapcontext.events.ExtentEvent;
37
import org.gvsig.fmap.mapcontext.events.ProjectionEvent;
38
import org.gvsig.fmap.mapcontext.events.listeners.ViewPortListener;
39
import org.gvsig.fmap.mapcontext.layers.FLayer;
40
import org.gvsig.fmap.mapcontext.layers.FLayers;
41
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
42
import org.gvsig.fmap.mapcontext.raster.api.RasterLayer;
43
import org.gvsig.fmap.mapcontext.raster.swing.MapContextRasterSwingLocator;
44
import org.gvsig.fmap.mapcontext.raster.swing.MapContextRasterSwingManager;
45
import org.gvsig.fmap.mapcontext.rendering.legend.events.LegendChangedEvent;
46
import org.gvsig.fmap.mapcontext.rendering.legend.events.listeners.LegendListener;
47
import org.gvsig.fmap.mapcontrol.MapControl;
48
import org.gvsig.raster.lib.buffer.api.Buffer;
49
import org.gvsig.raster.lib.buffer.api.statistics.Statistics;
50
import org.gvsig.raster.lib.legend.api.RasterLegend;
51
import org.gvsig.raster.lib.legend.api.colorinterpretation.ColorInterpretation;
52
import org.gvsig.raster.swing.buffer.RasterSwingBufferLocator;
53
import org.gvsig.raster.swing.buffer.RasterSwingBufferManager;
54
import org.gvsig.raster.swing.buffer.SelectableBandsTableModel;
55
import org.gvsig.raster.swing.buffer.exceptions.RasterCreatingPanelException;
56
import org.gvsig.raster.swing.buffer.histogram.HistogramPanel;
57
import org.gvsig.tools.ToolsLocator;
58
import org.gvsig.tools.i18n.I18nManager;
59
import org.gvsig.tools.swing.api.ToolsSwingLocator;
60
import org.gvsig.tools.swing.api.ToolsSwingUtils;
61
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
62
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
63
import org.gvsig.tools.task.SimpleTaskStatus;
64

    
65
/**
66
 *
67
 * @author fdiaz
68
 *
69
 */
70
public class HistogramExtension extends Extension {
71

    
72
    private static final Logger logger = LoggerFactory.getLogger(HistogramExtension.class);
73

    
74
    @Override
75
    public void initialize() {
76
        IconThemeHelper.registerIcon("action", "layer-histogram", this);
77
    }
78

    
79
    @Override
80
    public void execute(String actionCommand) {
81

    
82
        if (StringUtils.equalsIgnoreCase(actionCommand, "histogram")) {
83
            IView view = getActiveView();
84
            MapControl mapControl = view.getMapControl();
85
            FLayer[] layers = mapControl.getMapContext().getLayers().getActives();
86
            if (layers[0] instanceof RasterLayer) {
87
                final RasterLayer layer = (RasterLayer) layers[0];
88

    
89
                WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
90
                RasterSwingBufferManager manager = RasterSwingBufferLocator.getSwingManager();
91
                I18nManager i18nManager = ToolsLocator.getI18nManager();
92

    
93
                final HistogramPanel panel;
94
                try {
95
                    panel = (HistogramPanel) manager.createHistogramPanel();
96
                    panel.asJComponent().setPreferredSize(new Dimension(650, 520));
97
                    panel.set(layer.getStatistics(null));
98
                    panel.setEnabledVisibleStatistics(true);
99

    
100
                    final RasterStore store = layer.getRasterStore();
101
                    List<BandDescriptor> descriptors = new ArrayList<BandDescriptor>();
102
                    for (int i = 0; i < store.getBands(); i++) {
103
                        descriptors.add(layer.getRasterStore().getBandDescriptor(i));
104
                    }
105

    
106

    
107
//                    try {
108
//                        final RasterLegend legend = ((RasterLegend) layer.getLegend());
109
//                        //FIXME: Parece que la RasterLegend no lanza eventos de ContentsChanged.
110
//                        //Cuando lo haga, eliminar esta l?nea;
111
//                        updateColors(panel, store, legend);
112

    
113
//                        legend.addLegendListener(new LegendContentsChangedListener() {
114
//
115
//                            @Override
116
//                            public boolean symbolChanged(SymbolLegendEvent e) {
117
//                                updateColors(panel, store, legend);
118
//                                return true;
119
//                            }
120
//
121
//                            @Override
122
//                            public void legendCleared(LegendClearEvent event) {
123
//                                updateColors(panel, store, legend);
124
//                            }
125
//                        });
126

    
127

    
128
                        ((FLyrDefault) layer).addLegendListener(new LegendListener() {
129
                            @Override
130
                            public void legendChanged(LegendChangedEvent e) {
131
                                updateColors(panel, store, (RasterLegend)e.getNewLegend());
132
                            }
133
                        });
134
//                    } catch (LegendLayerException e) {
135
//                        logger.warn("Can't get layer's legend.", e);
136
//                    }
137

    
138

    
139
                    MapContextRasterSwingManager rasterSwingManager = MapContextRasterSwingLocator.getSwingManager();
140
                    SelectableBandsTableModel tableModel =
141
                        rasterSwingManager.createSelectableBandDescriptorsTableModel(descriptors);
142
                    panel.set(tableModel);
143
                    final ViewPort viewPort = mapControl.getViewPort();
144
                    final ViewPortListener viewPortListener = new ViewPortListener() {
145

    
146
                        @Override
147
                        public void projectionChanged(ProjectionEvent e) {
148
                            doUpdateViewPort(panel, layer, viewPort);
149
                        }
150
                        @Override
151
                        public void extentChanged(ExtentEvent e) {
152
                            doUpdateViewPort(panel, layer, viewPort);
153
                        }
154
                        @Override
155
                        public void backColorChanged(ColorEvent e) {
156
                            // Do nothing
157
                        }
158
                    };
159

    
160
                    panel.addChangeItemSourceListener(new ItemListener() {
161
                        @Override
162
                        public void itemStateChanged(ItemEvent event) {
163
                            if (event.getStateChange() == ItemEvent.SELECTED) {
164
//                                // FIXME: Parece que la RasterLegend no lanza
165
//                                // eventos de ContentsChanged.
166
//                                // Cuando lo haga, todo el bloque try-catch siguiente
167
//                                try {
168
//                                    RasterLegend legend = ((RasterLegend) layer.getLegend());
169
//                                    updateColors(panel, store, legend);
170
//                                } catch (LegendLayerException e) {
171
//                                    logger.warn("Can't get layer's legend.", e);
172
//                                }
173

    
174

    
175
                                int selectedIndex = ((JComboBox<?>) (event.getSource())).getSelectedIndex();
176
                                if (selectedIndex == 0) {
177
                                    viewPort.removeViewPortListener(viewPortListener);
178
                                } else if (selectedIndex == 1) {
179
                                    viewPort.addViewPortListener(viewPortListener);
180
                                    doUpdateViewPort(panel, layer, viewPort);
181
                                }
182
                            }
183
                        }
184
                    });
185

    
186
                    panel.asJComponent().addAncestorListener(new AncestorListener() {
187
                        @Override
188
                        public void ancestorRemoved(AncestorEvent event) {
189
                            viewPort.removeViewPortListener(viewPortListener);
190
                        }
191
                        @Override
192
                        public void ancestorMoved(AncestorEvent event) {
193
                            // Do nothing
194
                        }
195
                        @Override
196
                        public void ancestorAdded(AncestorEvent event) {
197
                            // Do nothing
198
                        }
199
                    });
200
                } catch (RasterCreatingPanelException e2) {
201
                    logger.error("Error creating panel", e2);
202
                    JOptionPane.showMessageDialog(null,
203
                        new StringBuilder().append(i18nManager.getTranslation("error_creating_panel")).append(":")
204
                            .append(e2.getLocalizedMessage()), i18nManager.getTranslation("error"),
205
                        JOptionPane.ERROR_MESSAGE);
206
                    return;
207
                }
208

    
209
                winManager.showWindow(panel.asJComponent(),
210
                    ToolsSwingUtils.makeTitle("Histogram",layer.getName(),layer.getRasterStore().getName()),
211
                    WindowManager.MODE.WINDOW);
212
            }
213
        }
214
    }
215

    
216
    /**
217
     * @param panel
218
     * @param store
219
     * @param legend
220
     */
221
    private void updateColors(final HistogramPanel panel, RasterStore store, RasterLegend legend) {
222
        Color[] colorBands = new Color[store.getBands()];
223
        ColorInterpretation colorInterpretations = legend.getColorInterpretation();
224
        if (colorInterpretations != null) {
225
            for (int i = 0; i < store.getBands(); i++) {
226
                switch (colorInterpretations.get(i)) {
227
                case ColorInterpretation.RED_BAND:
228
                    colorBands[i] = Color.red;
229
                    break;
230
                case ColorInterpretation.GREEN_BAND:
231
                    colorBands[i] = Color.green;
232
                    break;
233
                case ColorInterpretation.BLUE_BAND:
234
                    colorBands[i] = Color.blue;
235
                    break;
236
                case ColorInterpretation.ALPHA_BAND:
237
                    colorBands[i] = Color.lightGray;
238
                    break;
239
                case ColorInterpretation.GRAY_BAND:
240
                    colorBands[i] = Color.darkGray;
241
                    break;
242
                case ColorInterpretation.CYAN_BAND:
243
                    colorBands[i] = Color.cyan;
244
                    break;
245
                case ColorInterpretation.MAGENTA_BAND:
246
                    colorBands[i] = Color.magenta;
247
                    break;
248
                case ColorInterpretation.YELLOW_BAND:
249
                    colorBands[i] = Color.yellow;
250
                    break;
251
                case ColorInterpretation.BLACK_BAND:
252
                    colorBands[i] = Color.black;
253
                    break;
254
                default:
255
                    colorBands[i] = Color.orange;
256
                    break;
257
                }
258
            }
259
            panel.setBandColors(colorBands);
260
        }
261
    }
262

    
263
    protected void doUpdateViewPort(HistogramPanel panel, RasterLayer layer, ViewPort viewPort) {
264
        logger.info("UPDATING VIEWPORT");
265
        if (panel.isEnabledVisibleStatistics()) {
266

    
267
            Envelope envelope = viewPort.getAdjustedEnvelope();
268
            Statistics statistics;
269
            Envelope layerEnvelope;
270
            try {
271
                layerEnvelope = layer.getFullEnvelope();
272
            } catch (ReadException e1) {
273
                logger.warn("Can't get layer's envelope.", e1);
274
                return;
275
            }
276
            if (envelope.contains(layerEnvelope)) {
277
                statistics = layer.getStatistics(null);
278
                panel.setVisibleStatistics(statistics);
279
            } else {
280
                if (envelope.intersects(layerEnvelope)) {
281

    
282
                    RasterStore rasterStore = layer.getRasterStore();
283
                    RasterQuery query = rasterStore.createRasterQuery();
284
                    ICoordTrans ct = layer.getCoordTrans();
285
                    Geometry geom = envelope.getGeometry();
286
                    if (ct != null) {
287
                        geom.reProject(ct.getInverted());
288
                    }
289
                    Envelope reprojectedEnvelope = geom.getEnvelope();
290

    
291
                    double pixelSize = reprojectedEnvelope.getLength(0) / (double) viewPort.getImageWidth();
292
                    query.setPixelSize(pixelSize);
293

    
294
                    query.setClip(reprojectedEnvelope);
295
                    Buffer buffer = null;
296
                    try {
297
                        buffer = rasterStore.getRasterSet(query);
298
                    } catch (DataException e) {
299
                        logger.warn("Can't create rasterSet from envelope", e);
300
                        return;
301
                    }
302
                    statistics = buffer.getStatistics(null);
303
                    panel.setVisibleStatistics(statistics);
304
                } else {
305
                    panel.setVisibleStatistics(null);
306
                }
307
            }
308
        }
309
    }
310

    
311
    @Override
312
    public boolean isEnabled() {
313
        IView view = getActiveView();
314
        if (view != null) {
315
            ViewDocument viewDocument = view.getViewDocument();
316
            FLayer[] layers = viewDocument.getMapContext().getLayers().getActives();
317
            if (layers.length == 1 && layers[0] instanceof RasterLayer) {
318
                return true;
319
            }
320
        }
321
        return false;
322
    }
323

    
324
    @Override
325
    public boolean isVisible() {
326
        if( DALLocator.getDataManager().isTheOldRasterRegistered() ) {
327
          return false;
328
        }
329
        IView view = getActiveView();
330
        if (view != null) {
331
            ViewDocument viewDocument = view.getViewDocument();
332
            FLayers layers = viewDocument.getMapContext().getLayers();
333
            for (FLayer fLayer : layers) {
334
                if (fLayer instanceof RasterLayer) {
335
                    return true;
336
                }
337
            }
338
        }
339
        return false;
340

    
341
    }
342

    
343
    private IView getActiveView() {
344
        ApplicationManager application = ApplicationLocator.getManager();
345
        IView view = (IView) application.getActiveComponent(ViewDocument.class);
346
        return view;
347
    }
348

    
349
}