/* * MultiLineTreeCellRenderer.java * * Created on 05 April 2005, 12:40 */ package org.owasp.webscarab.util.swing; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.font.FontRenderContext; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.font.TextLayout; import java.awt.Font; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTree; import javax.swing.UIManager; import javax.swing.plaf.ColorUIResource; import javax.swing.tree.TreeCellRenderer; /** * @author Nobuo Tamemasa * @version 1.0 11/09/98 */ public class MultiLineTreeCellRenderer extends JPanel implements TreeCellRenderer { /** * */ private static final long serialVersionUID = -6667215953379805686L; protected JLabel _icon; protected TreeTextArea _text; public MultiLineTreeCellRenderer() { setLayout(new BoxLayout(this,BoxLayout.X_AXIS)); _icon = new JLabel() { /** * */ private static final long serialVersionUID = 1750349321755256468L; public void setBackground(Color color) { if(color instanceof ColorUIResource) color = null; super.setBackground(color); } }; add(_icon); add(Box.createHorizontalStrut(4)); add(_text = new TreeTextArea()); _text.setFont(new Font("Monospaced", 0, 12)); } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row, boolean hasFocus) { String stringValue = tree.convertValueToText(value, isSelected, expanded, leaf, row, hasFocus); setEnabled(tree.isEnabled()); _text.setText(stringValue); _text.setSelect(isSelected); _text.setFocus(hasFocus); if (leaf) { _icon.setIcon(UIManager.getIcon("Tree.leafIcon")); } else if (expanded) { _icon.setIcon(UIManager.getIcon("Tree.openIcon")); } else { _icon.setIcon(UIManager.getIcon("Tree.closedIcon")); } return this; } public Dimension getPreferredSize() { Dimension iconD = _icon.getPreferredSize(); Dimension textD = _text.getPreferredSize(); int height = iconD.height < textD.height ? textD.height : iconD.height; return new Dimension(iconD.width + textD.width, height); } public void setBackground(Color color) { if (color instanceof ColorUIResource) color = null; super.setBackground(color); } class TreeTextArea extends JTextArea { /** * */ private static final long serialVersionUID = 46035115936579701L; Dimension preferredSize; TreeTextArea() { setLineWrap(false); setWrapStyleWord(false); setOpaque(true); } public void setBackground(Color color) { if(color instanceof ColorUIResource) color = null; super.setBackground(color); } public void setText(String str) { BufferedImage bufferedImage = new BufferedImage(2, 2, BufferedImage.TYPE_4BYTE_ABGR_PRE); Graphics2D g2d = bufferedImage.createGraphics(); FontRenderContext frc = g2d.getFontRenderContext(); Font font = getFont(); BufferedReader br = new BufferedReader(new StringReader(str)); String line; double maxWidth = 0, maxHeight = 0; int lines = 0; try { while ((line = br.readLine()) != null) { if (!line.equals("")) { TextLayout tl = new TextLayout(line, font, frc); maxWidth = Math.max(maxWidth, tl.getBounds().getWidth()); maxHeight = Math.max(maxHeight, tl.getBounds().getHeight()); } lines++; } } catch (IOException ex) { ex.printStackTrace(); } lines = (lines < 1) ? 1: lines; int height = (int)(maxHeight * lines * 1.35); // interline space? int width = (int)(maxWidth + 200); // ? setPreferredSize(new Dimension(width, height)); super.setText(str); } void setSelect(boolean isSelected) { Color bColor; if (isSelected) { bColor = UIManager.getColor("Tree.selectionBackground"); } else { bColor = UIManager.getColor("Tree.textBackground"); } super.setBackground(bColor); } void setFocus(boolean hasFocus) { if (hasFocus) { Color lineColor = UIManager.getColor("Tree.selectionBorderColor"); setBorder(BorderFactory.createLineBorder(lineColor)); } else { setBorder(BorderFactory.createEmptyBorder(1,1,1,1)); } } } }