KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > opencms > util > ant > SelectionTree


1 /*
2  * File : $Source: /usr/local/cvs/opencms/src-components/org/opencms/util/ant/SelectionTree.java,v $
3  * Date : $Date: 2006/03/27 14:53:01 $
4  * Version: $Revision: 1.3 $
5  *
6  * This library is part of OpenCms -
7  * the Open Source Content Mananagement System
8  *
9  * Copyright (c) 2005 Alkacon Software GmbH (http://www.alkacon.com)
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
20  *
21  * For further information about Alkacon Software GmbH, please see the
22  * company website: http://www.alkacon.com
23  *
24  * For further information about OpenCms, please see the
25  * project website: http://www.opencms.org
26  *
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30  */

31
32 package org.opencms.util.ant;
33
34 import java.awt.Component JavaDoc;
35 import java.awt.Dimension JavaDoc;
36 import java.awt.event.WindowAdapter JavaDoc;
37 import java.awt.event.WindowEvent JavaDoc;
38
39 import javax.swing.BoxLayout JavaDoc;
40 import javax.swing.JCheckBox JavaDoc;
41 import javax.swing.JComponent JavaDoc;
42 import javax.swing.JFrame JavaDoc;
43 import javax.swing.JLabel JavaDoc;
44 import javax.swing.JTree JavaDoc;
45 import javax.swing.UIManager JavaDoc;
46 import javax.swing.event.TreeSelectionEvent JavaDoc;
47 import javax.swing.event.TreeSelectionListener JavaDoc;
48 import javax.swing.tree.DefaultMutableTreeNode JavaDoc;
49 import javax.swing.tree.DefaultTreeCellRenderer JavaDoc;
50 import javax.swing.tree.DefaultTreeModel JavaDoc;
51 import javax.swing.tree.TreeCellRenderer JavaDoc;
52 import javax.swing.tree.TreePath JavaDoc;
53 import javax.swing.tree.TreeSelectionModel JavaDoc;
54
55 /**
56  * A proprietary {@link javax.swing.JTree} utilization for visuals checkbox selection.
57  * <p>
58  *
59  * It displays a tree with:
60  * <ul>
61  * <li> Multiple node selection (windos Look and Feel: press STRG) </li>
62  * <li> Subsequent selection on the UI: it appears that all subnodes of a node are selected too</li>
63  * <li>{@link javax.swing.tree.TreeSelectionModel#DISCONTIGUOUS_TREE_SELECTION} </li>
64  * <li> Custom node UI with checkboxes. </li>
65  * </ul>
66  *
67  * @author Achim Westermann
68  *
69  * @version $Revision: 1.3 $
70  *
71  */

72 public class SelectionTree extends JTree JavaDoc {
73
74     /**
75      *
76      * Custom cell renderer that displays a checkbox.
77      * <p>
78      *
79      * @author Achim Westermann
80      *
81      * @version $Revision: 1.3 $
82      *
83      * @since 6.1.6
84      *
85      */

86     class CheckBoxCellRenderer extends DefaultTreeCellRenderer JavaDoc {
87
88         /** Generated servial version UID. * */
89         private static final long serialVersionUID = -4329469376335457482L;
90
91         /**
92          *
93          * @see javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree,
94          * java.lang.Object, boolean, boolean, boolean, int, boolean)
95          */

96         public Component JavaDoc getTreeCellRendererComponent(
97             JTree JavaDoc tree,
98             Object JavaDoc value,
99             boolean isSelected,
100             boolean expanded,
101             boolean leaf,
102             int row,
103             boolean focus) {
104
105             super.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, focus);
106             return new TreeCellUI((DefaultMutableTreeNode JavaDoc)value, selected);
107         }
108     }
109
110     /**
111      *
112      * {@link TreeSelectionListener} that clears the selections on toggeled paths.
113      * <p>
114      *
115      * This is only needed because of the proprietary UI - display of selected subnodes that are not
116      * selected within the tree model itself.
117      * <p>
118      *
119      * @author Achim Westermann
120      *
121      * @version $Revision: 1.3 $
122      *
123      * @since 6.1.6
124      *
125      */

126     class SubsequentSelection implements TreeSelectionListener JavaDoc {
127
128         /**
129          * @see javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent)
130          */

131         public void valueChanged(TreeSelectionEvent JavaDoc e) {
132
133             // DefaultMutableTreeNode node =
134
// (DefaultMutableTreeNode)SelectionTree.this.getLastSelectedPathComponent();
135
// clear the old subselections:
136
SelectionTree.this.clearToggledPaths();
137
138         }
139     }
140
141     /**
142      *
143      * Custom component containing the default tree cell component along with a checkbox.
144      * <p>
145      *
146      * @author Achim Westermann
147      *
148      * @version $Revision: 1.3 $
149      *
150      * @since 6.1.6
151      *
152      */

