Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extRasterTools-SE / src / org / gvsig / rastertools / properties / control / EnhancedControl.java @ 29786

History | View | Annotate | Download (16.8 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.properties.control;
20

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

    
25
import javax.swing.JCheckBox;
26

    
27
import org.gvsig.andami.PluginServices;
28
import org.gvsig.fmap.mapcontext.layers.FLayer;
29
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
30
import org.gvsig.gui.beans.panelGroup.AbstractPanelGroup;
31
import org.gvsig.gui.beans.slidertext.listeners.SliderEvent;
32
import org.gvsig.gui.beans.slidertext.listeners.SliderListener;
33
import org.gvsig.raster.IProcessActions;
34
import org.gvsig.raster.dataset.FileNotOpenException;
35
import org.gvsig.raster.dataset.RasterDriverException;
36
import org.gvsig.raster.grid.filter.FilterAddException;
37
import org.gvsig.raster.grid.filter.FilterTypeException;
38
import org.gvsig.raster.grid.filter.RasterFilter;
39
import org.gvsig.raster.grid.filter.RasterFilterList;
40
import org.gvsig.raster.grid.filter.RasterFilterListManager;
41
import org.gvsig.raster.grid.filter.enhancement.BrightnessContrastListManager;
42
import org.gvsig.raster.grid.filter.enhancement.BrightnessFilter;
43
import org.gvsig.raster.grid.filter.enhancement.ContrastFilter;
44
import org.gvsig.raster.grid.filter.enhancement.EnhancementStretchListManager;
45
import org.gvsig.raster.grid.filter.enhancement.LinearStretchEnhancementFilter;
46
import org.gvsig.raster.grid.filter.enhancement.LinearStretchParams;
47
import org.gvsig.raster.grid.filter.statistics.StatisticsListManager;
48
import org.gvsig.raster.grid.filter.statistics.TailTrimFilter;
49
import org.gvsig.raster.hierarchy.IRasterDataset;
50
import org.gvsig.raster.hierarchy.IRasterRendering;
51
import org.gvsig.raster.hierarchy.IStatistics;
52
import org.gvsig.raster.util.RasterToolsUtil;
53
import org.gvsig.rastertools.RasterModule;
54
import org.gvsig.rastertools.properties.RasterPropertiesTocMenuEntry;
55
import org.gvsig.rastertools.properties.panels.EnhancedBrightnessContrastPanel;
56
import org.gvsig.rastertools.properties.panels.EnhancedPanel;
57
import org.gvsig.rastertools.properties.panels.EnhancedWithTrimPanel;
58
import org.gvsig.rastertools.statistics.StatisticsProcess;
59

    
60

    
61
/**
62
 * Clase que hace de interfaz entre los objetos que contienen la informaci�n de
63
 * realce y el panel.
64
 *
65
 * @author Nacho Brodin (nachobrodin@gmail.com)
66
 */
67
public class EnhancedControl implements IProcessActions {
68
        private EnhancedPanel                   tPanel      = null;
69
        private RasterFilterList                filterList  = null;
70
        private EnhancedWithTrimPanel           ePanel      = null;
71
        private EnhancedBrightnessContrastPanel bcPanel     = null;
72
        private IRasterDataset                  dataset     = null;
73
        private FLayer                          lyr         = null;
74
        private AbstractPanelGroup              panelGroup  = null;
75
        private IStatistics                     stats       = null;
76
        private int[]                           renderBands = new int[] { 0, 1, 2 };
77

    
78

    
79
        /**
80
         * Manejador de eventos de los slider de brillo y contraste.
81
         * @author Nacho Brodin (nachobrodin@gmail.com)
82
         */
83
        class BrightnessContrastListener implements ActionListener, SliderListener {
84
                JCheckBox active = null;
85
                /**
86
                 * Constructor. Registra los listener
87
                 * @param panel
88
                 */
89
                public BrightnessContrastListener(EnhancedBrightnessContrastPanel panel) {
90
                        panel.addBrightnessValueChangedListener(this);
91
                        panel.addContrastValueChangedListener(this);
92
                        active = panel.getActive();
93
                        active.addActionListener(this);
94
                }
95

    
96
                /*
97
                 * (non-Javadoc)
98
                 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
99
                 */
100
                public void actionPerformed(ActionEvent e) {
101
                        if (!RasterModule.autoRefreshView)
102
                                return;
103

    
104
                        if (e.getSource() == active)
105
                                onlyApply();
106
                }
107

    
108
                /*
109
                 * (non-Javadoc)
110
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueChanged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
111
                 */
112
                public void actionValueChanged(SliderEvent e) {
113
                        if (!RasterModule.autoRefreshView)
114
                                return;
115

    
116
                        onlyApply();
117
                }
118

    
119
                /*
120
                 * (non-Javadoc)
121
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueDragged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
122
                 */
123
                public void actionValueDragged(SliderEvent e) {
124
                }
125
        }
126

    
127
        /**
128
         * Manejador de eventos del panel EnhancedWithTrim.
129
         *
130
         * @version 14/06/2007
131
         * @author BorSanZa - Borja S�nchez Zamorano (borja.sanchez@iver.es)
132
         */
133
        class EnhancedWithTrimListener implements ActionListener, SliderListener {
134
                JCheckBox active = null;
135
                /**
136
                 * Constructor. Registra los listener
137
                 * @param panel
138
                 */
139
                public EnhancedWithTrimListener(EnhancedWithTrimPanel panel) {
140
                        active = panel.getActive();
141
                        active.addActionListener(this);
142
                        panel.getRemoveCheck().addActionListener(this);
143
                        panel.getTrimCheck().addActionListener(this);
144
                        panel.getTrimSlider().addValueChangedListener(this);
145
                }
146

    
147
                /*
148
                 * (non-Javadoc)
149
                 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
150
                 */
151
                public void actionPerformed(ActionEvent e) {
152
                        if (!RasterModule.autoRefreshView)
153
                                return;
154

    
155
                        onlyApply();
156
                }
157

    
158
                /*
159
                 * (non-Javadoc)
160
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueChanged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
161
                 */
162
                public void actionValueChanged(SliderEvent e) {
163
                        if (!RasterModule.autoRefreshView)
164
                                return;
165

    
166
                        onlyApply();
167
                }
168

    
169
                /*
170
                 * (non-Javadoc)
171
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueDragged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
172
                 */
173
                public void actionValueDragged(SliderEvent e) {
174
                }
175
        }
176

    
177
        /**
178
         * Constructor
179
         * @param tp
180
         */
181
        public EnhancedControl(AbstractPanelGroup panelGroup, EnhancedPanel tp, IRasterDataset dataset, FLayer lyr, RasterFilterList rfl) {
182
                this.panelGroup = panelGroup;
183
                this.tPanel = tp;
184
                this.dataset = dataset;
185
                this.filterList = rfl;
186
                this.lyr = lyr;
187
                this.bcPanel = tPanel.getBrightnessContrastPanel();
188
                this.ePanel = tPanel.getEnhancedWithTrimPanel();
189
                new BrightnessContrastListener(bcPanel);
190
                new EnhancedWithTrimListener(ePanel);
191

    
192
                saveStatus();
193

    
194
                setValuesFromFilterToPanel();
195
        }
196

    
197
        /**
198
         * Carga los valores del panel desde el filtro
199
         */
200
        private void setValuesFromFilterToPanel() {
201
                // BRILLO
202
                BrightnessFilter bFilter = (BrightnessFilter) filterList.getByName(BrightnessFilter.names[0]);
203
                if (bFilter != null){
204
                        int incr = ((Integer)bFilter.getParam("incrBrillo")).intValue();
205
                        bcPanel.setBrightnessValue((double) incr);
206
                }else
207
                        bcPanel.setBrightnessValue(0);
208

    
209
                // CONTRASTE
210
                ContrastFilter cFilter = (ContrastFilter) filterList.getByName(ContrastFilter.names[0]);
211
                if (cFilter != null){
212
                        int incr = ((Integer)cFilter.getParam("incrContraste")).intValue();
213
                        bcPanel.setContrastValue((double) incr);
214
                }
215
                else
216
                        bcPanel.setContrastValue(0);
217

    
218
                if (bFilter != null || cFilter != null)
219
                        bcPanel.setControlEnabled(true);
220
                else
221
                        bcPanel.setControlEnabled(false);
222

    
223
                // REALCE LINEAL
224
                LinearStretchEnhancementFilter eFilter = (LinearStretchEnhancementFilter) filterList.getByName(LinearStretchEnhancementFilter.names[0]);
225
                if (eFilter != null) {
226
                        ePanel.setControlEnabled(true);
227

    
228
                        // Comprueba si esta activo eliminar extremos
229
                        boolean removeEnds = false;
230
                        if (eFilter.getParam("remove") != null)
231
                                removeEnds = ((Boolean) eFilter.getParam("remove")).booleanValue();
232
                        ePanel.setRemoveEndsActive(removeEnds);
233
                        
234
                        // Comprueba si hay recorte de colas
235
                        LinearStretchParams stretchs = (LinearStretchParams) eFilter.getParam("stretchs");
236
                        double[] tailTrimList;
237
                        if (stretchs != null)
238
                                tailTrimList = stretchs.getTailTrimList();
239
                        else
240
                                tailTrimList = new double[0];
241
                        double median = 0;
242
                        double nValues = tailTrimList.length;
243
                        for (int i = 0; i < tailTrimList.length; i++) 
244
                                median += tailTrimList[i];
245
                        double tailTrim = new Double(nValues > 0 ? median / nValues : median).doubleValue();
246
                        
247
                        if (tailTrim != 0) {
248
                                ePanel.setTailTrimCheckActive(true);
249
                                ePanel.setTailTrimValue(tailTrim * 100);
250
                        } else {
251
                                ePanel.setTailTrimCheckActive(false);
252
                                ePanel.setTailTrimValue(0);
253
                        }
254
                } else {
255
                        ePanel.setControlEnabled(false);
256
                        ePanel.setRemoveEndsActive(false);
257
                        ePanel.setTailTrimCheckActive(false);
258
                        ePanel.setTailTrimValue(0);
259
                }
260
        }
261

    
262
        /**
263
         * Carga los valores del filtro desde el panel
264
         * @throws FilterTypeException
265
         * @throws FilterAddException 
266
         */
267
        private void setValuesFromPanelToFilter() throws FilterTypeException, FilterAddException {
268
                RasterFilterListManager manager = new RasterFilterListManager(filterList);
269

    
270
                // REALCE
271
                EnhancementStretchListManager eManager = (EnhancementStretchListManager) manager.getManagerByClass(EnhancementStretchListManager.class);
272
                if (ePanel.getActive().isSelected()) {
273
                        stats = dataset.getDataSource().getStatistics();
274
                        if (lyr instanceof IRasterRendering)
275
                                renderBands = ((IRasterRendering) lyr).getRender().getRenderBands();
276
                         // En este caso siempre es necesario el m�ximo y m�nimo
277
                        try {
278
                                if(!stats.isCalculated() && lyr instanceof FLyrRasterSE) 
279
                                        StatisticsProcess.launcher((FLyrRasterSE)lyr, this);
280
                                else {
281
                                        if (ePanel.isTailTrimCheckSelected()) {
282
                                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), (double) (ePanel.getTrimValue() / 100D), stats, ((FLyrRasterSE) lyr).isRGB());
283
                                                eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
284
                                        } else {
285
                                                filterList.remove(TailTrimFilter.class);
286
                                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), 0, stats, ((FLyrRasterSE) lyr).isRGB());
287
                                                eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
288
                                        }
289
                                }
290
                        } catch (FileNotOpenException e) {
291
                                throw new FilterAddException("No se han podido calcular estadisticas. Error al a�adir realce;" + e.getMessage());
292
                        } catch (RasterDriverException e) {
293
                                throw new FilterAddException("No se han podido calcular estadisticas. Error al a�adir realce; " + e.getMessage());
294
                        }
