create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / gui / print / components / CheckTreeCellRenderer.java
1 /*
2  * CheckTreeCellRenderer.java
3  */
4 package net.sf.openrocket.gui.print.components;
5
6 import javax.swing.JCheckBox;
7 import javax.swing.JPanel;
8 import javax.swing.JTree;
9 import javax.swing.tree.DefaultMutableTreeNode;
10 import javax.swing.tree.DefaultTreeCellRenderer;
11 import javax.swing.tree.TreeCellRenderer;
12 import javax.swing.tree.TreePath;
13 import java.awt.BorderLayout;
14 import java.awt.Component;
15
16 /**
17  * A cell renderer for JCheckBoxes within nodes of a JTree.
18  * <p/>
19  * Based in part on a blog by Santhosh Kumar.  http://www.jroller.com/santhosh/date/20050610
20  */
21 public class CheckTreeCellRenderer extends JPanel implements TreeCellRenderer {
22
23     /**
24      * The selection model.
25      */
26     private CheckTreeSelectionModel selectionModel;
27     /**
28      * The delegated cell renderer.
29      */
30     private DefaultTreeCellRenderer delegate;
31     /**
32      * The check box within this cell.
33      */
34     private JCheckBox checkBox = new JCheckBox();
35
36     /**
37      * Constructor.
38      *
39      * @param theDelegate       the delegated cell renderer
40      * @param theSelectionModel the selection model
41      */
42     public CheckTreeCellRenderer (DefaultTreeCellRenderer theDelegate, CheckTreeSelectionModel theSelectionModel) {
43         delegate = theDelegate;
44
45         delegate.setLeafIcon(null);
46         delegate.setClosedIcon(null);
47         delegate.setOpenIcon(null);
48
49
50         selectionModel = theSelectionModel;
51         setLayout(new BorderLayout());
52         setOpaque(false);
53         checkBox.setOpaque(false);
54         checkBox.setSelected(true);
55     }
56
57     /**
58      * @{inheritDoc}
59      */
60     @Override
61     public Component getTreeCellRendererComponent (JTree tree, Object value, boolean selected, boolean expanded,
62                                                    boolean leaf, int row, boolean hasFocus) {
63         Component renderer = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row,
64                                                                    hasFocus);
65
66         TreePath path = tree.getPathForRow(row);
67         if (path != null) {
68             final boolean b = selectionModel.isPathSelected(path, true);
69             checkBox.setSelected(b);
70             if (value instanceof DefaultMutableTreeNode) {
71                 Object obj = ((DefaultMutableTreeNode) value).getUserObject();
72                 if (obj instanceof CheckBoxNode) {
73                     ((CheckBoxNode) obj).setSelected(b);
74                 }
75             }
76         }
77
78         removeAll();
79         add(checkBox, BorderLayout.WEST);
80         add(renderer, BorderLayout.CENTER);
81         return this;
82     }
83