Statistics
| Revision:

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

History | View | Annotate | Download (14 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.dataset.FileNotOpenException;
32
import org.gvsig.raster.dataset.io.RasterDriverException;
33
import org.gvsig.raster.grid.filter.FilterAddException;
34
import org.gvsig.raster.grid.filter.FilterTypeException;
35
import org.gvsig.raster.grid.filter.RasterFilter;
36
import org.gvsig.raster.grid.filter.RasterFilterList;
37
import org.gvsig.raster.grid.filter.RasterFilterListManager;
38
import org.gvsig.raster.grid.filter.enhancement.BrightnessContrastListManager;
39
import org.gvsig.raster.grid.filter.enhancement.BrightnessFilter;
40
import org.gvsig.raster.grid.filter.enhancement.ContrastFilter;
41
import org.gvsig.raster.grid.filter.enhancement.EnhancementStretchListManager;
42
import org.gvsig.raster.grid.filter.enhancement.LinearStretchEnhancementFilter;
43
import org.gvsig.raster.grid.filter.enhancement.LinearStretchParams;
44
import org.gvsig.raster.grid.filter.statistics.StatisticsListManager;
45
import org.gvsig.raster.grid.filter.statistics.TailTrimFilter;
46
import org.gvsig.raster.gui.properties.dialog.RasterPropertiesTocMenuEntry;
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.panels.EnhancedBrightnessContrastPanel;
53
import org.gvsig.rastertools.properties.panels.EnhancedPanel;
54
import org.gvsig.rastertools.properties.panels.EnhancedWithTrimPanel;
55

    
56
import com.iver.andami.PluginServices;
57
import com.iver.cit.gvsig.fmap.layers.FLayer;
58

    
59
/**
60
 * Clase que hace de interfaz entre los objetos que contienen la informaci?n de
61
 * realce y el panel.
62
 *
63
 * @author Nacho Brodin (nachobrodin@gmail.com)
64
 */
65
public class EnhancedControl {
66
        private EnhancedPanel                   tPanel     = null;
67
        private RasterFilterList                filterList = null;
68
        private EnhancedWithTrimPanel           ePanel     = null;
69
        private EnhancedBrightnessContrastPanel bcPanel    = null;
70
        private IRasterDataset                  dataset    = null;
71
        private FLayer                          lyr        = null;
72
        private AbstractPanelGroup              panelGroup = null;
73

    
74

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

    
92
                /*
93
                 * (non-Javadoc)
94
                 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
95
                 */
96
                public void actionPerformed(ActionEvent e) {
97
                        if (!RasterModule.autoRefreshView)
98
                                return;
99

    
100
                        if (e.getSource() == active)
101
                                onlyApply();
102
                }
103

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

    
112
                        onlyApply();
113
                }
114

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

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

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

    
151
                        onlyApply();
152
                }
153

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

    
162
                        onlyApply();
163
                }
164

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

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

    
188
                saveStatus();
189

    
190
                setValuesFromFilterToPanel();
191
        }
192

    
193
        /**
194
         * Carga los valores del panel desde el filtro
195
         */
196
        private void setValuesFromFilterToPanel() {
197
                // BRILLO
198
                BrightnessFilter bFilter = (BrightnessFilter) filterList.getByName(BrightnessFilter.names[0]);
199
                if (bFilter != null)
200
                        bcPanel.setBrightnessValue((double) bFilter.getBrightnessIncrease());
201
                else
202
                        bcPanel.setBrightnessValue(0);
203

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

    
211
                if (bFilter != null || cFilter != null)
212
                        bcPanel.setControlEnabled(true);
213
                else
214
                        bcPanel.setControlEnabled(false);
215

    
216
                // REALCE LINEAL
217
                LinearStretchEnhancementFilter eFilter = (LinearStretchEnhancementFilter) filterList.getByName(LinearStretchEnhancementFilter.names[0]);
218
                if (eFilter != null) {
219
                        ePanel.setControlEnabled(true);
220
                        if (eFilter.getRemoveEnds().booleanValue())
221
                                ePanel.setRemoveEndsActive(true);
222
                        else
223
                                ePanel.setRemoveEndsActive(false);
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
                        IStatistics stats = dataset.getDataSource().getStatistics();
251
                        int[] renderBands = new int[] { 0, 1, 2 };
252
                        if (lyr instanceof IRasterRendering)
253
                                renderBands = ((IRasterRendering) lyr).getRender().getRenderBands();
254
                         // En este caso siempre es necesario el m?ximo y m?nimo
255
                        try {
256
                                if (!ePanel.isTailTrimCheckSelected() || ePanel.getTrimValue() == 0) {
257
                                        filterList.remove(TailTrimFilter.class);
258
                                        LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE)lyr).getBandCount(), 0, stats, ((FLyrRasterSE)lyr).getDataType()[0]);
259
                                        eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
260
                                } else {
261
                                        LinearStretchParams leParams = LinearStretchParams.createStandardParam(((FLyrRasterSE)lyr).getBandCount(), (double) (ePanel.getTrimValue() / 100D), stats, ((FLyrRasterSE)lyr).getDataType()[0]);
262
                                        eManager.addEnhancedStretchFilter(leParams, stats, renderBands, ePanel.isRemoveEndsSelected());
263
                                }
264
                        } catch (FileNotOpenException e) {
265
                                throw new FilterAddException("No se han podido calcular estadisticas. Error al a?adir realce.");
266
                        } catch (RasterDriverException e) {
267
                                throw new FilterAddException("No se han podido calcular estadisticas. Error al a?adir realce.");
268
                        }
