Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extRasterTools-SE / src / org / gvsig / rastertools / properties / control / EnhancedControl.java @ 28502

History | View | Annotate | Download (13.9 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.mapcontext.layers.FLayer;
28
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
29
import org.gvsig.gui.beans.panelGroup.AbstractPanelGroup;
30
import org.gvsig.gui.beans.slidertext.listeners.SliderEvent;
31
import org.gvsig.gui.beans.slidertext.listeners.SliderListener;
32
import org.gvsig.raster.dataset.FileNotOpenException;
33
import org.gvsig.raster.dataset.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

    
57
import com.iver.andami.PluginServices;
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
                        ePanel.setRemoveEndsActive(eFilter.getRemoveEnds().booleanValue());
221
                        if (eFilter.getTailTrim().doubleValue() != 0) {
222
                                ePanel.setTailTrimCheckActive(true);
223
                                ePanel.setTailTrimValue(eFilter.getTailTrim().doubleValue() * 100);
224
                        } else {
225
                                ePanel.setTailTrimCheckActive(false);
226
                                ePanel.setTailTrimValue(0);
227
                        }
228
                } else {
229
                        ePanel.setControlEnabled(false);
230
                        ePanel.setRemoveEndsActive(false);
231
                        ePanel.setTailTrimCheckActive(false);
232
                        ePanel.setTailTrimValue(0);
233
                }
234
        }
235

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

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

    
271
                // BRILLO Y CONTRASTE
272
                BrightnessContrastListManager bcManager = (BrightnessContrastListManager) manager.getManagerByClass(BrightnessContrastListManager.class);
273

    
274
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getBrightnessValue() != 0))
275
                        bcManager.addBrightnessFilter((int) bcPanel.getBrightnessValue());
276
                else
277
                        filterList.remove(BrightnessFilter.class);
278

    
279
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getContrastValue() != 0))
280
                        bcManager.addContrastFilter((int) bcPanel.getContrastValue());
281
                else
282
                        filterList.remove(ContrastFilter.class);
283

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

    
301
                // Redibujamos
302
                if (lyr != null)
303
                        lyr.getMapContext().invalidate();
304
        }
305

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

    
319
        /**
320
         * Acciones a ejecutar cuando se aplica
321
         */
322
        public void apply() {
323
                onlyApply();
324
                saveStatus();
325
        }
326

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

    
341
        /**
342
         * Acciones a ejecutar cuando se cancela
343
         */
344
        public void cancel() {
345
                restoreStatus();
346
        }
347

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

    
363
        public void saveStatus() {
364
                panelGroup.getProperties().put("filterStatus", filterList.getStatusCloned());
365

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

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

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

    
393
                panelGroup.getProperties().put("filterOrder", filterOrder);
394
        }
395

    
396
        public void restoreStatus() {
397
                filterList.setStatus((ArrayList) panelGroup.getProperties().get("filterStatus"));
398

    
399
                if (lyr != null)
400
                        lyr.getMapContext().invalidate();
401
        }
402
}