|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.tools.jconsole; |
|
|
|
import java.awt.*; |
|
|
|
import javax.swing.*; |
|
|
|
@SuppressWarnings("serial") |
|
public class VariableGridLayout extends GridLayout { |
|
|
|
private boolean fillRows, fillColumns; |
|
|
|
public VariableGridLayout(int rows, int cols, |
|
int hgap, int vgap, |
|
boolean fillRows, boolean fillColumns) { |
|
super(rows, cols, hgap, vgap); |
|
|
|
this.fillRows = fillRows; |
|
this.fillColumns = fillColumns; |
|
} |
|
|
|
public void setFillRow(JComponent c, boolean b) { |
|
c.putClientProperty("VariableGridLayout.fillRow", b); |
|
} |
|
|
|
public void setFillColumn(JComponent c, boolean b) { |
|
c.putClientProperty("VariableGridLayout.fillColumn", b); |
|
} |
|
|
|
public boolean getFillRow(JComponent c) { |
|
Boolean b = (Boolean)c.getClientProperty("VariableGridLayout.fillRow"); |
|
return (b != null) ? b : fillRows; |
|
} |
|
|
|
public boolean getFillColumn(JComponent c) { |
|
Boolean b = (Boolean)c.getClientProperty("VariableGridLayout.fillColumn"); |
|
return (b != null) ? b : fillColumns; |
|
} |
|
|
|
public void layoutContainer(Container parent) { |
|
Insets insets = parent.getInsets(); |
|
int ncomponents = parent.getComponentCount(); |
|
int nrows = getRows(); |
|
int ncols = getColumns(); |
|
int hgap = getHgap(); |
|
int vgap = getVgap(); |
|
|
|
if (nrows > 0) { |
|
ncols = (ncomponents + nrows - 1) / nrows; |
|
} else { |
|
nrows = (ncomponents + ncols - 1) / ncols; |
|
} |
|
|
|
|
|
int x; |
|
int y; |
|
int nFills = 0; |
|
boolean[] fills = new boolean[nrows]; |
|
int lastFillRow = -1; |
|
int nComps = parent.getComponentCount(); |
|
|
|
y = insets.top; |
|
for (int row = 0; row < nrows; row++) { |
|
|
|
int h = 0; |
|
for (int col = 0; col < ncols; col++) { |
|
if (row * ncols + col < nComps) { |
|
Component c = parent.getComponent(row * ncols + col); |
|
h = Math.max(h, c.getMinimumSize().height); |
|
} |
|
} |
|
|
|
x = insets.left; |
|
for (int col = 0; col < ncols; col++) { |
|
if (row * ncols + col < nComps) { |
|
JComponent c = (JComponent)parent.getComponent(row * ncols + col); |
|
int w = c.getWidth(); |
|
c.setBounds(x, y, w, h); |
|
x += w + hgap; |
|
if (col == 0 && getFillRow(c)) { |
|
fills[row] = true; |
|
} |
|
} |
|
} |
|
y += h + vgap; |
|
if (fills[row]) { |
|
nFills++; |
|
lastFillRow = row; |
|
} |
|
} |
|
|
|
|
|
if (nFills > 0 && y < parent.getHeight()) { |
|
|
|
int hAdd = (parent.getHeight() - y) / nFills; |
|
int hAdded = 0; |
|
for (int row = 0; row < nrows; row++) { |
|
if (fills[row]) { |
|
if (row == lastFillRow) { |
|
|
|
hAdd = parent.getHeight() - (y+hAdded); |
|
} |
|
for (int col = 0; col < ncols; col++) { |
|
if (row * ncols + col < nComps) { |
|
Component c = parent.getComponent(row * ncols + col); |
|
Rectangle b = c.getBounds(); |
|
c.setBounds(b.x, b.y + hAdded, b.width, b.height + hAdd); |
|
} |
|
} |
|
hAdded += hAdd; |
|
} |
|
} |
|
} |
|
|
|
|
|
nFills = 0; |
|
fills = new boolean[ncols]; |
|
int lastFillCol = -1; |
|
|
|
x = insets.left; |
|
for (int col = 0; col < ncols; col++) { |
|
|
|
int w = 0; |
|
for (int row = 0; row < nrows; row++) { |
|
if (row * ncols + col < nComps) { |
|
Component c = parent.getComponent(row * ncols + col); |
|
w = Math.max(w, c.getMinimumSize().width); |
|
} |
|
} |
|
|
|
y = insets.top; |
|
for (int row = 0; row < nrows; row++) { |
|
if (row * ncols + col < nComps) { |
|
JComponent c = (JComponent)parent.getComponent(row * ncols + col); |
|
int h = c.getHeight(); |
|
c.setBounds(x, y, w, h); |
|
y += h + vgap; |
|
if (row == 0 && getFillColumn(c)) { |
|
fills[col] = true; |
|
} |
|
} |
|
} |
|
x += w + hgap; |
|
if (fills[col]) { |
|
nFills++; |
|
lastFillCol = col; |
|
} |
|
} |
|
|
|
|
|
if (nFills > 0 && x < parent.getWidth()) { |
|
|
|
int wAdd = (parent.getWidth() - x) / nFills; |
|
int wAdded = 0; |
|
for (int col = 0; col < ncols; col++) { |
|
if (fills[col]) { |
|
if (col == lastFillCol) { |
|
wAdd = parent.getWidth() - (x+wAdded); |
|
} |
|
for (int row = 0; row < nrows; row++) { |
|
if (row * ncols + col < nComps) { |
|
Component c = parent.getComponent(row * ncols + col); |
|
Rectangle b = c.getBounds(); |
|
c.setBounds(b.x + wAdded, b.y, b.width + wAdd, b.height); |
|
} |
|
} |
|
wAdded += wAdd; |
|
} |
|
} |
|
} |
|
} |
|
|
|
public Dimension preferredLayoutSize(Container parent) { |
|
Insets insets = parent.getInsets(); |
|
int ncomponents = parent.getComponentCount(); |
|
int nrows = getRows(); |
|
int ncols = getColumns(); |
|
int hgap = getHgap(); |
|
int vgap = getVgap(); |
|
|
|
if (nrows > 0) { |
|
ncols = (ncomponents + nrows - 1) / nrows; |
|
} else { |
|
nrows = (ncomponents + ncols - 1) / ncols; |
|
} |
|
|
|
int nComps = parent.getComponentCount(); |
|
|
|
int y = insets.top; |
|
for (int row = 0; row < nrows; row++) { |
|
int h = 0; |
|
for (int col = 0; col < ncols; col++) { |
|
if (row * ncols + col < nComps) { |
|
Component c = parent.getComponent(row * ncols + col); |
|
h = Math.max(h, c.getMinimumSize().height); |
|
} |
|
} |
|
y += h + vgap; |
|
} |
|
|
|
int x = insets.left; |
|
for (int col = 0; col < ncols; col++) { |
|
int w = 0; |
|
for (int row = 0; row < nrows; row++) { |
|
if (row * ncols + col < nComps) { |
|
Component c = parent.getComponent(row * ncols + col); |
|
w = Math.max(w, c.getMinimumSize().width); |
|
} |
|
} |
|
x += w + hgap; |
|
} |
|
return new Dimension(x, y); |
|
} |
|
} |