1 /*
2 J-Bird net/sourceforge/jbird/swing/JComboTree.java
3
4 Copyright 2001, 2002, 2003 Dick Repasky
5 */
6 package net.sourceforge.jbird.swing;
7
8 import java.awt.Dimension;
9 import java.awt.Window;
10
11 import java.awt.event.MouseAdapter;
12 import java.awt.event.MouseEvent;
13
14 import javax.swing.JScrollPane;
15 import javax.swing.JTextField;
16 import javax.swing.JTree;
17 import javax.swing.JWindow;
18
19 import javax.swing.event.TreeSelectionEvent;
20 import javax.swing.event.TreeSelectionListener;
21
22 import javax.swing.tree.TreeModel;
23 import javax.swing.tree.TreeNode;
24 import javax.swing.tree.TreePath;
25 import javax.swing.tree.TreeSelectionModel;
26
27 /**
28 * A tree selector that is modelled after JComboBox. The name of the
29 * selected path appears in a text field, and if the user clicks on it,
30 * a tree appears fully expanded. When the user selectes an alement of
31 * the tree, the tree disappears, and the name of the newly selected
32 * element appears in the text field.
33 * <p>
34 * Instantiate, set the selected path, and go. Use getSelectedPath
35 * to retrieve the selection.
36 * @author Dick Repasky
37 * @since J-Bird 0.3.0
38 */
39
40 public class JComboTree extends JTextField {
41
42 protected JTree tree;
43 protected TreeModel tree_model;
44 protected JWindow window;
45
46 protected TreePath selected_path;
47
48 public JComboTree(TreeModel model, Window owner) {
49 super();
50 tree_model = model;
51 buildTextField();
52 buildTree();
53 packageTree(owner);
54 }
55
56 public final TreeNode getSelectedNode() {
57 return (TreeNode)selected_path.getLastPathComponent();
58 }
59
60 public final TreePath getSelectedPath() {
61 return selected_path;
62 }
63
64 public void nullify() {
65 tree = null;
66 tree_model = null;
67 window = null;
68 }
69
70 public final void setSelectedPath(TreePath path) {
71 tree.setSelectionPath(path);
72 selected_path = path;
73 setText(path);
74 }
75
76 ////////////////////////// protected below //////////////////////////
77
78 protected final void buildTextField() {
79 setEditable(false);
80 addMouseListener(new MouseAdapter() {
81 public void mouseClicked(MouseEvent e) {
82 clickedTextField();
83 }
84 });
85 }
86
87 protected final void buildTree() {
88 tree = new JTree(tree_model);
89 tree.setEditable(false);
90 tree.getSelectionModel().setSelectionMode(
91 TreeSelectionModel.SINGLE_TREE_SELECTION);
92 expandAllRows();
93 class TSL implements TreeSelectionListener {
94 public void valueChanged(TreeSelectionEvent e) {
95 if (e.isAddedPath()) {
96 clickedTreeElement();
97 }
98 }
99 }
100 tree.addTreeSelectionListener(new TSL());
101 }
102
103 protected final void clickedTextField() {
104 window.setLocation(getLocation());
105 window.setSize(new Dimension(350, tree.getRowHeight() * 21));
106 window.setVisible(true);
107 // window.toFront();
108 }
109
110
111 protected final void clickedTreeElement() {
112 selected_path = tree.getSelectionPath();
113 setText(selected_path);
114 window.setVisible(false);
115 }
116
117 protected final void expandAllRows() {
118 int max = tree.getRowCount();
119 for (int idx = max - 1; idx >= 0; idx --) {
120 tree.expandRow(idx);
121 }
122 }
123
124 protected final void packageTree(Window owner) {
125 window = new JWindow(owner);
126 window.getContentPane().add(new JScrollPane(tree));
127 }
128
129
130 protected final void setText(TreePath path) {
131 final String value = ((TreeNode)(path.getLastPathComponent())).
132 toString();
133 Runnable doit = new Runnable() {
134 public void run() {
135 setText(value);
136 }
137 };
138 javax.swing.SwingUtilities.invokeLater(doit);
139 }
140
141 }
142