001    /*
002     * Copyright (c) 2003 JGoodies Karsten Lentzsch. All Rights Reserved.
003     * 
004     * Redistribution and use in source and binary forms, with or without
005     * modification, are permitted provided that the following conditions are met:
006     * 
007     * o Redistributions of source code must retain the above copyright notice, this
008     * list of conditions and the following disclaimer.
009     * 
010     * o Redistributions in binary form must reproduce the above copyright notice,
011     * this list of conditions and the following disclaimer in the documentation
012     * and/or other materials provided with the distribution.
013     * 
014     * o Neither the name of JGoodies Karsten Lentzsch nor the names of its
015     * contributors may be used to endorse or promote products derived from this
016     * software without specific prior written permission.
017     * 
018     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021     * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023     * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024     * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025     * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026     * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027     * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
028     * POSSIBILITY OF SUCH DAMAGE.
029     */
030    package org.springframework.richclient.components;
031    
032    import java.awt.Color;
033    import java.awt.Component;
034    import java.awt.Graphics;
035    import java.awt.Insets;
036    
037    import javax.swing.UIManager;
038    import javax.swing.border.AbstractBorder;
039    
040    public class ShadowBorder extends AbstractBorder {
041    
042        private static final Insets INSETS = new Insets(1, 1, 3, 3);
043    
044        public Insets getBorderInsets(Component c) {
045            return INSETS;
046        }
047    
048        public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
049    
050            Color shadow = UIManager.getColor("controlShadow");
051            if (shadow == null) {
052                shadow = Color.GRAY;
053            }
054            Color lightShadow = new Color(shadow.getRed(), shadow.getGreen(), shadow.getBlue(), 170);
055            Color lighterShadow = new Color(shadow.getRed(), shadow.getGreen(), shadow.getBlue(), 70);
056            g.translate(x, y);
057    
058            g.setColor(shadow);
059            g.fillRect(0, 0, w - 3, 1);
060            g.fillRect(0, 0, 1, h - 3);
061            g.fillRect(w - 3, 1, 1, h - 3);
062            g.fillRect(1, h - 3, w - 3, 1);
063            // Shadow line 1
064            g.setColor(lightShadow);
065            g.fillRect(w - 3, 0, 1, 1);
066            g.fillRect(0, h - 3, 1, 1);
067            g.fillRect(w - 2, 1, 1, h - 3);
068            g.fillRect(1, h - 2, w - 3, 1);
069            // Shadow line2
070            g.setColor(lighterShadow);
071            g.fillRect(w - 2, 0, 1, 1);
072            g.fillRect(0, h - 2, 1, 1);
073            g.fillRect(w - 2, h - 2, 1, 1);
074            g.fillRect(w - 1, 1, 1, h - 2);
075            g.fillRect(1, h - 1, w - 2, 1);
076            g.translate(-x, -y);
077        }
078    }