gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.fmap.mapcontext.raster.swing / org.gvsig.fmap.mapcontext.raster.swing.impl / src / main / java / org / gvsig / fmap / mapcontext / raster / swing / impl / transparency / TransparencyPanelController.java @ 6900
History | View | Annotate | Download (17.4 KB)
1 |
/* gvSIG. Desktop Geographic Information System.
|
---|---|
2 |
*
|
3 |
* Copyright ? 2007-2017 gvSIG Association
|
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., 51 Franklin Street, Fifth Floor, Boston,
|
18 |
* MA 02110-1301, USA.
|
19 |
*
|
20 |
* For any additional information, do not hesitate to contact us
|
21 |
* at info AT gvsig.com, or visit our website www.gvsig.com.
|
22 |
*/
|
23 |
package org.gvsig.fmap.mapcontext.raster.swing.impl.transparency; |
24 |
|
25 |
import java.awt.Color; |
26 |
import java.awt.Dimension; |
27 |
import java.awt.event.ActionEvent; |
28 |
import java.awt.event.ActionListener; |
29 |
import java.util.ArrayList; |
30 |
import java.util.List; |
31 |
import java.util.Locale; |
32 |
|
33 |
import javax.swing.DefaultListModel; |
34 |
import javax.swing.JComponent; |
35 |
import javax.swing.JPanel; |
36 |
import javax.swing.colorchooser.AbstractColorChooserPanel; |
37 |
import javax.swing.event.ChangeEvent; |
38 |
import javax.swing.event.ChangeListener; |
39 |
import javax.swing.event.ListSelectionEvent; |
40 |
import javax.swing.event.ListSelectionListener; |
41 |
|
42 |
import org.slf4j.Logger; |
43 |
import org.slf4j.LoggerFactory; |
44 |
|
45 |
import org.gvsig.fmap.mapcontext.exceptions.LegendLayerException; |
46 |
import org.gvsig.fmap.mapcontext.layers.FLayer; |
47 |
import org.gvsig.fmap.mapcontext.raster.api.RasterLayer; |
48 |
import org.gvsig.fmap.mapcontext.raster.swing.transparency.TransparencyPanel; |
49 |
import org.gvsig.raster.lib.legend.api.RasterLegend; |
50 |
import org.gvsig.raster.lib.legend.api.RasterLegendLocator; |
51 |
import org.gvsig.raster.lib.legend.api.RasterLegendManager; |
52 |
import org.gvsig.raster.lib.legend.api.Transparency; |
53 |
import org.gvsig.raster.lib.legend.api.TransparencyRange; |
54 |
import org.gvsig.tools.ToolsLocator; |
55 |
import org.gvsig.tools.i18n.I18nManager; |
56 |
|
57 |
|
58 |
/**
|
59 |
* @author fdiaz
|
60 |
*
|
61 |
*/
|
62 |
public class TransparencyPanelController extends TransparencyPanelView implements TransparencyPanel, ActionListener, ChangeListener, ListSelectionListener{ |
63 |
|
64 |
/**
|
65 |
*
|
66 |
*/
|
67 |
private static final long serialVersionUID = -7509955533999332846L; |
68 |
private static final Logger LOG = LoggerFactory.getLogger(TransparencyPanelController.class); |
69 |
|
70 |
/**
|
71 |
* @param layer
|
72 |
*/
|
73 |
public TransparencyPanelController() {
|
74 |
colorChooser.setPreviewPanel(new JPanel()); |
75 |
|
76 |
initializeComponents(); |
77 |
|
78 |
translate(); |
79 |
this.invalidate();
|
80 |
} |
81 |
|
82 |
/**
|
83 |
*
|
84 |
*/
|
85 |
@SuppressWarnings("unchecked") |
86 |
private void initializeComponents() { |
87 |
initializeColorChooserPanel(); |
88 |
|
89 |
chkNoDataTransparency.addActionListener(this);
|
90 |
chkActivateOpacity.addActionListener(this);
|
91 |
chkActivatePixelTransparency.addActionListener(this);
|
92 |
sldOpacity.addChangeListener(this);
|
93 |
spOpacity.addChangeListener(this);
|
94 |
|
95 |
btnAdd.addActionListener(this);
|
96 |
btnRemove.addActionListener(this);
|
97 |
// Botones para poder a?adirles acciones desde fuera
|
98 |
// btnExternalTool0.addActionListener(this);
|
99 |
// btnExternalTool1.addActionListener(this);
|
100 |
// btnExternalTool2.addActionListener(this);
|
101 |
|
102 |
// lstTransparencyRanges.setModel(new TransparencyRangesListModel());
|
103 |
lstTransparencyRanges.getParent().setPreferredSize(new Dimension(210, lstTransparencyRanges.getParent().getHeight()));; |
104 |
lstTransparencyRanges.setModel(new DefaultListModel<TransparencyRange>()); |
105 |
lstTransparencyRanges.addListSelectionListener(this);
|
106 |
} |
107 |
|
108 |
/**
|
109 |
*
|
110 |
*/
|
111 |
private void initializeColorChooserPanel() { |
112 |
AbstractColorChooserPanel[] defaultPanels = |
113 |
javax.swing.colorchooser.ColorChooserComponentFactory.getDefaultChooserPanels(); |
114 |
|
115 |
AbstractColorChooserPanel[] chooserPanelsCleaned = new AbstractColorChooserPanel[1]; |
116 |
|
117 |
//FIXME: Pi??n fijo, ponemos el RGB. A ver si esto se puede hacer mejor.
|
118 |
chooserPanelsCleaned[0] = defaultPanels[3]; |
119 |
|
120 |
colorChooser.setChooserPanels(chooserPanelsCleaned); |
121 |
} |
122 |
|
123 |
private void translate() { |
124 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
125 |
chkNoDataTransparency.setText(i18nManager.getTranslation(chkNoDataTransparency.getText())); |
126 |
chkNoDataTransparency.setToolTipText(i18nManager.getTranslation(chkNoDataTransparency.getToolTipText())); |
127 |
// lblNoDataValue.setText(i18nManager.getTranslation(lblNoDataValue.getText()));
|
128 |
// lblNoDataValue.setToolTipText(i18nManager.getTranslation(lblNoDataValue.getToolTipText()));
|
129 |
// txtNoDataValue.setToolTipText(i18nManager.getTranslation(txtNoDataValue.getToolTipText()));
|
130 |
// btnSaveNoData.setText(i18nManager.getTranslation(btnSaveNoData.getText()));
|
131 |
// btnSaveNoData.setToolTipText(i18nManager.getTranslation(btnSaveNoData.getToolTipText()));
|
132 |
// btnRemoveNoData.setText(i18nManager.getTranslation(btnRemoveNoData.getText()));
|
133 |
// btnRemoveNoData.setToolTipText(i18nManager.getTranslation(btnRemoveNoData.getToolTipText()));
|
134 |
// btnDefaultNoDataValue.setText(i18nManager.getTranslation(btnDefaultNoDataValue.getText()));
|
135 |
// btnDefaultNoDataValue.setToolTipText(i18nManager.getTranslation(btnDefaultNoDataValue.getToolTipText()));
|
136 |
// btnRestoreNoData.setText(i18nManager.getTranslation(btnRestoreNoData.getText()));
|
137 |
// btnRestoreNoData.setToolTipText(i18nManager.getTranslation(btnRestoreNoData.getToolTipText()));
|
138 |
lblOpacity.setText(i18nManager.getTranslation(lblOpacity.getText())); |
139 |
chkActivateOpacity.setText(i18nManager.getTranslation(chkActivateOpacity.getText())); |
140 |
chkActivateOpacity.setToolTipText(i18nManager.getTranslation(chkActivateOpacity.getToolTipText())); |
141 |
lblPixelTransparency.setText(i18nManager.getTranslation(lblPixelTransparency.getText())); |
142 |
chkActivatePixelTransparency.setText(i18nManager.getTranslation(chkActivatePixelTransparency.getText())); |
143 |
chkActivatePixelTransparency.setToolTipText(i18nManager.getTranslation(chkActivatePixelTransparency.getToolTipText())); |
144 |
btnAdd.setText(i18nManager.getTranslation(btnAdd.getText())); |
145 |
btnAdd.setToolTipText(i18nManager.getTranslation(btnAdd.getToolTipText())); |
146 |
btnRemove.setText(i18nManager.getTranslation(btnRemove.getText())); |
147 |
btnRemove.setToolTipText(i18nManager.getTranslation(btnRemove.getToolTipText())); |
148 |
btnExternalTool0.setText(i18nManager.getTranslation(btnExternalTool0.getText())); |
149 |
btnExternalTool0.setToolTipText(i18nManager.getTranslation(btnExternalTool0.getToolTipText())); |
150 |
btnExternalTool1.setText(i18nManager.getTranslation(btnExternalTool1.getText())); |
151 |
btnExternalTool1.setToolTipText(i18nManager.getTranslation(btnExternalTool1.getToolTipText())); |
152 |
btnExternalTool2.setText(i18nManager.getTranslation(btnExternalTool2.getText())); |
153 |
btnExternalTool2.setToolTipText(i18nManager.getTranslation(btnExternalTool2.getToolTipText())); |
154 |
rbtnAnd.setText(i18nManager.getTranslation(rbtnAnd.getText())); |
155 |
rbtnAnd.setToolTipText(i18nManager.getTranslation(rbtnAnd.getToolTipText())); |
156 |
rbtnOr.setText(i18nManager.getTranslation(rbtnOr.getText())); |
157 |
rbtnOr.setToolTipText(i18nManager.getTranslation(rbtnOr.getToolTipText())); |
158 |
chkRed.setText(i18nManager.getTranslation(chkRed.getText())); |
159 |
chkRed.setToolTipText(i18nManager.getTranslation(chkRed.getToolTipText())); |
160 |
chkGreen.setText(i18nManager.getTranslation(chkGreen.getText())); |
161 |
chkGreen.setToolTipText(i18nManager.getTranslation(chkGreen.getToolTipText())); |
162 |
chkBlue.setText(i18nManager.getTranslation(chkBlue.getText())); |
163 |
chkBlue.setToolTipText(i18nManager.getTranslation(chkBlue.getToolTipText())); |
164 |
chkAlpha.setText(i18nManager.getTranslation(chkAlpha.getText())); |
165 |
chkAlpha.setToolTipText(i18nManager.getTranslation(chkAlpha.getToolTipText())); |
166 |
} |
167 |
|
168 |
/**
|
169 |
* @param locale
|
170 |
*
|
171 |
*/
|
172 |
public void setLocate(Locale locale) { |
173 |
Locale l = super.getLocale(); |
174 |
if (!l.equals(locale)) {
|
175 |
translate(); |
176 |
} |
177 |
super.setLocale(locale);
|
178 |
} |
179 |
|
180 |
/**
|
181 |
* @param layer
|
182 |
*/
|
183 |
@SuppressWarnings("unchecked") |
184 |
public void set(FLayer layer){ |
185 |
RasterLegendManager legendManager = RasterLegendLocator.getRasterLegendManager(); |
186 |
|
187 |
RasterLayer rasterLayer = (RasterLayer)layer; |
188 |
RasterLegend legend = (RasterLegend) rasterLayer.getLegend(); |
189 |
|
190 |
//FIXME: ?Debemos crear una leyenda cuando no hemos podido obtenerla de la capa, o debe cascar?
|
191 |
if(legend == null){ |
192 |
legend = legendManager.createLegend(); |
193 |
} |
194 |
|
195 |
if(legend.areTransparentNoData()){
|
196 |
chkNoDataTransparency.doClick(); |
197 |
} |
198 |
|
199 |
int alpha = 255; |
200 |
Transparency transparency = legend.getTransparency();
|
201 |
if (transparency != null) { |
202 |
chkActivateOpacity.doClick(); |
203 |
alpha = transparency.getAlpha(); |
204 |
if(transparency.getTransparencyRanges()!=null && transparency.getTransparencyRanges().size()>0){ |
205 |
chkActivatePixelTransparency.doClick(); |
206 |
for (TransparencyRange range : transparency.getTransparencyRanges()) {
|
207 |
((DefaultListModel<TransparencyRange>) lstTransparencyRanges.getModel()).addElement(range);
|
208 |
} |
209 |
} |
210 |
} |
211 |
sldOpacity.setValue(alpha); |
212 |
spOpacity.setValue(alpha); |
213 |
|
214 |
} |
215 |
|
216 |
/**
|
217 |
* @param layer
|
218 |
*/
|
219 |
public boolean fetch(FLayer layer){ |
220 |
RasterLegendManager legendManager = RasterLegendLocator.getRasterLegendManager(); |
221 |
RasterLegend legend = ((RasterLayer)layer).getLegend(); |
222 |
|
223 |
if(legend == null){ |
224 |
legend = legendManager.createLegend(); |
225 |
} |
226 |
|
227 |
legend.setTransparentNoData(chkNoDataTransparency.isSelected()); |
228 |
|
229 |
if(chkActivateOpacity.isSelected()){
|
230 |
Transparency transparency = legend.getTransparency();
|
231 |
if(transparency==null){ |
232 |
transparency = legendManager.createTransparency(); |
233 |
} |
234 |
transparency.setValue(((Integer)spOpacity.getValue()));
|
235 |
legend.setTransparency(transparency); |
236 |
} |
237 |
|
238 |
if(chkActivatePixelTransparency.isSelected()){
|
239 |
Transparency transparency = legend.getTransparency();
|
240 |
if(transparency==null){ |
241 |
transparency = legendManager.createTransparency(); |
242 |
} |
243 |
transparency.setTransparencyRanges(this.getTransparencyRanges());
|
244 |
legend.setTransparency(transparency); |
245 |
} |
246 |
layer.getMapContext().invalidate(); |
247 |
return true; |
248 |
} |
249 |
|
250 |
private List<TransparencyRange> getTransparencyRanges() { |
251 |
ArrayList<TransparencyRange> result = new ArrayList<TransparencyRange>(); |
252 |
@SuppressWarnings("unchecked") |
253 |
DefaultListModel<TransparencyRange> model = ((DefaultListModel<TransparencyRange>)lstTransparencyRanges.getModel()); |
254 |
for (int i = 0; i < model.getSize(); i++) { |
255 |
result.add(model.get(i)); |
256 |
} |
257 |
|
258 |
return result;
|
259 |
} |
260 |
|
261 |
@Override
|
262 |
public JComponent asJComponent() { |
263 |
return this; |
264 |
} |
265 |
|
266 |
|
267 |
@SuppressWarnings("unchecked") |
268 |
@Override
|
269 |
public void actionPerformed(ActionEvent e) { |
270 |
|
271 |
if(e.getSource() == chkActivateOpacity){
|
272 |
boolean selected = chkActivateOpacity.isSelected();
|
273 |
sldOpacity.setEnabled(selected); |
274 |
spOpacity.setEnabled(selected); |
275 |
} |
276 |
if(e.getSource() == chkActivatePixelTransparency){
|
277 |
boolean selected = chkActivatePixelTransparency.isSelected();
|
278 |
colorChooser.setEnabled(selected); |
279 |
btnAdd.setEnabled(selected); |
280 |
btnRemove.setEnabled(selected); |
281 |
//FIXME: Supongo que habr? que comprobar que tienen una acci?n asignada para poder habilitarlos
|
282 |
// btnExternalTool0.setEnabled(selected);
|
283 |
// btnExternalTool1.setEnabled(selected);
|
284 |
// btnExternalTool2.setEnabled(selected);
|
285 |
rbtnAnd.setEnabled(selected); |
286 |
rbtnOr.setEnabled(selected); |
287 |
chkRed.setEnabled(selected); |
288 |
chkGreen.setEnabled(selected); |
289 |
chkBlue.setEnabled(selected); |
290 |
chkAlpha.setEnabled(selected); |
291 |
lstTransparencyRanges.setEnabled(selected); |
292 |
} |
293 |
DefaultListModel<TransparencyRange> transparencyListModel = (DefaultListModel<TransparencyRange>) lstTransparencyRanges.getModel(); |
294 |
if(e.getSource() == btnAdd){
|
295 |
Color color = this.colorChooser.getColor(); |
296 |
RasterLegendManager legendManager = RasterLegendLocator.getRasterLegendManager(); |
297 |
TransparencyRange range = legendManager.createTransparencyRange(); |
298 |
|
299 |
if(chkRed.isSelected()){
|
300 |
int[] values = new int[2]; |
301 |
values[0] = color.getRed();
|
302 |
values[1] = color.getRed();
|
303 |
range.setRed(values); |
304 |
} |
305 |
if(chkGreen.isSelected()){
|
306 |
int[] values = new int[2]; |
307 |
values[0] = color.getGreen();
|
308 |
values[1] = color.getGreen();
|
309 |
range.setGreen(values); |
310 |
} |
311 |
if(chkBlue.isSelected()){
|
312 |
int[] values = new int[2]; |
313 |
values[0] = color.getBlue();
|
314 |
values[1] = color.getBlue();
|
315 |
range.setBlue(values); |
316 |
} |
317 |
range.setAnd(rbtnAnd.isSelected()); |
318 |
if(chkAlpha.isSelected()){
|
319 |
range.setAlpha(color.getAlpha()); |
320 |
} else {
|
321 |
range.setAlpha(0);
|
322 |
} |
323 |
int index = getIndex(range);
|
324 |
if(index < 0){ |
325 |
transparencyListModel.addElement(range); |
326 |
lstTransparencyRanges.setSelectedIndex(transparencyListModel.getSize()-1);
|
327 |
} else {
|
328 |
((DefaultListModel<TransparencyRange>)lstTransparencyRanges.getModel()).setElementAt(range, index);
|
329 |
lstTransparencyRanges.setSelectedIndex(index); |
330 |
} |
331 |
} |
332 |
if(e.getSource() == btnRemove){
|
333 |
int selectedIndex = lstTransparencyRanges.getSelectedIndex();
|
334 |
transparencyListModel.removeElementAt(selectedIndex); |
335 |
} |
336 |
|
337 |
} |
338 |
|
339 |
// private boolean isRangeInList(TransparencyRange range) {
|
340 |
// if(getIndex(range)>=0){
|
341 |
// return true;
|
342 |
// }
|
343 |
// return false;
|
344 |
// }
|
345 |
|
346 |
private int getIndex(TransparencyRange range) { |
347 |
for(int i=0; i<lstTransparencyRanges.getModel().getSize(); i++){ |
348 |
TransparencyRange element = (TransparencyRange) lstTransparencyRanges.getModel().getElementAt(i); |
349 |
if(element.isSameRange(range)){
|
350 |
return i;
|
351 |
} |
352 |
} |
353 |
return -1; |
354 |
} |
355 |
|
356 |
@Override
|
357 |
public void stateChanged(ChangeEvent e) { |
358 |
if (e.getSource() == sldOpacity) {
|
359 |
Integer value = (Integer) spOpacity.getValue(); |
360 |
if (value != sldOpacity.getValue()) {
|
361 |
spOpacity.setValue(new Integer(sldOpacity.getValue())); |
362 |
} |
363 |
} |
364 |
if (e.getSource() == spOpacity) {
|
365 |
Integer value = (Integer) spOpacity.getValue(); |
366 |
if (value <= 0) { |
367 |
spOpacity.setValue(0);
|
368 |
} |
369 |
; |
370 |
if (value >= 255) { |
371 |
spOpacity.setValue(255);
|
372 |
} |
373 |
; |
374 |
if (value != sldOpacity.getValue()) {
|
375 |
sldOpacity.setValue(value); |
376 |
} |
377 |
} |
378 |
} |
379 |
|
380 |
@Override
|
381 |
public void valueChanged(ListSelectionEvent e) { |
382 |
if (e.getSource() == lstTransparencyRanges) {
|
383 |
int selectedIndex = lstTransparencyRanges.getSelectedIndex();
|
384 |
if (selectedIndex >= 0) { |
385 |
btnRemove.setEnabled(true);
|
386 |
TransparencyRange range = |
387 |
(TransparencyRange) lstTransparencyRanges.getModel().getElementAt(selectedIndex); |
388 |
setRange(range); |
389 |
} else {
|
390 |
btnRemove.setEnabled(false);
|
391 |
} |
392 |
} |
393 |
return;
|
394 |
} |
395 |
|
396 |
/**
|
397 |
* @param TransparencyRange range
|
398 |
*/
|
399 |
private void setRange(TransparencyRange range) { |
400 |
|
401 |
int alpha = range.getAlpha();
|
402 |
int[] redValues = range.getRed(); |
403 |
int red = 255; |
404 |
if (redValues[0] >= 0) { |
405 |
red = redValues[0];
|
406 |
chkRed.setSelected(true);
|
407 |
} else {
|
408 |
chkRed.setSelected(false);
|
409 |
} |
410 |
int[] greenValues = range.getGreen(); |
411 |
int green = 255; |
412 |
if (greenValues[0] >= 0) { |
413 |
green = greenValues[0];
|
414 |
chkGreen.setSelected(true);
|
415 |
} else {
|
416 |
chkGreen.setSelected(false);
|
417 |
} |
418 |
int[] blueValues = range.getBlue(); |
419 |
int blue = 255; |
420 |
if (blueValues[0] >= 0) { |
421 |
blue = blueValues[0];
|
422 |
chkBlue.setSelected(true);
|
423 |
} else {
|
424 |
chkBlue.setSelected(false);
|
425 |
} |
426 |
|
427 |
if (alpha >= 0) { |
428 |
setColor(new Color(red, green, blue, alpha)); |
429 |
chkAlpha.setSelected(true);
|
430 |
} else {
|
431 |
setColor(new Color(red, green, blue)); |
432 |
chkAlpha.setSelected(false);
|
433 |
} |
434 |
|
435 |
if(range.isAnd()){
|
436 |
rbtnAnd.setSelected(true);
|
437 |
rbtnOr.setSelected(false);
|
438 |
} else {
|
439 |
rbtnAnd.setSelected(false);
|
440 |
rbtnOr.setSelected(true);
|
441 |
} |
442 |
} |
443 |
|
444 |
@Override
|
445 |
public void setColor(Color color) { |
446 |
colorChooser.setColor(color); |
447 |
} |
448 |
|
449 |
} |