Statistics
| Revision:

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

History | View | Annotate | Download (11.6 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.gui.beans.slidertext.listeners.SliderEvent;
28
import org.gvsig.gui.beans.slidertext.listeners.SliderListener;
29
import org.gvsig.raster.dataset.IStatistics;
30
import org.gvsig.raster.grid.filter.RasterFilter;
31
import org.gvsig.raster.grid.filter.RasterFilterList;
32
import org.gvsig.raster.grid.filter.RasterFilterListManager;
33
import org.gvsig.raster.grid.filter.enhancement.BrightnessContrastListManager;
34
import org.gvsig.raster.grid.filter.enhancement.BrightnessFilter;
35
import org.gvsig.raster.grid.filter.enhancement.ContrastFilter;
36
import org.gvsig.raster.grid.filter.enhancement.EnhancementListManager;
37
import org.gvsig.raster.grid.filter.enhancement.LinearEnhancementFilter;
38
import org.gvsig.raster.grid.filter.statistics.StatisticsListManager;
39
import org.gvsig.raster.grid.filter.statistics.TailTrimFilter;
40
import org.gvsig.raster.shared.IRasterDataset;
41
import org.gvsig.raster.shared.IRasterRendering;
42
import org.gvsig.rastertools.properties.dialog.RasterPropertiesTocMenuEntry;
43
import org.gvsig.rastertools.properties.dialog.RegistrableTabPanel;
44
import org.gvsig.rastertools.properties.panels.EnhancedBrightnessContrastPanel;
45
import org.gvsig.rastertools.properties.panels.EnhancedPanel;
46
import org.gvsig.rastertools.properties.panels.EnhancedWithTrimPanel;
47

    
48
import com.iver.cit.gvsig.fmap.layers.FLayer;
49
/**
50
 * Clase que hace de interfaz entre los objetos que contienen la informaci?n de 
51
 * realce y el panel. 
52
 *  
53
 * @author Nacho Brodin (nachobrodin@gmail.com)
54
 */
55
public class EnhancedControl {
56
        private EnhancedPanel                   tPanel     = null;
57
        private RasterFilterList                filterList = null;
58
        private EnhancedWithTrimPanel           ePanel     = null;
59
        private EnhancedBrightnessContrastPanel bcPanel    = null;
60
        private IRasterDataset                  dataset    = null;
61
        private FLayer                          lyr        = null;
62

    
63
        /**
64
         * Manejador de eventos de los slider de brillo y contraste.
65
         * @author Nacho Brodin (nachobrodin@gmail.com)
66
         */
67
        class BrightnessContrastListener implements ActionListener, SliderListener {
68
                JCheckBox active = null;
69
                /**
70
                 * Constructor. Registra los listener
71
                 * @param panel
72
                 */
73
                public BrightnessContrastListener(EnhancedBrightnessContrastPanel panel) {
74
                        panel.addBrightnessValueChangedListener(this);
75
                        panel.addContrastValueChangedListener(this);
76
                        active = panel.getActive();
77
                        active.addActionListener(this);
78
                }
79

    
80
                /*
81
                 * (non-Javadoc)
82
                 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
83
                 */
84
                public void actionPerformed(ActionEvent e) {
85
                        if (e.getSource() == active)
86
                                onlyApply();
87
                }
88

    
89
                /*
90
                 * (non-Javadoc)
91
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueChanged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
92
                 */
93
                public void actionValueChanged(SliderEvent e) {
94
                        onlyApply();
95
                }
96

    
97
                /*
98
                 * (non-Javadoc)
99
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueDragged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
100
                 */
101
                public void actionValueDragged(SliderEvent e) {
102
                }
103
        }
104

    
105
        /**
106
         * Manejador de eventos del panel EnhancedWithTrim.
107
         *
108
         * @version 14/06/2007
109
         * @author Borja S?nchez Zamorano (borja.sanchez@iver.es)
110
         */
111
        class EnhancedWithTrimListener implements ActionListener, SliderListener {
112
                JCheckBox active = null;
113
                /**
114
                 * Constructor. Registra los listener
115
                 * @param panel
116
                 */
117
                public EnhancedWithTrimListener(EnhancedWithTrimPanel panel) {
118
                        active = panel.getActive();
119
                        active.addActionListener(this);
120
                        panel.getTrimPanel().getRemoveCheck().addActionListener(this);
121
                        panel.getTrimPanel().getTrimCheck().addActionListener(this);
122
                        panel.getTrimPanel().getTrimSlider().addValueChangedListener(this);
123
                }
124

    
125
                /*
126
                 * (non-Javadoc)
127
                 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
128
                 */
129
                public void actionPerformed(ActionEvent e) {
130
                        onlyApply();
131
                }
132

    
133
                /*
134
                 * (non-Javadoc)
135
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueChanged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
136
                 */
137
                public void actionValueChanged(SliderEvent e) {
138
                        onlyApply();
139
                }
140

    
141
                /*
142
                 * (non-Javadoc)
143
                 * @see org.gvsig.gui.beans.slidertext.listeners.SliderListener#actionValueDragged(org.gvsig.gui.beans.slidertext.listeners.SliderEvent)
144
                 */
145
                public void actionValueDragged(SliderEvent e) {
146
                }
147
        }
148

    
149
        /**
150
         * Constructor
151
         * @param tp
152
         */
153
        public EnhancedControl(EnhancedPanel tp, IRasterDataset dataset, FLayer lyr, RasterFilterList rfl) {
154
                this.tPanel = tp;
155
                this.dataset = dataset;
156
                this.filterList = rfl;
157
                this.lyr = lyr;
158
                this.bcPanel = tPanel.getBrightnessContrastPanel();
159
                this.ePanel = tPanel.getEnhancedWithTrimPanel();
160
                new BrightnessContrastListener(bcPanel);
161
                new EnhancedWithTrimListener(ePanel);
162

    
163
                saveStatus();
164

    
165
                setValuesFromFilterToPanel();
166
        }
167

    
168
        /**
169
         * Carga los valores del panel desde el filtro
170
         */
171
        private void setValuesFromFilterToPanel() {
172
                // BRILLO
173
                BrightnessFilter bFilter = (BrightnessFilter) filterList.getByName(BrightnessFilter.names[0]);
174
                if (bFilter != null)
175
                        bcPanel.setBrightnessValue((double) bFilter.getBrightnessIncrease());
176
                else
177
                        bcPanel.setBrightnessValue(0);
178

    
179
                // CONTRASTE
180
                ContrastFilter cFilter = (ContrastFilter) filterList.getByName(ContrastFilter.names[0]);
181
                if (cFilter != null)
182
                        bcPanel.setContrastValue((double) cFilter.getContrastIncrease());
183
                else
184
                        bcPanel.setContrastValue(0);
185

    
186
                if (bFilter != null || cFilter != null)
187
                        bcPanel.setControlEnabled(true);
188
                else
189
                        bcPanel.setControlEnabled(false);
190

    
191
                // REALCE LINEAL
192
                LinearEnhancementFilter eFilter = (LinearEnhancementFilter) filterList.getByName(LinearEnhancementFilter.names[0]);
193
                if (eFilter != null) {
194
                        ePanel.setControlEnabled(true);
195
                        if (eFilter.getRemoveEnds().booleanValue())
196
                                ePanel.setRemoveEndsActive(true);
197
                        else
198
                                ePanel.setRemoveEndsActive(false);
199
                        if (eFilter.getTailTrim().doubleValue() != 0) {
200
                                ePanel.setTailTrimCheckActive(true);
201
                                ePanel.setTailTrimValue(eFilter.getTailTrim().doubleValue() * 100);
202
                        } else {
203
                                ePanel.setTailTrimCheckActive(false);
204
                                ePanel.setTailTrimValue(0);
205
                        }
206
                } else {
207
                        ePanel.setControlEnabled(false);
208
                        ePanel.setRemoveEndsActive(false);
209
                        ePanel.setTailTrimCheckActive(false);
210
                        ePanel.setTailTrimValue(0);
211
                }
212
        }
213

    
214
        /**
215
         * Carga los valores del filtro desde el panel
216
         */
217
        private void setValuesFromPanelToFilter() {
218
                RasterFilterListManager manager = new RasterFilterListManager(filterList);
219

    
220
                // REALCE
221
                EnhancementListManager eManager = (EnhancementListManager) manager.getManagerByClass(EnhancementListManager.class);
222
                if (ePanel.getActive().isSelected()) {
223
                        IStatistics stats = dataset.getGeoRasterMultiDataset().getStatistics();
224
                        int[] renderBands = new int[] { 0, 1, 2 };
225
                        if (lyr instanceof IRasterRendering)
226
                                renderBands = ((IRasterRendering) lyr).getRender().getRenderBands();
227
                         // En este caso siempre es necesario el m?ximo y m?nimo
228
                        if (!ePanel.isTailTrimCheckSelected() || ePanel.getTrimValue() == 0) {
229
                                filterList.remove(TailTrimFilter.class);
230
                                eManager.addEnhancedFilter(ePanel.isRemoveEndsSelected(), stats, 0, renderBands);
231
                        } else
232
                                eManager.addEnhancedFilter(ePanel.isRemoveEndsSelected(), stats, (double) (ePanel.getTrimValue() / 100D), renderBands);
233
                } else {
234
                        filterList.remove(LinearEnhancementFilter.class);
235
                        filterList.remove(TailTrimFilter.class);
236
                }
237

    
238
                // BRILLO Y CONTRASTE
239
                BrightnessContrastListManager bcManager = (BrightnessContrastListManager) manager.getManagerByClass(BrightnessContrastListManager.class);
240

    
241
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getBrightnessValue() != 0))
242
                        bcManager.addBrightnessFilter((int) bcPanel.getBrightnessValue());
243
                else
244
                        filterList.remove(BrightnessFilter.class);
245

    
246
                if (bcPanel.getActive().isSelected() && ((int) bcPanel.getContrastValue() != 0))
247
                        bcManager.addContrastFilter((int) bcPanel.getContrastValue());
248
                else
249
                        filterList.remove(ContrastFilter.class);
250

    
251

    
252
                ArrayList listOrder = (ArrayList) RegistrableTabPanel.initialProperties.get("filterOrder");
253
                ArrayList listCopy = filterList.getStatusCloned();
254
                int cont = 0;
255
                for (int i=0; i<listOrder.size(); i++) {
256
                        int pos = hasFilter(listCopy, ((RasterFilter) listOrder.get(i)).getName());
257
                        if (pos != -1) {
258
                                // Esta pero en posicion equivocada
259
                                if (pos != cont) {
260
                                        Object copy = listCopy.remove(pos);
261
                                        listCopy.add(cont, copy);
262
                                }
263
                                cont++;
264
                        }
265
                }
266
                filterList.setStatus(listCopy);
267
                filterList.controlTypes();
268

    
269
                // Redibujamos
270
                if (lyr != null)
271
                        lyr.getMapContext().invalidate();
272
        }
