Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / properties / control / EnhancedControl.java @ 30081

History | View | Annotate | Download (17.1 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.fmap.raster.layers.FLyrRasterSE;
28
import org.gvsig.gui.beans.panelGroup.AbstractPanelGroup;
29
import org.gvsig.gui.beans.slidertext.listeners.SliderEvent;
30
import org.gvsig.gui.beans.slidertext.listeners.SliderListener;
31
import org.gvsig.raster.IProcessActions;
32
import org.gvsig.raster.dataset.FileNotOpenException;
33
import org.gvsig.raster.dataset.io.RasterDriverException;
34
import org.gvsig.raster.dataset.properties.DatasetListStatistics;
35
import org.gvsig.raster.grid.filter.FilterAddException;
36
import org.gvsig.raster.grid.filter.FilterTypeException;
37
import org.gvsig.raster.grid.filter.RasterFilter;
38
import org.gvsig.raster.grid.filter.RasterFilterList;
39
import org.gvsig.raster.grid.filter.RasterFilterListManager;
40
import org.gvsig.raster.grid.filter.enhancement.BrightnessContrastListManager;
41
import org.gvsig.raster.grid.filter.enhancement.BrightnessFilter;
42
import org.gvsig.raster.grid.filter.enhancement.ContrastFilter;
43
import org.gvsig.raster.grid.filter.enhancement.EnhancementStretchListManager;
44
import org.gvsig.raster.grid.filter.enhancement.LinearStretchEnhancementFilter;
45
import org.gvsig.raster.grid.filter.enhancement.LinearStretchParams;
46
import org.gvsig.raster.grid.filter.statistics.StatisticsListManager;
47
import org.gvsig.raster.grid.filter.statistics.TailTrimFilter;
48
import org.gvsig.raster.hierarchy.IRasterDataset;
49
import org.gvsig.raster.hierarchy.IRasterRendering;
50
import org.gvsig.raster.hierarchy.IStatistics;
51
import org.gvsig.raster.util.RasterToolsUtil;
52
import org.gvsig.rastertools.RasterModule;
53
import org.gvsig.rastertools.properties.RasterPropertiesTocMenuEntry;
54
import org.gvsig.rastertools.properties.panels.EnhancedBrightnessContrastPanel;
55
import org.gvsig.rastertools.properties.panels.EnhancedPanel;
56
import org.gvsig.rastertools.properties.panels.EnhancedWithTrimPanel;
57
import org.gvsig.rastertools.statistics.StatisticsProcess;
58

    
59
import com.iver.andami.PluginServices;
60
import com.iver.cit.gvsig.fmap.layers.FLayer;
61

    
62
/**
63
 * Clase que hace de interfaz entre los objetos que contienen la informaci?n de
64
 * realce y el panel.
65
 *
66
 * @author Nacho Brodin (nachobrodin@gmail.com)
67
 */
68
public class EnhancedControl implements IProcessActions {
69
        private EnhancedPanel                   tPanel      = null;
70
        private RasterFilterList                filterList  = null;
71
        private EnhancedWithTrimPanel           ePanel      = null;
72
        private EnhancedBrightnessContrastPanel bcPanel     = null;
73
        private IRasterDataset                  dataset     = null;
74
        private FLayer                          lyr         = null;
75
        private AbstractPanelGroup              panelGroup  = null;
76
        private IStatistics                     stats       = null;
77
        private int[]                           renderBands = new int[] { 0, 1, 2 };
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
                        if(dataset != null && dataset.getDataSource() != null) {
274
                                stats = dataset.getDataSource().getStatistics();
275
                                if (lyr instanceof IRasterRendering)
276
                                        renderBands = ((IRasterRendering) lyr).getRender().getRenderBands();
277
                                // En este caso siempre es necesario el m?ximo y m?nimo
278
                                try {
279
                                        if(!stats.isCalculated() && lyr instanceof FLyrRasterSE) 
280
                                                StatisticsProcess.launcher((FLyrRasterSE)lyr, this);
281
                                        else {
282
                                                if (ePanel.isTailTrimCheckSelected()) {
283
                                                        LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), (double) (ePanel.getTrimValue() / 100D), stats, ((FLyrRasterSE) lyr).isRGB());
284
                                                        eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
285
                                                } else {
286
                                                        filterList.remove(TailTrimFilter.class);
287
                                                        LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), 0, stats, ((FLyrRasterSE) lyr).isRGB());
288
                                                        eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
289
                                                }
290
                                        }
291
                                } catch (FileNotOpenException e) {
292
                                        throw new FilterAddException("No se han podido calcular estadisticas. Error al a?adir realce;" + e.getMessage());
293
                                } catch (RasterDriverException e) {
294
                                        throw new FilterAddException("No se han podido calcular estadisticas. Error al a?adir realce; " + e.getMessage());
295
                                }
296
                        }
297
                } else {
298
                        filterList.remove(LinearStretchEnhancementFilter.class);
299
                        filterList.remove(TailTrimFilter.class);
300
                }
301

    
302
                // BRILLO Y CONTRASTE
303
                BrightnessContrastListManager bcManager = (BrightnessContrastListManager) manager.getManagerByClass(BrightnessContrastListManager.class);
304

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

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

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

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

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

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

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

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

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

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

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

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

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

    
435
                panelGroup.getProperties().put("filterOrder", filterOrder);
436
        }
437

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

    
442
                if (lyr != null)
443
                        lyr.getMapContext().invalidate();
444
        }
445

    
446
        /*
447
         * (non-Javadoc)
448
         * @see org.gvsig.raster.IProcessActions#end(java.lang.Object)
449
         */
450
        public void end(Object param) {
451
                DatasetListStatistics st = null;
452
                if(param instanceof FLyrRasterSE && ((FLyrRasterSE)param).getDataSource() != null) 
453
                        st = ((FLyrRasterSE)param).getDataSource().getStatistics();
454
                IStatistics statistics = (st == null) ? stats : st;
455
                
456
                try {                
457
                        RasterFilterListManager manager = new RasterFilterListManager(filterList);
458
                        EnhancementStretchListManager eManager = (EnhancementStretchListManager) manager.getManagerByClass(EnhancementStretchListManager.class);
459
                        if (ePanel.isTailTrimCheckSelected()) {
460
                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), (double) (ePanel.getTrimValue() / 100D), statistics, ((FLyrRasterSE) lyr).isRGB());
461
                                eManager.addEnhancedStretchFilter(leParams, statistics, renderBands, ePanel.isRemoveEndsSelected());
462
                        } else {
463
                                filterList.remove(TailTrimFilter.class);
464
                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), 0, statistics, ((FLyrRasterSE) lyr).isRGB());
465
                                eManager.addEnhancedStretchFilter(leParams, statistics, renderBands, ePanel.isRemoveEndsSelected());
466
                        }
467
                        endActionsForFilterSettings();
468
                } catch (FileNotOpenException e) {
469
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
470
                } catch (RasterDriverException e) {
471
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
472
                } catch (FilterTypeException e) {
473
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
474
                }
475
        }
476

    
477
        public void interrupted() {
478
        }
479
}