Statistics
| Revision:

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

History | View | Annotate | Download (16 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
                        bcPanel.setBrightnessValue((double) bFilter.getBrightnessIncrease());
204
                else
205
                        bcPanel.setBrightnessValue(0);
206

    
207
                // CONTRASTE
208
                ContrastFilter cFilter = (ContrastFilter) filterList.getByName(ContrastFilter.names[0]);
209
                if (cFilter != null)
210
                        bcPanel.setContrastValue((double) cFilter.getContrastIncrease());
211
                else
212
                        bcPanel.setContrastValue(0);
213

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

    
219
                // REALCE LINEAL
220
                LinearStretchEnhancementFilter eFilter = (LinearStretchEnhancementFilter) filterList.getByName(LinearStretchEnhancementFilter.names[0]);
221
                if (eFilter != null) {
222
                        ePanel.setControlEnabled(true);
223
                        ePanel.setRemoveEndsActive(eFilter.getRemoveEnds().booleanValue());
224
                        if (eFilter.getTailTrim().doubleValue() != 0) {
225
                                ePanel.setTailTrimCheckActive(true);
226
                                ePanel.setTailTrimValue(eFilter.getTailTrim().doubleValue() * 100);
227
                        } else {
228
                                ePanel.setTailTrimCheckActive(false);
229
                                ePanel.setTailTrimValue(0);
230
                        }
231
                } else {
232
                        ePanel.setControlEnabled(false);
233
                        ePanel.setRemoveEndsActive(false);
234
                        ePanel.setTailTrimCheckActive(false);
235
                        ePanel.setTailTrimValue(0);
236
                }
237
        }
238

    
239
        /**
240
         * Carga los valores del filtro desde el panel
241
         * @throws FilterTypeException
242
         * @throws FilterAddException 
243
         */
244
        private void setValuesFromPanelToFilter() throws FilterTypeException, FilterAddException {
245
                RasterFilterListManager manager = new RasterFilterListManager(filterList);
246

    
247
                // REALCE
248
                EnhancementStretchListManager eManager = (EnhancementStretchListManager) manager.getManagerByClass(EnhancementStretchListManager.class);
249
                if (ePanel.getActive().isSelected()) {
250
                        stats = dataset.getDataSource().getStatistics();
251
                        if (lyr instanceof IRasterRendering)
252
                                renderBands = ((IRasterRendering) lyr).getRender().getRenderBands();
253
                         // En este caso siempre es necesario el m?ximo y m?nimo
254
                        try {
255
                                if(!stats.isCalculated() && lyr instanceof FLyrRasterSE) 
256
                                        StatisticsProcess.launcher((FLyrRasterSE)lyr, this);
257
                                else {
258
                                        if (ePanel.isTailTrimCheckSelected()) {
259
                                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), (double) (ePanel.getTrimValue() / 100D), stats, ((FLyrRasterSE) lyr).isRGB());
260
                                                eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
261
                                        } else {
262
                                                filterList.remove(TailTrimFilter.class);
263
                                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), 0, stats, ((FLyrRasterSE) lyr).isRGB());
264
                                                eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
265
                                        }
266
                                }
267
                        } catch (FileNotOpenException e) {
268
                                throw new FilterAddException("No se han podido calcular estadisticas. Error al a?adir realce;" + e.getMessage());
269
                        } catch (RasterDriverException e) {
270
                                throw new FilterAddException("No se han podido calcular estadisticas. Error al a?adir realce; " + e.getMessage());
271
                        }
272
                } else {
273
                        filterList.remove(LinearStretchEnhancementFilter.class);
274
                        filterList.remove(TailTrimFilter.class);
275
                }
276

    
277
                // BRILLO Y CONTRASTE
278
                BrightnessContrastListManager bcManager = (BrightnessContrastListManager) manager.getManagerByClass(BrightnessContrastListManager.class);
279

    
280
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getBrightnessValue() != 0))
281
                        bcManager.addBrightnessFilter((int) bcPanel.getBrightnessValue());
282
                else
283
                        filterList.remove(BrightnessFilter.class);
284

    
285
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getContrastValue() != 0))
286
                        bcManager.addContrastFilter((int) bcPanel.getContrastValue());
287
                else
288
                        filterList.remove(ContrastFilter.class);
289

    
290
                endActionsForFilterSettings();
291
        }
292
        
293
        /**
294
         * Acciones realizadas al final la aplicaci?n de filtros
295
         * @throws FilterTypeException
296
         */
297
        @SuppressWarnings("unchecked")
298
        private void endActionsForFilterSettings() throws FilterTypeException {
299
                ArrayList listOrder = (ArrayList) panelGroup.getProperties().get("filterOrder");
300
                ArrayList listCopy = filterList.getStatusCloned();
301
                int cont = 0;
302
                for (int i = 0; i < listOrder.size(); i++) {
303
                        int pos = hasFilter(listCopy, ((RasterFilter) listOrder.get(i)).getName());
304
                        if (pos != -1) {
305
                                // Esta pero en posicion equivocada
306
                                if (pos != cont) {
307
                                        Object copy = listCopy.remove(pos);
308
                                        listCopy.add(cont, copy);
309
                                }
310
                                cont++;
311
                        }
312
                }
313
                filterList.setStatus(listCopy);
314
                filterList.controlTypes();
315

    
316
                // Redibujamos
317
                if (lyr != null)
318
                        lyr.getMapContext().invalidate();
319
        }
