Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / enhanced / ui / EnhancedListener.java @ 19969

History | View | Annotate | Download (16.7 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.rastertools.enhanced.ui;
20

    
21
import java.awt.event.ActionEvent;
22
import java.awt.event.ActionListener;
23
import java.io.File;
24
import java.util.ArrayList;
25

    
26
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
27
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
28
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
29
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
30
import org.gvsig.raster.IProcessActions;
31
import org.gvsig.raster.beans.canvas.GCanvasEvent;
32
import org.gvsig.raster.beans.canvas.IGCanvasListener;
33
import org.gvsig.raster.beans.canvas.layers.GraphicHistogram;
34
import org.gvsig.raster.beans.canvas.layers.functions.DensitySlicingLine;
35
import org.gvsig.raster.beans.canvas.layers.functions.LogaritmicExponentialLine;
36
import org.gvsig.raster.beans.canvas.layers.functions.SquareRootPowLine;
37
import org.gvsig.raster.beans.canvas.layers.functions.StraightLine;
38
import org.gvsig.raster.beans.previewbase.PreviewBasePanel;
39
import org.gvsig.raster.dataset.IRasterDataSource;
40
import org.gvsig.raster.dataset.Params;
41
import org.gvsig.raster.grid.filter.FilterTypeException;
42
import org.gvsig.raster.grid.filter.enhancement.EqualizationFilter;
43
import org.gvsig.raster.hierarchy.IRasterRendering;
44
import org.gvsig.raster.util.RasterNotLoadException;
45
import org.gvsig.raster.util.RasterToolsUtil;
46
import org.gvsig.raster.util.process.FilterProcess;
47
import org.gvsig.rastertools.enhanced.graphics.HistogramGraphicBase;
48
import org.gvsig.rastertools.enhanced.graphics.HistogramGraphicBase.HistogramStatus;
49

    
50
import com.iver.andami.PluginServices;
51
/**
52
 * Gestor de eventos de los paneles de gr?ficas y controles.
53
 * 
54
 * 21/02/2008
55
 * @author Nacho Brodin nachobrodin@gmail.com
56
 */
57
public class EnhancedListener implements ActionListener, IGCanvasListener, ButtonsPanelListener, IProcessActions {
58
        private SelectorsPanel   selectorsPanel  = null;
59
        private GraphicsPanel    graphicsPanel   = null;
60
        private PreviewBasePanel enhancedPanel   = null;
61
        private EnhancedDialog   enhancedDialog  = null;
62
        private PreviewFiltering filteredPreview = null;
63
        private EnhancedHistogramController  enhancedManager = null;
64
        
65
        /**
66
         * Constructor
67
         * @param selectorsPanel Panel con los selectores de opciones
68
         * @param graphicsPanel Panel con los gr?ficos
69
         * @param enhancedPanel Panel base con la previsualizaci?n
70
         * @param enhancedDialog Dialogo general
71
         * @param filteredPreview Preprocesado para la preview
72
         */
73
        public EnhancedListener(SelectorsPanel selectorsPanel, 
74
                                                        GraphicsPanel graphicsPanel, 
75
                                                        PreviewBasePanel enhancedPanel, 
76
                                                        EnhancedDialog enhancedDialog, 
77
                                                        PreviewFiltering filteredPreview) {
78
                this.selectorsPanel = selectorsPanel;
79
                this.graphicsPanel = graphicsPanel;
80
                this.enhancedPanel = enhancedPanel;
81
                this.enhancedDialog = enhancedDialog;
82
                this.filteredPreview = filteredPreview;
83
                
84
                
85
                enhancedManager = new EnhancedHistogramController(graphicsPanel.getInputHistogram(), graphicsPanel.getOutputHistogram(), enhancedDialog);
86
                
87
                selectorsPanel.getHistogramType().addActionListener(this);
88
                selectorsPanel.getDrawType().addActionListener(this);
89
                selectorsPanel.getBand(null).addActionListener(this);
90
                selectorsPanel.getEnhancedType().addActionListener(this);
91
                graphicsPanel.getLevels().addActionListener(this);
92
                graphicsPanel.getRGB().addActionListener(this);
93
        }
94
        
95
        /*
96
         * (non-Javadoc)
97
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
98
         */
99
        public void actionPerformed(ActionEvent e) {
100
                //Cambio del tipo de de dibujado del histograma
101
                if(e.getSource() == selectorsPanel.getDrawType()) {
102
                        if(((String)selectorsPanel.getDrawType().getSelectedItem()).equals("Fill")) {
103
                                graphicsPanel.getInputHistogram().setType(GraphicHistogram.TYPE_FILL);
104
                                graphicsPanel.getOutputHistogram().setType(GraphicHistogram.TYPE_FILL);
105
                        }
106
                        if(((String)selectorsPanel.getDrawType().getSelectedItem()).equals("Line")) {
107
                                graphicsPanel.getInputHistogram().setType(GraphicHistogram.TYPE_LINE);
108
                                graphicsPanel.getOutputHistogram().setType(GraphicHistogram.TYPE_LINE);
109
                        }
110
                        graphicsPanel.getInputHistogram().getCanvas().repaint();
111
                        graphicsPanel.getOutputHistogram().getCanvas().repaint();
112
                }
113

    
114
                // Cambio el tipo de visualizacion del histograma
115
                if (e.getSource() == selectorsPanel.getHistogramType()) {
116
                        if (((String) selectorsPanel.getHistogramType().getSelectedItem()).equals("Standard")) {
117
                                graphicsPanel.getOutputHistogram().setHistogramType(GraphicHistogram.VIEW_LINEAL);
118
                        }
119
                        if (((String) selectorsPanel.getHistogramType().getSelectedItem()).equals("Cumulative")) {
120
                                graphicsPanel.getOutputHistogram().setHistogramType(GraphicHistogram.VIEW_ACUMMULATED);
121
                        }
122
                        if (((String) selectorsPanel.getHistogramType().getSelectedItem()).equals("Logarithmic")) {
123
                                graphicsPanel.getOutputHistogram().setHistogramType(GraphicHistogram.VIEW_LOGARITHMIC);
124
                        }
125
                        if (((String) selectorsPanel.getHistogramType().getSelectedItem()).equals("Cumulative Logarithmic")) {
126
                                graphicsPanel.getOutputHistogram().setHistogramType(GraphicHistogram.VIEW_ACUMMULATEDLOG);
127
                        }
128
                        graphicsPanel.getOutputHistogram().getCanvas().repaint();
129
                }
130

    
131
                // Seleccion de modo RGB o normal
132
                if (e.getSource() == graphicsPanel.getRGB()) {
133
                        graphicsPanel.updateHistogram();
134
                        updatePreview();
135
                }
136
                
137
                //Cambio de banda
138
                if(e.getSource() == selectorsPanel.getBand(null)) {
139
                        if(((String)selectorsPanel.getBand(null).getSelectedItem()).equals("Red")) {
140
                                graphicsPanel.getInputHistogram().setHistogramDrawed(HistogramGraphicBase.RED);
141
                                graphicsPanel.getOutputHistogram().setHistogramDrawed(HistogramGraphicBase.RED);
142
                        }
143
                        if(((String)selectorsPanel.getBand(null).getSelectedItem()).equals("Green")) {
144
                                graphicsPanel.getInputHistogram().setHistogramDrawed(HistogramGraphicBase.GREEN);
145
                                graphicsPanel.getOutputHistogram().setHistogramDrawed(HistogramGraphicBase.GREEN);
146
                        }
147
                        if(((String)selectorsPanel.getBand(null).getSelectedItem()).equals("Blue")) {
148
                                graphicsPanel.getInputHistogram().setHistogramDrawed(HistogramGraphicBase.BLUE);
149
                                graphicsPanel.getOutputHistogram().setHistogramDrawed(HistogramGraphicBase.BLUE);
150
                        }
151

    
152
                        HistogramStatus status = graphicsPanel.getInputHistogram().getHistogramStatus(HistogramGraphicBase.DRAWED);
153

    
154
                        if (status.getBaseFunction().getClass().equals(DensitySlicingLine.class))
155
                                selectorsPanel.getEnhancedType().setSelectedItem("Level-slice");
156

    
157
                        if (status.getBaseFunction().getClass().equals(StraightLine.class))
158
                                selectorsPanel.getEnhancedType().setSelectedItem("Lineal");
159

    
160
                        if (status.getBaseFunction().getClass().equals(EqualizationFilter.class))
161
                                selectorsPanel.getEnhancedType().setSelectedItem("Equalization");
162

    
163
                        if (status.getBaseFunction().getClass().equals(SquareRootPowLine.class))
164
                                selectorsPanel.getEnhancedType().setSelectedItem("Square-root");
165

    
166
                        if (status.getBaseFunction().getClass().equals(LogaritmicExponentialLine.class))
167
                                selectorsPanel.getEnhancedType().setSelectedItem("Logaritmic");
168
                        
169
                        status = graphicsPanel.getOutputHistogram().getHistogramStatus(HistogramGraphicBase.DRAWED);
170

    
171
                        switch (status.getGraphicHistogram().getType()) {
172
                                case GraphicHistogram.TYPE_FILL:
173
                                        selectorsPanel.getDrawType().setSelectedItem("Fill");
174
                                        break;
175
                                default:
176
                                        selectorsPanel.getDrawType().setSelectedItem("Line");
177
                                        break;
178
                        }
179

    
180
                        switch (status.getGraphicHistogram().getTypeViewed()) {
181
                                case GraphicHistogram.VIEW_ACUMMULATED:
182
                                        selectorsPanel.getHistogramType().setSelectedItem("Cumulative");
183
                                        break;
184
                                case GraphicHistogram.VIEW_LOGARITHMIC:
185
                                        selectorsPanel.getHistogramType().setSelectedItem("Logarithmic");
186
                                        break;
187
                                case GraphicHistogram.VIEW_ACUMMULATEDLOG:
188
                                        selectorsPanel.getHistogramType().setSelectedItem("Cumulative Logarithmic");
189
                                        break;
190
                                default:
191
                                        selectorsPanel.getHistogramType().setSelectedItem("Standard");
192
                                        break;
193
                        }
194
                }
195
                
196
                //Cambio de operaci?n
197
                if(e.getSource() == selectorsPanel.getEnhancedType()) {
198
                        graphicsPanel.setLevelsEnabled(false);
199
                        
200
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Lineal")) {
201
                                graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_LINEAL);
202
                                updatePreview();
203
                        }
204
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Gaussian")) {
205

    
206
                        }
207
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Logaritmic")) {
208
                                graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_LOGARIT);