269
                } else {
270
                        filterList.remove(LinearStretchEnhancementFilter.class);
271
                        filterList.remove(TailTrimFilter.class);
272
                }
273

    
274
                // BRILLO Y CONTRASTE
275
                BrightnessContrastListManager bcManager = (BrightnessContrastListManager) manager.getManagerByClass(BrightnessContrastListManager.class);
276

    
277
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getBrightnessValue() != 0))
278
                        bcManager.addBrightnessFilter((int) bcPanel.getBrightnessValue());
279
                else
280
                        filterList.remove(BrightnessFilter.class);
281

    
282
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getContrastValue() != 0))
283
                        bcManager.addContrastFilter((int) bcPanel.getContrastValue());
284
                else
285
                        filterList.remove(ContrastFilter.class);
286

    
287
                ArrayList listOrder = (ArrayList) panelGroup.getProperties().get("filterOrder");
288
                ArrayList listCopy = filterList.getStatusCloned();
289
                int cont = 0;
290
                for (int i = 0; i < listOrder.size(); i++) {
291
                        int pos = hasFilter(listCopy, ((RasterFilter) listOrder.get(i)).getName());
292
                        if (pos != -1) {
293
                                // Esta pero en posicion equivocada
294
                                if (pos != cont) {
295
                                        Object copy = listCopy.remove(pos);
296
                                        listCopy.add(cont, copy);
297
                                }
298
                                cont++;
299
                        }
300
                }
301
                filterList.setStatus(listCopy);
302
                filterList.controlTypes();
303

    
304
                // Redibujamos
305
                if (lyr != null)
306
                        lyr.getMapContext().invalidate();
307
        }
308

    
309
        /**
310
         * Acciones a ejecutar cuando se acepta
311
         */
312
        public void accept() {
313
                try {
314
                        setValuesFromPanelToFilter();
315
                } catch (FilterTypeException e) {
316
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
317
                } catch (FilterAddException e) {
318
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
319
                }
320
        }
321

    
322
        /**
323
         * Acciones a ejecutar cuando se aplica
324
         */
325
        public void apply() {
326
                onlyApply();
327
                saveStatus();
328
        }
329

    
330
        /**
331
         * Acciones a ejecutar cuando se aplica
332
         */
333
        public void onlyApply() {
334
                if (RasterPropertiesTocMenuEntry.enableEvents)
335
                        try {
336
                                setValuesFromPanelToFilter();
337
                        } catch (FilterTypeException e) {
338
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
339
                        } catch (FilterAddException e) {
340
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
341
                        }
342
        }
343

    
344
        /**
345
         * Acciones a ejecutar cuando se cancela
346
         */
347
        public void cancel() {
348
                restoreStatus();
349
        }
350

    
351
        /**
352
         * Consulta si el filtro especificado en el par?metro name est? dentro
353
         * de la lista filter.
354
         * @param filter Lista donde se consulta
355
         * @param name Nombre a comprobar si est? en la lista
356
         * @return true si est? en la lista y false si no est?.
357
         */
358
        private int hasFilter(ArrayList filter, String name) {
359
                for (int i = 0; i < filter.size(); i++) {
360
                        if (((RasterFilter) filter.get(i)).getName().equals(name))
361
                                return i;
362
                }
363
                return -1;
364
        }
365

    
366
        public void saveStatus() {
367
                panelGroup.getProperties().put("filterStatus", filterList.getStatusCloned());
368

    
369
                ArrayList filterOrder = filterList.getStatusCloned();
370
                int posEnhanced = hasFilter(filterOrder, "enhanced_stretch");
371
                int posTailTrim = hasFilter(filterOrder, "tailTrim");
372
                // Si tiene realce comprobamos el tailtrim
373
                if (posEnhanced != -1) {
374
                        // Si no tiene el tailTrim, insertamos uno antes del realce
375
                        if (posTailTrim == -1) {
376
                                RasterFilter aux = StatisticsListManager.createTailFilter(0, 0, false, null);
377
                                filterOrder.add(posEnhanced, aux);
378
                        }
379
                } else {
380
                        // Si existe un tailTrim lo borramos pq no tiene realce
381
                        if (posTailTrim != -1)
382
                                filterOrder.remove(posTailTrim);
383
                        // Insertamos primero el tailtrim y luego el realce para conservar un orden logico
384
                        filterOrder.add(0, StatisticsListManager.createTailFilter(0, 0, false, null));
385
                        filterOrder.add(1, EnhancementStretchListManager.createEnhancedFilter(null, null, null, false));
386
                }
387

    
388
                // Si no tiene brillo, lo insertamos
389
                if (hasFilter(filterOrder, "brightness") == -1)
390
                        filterOrder.add(BrightnessContrastListManager.createBrightnessFilter(0));
391

    
392
                // Si no tiene el contraste, lo insertamos
393
                if (hasFilter(filterOrder, "contrast") == -1)
394
                        filterOrder.add(BrightnessContrastListManager.createContrastFilter(0));
395

    
396
                panelGroup.getProperties().put("filterOrder", filterOrder);
397
        }
398

    
399
        public void restoreStatus() {
400
                filterList.setStatus((ArrayList) panelGroup.getProperties().get("filterStatus"));
401

    
402
                if (lyr != null)
403
                        lyr.getMapContext().invalidate();
404
        }
405
}