153     class TreeCellUI extends JComponent JavaDoc {
154
155         /** Generated serial version UID. * */
156         private static final long serialVersionUID = -1315044645298979088L;
157
158         /** The checkbox to use. * */
159         private JCheckBox JavaDoc m_checkBox;
160
161         /**
162          * Constructor with the corresponding tree node and the selection flag.
163          * <p>
164          *
165          * @param node the corresponding tree node.
166          *
167          * @param selected flag that specifies the state of the internal checkbox to show.
168          */

169         public TreeCellUI(DefaultMutableTreeNode JavaDoc node, boolean selected) {
170
171             JLabel JavaDoc label = new JLabel JavaDoc();
172             label.setText(node.getUserObject().toString());
173             this.m_checkBox = new JCheckBox JavaDoc();
174             this.m_checkBox.setSelected(selected || this.searchSelected(node));
175             this.setLayout(new BoxLayout JavaDoc(this, BoxLayout.X_AXIS));
176             this.add(this.m_checkBox);
177             this.add(label);
178             m_checkBox.setBackground(UIManager.getLookAndFeel().getDefaults().getColor("window"));
179             // invalidate all subnodes:
180
}
181
182         private boolean searchSelected(DefaultMutableTreeNode JavaDoc node) {
183
184             DefaultMutableTreeNode JavaDoc selectedNode = (DefaultMutableTreeNode JavaDoc)SelectionTree.this.getLastSelectedPathComponent();
185             if (selectedNode == null) {
186                 return false;
187             }
188             return (selectedNode.isNodeDescendant(node));
189         }
190     }
191
192     /** Generated serial version UID. * */
193     private static final long serialVersionUID = -3627379509871776708L;
194
195     /**
196      * Defcon.
197      */

198     public SelectionTree() {
199
200         super();
201         super.setCellRenderer(new CheckBoxCellRenderer());
202         this.selectionModel.setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
203         this.selectionModel.addTreeSelectionListener(new SubsequentSelection());
204         // this.setShowsRootHandles(false);
205
}
206
207     /**
208      * For testing purposes.
209      * <p>
210      *
211      * @param args unused command line args.
212      */

213     public static void main(String JavaDoc[] args) {
214
215         DefaultMutableTreeNode JavaDoc node = new DefaultMutableTreeNode JavaDoc("root");
216         DefaultMutableTreeNode JavaDoc a = new DefaultMutableTreeNode JavaDoc("a");
217         DefaultMutableTreeNode JavaDoc b = new DefaultMutableTreeNode JavaDoc("b");
218         DefaultMutableTreeNode JavaDoc c = new DefaultMutableTreeNode JavaDoc("c");
219         DefaultMutableTreeNode JavaDoc a1 = new DefaultMutableTreeNode JavaDoc("1");
220         DefaultMutableTreeNode JavaDoc a2 = new DefaultMutableTreeNode JavaDoc("2");
221         DefaultMutableTreeNode JavaDoc a3 = new DefaultMutableTreeNode JavaDoc("3");
222         DefaultMutableTreeNode JavaDoc b1 = new DefaultMutableTreeNode JavaDoc("1");
223         DefaultMutableTreeNode JavaDoc b2 = new DefaultMutableTreeNode JavaDoc("2");
224         DefaultMutableTreeNode JavaDoc b3 = new DefaultMutableTreeNode JavaDoc("3");
225         DefaultMutableTreeNode JavaDoc c1 = new DefaultMutableTreeNode JavaDoc("1");
226         DefaultMutableTreeNode JavaDoc c2 = new DefaultMutableTreeNode JavaDoc("2");
227         DefaultMutableTreeNode JavaDoc c3 = new DefaultMutableTreeNode JavaDoc("3");
228
229         node.add(a);
230         node.add(b);
231         node.add(c);
232         a.add(a1);
233         a.add(a2);
234         a.add(a3);
235         b.add(b1);
236         b.add(b2);
237         b.add(b3);
238         c.add(c1);
239         c.add(c2);
240         c.add(c3);
241
242         JFrame JavaDoc frame = new JFrame JavaDoc("SelectionTree");
243         SelectionTree tree = new SelectionTree();
244         tree.setModel(new DefaultTreeModel JavaDoc(node));
245         frame.getContentPane().add(tree);
246         frame.setSize(new Dimension JavaDoc(200, 800));
247         frame.addWindowListener(new WindowAdapter JavaDoc() {
248
249             public void windowClosing(WindowEvent JavaDoc we) {
250
251                 System.exit(0);
252             }
253         });
254         frame.setVisible(true);
255
256     }
257
258     /**
259      * @see javax.swing.JTree#clearToggledPaths()
260      */

261     public void clearToggledPaths() {
262
263         // TODO: Auto-generated method stub
264
super.clearToggledPaths();
265     }
266
267     /**
268      *
269      * @see javax.swing.JTree#removeSelectionPath(javax.swing.tree.TreePath)
270      */

271     public void removeSelectionPath(TreePath JavaDoc path) {
272
273         // unselect the current TreeCell:
274
super.removeSelectionPath(path);
275         // unselect the TreeCell rendererer checkboxes in subsequent entries:
276
// this.clearToggledPaths();
277
}
278
279     /**
280      *
281      * @see javax.swing.JTree#setCellRenderer(javax.swing.tree.TreeCellRenderer)
282      */

283     public void setCellRenderer(TreeCellRenderer JavaDoc x) {
284
285         // nop
286
}
287
288     /**
289      * @see javax.swing.JTree#setSelectionPath(javax.swing.tree.TreePath)
290      */

291     public void setSelectionPath(TreePath JavaDoc path) {
292
293         super.setSelectionPath(path);
294         this.clearToggledPaths();
295     }
296
297 }
298
Popular Tags