209
                                updatePreview();
210
                        }
211
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Exponential")) {
212
                                graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_EXPONENT);
213
                                updatePreview();
214
                        }
215
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Equalization")) {
216
                                int[] renderBands = enhancedDialog.getLayer().getRender().getRenderBands();
217
                                String values = "";
218
                                for (int i = 0; i < renderBands.length; i++) 
219
                                        values += renderBands[i] + " ";
220
                                values = values.trim();
221
                                Params params = new Params();
222
                                params.setParam("Histogram", graphicsPanel.getHistogram(), -1, null);
223
                                params.setParam("RenderBands", values, -1, null);
224
                                params.setParam("EcualizedBands", new int[]{0, 1, 2}, -1, null);
225
                                filteredPreview.addNewParam("equalization", params, EqualizationFilter.class);
226
                        }
227
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Square-root")) {
228
                                graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_SQUARE_ROOT);
229
                                updatePreview();
230
                        }
231
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Level-slice")) {
232
                                graphicsPanel.setLevelsEnabled(true);
233
                                graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_DENSITY);
234

    
235
                                // Establece el numero de niveles en el cuadro de texto
236
                                HistogramStatus status = graphicsPanel.getInputHistogram().getHistogramStatus(HistogramGraphicBase.DRAWED);
