diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/SwingUtil.java b/projects/samskivert/src/java/com/samskivert/swing/util/SwingUtil.java index 99cc319e..77fbf0be 100644 --- a/projects/samskivert/src/java/com/samskivert/swing/util/SwingUtil.java +++ b/projects/samskivert/src/java/com/samskivert/swing/util/SwingUtil.java @@ -1,5 +1,5 @@ // -// $Id: SwingUtil.java,v 1.30 2004/02/25 13:17:41 mdb Exp $ +// $Id: SwingUtil.java,v 1.31 2004/03/13 16:07:53 mdb Exp $ // // samskivert library - useful routines for java programs // Copyright (C) 2001 Michael Bayne @@ -49,6 +49,8 @@ import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTable; +import javax.swing.Spring; +import javax.swing.SpringLayout; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; @@ -597,6 +599,80 @@ public class SwingUtil } } + /** + * Aligns the first rows * cols components + * of parent 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. The components should be + * already added to the parent in row-major order. + * + * @param parent the container component; must be configured with a + * {@link SpringLayout} prior to calling this method. + * @param rows number of rows. + * @param cols number of columns. + * @param initialX x location at which to start the grid. + * @param initialY y location at which to start the grid. + * @param xPad x padding between cells. + * @param yPad y padding between cells. + */ + public static void makeCompactGrid ( + Container parent, int rows, int cols, + int initialX, int initialY, int xPad, int yPad) + { + SpringLayout layout = (SpringLayout)parent.getLayout(); + + // 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, getConstraintsForCell( + r, c, parent, cols).getWidth()); + } + for (int r = 0; r < rows; r++) { + SpringLayout.Constraints constraints = + 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, getConstraintsForCell( + r, c, parent, cols).getHeight()); + } + for (int c = 0; c < cols; c++) { + SpringLayout.Constraints constraints = + 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); + } + + /* Used by {@link #makeCompactGrid}. */ + protected static SpringLayout.Constraints getConstraintsForCell ( + int row, int col, Container parent, int cols) + { + SpringLayout layout = (SpringLayout)parent.getLayout(); + Component c = parent.getComponent(row * cols + col); + return layout.getConstraints(c); + } + /** Used by {@link #addDebugBorders}. */ protected static Random _rando = new Random(); }