Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / properties / control / TranspByPixelListener.java @ 19224

History | View | Annotate | Download (11.6 KB)

1
/* 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.awt.event.MouseEvent;
24
import java.awt.event.MouseListener;
25
import java.util.ArrayList;
26

    
27
import javax.swing.JButton;
28
import javax.swing.JCheckBox;
29
import javax.swing.JList;
30
import javax.swing.JRadioButton;
31
import javax.swing.event.ListSelectionEvent;
32
import javax.swing.event.ListSelectionListener;
33

    
34
import org.gvsig.gui.beans.doubleslider.DoubleSliderEvent;
35
import org.gvsig.gui.beans.doubleslider.DoubleSliderListener;
36
import org.gvsig.raster.datastruct.TransparencyRange;
37
import org.gvsig.rastertools.properties.panels.TranspByPixelPanel;
38
import org.gvsig.rastertools.properties.panels.TranspByPixelRGBInputPanel;
39
import org.gvsig.rastertools.toolselectrgb.ISelectRGB;
40
import org.gvsig.rastertools.toolselectrgb.SelectRGBListener;
41

    
42
import com.iver.andami.PluginServices;
43
import com.iver.andami.ui.mdiManager.IWindow;
44
import com.iver.cit.gvsig.fmap.MapControl;
45
import com.iver.cit.gvsig.fmap.tools.Behavior.Behavior;
46
import com.iver.cit.gvsig.fmap.tools.Behavior.MouseMovementBehavior;
47
import com.iver.cit.gvsig.fmap.tools.Behavior.PointBehavior;
48
import com.iver.cit.gvsig.project.documents.view.gui.View;
49
/**
50
 * Maneja los eventos para el panel de transparencia por pixel.
51
 * 
52
 * @author Nacho Brodin (nachobrodin@gmail.com)
53
 */
54
public class TranspByPixelListener implements ActionListener, ListSelectionListener, DoubleSliderListener, MouseListener, ISelectRGB {
55
        private ArrayList                  entries        = new ArrayList();
56
        private JButton                    addButton      = null;
57
        private JButton                    removeButton   = null;
58
        private JButton                    selectColorButton = null;
59
        private JCheckBox                  cbActivar      = null;
60
        private JList                      list           = null;
61
        private JRadioButton               andRb          = null;
62
        private JRadioButton               orRb           = null;
63
        private TranspByPixelPanel         panel          = null;
64
        private TranspByPixelRGBInputPanel rgbInputPanel  = null;
65
        private boolean                    eventsDisabled = false;
66
        private int                        itemSelected   = -1;
67
        private String viewName = "";
68

    
69
        /**
70
         * This is the default constructor
71
         */
72
        public TranspByPixelListener(TranspByPixelPanel panel) {
73
                View view = (View) PluginServices.getMDIManager().getActiveWindow();
74
                viewName = PluginServices.getMDIManager().getWindowInfo(view).getTitle();
75
                
76
                this.panel = panel;
77
                rgbInputPanel = panel.getPRGBInput();
78
                list = panel.getJList();
79

    
80
                addButton = panel.getBAdd();
81
                removeButton = panel.getBRemove();
82
                selectColorButton = panel.getBSelectColor();
83
                andRb = panel.getPOperation().getRbAnd();
84
                orRb = panel.getPOperation().getRbOr();
85
                cbActivar = panel.getActiveCheck();
86

    
87
                addButton.addActionListener(this);
88
                removeButton.addActionListener(this);
89
                andRb.addActionListener(this);
90
                orRb.addActionListener(this);
91
                cbActivar.addActionListener(this);
92
                selectColorButton.addActionListener(this);
93

    
94
                list.addListSelectionListener(this);
95

    
96
                panel.getPRGBInput().getTBlue().addValueChangedListener(this);
97
                panel.getPRGBInput().getTGreen().addValueChangedListener(this);
98
                panel.getPRGBInput().getTRed().addValueChangedListener(this);
99
                panel.getPRGBInput().getTAlpha().addValueChangedListener(this);
100
                list.addMouseListener(this);
101
        }
102

    
103
        /**
104
         * Obtiene el objeto TransparencyRange equivalente a los valores RGBA
105
         * seleccionados.
106
         *
107
         * @return TransparencyRange o null si la selecci?n no es correcta.
108
         */
109
        private TransparencyRange getEntrySelected() {
110
                if (!rgbInputPanel.isValidValue())
111
                        return null;
112

    
113
                TransparencyRange entry = new TransparencyRange();
114
                entry.setRed(rgbInputPanel.getRangeRed());
115
                entry.setGreen(rgbInputPanel.getRangeGreen());
116
                entry.setBlue(rgbInputPanel.getRangeBlue());
117
                if (rgbInputPanel.getTAlpha().isChecked())
118
                        entry.setAlpha(255 - rgbInputPanel.getTAlpha().getValue());
119
                else
120
                        entry.setAlpha(0);
121

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

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

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

    
147
                return entry;
148
        }
149

    
150
        public void colorToolButton() {
151
                // seleccionamos la vista de gvSIG
152
                View theView = null;
153
                try {
154
                        IWindow[] allViews = PluginServices.getMDIManager().getAllWindows();
155
                        for (int i = 0; i < allViews.length; i++) {
156
                                if (allViews[i] instanceof View &&
157
                                                PluginServices.getMDIManager().getWindowInfo((View) allViews[i]).getTitle().equals(viewName))
158
                                        theView = (View) allViews[i];
159
                        }
160
                        if (theView == null)
161
                                return;
162
                } catch (ClassCastException ex) {
163
//                        logger.error(PluginServices.getText(this, "cant_get_view "), ex);
164
                        return;
165
                }
166
                MapControl m_MapControl = theView.getMapControl();
167
                
168
                TranspByPixelStatusBarListener sbl = new TranspByPixelStatusBarListener(m_MapControl);
169

    
170
                // Cortar Raster
171
                SelectRGBListener selectRGBListener = new SelectRGBListener(m_MapControl, this);
172
                m_MapControl.addMapTool("selectColorRaster", new Behavior[] {
173
                                new PointBehavior(selectRGBListener), new MouseMovementBehavior(sbl)
174
                                }
175
                );
176

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

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

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

    
203
                if ((e.getSource() == andRb) || (e.getSource() == orRb)) {
204
                        updateData();
205
                        return;
206
                }
207

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

    
217
                                removeButton.setEnabled(true);
218
                                panel.callValueChanged();
219
                        }
220
                        return;
221
                }
