1 /* 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package javax.swing.border; 26 27 import java.awt.Graphics; 28 import java.awt.Insets; 29 import java.awt.Rectangle; 30 import java.awt.Color; 31 import java.awt.Component; 32 import java.beans.ConstructorProperties; 33 34 /** 35 * A class which implements a simple etched border which can 36 * either be etched-in or etched-out. If no highlight/shadow 37 * colors are initialized when the border is created, then 38 * these colors will be dynamically derived from the background 39 * color of the component argument passed into the paintBorder() 40 * method. 41 * <p> 42 * <strong>Warning:</strong> 43 * Serialized objects of this class will not be compatible with 44 * future Swing releases. The current serialization support is 45 * appropriate for short term storage or RMI between applications running 46 * the same version of Swing. As of 1.4, support for long term storage 47 * of all JavaBeans™ 48 * has been added to the <code>java.beans</code> package. 49 * Please see {@link java.beans.XMLEncoder}. 50 * 51 * @author David Kloba 52 * @author Amy Fowler 53 */ 54 public class EtchedBorder extends AbstractBorder 55 { 56 /** Raised etched type. */ 57 public static final int RAISED = 0; 58 /** Lowered etched type. */ 59 public static final int LOWERED = 1; 60 61 protected int etchType; 62 protected Color highlight; 63 protected Color shadow; 64 65 /** 66 * Creates a lowered etched border whose colors will be derived 67 * from the background color of the component passed into 68 * the paintBorder method. 69 */ EtchedBorder()70 public EtchedBorder() { 71 this(LOWERED); 72 } 73 74 /** 75 * Creates an etched border with the specified etch-type 76 * whose colors will be derived 77 * from the background color of the component passed into 78 * the paintBorder method. 79 * @param etchType the type of etch to be drawn by the border 80 */ EtchedBorder(int etchType)81 public EtchedBorder(int etchType) { 82 this(etchType, null, null); 83 } 84 85 /** 86 * Creates a lowered etched border with the specified highlight and 87 * shadow colors. 88 * @param highlight the color to use for the etched highlight 89 * @param shadow the color to use for the etched shadow 90 */ EtchedBorder(Color highlight, Color shadow)91 public EtchedBorder(Color highlight, Color shadow) { 92 this(LOWERED, highlight, shadow); 93 } 94 95 /** 96 * Creates an etched border with the specified etch-type, 97 * highlight and shadow colors. 98 * @param etchType the type of etch to be drawn by the border 99 * @param highlight the color to use for the etched highlight 100 * @param shadow the color to use for the etched shadow 101 */ 102 @ConstructorProperties({"etchType", "highlightColor", "shadowColor"}) EtchedBorder(int etchType, Color highlight, Color shadow)103 public EtchedBorder(int etchType, Color highlight, Color shadow) { 104 this.etchType = etchType; 105 this.highlight = highlight; 106 this.shadow = shadow; 107 } 108 109 /** 110 * Paints the border for the specified component with the 111 * specified position and size. 112 * @param c the component for which this border is being painted 113 * @param g the paint graphics 114 * @param x the x position of the painted border 115 * @param y the y position of the painted border 116 * @param width the width of the painted border 117 * @param height the height of the painted border 118 */ paintBorder(Component c, Graphics g, int x, int y, int width, int height)119 public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 120 int w = width; 121 int h = height; 122 123 g.translate(x, y); 124 125 g.setColor(etchType == LOWERED? getShadowColor(c) : getHighlightColor(c)); 126 g.drawRect(0, 0, w-2, h-2); 127 128 g.setColor(etchType == LOWERED? getHighlightColor(c) : getShadowColor(c)); 129 g.drawLine(1, h-3, 1, 1); 130 g.drawLine(1, 1, w-3, 1); 131 132 g.drawLine(0, h-1, w-1, h-1); 133 g.drawLine(w-1, h-1, w-1, 0); 134 135 g.translate(-x, -y); 136 } 137 138 /** 139 * Reinitialize the insets parameter with this Border's current Insets. 140 * @param c the component for which this border insets value applies 141 * @param insets the object to be reinitialized 142 */ getBorderInsets(Component c, Insets insets)143 public Insets getBorderInsets(Component c, Insets insets) { 144 insets.set(2, 2, 2, 2); 145 return insets; 146 } 147 148 /** 149 * Returns whether or not the border is opaque. 150 */ isBorderOpaque()151 public boolean isBorderOpaque() { return true; } 152 153 /** 154 * Returns which etch-type is set on the etched border. 155 */ getEtchType()156 public int getEtchType() { 157 return etchType; 158 } 159 160 /** 161 * Returns the highlight color of the etched border 162 * when rendered on the specified component. If no highlight 163 * color was specified at instantiation, the highlight color 164 * is derived from the specified component's background color. 165 * @param c the component for which the highlight may be derived 166 * @since 1.3 167 */ getHighlightColor(Component c)168 public Color getHighlightColor(Component c) { 169 return highlight != null? highlight : 170 c.getBackground().brighter(); 171 } 172 173 /** 174 * Returns the highlight color of the etched border. 175 * Will return null if no highlight color was specified 176 * at instantiation. 177 * @since 1.3 178 */ getHighlightColor()179 public Color getHighlightColor() { 180 return highlight; 181 } 182 183 /** 184 * Returns the shadow color of the etched border 185 * when rendered on the specified component. If no shadow 186 * color was specified at instantiation, the shadow color 187 * is derived from the specified component's background color. 188 * @param c the component for which the shadow may be derived 189 * @since 1.3 190 */ getShadowColor(Component c)191 public Color getShadowColor(Component c) { 192 return shadow != null? shadow : c.getBackground().darker(); 193 } 194 195 /** 196 * Returns the shadow color of the etched border. 197 * Will return null if no shadow color was specified 198 * at instantiation. 199 * @since 1.3 200 */ getShadowColor()201 public Color getShadowColor() { 202 return shadow; 203 } 204 205 } 206