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 @ 8796
History | View | Annotate | Download (17.1 KB)
1 | 6701 | fdiaz | /* 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 | 6900 | fdiaz | RasterLegend legend = (RasterLegend) rasterLayer.getLegend(); |
189 | 6701 | fdiaz | |
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 | 6900 | fdiaz | RasterLegend legend = ((RasterLayer)layer).getLegend(); |
222 | 6701 | fdiaz | |
223 | if(legend == null){ |
||
224 | legend = legendManager.createLegend(); |
||
225 | } |
||
226 | |||
227 | legend.setTransparentNoData(chkNoDataTransparency.isSelected()); |
||
228 | |||
229 | 6901 | fdiaz | Transparency transparency = legendManager.createTransparency();
|
230 | 6701 | fdiaz | if(chkActivateOpacity.isSelected()){
|
231 | transparency.setValue(((Integer)spOpacity.getValue()));
|
||
232 | } |
||
233 | |||
234 | if(chkActivatePixelTransparency.isSelected()){
|
||
235 | transparency.setTransparencyRanges(this.getTransparencyRanges());
|
||
236 | } |
||
237 | 6901 | fdiaz | legend.setTransparency(transparency); |
238 | 6701 | fdiaz | layer.getMapContext().invalidate(); |
239 | return true; |
||
240 | } |
||
241 | |||
242 | private List<TransparencyRange> getTransparencyRanges() { |
||
243 | ArrayList<TransparencyRange> result = new ArrayList<TransparencyRange>(); |
||
244 | @SuppressWarnings("unchecked") |
||
245 | DefaultListModel<TransparencyRange> model = ((DefaultListModel<TransparencyRange>)lstTransparencyRanges.getModel()); |
||
246 | for (int i = 0; i < model.getSize(); i++) { |
||
247 | result.add(model.get(i)); |
||
248 | } |
||
249 | |||
250 | return result;
|
||
251 | } |
||
252 | |||
253 | @Override
|
||
254 | public JComponent asJComponent() { |
||
255 | return this; |
||
256 | } |
||
257 | |||
258 | |||
259 | @SuppressWarnings("unchecked") |
||
260 | @Override
|
||
261 | public void actionPerformed(ActionEvent e) { |
||
262 | |||
263 | if(e.getSource() == chkActivateOpacity){
|
||
264 | boolean selected = chkActivateOpacity.isSelected();
|
||
265 | sldOpacity.setEnabled(selected); |
||
266 | spOpacity.setEnabled(selected); |
||
267 | } |
||
268 | if(e.getSource() == chkActivatePixelTransparency){
|
||
269 | boolean selected = chkActivatePixelTransparency.isSelected();
|
||
270 | colorChooser.setEnabled(selected); |
||
271 | btnAdd.setEnabled(selected); |
||
272 | btnRemove.setEnabled(selected); |
||
273 | //FIXME: Supongo que habr? que comprobar que tienen una acci?n asignada para poder habilitarlos
|
||
274 | // btnExternalTool0.setEnabled(selected);
|
||
275 | // btnExternalTool1.setEnabled(selected);
|
||
276 | // btnExternalTool2.setEnabled(selected);
|
||
277 | rbtnAnd.setEnabled(selected); |
||
278 | rbtnOr.setEnabled(selected); |
||
279 | chkRed.setEnabled(selected); |
||
280 | chkGreen.setEnabled(selected); |
||
281 | chkBlue.setEnabled(selected); |
||
282 | chkAlpha.setEnabled(selected); |
||
283 | lstTransparencyRanges.setEnabled(selected); |
||
284 | } |
||
285 | DefaultListModel<TransparencyRange> transparencyListModel = (DefaultListModel<TransparencyRange>) lstTransparencyRanges.getModel(); |
||
286 | if(e.getSource() == btnAdd){
|
||
287 | Color color = this.colorChooser.getColor(); |
||
288 | RasterLegendManager legendManager = RasterLegendLocator.getRasterLegendManager(); |
||
289 | TransparencyRange range = legendManager.createTransparencyRange(); |
||
290 | |||
291 | if(chkRed.isSelected()){
|
||
292 | int[] values = new int[2]; |
||
293 | values[0] = color.getRed();
|
||
294 | values[1] = color.getRed();
|
||
295 | range.setRed(values); |
||
296 | } |
||
297 | if(chkGreen.isSelected()){
|
||
298 | int[] values = new int[2]; |
||
299 | values[0] = color.getGreen();
|
||
300 | values[1] = color.getGreen();
|
||
301 | range.setGreen(values); |
||
302 | } |
||
303 | if(chkBlue.isSelected()){
|
||
304 | int[] values = new int[2]; |
||
305 | values[0] = color.getBlue();
|
||
306 | values[1] = color.getBlue();
|
||
307 | range.setBlue(values); |
||
308 | } |
||
309 | range.setAnd(rbtnAnd.isSelected()); |
||
310 | if(chkAlpha.isSelected()){
|
||
311 | range.setAlpha(color.getAlpha()); |
||
312 | } else {
|
||
313 | range.setAlpha(0);
|
||
314 | } |
||
315 | int index = getIndex(range);
|
||
316 | if(index < 0){ |
||
317 | transparencyListModel.addElement(range); |
||
318 | lstTransparencyRanges.setSelectedIndex(transparencyListModel.getSize()-1);
|
||
319 | } else {
|
||
320 | ((DefaultListModel<TransparencyRange>)lstTransparencyRanges.getModel()).setElementAt(range, index);
|
||
321 | lstTransparencyRanges.setSelectedIndex(index); |
||
322 | } |
||
323 | } |
||
324 | if(e.getSource() == btnRemove){
|
||
325 | int selectedIndex = lstTransparencyRanges.getSelectedIndex();
|
||
326 | transparencyListModel.removeElementAt(selectedIndex); |
||
327 | } |
||
328 | |||
329 | } |
||
330 | |||
331 | // private boolean isRangeInList(TransparencyRange range) {
|
||
332 | // if(getIndex(range)>=0){
|
||
333 | // return true;
|
||
334 | // }
|
||
335 | // return false;
|
||
336 | // }
|
||
337 | |||
338 | private int getIndex(TransparencyRange range) { |
||
339 | for(int i=0; i<lstTransparencyRanges.getModel().getSize(); i++){ |
||
340 | TransparencyRange element = (TransparencyRange) lstTransparencyRanges.getModel().getElementAt(i); |
||
341 | if(element.isSameRange(range)){
|
||
342 | return i;
|
||
343 | } |
||
344 | } |
||
345 | return -1; |
||
346 | } |
||
347 | |||
348 | @Override
|
||
349 | public void stateChanged(ChangeEvent e) { |
||
350 | if (e.getSource() == sldOpacity) {
|
||
351 | Integer value = (Integer) spOpacity.getValue(); |
||
352 | if (value != sldOpacity.getValue()) {
|
||
353 | spOpacity.setValue(new Integer(sldOpacity.getValue())); |
||
354 | } |
||
355 | } |
||
356 | if (e.getSource() == spOpacity) {
|
||
357 | Integer value = (Integer) spOpacity.getValue(); |
||
358 | if (value <= 0) { |
||
359 | spOpacity.setValue(0);
|
||
360 | } |
||
361 | ; |
||
362 | if (value >= 255) { |
||
363 | spOpacity.setValue(255);
|
||
364 | } |
||
365 | ; |
||
366 | if (value != sldOpacity.getValue()) {
|
||
367 | sldOpacity.setValue(value); |
||
368 | } |
||
369 | } |
||
370 | } |
||
371 | |||
372 | @Override
|
||
373 | public void valueChanged(ListSelectionEvent e) { |
||
374 | if (e.getSource() == lstTransparencyRanges) {
|
||
375 | int selectedIndex = lstTransparencyRanges.getSelectedIndex();
|
||
376 | if (selectedIndex >= 0) { |
||
377 | btnRemove.setEnabled(true);
|
||
378 | TransparencyRange range = |
||
379 | (TransparencyRange) lstTransparencyRanges.getModel().getElementAt(selectedIndex); |
||
380 | setRange(range); |
||
381 | } else {
|
||
382 | btnRemove.setEnabled(false);
|
||
383 | } |
||
384 | } |
||
385 | return;
|
||
386 | } |
||
387 | |||
388 | /**
|
||
389 | * @param TransparencyRange range
|
||
390 | */
|
||
391 | private void setRange(TransparencyRange range) { |
||
392 | |||
393 | int alpha = range.getAlpha();
|
||
394 | int[] redValues = range.getRed(); |
||
395 | int red = 255; |
||
396 | if (redValues[0] >= 0) { |
||
397 | red = redValues[0];
|
||
398 | chkRed.setSelected(true);
|
||
399 | } else {
|
||
400 | chkRed.setSelected(false);
|
||
401 | } |
||
402 | int[] greenValues = range.getGreen(); |
||
403 | int green = 255; |
||
404 | if (greenValues[0] >= 0) { |
||
405 | green = greenValues[0];
|
||
406 | chkGreen.setSelected(true);
|
||
407 | } else {
|
||
408 | chkGreen.setSelected(false);
|
||
409 | } |
||
410 | int[] blueValues = range.getBlue(); |
||
411 | int blue = 255; |
||
412 | if (blueValues[0] >= 0) { |
||
413 | blue = blueValues[0];
|
||
414 | chkBlue.setSelected(true);
|
||
415 | } else {
|
||
416 | chkBlue.setSelected(false);
|
||
417 | } |
||
418 | |||
419 | if (alpha >= 0) { |
||
420 | setColor(new Color(red, green, blue, alpha)); |
||
421 | chkAlpha.setSelected(true);
|
||
422 | } else {
|
||
423 | setColor(new Color(red, green, blue)); |
||
424 | chkAlpha.setSelected(false);
|
||
425 | } |
||
426 | |||
427 | if(range.isAnd()){
|
||
428 | rbtnAnd.setSelected(true);
|
||
429 | rbtnOr.setSelected(false);
|
||
430 | } else {
|
||
431 | rbtnAnd.setSelected(false);
|
||
432 | rbtnOr.setSelected(true);
|
||
433 | } |
||
434 | } |
||
435 | |||
436 | @Override
|
||
437 | public void setColor(Color color) { |
||
438 | colorChooser.setColor(color); |
||
439 | } |
||
440 | |||
441 | } |