| /* |
| * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * - Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * - Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * - Neither the name of Oracle nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
| * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /* |
| */ |
| |
| import javax.swing.Icon; |
| import javax.swing.ImageIcon; |
| import javax.swing.JLabel; |
| import javax.swing.JTree; |
| import javax.swing.tree.TreeCellRenderer; |
| import javax.swing.tree.DefaultMutableTreeNode; |
| import java.awt.Component; |
| import java.awt.Color; |
| import java.awt.Font; |
| import java.awt.Graphics; |
| |
| public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer |
| { |
| /** Font used if the string to be displayed isn't a font. */ |
| static protected Font defaultFont; |
| /** Icon to use when the item is collapsed. */ |
| static protected ImageIcon collapsedIcon; |
| /** Icon to use when the item is expanded. */ |
| static protected ImageIcon expandedIcon; |
| |
| /** Color to use for the background when selected. */ |
| static protected final Color SelectedBackgroundColor = Color.yellow;//new Color(0, 0, 128); |
| |
| static |
| { |
| try { |
| defaultFont = new Font("SansSerif", 0, 12); |
| } catch (Exception e) {} |
| try { |
| collapsedIcon = new ImageIcon(SampleTreeCellRenderer.class.getResource("/resources/images/collapsed.gif")); |
| expandedIcon = new ImageIcon(SampleTreeCellRenderer.class.getResource("/resources/images/expanded.gif")); |
| } catch (Exception e) { |
| System.out.println("Couldn't load images: " + e); |
| } |
| } |
| |
| /** Whether or not the item that was last configured is selected. */ |
| protected boolean selected; |
| |
| /** |
| * This is messaged from JTree whenever it needs to get the size |
| * of the component or it wants to draw it. |
| * This attempts to set the font based on value, which will be |
| * a TreeNode. |
| */ |
| public Component getTreeCellRendererComponent(JTree tree, Object value, |
| boolean selected, boolean expanded, |
| boolean leaf, int row, |
| boolean hasFocus) { |
| Font font; |
| String stringValue = tree.convertValueToText(value, selected, |
| expanded, leaf, row, hasFocus); |
| |
| /* Set the text. */ |
| setText(stringValue); |
| /* Tooltips used by the tree. */ |
| setToolTipText(stringValue); |
| |
| /* Set the image. */ |
| if(expanded) |
| setIcon(expandedIcon); |
| else if(!leaf) |
| setIcon(collapsedIcon); |
| else |
| setIcon(null); |
| |
| /* Set the color and the font based on the SampleData userObject. */ |
| SampleData userObject = (SampleData)((DefaultMutableTreeNode)value) |
| .getUserObject(); |
| if(hasFocus) |
| setForeground(Color.cyan); |
| else |
| setForeground(userObject.getColor()); |
| if(userObject.getFont() == null) |
| setFont(defaultFont); |
| else |
| setFont(userObject.getFont()); |
| |
| /* Update the selected flag for the next paint. */ |
| this.selected = selected; |
| |
| return this; |
| } |
| |
| /** |
| * paint is subclassed to draw the background correctly. JLabel |
| * currently does not allow backgrounds other than white, and it |
| * will also fill behind the icon. Something that isn't desirable. |
| */ |
| public void paint(Graphics g) { |
| Color bColor; |
| Icon currentI = getIcon(); |
| |
| if(selected) |
| bColor = SelectedBackgroundColor; |
| else if(getParent() != null) |
| /* Pick background color up from parent (which will come from |
| the JTree we're contained in). */ |
| bColor = getParent().getBackground(); |
| else |
| bColor = getBackground(); |
| g.setColor(bColor); |
| if(currentI != null && getText() != null) { |
| int offset = (currentI.getIconWidth() + getIconTextGap()); |
| |
| if (getComponentOrientation().isLeftToRight()) { |
| g.fillRect(offset, 0, getWidth() - 1 - offset, |
| getHeight() - 1); |
| } |
| else { |
| g.fillRect(0, 0, getWidth() - 1 - offset, getHeight() - 1); |
| } |
| } |
| else |
| g.fillRect(0, 0, getWidth()-1, getHeight()-1); |
| super.paint(g); |
| } |
| } |