History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/javax/swing/OverlayLayout.java (1 of 18352 files). Show all

Unified · Split

java/pkg/javax/swing/OverlayLayout.java+288−0
@@ -0,0 +1,288 @@
1/*
2 * Copyright (c) 1997, 2007, 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 */
25package javax.swing;
26
27
28import java.awt.*;
29import java.beans.ConstructorProperties;
30import java.io.Serializable;
31
32/**
33 * A layout manager to arrange components over the top
34 * of each other. The requested size of the container
35 * will be the largest requested size of the children,
36 * taking alignment needs into consideration.
37 *
38 * The alignment is based upon what is needed to properly
39 * fit the children in the allocation area. The children
40 * will be placed such that their alignment points are all
41 * on top of each other.
42 * <p>
43 * <strong>Warning:</strong>
44 * Serialized objects of this class will not be compatible with
45 * future Swing releases. The current serialization support is
46 * appropriate for short term storage or RMI between applications running
47 * the same version of Swing. As of 1.4, support for long term storage
48 * of all JavaBeans<sup><font size="-2">TM</font></sup>
49 * has been added to the <code>java.beans</code> package.
50 * Please see {@link java.beans.XMLEncoder}.
51 *
52 * @author Timothy Prinzing
53 */
54public class OverlayLayout implements LayoutManager2,Serializable {
55
56 /**
57 * Constructs a layout manager that performs overlay
58 * arrangement of the children. The layout manager
59 * created is dedicated to the given container.
60 *
61 * @param target the container to do layout against
62 */
63 @ConstructorProperties({"target"})
64 public OverlayLayout(Container target) {
65 this.target = target;
66 }
67
68 /**
69 * Returns the container that uses this layout manager.
70 *
71 * @return the container that uses this layout manager
72 *
73 * @since 1.6
74 */
75 public final Container getTarget() {
76 return this.target;
77 }
78
79 /**
80 * Indicates a child has changed its layout related information,
81 * which causes any cached calculations to be flushed.
82 *
83 * @param target the container
84 */
85 public void invalidateLayout(Container target) {
86 checkContainer(target);
87 xChildren = null;
88 yChildren = null;
89 xTotal = null;
90 yTotal = null;
91 }
92
93 /**
94 * Adds the specified component to the layout. Used by
95 * this class to know when to invalidate layout.
96 *
97 * @param name the name of the component
98 * @param comp the the component to be added
99 */
100 public void addLayoutComponent(String name, Component comp) {
101 invalidateLayout(comp.getParent());
102 }
103
104 /**
105 * Removes the specified component from the layout. Used by
106 * this class to know when to invalidate layout.
107 *
108 * @param comp the component to remove
109 */
110 public void removeLayoutComponent(Component comp) {
111 invalidateLayout(comp.getParent());
112 }
113
114 /**
115 * Adds the specified component to the layout, using the specified
116 * constraint object. Used by this class to know when to invalidate
117 * layout.
118 *
119 * @param comp the component to be added
120 * @param constraints where/how the component is added to the layout.
121 */
122 public void addLayoutComponent(Component comp, Object constraints) {
123 invalidateLayout(comp.getParent());
124 }
125
126 /**
127 * Returns the preferred dimensions for this layout given the components
128 * in the specified target container. Recomputes the layout if it
129 * has been invalidated. Factors in the current inset setting returned
130 * by getInsets().
131 *
132 * @param target the component which needs to be laid out
133 * @return a Dimension object containing the preferred dimensions
134 * @see #minimumLayoutSize
135 */
136 public Dimension preferredLayoutSize(Container target) {
137 checkContainer(target);
138 checkRequests();
139
140 Dimension size = new Dimension(xTotal.preferred, yTotal.preferred);
141 Insets insets = target.getInsets();
142 size.width += insets.left + insets.right;
143 size.height += insets.top + insets.bottom;
144 return size;
145 }
146
147 /**
148 * Returns the minimum dimensions needed to lay out the components
149 * contained in the specified target container. Recomputes the layout
150 * if it has been invalidated, and factors in the current inset setting.
151 *
152 * @param target the component which needs to be laid out
153 * @return a Dimension object containing the minimum dimensions
154 * @see #preferredLayoutSize
155 */
156 public Dimension minimumLayoutSize(Container target) {
157 checkContainer(target);
158 checkRequests();
159
160 Dimension size = new Dimension(xTotal.minimum, yTotal.minimum);
161 Insets insets = target.getInsets();
162 size.width += insets.left + insets.right;
163 size.height += insets.top + insets.bottom;
164 return size;
165 }
166
167 /**
168 * Returns the maximum dimensions needed to lay out the components
169 * contained in the specified target container. Recomputes the
170 * layout if it has been invalidated, and factors in the inset setting
171 * returned by <code>getInset</code>.
172 *
173 * @param target the component that needs to be laid out
174 * @return a <code>Dimension</code> object containing the maximum
175 * dimensions
176 * @see #preferredLayoutSize
177 */
178 public Dimension maximumLayoutSize(Container target) {
179 checkContainer(target);
180 checkRequests();
181
182 Dimension size = new Dimension(xTotal.maximum, yTotal.maximum);
183 Insets insets = target.getInsets();
184 size.width += insets.left + insets.right;
185 size.height += insets.top + insets.bottom;
186 return size;
187 }
188
189 /**
190 * Returns the alignment along the x axis for the container.
191 *
192 * @param target the container
193 * @return the alignment >= 0.0f && <= 1.0f
194 */
195 public float getLayoutAlignmentX(Container target) {
196 checkContainer(target);
197 checkRequests();
198 return xTotal.alignment;
199 }
200
201 /**
202 * Returns the alignment along the y axis for the container.
203 *
204 * @param target the container
205 * @return the alignment >= 0.0f && <= 1.0f
206 */
207 public float getLayoutAlignmentY(Container target) {
208 checkContainer(target);
209 checkRequests();
210 return yTotal.alignment;
211 }
212
213 /**
214 * Called by the AWT when the specified container needs to be laid out.
215 *
216 * @param target the container to lay out
217 *
218 * @exception AWTError if the target isn't the container specified to the
219 * constructor
220 */
221 public void layoutContainer(Container target) {
222 checkContainer(target);
223 checkRequests();
224
225 int nChildren = target.getComponentCount();
226 int[] xOffsets = new int[nChildren];
227 int[] xSpans = new int[nChildren];
228 int[] yOffsets = new int[nChildren];
229 int[] ySpans = new int[nChildren];
230
231 // determine the child placements
232 Dimension alloc = target.getSize();
233 Insets in = target.getInsets();
234 alloc.width -= in.left + in.right;
235 alloc.height -= in.top + in.bottom;
236 SizeRequirements.calculateAlignedPositions(alloc.width, xTotal,
237 xChildren, xOffsets,
238 xSpans);
239 SizeRequirements.calculateAlignedPositions(alloc.height, yTotal,
240 yChildren, yOffsets,
241 ySpans);
242
243 // flush changes to the container
244 for (int i = 0; i < nChildren; i++) {
245 Component c = target.getComponent(i);
246 c.setBounds(in.left + xOffsets[i], in.top + yOffsets[i],
247 xSpans[i], ySpans[i]);
248 }
249 }
250
251 void checkContainer(Container target) {
252 if (this.target != target) {
253 throw new AWTError("OverlayLayout can't be shared");
254 }
255 }
256
257 void checkRequests() {
258 if (xChildren == null || yChildren == null) {
259 // The requests have been invalidated... recalculate
260 // the request information.
261 int n = target.getComponentCount();
262 xChildren = new SizeRequirements[n];
263 yChildren = new SizeRequirements[n];
264 for (int i = 0; i < n; i++) {
265 Component c = target.getComponent(i);
266 Dimension min = c.getMinimumSize();
267 Dimension typ = c.getPreferredSize();
268 Dimension max = c.getMaximumSize();
269 xChildren[i] = new SizeRequirements(min.width, typ.width,
270 max.width,
271 c.getAlignmentX());
272 yChildren[i] = new SizeRequirements(min.height, typ.height,
273 max.height,
274 c.getAlignmentY());
275 }
276
277 xTotal = SizeRequirements.getAlignedSizeRequirements(xChildren);
278 yTotal = SizeRequirements.getAlignedSizeRequirements(yChildren);
279 }
280 }
281
282 private Container target;
283 private SizeRequirements[] xChildren;
284 private SizeRequirements[] yChildren;
285 private SizeRequirements xTotal;
286 private SizeRequirements yTotal;
287
288}