237
                                graphicsPanel.getLevels().setValue(new Long(((DensitySlicingLine) status.getBaseFunction()).getLevels()));
238
                                updatePreview();
239
                        }
240
                }
241
                
242
                //Cambio de tipo (estandar/acumulado)
243
                if(e.getSource() == selectorsPanel.getHistogramType()) {
244
                        if(((String)selectorsPanel.getHistogramType().getSelectedItem()).equals("Standard")) {
245
                                
246
                        }
247
                        if(((String)selectorsPanel.getHistogramType().getSelectedItem()).equals("Cumulative")) {
248
                                
249
                        }
250
                }
251
                
252
                //Cambio en el n?mero de niveles
253
                if(e.getSource() == graphicsPanel.getLevels()) {
254
                        Long lValue = (Long)graphicsPanel.getLevels().getValue();
255
                        int value = lValue.intValue();
256
                        if(value > 30 || value < 2) {
257
                                RasterToolsUtil.messageBoxInfo("range_wrong" + " [2-30]", null);
258
                                if(value > 30)
259
                                        value = 30;
260
                                if(value < 2)
261
                                        value = 2;
262
                        }
263
                        graphicsPanel.getLevels().setValue(new Long(value));
264
                        try {
265
                                graphicsPanel.getInputHistogram().setLevel(value);
266
                                updatePreview();
267
                        } catch (NumberFormatException exc) {
268
                                //No asignamos el nivel
269
                        }
270
                }
