root / trunk / libraries / libUIComponent / src / org / gvsig / gui / beans / treelist / TreeListContainer.java @ 13136
History | View | Annotate | Download (11 KB)
1 | 10741 | 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; |
||
20 | |||
21 | 11440 | bsanchez | import java.awt.BorderLayout; |
22 | import java.awt.Dimension; |
||
23 | 12592 | bsanchez | import java.awt.FlowLayout; |
24 | 11440 | bsanchez | import java.awt.event.ActionEvent; |
25 | import java.awt.event.ActionListener; |
||
26 | 10741 | nacho | import java.util.ArrayList; |
27 | import java.util.Hashtable; |
||
28 | 11625 | bsanchez | import java.util.Iterator; |
29 | 10741 | nacho | |
30 | import javax.swing.DefaultListModel; |
||
31 | 12343 | bsanchez | import javax.swing.ImageIcon; |
32 | 11440 | bsanchez | import javax.swing.JButton; |
33 | 10741 | nacho | import javax.swing.JList; |
34 | import javax.swing.JPanel; |
||
35 | import javax.swing.JScrollPane; |
||
36 | 11440 | bsanchez | import javax.swing.JSplitPane; |
37 | 10741 | nacho | import javax.swing.JTree; |
38 | 11750 | bsanchez | import javax.swing.ListModel; |
39 | 10741 | nacho | import javax.swing.ListSelectionModel; |
40 | 11625 | bsanchez | import javax.swing.event.ListSelectionEvent; |
41 | import javax.swing.event.ListSelectionListener; |
||
42 | import javax.swing.event.TreeSelectionEvent; |
||
43 | import javax.swing.event.TreeSelectionListener; |
||
44 | 10741 | nacho | import javax.swing.tree.DefaultMutableTreeNode; |
45 | import javax.swing.tree.DefaultTreeModel; |
||
46 | 11625 | bsanchez | import javax.swing.tree.TreePath; |
47 | 10741 | nacho | |
48 | 11625 | bsanchez | import org.gvsig.gui.beans.treelist.event.TreeListChangeEvent; |
49 | import org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener; |
||
50 | 10741 | nacho | import org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener; |
51 | import org.gvsig.gui.beans.treelist.listeners.TreeListListener; |
||
52 | 12592 | bsanchez | import org.gvsig.gui.beans.messages.Messages; |
53 | 10741 | nacho | /**
|
54 | 11912 | bsanchez | * Componente consistente en un men? de arbol al que se le pueden a?adir
|
55 | * entradas y una lista de elementos debajo de este. Haciendo doble click o
|
||
56 | * arrastrando un elemento del men? a la lista este queda a?adido en esta.
|
||
57 | * Haciendo doble click en un elemento de la lista se elimina de esta y
|
||
58 | * arrastrando elementos dentro de la lista se varia su posici?n en ella.
|
||
59 | 12343 | bsanchez | *
|
60 | 11912 | bsanchez | * @version 31/05/2007
|
61 | * @author Nacho Brodin (brodin_ign@gva.es)
|
||
62 | 10741 | nacho | */
|
63 | 11625 | bsanchez | public class TreeListContainer extends JPanel implements ActionListener, TreeSelectionListener, ListSelectionListener { |
64 | 12343 | bsanchez | private static final long serialVersionUID = 6665259638830401366L; |
65 | private ArrayList listListeners = new ArrayList(); |
||
66 | 11912 | bsanchez | |
67 | 12343 | bsanchez | private Hashtable map = null; |
68 | 12107 | bsanchez | |
69 | 11750 | bsanchez | // Componentes visuales
|
70 | 12107 | bsanchez | private JScrollPane pTree = null; |
71 | private JScrollPane pList = null; |
||
72 | private JTree tree = null; |
||
73 | private JList list = null; |
||
74 | private JButton bAdd = null; |
||
75 | private JButton bDel = null; |
||
76 | private JSplitPane jSplitPane1 = null; |
||
77 | private JPanel jPanelButtons = null; |
||
78 | 11750 | bsanchez | |
79 | 12107 | bsanchez | private DefaultMutableTreeNode raiz = null; |
80 | private TreeListListener listener = null; |
||
81 | 12343 | bsanchez | private String pathToImages = "images/"; |
82 | 10741 | nacho | |
83 | /**
|
||
84 | 12343 | bsanchez | * This method initializes
|
85 | 10741 | nacho | */
|
86 | public TreeListContainer() {
|
||
87 | super();
|
||
88 | listener = new TreeListListener();
|
||
89 | initialize(); |
||
90 | listener.setList(getList()); |
||
91 | listener.setTree(getTree()); |
||
92 | 11440 | bsanchez | this.setPreferredSize(new Dimension(160, 0)); |
93 | 11625 | bsanchez | getTree().addTreeSelectionListener(this);
|
94 | getList().addListSelectionListener(this);
|
||
95 | 10741 | nacho | } |
96 | |||
97 | /**
|
||
98 | * This method initializes this
|
||
99 | */
|
||
100 | private void initialize() { |
||
101 | 12121 | bsanchez | map = new Hashtable(); |
102 | 10741 | nacho | raiz = new DefaultMutableTreeNode(Messages.getText("filtros")); |
103 | 11440 | bsanchez | setLayout(new BorderLayout()); |
104 | 11912 | bsanchez | |
105 | 11440 | bsanchez | getPList().setMinimumSize(new Dimension(0, 60)); |
106 | jSplitPane1 = new JSplitPane(); |
||
107 | jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); |
||
108 | jSplitPane1.setTopComponent(getPTree()); |
||
109 | 12592 | bsanchez | jSplitPane1.setBottomComponent(getPList()); |
110 | 11440 | bsanchez | jSplitPane1.setResizeWeight(1.0);
|
111 | jSplitPane1.setContinuousLayout(true);
|
||
112 | this.add(jSplitPane1, BorderLayout.CENTER); |
||
113 | this.add(getJPanelButtons(), BorderLayout.SOUTH); |
||
114 | 10741 | nacho | } |
115 | |||
116 | 11440 | bsanchez | private JPanel getJPanelButtons() { |
117 | if (jPanelButtons == null) { |
||
118 | jPanelButtons = new JPanel(); |
||
119 | 12592 | bsanchez | jPanelButtons.setPreferredSize(new Dimension(0, 21)); |
120 | 12343 | bsanchez | bAdd = new JButton(); |
121 | bAdd.setIcon(new ImageIcon(getClass().getResource(pathToImages + "addlayer.png"))); |
||
122 | 12592 | bsanchez | bAdd.setPreferredSize(new Dimension(22, 19)); |
123 | 12343 | bsanchez | |
124 | bDel = new JButton(); |
||
125 | bDel.setIcon(new ImageIcon(getClass().getResource(pathToImages + "delall.png"))); |
||
126 | 12592 | bsanchez | bDel.setPreferredSize(new Dimension(22, 19)); |
127 | |||
128 | |||
129 | FlowLayout flowLayout5 = new FlowLayout(); |
||
130 | flowLayout5.setHgap(5);
|
||
131 | flowLayout5.setVgap(0);
|
||
132 | flowLayout5.setAlignment(java.awt.FlowLayout.CENTER); |
||
133 | jPanelButtons.setLayout(flowLayout5); |
||
134 | |||
135 | jPanelButtons.add(bAdd, null);
|
||
136 | jPanelButtons.add(bDel, null);
|
||
137 | 11440 | bsanchez | bAdd.addActionListener(this);
|
138 | bDel.addActionListener(this);
|
||
139 | 10741 | nacho | } |
140 | 11440 | bsanchez | return jPanelButtons;
|
141 | 10741 | nacho | } |
142 | 11912 | bsanchez | |
143 | 10741 | nacho | /**
|
144 | 12343 | bsanchez | * This method initializes jPanel
|
145 | *
|
||
146 | * @return javax.swing.JPanel
|
||
147 | 10741 | nacho | */
|
148 | private JScrollPane getPTree() { |
||
149 | if (pTree == null) { |
||
150 | pTree = new JScrollPane(); |
||
151 | pTree.setViewportBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); |
||
152 | pTree.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); |
||
153 | pTree.setViewportView(getTree()); |
||
154 | } |
||
155 | return pTree;
|
||
156 | } |
||
157 | |||
158 | /**
|
||
159 | 12343 | bsanchez | * This method initializes jPanel1
|
160 | *
|
||
161 | * @return javax.swing.JPanel
|
||
162 | 10741 | nacho | */
|
163 | private JScrollPane getPList() { |
||
164 | if (pList == null) { |
||
165 | pList = new JScrollPane(); |
||
166 | pList.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED)); |
||
167 | pList.setBackground(java.awt.Color.white); |
||
168 | pList.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); |
||
169 | pList.setViewportView(getList()); |
||
170 | } |
||
171 | return pList;
|
||
172 | } |
||
173 | |||
174 | /**
|
||
175 | 12343 | bsanchez | * This method initializes jTree
|
176 | *
|
||
177 | * @return javax.swing.JTree
|
||
178 | 10741 | nacho | */
|
179 | public JTree getTree() { |
||
180 | if (tree == null) { |
||
181 | tree = new JTree(raiz); |
||
182 | tree.addMouseListener(listener); |
||
183 | tree.addMouseMotionListener(listener); |
||
184 | } |
||
185 | return tree;
|
||
186 | } |
||
187 | |||
188 | /**
|
||
189 | 12343 | bsanchez | * This method initializes jList
|
190 | *
|
||
191 | * @return javax.swing.JList
|
||
192 | 10741 | nacho | */
|
193 | public JList getList() { |
||
194 | if (list == null) { |
||
195 | 11912 | bsanchez | DefaultListModel m = new DefaultListModel(); |
196 | 10741 | nacho | list = new JList(m); |
197 | list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||
198 | list.addMouseListener(listener); |
||
199 | list.addMouseMotionListener(listener); |
||
200 | } |
||
201 | return list;
|
||
202 | } |
||
203 | 11912 | bsanchez | |
204 | 11750 | bsanchez | public ListModel getListModel() { |
205 | return list.getModel();
|
||
206 | } |
||
207 | 11912 | bsanchez | |
208 | 10741 | nacho | //-------------------------------------------
|
209 | //M?TODOS DE ARBOL
|
||
210 | 11912 | bsanchez | |
211 | 10741 | nacho | /**
|
212 | * A?ade una nueva categoria al arbol
|
||
213 | 12343 | bsanchez | * @param name Etiqueta que aparece en el arbol.
|
214 | 10741 | nacho | * @param pos Posici?n en el arbol de la nueva categoria
|
215 | */
|
||
216 | 11750 | bsanchez | public void addClass(String name, int pos) { |
217 | DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); |
||
218 | DefaultMutableTreeNode r = new DefaultMutableTreeNode(name); |
||
219 | 10741 | nacho | model.insertNodeInto(r, raiz, pos); |
220 | } |
||
221 | 11912 | bsanchez | |
222 | 10741 | nacho | /**
|
223 | * A?ade una entrada a una categoria
|
||
224 | * @param name Nombre de la entrada a a?adir
|
||
225 | * @param parentName Categoria a la que a?adimos
|
||
226 | * @param value Valor asociado a la entrada
|
||
227 | */
|
||
228 | public void addEntry(String name, String parentName, String value){ |
||
229 | 11912 | bsanchez | DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); |
230 | for (int i = 0; i < model.getChildCount(raiz); i++) { |
||
231 | if (model.getChild(raiz, i).toString().equals(parentName)) {
|
||
232 | DefaultMutableTreeNode node = (DefaultMutableTreeNode) model.getChild(raiz, i); |
||
233 | 10741 | nacho | node.add(new DefaultMutableTreeNode(name)); |
234 | 11912 | bsanchez | if (value != null) |
235 | map.put(name, value); |
||
236 | 10741 | nacho | } |
237 | } |
||
238 | } |
||
239 | |||
240 | /**
|
||
241 | 11912 | bsanchez | * M?todo que comprueba si una entrada existe en la lista de seleccion.
|
242 | 10741 | nacho | * @param value Valor que se quiere comprobar si est? en la lista
|
243 | * @return true si el valor est? en la lista y false si no lo est?
|
||
244 | */
|
||
245 | 11750 | bsanchez | public boolean isInList(String value) { |
246 | DefaultListModel model = (DefaultListModel) getList().getModel(); |
||
247 | for (int i = 0; i < model.getSize(); i++) |
||
248 | if (((String) model.get(i)).equals(value)) |
||
249 | 10741 | nacho | return true; |
250 | return false; |
||
251 | } |
||
252 | 11912 | bsanchez | |
253 | 10741 | nacho | /**
|
254 | * A?ade un listener TreeListComponent
|
||
255 | * @param e
|
||
256 | */
|
||
257 | public void addTreeListListener(TreeListComponentListener e){ |
||
258 | listListeners.add(e); |
||
259 | listener.setListeners(listListeners); |
||
260 | } |
||
261 | 11912 | bsanchez | |
262 | 10741 | nacho | /**
|
263 | 12343 | bsanchez | * A?ade un elemento a la lista
|
264 | 10741 | nacho | * @param element Elemento a a?adir
|
265 | */
|
||
266 | public void addElementInList(String element){ |
||
267 | 11912 | bsanchez | DefaultListModel model = (DefaultListModel)getList().getModel(); |
268 | 10741 | nacho | model.addElement(element); |
269 | } |
||
270 | 11912 | bsanchez | |
271 | 10741 | nacho | /**
|
272 | 12343 | bsanchez | * Elimina un elemento a la lista
|
273 | 10741 | nacho | * @param element Elemento a eliminar
|
274 | */
|
||
275 | public void removeElementInList(String element){ |
||
276 | 11912 | bsanchez | DefaultListModel model = (DefaultListModel)getList().getModel(); |
277 | 10741 | nacho | model.removeElement(element); |
278 | } |
||
279 | 11912 | bsanchez | |
280 | 10741 | nacho | /**
|
281 | 12343 | bsanchez | * Elimina un elemento a la lista por indice
|
282 | 10741 | nacho | * @param element Indice del elemento a eliminar
|
283 | */
|
||
284 | public void removeElementInList(int element){ |
||
285 | 11750 | bsanchez | DefaultListModel model = (DefaultListModel) getList().getModel(); |
286 | 10741 | nacho | model.remove(element); |
287 | } |
||
288 | |||
289 | public Hashtable getMap() { |
||
290 | return map;
|
||
291 | } |
||
292 | |||
293 | 12121 | bsanchez | public void setMap(Hashtable map) { |
294 | 10741 | nacho | this.map = map;
|
295 | } |
||
296 | 11440 | bsanchez | |
297 | public void actionPerformed(ActionEvent e) { |
||
298 | if (e.getSource() == bAdd) {
|
||
299 | listener.insertElement(); |
||
300 | } |
||
301 | if (e.getSource() == bDel) {
|
||
302 | listener.deleteElement(); |
||
303 | } |
||
304 | } |
||
305 | 11912 | bsanchez | |
306 | 11625 | bsanchez | /**
|
307 | * A?adir el disparador de cuando se pulsa un bot?n.
|
||
308 | * @param listener
|
||
309 | */
|
||
310 | 12121 | bsanchez | private ArrayList actionChangeListeners = new ArrayList(); |
311 | 11625 | bsanchez | |
312 | public void addChangeSelectionListener(TreeListChangeListener listener) { |
||
313 | if (!actionChangeListeners.contains(listener))
|
||
314 | actionChangeListeners.add(listener); |
||
315 | } |
||
316 | |||
317 | /**
|
||
318 | * Borrar el disparador de eventos de los botones.
|
||
319 | * @param listener
|
||
320 | */
|
||
321 | public void removeChangeSelectionListener(TreeListChangeListener listener) { |
||
322 | actionChangeListeners.remove(listener); |
||
323 | } |
||
324 | 11750 | bsanchez | |
325 | 11625 | bsanchez | private void callActionChangeListeners(String item) { |
326 | Iterator acIterator = actionChangeListeners.iterator();
|
||
327 | while (acIterator.hasNext()) {
|
||
328 | TreeListChangeListener listener = (TreeListChangeListener) acIterator.next(); |
||
329 | 11745 | bsanchez | String name = (String) map.get(item); |
330 | if (name != null) |
||
331 | listener.actionChangeSelection(new TreeListChangeEvent(this, name)); |
||
332 | else
|
||
333 | listener.actionChangeSelection(new TreeListChangeEvent(this, item)); |
||
334 | 11625 | bsanchez | } |
335 | } |
||
336 | |||
337 | public void valueChanged(TreeSelectionEvent e) { |
||
338 | String draggLabel = null; |
||
339 | 11750 | bsanchez | if (e.getSource() == tree) {
|
340 | 11625 | bsanchez | TreePath[] tp = tree.getSelectionPaths(); |
341 | 11750 | bsanchez | if (tp != null) { |
342 | 11625 | bsanchez | String val = tp[0].toString(); |
343 | 11750 | bsanchez | // Comprobamos que se haya pinchado sobre una rama
|
344 | 11625 | bsanchez | String[] pathTree = val.split(", "); |
345 | 11750 | bsanchez | if (pathTree.length > 2) { |
346 | 11625 | bsanchez | draggLabel = val.substring(val.lastIndexOf(", ") + 2, val.lastIndexOf("]")); |
347 | callActionChangeListeners(draggLabel); |
||
348 | } |
||
349 | } |
||
350 | } |
||
351 | } |
||
352 | |||
353 | public void valueChanged(ListSelectionEvent e) { |
||
354 | if (!e.getValueIsAdjusting()) {
|
||
355 | 11672 | bsanchez | if (getList().getSelectedValue() != null) |
356 | callActionChangeListeners(getList().getSelectedValue().toString()); |
||
357 | 11625 | bsanchez | } |
358 | } |
||
359 | 11440 | bsanchez | } |