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, final Component comp) {
094        }
095    
096        /**
097         * Removes the specified component from the layout.
098         *
099         * @param comp the component to be removed
100         */
101        public void removeLayoutComponent(final Component comp) {
102        }
103    
104        /**
105         * Lays out the specified container.
106         *
107         * @param parent the container to be laid out
108         */
109        public void layoutContainer(final Container parent) {
110            synchronized (parent.getTreeLock()) {
111                final Insets ins = parent.getInsets();
112    
113                final Rectangle bounds = parent.getBounds();
114                final int width = bounds.width - ins.left - ins.right;
115                final int height = bounds.height - ins.top - ins.bottom;
116    
117                final Component[] comps = parent.getComponents();
118    
119                for (int i = 0; i < comps.length; i++) {
120                    final Component c = comps[i];
121                    if ((comps[i].isVisible() == false) && this.ignoreInvisible) {
122                        continue;
123                    }
124                    c.setBounds(ins.left, ins.top, width, height);
125                }
126            }
127        }
128    
129        /**
130         * Calculates the minimum size dimensions for the specified
131         * container, given the components it contains.
132         *
133         * @param parent the component to be laid out
134         * @return the minimum size computed for the parent.
135         * @see #preferredLayoutSize
136         */
137        public Dimension minimumLayoutSize(final Container parent) {
138            synchronized (parent.getTreeLock()) {
139                final Insets ins = parent.getInsets();
140                final Component[] comps = parent.getComponents();
141                int height = 0;
142                int width = 0;
143                for (int i = 0; i < comps.length; i++) {
144                    if ((comps[i].isVisible() == false) && this.ignoreInvisible) {
145                        continue;
146                    }
147    
148                    final Dimension pref = comps[i].getMinimumSize();
149                    if (pref.height > height) {
150                        height = pref.height;
151                    }
152                    if (pref.width > width) {
153                        width = pref.width;
154                    }
155                }
156                return new Dimension(width + ins.left + ins.right,
157                    height + ins.top + ins.bottom);
158            }
159        }
160    
161        /**
162         * Calculates the preferred size dimensions for the specified
163         * container, given the components it contains.
164         *
165         * @param parent the container to be laid out
166         * @return the preferred size computed for the parent.
167         * @see #minimumLayoutSize
168         */
169        public Dimension preferredLayoutSize(final Container parent) {
170            synchronized (parent.getTreeLock()) {
171                final Insets ins = parent.getInsets();
172                final Component[] comps = parent.getComponents();
173                int height = 0;
174                int width = 0;
175                for (int i = 0; i < comps.length; i++) {
176                    if ((comps[i].isVisible() == false) && this.ignoreInvisible) {
177                        continue;
178                    }
179    
180                    final Dimension pref = comps[i].getPreferredSize();
181                    if (pref.height > height) {
182                        height = pref.height;
183                    }
184                    if (pref.width > width) {
185                        width = pref.width;
186                    }
187                }
188                return new Dimension(width + ins.left + ins.right,
189                    height + ins.top + ins.bottom);
190            }
191        }
192    
193    }