root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / properties / control / EnhancedControl.java @ 12198
History | View | Annotate | Download (11.6 KB)
1 | 12166 | bsanchez | /* 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 | 12180 | bsanchez | import org.gvsig.gui.beans.slidertext.listeners.SliderEvent; |
28 | import org.gvsig.gui.beans.slidertext.listeners.SliderListener; |
||
29 | 12166 | bsanchez | import org.gvsig.raster.dataset.IStatistics; |
30 | 12180 | bsanchez | import org.gvsig.raster.grid.filter.RasterFilter; |
31 | 12166 | bsanchez | 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 | 12180 | bsanchez | import org.gvsig.raster.grid.filter.statistics.StatisticsListManager; |
39 | 12166 | bsanchez | import org.gvsig.raster.grid.filter.statistics.TailTrimFilter; |
40 | import org.gvsig.raster.shared.IRasterDataset; |
||
41 | import org.gvsig.raster.shared.IRasterRendering; |
||
42 | 12198 | bsanchez | import org.gvsig.rastertools.properties.dialog.RasterPropertiesTocMenuEntry; |
43 | 12166 | bsanchez | 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 | 12180 | bsanchez | class BrightnessContrastListener implements ActionListener, SliderListener { |
68 | 12166 | bsanchez | JCheckBox active = null; |
69 | /**
|
||
70 | * Constructor. Registra los listener
|
||
71 | * @param panel
|
||
72 | */
|
||
73 | public BrightnessContrastListener(EnhancedBrightnessContrastPanel panel) {
|
||
74 | 12180 | bsanchez | panel.addBrightnessValueChangedListener(this);
|
75 | panel.addContrastValueChangedListener(this);
|
||
76 | 12166 | bsanchez | active = panel.getActive(); |
77 | active.addActionListener(this);
|
||
78 | } |
||
79 | |||
80 | 12180 | bsanchez | /*
|
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 | 12166 | bsanchez | onlyApply(); |
87 | } |
||
88 | |||
89 | 12180 | bsanchez | /*
|
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 | 12166 | bsanchez | onlyApply(); |
95 | } |
||
96 | |||
97 | 12180 | bsanchez | /*
|
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 | 12166 | bsanchez | } |
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 | 12180 | bsanchez | class EnhancedWithTrimListener implements ActionListener, SliderListener { |
112 | 12166 | bsanchez | 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 | 12180 | bsanchez | panel.getTrimPanel().getRemoveCheck().addActionListener(this);
|
121 | panel.getTrimPanel().getTrimCheck().addActionListener(this);
|
||
122 | panel.getTrimPanel().getTrimSlider().addValueChangedListener(this);
|
||
123 | 12166 | bsanchez | } |
124 | |||
125 | 12180 | bsanchez | /*
|
126 | * (non-Javadoc)
|
||
127 | * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
|
||
128 | */
|
||
129 | 12166 | bsanchez | public void actionPerformed(ActionEvent e) { |
130 | 12180 | bsanchez | onlyApply(); |
131 | 12166 | bsanchez | } |
132 | 12180 | bsanchez | |
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 | 12166 | bsanchez | } |
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 | 12180 | bsanchez | // 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 | 12166 | bsanchez | eManager.addEnhancedFilter(ePanel.isRemoveEndsSelected(), stats, 0, renderBands);
|
231 | 12180 | bsanchez | } else
|
232 | 12166 | bsanchez | 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 | 12180 | bsanchez | |
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 | 12166 | bsanchez | // 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 | 12198 | bsanchez | if (RasterPropertiesTocMenuEntry.enableEvents)
|
294 | setValuesFromPanelToFilter(); |
||
295 | 12166 | bsanchez | } |
296 | |||
297 | /**
|
||
298 | * Acciones a ejecutar cuando se cancela
|
||
299 | */
|
||
300 | public void cancel() { |
||
301 | restoreStatus(); |
||
302 | } |
||
303 | |||
304 | 12180 | bsanchez | 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 | 12166 | bsanchez | public void saveStatus() { |
313 | RegistrableTabPanel.initialProperties.put("filterStatus", filterList.getStatusCloned());
|
||
314 | 12180 | bsanchez | |
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 | 12166 | bsanchez | } |
344 | |||
345 | public void restoreStatus() { |
||
346 | filterList.setStatus((ArrayList) RegistrableTabPanel.initialProperties.get("filterStatus")); |
||
347 | |||
348 | if (lyr != null) |
||
349 | lyr.getMapContext().invalidate(); |
||
350 | } |
||
351 | } |