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     * CenterLayout.java
029     * -----------------
030     * (C) Copyright 2000-2005, by Object Refinery Limited.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   -;
034     *
035     * $Id: CenterLayout.java,v 1.6 2005/11/16 15:58:40 taqua Exp $
036     *
037     * Changes (from 5-Nov-2001)
038     * -------------------------
039     * 05-Nov-2001 : Changed package to com.jrefinery.layout.* (DG);
040     * 10-Oct-2002 : Fixed errors reported by Checkstyle (DG);
041     *
042     */
043    
044    package org.jfree.layout;
045    
046    import java.awt.Component;
047    import java.awt.Container;
048    import java.awt.Dimension;
049    import java.awt.Insets;
050    import java.awt.LayoutManager;
051    import java.io.Serializable;
052    
053    /**
054     * A layout manager that displays a single component in the center of its 
055     * container.
056     *
057     * @author David Gilbert
058     */
059    public class CenterLayout implements LayoutManager, Serializable {
060    
061        /** For serialization. */
062        private static final long serialVersionUID = 469319532333015042L;
063        
064        /**
065         * Creates a new layout manager.
066         */
067        public CenterLayout() {
068        }
069    
070        /**
071         * Returns the preferred size.
072         *
073         * @param parent  the parent.
074         *
075         * @return the preferred size.
076         */
077        public Dimension preferredLayoutSize(final Container parent) {
078    
079            synchronized (parent.getTreeLock()) {
080                final Insets insets = parent.getInsets();
081                if (parent.getComponentCount() > 0) {
082                    final Component component = parent.getComponent(0);
083                    final Dimension d = component.getPreferredSize();
084                    return new Dimension(
085                        (int) d.getWidth() + insets.left + insets.right,
086                        (int) d.getHeight() + insets.top + insets.bottom
087                    );
088                }
089                else {
090                    return new Dimension(
091                        insets.left + insets.right, insets.top + insets.bottom
092                    );
093                }
094            }
095    
096        }
097    
098        /**
099         * Returns the minimum size.
100         *
101         * @param parent  the parent.
102         *
103         * @return the minimum size.
104         */
105        public Dimension minimumLayoutSize(final Container parent) {
106    
107            synchronized (parent.getTreeLock()) {
108                final Insets insets = parent.getInsets();
109                if (parent.getComponentCount() > 0) {
110                    final Component component = parent.getComponent(0);
111                    final Dimension d = component.getMinimumSize();
112                    return new Dimension(d.width + insets.left + insets.right,
113                                     d.height + insets.top + insets.bottom);
114                }
115                else {
116                  return new Dimension(insets.left + insets.right,
117                                       insets.top + insets.bottom);
118                }
119            }
120    
121        }
122    
123        /**
124         * Lays out the components.
125         *
126         * @param parent  the parent.
127         */
128        public void layoutContainer(final Container parent) {
129    
130            synchronized (parent.getTreeLock()) {
131                if (parent.getComponentCount() > 0) {
132                    final Insets insets = parent.getInsets();
133                    final Dimension parentSize = parent.getSize();
134                    final Component component = parent.getComponent(0);
135                    final Dimension componentSize = component.getPreferredSize();
136                    final int xx = insets.left + (
137                        Math.max((parentSize.width - insets.left - insets.right
138                                          - componentSize.width) / 2, 0)
139                    );
140                    final int yy = insets.top + (
141                        Math.max((parentSize.height - insets.top - insets.bottom
142                                          - componentSize.height) / 2, 0));
143                    component.setBounds(xx, yy, componentSize.width, 
144                            componentSize.height);
145                }
146            }
147    
148        }
149    
150        /**
151         * Not used.
152         *
153         * @param comp  the component.
154         */
155        public void addLayoutComponent(final Component comp) {
156            // not used.
157        }
158    
159        /**
160         * Not used.
161         *
162         * @param comp  the component.
163         */
164        public void removeLayoutComponent(final Component comp) {
165            // not used
166        }
167    
168        /**
169         * Not used.
170         *
171         * @param name  the component name.
172         * @param comp  the component.
173         */
174        public void addLayoutComponent(final String name, final Component comp) {
175            // not used
176        }
177    
178        /**
179         * Not used.
180         *
181         * @param name  the component name.
182         * @param comp  the component.
183         */
184        public void removeLayoutComponent(final String name, final Component comp) {
185            // not used
186        }
187    
188    }