001package jmri.util.swing;
002
003import java.awt.Component;
004
005import javax.swing.*;
006import javax.swing.tree.DefaultMutableTreeNode;
007import javax.swing.tree.TreeCellRenderer;
008import javax.swing.tree.TreePath;
009
010/**
011 * JCheckBoxTreeCellRenderer implements a TreeCellRenderer for JCheckBoxTree
012 * @author Steve Young Copyright (C) 2025
013 */
014public class JCheckBoxTreeCellRenderer implements TreeCellRenderer {
015
016    private final TriStateJCheckBox checkBox;
017
018    final JPanel panel;
019
020    public JCheckBoxTreeCellRenderer() {
021        super();
022        panel = new JPanel();
023        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
024        // panel.setLayout(new BorderLayout());
025        checkBox = new TriStateJCheckBox();
026        // panel.add(checkBox);
027        panel.setOpaque(false);
028    }
029
030    @Override
031    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
032        boolean expanded, boolean leaf, int row, boolean hasFocus) {
033
034        panel.removeAll();
035        panel.add(checkBox);
036
037        DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
038        if (!(tree instanceof JCheckBoxTree)) {
039            return panel;
040        }
041        JCheckBoxTree jcbt = (JCheckBoxTree) tree;
042        TreePath tp = new TreePath(node.getPath());
043        if (jcbt.isSelectedPartially(tp)) {
044            checkBox.setState(TriStateJCheckBox.State.PARTIAL);
045        } else {
046            checkBox.setSelected(jcbt.isSelected(tp));
047        } 
048        Object obj = node.getUserObject();
049        checkBox.setText(obj == null ? null : obj.toString());
050        JPanel withExtras = getPanelExtras(node);
051        if ( withExtras != null ) {
052            panel.add( withExtras);
053        }
054        return panel;
055    }
056
057    public JPanel getPanelExtras(DefaultMutableTreeNode value) {
058        return null;
059    }
060
061}