001    /* ========================================================================
002     * JCommon : a free general purpose class library for the Java(tm) platform
003     * ========================================================================
004     *
005     * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
006     * 
007     * Project Info:  http://www.jfree.org/jcommon/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     * 
027     * -------------------------------------
028     * StandardGradientPaintTransformer.java
029     * -------------------------------------
030     * (C) Copyright 2003-2007, by Object Refinery Limited.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   -;
034     *
035     * $Id: StandardGradientPaintTransformer.java,v 1.11 2007/04/03 13:55:13 mungady Exp $
036     *
037     * Changes
038     * -------
039     * 28-Oct-2003 : Version 1 (DG);
040     * 19-Mar-2004 : Added equals() method (DG);
041     * 
042     */
043    
044    package org.jfree.ui;
045    
046    import java.awt.GradientPaint;
047    import java.awt.Shape;
048    import java.awt.geom.Rectangle2D;
049    import java.io.Serializable;
050    
051    import org.jfree.util.PublicCloneable;
052    
053    /**
054     * Transforms a <code>GradientPaint</code> to range over the width of a target 
055     * shape.  Instances of this class are immutable.
056     * 
057     * @author David Gilbert
058     */
059    public class StandardGradientPaintTransformer 
060        implements GradientPaintTransformer, Cloneable, PublicCloneable, 
061                   Serializable {
062        
063        /** For serialization. */
064        private static final long serialVersionUID = -8155025776964678320L;
065    
066        /** The transform type. */
067        private GradientPaintTransformType type;
068        
069        /**
070         * Creates a new transformer with the type 
071         * {@link GradientPaintTransformType#VERTICAL}.
072         */
073        public StandardGradientPaintTransformer() {
074            this(GradientPaintTransformType.VERTICAL);
075        }
076        
077        /**
078         * Creates a new transformer with the specified type.
079         * 
080         * @param type  the transform type (<code>null</code> not permitted).
081         */
082        public StandardGradientPaintTransformer(
083                final GradientPaintTransformType type) {
084            if (type == null) {
085                throw new IllegalArgumentException("Null 'type' argument.");
086            }
087            this.type = type;
088        }
089        
090        /**
091         * Returns the type of transform.
092         * 
093         * @return The type of transform (never <code>null</code>).
094         * 
095         * @since 1.0.10
096         */
097        public GradientPaintTransformType getType() {
098            return this.type;
099        }
100        
101        /**
102         * Transforms a <code>GradientPaint</code> instance to fit the specified
103         * <code>target</code> shape.
104         * 
105         * @param paint  the original paint (<code>null</code> not permitted).
106         * @param target  the target shape (<code>null</code> not permitted).
107         * 
108         * @return The transformed paint.
109         */
110        public GradientPaint transform(final GradientPaint paint, 
111                                       final Shape target) {
112            
113            GradientPaint result = paint;
114            final Rectangle2D bounds = target.getBounds2D();
115            
116            if (this.type.equals(GradientPaintTransformType.VERTICAL)) {
117                result = new GradientPaint((float) bounds.getCenterX(), 
118                        (float) bounds.getMinY(), paint.getColor1(), 
119                        (float) bounds.getCenterX(), (float) bounds.getMaxY(), 
120                        paint.getColor2());
121            }
122            else if (this.type.equals(GradientPaintTransformType.HORIZONTAL)) {
123                result = new GradientPaint((float) bounds.getMinX(), 
124                        (float) bounds.getCenterY(), paint.getColor1(), 
125                        (float) bounds.getMaxX(), (float) bounds.getCenterY(), 
126                        paint.getColor2());            
127            }
128            else if (this.type.equals(
129                    GradientPaintTransformType.CENTER_HORIZONTAL)) {
130                result = new GradientPaint((float) bounds.getCenterX(), 
131                        (float) bounds.getCenterY(), paint.getColor2(), 
132                        (float) bounds.getMaxX(), (float) bounds.getCenterY(), 
133                        paint.getColor1(), true);            
134            }
135            else if (this.type.equals(GradientPaintTransformType.CENTER_VERTICAL)) {
136                result = new GradientPaint((float) bounds.getCenterX(), 
137                        (float) bounds.getMinY(), paint.getColor1(), 
138                        (float) bounds.getCenterX(), (float) bounds.getCenterY(), 
139                        paint.getColor2(), true);            
140            }
141            
142            return result;
143        }
144        
145        /**
146         * Tests this instance for equality with an arbitrary object.
147         * 
148         * @param obj  the object (<code>null</code> permitted).
149         * 
150         * @return A boolean.
151         */
152        public boolean equals(final Object obj) {
153            if (obj == this) {
154                return true;   
155            }
156            if (!(obj instanceof StandardGradientPaintTransformer)) {
157                return false;
158            }
159            StandardGradientPaintTransformer that 
160                    = (StandardGradientPaintTransformer) obj;
161            if (this.type != that.type) {
162                return false;
163            }
164            return true;
165        }
166        
167        /**
168         * Returns a clone of the transformer.  Note that instances of this class
169         * are immutable, so cloning an instance isn't really necessary.
170         * 
171         * @return A clone.
172         * 
173         * @throws CloneNotSupportedException not thrown by this class, but 
174         *         subclasses (if any) might.
175         */
176        public Object clone() throws CloneNotSupportedException {
177            return super.clone();
178        }
179    
180        /**
181         * Returns a hash code for this object.
182         * 
183         * @return A hash code.
184         */
185        public int hashCode() {
186            return (this.type != null ? this.type.hashCode() : 0);
187        }
188        
189    }