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 | 44831 | jjdelcerro | 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 | 47394 | fdiaz | import org.gvsig.tools.swing.api.ToolsSwingUtils; |
61 | 44831 | jjdelcerro | import org.gvsig.tools.swing.api.windowmanager.WindowManager; |
62 | import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2; |
||
63 | 47394 | fdiaz | import org.gvsig.tools.task.SimpleTaskStatus; |
64 | 44831 | jjdelcerro | |
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 | 47394 | fdiaz | ToolsSwingUtils.makeTitle("Histogram",layer.getName(),layer.getRasterStore().getName()),
|
211 | WindowManager.MODE.WINDOW); |
||
212 | 44831 | jjdelcerro | } |
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 | } |