Statistics
| Revision:

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

History | View | Annotate | Download (11.5 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.RegistrableTabPanel;
43
import org.gvsig.rastertools.properties.panels.EnhancedBrightnessContrastPanel;
44
import org.gvsig.rastertools.properties.panels.EnhancedPanel;
45
import org.gvsig.rastertools.properties.panels.EnhancedWithTrimPanel;
46

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

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

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

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

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

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

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

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

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

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

    
162
                saveStatus();
163

    
164
                setValuesFromFilterToPanel();
165
        }
166

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

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

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

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

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

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

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

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

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

    
250

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

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

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

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

    
288
        /**
289
         * Acciones a ejecutar cuando se aplica
290
         */
291
        public void onlyApply() {
292
                setValuesFromPanelToFilter();
293
        }
294

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

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

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

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

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

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

    
340
                RegistrableTabPanel.initialProperties.put("filterOrder", filterOrder);
341
        }
342

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

    
346
                if (lyr != null)
347
                        lyr.getMapContext().invalidate();
348
        }
349
}