Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.ui / src / main / java / org / gvsig / gui / beans / treelist / listeners / TreeListListener.java @ 40561

History | View | Annotate | Download (8.26 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
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 3
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
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.gui.beans.treelist.listeners;
25

    
26
import java.awt.event.MouseEvent;
27
import java.awt.event.MouseListener;
28
import java.awt.event.MouseMotionListener;
29
import java.util.ArrayList;
30

    
31
import javax.swing.DefaultListModel;
32
import javax.swing.JList;
33
import javax.swing.JTree;
34
import javax.swing.tree.TreePath;
35

    
36
import org.gvsig.gui.beans.treelist.event.TreeListEvent;
37

    
38
/**
39
 * Esta clase contiene la l?gica que a?ade elementos desde el arbol a la lista, arrastrando o
40
 * haciendo doble click sobre el elemento en el arbol, elimina elementos de la lista haciendo 
41
 * doble click sobre ellos o intercambia elementos arrastrando en la lista de una posici?n 
42
 * a otra.
43
 * Nacho Brodin (brodin_ign@gva.es)
44
 */
45

    
46
public class TreeListListener implements MouseListener, MouseMotionListener, TreeListComponentListener {
47
        private JTree tree = null;
48
        private JList                                         list = null;
49
        private ArrayList                                listListeners = null;
50
        private TreeListEvent                         ev = new TreeListEvent();
51

    
52
        /**
53
         * This method initializes 
54
         * 
55
         */
56
        public TreeListListener() {
57
        }
58

    
59
        /**
60
         * Asigna la lista
61
         * @param list
62
         */
63
        public void setList(JList list) {
64
                this.list = list;
65
        }
66

    
67
        /**
68
         * Asigna el arbol
69
         * @param tree
70
         */
71
        public void setTree(JTree tree) {
72
                this.tree = tree;
73
        }
74

    
75
        //-------------------------------------------
76
        //M?TODOS DEL LISTENER
77
        
78
        //A?ADIR A LA LISTA
79
        //Pinchar con doble click el elemento del arbol
80
        
81
        //Pichar lista -> obtiene draggLabel
82
        //Arrastrar -> draggActive
83
        //Released -> !draggActive. Si enterList y se ha arrastrado y se ha pichado un elemento de la lista -> a?ade elemento
84
        
85
        //ELIMINAR DE LA LISTA
86
        //Pinchar con doble click el elemento de la lista.
87
        
88
        //CAMBIAR EL ORDEN DE LOS ELEMENTOS DE LA LISTA
89
        //Pinchar lista -> Obtiene index del elem pinchado
90
        //Arrastrar -> draggElement a true
91
        //Soltar -> si hay elemento seleccionado estamos dentro de la lista y draggElement es true -> se intercambiar
92
        
93
        /**
94
         * Variable que contiene la etiqueta seleccionada y arrastrado hasta la lista
95
         */
96
        private String draggLabel = null;
97
        /**
98
         * Variable que est? a true si estamos arrastrando una etiqueta
99
         */
100
        private boolean draggActive = false;
101
        /**
102
         * Variable que est? a true si el rat?n ha entrado en la lista
103
         */
104
        private boolean enterInList = false;
105
        /**
106
         * Elemento seleccionado de la lista. -1 si no hay ninguno;
107
         */
108
        private int selectElement = -1;
109
        /**
110
         * Variable que est? a true si estamos arrastrando un elemento de la lista
111
         */
112
        private boolean draggElement = false;
113
        
114
        public void deleteElement() {
115
                if (list.getSelectedIndex() != -1) {
116
                        DefaultListModel model = (DefaultListModel) list.getModel();
117

    
118
                        // Lanzamos el evento de eliminar un elemento
119
                        ev.resetValues();
120
                        ev.setElementRemoved((String) list.getSelectedValue());
121

    
122
                        model.remove(list.getSelectedIndex());
123

    
124
                        elementRemoved(ev);
125
                }
126
        }
127
        
128
        public void insertElement() {
129
                if (draggLabel != null) {
130
                        DefaultListModel model = (DefaultListModel) list.getModel();
131

    
132
                        // Si ya esta en la lista no lo a?adimos
133
                        if (model.indexOf(draggLabel) != -1) return;
134

    
135
                        // Lanzamos el evento de a?adir un elemento
136
                        ev.resetValues();
137
                        ev.setElementAdded(draggLabel);
138

    
139
                        model.addElement(draggLabel);
140
//                        draggLabel = null;
141

    
142
                        elementAdded(ev);
143
                }
144
        }
145
        
146
        public void mouseClicked(MouseEvent e) {
147
                if (e.getSource() == list)
148
                        // Si es doble click y hay alg?n elemento seleccionado en la lista lo eliminamos
149
                        if (e.getClickCount() == 2)
150
                                deleteElement();
151

    
152
                if (e.getSource() == tree)
153
                        // Si es doble click y hay alg?n elemento seleccionado en el arbol lo a?adimos
154
                        if (e.getClickCount() == 2)
155
                                insertElement();
156
        }
157
        
158
        public void mouseEntered(MouseEvent e) {
159
                if(e.getSource() == list)
160
                        enterInList = true;
161
        }
162

    
163
        public void mouseExited(MouseEvent e) {
164
                if(e.getSource() == list)
165
                        enterInList = false;
166
        }
167

    
168
        public void mousePressed(MouseEvent e) {
169
                selectElement = -1;
170
                
171
                //Al pulsar sobre el Arbol se captura el elemento seleccionado
172
                if(e.getSource() == tree){
173
                        TreePath[] tp = tree.getSelectionPaths();
174
                        if(tp != null){
175
                                String val = tp[0].toString();
176
                                //Comprobamos que se haya pinchado sobre una rama
177
                                String[] pathTree = val.split(", ");
178
                                if(pathTree.length <= 2)
179
                                        draggLabel = null;
180
                                else
181
                                        draggLabel = val.substring(val.lastIndexOf(", ") + 2, val.lastIndexOf("]"));
182
                        }
183
                }
184
                
185
                //Al pulsar sobre la lista capturamos el elemento seleccionado
186
                if(e.getSource() == list){
187
                        selectElement = list.getSelectedIndex();
188
                        if(selectElement < 0)
189
                                return;
190
                        
191
                        //Capturamos datos para el evento elementMoved
192
                        ev.resetValues();
193
                        ev.setPositionSourceElement(selectElement);
194
                        ev.setSourceElement((String)((DefaultListModel)list.getModel()).getElementAt(selectElement));
195
                }
196
        }
197

    
198
        public void mouseReleased(MouseEvent e) {
199
                //Si se ha pinchado sobre un elemento del arbol y se ha arrastrado lo a?adimos
200
                if (enterInList){
201
                        if (draggLabel != null && draggActive == true) {
202
                                insertElement();
203
/*                                DefaultListModel model = (DefaultListModel)list.getModel();
204
                                
205
                                //Lanzamos el evento de a?adir un elemento
206
                                ev.setElementAdded(draggLabel);
207
                                elementAdded(ev);
208
                                
209
                                model.addElement(draggLabel);
210
*/
211
                                draggLabel = null;
212
                        }
213
                }
214
                
215
                //Si se est? arrastrando un elemento de la lista se intercambia por el lugar donde se suelta
216
                if(draggElement && e.getSource() == list && selectElement != -1){
217
                        if(list.getSelectedIndex() != selectElement){
218
                                DefaultListModel model = (DefaultListModel)list.getModel();
219
                                int posDst = list.getSelectedIndex();
220
                                String elemOrig = (String)model.getElementAt(selectElement);
221
                                
222
                                ev.setPositionDestElement(posDst);
223
                                ev.setDestElement((String)((DefaultListModel)list.getModel()).getElementAt(posDst));
224
                                
225
                                model.remove(selectElement);
226
                                model.insertElementAt(elemOrig, posDst);
227

    
228
                                elementMoved(ev);
229
                        }
230
                }
231
                
232
                //Al levantar el click del rat?n desactivamos los arrastres
233
                draggActive = false;
234
                draggElement = false;
235
                selectElement = -1;
236
        }
237
                
238
        public void mouseDragged(MouseEvent e) {
239
                //Al arrastrar desde el arbor se pone draggActive a true se se ha pinchado antes en un elemento
240
                if(e.getSource() == tree){
241
                        if(draggLabel != null)
242
                                draggActive = true;
243
                }
244
                
245
                if(e.getSource() == list){
246
                        if(selectElement != -1)
247
                                draggElement = true;
248
                }
249
        }
250

    
251
        public void mouseMoved(MouseEvent e) {
252
        }        
253
        
254
        /**
255
         * A?ade la lista de listeners
256
         * @param l
257
         */
258
        public void setListeners(ArrayList l){
259
                this.listListeners = l;
260
        }
261

    
262
        /**
263
         * Ejecutamos el m?todo elementAdded de todos los listeners registrados
264
         * @param e TreeListEvent
265
         */
266
        public void elementAdded(TreeListEvent e) {
267
                if(listListeners == null || listListeners.size() == 0)
268
                        return;
269
                for(int i = 0; i < listListeners.size(); i++)
270
                        ((TreeListComponentListener)listListeners.get(i)).elementAdded(e);
271
        }
272
        
273
        /**
274
         * Ejecutamos el m?todo elementRemoved de todos los listeners registrados
275
         * @param e TreeListEvent
276
         */
277
        public void elementRemoved(TreeListEvent e) {
278
                if(listListeners == null || listListeners.size() == 0)
279
                        return;
280
                for(int i = 0; i < listListeners.size(); i++)
281
                        ((TreeListComponentListener)listListeners.get(i)).elementRemoved(e);
282
        }
283

    
284
        /**
285
         * Ejecutamos el m?todo elementMoved de todos los listeners registrados
286
         * @param e TreeListEvent
287
         */
288
        public void elementMoved(TreeListEvent e) {
289
                if(listListeners == null || listListeners.size() == 0)
290
                        return;
291
                for(int i = 0; i < listListeners.size(); i++)
292
                        ((TreeListComponentListener)listListeners.get(i)).elementMoved(e);
293
        }
294
}