001    /*
002     * $Id: IconPainter.java,v 1.2 2006/03/24 11:22:16 gfx Exp $
003     *
004     * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005     * Santa Clara, California 95054, U.S.A. All rights reserved.
006     *
007     * This library is free software; you can redistribute it and/or
008     * modify it under the terms of the GNU Lesser General Public
009     * License as published by the Free Software Foundation; either
010     * version 2.1 of the License, or (at your option) any later version.
011     * 
012     * This library is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
015     * Lesser General Public License for more details.
016     * 
017     * You should have received a copy of the GNU Lesser General Public
018     * License along with this library; if not, write to the Free Software
019     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
020     */
021    
022    package org.jdesktop.swingx.painter;
023    
024    import java.awt.Graphics2D;
025    import java.awt.Image;
026    import java.awt.image.BufferedImage;
027    import javax.swing.Icon;
028    import javax.swing.ImageIcon;
029    import javax.swing.JComponent;
030    
031    /**
032     * <p>An ImagePainter subclass that provides convenience methods "setIcon" and
033     * "getIcon" to use Icons (and ImageIcons) rather than Images directly. Because
034     * this class uses "Icon" and because there is a "getImage" method from the
035     * parent class, sometimes an intermediate BufferedImage will be created to
036     * generate the image to return. This should be fairly performant, but will
037     * of course have some overhead. To avoid this overhead, use an ImageIcon
038     * where possible.</p>
039     *
040     * @author rbair
041     */
042    public class IconPainter extends ImagePainter {
043        /**
044         * The icon to draw
045         */
046        private Icon icon;
047        
048        /**
049         * Create a new IconPainter
050         */
051        public IconPainter() {
052            super();
053        }
054        
055        /**
056         * Create a new IconPainter with the specified icon.
057         *
058         * @param icon the icon to be painted
059         */
060        public IconPainter(Icon icon) {
061            super();
062            this.icon = icon;
063        }
064        
065        
066        /**
067         * Set the icon to use. This will fire property change notification not
068         * only for the "icon" property, but also for the "image" property.
069         *
070         * @param icon the Icon to use
071         */
072        public void setIcon(Icon icon) {
073            Icon old = getIcon();
074            Image oldImage = getImage();
075            this.icon = icon;
076            firePropertyChange("icon", old, getIcon());
077            firePropertyChange("image", oldImage, getImage());
078        }
079        
080        /**
081         * @return the Icon used by this painter
082         */
083        public Icon getIcon() {
084            return icon;
085        }
086        
087        /**
088         * @return the image used for painting the background of this panel
089         */
090        public Image getImage() {
091            if (icon instanceof ImageIcon) {
092                return ((ImageIcon)icon).getImage();
093            } else if (icon == null) {
094                return null;
095            } else {
096                //paint the icon into a buffered image
097                BufferedImage image = new BufferedImage(
098                        icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
099                Graphics2D g2 = image.createGraphics();
100                icon.paintIcon(new JComponent(){}, g2, 0, 0);
101                g2.dispose();
102                return image;
103            }
104        }
105    }