001    package org.springframework.richclient.taskpane;
002    
003    import org.springframework.richclient.command.AbstractCommand;
004    
005    import javax.swing.*;
006    import java.awt.*;
007    import java.awt.image.BufferedImage;
008    
009    public class DefaultTaskPaneIconGenerator implements IconGenerator<AbstractCommand>
010    {
011        public static final int ROUND = 0;
012        public static final int DIAMOND = 1;
013        public static final int SQUARE = 2;
014        public static final int OCTAGON = 3;
015    
016        private Color iconColor = Color.DARK_GRAY;
017        private int iconShape = SQUARE;
018    
019        public Color getIconColor()
020        {
021            return iconColor;
022        }
023    
024        public void setIconColor(Color iconColor)
025        {
026            this.iconColor = iconColor;
027        }
028    
029        public int getIconShape()
030        {
031            return iconShape;
032        }
033    
034        public void setIconShape(int iconShape)
035        {
036            this.iconShape = iconShape;
037        }
038    
039        public ImageIcon generateIcon(AbstractCommand forObject)
040        {
041            char textChar = forObject.getText().charAt(0);
042            return new ImageIcon(createIcon(getIconShape(), getIconColor(), textChar));
043        }
044    
045        private static BufferedImage createIcon(int style, Color color, char text)
046        {
047            BufferedImage img = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
048            Graphics2D g = img.createGraphics();
049            Color lighterColor = color.brighter().brighter();
050            GradientPaint paint = new GradientPaint(0, 0, lighterColor, 16, 16, color);
051            g.setPaint(paint);
052            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
053            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
054            Polygon p = new Polygon();
055            switch (style)
056            {
057                case ROUND:
058                    g.fillOval(0, 0, 16, 16);
059                    break;
060                case SQUARE:
061                    g.fillRect(0, 0, 16, 16);
062                    break;
063                case DIAMOND:
064                    p.addPoint(8, 0);
065                    p.addPoint(16, 8);
066                    p.addPoint(8, 16);
067                    p.addPoint(0, 8);
068                    g.fillPolygon(p);
069                    break;
070                case OCTAGON:
071                    p.addPoint(0, 5);
072                    p.addPoint(5, 0);
073                    p.addPoint(11, 0);
074                    p.addPoint(16, 5);
075                    p.addPoint(16, 11);
076                    p.addPoint(11, 16);
077                    p.addPoint(5, 16);
078                    p.addPoint(0, 11);
079                    g.fillPolygon(p);
080                    break;
081                default:
082            }
083    
084            g.setFont(new Font("SansSerif", Font.PLAIN, 10));
085            g.setColor(Color.white);
086            char uppercaseText = Character.toUpperCase(text);
087            if (uppercaseText == 'W' || uppercaseText == 'M')
088            {
089                g.drawString(Character.toString(text), 3f, 11f);
090            }
091            else
092            {
093                g.drawString(Character.toString(text), 4.5f, 11f);
094            }
095            img.flush();
096            return img;
097        }
098    }