Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / properties / control / EnhancedControl.java @ 1426

History | View | Annotate | Download (17 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.tools.app.basic.tool.properties.control;
23

    
24
import java.awt.event.ActionEvent;
25
import java.awt.event.ActionListener;
26
import java.util.ArrayList;
27
import java.util.List;
28

    
29
import javax.swing.JCheckBox;
30

    
31
import org.gvsig.andami.PluginServices;
32
import org.gvsig.fmap.dal.coverage.datastruct.Params;
33
import org.gvsig.fmap.dal.coverage.exception.FilterAddException;
34
import org.gvsig.fmap.dal.coverage.exception.FilterManagerException;
35
import org.gvsig.fmap.dal.coverage.exception.FilterTypeException;
36
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
37
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
38
import org.gvsig.fmap.dal.coverage.grid.RasterFilterListManager;
39
import org.gvsig.fmap.dal.coverage.grid.filter.LinearStretchParams;
40
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
41
import org.gvsig.gui.beans.panelGroup.AbstractPanelGroup;
42
import org.gvsig.gui.beans.slidertext.listeners.SliderEvent;
43
import org.gvsig.gui.beans.slidertext.listeners.SliderListener;
44
import org.gvsig.raster.fmap.layers.FLyrRaster;
45
import org.gvsig.raster.tools.app.basic.RasterExtension;
46
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
47
import org.gvsig.raster.tools.app.basic.raster.process.IProcessActions;
48
import org.gvsig.raster.tools.app.basic.raster.process.StatisticsProcess;
49
import org.gvsig.raster.tools.app.basic.tool.properties.RasterPropertiesTocMenuEntry;
50
import org.gvsig.raster.tools.app.basic.tool.properties.panel.EnhancedBrightnessContrastPanel;
51
import org.gvsig.raster.tools.app.basic.tool.properties.panel.EnhancedPanel;
52
import org.gvsig.raster.tools.app.basic.tool.properties.panel.EnhancedWithTrimPanel;
53

    
54

    
55
/**
56
 * Clase que hace de interfaz entre los objetos que contienen la informaci?n de
57
 * realce y el panel.
58
 *
59
 * @author Nacho Brodin (nachobrodin@gmail.com)
60
 */
61
public class EnhancedControl implements IProcessActions {
62
        private EnhancedPanel                   tPanel      = null;
63
        private RasterFilterList                filterList  = null;
64
        private EnhancedWithTrimPanel           ePanel      = null;
65
        private EnhancedBrightnessContrastPanel bcPanel     = null;
66
        private FLyrRaster                      lyr         = null;
67
        private AbstractPanelGroup              panelGroup  = null;
68
        private Statistics                      stats       = null;
69
        private int[]                           renderBands = new int[] { 0, 1, 2 };
70

    
71

    
72
        /**
73
         * Manejador de eventos de los slider de brillo y contraste.
74
         * @author Nacho Brodin (nachobrodin@gmail.com)
75
         */
76
        class BrightnessContrastListener implements ActionListener, SliderListener {
77
                JCheckBox active = null;
78
                /**
79
                 * Constructor. Registra los listener
80
                 * @param panel
81
                 */
82
                public BrightnessContrastListener(EnhancedBrightnessContrastPanel panel) {
83
                        panel.addBrightnessValueChangedListener(this);
84
                        panel.addContrastValueChangedListener(this);
85
                        active = panel.getActive();
86
                        active.addActionListener(this);
87
                }
88

    
89
                /*
90
                 * (non-Javadoc)
91
                 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
92
                 */
93
                public void actionPerformed(ActionEvent e) {
94
                        if (!RasterExtension.autoRefreshView)
95
                                return;
96

    
97
                        if (e.getSource() == active)
98
                                onlyApply();
99
                }
100

    
101
                /*
102
                 * (non-Javadoc)
103
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueChanged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
104
                 */
105
                public void actionValueChanged(SliderEvent e) {
106
                        if (!RasterExtension.autoRefreshView)
107
                                return;
108

    
109
                        onlyApply();
110
                }
111

    
112
                /*
113
                 * (non-Javadoc)
114
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueDragged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
115
                 */
116
                public void actionValueDragged(SliderEvent e) {
117
                }
118
        }
119

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

    
140
                /*
141
                 * (non-Javadoc)
142
                 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
143
                 */
144
                public void actionPerformed(ActionEvent e) {
145
                        if (!RasterExtension.autoRefreshView)
146
                                return;
147

    
148
                        onlyApply();
149
                }
150

    
151
                /*
152
                 * (non-Javadoc)
153
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueChanged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
154
                 */
155
                public void actionValueChanged(SliderEvent e) {
156
                        if (!RasterExtension.autoRefreshView)
157
                                return;
158

    
159
                        onlyApply();
160
                }
161

    
162
                /*
163
                 * (non-Javadoc)
164
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueDragged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
165
                 */
166
                public void actionValueDragged(SliderEvent e) {
167
                }
168
        }
169

    
170
        /**
171
         * Constructor
172
         * @param tp
173
         */
174
        public EnhancedControl(AbstractPanelGroup panelGroup, EnhancedPanel tp, FLyrRaster lyr, RasterFilterList rfl) {
175
                this.panelGroup = panelGroup;
176
                this.tPanel = tp;
177
                this.filterList = rfl;
178
                this.lyr = lyr;
179
                this.bcPanel = tPanel.getBrightnessContrastPanel();
180
                this.ePanel = tPanel.getEnhancedWithTrimPanel();
181
                new BrightnessContrastListener(bcPanel);
182
                new EnhancedWithTrimListener(ePanel);
183

    
184
                try {
185
                        saveStatus();
186
                } catch (FilterManagerException e) {
187
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_saving_filters"), this, e);
188
                } catch (FilterTypeException e) {
189
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_saving_filters"), this, e);
190
                }
191

    
192
                setValuesFromFilterToPanel();
193
        }
194

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

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

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

    
221
                // REALCE LINEAL
222
                RasterFilter eFilter = filterList.getByName("enhanced_stretch");
223
                if (eFilter != null) {
224
                        ePanel.setControlEnabled(true);
225

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

    
260
        /**
261
         * Carga los valores del filtro desde el panel
262
         * @throws FilterTypeException
263
         * @throws FilterAddException 
264
         */
265
        private void setValuesFromPanelToFilter() throws FilterTypeException, FilterAddException {
266

    
267
                // REALCE
268
                if (ePanel.getActive().isSelected()) {
269
                        if(lyr != null) {
270
                                stats = lyr.getDataStore().getStatistics();
271
                                renderBands = lyr.getRender().getRenderBands();
272
                                // En este caso siempre es necesario el m?ximo y m?nimo
273
                                try {
274
                                        if(!stats.isCalculated() && lyr instanceof FLyrRaster) 
275
                                                StatisticsProcess.launcher(lyr, this);
276
                                        else {
277
                                                RasterFilterListManager enhancementManager = filterList.getManagerByID("EnhancementStretch");
278
                                                Params params = filterList.createEmptyFilterParams();
279
                                                params.setParam("stats", stats);
280
                                                params.setParam("remove", ePanel.isRemoveEndsSelected());
281
                                                params.setParam("renderBands", renderBands);
282
                                                params.setParam("rgb", lyr.isRGB());
283
                                                
284
                                                if (ePanel.isTailTrimCheckSelected()) {
285
                                                        params.setParam("tailtrim", (double) (ePanel.getTrimValue() / 100D));
286
                                                } else {
287
                                                        params.setParam("tailtrim", 0.0);
288
                                                }
289
                                                
290
                                                enhancementManager.addFilter(params);
291
                                        }
292
                                } catch (FilterManagerException e) {
293
                                        throw new FilterAddException("No se han podido calcular estadisticas. Error al a?adir realce;" + e.getMessage());
294
                                } 
295
                        }
296
                } else {
297
                        filterList.remove("enhanced_stretch");
298
                        filterList.remove("tailTrim");
299
                }
300

    
301
                // BRILLO Y CONTRASTE
302
                try {
303
                        RasterFilterListManager bcManager = filterList.getManagerByID("BrightnessContrast");
304

    
305
                        if (bcPanel.getActive().isSelected() && ((int) bcPanel.getBrightnessValue() != 0)) {
306
                                Params params = filterList.createEmptyFilterParams();
307
                                params.setParam("Brightness", new Integer((int) bcPanel.getBrightnessValue()));
308
                                filterList.add(bcManager.createFilter(params));
309
                        } else
310
                                filterList.remove("brightness");
311

    
312
                        if (bcPanel.getActive().isSelected() && ((int) bcPanel.getContrastValue() != 0)) {
313
                                Params params = filterList.createEmptyFilterParams();
314
                                params.setParam("Contrast", new Integer((int) bcPanel.getContrastValue()));
315
                                filterList.add(bcManager.createFilter(params));
316
                        } else
317
                                filterList.remove("contrast");
318
                } catch (FilterManagerException e) {
319
                        throw new FilterAddException("No se han podido calcular estadisticas. Error al a?adir realce;" + e.getMessage());
320
                }
321

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

    
348
                // Redibujamos
349
                if (lyr != null)
350
                        lyr.getMapContext().invalidate();
351
        }
352

    
353
        /**
354
         * Acciones a ejecutar cuando se acepta
355
         */
356
        public void accept() {
357
                try {
358
                        setValuesFromPanelToFilter();
359
                } catch (FilterTypeException e) {
360
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
361
                } catch (FilterAddException e) {
362
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
363
                }
364
        }
365

    
366
        /**
367
         * Acciones a ejecutar cuando se aplica
368
         */
369
        public void apply() {
370
                onlyApply();
371
                try {
372
                        saveStatus();
373
                } catch (FilterManagerException e) {
374
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_saving_filters"), this, e);
375
                } catch (FilterTypeException e) {
376
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_saving_filters"), this, e);
377
                }
378
        }
379

    
380
        /**
381
         * Acciones a ejecutar cuando se aplica
382
         */
383
        public void onlyApply() {
384
                if (RasterPropertiesTocMenuEntry.enableEvents)
385
                        try {
386
                                setValuesFromPanelToFilter();
387
                        } catch (FilterTypeException e) {
388
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
389
                        } catch (FilterAddException e) {
390
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
391
                        }
392
        }
393

    
394
        /**
395
         * Acciones a ejecutar cuando se cancela
396
         */
397
        public void cancel() {
398
                restoreStatus();
399
        }
400

    
401
        /**
402
         * Consulta si el filtro especificado en el par?metro name est? dentro
403
         * de la lista filter.
404
         * @param filter Lista donde se consulta
405
         * @param name Nombre a comprobar si est? en la lista
406
         * @return true si est? en la lista y false si no est?.
407
         */
408
        private int hasFilter(List<RasterFilter> filter, String name) {
409
                for (int i = 0; i < filter.size(); i++) {
410
                        if (((RasterFilter) filter.get(i)).getName().equals(name))
411
                                return i;
412
                }
413
                return -1;
414
        }
415

    
416
        @SuppressWarnings("unchecked")
417
        public void saveStatus() throws FilterManagerException, FilterTypeException {
418
                panelGroup.getProperties().put("filterStatus", filterList.getStatusCloned());
419

    
420
                List<RasterFilter> filterOrder = filterList.getStatusCloned();
421
                int posEnhanced = hasFilter(filterOrder, "enhanced_stretch");
422
                int posTailTrim = hasFilter(filterOrder, "tailTrim");
423
                
424
                RasterFilterListManager statFilterManager = filterList.getManagerByID("Statistics");
425
                Params params = filterList.createEmptyFilterParams();
426
                params.setParam("stats", null);
427
                params.setParam("tail", new Double(0.0));
428
                params.setParam("samples", new Double(0.0));
429
                params.setParam("remove", new Boolean(false));
430
                RasterFilter filter = statFilterManager.createFilter(params);
431
                
432
                // Si tiene realce comprobamos el tailtrim
433
                if (posEnhanced != -1) {
434
                        // Si no tiene el tailTrim, insertamos uno antes del realce
435
                        if (posTailTrim == -1) {
436
                                filterOrder.add(posEnhanced, filter);
437
                        }
438
                } else {
439
                        // Si existe un tailTrim lo borramos pq no tiene realce
440
                        if (posTailTrim != -1)
441
                                filterOrder.remove(posTailTrim);
442
                        // Insertamos primero el tailtrim y luego el realce para conservar un orden logico
443
                        filterOrder.add(0, filter);
444
                        RasterFilterListManager eManager = filterList.getManagerByID("EnhancementStretch");
445
                        params = filterList.createEmptyFilterParams();
446
                        params.setParam("remove", new Boolean(false));
447
                        eManager.createFilter(params);
448
                }
449

    
450
                RasterFilterListManager bcManager = filterList.getManagerByID("BrightnessContrast");
451
                
452
                // Si no tiene brillo, lo insertamos
453
                if (hasFilter(filterOrder, "brightness") == -1) {
454
                        params = filterList.createEmptyFilterParams();
455
                        params.setParam("Brightness", new Integer(0));
456
                        filterOrder.add(bcManager.createFilter(params));
457
                }
458

    
459
                // Si no tiene el contraste, lo insertamos
460
                if (hasFilter(filterOrder, "contrast") == -1) {
461
                        params = filterList.createEmptyFilterParams();
462
                        params.setParam("Contrast", new Integer(0));
463
                        filterOrder.add(bcManager.createFilter(params));
464
                }
465

    
466
                panelGroup.getProperties().put("filterOrder", filterOrder);
467
        }
468

    
469
        @SuppressWarnings("unchecked")
470
        public void restoreStatus() {
471
                filterList.setStatus((ArrayList) panelGroup.getProperties().get("filterStatus"));
472

    
473
                if (lyr != null)
474
                        lyr.getMapContext().invalidate();
475
        }
476
        
477
        /*
478
         * (non-Javadoc)
479
         * @see org.gvsig.raster.IProcessActions#end(java.lang.Object)
480
         */
481
        public void end(Object param) {
482
                Statistics st = null;
483
                if(param instanceof FLyrRaster && ((FLyrRaster)param).getDataStore() != null) 
484
                        st = ((FLyrRaster)param).getDataStore().getStatistics();
485
                Statistics statistics = (st == null) ? stats : st;
486
                
487
                try {                
488
                        RasterFilterListManager enhancementManager = filterList.getManagerByID("EnhancementStretch");
489
                        Params params = filterList.createEmptyFilterParams();
490
                        params.setParam("stats", statistics);
491
                        params.setParam("remove", ePanel.isRemoveEndsSelected());
492
                        params.setParam("renderBands", renderBands);
493
                        params.setParam("rgb", lyr.isRGB());
494
                        
495
                        if (ePanel.isTailTrimCheckSelected()) {
496
                                params.setParam("tailtrim", (double) (ePanel.getTrimValue() / 100D));
497
                        } else {
498
                                filterList.remove("tailTrim");
499
                                params.setParam("tailtrim", 0.0);
500
                        }
501
                        
502
                        enhancementManager.addFilter(params);
503
                        endActionsForFilterSettings();
504
                } catch (FilterManagerException e) {
505
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
506
                } catch (FilterTypeException e) {
507
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
508
                }
509
        }
510

    
511
        public void interrupted() {
512
        }
513
}