271
                
272
                manageMainButtons(e);
273
        }
274
        
275
        /**
276
         * Gestiona los eventos de los botones principales (Aceptar, Aplicar, Cancelar)
277
         * @param e
278
         */
279
        private void manageMainButtons(ActionEvent e) {
280
                if(e.getSource() == enhancedPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT)) {
281
                        /*Params params = new Params();
282
                        params.setParam("TailTrim",
283
                                        new Double(Math.round(0 * 100.0)),
284
                                        Params.SLIDER,
285
                                        new String[]{ "0", "100", "0", "1", "25" });
286
                        params.setParam("Stretch",
287
                                        new Double[][] {{new Double(0), new Double(1269)}, {new Double(0), new Double(1525)}, {new Double(0), new Double(888)}},
288
                                        Params.CHOICE,
289
                                        null);
290
                        params.setParam("StretchRGB",
291
                                        new Integer[] {new Integer(255)},
292
                                        Params.CHOICE,
293
                                        null);
294
                        filteredPreview.addNewParam("param1", params, LinearStretchEnhancementFilter.class);*/
295
                }
296
                if(e.getSource() == enhancedPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY)) {
297
                        
298
                }
299
                if(e.getSource() == enhancedPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_CANCEL)) {
300
                        enhancedDialog.close();
301
                }
302
        }
303

    
304
        /**
305
         * Coge los datos que hay en los histogramas y los aplica a la vista previa
306
         */
307
        private void updatePreview() {
308
                enhancedManager.updatePreview();
309
                enhancedManager.updateHistogramOut();
310
        }
311

    
312
        /**
313
         * Coge los datos que hay en los histogramas y los aplica en el histograma de salida
314
         */
315
        private void updateHistogramOut() {
316
                enhancedManager.updatePreview();
317
                enhancedManager.updateHistogramOut();
318
        }
319
        
320
        /*
321
         * (non-Javadoc)
322
         * @see org.gvsig.raster.beans.canvas.IGCanvasListener#actionDataChanged(org.gvsig.raster.beans.canvas.GCanvasEvent)
323
         */
324
        public void actionDataChanged(GCanvasEvent e) {
325
                if (e.getKey().equals("minmax")) {
326
                        updatePreview();
327
                        return;
328
                }
329
                if (e.getKey().equals("line")) {
330
                        updatePreview();
331
                        return;
332
                }
333
        }
334

    
335
        /*
336
         * (non-Javadoc)
337
         * @see org.gvsig.raster.beans.canvas.IGCanvasListener#actionDataDragged(org.gvsig.raster.beans.canvas.GCanvasEvent)
338
         */
339
        public void actionDataDragged(GCanvasEvent e) {
340
                if (e.getKey().equals("minmax")) {
341
                        updateHistogramOut();
342
                        return;
343
                }
344
                if (e.getKey().equals("line")) {
345
                        updateHistogramOut();
346
                        return;
347
                }
348
        }
