1
2 package hep.wired.util;
3
4 import java.awt.*;
5 import java.util.*;
6 import javax.swing.*;
7 import javax.swing.tree.*;
8
9 import hep.wired.util.TristateCheckBox.State;
10
11 /***
12 *
13 * @author Mark Donszelmann
14 * @version $Id: TristateTreeCellRenderer.java 684 2005-03-14 05:53:30Z duns $
15 */
16 public class TristateTreeCellRenderer extends JPanel implements TreeCellRenderer {
17
18 protected Object node;
19 protected TreeCellRenderer renderer;
20 protected TristateCheckBox tristate;
21 protected Component strut;
22 protected JCheckBox check;
23 protected Component component;
24
25 public TristateTreeCellRenderer(JTree tree) {
26 this(tree, new NoIconTreeCellRenderer());
27 }
28
29 public TristateTreeCellRenderer(JTree tree, TreeCellRenderer renderer) {
30
31 setOpaque(false);
32 setLayout(new BorderLayout());
33
34 this.renderer = renderer;
35 this.component = renderer.getTreeCellRendererComponent(tree, "", true, true, true, 0, true);
36
37 add(BorderLayout.CENTER, component);
38
39 tristate = new TristateCheckBox();
40 tristate.setMargin(new Insets(0, 0, 0, 0));
41 tristate.setBorderPaintedFlat(true);
42 tristate.setOpaque(false);
43 tristate.setToolTipText("Changes visibility of all objects in this group. Status shows if 'all', 'some' or 'no' objects are visible from this group.");
44
45 check = new JCheckBox();
46 check.setMargin(new Insets(0, 0, 0, 0));
47 check.setBorderPaintedFlat(true);
48 check.setOpaque(false);
49 check.setToolTipText("Changes visibility of this object. Status shows if this object is visible.");
50
51 Box box = Box.createHorizontalBox();
52 box.add(tristate);
53 strut = Box.createHorizontalStrut(3);
54 box.add(strut);
55 box.add(check);
56
57 add(BorderLayout.WEST, box);
58 }
59
60 public Component getTreeCellRendererComponent(JTree tree, Object value,
61 boolean selected, boolean expanded, boolean leaf, int row,
62 boolean hasFocus) {
63
64 node = value;
65
66 if (node instanceof TristateTreeNode) {
67 TristateTreeNode treeNode = (TristateTreeNode)node;
68 tristate.setState(treeNode.getState());
69 check.setSelected(treeNode.isSelected());
70 }
71
72 if (node instanceof DefaultMutableTreeNode) {
73 value = ((DefaultMutableTreeNode)node).getUserObject();
74 }
75
76 renderer.getTreeCellRendererComponent(tree, value, selected,
77 expanded, leaf, row, hasFocus);
78
79 tristate.setVisible(!leaf);
80 strut.setVisible(!leaf);
81
82 setEnabled(component.isEnabled());
83 invalidate();
84
85 return this;
86 }
87
88 public void setEnabled(boolean state) {
89 super.setEnabled(state);
90 tristate.setEnabled(state);
91 strut.setEnabled(state);
92 check.setEnabled(state);
93 component.setEnabled(state);
94 }
95
96 public static class NoIconTreeCellRenderer extends DefaultTreeCellRenderer {
97 public Icon getOpenIcon() { return null; }
98 public Icon getClosedIcon() { return null; }
99 public Icon getLeafIcon() { return null; }
100 }
101 }