001    /*
002     * Copyright 2002-2004 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.image;
017    
018    import java.awt.Color;
019    import java.awt.Component;
020    import java.awt.Graphics;
021    import java.awt.SystemColor;
022    
023    import javax.swing.Icon;
024    
025    import org.springframework.util.Assert;
026    
027    /**
028     * A directional arrow icon; the direction can either be UP or DOWN.
029     * 
030     * @author Keith Donald
031     * @see ArrowIcon.Direction
032     */
033    public class ArrowIcon implements Icon {
034    
035        /**
036         * Type-safe enum for the ArrowIcon's directional capability.
037         * <p>
038         * Currently only up and down are supported since this is primarily designed
039         * to be a table column sort indicator.
040         * 
041         * @author Keith Donald
042         */
043        public static class Direction {
044            public static final Direction DOWN = new Direction(0);
045    
046            public static final Direction UP = new Direction(1);
047    
048            private int value;
049    
050            private Direction(int value) {
051                this.value = value;
052            }
053    
054            public int getValue() {
055                return value;
056            }
057    
058            public String toString() {
059                return String.valueOf(value);
060            }
061        }
062    
063        private Direction direction;
064    
065        private int size;
066    
067        private Color color;
068    
069        /**
070         * Creates a ArrowIcon in the specified direction with the default size and
071         * color.
072         * 
073         * @param direction
074         *            The icon direction.
075         */
076        public ArrowIcon(Direction direction) {
077            setDirection(direction);
078            setSize(4);
079            setColor(SystemColor.controlDkShadow);
080        }
081    
082        /**
083         * Creates a ArrowIcon pointing in the specified direction with the
084         * specified size and color.
085         * 
086         * @param direction
087         *            the direction the arrow should point.
088         * @param size
089         *            the size of the arrow in pixels (4 is a good one)
090         * @param color
091         *            the color of the arrow (consider using UIDefaults for current
092         *            L&F)
093         */
094        public ArrowIcon(Direction direction, int size, Color color) {
095            setDirection(direction);
096            setSize(size);
097            setColor(color);
098        }
099    
100        public void paintIcon(Component c, Graphics g, int x, int y) {
101            g.setColor(color);
102            for (int i = 0; i < size; i++) {
103                if (direction == Direction.UP) {
104                    g.drawLine(x + (size - (i + 1)), y + i, x + (size + i), y + i);
105                }
106                else {
107                    g.drawLine(x + i, y + i, x + (size * 2 - (i + 1)), y + i);
108                }
109            }
110        }
111    
112        public int getIconWidth() {
113            return size * 2;
114        }
115    
116        public int getIconHeight() {
117            return size;
118        }
119    
120        /**
121         * @param size
122         */
123        private void setSize(int size) {
124            this.size = size;
125        }
126    
127        /**
128         * @param color
129         */
130        private void setColor(Color color) {
131            Assert.notNull(color);
132            this.color = color;
133        }
134    
135        /**
136         * @param direction
137         */
138        private void setDirection(Direction direction) {
139            this.direction = direction;
140        }
141    
142        public String toString() {
143            StringBuffer buf = new StringBuffer("[ArrowIcon").append(" direction=").append(direction).append(" size=")
144                    .append(size).append(" color=").append(color);
145            return buf.toString();
146        }
147    
148    }