Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / enhanced / ui / EnhancedListener.java @ 19945

History | View | Annotate | Download (16.2 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.StraightLine;
36
import org.gvsig.raster.beans.previewbase.PreviewBasePanel;
37
import org.gvsig.raster.dataset.IRasterDataSource;
38
import org.gvsig.raster.dataset.Params;
39
import org.gvsig.raster.grid.filter.FilterTypeException;
40
import org.gvsig.raster.grid.filter.enhancement.EqualizationFilter;
41
import org.gvsig.raster.hierarchy.IRasterRendering;
42
import org.gvsig.raster.util.RasterNotLoadException;
43
import org.gvsig.raster.util.RasterToolsUtil;
44
import org.gvsig.raster.util.process.FilterProcess;
45
import org.gvsig.rastertools.enhanced.graphics.HistogramGraphicBase;
46
import org.gvsig.rastertools.enhanced.graphics.HistogramGraphicBase.HistogramStatus;
47

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

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

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

    
150
                        HistogramStatus status = graphicsPanel.getInputHistogram().getHistogramStatus(HistogramGraphicBase.DRAWED);
151

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

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

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

    
161
                        
162
                        status = graphicsPanel.getOutputHistogram().getHistogramStatus(HistogramGraphicBase.DRAWED);
163

    
164
                        switch (status.getGraphicHistogram().getType()) {
165
                                case GraphicHistogram.TYPE_FILL:
166
                                        selectorsPanel.getDrawType().setSelectedItem("Fill");
167
                                        break;
168
                                default:
169
                                        selectorsPanel.getDrawType().setSelectedItem("Line");
170
                                        break;
171
                        }
172

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

    
199
                        }
200
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Logaritmic")) {
201
                                graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_LOGARIT);
202
                                updatePreview();
203
                        }
204
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Exponential")) {
205
                                graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_EXPONENT);
206
                                updatePreview();
207
                        }
208
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Equalization")) {
209
                                int[] renderBands = enhancedDialog.getLayer().getRender().getRenderBands();
210
                                String values = "";
211
                                for (int i = 0; i < renderBands.length; i++) 
212
                                        values += renderBands[i] + " ";
213
                                values = values.trim();
214
                                Params params = new Params();
215
                                params.setParam("Histogram", graphicsPanel.getHistogram(), -1, null);
216
                                params.setParam("RenderBands", values, -1, null);
217
                                params.setParam("EcualizedBands", new int[]{0, 1, 2}, -1, null);
218
                                filteredPreview.addNewParam("equalization", params, EqualizationFilter.class);
219
                        }
220
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Square-root")) {
221

    
222
                        }
223
                        if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Level-slice")) {
224
                                graphicsPanel.setLevelsEnabled(true);
225
                                graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_DENSITY);
226

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

    
296
        /**
297
         * Coge los datos que hay en los histogramas y los aplica a la vista previa
298
         */
299
        private void updatePreview() {
300
                enhancedManager.updatePreview();
301
                enhancedManager.updateHistogramOut();
302
        }
303

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

    
327
        /*
328
         * (non-Javadoc)
329
         * @see org.gvsig.raster.beans.canvas.IGCanvasListener#actionDataDragged(org.gvsig.raster.beans.canvas.GCanvasEvent)
330
         */
331
        public void actionDataDragged(GCanvasEvent e) {
332
                if (e.getKey().equals("minmax")) {
333
                        updateHistogramOut();
334
                        return;
335
                }
336
                if (e.getKey().equals("line")) {
337
                        updateHistogramOut();
338
                        return;
339
                }
340
        }
341

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

    
370
                String path = null;
371
                if (!enhancedDialog.getNewOrSaveLayerPanel().getRadioOnlyView().isSelected()) {
372
                        path = enhancedDialog.getNewOrSaveLayerPanel().getFileSelected();
373
                        if (path == null)
374
                                return;
375
                }
376

    
377
                //Rendering rendering = ((FLyrRasterSE) getFilterPanel().getLayer()).getRender();
378
                IRasterRendering rendering = (IRasterRendering) enhancedDialog.getLayer();
379

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

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

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

    
426
                if(enhancedDialog != null)
427
                        enhancedDialog.getNewOrSaveLayerPanel().updateNewLayerText();
428
        }
429

    
430
        /*
431
         * (non-Javadoc)
432
         * @see org.gvsig.raster.IProcessActions#end(java.lang.Object)
433
         */
434
        public void end(Object param) {
435
                loadLayerInToc((String) param);
436
        }
437
        
438
        public void interrupted() {}
439
}