View Javadoc

1   // Copyright 2004-2005, FreeHEP.
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 }