222

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

    
234
                if (e.getSource() == cbActivar) {
235
                        panel.setControlEnabled(cbActivar.isSelected());
236
                        panel.callValueChanged();
237
                        return;
238
                }
239
        }
240

    
241
        private void deleteSelected() {
242
                if (itemSelected == -1)
243
                        return;
244

    
245
                entries.remove(itemSelected);
246
                panel.getListModel().remove(itemSelected);
247

    
248
                if (itemSelected >= entries.size()) {
249
                        itemSelected = entries.size() - 1;
250
                }
251
                setValues(itemSelected);
252

    
253
                if (entries.size() == 0)
254
                        removeButton.setEnabled(false);
255
                panel.callValueChanged();
256
        }
257

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

    
264
                if (item >= entries.size()) {
265
                        item = entries.size() - 1;
266
                }
267

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

    
283
                andRb.setSelected(tr.isAnd());
284
                orRb.setSelected(!tr.isAnd());
285

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

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

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

    
310
                int alpha = 255 - tr.getAlpha();
311
                rgbInputPanel.getTAlpha().setValue(alpha);
312
                rgbInputPanel.getTAlpha().setChecked(alpha != 255);
313

    
314
                if (list.getSelectedIndex() != item) {
315
                        list.setSelectedIndex(item);
316
                }
317
        }
318

    
319
        /**
320
         * Obtiene el array de entradas de valores a?adidos a la lista
321
         * @return ArrayList
322
         */
323
        public ArrayList getEntries() {
324
                return entries;
325
        }
326

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

    
336
                setValues(itemSelected);
337
                eventsDisabled = false;
338
        }
339

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

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

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

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

    
381
        public void actionValueDragged(DoubleSliderEvent e) {}
382
        public void mouseEntered(MouseEvent e) {}
383
        public void mouseExited(MouseEvent e) {}
384
        public void mousePressed(MouseEvent e) {}
385
        public void mouseReleased(MouseEvent e) {}
386
}