320

    
321
        /**
322
         * Acciones a ejecutar cuando se acepta
323
         */
324
        public void accept() {
325
                try {
326
                        setValuesFromPanelToFilter();
327
                } catch (FilterTypeException e) {
328
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
329
                } catch (FilterAddException e) {
330
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
331
                }
332
        }
333

    
334
        /**
335
         * Acciones a ejecutar cuando se aplica
336
         */
337
        public void apply() {
338
                onlyApply();
339
                saveStatus();
340
        }
341

    
342
        /**
343
         * Acciones a ejecutar cuando se aplica
344
         */
345
        public void onlyApply() {
346
                if (RasterPropertiesTocMenuEntry.enableEvents)
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 cancela
358
         */
359
        public void cancel() {
360
                restoreStatus();
361
        }
362

    
363
        /**
364
         * Consulta si el filtro especificado en el par?metro name est? dentro
365
         * de la lista filter.
366
         * @param filter Lista donde se consulta
367
         * @param name Nombre a comprobar si est? en la lista
368
         * @return true si est? en la lista y false si no est?.
369
         */
370
        @SuppressWarnings("unchecked")
371
        private int hasFilter(ArrayList filter, String name) {
372
                for (int i = 0; i < filter.size(); i++) {
373
                        if (((RasterFilter) filter.get(i)).getName().equals(name))
374
                                return i;
375
                }
376
                return -1;
377
        }
378

    
379
        @SuppressWarnings("unchecked")
380
        public void saveStatus() {
381
                panelGroup.getProperties().put("filterStatus", filterList.getStatusCloned());
382

    
383
                ArrayList filterOrder = filterList.getStatusCloned();
384
                int posEnhanced = hasFilter(filterOrder, "enhanced_stretch");
385
                int posTailTrim = hasFilter(filterOrder, "tailTrim");
386
                // Si tiene realce comprobamos el tailtrim
387
                if (posEnhanced != -1) {
388
                        // Si no tiene el tailTrim, insertamos uno antes del realce
389
                        if (posTailTrim == -1) {
390
                                RasterFilter aux = StatisticsListManager.createTailFilter(0, 0, false, null);
391
                                filterOrder.add(posEnhanced, aux);
392
                        }
393
                } else {
394
                        // Si existe un tailTrim lo borramos pq no tiene realce
395
                        if (posTailTrim != -1)
396
                                filterOrder.remove(posTailTrim);
397
                        // Insertamos primero el tailtrim y luego el realce para conservar un orden logico
398
                        filterOrder.add(0, StatisticsListManager.createTailFilter(0, 0, false, null));
399
                        filterOrder.add(1, EnhancementStretchListManager.createEnhancedFilter(null, null, null, false));
400
                }
401

    
402
                // Si no tiene brillo, lo insertamos
403
                if (hasFilter(filterOrder, "brightness") == -1)
404
                        filterOrder.add(BrightnessContrastListManager.createBrightnessFilter(0));
405

    
406
                // Si no tiene el contraste, lo insertamos
407
                if (hasFilter(filterOrder, "contrast") == -1)
408
                        filterOrder.add(BrightnessContrastListManager.createContrastFilter(0));
409

    
410
                panelGroup.getProperties().put("filterOrder", filterOrder);
411
        }
412

    
413
        @SuppressWarnings("unchecked")
414
        public void restoreStatus() {
415
                filterList.setStatus((ArrayList) panelGroup.getProperties().get("filterStatus"));
416

    
417
                if (lyr != null)
418
                        lyr.getMapContext().invalidate();
419
        }
420

    
421
        /*
422
         * (non-Javadoc)
423
         * @see org.gvsig.raster.IProcessActions#end(java.lang.Object)
424
         */
425
        public void end(Object param) {
426
                try {                
427
                        RasterFilterListManager manager = new RasterFilterListManager(filterList);
428
                        EnhancementStretchListManager eManager = (EnhancementStretchListManager) manager.getManagerByClass(EnhancementStretchListManager.class);
429
                        if (ePanel.isTailTrimCheckSelected()) {
430
                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), (double) (ePanel.getTrimValue() / 100D), stats, ((FLyrRasterSE) lyr).isRGB());
431
                                eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
432
                        } else {
433
                                filterList.remove(TailTrimFilter.class);
434
                                LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE) lyr).getRenderBands(), 0, stats, ((FLyrRasterSE) lyr).isRGB());
435
                                eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
436
                        }
437
                        endActionsForFilterSettings();
438
                } catch (FileNotOpenException e) {
439
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
440
                } catch (RasterDriverException e) {
441
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
442
                } catch (FilterTypeException e) {
443
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_stats"), this, e);
444
                }
445
        }
446

    
447
        public void interrupted() {
448
        }
449
}