349

    
350
        /*
351
         * (non-Javadoc)
352
         * @see org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener#actionButtonPressed(org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent)
353
         */
354
        public void actionButtonPressed(ButtonsPanelEvent e) {
355
                switch (e.getButton()) {
356
                        case ButtonsPanel.BUTTON_ACCEPT:
357
                                apply();
358
                                enhancedDialog.close();
359
                                break;
360
                        case ButtonsPanel.BUTTON_CANCEL:
361
                                cancel();
362
                                enhancedDialog.close();
363
                                break;
364
                        case ButtonsPanel.BUTTON_APPLY:
365
                                apply();
366
                                break;
367
                }
368
        }
369
        
370
        /**
371
         * Que acciones se ejecutaran al haber presionado el bot?n aceptar o aplicar
372
         */
373
        public void apply() {
374
                IRasterDataSource raster = ((FLyrRasterSE) enhancedDialog.getLayer()).getDataSource();
375
                if (raster == null)
376
                        return;
377

    
378
                String path = null;
379
                if (!enhancedDialog.getNewOrSaveLayerPanel().getRadioOnlyView().isSelected()) {
380
                        path = enhancedDialog.getNewOrSaveLayerPanel().getFileSelected();
381
                        if (path == null)
382
                                return;
383
                }
384

    
385
                //Rendering rendering = ((FLyrRasterSE) getFilterPanel().getLayer()).getRender();
386
                IRasterRendering rendering = (IRasterRendering) enhancedDialog.getLayer();
387

    
388
                // Array para guardar los filtros que se van a usar en forma de ParamStruct
389
                ArrayList listFilterUsed = enhancedDialog.getFilteredPreview().applyFilters(rendering);
390

    
391
                if (enhancedDialog.getNewOrSaveLayerPanel().getRadioOnlyView().isSelected()) {
392
                        try {
393
                                FilterProcess.addSelectedFilters(rendering.getRenderFilterList(), listFilterUsed);
394
                                ((FLyrRasterSE) enhancedDialog.getLayer()).setRenderFilterList(rendering.getRenderFilterList());
395
                                enhancedDialog.getLayer().getMapContext().invalidate();
396
                        } catch (FilterTypeException e) {
397
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
398
                        }
399
                } else {
400
                        FilterProcess filterProcess = new FilterProcess();
401
                        filterProcess.setActions(this);
402
                        filterProcess.addParam("rendering", rendering);
403
                        filterProcess.addParam("filename", path);
404
                        filterProcess.addParam("rasterdatasource", raster);
405
                        filterProcess.addParam("listfilterused", listFilterUsed);
406
                        filterProcess.start();
407
                }
408
        }
409
        
410
        /**
411
         * Volvemos todo a la normalidad cuando se cancela
412
         */
413
        public void cancel() {
414
                if (enhancedDialog.getLayer() != null)
415
                        enhancedDialog.getLayer().getMapContext().invalidate();
416
        }
417
        
418

    
419
        /**
420
         * Acciones que se realizan al finalizar de crear los recortes de imagen.
421
         * Este m?todo es llamado por el thread TailRasterProcess al finalizar.
422
         */
423
        public void loadLayerInToc(String fileName) {
424
                if (!enhancedDialog.getNewOrSaveLayerPanel().getRadioNewLayer().isSelected())
425
                        return;
426
                if(!new File(fileName).exists())
427
                        return;
428
                try {
429
                        RasterToolsUtil.loadLayer(enhancedDialog.getViewName(), fileName, null);
430
                } catch (RasterNotLoadException e) {
431
                        RasterToolsUtil.messageBoxError("error_cargar_capa", this, e);
432
                }
433

    
434
                if(enhancedDialog != null)
435
                        enhancedDialog.getNewOrSaveLayerPanel().updateNewLayerText();
436
        }
437

    
438
        /*
439
         * (non-Javadoc)
440
         * @see org.gvsig.raster.IProcessActions#end(java.lang.Object)
441
         */
442
        public void end(Object param) {
443
                loadLayerInToc((String) param);
444
        }
445
        
446
        public void interrupted() {}
447
}