273

    
274
        /**
275
         * Acciones a ejecutar cuando se acepta
276
         */
277
        public void accept() {
278
                setValuesFromPanelToFilter();
279
        }
280

    
281
        /**
282
         * Acciones a ejecutar cuando se aplica
283
         */
284
        public void apply() {
285
                onlyApply();
286
                saveStatus();
287
        }
288

    
289
        /**
290
         * Acciones a ejecutar cuando se aplica
291
         */
292
        public void onlyApply() {
293
                if (RasterPropertiesTocMenuEntry.enableEvents)
294
                        setValuesFromPanelToFilter();
295
        }
296

    
297
        /**
298
         * Acciones a ejecutar cuando se cancela
299
         */
300
        public void cancel() {
301
                restoreStatus();
302
        }
303

    
304
        private int hasFilter(ArrayList filter, String name) {
305
                for (int i = 0; i < filter.size(); i++) {
306
                        if (((RasterFilter) filter.get(i)).getName().equals(name))
307
                                return i;
308
                }
309
                return -1;
310
        }
311

    
312
        public void saveStatus() {
313
                RegistrableTabPanel.initialProperties.put("filterStatus", filterList.getStatusCloned());
314

    
315
                ArrayList filterOrder = filterList.getStatusCloned();
316
                int posEnhanced = hasFilter(filterOrder, "enhanced");
317
                int posTailTrim = hasFilter(filterOrder, "tailTrim");
318
                // Si tiene realce comprobamos el tailtrim
319
                if (posEnhanced != -1) {
320
                        // Si no tiene el tailTrim, insertamos uno antes del realce
321
                        if (posTailTrim == -1) {
322
                                RasterFilter aux = StatisticsListManager.createTailFilter(0, 0, false, null);
323
                                filterOrder.add(posEnhanced, aux);
324
                        }
325
                } else {
326
                        // Si existe un tailTrim lo borramos pq no tiene realce
327
                        if (posTailTrim != -1)
328
                                filterOrder.remove(posTailTrim);
329
                        // Insertamos primero el tailtrim y luego el realce para conservar un orden logico
330
                        filterOrder.add(0, StatisticsListManager.createTailFilter(0, 0, false, null));
331
                        filterOrder.add(1, EnhancementListManager.createEnhancedFilter(false, null, 0, null));
332
                }
333

    
334
                // Si no tiene brillo, lo insertamos
335
                if (hasFilter(filterOrder, "brightness") == -1)
336
                        filterOrder.add(BrightnessContrastListManager.createBrightnessFilter(0));
337

    
338
                // Si no tiene el contraste, lo insertamos
339
                if (hasFilter(filterOrder, "contrast") == -1)
340
                        filterOrder.add(BrightnessContrastListManager.createContrastFilter(0));
341

    
342
                RegistrableTabPanel.initialProperties.put("filterOrder", filterOrder);
343
        }
344

    
345
        public void restoreStatus() {
346
                filterList.setStatus((ArrayList) RegistrableTabPanel.initialProperties.get("filterStatus"));
347

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