Square Layout
/**
* The utillib library.
* More information is available at http://www.jinchess.com/.
* Copyright (C) 2002 Alexander Maryanovsky.
* All rights reserved.
*
* The utillib library is free software; you can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* The utillib library is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with utillib library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import java.awt.*;
/**
* A LayoutManager which lays out a single component making sure its height is
* always the same as its width. If the parent container's width differs from
* it height, the child will be laid out according to its x and y alignment.
*/
public class SquareLayout implements LayoutManager{
/**
* Creates a new SquareLayout.
*/
public SquareLayout(){
}
/**
* Creates a new Container with SquareLayout which will contain the specified
* component.
*/
public static Container createSquareContainer(Component child){
Container container = new Container();
container.setLayout(new SquareLayout());
container.add(child);
return container;
}
/**
* Adds the specified component with the specified name to the layout.
*/
public void addLayoutComponent(String name, Component component){
}
/**
* Removes the specified component from the layout.
*/
public void removeLayoutComponent(Component component){
}
/**
* Returns the sole child of the specified container, or <code>null</code> if
* none. Throws an <code>IllegalStateException</code> if there is more than
* one child.
*/
private Component getChild(Container c){
int childCount = c.getComponentCount();
if (childCount > 1)
throw new IllegalStateException("May not layout more than one component");
else if (childCount == 0)
return null;
else
return c.getComponent(childCount - 1);
}
/**
* Lays out the container in the specified panel.
*/
public void layoutContainer(Container container){
Component child = getChild(container);
if (child == null)
return;
Dimension parentSize = container.getSize();
Insets insets = container.getInsets();
// A rectangle specifying the actual area available for layout.
Rectangle rect = new Rectangle(insets.left, insets.top,
parentSize.width - insets.left - insets.right, parentSize.height - insets.top - insets.bottom);
int minSize = rect.width < rect.height ? rect.width : rect.height;
int widthSpace = rect.width - minSize;
int heightSpace = rect.height - minSize;
child.setBounds(rect.x + (int)(widthSpace*child.getAlignmentX()),
rect.y + (int)(heightSpace*child.getAlignmentY()), minSize, minSize);
}
/**
* Calculates the minimum size dimensions for the specified panel given the
* components in the specified parent container.
*/
public Dimension minimumLayoutSize(Container container){
Component child = getChild(container);
if (child == null)
return new Dimension(0, 0);
Dimension childMinSize = child.getMinimumSize();
Insets insets = container.getInsets();
int width = childMinSize.width + insets.left + insets.right;
int height = childMinSize.height + insets.top + insets.bottom;
int maxSize = Math.max(width, height);
return new Dimension(maxSize, maxSize);
}
/**
* Calculates the preferred size dimensions for the specified panel given the
* components in the specified parent container.
*/
public Dimension preferredLayoutSize(Container container){
Component child = getChild(container);
if (child == null)
return new Dimension(0, 0);
Dimension childPrefSize = child.getPreferredSize();
Insets insets = container.getInsets();
int width = childPrefSize.width + insets.left + insets.right;
int height = childPrefSize.height + insets.top + insets.bottom;
int maxSize = Math.max(width, height);
return new Dimension(maxSize, maxSize);
}
}
Related examples in the same category