Statistics
| Revision:

root / trunk / libraries / libUIComponent_praster / src / org / gvsig / gui / beans / treelist / listeners / TreeListListener.java @ 8026

History | View | Annotate | Download (8.06 KB)

1 8026 nacho
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 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.gui.beans.treelist.listeners;
20
21
import java.awt.event.MouseEvent;
22
import java.awt.event.MouseListener;
23
import java.awt.event.MouseMotionListener;
24
import java.util.ArrayList;
25
26
import javax.swing.DefaultListModel;
27
import javax.swing.JList;
28
import javax.swing.JTree;
29
import javax.swing.tree.DefaultMutableTreeNode;
30
import javax.swing.tree.TreePath;
31
32
import org.gvsig.gui.beans.treelist.event.TreeListEvent;
33
34
/**
35
 * Esta clase contiene la l?gica que a?ade elementos desde el arbol a la lista, arrastrando o
36
 * haciendo doble click sobre el elemento en el arbol, elimina elementos de la lista haciendo
37
 * doble click sobre ellos o intercambia elementos arrastrando en la lista de una posici?n
38
 * a otra.
39
 * Nacho Brodin (brodin_ign@gva.es)
40
 */
41
42
public class TreeListListener implements MouseListener,  MouseMotionListener, TreeListComponentListener{
43
44
        private JTree                                         tree = null;
45
        private JList                                         list = null;
46
        private DefaultMutableTreeNode         raiz = null;
47
        private ArrayList                                listListeners = null;
48
        private TreeListEvent                         ev = new TreeListEvent();
49
50
51
        /**
52
         * This method initializes
53
         *
54
         */
55
        public TreeListListener() {
56
        }
57
58
        /**
59
         * Asigna la lista
60
         * @param list
61
         */
62
        public void setList(JList list) {
63
                this.list = list;
64
        }
65
66
        /**
67
         * Asigna el arbol
68
         * @param tree
69
         */
70
        public void setTree(JTree tree) {
71
                this.tree = tree;
72
        }
73
74
        //-------------------------------------------
75
        //M?TODOS DEL LISTENER
76
77
        //A?ADIR A LA LISTA
78
        //Pinchar con doble click el elemento del arbol
79
80
        //Pichar lista -> obtiene draggLabel
81
        //Arrastrar -> draggActive
82
        //Released -> !draggActive. Si enterList y se ha arrastrado y se ha pichado un elemento de la lista -> a?ade elemento
83
84
        //ELIMINAR DE LA LISTA
85
        //Pinchar con doble click el elemento de la lista.
86
87
        //CAMBIAR EL ORDEN DE LOS ELEMENTOS DE LA LISTA
88
        //Pinchar lista -> Obtiene index del elem pinchado
89
        //Arrastrar -> draggElement a true
90
        //Soltar -> si hay elemento seleccionado estamos dentro de la lista y draggElement es true -> se intercambiar
91
92
        /**
93
         * Variable que contiene la etiqueta seleccionada y arrastrado hasta la lista
94
         */
95
        private String draggLabel = null;
96
        /**
97
         * Variable que est? a true si estamos arrastrando una etiqueta
98
         */
99
        private boolean draggActive = false;
100
        /**
101
         * Variable que est? a true si el rat?n ha entrado en la lista
102
         */
103
        private boolean enterInList = false;
104
        /**
105
         * Elemento seleccionado de la lista. -1 si no hay ninguno;
106
         */
107
        private int selectElement = -1;
108
        /**
109
         * Variable que est? a true si estamos arrastrando un elemento de la lista
110
         */
111
        private boolean draggElement = false;
112
113
        public void mouseClicked(MouseEvent e) {
114
115
                if(e.getSource() == list){
116
                        //Si es doble click y hay alg?n elemento seleccionado en la lista lo eliminamos
117
                        if(e.getClickCount() == 2 && list.getSelectedIndex() != -1){
118
                                DefaultListModel model = (DefaultListModel)list.getModel();
119
120
                                //Lanzamos el evento de eliminar un elemento
121
                                ev.resetValues();
122
                                ev.setElementRemoved((String)list.getSelectedValue());
123
                                elementRemoved(ev);
124
125
                                model.remove(list.getSelectedIndex());
126
                        }
127
                }
128
129
                if(e.getSource() == tree){
130
                        //Si es doble click y hay alg?n elemento seleccionado en el arbol lo a?adimos
131
                        if(e.getClickCount() == 2 && draggLabel != null){
132
                                DefaultListModel model = (DefaultListModel)list.getModel();
133
134
                                //Lanzamos el evento de a?adir un elemento
135
                                ev.resetValues();
136
                                ev.setElementAdded(draggLabel);
137
                                elementAdded(ev);
138
139
                                model.addElement(draggLabel);
140
                                draggLabel = null;
141
                        }
142
                }
143
        }
144
145
        public void mouseEntered(MouseEvent e) {
146
                if(e.getSource() == list)
147
                        enterInList = true;
148
149
        }
150
151
        public void mouseExited(MouseEvent e) {
152
                if(e.getSource() == list)
153
                        enterInList = false;
154
        }
155
156
157
158
        public void mousePressed(MouseEvent e) {
159
                selectElement = -1;
160
161
                //Al pulsar sobre el Arbol se captura el elemento seleccionado
162
                if(e.getSource() == tree){
163
                        TreePath[] tp = tree.getSelectionPaths();
164
                        if(tp != null){
165
                                String val = tp[0].toString();
166
                                //Comprobamos que se haya pinchado sobre una rama
167
                                String[] pathTree = val.split(", ");
168
                                if(pathTree.length <= 2)
169
                                        draggLabel = null;
170
                                else
171
                                        draggLabel = val.substring(val.lastIndexOf(", ") + 2, val.lastIndexOf("]"));
172
                        }
173
                }
174
175
                //Al pulsar sobre la lista capturamos el elemento seleccionado
176
                if(e.getSource() == list){
177
                        selectElement = list.getSelectedIndex();
178
                        if(selectElement < 0)
179
                                return;
180
181
                        //Capturamos datos para el evento elementMoved
182
                        ev.resetValues();
183
                        ev.setPositionSourceElement(selectElement);
184
                        ev.setSourceElement((String)((DefaultListModel)list.getModel()).getElementAt(selectElement));
185
                }
186
        }
187
188
189
        public void mouseReleased(MouseEvent e) {
190
191
                //Si se ha pinchado sobre un elemento del arbol y se ha arrastrado lo a?adimos
192
                if(enterInList){
193
                        if(draggLabel != null && draggActive == true){
194
                                DefaultListModel model = (DefaultListModel)list.getModel();
195
196
                                //Lanzamos el evento de a?adir un elemento
197
                                ev.setElementAdded(draggLabel);
198
                                elementAdded(ev);
199
200
                                model.addElement(draggLabel);
201
                                draggLabel = null;
202
                        }
203
                }
204
205
                //Si se est? arrastrando un elemento de la lista se intercambia por el lugar donde se suelta
206
                if(draggElement && e.getSource() == list && selectElement != -1){
207
                        if(list.getSelectedIndex() != selectElement){
208
                                DefaultListModel model = (DefaultListModel)list.getModel();
209
                                int posDst = list.getSelectedIndex();
210
                                String elemOrig = (String)model.getElementAt(selectElement);
211
212
                                ev.setPositionDestElement(posDst);
213
                                ev.setDestElement((String)((DefaultListModel)list.getModel()).getElementAt(posDst));
214
215
                                model.remove(selectElement);
216
                                model.insertElementAt(elemOrig, posDst);
217
                        }
218
                }
219
220
                //Al levantar el click del rat?n desactivamos los arrastres
221
                draggActive = false;
222
                draggElement = false;
223
                selectElement = -1;
224
225
        }
226
227
        public void mouseDragged(MouseEvent e) {
228
                //Al arrastrar desde el arbor se pone draggActive a true se se ha pinchado antes en un elemento
229
                if(e.getSource() == tree){
230
                        if(draggLabel != null)
231
                                draggActive = true;
232
                }
233
234
                if(e.getSource() == list){
235
                        if(selectElement != -1)
236
                                draggElement = true;
237
                }
238
        }
239
240
        public void mouseMoved(MouseEvent e) {
241
242
        }
243
244
        /**
245
         * A?ade la lista de listeners
246
         * @param l
247
         */
248
        public void setListeners(ArrayList l){
249
                this.listListeners = l;
250
        }
251
252
        /**
253
         * Ejecutamos el m?todo elementAdded de todos los listeners registrados
254
         * @param e TreeListEvent
255
         */
256
        public void elementAdded(TreeListEvent e) {
257
                if(listListeners == null || listListeners.size() == 0)
258
                        return;
259
                for(int i = 0; i < listListeners.size(); i++)
260
                        ((TreeListComponentListener)listListeners.get(i)).elementAdded(e);
261
        }
262
263
        /**
264
         * Ejecutamos el m?todo elementRemoved de todos los listeners registrados
265
         * @param e TreeListEvent
266
         */
267
        public void elementRemoved(TreeListEvent e) {
268
                if(listListeners == null || listListeners.size() == 0)
269
                        return;
270
                for(int i = 0; i < listListeners.size(); i++)
271
                        ((TreeListComponentListener)listListeners.get(i)).elementRemoved(e);
272
        }
273
274
        /**
275
         * Ejecutamos el m?todo elementMoved de todos los listeners registrados
276
         * @param e TreeListEvent
277
         */
278
        public void elementMoved(TreeListEvent e) {
279
                if(listListeners == null || listListeners.size() == 0)
280
                        return;
281
                for(int i = 0; i < listListeners.size(); i++)
282
                        ((TreeListComponentListener)listListeners.get(i)).elementMoved(e);
283
        }
284
285
}