295
                } else {
296
                        filterList.remove(LinearStretchEnhancementFilter.class);
297
                        filterList.remove(TailTrimFilter.class);
298
                }
299

    
300
                // BRILLO Y CONTRASTE
301
                BrightnessContrastListManager bcManager = (BrightnessContrastListManager) manager.getManagerByClass(BrightnessContrastListManager.class);
302

    
303
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getBrightnessValue() != 0))
304
                        bcManager.addBrightnessFilter((int) bcPanel.getBrightnessValue());
305
                else
306
                        filterList.remove(BrightnessFilter.class);
307

    
308
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getContrastValue() != 0))
309
                        bcManager.addContrastFilter((int) bcPanel.getContrastValue());
310
                else
311
                        filterList.remove(ContrastFilter.class);
312

    
313
                endActionsForFilterSettings();
314
        }
315
        
316
        /**
317
         * Acciones realizadas al final la aplicaci�n de filtros
318
         * @throws FilterTypeException
319
         */
320
        @SuppressWarnings("unchecked")
321
        private void endActionsForFilterSettings() throws FilterTypeException {
322
                ArrayList listOrder = (ArrayList) panelGroup.getProperties().get("filterOrder");
323
                ArrayList listCopy = filterList.getStatusCloned();
324
                int cont = 0;
325
                for (int i = 0; i < listOrder.size(); i++) {
326
                        int pos = hasFilter(listCopy, ((RasterFilter) listOrder.get(i)).getName());
327
                        if (pos != -1) {
328
                                // Esta pero en posicion equivocada
329
                                if (pos != cont) {
330
                                        Object copy = listCopy.remove(pos);
331
                                        listCopy.add(cont, copy);
332
                                }
333
                                cont++;
334
                        }
335
                }
336
                filterList.setStatus(listCopy);
337
                filterList.controlTypes();
338

    
339
                // Redibujamos
340
                if (lyr != null)
341
                        lyr.getMapContext().invalidate();
342
        }
