001    /*
002     * $Id: LinearGradientPainter.java,v 1.3 2006/04/11 18:47:55 rbair 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.gradient;
023    
024    import java.awt.Color;
025    import java.awt.Paint;
026    import java.awt.geom.Point2D;
027    import org.apache.batik.ext.awt.LinearGradientPaint;
028    
029    /**
030     * <p>A Gradient based painter used for painting "multi-stop" gradients. These are
031     * gradients that imploys more than 2 colors, where each color is defined along
032     * with a float value between 0 and 1 indicating at what point along the gradient
033     * the new color is used.</p>
034     *
035     * <p>As with BasicGradienPainter and mentioned in AbstractGradientPainter, the values
036     * given to the startPoint and endPoint of the LinearGradientPainter are crucial. They
037     * represent what distance from the origin the gradient should begin and end at,
038     * depending on the size of the component. That is, they must be specified as values between
039     * 0 and 1, where 0 means "all the way on the left/top" and 1 means "all the way on the
040     * right/bottom".</p>
041     *
042     * <p><strong>NOTE: LinearGradientPainter relies on LinearGradientPaint, which is
043     * included in the optional jar MultipleGradientPaint.jar. Be sure to have this
044     * jar on your classpath if you use this class</strong></p>
045     *
046     * @author rbair
047     */
048    public class LinearGradientPainter extends AbstractGradientPainter {
049        public static final LinearGradientPaint ORANGE_DELIGHT = new LinearGradientPaint(
050                new Point2D.Double(0, 0),
051                new Point2D.Double(0, 1),
052                new float[] {0f, .5f, .51f, 1f},
053                new Color[] {
054                    new Color(248, 192, 75),
055                    new Color(253, 152, 6),
056                    new Color(243, 133, 0),
057                    new Color(254, 124, 0)});
058        public static final LinearGradientPaint BLACK_STAR = new LinearGradientPaint(
059                new Point2D.Double(0, 0),
060                new Point2D.Double(0, 1),
061                new float[] {0f, .5f, .51f, 1f},
062                new Color[] {
063                    new Color(54, 62, 78),
064                    new Color(32, 39, 55),
065                    new Color(74, 82, 96),
066                    new Color(123, 132, 145)});
067        public static final LinearGradientPaint BLACK_PERSPECTIVE = new LinearGradientPaint (
068                new Point2D.Double(0, 0),
069                new Point2D.Double(0, 1),
070                new float[] {0f, .5f, 1f},
071                new Color[] {
072                    Color.BLACK,
073                    new Color(110, 110, 110),
074                    Color.BLACK});
075        
076        private LinearGradientPaint paint;
077        
078        /** 
079         * Creates a new instance of LinearGradientPainter 
080         */
081        public LinearGradientPainter() {
082        }
083        
084        /**
085         * Creates a new instance of LinearGradientPainter with the given LinearGradientPaint
086         * as input
087         *
088         * @param paint the Paint to use
089         */
090        public LinearGradientPainter(LinearGradientPaint paint) {
091            this.paint = paint;
092        }
093        
094        /**
095         * Set the gradient paint to use. This may be null. If null, nothing is painted
096         *
097         * @param paint the LinearGradientPaint to use
098         */
099        public void setGradientPaint(LinearGradientPaint paint) {
100            LinearGradientPaint old = getGradientPaint();
101            this.paint = paint;
102            firePropertyChange("gradientPaint", old, getGradientPaint());
103        }
104        
105        /**
106         * @return the LinearGradientPaint used for painting. This may be null
107         */
108        public LinearGradientPaint getGradientPaint() {
109            return paint;
110        }
111        
112        /**
113         * @inheritDoc
114         */
115        protected Paint calculateSizedPaint(int width, int height) {
116            LinearGradientPaint paint = getGradientPaint();
117            if (paint == null) {
118                return null;
119            }
120            
121            Point2D startPoint = paint.getStartPoint();
122            Point2D endPoint = paint.getEndPoint();
123            
124            double x1 = isResizeHorizontal() ? startPoint.getX() * width : startPoint.getX();
125            double y1 = isResizeVertical() ? startPoint.getY() * height : startPoint.getY();
126            double x2 = isResizeHorizontal() ? endPoint.getX() * width : endPoint.getX();
127            double y2 = isResizeVertical() ? endPoint.getY() * height : endPoint.getY();
128            startPoint = new Point2D.Double(x1, y1);
129            endPoint = new Point2D.Double(x2, y2);
130            
131            return new LinearGradientPaint(
132                    startPoint,
133                    endPoint,
134                    paint.getFractions(),
135                    paint.getColors(),
136                    paint.getCycleMethod(),
137                    paint.getColorSpace(),
138                    paint.getTransform());
139        }
140    }