package com.sun.java.forums;
import java.awt.Component;
import java.awt.Container;
import javax.swing.Spring;
import javax.swing.SpringLayout;
/**
* A 1.4 file that provides utility methods for creating form- or grid-style layouts with SpringLayout. These utilities
* are used by several programs, such as SpringBox and SpringCompactGrid.
*/
public class SpringUtilities
{
/**
* A debugging utility that prints to stdout the component's minimum, preferred, and maximum sizes.
*/
public static void printSizes( final Component c )
{
System.out.println( "minimumSize = " + c.getMinimumSize() );
System.out.println( "preferredSize = " + c.getPreferredSize() );
System.out.println( "maximumSize = " + c.getMaximumSize() );
}
/**
* Aligns the first <code>rows</code> * <code>cols</code> components of <code>parent</code> in a grid. Each
* component is as big as the maximum preferred width and height of the components. The parent is made just big
* enough to fit them all.
*
* @param rows number of rows
* @param cols number of columns
* @param initialX x location to start the grid at
* @param initialY y location to start the grid at
* @param xPad x padding between cells
* @param yPad y padding between cells
*/
public static void makeGrid( final Container parent, final int rows, final int cols, final int initialX,
final int initialY, final int xPad, final int yPad )
{
SpringLayout layout;
try
{
layout = (SpringLayout) parent.getLayout();
}
catch ( ClassCastException exc )
{
System.err.println( "The first argument to makeGrid must use SpringLayout." );
return;
}
Spring xPadSpring = Spring.constant( xPad );
Spring yPadSpring = Spring.constant( yPad );
Spring initialXSpring = Spring.constant( initialX );
Spring initialYSpring = Spring.constant( initialY );
int max = rows * cols;
//Calculate Springs that are the max of the width/height so that all
//cells have the same size.
Spring maxWidthSpring = layout.getConstraints( parent.getComponent( 0 ) ).getWidth();
Spring maxHeightSpring = layout.getConstraints( parent.getComponent( 0 ) ).getWidth();
for ( int i = 1; i < max; i++ )
{
SpringLayout.Constraints cons = layout.getConstraints( parent.getComponent( i ) );
maxWidthSpring = Spring.max( maxWidthSpring, cons.getWidth() );
maxHeightSpring = Spring.max( maxHeightSpring, cons.getHeight() );
}
//Apply the new width/height Spring. This forces all the
//components to have the same size.
for ( int i = 0; i < max; i++ )
{
SpringLayout.Constraints cons = layout.getConstraints( parent.getComponent( i ) );
cons.setWidth( maxWidthSpring );
cons.setHeight( maxHeightSpring );
}
//Then adjust the x/y constraints of all the cells so that they
//are aligned in a grid.
SpringLayout.Constraints lastCons = null;
SpringLayout.Constraints lastRowCons = null;
for ( int i = 0; i < max; i++ )
{
SpringLayout.Constraints cons = layout.getConstraints( parent.getComponent( i ) );
if ( i % cols == 0 )
{ //start of new row
lastRowCons = lastCons;
cons.setX( initialXSpring );
}
else
{
cons.setX( Spring.sum( lastCons.getConstraint( SpringLayout.EAST ), xPadSpring ) );
}
if ( i / cols == 0 )
{
cons.setY( initialYSpring );
}
else
{
cons.setY( Spring.sum( lastRowCons.getConstraint( SpringLayout.SOUTH ), yPadSpring ) );
}
lastCons = cons;
}
//Set the parent's size.
SpringLayout.Constraints pCons = layout.getConstraints( parent );
pCons.setConstraint( SpringLayout.SOUTH, Spring.sum(
Spring.constant( yPad ), lastCons.getConstraint( SpringLayout.SOUTH ) ) );
pCons.setConstraint( SpringLayout.EAST, Spring.sum(
Spring.constant( xPad ), lastCons.getConstraint( SpringLayout.EAST ) ) );
}
/* Used by makeCompactGrid. */
private static SpringLayout.Constraints getConstraintsForCell( final int row, final int col,
final Container parent, final int cols )
{
SpringLayout layout = (SpringLayout) parent.getLayout();
Component c = parent.getComponent( row * cols + col );
return layout.getConstraints( c );
}
/**
* Aligns the first <code>rows</code> * <code>cols</code> components of <code>parent</code> in a grid. Each
* component in a column is as wide as the maximum preferred width of the components in that column; height is
* similarly determined for each row. The parent is made just big enough to fit them all.
*
* @param rows number of rows
* @param cols number of columns
* @param initialX x location to start the grid at
* @param initialY y location to start the grid at
* @param xPad x padding between cells
* @param yPad y padding between cells
*/
public static void makeCompactGrid( final Container parent, final int rows, final int cols, final int initialX,
final int initialY, final int xPad, final int yPad )
{
SpringLayout layout;
try
{
layout = (SpringLayout) parent.getLayout();
}
catch ( ClassCastException exc )
{
System.err.println( "The first argument to makeCompactGrid must use SpringLayout." );
return;
}
//Align all cells in each column and make them the same width.
Spring x = Spring.constant( initialX );
for ( int c = 0; c < cols; c++ )
{
Spring width = Spring.constant( 0 );
for ( int r = 0; r < rows; r++ )
{
width = Spring.max( width, SpringUtilities.getConstraintsForCell( r, c, parent, cols ).getWidth() );
}
for ( int r = 0; r < rows; r++ )
{
SpringLayout.Constraints constraints = SpringUtilities.getConstraintsForCell( r, c, parent, cols );
constraints.setX( x );
constraints.setWidth( width );
}
x = Spring.sum( x, Spring.sum( width, Spring.constant( xPad ) ) );
}
//Align all cells in each row and make them the same height.
Spring y = Spring.constant( initialY );
for ( int r = 0; r < rows; r++ )
{
Spring height = Spring.constant( 0 );
for ( int c = 0; c < cols; c++ )
{
height = Spring.max( height, SpringUtilities.getConstraintsForCell( r, c, parent, cols ).getHeight() );
}
for ( int c = 0; c < cols; c++ )
{
SpringLayout.Constraints constraints = SpringUtilities.getConstraintsForCell( r, c, parent, cols );
constraints.setY( y );
constraints.setHeight( height );
}
y = Spring.sum( y, Spring.sum( height, Spring.constant( yPad ) ) );
}
//Set the parent's size.
SpringLayout.Constraints pCons = layout.getConstraints( parent );
pCons.setConstraint( SpringLayout.SOUTH, y );
pCons.setConstraint( SpringLayout.EAST, x );
}
}