343

    
344
        /**
345
         * Acciones a ejecutar cuando se acepta
346
         */
347
        public void accept() {
348
                try {
349
                        setValuesFromPanelToFilter();
350
                } catch (FilterTypeException e) {
351
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
352
                } catch (FilterAddException e) {
353
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
354
                }
355
        }
356

    
357
        /**
358
         * Acciones a ejecutar cuando se aplica
359
         */
360
        public void apply() {
361
                onlyApply();
362
                saveStatus();
363
        }
364

    
365
        /**
366
         * Acciones a ejecutar cuando se aplica
367
         */
368
        public void onlyApply() {
369
                if (RasterPropertiesTocMenuEntry.enableEvents)
370
                        try {
371
                                setValuesFromPanelToFilter();
372
                        } catch (FilterTypeException e) {
373
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
374
                        } catch (FilterAddException e) {
375
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
376
                        }
377
        }
378

    
379
        /**
380
         * Acciones a ejecutar cuando se cancela
381
         */
382
        public void cancel() {
383
                restoreStatus();
384
        }
385

    
386
        /**
387
         * Consulta si el filtro especificado en el par�metro name est� dentro
388
         * de la lista filter.
389
         * @param filter Lista donde se consulta
390
         * @param name Nombre a comprobar si est� en la lista
391
         * @return true si est� en la lista y false si no est�.
392
         */
