Remove old autovect-branch by moving to "dead" directory.
[official-gcc.git] / old-autovect-branch / libjava / classpath / javax / swing / border / CompoundBorder.java
blob998a9bab3bdbbb5bbd44d723564403a40b61c8ed
1 /* CompoundBorder.java --
2 Copyright (C) 2003 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 package javax.swing.border;
41 import java.awt.Component;
42 import java.awt.Graphics;
43 import java.awt.Insets;
45 /**
46 * A Border that is composed of an interior and an exterior border,
47 * where the interior border is tightly nested into the exterior.
49 * @author Sascha Brawer (brawer@dandelis.ch)
51 public class CompoundBorder extends AbstractBorder
53 /**
54 * Determined using the <code>serialver</code> tool
55 * of Apple/Sun JDK 1.3.1 on MacOS X 10.1.5.
57 static final long serialVersionUID = 9054540377030555103L;
59 /**
60 * The inside border, which is painted between the bordered
61 * Component and the outside border. It is valid for
62 * <code>insideBorder</code> to be <code>null</code>.
64 protected Border insideBorder;
66 /**
67 * The outside border, which is painted outside both the
68 * bordered Component and the inside border. It is valid for
69 * <code>outsideBorder</code> to be <code>null</code>.
71 protected Border outsideBorder;
73 /**
74 * Constructs a CompoundBorder whose inside and outside borders
75 * are both <code>null</code>. While this does not really make
76 * any sense (there exists a class EmptyBorder as well, and not
77 * every Component needs to have a border at all), the API
78 * specification requires the existence of this constructor.
80 * @see EmptyBorder
82 public CompoundBorder()
84 this (null, null);
87 /**
88 * Constructs a CompoundBorder with the specified inside and
89 * outside borders.
91 * @param outsideBorder the outside border, which is painted to the
92 * outside of both <code>insideBorder</code> and the enclosed
93 * component. It is acceptable to pass <code>null</code>, in
94 * which case no outside border is painted.
96 * @param insideBorder the inside border, which is painted to
97 * between <code>outsideBorder</code> and the enclosed
98 * component. It is acceptable to pass <code>null</code>, in
99 * which case no inside border is painted.
101 public CompoundBorder(Border outsideBorder, Border insideBorder)
103 this.outsideBorder = outsideBorder;
104 this.insideBorder = insideBorder;
108 * Determines whether or not this border is opaque. An opaque
109 * border fills every pixel in its area when painting. Partially
110 * translucent borders must return <code>false</code>, or ugly
111 * artifacts can appear on screen.
113 * @return <code>true</code> if both the inside and outside borders
114 * are opaque, or <code>false</code> otherwise.
116 public boolean isBorderOpaque()
118 // While it would be safe to assume true for the opacity of
119 // a null border, this behavior would not be according to
120 // the API specification. Also, it is pathological to have
121 // null borders anyway.
122 if ((insideBorder == null) || (outsideBorder == null))
123 return false;
125 return insideBorder.isBorderOpaque()
126 && outsideBorder.isBorderOpaque();
130 * Paints the compound border by first painting the outside border,
131 * then painting the inside border tightly nested into the outside.
133 * @param c the component whose border is to be painted.
134 * @param g the graphics for painting.
135 * @param x the horizontal position for painting the border.
136 * @param y the vertical position for painting the border.
137 * @param width the width of the available area for painting the border.
138 * @param height the height of the available area for painting the border.
140 public void paintBorder(Component c, Graphics g,
141 int x, int y, int width, int height)
143 // If there is an outside border, paint it and reduce the
144 // bounding box by its insets.
146 if (outsideBorder != null)
148 Insets outsideInsets;
150 outsideBorder.paintBorder(c, g, x, y, width, height);
151 outsideInsets = outsideBorder.getBorderInsets(c);
153 x += outsideInsets.left;
154 y += outsideInsets.top;
156 // Reduce width and height by the respective extent of the
157 // outside border.
158 width -= outsideInsets.left + outsideInsets.right;
159 height -= outsideInsets.top + outsideInsets.bottom;
162 if (insideBorder != null)
163 insideBorder.paintBorder(c, g, x, y, width, height);
167 * Changes the specified insets to the insets of this border,
168 * which is the sum of the insets of the inside and the outside
169 * border.
171 * @param c the component in the center of this border.
172 * @param insets an Insets object for holding the added insets.
174 * @return the <code>insets</code> object.
176 public Insets getBorderInsets(Component c, Insets insets)
178 Insets borderInsets;
180 if (insets == null)
181 insets = new Insets (0,0,0,0);
182 else
183 insets.left = insets.right = insets.top = insets.bottom = 0;
185 // If there is an outside border, add it to insets.
186 if (outsideBorder != null)
188 borderInsets = outsideBorder.getBorderInsets(c);
189 insets.left += borderInsets.left;
190 insets.right += borderInsets.right;
191 insets.top += borderInsets.top;
192 insets.bottom += borderInsets.bottom;
195 // If there is an inside border, add it to insets.
196 if (insideBorder != null)
198 borderInsets = insideBorder.getBorderInsets(c);
199 insets.left += borderInsets.left;
200 insets.right += borderInsets.right;
201 insets.top += borderInsets.top;
202 insets.bottom += borderInsets.bottom;
205 return insets;
209 * Determines the insets of this border, which is the sum of the
210 * insets of the inside and the outside border.
212 * @param c the component in the center of this border.
214 public Insets getBorderInsets(Component c)
216 // It is not clear why CompoundBorder does not simply inherit
217 // the implementation from AbstractBorder. However, we want
218 // to be compatible with the API specification, which overrides
219 // the getBorderInsets(Component) method.
220 return getBorderInsets (c, null);
224 * Returns the outside border, which is painted outside both the
225 * bordered Component and the inside border. It is valid for the
226 * result to be <code>null</code>.
228 public Border getOutsideBorder()
230 return outsideBorder;
234 * Returns the inside border, which is painted between the bordered
235 * Component and the outside border. It is valid for the result to
236 * be <code>null</code>.
238 public Border getInsideBorder ()
240 return insideBorder;