Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libUIComponent / src / org / gvsig / gui / beans / treelist / TreeListContainer.java @ 11625

History | View | Annotate | Download (9.85 KB)

1
/* 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;
20

    
21
import java.awt.BorderLayout;
22
import java.awt.Dimension;
23
import java.awt.event.ActionEvent;
24
import java.awt.event.ActionListener;
25
import java.util.ArrayList;
26
import java.util.Hashtable;
27
import java.util.Iterator;
28

    
29
import javax.swing.DefaultListModel;
30
import javax.swing.JButton;
31
import javax.swing.JList;
32
import javax.swing.JPanel;
33
import javax.swing.JScrollPane;
34
import javax.swing.JSplitPane;
35
import javax.swing.JTree;
36
import javax.swing.ListSelectionModel;
37
import javax.swing.event.ListSelectionEvent;
38
import javax.swing.event.ListSelectionListener;
39
import javax.swing.event.TreeSelectionEvent;
40
import javax.swing.event.TreeSelectionListener;
41
import javax.swing.tree.DefaultMutableTreeNode;
42
import javax.swing.tree.DefaultTreeModel;
43
import javax.swing.tree.TreePath;
44

    
45
import org.gvsig.gui.beans.treelist.event.TreeListChangeEvent;
46
import org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener;
47
import org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener;
48
import org.gvsig.gui.beans.treelist.listeners.TreeListListener;
49
import org.gvsig.i18n.Messages;
50

    
51
/**
52
 * Componente consistente en un men? de arbol al que se le pueden a?adir entradas
53
 * y una lista de elementos debajo de este. 
54
 * Haciendo doble click o arrastrando un elemento del men? a la lista este queda a?adido
55
 * en esta. Haciendo doble click en un elemento de la lista se elimina de esta y arrastrando
56
 * elementos dentro de la lista se varia su posici?n en ella.
57
 * Nacho Brodin (brodin_ign@gva.es)
58
 */
59

    
60
public class TreeListContainer extends JPanel implements ActionListener, TreeSelectionListener, ListSelectionListener {
61
        private static final long serialVersionUID = 6665259638830401366L;
62
        private Hashtable        map;
63
        
64
        private JScrollPane pTree = null;
65
        private JScrollPane pList = null;
66
        private JTree tree = null;
67
        private JList list = null;
68
        private JButton bAdd = null;
69
        private JButton bDel = null;
70
        private DefaultMutableTreeNode raiz = null;
71
        private TreeListListener listener = null;
72
        private ArrayList                listListeners = new ArrayList();
73
        private JSplitPane jSplitPane1 = null;
74
        private JPanel jPanelButtons = null;
75

    
76
        /**
77
         * This method initializes 
78
         */
79
        public TreeListContainer() {
80
                super();
81
                listener = new TreeListListener();
82
                initialize();
83
                listener.setList(getList());
84
                listener.setTree(getTree());
85
                this.setPreferredSize(new Dimension(160, 0));
86
                getTree().addTreeSelectionListener(this);
87
                getList().addListSelectionListener(this);
88
        }
89

    
90
        /**
91
         * This method initializes this
92
         */
93
        private void initialize() {
94
                map = new Hashtable();
95
                raiz =  new DefaultMutableTreeNode(Messages.getText("filtros"));
96
                setLayout(new BorderLayout());
97
                
98
                getPList().setMinimumSize(new Dimension(0, 60));
99
                jSplitPane1 = new JSplitPane();
100
                jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
101
                jSplitPane1.setTopComponent(getPTree());
102
                jSplitPane1.setRightComponent(getPList());
103
                jSplitPane1.setResizeWeight(1.0);
104
                jSplitPane1.setContinuousLayout(true);
105
//                jSplitPane1.setOneTouchExpandable(true);
106
                this.add(jSplitPane1, BorderLayout.CENTER);
107
                this.add(getJPanelButtons(), BorderLayout.SOUTH);
108
        }
109

    
110
        private JPanel getJPanelButtons() {
111
                if (jPanelButtons == null) {
112
                        jPanelButtons = new JPanel();
113
                        jPanelButtons.setPreferredSize(new Dimension(0, 30));
114
                        bAdd = new JButton("+");
115
                        bDel = new JButton("-");
116
                        jPanelButtons.add(bAdd);
117
                        jPanelButtons.add(bDel);
118
                        bAdd.addActionListener(this);
119
                        bDel.addActionListener(this);
120
                }
121
                return jPanelButtons;
122
        }
123
        
124
        /**
125
         * This method initializes jPanel        
126
         *         
127
         * @return javax.swing.JPanel        
128
         */
129
        private JScrollPane getPTree() {
130
                if (pTree == null) {
131
                        pTree = new JScrollPane();
132
                        pTree.setViewportBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
133
                        pTree.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
134
                        pTree.setViewportView(getTree());
135
                }
136
                return pTree;
137
        }
138

    
139
        /**
140
         * This method initializes jPanel1        
141
         *         
142
         * @return javax.swing.JPanel        
143
         */
144
        private JScrollPane getPList() {
145
                if (pList == null) {
146
                        pList = new JScrollPane();
147
                        pList.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));
148
                        pList.setBackground(java.awt.Color.white);
149
                        pList.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
150
                        pList.setViewportView(getList());
151
                }
152
                return pList;
153
        }
154

    
155
        /**
156
         * This method initializes jTree        
157
         *         
158
         * @return javax.swing.JTree        
159
         */
160
        public JTree getTree() {
161
                if (tree == null) {
162
                        tree = new JTree(raiz);
163
                        tree.addMouseListener(listener);
164
                        tree.addMouseMotionListener(listener);
165
                }
166
                return tree;
167
        }
