001: /* ========================================================================
002: * JCommon : a free general purpose class library for the Java(tm) platform
003: * ========================================================================
004: *
005: * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006: *
007: * Project Info: http://www.jfree.org/jcommon/index.html
008: *
009: * This library is free software; you can redistribute it and/or modify it
010: * under the terms of the GNU Lesser General Public License as published by
011: * the Free Software Foundation; either version 2.1 of the License, or
012: * (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but
015: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017: * License for more details.
018: *
019: * You should have received a copy of the GNU Lesser General Public
020: * License along with this library; if not, write to the Free Software
021: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
022: * USA.
023: *
024: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025: * in the United States and other countries.]
026: *
027: * ------------------------------
028: * OverlayLayout.java
029: * ------------------------------
030: * (C)opyright 2003, by Thomas Morgner and Contributors.
031: *
032: * Original Author: Thomas Morgner;
033: * Contributor(s): -;
034: *
035: * $Id: OverlayLayout.java,v 1.5 2005/10/18 13:18:34 mungady Exp $
036: *
037: * Changes
038: * -------------------------
039: * 09-12-2003 : Initial version
040: *
041: */
042: package org.jfree.ui;
043:
044: import java.awt.Component;
045: import java.awt.Container;
046: import java.awt.Dimension;
047: import java.awt.Insets;
048: import java.awt.LayoutManager;
049: import java.awt.Rectangle;
050:
051: /**
052: * A simple layoutmanager to overlay all components of a parent.
053: * <p/>
054: * This layout manager acts similiar to the card layout, but all
055: * childs of the parent band have the same size and all childs can
056: * be visible at the same time.
057: *
058: * @author Thomas Morgner
059: */
060: public final class OverlayLayout implements LayoutManager {
061:
062: /**
063: * A flag that defines, whether invisible components should be ignored when
064: * computing the layout.
065: */
066: private boolean ignoreInvisible;
067:
068: /**
069: * Creates a new instance.
070: *
071: * @param ignoreInvisible whether to ignore invisible components when computing the layout.
072: */
073: public OverlayLayout(final boolean ignoreInvisible) {
074: this .ignoreInvisible = ignoreInvisible;
075: }
076:
077: /**
078: * DefaultConstructor.
079: */
080: public OverlayLayout() {
081:
082: }
083:
084: /**
085: * If the layout manager uses a per-component string,
086: * adds the component <code>comp</code> to the layout,
087: * associating it
088: * with the string specified by <code>name</code>.
089: *
090: * @param name the string to be associated with the component
091: * @param comp the component to be added
092: */
093: public void addLayoutComponent(final String name,
094: final Component comp) {
095: }
096:
097: /**
098: * Removes the specified component from the layout.
099: *
100: * @param comp the component to be removed
101: */
102: public void removeLayoutComponent(final Component comp) {
103: }
104:
105: /**
106: * Lays out the specified container.
107: *
108: * @param parent the container to be laid out
109: */
110: public void layoutContainer(final Container parent) {
111: synchronized (parent.getTreeLock()) {
112: final Insets ins = parent.getInsets();
113:
114: final Rectangle bounds = parent.getBounds();
115: final int width = bounds.width - ins.left - ins.right;
116: final int height = bounds.height - ins.top - ins.bottom;
117:
118: final Component[] comps = parent.getComponents();
119:
120: for (int i = 0; i < comps.length; i++) {
121: final Component c = comps[i];
122: if ((comps[i].isVisible() == false)
123: && this .ignoreInvisible) {
124: continue;
125: }
126: c.setBounds(ins.left, ins.top, width, height);
127: }
128: }
129: }
130:
131: /**
132: * Calculates the minimum size dimensions for the specified
133: * container, given the components it contains.
134: *
135: * @param parent the component to be laid out
136: * @return the minimum size computed for the parent.
137: * @see #preferredLayoutSize
138: */
139: public Dimension minimumLayoutSize(final Container parent) {
140: synchronized (parent.getTreeLock()) {
141: final Insets ins = parent.getInsets();
142: final Component[] comps = parent.getComponents();
143: int height = 0;
144: int width = 0;
145: for (int i = 0; i < comps.length; i++) {
146: if ((comps[i].isVisible() == false)
147: && this .ignoreInvisible) {
148: continue;
149: }
150:
151: final Dimension pref = comps[i].getMinimumSize();
152: if (pref.height > height) {
153: height = pref.height;
154: }
155: if (pref.width > width) {
156: width = pref.width;
157: }
158: }
159: return new Dimension(width + ins.left + ins.right, height
160: + ins.top + ins.bottom);
161: }
162: }
163:
164: /**
165: * Calculates the preferred size dimensions for the specified
166: * container, given the components it contains.
167: *
168: * @param parent the container to be laid out
169: * @return the preferred size computed for the parent.
170: * @see #minimumLayoutSize
171: */
172: public Dimension preferredLayoutSize(final Container parent) {
173: synchronized (parent.getTreeLock()) {
174: final Insets ins = parent.getInsets();
175: final Component[] comps = parent.getComponents();
176: int height = 0;
177: int width = 0;
178: for (int i = 0; i < comps.length; i++) {
179: if ((comps[i].isVisible() == false)
180: && this .ignoreInvisible) {
181: continue;
182: }
183:
184: final Dimension pref = comps[i].getPreferredSize();
185: if (pref.height > height) {
186: height = pref.height;
187: }
188: if (pref.width > width) {
189: width = pref.width;
190: }
191: }
192: return new Dimension(width + ins.left + ins.right, height
193: + ins.top + ins.bottom);
194: }
195: }
196:
197: }
|