Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / properties / control / TranspByPixelListener.java @ 2480

History | View | Annotate | Download (12.1 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.tools.app.basic.tool.properties.control;
23

    
24
import java.awt.event.ActionEvent;
25
import java.awt.event.ActionListener;
26
import java.awt.event.MouseEvent;
27
import java.awt.event.MouseListener;
28
import java.util.ArrayList;
29

    
30
import javax.swing.JButton;
31
import javax.swing.JCheckBox;
32
import javax.swing.JList;
33
import javax.swing.JRadioButton;
34
import javax.swing.event.ListSelectionEvent;
35
import javax.swing.event.ListSelectionListener;
36

    
37
import org.gvsig.andami.PluginServices;
38
import org.gvsig.andami.ui.mdiManager.IWindow;
39
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
40
import org.gvsig.fmap.dal.coverage.RasterLocator;
41
import org.gvsig.fmap.dal.coverage.datastruct.TransparencyRange;
42
import org.gvsig.fmap.mapcontrol.MapControl;
43
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
44
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseMovementBehavior;
45
import org.gvsig.fmap.mapcontrol.tools.Behavior.PointBehavior;
46
import org.gvsig.gui.beans.doubleslider.DoubleSliderEvent;
47
import org.gvsig.gui.beans.doubleslider.DoubleSliderListener;
48
import org.gvsig.raster.swing.RasterSwingLibrary;
49
import org.gvsig.raster.tools.app.basic.tool.properties.panel.TranspByPixelPanel;
50
import org.gvsig.raster.tools.app.basic.tool.properties.panel.TranspByPixelRGBInputPanel;
51
import org.gvsig.raster.tools.app.basic.tool.selectrgb.ISelectRGB;
52
import org.gvsig.raster.tools.app.basic.tool.selectrgb.SelectRGBListener;
53

    
54
/**
55
 * Maneja los eventos para el panel de transparencia por pixel.
56
 * 
57
 * @author Nacho Brodin (nachobrodin@gmail.com)
58
 */
59
public class TranspByPixelListener implements ActionListener, ListSelectionListener, DoubleSliderListener, MouseListener, ISelectRGB {
60
        private ArrayList<TransparencyRange>   entries           = new ArrayList<TransparencyRange>();
61
        private JButton                        addButton         = null;
62
        private JButton                        removeButton      = null;
63
        private JButton                        selectColorButton = null;
64
        private JCheckBox                      cbActivar         = null;
65
        private JList                          list              = null;
66
        private JRadioButton                   andRb             = null;
67
        private JRadioButton                   orRb              = null;
68
        private TranspByPixelPanel             panel             = null;
69
        private TranspByPixelRGBInputPanel     rgbInputPanel     = null;
70
        private boolean                        eventsDisabled    = false;
71
        private int                            itemSelected      = -1;
72
        private String                         viewName          = "";
73

    
74
        /**
75
         * This is the default constructor
76
         */
77
        public TranspByPixelListener(TranspByPixelPanel panel) {
78
                AbstractViewPanel view = (AbstractViewPanel) PluginServices.getMDIManager().getActiveWindow();
79
                viewName = PluginServices.getMDIManager().getWindowInfo(view).getTitle();
80
                
81
                this.panel = panel;
82
                rgbInputPanel = panel.getPRGBInput();
83
                list = panel.getJList();
84

    
85
                addButton = panel.getBAdd();
86
                removeButton = panel.getBRemove();
87
                selectColorButton = panel.getBSelectColor();
88
                andRb = panel.getPOperation().getRbAnd();
89
                orRb = panel.getPOperation().getRbOr();
90
                cbActivar = panel.getActiveCheck();
91

    
92
                addButton.addActionListener(this);
93
                removeButton.addActionListener(this);
94
                andRb.addActionListener(this);
95
                orRb.addActionListener(this);
96
                cbActivar.addActionListener(this);
97
                selectColorButton.addActionListener(this);
98

    
99
                list.addListSelectionListener(this);
100

    
101
                panel.getPRGBInput().getTBlue().addValueChangedListener(this);
102
                panel.getPRGBInput().getTGreen().addValueChangedListener(this);
103
                panel.getPRGBInput().getTRed().addValueChangedListener(this);
104
                panel.getPRGBInput().getTAlpha().addValueChangedListener(this);
105
                list.addMouseListener(this);
106
        }
107

    
108
        /**
109
         * Obtiene el objeto TransparencyRange equivalente a los valores RGBA
110
         * seleccionados.
111
         *
112
         * @return TransparencyRange o null si la selecci?n no es correcta.
113
         */
114
        private TransparencyRange getEntrySelected() {
115
                TransparencyRange entry = RasterLocator.getManager().getDataStructFactory().createTransparencyRange();
116
                entry.setRed(rgbInputPanel.getRangeRed());
117
                entry.setGreen(rgbInputPanel.getRangeGreen());
118
                entry.setBlue(rgbInputPanel.getRangeBlue());
119
                if (rgbInputPanel.getTAlpha().isChecked())
120
                        entry.setAlpha(255 - rgbInputPanel.getTAlpha().getValue());
121
                else
122
                        entry.setAlpha(0);
123

    
124
                String textR = rgbInputPanel.getTRed().getValue() + "";
125
                if (!rgbInputPanel.getTRed().isChecked())
126
                        textR = "*";
127
                String textG = rgbInputPanel.getTGreen().getValue() + "";
128
                if (!rgbInputPanel.getTGreen().isChecked())
129
                        textG = "*";
130
                String textB = rgbInputPanel.getTBlue().getValue() + "";
131
                if (!rgbInputPanel.getTBlue().isChecked())
132
                        textB = "*";
133

    
134
                String strEntry = "";
135
                String separator = "";
136
                if (andRb.isSelected()) {
137
                        separator = " & ";
138
                        entry.setAnd(true);
139
                } else {
140
                        separator = " | ";
141
                        entry.setAnd(false);
142
                }
143

    
144
                strEntry = textR + separator + textG + separator + textB;
145
                if (rgbInputPanel.getTAlpha().getValue() != 255)
146
                        strEntry += " (A: " + rgbInputPanel.getTAlpha().getValue() + ")"; 
147
                entry.setStrEntry(strEntry);
148

    
149
                return entry;
150
        }
151

    
152
        /**
153
         * Gesti?n del evento de bot?n de selecci?n de color desde la vista. 
154
         * A?ade una tool a la vista para la selecci?n de RGB.
155
         */
156
        public void colorToolButton() {
157
                AbstractViewPanel theView = null;
158
                try {
159
                        IWindow[] allViews = PluginServices.getMDIManager().getAllWindows();
160
                        for (int i = 0; i < allViews.length; i++) {
161
                                if (allViews[i] instanceof AbstractViewPanel &&
162
                                                PluginServices.getMDIManager().getWindowInfo((AbstractViewPanel) allViews[i]).getTitle().equals(viewName))
163
                                        theView = (AbstractViewPanel) allViews[i];
164
                        }
165
                        if (theView == null)
166
                                return;
167
                } catch (ClassCastException ex) {
168
                        RasterSwingLibrary.messageBoxError("error_view_not_found", this, ex);
169
                        return;
170
                }
171
                MapControl m_MapControl = theView.getMapControl();
172
                
173
                TranspByPixelStatusBarListener sbl = new TranspByPixelStatusBarListener(m_MapControl);
174
                SelectRGBListener selectRGBListener = new SelectRGBListener(m_MapControl, this);
175
                m_MapControl.addBehavior("selectColorRaster", new Behavior[] {
176
                                new PointBehavior(selectRGBListener), new MouseMovementBehavior(sbl)
177
                                }
178
                );
179

    
180
                m_MapControl.setTool("selectColorRaster");
181
        }
182
        
183
        /**
184
         * Actualiza el item seleccionado cogiendo los valores del RGB
185
         */
186
        private void updateData() {
187
                if (itemSelected == -1)
188
                        return;
189

    
190
                TransparencyRange entry = getEntrySelected();
191
                if (entry != null) {
192
                        if (itemSelected < entries.size()) {
193
                                entries.set(itemSelected, entry);
194
                                panel.getListModel().set(itemSelected, entry.getStrEntry());
195
                                panel.callValueChanged();
196
                        }
197
                }
198
        }
199

    
200
        /*
201
         * (non-Javadoc)
202
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
203
         */
204
        public void actionPerformed(ActionEvent e) {
205

    
206
                if ((e.getSource() == andRb) || (e.getSource() == orRb)) {
207
                        updateData();
208
                        return;
209
                }
210

    
211
                // A?ade elementos a la lista
212
                if (e.getSource() == addButton) {
213
                        TransparencyRange entry = getEntrySelected();
214
                        if (entry != null) {
215
                                entries.add(entry);
216
                                itemSelected = entries.size() - 1;
217
                                panel.getListModel().addElement(entry.getStrEntry());
218
                                setValues(itemSelected);
219

    
220
                                removeButton.setEnabled(true);
221
                                panel.callValueChanged();
222
                        }
223
                        return;
224
                }
225

    
226
                // Elimina elementos de la lista
227
                if (e.getSource() == removeButton) {
228
                        deleteSelected();
229
                        return;
230
                }
231
                
232
                if (e.getSource() == selectColorButton) {
233
                        colorToolButton();
234
                        return;
235
                }
236

    
237
                if (e.getSource() == cbActivar) {
238
                        panel.setControlEnabled(cbActivar.isSelected());
239
                        panel.callValueChanged();
240
                        return;
241
                }
242
        }
243

    
244
        private void deleteSelected() {
245
                if (itemSelected == -1)
246
                        return;
247

    
248
                entries.remove(itemSelected);
249
                panel.getListModel().remove(itemSelected);
250

    
251
                if (itemSelected >= entries.size()) {
252
                        itemSelected = entries.size() - 1;
253
                }
254
                setValues(itemSelected);
255

    
256
                if (entries.size() == 0)
257
                        removeButton.setEnabled(false);
258
                panel.callValueChanged();
259
        }
260

    
261
        /**
262
         * Establece los valores RGBA a sus componentes segun la seleccion
263
         * @param item
264
         */
265
        private void setValues(int item) {
266

    
267
                if (item >= entries.size()) {
268
                        item = entries.size() - 1;
269
                }
270

    
271
                if (entries.size() == 0) {
272
                        rgbInputPanel.getTRed().setValue(0);
273
                        rgbInputPanel.getTRed().setChecked(true);
274
                        rgbInputPanel.getTGreen().setValue(0);
275
                        rgbInputPanel.getTGreen().setChecked(true);
276
                        rgbInputPanel.getTBlue().setValue(0);
277
                        rgbInputPanel.getTBlue().setChecked(true);
278
                        rgbInputPanel.getTAlpha().setValue(255);
279
                        rgbInputPanel.getTAlpha().setChecked(false);
280
                        andRb.setSelected(true);
281
                        orRb.setSelected(false);
282
                        return;
283
                }
284
                TransparencyRange tr = (TransparencyRange) entries.get(item);
285

    
286
                andRb.setSelected(tr.isAnd());
287
                orRb.setSelected(!tr.isAnd());
288

    
289
                if (tr.getRed() == null) {
290
                        rgbInputPanel.getTRed().setValue(0);
291
                        rgbInputPanel.getTRed().setChecked(false);
292
                } else {
293
                        rgbInputPanel.getTRed().setValue(tr.getRed()[0]);
294
                        rgbInputPanel.getTRed().setChecked(true);
295
                }
296

    
297
                if (tr.getGreen() == null) {
298
                        rgbInputPanel.getTGreen().setValue(0);
299
                        rgbInputPanel.getTGreen().setChecked(false);
300
                } else {
301
                        rgbInputPanel.getTGreen().setValue(tr.getGreen()[0]);
302
                        rgbInputPanel.getTGreen().setChecked(true);
303
                }
304

    
305
                if (tr.getBlue() == null) {
306
                        rgbInputPanel.getTBlue().setValue(0);
307
                        rgbInputPanel.getTBlue().setChecked(false);
308
                } else {
309
                        rgbInputPanel.getTBlue().setValue(tr.getBlue()[0]);
310
                        rgbInputPanel.getTBlue().setChecked(true);
311
                }
312

    
313
                int alpha = 255 - tr.getAlpha();
314
                rgbInputPanel.getTAlpha().setValue(alpha);
315
                rgbInputPanel.getTAlpha().setChecked(alpha != 255);
316

    
317
                if (list.getSelectedIndex() != item) {
318
                        list.setSelectedIndex(item);
319
                }
320
        }
321

    
322
        /**
323
         * Obtiene el array de entradas de valores a?adidos a la lista
324
         * @return ArrayList
325
         */
326
        public ArrayList<TransparencyRange> getEntries() {
327
                return entries;
328
        }
329

    
330
        /*
331
         * (non-Javadoc)
332
         * @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
333
         */
334
        public void valueChanged(ListSelectionEvent e) {
335
                eventsDisabled = true;
336
                if (list.getSelectedIndex() != -1)
337
                        itemSelected = list.getSelectedIndex();
338

    
339
                setValues(itemSelected);
340
                eventsDisabled = false;
341
        }
342

    
343
        /*
344
         * (non-Javadoc)
345
         * @see org.gvsig.gui.beans.doubleslider.DoubleSliderListener#actionValueChanged(org.gvsig.gui.beans.doubleslider.DoubleSliderEvent)
346
         */
347
        public void actionValueChanged(DoubleSliderEvent e) {
348
                if (eventsDisabled)
349
                        return;
350
                eventsDisabled = true;
351
                updateData();
352
                eventsDisabled = false;
353
        }
354

    
355
        /**
356
         * Habilita o deshabilita la gestion de eventos
357
         * @param value
358
         */
359
        public void setEventsDisabled(boolean value) {
360
                eventsDisabled = value;
361
        }
362

    
363
        /*
364
         * (non-Javadoc)
365
         * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
366
         */
367
        public void mouseClicked(MouseEvent e) {
368
                if (e.getSource() == list)
369
                        // Si es doble click borramos el seleccionado
370
                        if (e.getClickCount() == 2)
371
                                deleteSelected();
372
        }
373

    
374
        /*
375
         * (non-Javadoc)
376
         * @see org.gvsig.rastertools.toolselectrgb.ISelectRGB#actionRGBSelected(int, int, int)
377
         */
378
        public void actionRGBSelected(int r, int g, int b) {
379
                rgbInputPanel.getTRed().setValue(r);
380
                rgbInputPanel.getTGreen().setValue(g);
381
                rgbInputPanel.getTBlue().setValue(b);
382
        }
383

    
384
        public void actionValueDragged(DoubleSliderEvent e) {}
385
        public void mouseEntered(MouseEvent e) {}
386
        public void mouseExited(MouseEvent e) {}
387
        public void mousePressed(MouseEvent e) {}
388
        public void mouseReleased(MouseEvent e) {}
389
}