168

    
169
        /**
170
         * This method initializes jList        
171
         *         
172
         * @return javax.swing.JList        
173
         */
174
        public JList getList() {
175
                if (list == null) {
176
                        DefaultListModel m = new DefaultListModel(); 
177
                        list = new JList(m);
178
                        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
179
                        list.addMouseListener(listener);
180
                        list.addMouseMotionListener(listener);
181
                }
182
                return list;
183
        }
184
        
185
        //-------------------------------------------
186
        //M?TODOS DE ARBOL
187
        
188
        /**
189
         * A?ade una nueva categoria al arbol
190
         * @param name        Etiqueta que aparece en el arbol. 
191
         * @param pos        Posici?n en el arbol de la nueva categoria
192
         */
193
        public void addClass(String name, int pos){
194
                DefaultTreeModel model =(DefaultTreeModel)tree.getModel();
195
                DefaultMutableTreeNode r = new DefaultMutableTreeNode( name );
196
                model.insertNodeInto(r, raiz, pos);
197
        }
198
        
199
        /**
200
         * A?ade una entrada a una categoria
201
         * @param name Nombre de la entrada a a?adir
202
         * @param parentName Categoria a la que a?adimos
203
         * @param value Valor asociado a la entrada
204
         */
205
        public void addEntry(String name, String parentName, String value){
206
                DefaultTreeModel model =(DefaultTreeModel)tree.getModel();
207
                for(int i = 0; i < model.getChildCount(raiz); i++){
208
                        if(model.getChild(raiz, i).toString().equals(parentName)){
209
                                DefaultMutableTreeNode node = (DefaultMutableTreeNode)model.getChild(raiz, i);
210
                                node.add(new DefaultMutableTreeNode(name));
211
                                if (value!=null)
212
                                        map.put(name,value);
213
                        }
214
                }
215
        }
216

    
217
        /**
218
         * M?todo que comprueba si una entrada existe en la lista.
219
         * @param value Valor que se quiere comprobar si est? en la lista
220
         * @return true si el valor est? en la lista y false si no lo est?
221
         */
222
        public boolean isInList(String value){
223
                DefaultListModel model = (DefaultListModel)getList().getModel();
224
                for(int i = 0; i < model.getSize(); i++)
225
                        if(((String)model.get(i)).equals(value))
226
                                return true;
227
                return false;
228
        }
229
        
230
        /**
231
         * A?ade un listener TreeListComponent
232
         * @param e
233
         */
234
        public void addTreeListListener(TreeListComponentListener e){
235
                listListeners.add(e);
236
                listener.setListeners(listListeners);
237
        }
238
        
239
        /**
240
         * A?ade un elemento a la lista 
241
         * @param element Elemento a a?adir
242
         */
243
        public void addElementInList(String element){
244
                DefaultListModel model = (DefaultListModel)getList().getModel();        
245
                model.addElement(element);
246
        }
247
        
248
        /**
249
         * Elimina un elemento a la lista 
250
         * @param element Elemento a eliminar
251
         */
252
        public void removeElementInList(String element){
253
                DefaultListModel model = (DefaultListModel)getList().getModel();        
254
                model.removeElement(element);
255
        }
256
        
257
        /**
258
         * Elimina un elemento a la lista por indice 
259
         * @param element Indice del elemento a eliminar
260
         */
261
        public void removeElementInList(int element){
262
                DefaultListModel model = (DefaultListModel)getList().getModel();        
263
                model.remove(element);
264
        }
265

    
266
        public Hashtable getMap() {
267
                return map;
268
        }
269

    
270
        public void setMap(Hashtable map) {
271
                this.map = map;
272
        }
273

    
274
        public void actionPerformed(ActionEvent e) {
275
                if (e.getSource() == bAdd) {
276
                        listener.insertElement();
277
                }
278
                if (e.getSource() == bDel) {
279
                        listener.deleteElement();
280
                }
281
        }
282
        
283
        /**
284
         * A?adir el disparador de cuando se pulsa un bot?n.
285
         * @param listener
286
         */
287
        private ArrayList actionChangeListeners = new ArrayList();
288

    
289
        public void addChangeSelectionListener(TreeListChangeListener listener) {
290
                if (!actionChangeListeners.contains(listener))
291
                        actionChangeListeners.add(listener);
292
        }
293

    
294
        /**
295
         * Borrar el disparador de eventos de los botones.
296
         * @param listener
297
         */
298
        public void removeChangeSelectionListener(TreeListChangeListener listener) {
299
                actionChangeListeners.remove(listener);
300
        }
301
        
302
        private void callActionChangeListeners(String item) {
303
                Iterator acIterator = actionChangeListeners.iterator();
304
                while (acIterator.hasNext()) {
305
                        TreeListChangeListener listener = (TreeListChangeListener) acIterator.next();
306
                        listener.actionChangeSelection(new TreeListChangeEvent(this, item));
307
                }
308
        }
309

    
310
        public void valueChanged(TreeSelectionEvent e) {
311
                String draggLabel = null;
312
                if(e.getSource() == tree){
313
                        TreePath[] tp = tree.getSelectionPaths();
314
                        if(tp != null){
315
                                String val = tp[0].toString();
316
                                //Comprobamos que se haya pinchado sobre una rama
317
                                String[] pathTree = val.split(", ");
318
                                if(pathTree.length > 2) {
319
                                        draggLabel = val.substring(val.lastIndexOf(", ") + 2, val.lastIndexOf("]"));
320
                                        callActionChangeListeners(draggLabel);
321
                                }
322
                        }
323
                }
324
        }
325

    
326
        public void valueChanged(ListSelectionEvent e) {
327
                if (!e.getValueIsAdjusting()) {
328
                        callActionChangeListeners(getList().getSelectedValue().toString());
329
                }
330
        }
331
}