393
        @SuppressWarnings("unchecked")
394
        private int hasFilter(ArrayList filter, String name) {
395
                for (int i = 0; i < filter.size(); i++) {
396
                        if (((RasterFilter) filter.get(i)).getName().equals(name))
397
                                return i;
398
                }
399
                return -1;
400
        }
401

    
402
        @SuppressWarnings("unchecked")
403
        public void saveStatus() {
404
                panelGroup.getProperties().put("filterStatus", filterList.getStatusCloned());
405

    
406
                ArrayList filterOrder = filterList.getStatusCloned();
407
                int posEnhanced = hasFilter(filterOrder, "enhanced_stretch");
408
                int posTailTrim = hasFilter(filterOrder, "tailTrim");
409
                // Si tiene realce comprobamos el tailtrim
410
                if (posEnhanced != -1) {
411
                        // Si no tiene el tailTrim, insertamos uno antes del realce
412
                        if (posTailTrim == -1) {
413
                                RasterFilter aux = StatisticsListManager.createTailFilter(0, 0, false, null);
414
                                filterOrder.add(posEnhanced, aux);
415
                        }
416
                } else {
417
                        // Si existe un tailTrim lo borramos pq no tiene realce
418
                        if (posTailTrim != -1)
419
                                filterOrder.remove(posTailTrim);
420
                        // Insertamos primero el tailtrim y luego el realce para conservar un orden logico
421
                        filterOrder.add(0, StatisticsListManager.createTailFilter(0, 0, false, null));
422
                        filterOrder.add(1, EnhancementStretchListManager.createEnhancedFilter(null, null, null, false));
423
                }
424

    
425
                // Si no tiene brillo, lo insertamos
426
                if (hasFilter(filterOrder, "brightness") == -1)
427
                        filterOrder.add(BrightnessContrastListManager.createBrightnessFilter(0));
428

    
429
                // Si no tiene el contraste, lo insertamos
430
                if (hasFilter(filterOrder, "contrast") == -1)
431
                        filterOrder.add(BrightnessContrastListManager.createContrastFilter(0));
432

    
433
                panelGroup.getProperties().put("filterOrder", filterOrder);
434
        }
435

    
436
        @SuppressWarnings("unchecked")
437
        public void restoreStatus() {
438
                filterList.setStatus((ArrayList) panelGroup.getProperties().get("filterStatus"));
439

    
440
                if (lyr != null)
441
                        lyr.getMapContext().invalidate();
442
        }
443
        
444
        /*
445
         * (non-Javadoc)
446
         * @see org.gvsig.raster.IProcessActions#end(java.lang.Object)
447
         */
448
        public void end(Object param) {
449
                try {                
450
                        RasterFilterListManager manager = new RasterFilterListManager(filterList);
451
                        EnhancementStretchListManager eManager = (EnhancementStretchListManager) manager.getManagerByClass(EnhancementStretchListManager.class);
452
                        if (ePanel.isTailTrimCheckSelected()) {
453
                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), (double) (ePanel.getTrimValue() / 100D), stats, ((FLyrRasterSE) lyr).isRGB());
454
                                eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
455
                        } else {
456
                                filterList.remove(TailTrimFilter.class);
457
                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), 0, stats, ((FLyrRasterSE) lyr).isRGB());
458
                                eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
459
                        }
460
                        endActionsForFilterSettings();
461
                } catch (FileNotOpenException e) {
462
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
463
                } catch (RasterDriverException e) {
464
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
465
                } catch (FilterTypeException e) {
466
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
467
                }
468
        }
469

    
470
        public void interrupted() {
471
        }
472
}