/* * CheckTreeCellRenderer.java */ package net.sf.openrocket.gui.print.components; import javax.swing.JCheckBox; import javax.swing.JPanel; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.Component; /** * A cell renderer for JCheckBoxes within nodes of a JTree. * <p/> * Based in part on a blog by Santhosh Kumar. http://www.jroller.com/santhosh/date/20050610 */ public class CheckTreeCellRenderer extends JPanel implements TreeCellRenderer { /** * The selection model. */ private CheckTreeSelectionModel selectionModel; /** * The delegated cell renderer. */ private DefaultTreeCellRenderer delegate; /** * The check box within this cell. */ private JCheckBox checkBox = new JCheckBox(); /** * Constructor. * * @param theDelegate the delegated cell renderer * @param theSelectionModel the selection model */ public CheckTreeCellRenderer (DefaultTreeCellRenderer theDelegate, CheckTreeSelectionModel theSelectionModel) { delegate = theDelegate; delegate.setLeafIcon(null); delegate.setClosedIcon(null); delegate.setOpenIcon(null); selectionModel = theSelectionModel; setLayout(new BorderLayout()); setOpaque(false); checkBox.setOpaque(false); checkBox.setSelected(true); } /** * @{inheritDoc} */ @Override public Component getTreeCellRendererComponent (JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { Component renderer = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); TreePath path = tree.getPathForRow(row); if (path != null) { final boolean b = selectionModel.isPathSelected(path, true); checkBox.setSelected(b); if (value instanceof DefaultMutableTreeNode) { Object obj = ((DefaultMutableTreeNode) value).getUserObject(); if (obj instanceof CheckBoxNode) { ((CheckBoxNode) obj).setSelected(b); } } } removeAll(); add(checkBox, BorderLayout.WEST); add(renderer, BorderLayout.CENTER); return this; } }