001    /*
002     * $Id: GlossPainter.java,v 1.6 2006/04/11 01:46:00 joshy Exp $
003     *
004     * Copyright 2006 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;
023    
024    import java.awt.Color;
025    import java.awt.Graphics2D;
026    import java.awt.Paint;
027    import java.awt.Rectangle;
028    import java.awt.RenderingHints;
029    import java.awt.Shape;
030    import java.awt.geom.Area;
031    import java.awt.geom.Ellipse2D;
032    import javax.swing.JComponent;
033    
034    /**
035     * <p>A Painter implementation that simulates a gloss effect. The gloss can
036     * be positionned at the top or bottom of the drawing area. To fill the gloss,
037     * this painter uses a Paint instance which can be used to fill with a color
038     * (opaque or translucent), a texture, a gradient...</p>
039     * <p>The following example creates a white gloss at the top of the drawing
040     * area:</p>
041     * <pre>
042     *  GlossPainter p = new GlossPainter();
043     *  p.setPaint(new Color(1.0f, 1.0f, 1.0f, 0.2f);
044     *  p.setPosition(GlossPainter.GlossPosition.TOP);
045     *  panel.setBackgroundPainter(p);
046     * </pre>
047     * <p>The values shown in this examples are the values used by default if
048     * they are not specified.</p>
049     *
050     * @author Romain Guy <romain.guy@mac.com>
051     */
052    public class GlossPainter extends AbstractPainter {
053        /**
054         * <p>Used to define the position of the gloss on the painted area.</p>
055         */
056        public enum GlossPosition {
057            TOP, BOTTOM
058        }
059        
060        private Paint paint;
061        private GlossPosition position;
062        
063        /**
064         * <p>Creates a new gloss painter positionned at the top of the painted
065         * area with a 20% translucent white color.</p>
066         */
067        public GlossPainter() {
068            this(new Color(1.0f, 1.0f, 1.0f, 0.2f), GlossPosition.TOP);
069        }
070        
071        /**
072         * <p>Creates a new gloss painter positionned at the top of the painted
073         * area with the specified paint.</p>
074         *
075         * @param paint The paint to be used when filling the gloss
076         */
077        public GlossPainter(Paint paint) {
078            this(paint, GlossPosition.TOP);
079        }
080        
081        /**
082         * <p>Creates a new gloss painter positionned at the specified position
083         * and using a white, 20% translucent paint.</p>
084         *
085         * @param position The position of the gloss on the painted area
086         */
087        public GlossPainter(GlossPosition position) {
088            this(new Color(1.0f, 1.0f, 1.0f, 0.2f), position);
089        }
090        
091        /**
092         * <p>Creates a new gloss painter positionned at the specified position
093         * and painted with the specified paint.</p>
094         *
095         * @param paint The paint to be used when filling the gloss
096         * @param position The position of the gloss on the painted area
097         */
098        public GlossPainter(Paint paint, GlossPosition position) {
099            this.setPaint(paint);
100            this.setPosition(position);
101            
102            setRenderingHint(RenderingHints.KEY_ANTIALIASING,
103                RenderingHints.VALUE_ANTIALIAS_ON);
104        }
105    
106        /**
107         * {@inheritDoc}
108         */
109        protected void paintBackground(Graphics2D g, JComponent component) {
110            if (getPaint() != null) {
111                Ellipse2D ellipse = new Ellipse2D.Double(-component.getWidth() / 2.0,
112                    component.getHeight() / 2.7, component.getWidth() * 2.0,
113                    component.getHeight() * 2.0);
114    
115                Area gloss = new Area(ellipse);
116                if (getPosition() == GlossPosition.TOP) {
117                    Area area = new Area(new Rectangle(0, 0,
118                        component.getWidth(), component.getHeight()));
119                    area.subtract(new Area(ellipse));
120                    gloss = area;
121                }
122                if(getClip() != null) {
123                    gloss.intersect(new Area(getClip()));
124                }
125                g.setPaint(getPaint());
126                g.fill(gloss);
127            }
128        }
129    
130        /**
131         * <p>Returns the paint currently used by the painter to fill the gloss.</p>
132         *
133         * @return the current Paint instance used by the painter
134         */
135        public Paint getPaint() {
136            return paint;
137        }
138    
139        /**
140         * <p>Changes the paint to be used to fill the gloss. When the specified
141         * paint is null, nothing is painted. A paint can be an instance of
142         * Color.</p>
143         *
144         * @param paint The Paint instance to be used to fill the gloss
145         */
146        public void setPaint(Paint paint) {
147            Paint old = this.paint;
148            this.paint = paint;
149            firePropertyChange("paint", old, getPaint());
150        }
151    
152        /**
153         * <p>Returns the position at which the gloss is painted.</p>
154         *
155         * @return the position of the gloss in the painted area
156         */
157        public GlossPosition getPosition() {
158            return position;
159        }
160    
161        /**
162         * <p>Changes the position of the gloss in the painted area. Only the
163         * values defined in the GlossPosition enum are valid.</p>
164         *
165         * @param position The position at which the gloss is painted
166         */
167        public void setPosition(GlossPosition position) {
168            GlossPosition old = this.position;
169            this.position = position;
170            firePropertyChange("position", old, getPosition());
171        }
172    }