/* * This software copyright by various authors including the RPTools.net * development team, and licensed under the LGPL Version 3 or, at your option, * any later version. * * Portions of this software were originally covered under the Apache Software * License, Version 1.1 or Version 2.0. * * See the file LICENSE elsewhere in this distribution for license details. */ package net.rptools.maptool.client.ui.tokenpanel; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Transparency; import java.awt.image.BufferedImage; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.tree.DefaultTreeCellRenderer; import net.rptools.lib.image.ImageUtil; import net.rptools.lib.swing.SwingUtil; import net.rptools.maptool.client.MapTool; import net.rptools.maptool.model.Token; import net.rptools.maptool.util.ImageManager; public class TokenPanelTreeCellRenderer extends DefaultTreeCellRenderer { private BufferedImage image; private int row; private int rowWidth; public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { setBorder(null); String text = ""; this.row = row; setBackgroundNonSelectionColor(Color.white); if (value instanceof Token) { Token token = (Token) value; int height = getPreferredSize().height; if (height < 1) { height = 15; } if (image == null || image.getHeight() != height) { image = new BufferedImage(height, height, Transparency.BITMASK); } else { ImageUtil.clearImage(image); } // Make a thumbnail of the image // TODO: This could be cached somehow, right now it's quick enough though BufferedImage tokenImage = ImageManager.getImage(token.getImageAssetId(), this); Dimension dim = new Dimension(tokenImage.getWidth(), tokenImage.getHeight()); SwingUtil.constrainTo(dim, height); Graphics g = image.getGraphics(); // TODO: Center the image g.drawImage(tokenImage, 0, 0, dim.width, dim.height, this); g.dispose(); text = token.getName(); if (MapTool.getPlayer().isGM() && token.getGMName() != null && token.getGMName().length() > 0) { text += " (" + token.getGMName() + ")"; } if (!token.isVisible()) { setBackgroundNonSelectionColor(Color.lightGray); } } if (value instanceof TokenPanelTreeModel.View) { TokenPanelTreeModel.View view = (TokenPanelTreeModel.View) value; text = view.getDisplayName(); } super.getTreeCellRendererComponent(tree, text, sel, expanded, leaf, row, hasFocus); Icon icon = getIcon(); rowWidth = (icon != null ? icon.getIconWidth() + 2 : 0) + SwingUtilities.computeStringWidth(getFontMetrics(getFont()), text); return this; } @Override public Dimension getPreferredSize() { int height = row > 0 ? getFontMetrics(getFont()).getHeight() + 4 : 0; return new Dimension(super.getPreferredSize().width, height); } @Override public Icon getLeafIcon() { return new ImageIcon(image); } }