/* * Copyright 2006,2007 Enrico Boldrini, Lorenzo Bigagli This file is part of * CheckboxTree. CheckboxTree is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at your * option) any later version. CheckboxTree is distributed in the hope that it * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. You should have received a copy of the GNU * General Public License along with CheckboxTree; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA */ package net.sourceforge.pmd.jedit.checkboxtree; import net.sourceforge.pmd.jedit.checkboxtree.QuadristateButtonModel.State; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.JTree; import javax.swing.UIManager; import javax.swing.plaf.ColorUIResource; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; import org.gjt.sp.jedit.browser.VFSBrowser; import org.gjt.sp.jedit.View; /** * A renderer for the CheckboxTree. This implementation decorates a * DefaultTreeCellRenderer (i.e. a JLabel) with a checkbox, by adding a * JCheckbox to the former onto a JPanel. Both can be overridden by subclasses. * Note that this renderer separates the checkbox form the label/icon, in that * double-clicking the label/icon of this renderer does not toggle the checkbox. * * @author boldrini * @author bigagli */ public class DefaultCheckboxTreeCellRenderer extends JPanel implements CheckboxTreeCellRenderer { protected QuadristateCheckbox checkBox = new QuadristateCheckbox(); protected DefaultTreeCellRenderer label = new DefaultTreeCellRenderer(); public DefaultCheckboxTreeCellRenderer() { this.setLayout( new FlowLayout( FlowLayout.LEFT, 0, 0 ) ); add( this.checkBox ); add( this.label ); this.checkBox.setBackground( UIManager.getColor( "Tree.textBackground" ) ); this.setBackground( UIManager.getColor( "Tree.textBackground" ) ); } // @Override // public void doLayout() { // Dimension d_check = this.checkBox.getPreferredSize(); // Dimension d_label = this.label.getPreferredSize(); // int y_check = 0; // int y_label = 0; // if (d_check.height < d_label.height) { // y_check = (d_label.height - d_check.height) / 2; // } else { // y_label = (d_check.height - d_label.height) / 2; // } // this.checkBox.setLocation(0, y_check); // this.checkBox.setBounds(0, y_check, d_check.width, d_check.height); // this.label.setLocation(d_check.width, y_label); // this.label.setBounds(d_check.width, y_label, d_label.width, // d_label.height); // } @Override public Dimension getPreferredSize() { Dimension d_check = this.checkBox.getPreferredSize(); Dimension d_label = this.label.getPreferredSize(); return new Dimension( d_check.width + d_label.width, ( d_check.height < d_label.height ? d_label.height : d_check.height ) ); } /** * Decorates this renderer based on the passed in components. */ public Component getTreeCellRendererComponent( JTree tree, Object object, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus ) { /* * most of the rendering is delegated to the wrapped * DefaultTreeCellRenderer, the rest depends on the TreeCheckingModel */ this.label.getTreeCellRendererComponent( tree, object, selected, expanded, leaf, row, hasFocus ); if ( tree instanceof CheckboxTree ) { TreeCheckingModel checkingModel = ( ( CheckboxTree ) tree ).getCheckingModel(); TreePath path = tree.getPathForRow( row ); this.checkBox.setEnabled( checkingModel.isPathEnabled( path ) ); boolean checked = checkingModel.isPathChecked( path ); boolean greyed = checkingModel.isPathGreyed( path ); if ( checked && !greyed ) { this.checkBox.setState( State.CHECKED ); } if ( !checked && greyed ) { this.checkBox.setState( State.GREY_UNCHECKED ); } if ( checked && greyed ) { this.checkBox.setState( State.GREY_CHECKED ); } if ( !checked && !greyed ) { this.checkBox.setState( State.UNCHECKED ); } } return this; } /** * Checks if the (x,y) coordinates are on the Checkbox. * * @return boolean * @param x * @param y */ public boolean isOnHotspot( int x, int y ) { // TODO: alternativa (ma funge???) //return this.checkBox.contains(x, y); return ( this.checkBox.getBounds().contains( x, y ) ); } /** * Loads an ImageIcon from the file iconFile, searching it in the * classpath.Guarda un po' */ protected static ImageIcon loadIcon( String iconFile ) { try { return new ImageIcon( DefaultCheckboxTreeCellRenderer.class.getClassLoader().getResource( iconFile ) ); } catch ( NullPointerException npe ) { // did not find the resource return null; } } @Override public void setBackground( Color color ) { if ( color instanceof ColorUIResource ) { color = null; } super.setBackground( color ); } /** * Sets the icon used to represent non-leaf nodes that are expanded. */ public void setOpenIcon( Icon newIcon ) { this.label.setOpenIcon( newIcon ); } /** * Sets the icon used to represent non-leaf nodes that are not expanded. */ public void setClosedIcon( Icon newIcon ) { this.label.setClosedIcon( newIcon ); } /** * Sets the icon used to represent leaf nodes. */ public void setLeafIcon( Icon newIcon ) { this.label.setLeafIcon( newIcon ); } }