Statistics
| Revision:

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

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.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.grid.filter.FilterAddException;
35
import org.gvsig.raster.grid.filter.FilterTypeException;
36
import org.gvsig.raster.grid.filter.RasterFilter;
37
import org.gvsig.raster.grid.filter.RasterFilterList;
38
import org.gvsig.raster.grid.filter.RasterFilterListManager;
39
import org.gvsig.raster.grid.filter.enhancement.BrightnessContrastListManager;
40
import org.gvsig.raster.grid.filter.enhancement.BrightnessFilter;
41
import org.gvsig.raster.grid.filter.enhancement.ContrastFilter;
42
import org.gvsig.raster.grid.filter.enhancement.EnhancementStretchListManager;
43
import org.gvsig.raster.grid.filter.enhancement.LinearStretchEnhancementFilter;
44
import org.gvsig.raster.grid.filter.enhancement.LinearStretchParams;
45
import org.gvsig.raster.grid.filter.statistics.StatisticsListManager;
46
import org.gvsig.raster.grid.filter.statistics.TailTrimFilter;
47
import org.gvsig.raster.hierarchy.IRasterDataset;
48
import org.gvsig.raster.hierarchy.IRasterRendering;
49
import org.gvsig.raster.hierarchy.IStatistics;
50
import org.gvsig.raster.util.RasterToolsUtil;
51
import org.gvsig.rastertools.RasterModule;
52
import org.gvsig.rastertools.properties.RasterPropertiesTocMenuEntry;
53
import org.gvsig.rastertools.properties.panels.EnhancedBrightnessContrastPanel;
54
import org.gvsig.rastertools.properties.panels.EnhancedPanel;
55
import org.gvsig.rastertools.properties.panels.EnhancedWithTrimPanel;
56
import org.gvsig.rastertools.statistics.StatisticsProcess;
57

    
58
import com.iver.andami.PluginServices;
59
import com.iver.cit.gvsig.fmap.layers.FLayer;
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
         * Manejador de eventos de los slider de brillo y contraste.
80
         * @author Nacho Brodin (nachobrodin@gmail.com)
81
         */
82
        class BrightnessContrastListener implements ActionListener, SliderListener {
83
                JCheckBox active = null;
84
                /**
85
                 * Constructor. Registra los listener
86
                 * @param panel
87
                 */
88
                public BrightnessContrastListener(EnhancedBrightnessContrastPanel panel) {
89
                        panel.addBrightnessValueChangedListener(this);
90
                        panel.addContrastValueChangedListener(this);
91
                        active = panel.getActive();
92
                        active.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
                        if (!RasterModule.autoRefreshView)
101
                                return;
102

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

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

    
115
                        onlyApply();
116
                }
117

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

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

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

    
154
                        onlyApply();
155
                }
156

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

    
165
                        onlyApply();
166
                }
167

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

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

    
191
                saveStatus();
192

    
193
                setValuesFromFilterToPanel();
194
        }
195

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
439
                if (lyr != null)
440
                        lyr.getMapContext().invalidate();
441
        }
442

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

    
469
        public void interrupted() {
470
        }
471
}