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), new Point2D.Double(0, 1),
051: new float[] { 0f, .5f, .51f, 1f }, new Color[] {
052: new Color(248, 192, 75), new Color(253, 152, 6),
053: new Color(243, 133, 0), new Color(254, 124, 0) });
054: public static final LinearGradientPaint BLACK_STAR = new LinearGradientPaint(
055: new Point2D.Double(0, 0), new Point2D.Double(0, 1),
056: new float[] { 0f, .5f, .51f, 1f }, new Color[] {
057: new Color(54, 62, 78), new Color(32, 39, 55),
058: new Color(74, 82, 96), new Color(123, 132, 145) });
059: public static final LinearGradientPaint BLACK_PERSPECTIVE = new LinearGradientPaint(
060: new Point2D.Double(0, 0), new Point2D.Double(0, 1),
061: new float[] { 0f, .5f, 1f }, new Color[] { Color.BLACK,
062: new Color(110, 110, 110), Color.BLACK });
063:
064: private LinearGradientPaint paint;
065:
066: /**
067: * Creates a new instance of LinearGradientPainter
068: */
069: public LinearGradientPainter() {
070: }
071:
072: /**
073: * Creates a new instance of LinearGradientPainter with the given LinearGradientPaint
074: * as input
075: *
076: * @param paint the Paint to use
077: */
078: public LinearGradientPainter(LinearGradientPaint paint) {
079: this .paint = paint;
080: }
081:
082: /**
083: * Set the gradient paint to use. This may be null. If null, nothing is painted
084: *
085: * @param paint the LinearGradientPaint to use
086: */
087: public void setGradientPaint(LinearGradientPaint paint) {
088: LinearGradientPaint old = getGradientPaint();
089: this .paint = paint;
090: firePropertyChange("gradientPaint", old, getGradientPaint());
091: }
092:
093: /**
094: * @return the LinearGradientPaint used for painting. This may be null
095: */
096: public LinearGradientPaint getGradientPaint() {
097: return paint;
098: }
099:
100: /**
101: * @inheritDoc
102: */
103: protected Paint calculateSizedPaint(int width, int height) {
104: LinearGradientPaint paint = getGradientPaint();
105: if (paint == null) {
106: return null;
107: }
108:
109: Point2D startPoint = paint.getStartPoint();
110: Point2D endPoint = paint.getEndPoint();
111:
112: double x1 = isResizeHorizontal() ? startPoint.getX() * width
113: : startPoint.getX();
114: double y1 = isResizeVertical() ? startPoint.getY() * height
115: : startPoint.getY();
116: double x2 = isResizeHorizontal() ? endPoint.getX() * width
117: : endPoint.getX();
118: double y2 = isResizeVertical() ? endPoint.getY() * height
119: : endPoint.getY();
120: startPoint = new Point2D.Double(x1, y1);
121: endPoint = new Point2D.Double(x2, y2);
122:
123: return new LinearGradientPaint(startPoint, endPoint, paint
124: .getFractions(), paint.getColors(), paint
125: .getCycleMethod(), paint.getColorSpace(), paint
126: .getTransform());
127: }
128: }
|