Statistics
| Revision:

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
}