diff --git a/projects/samskivert/src/java/com/samskivert/swing/DimenInfo.java b/projects/samskivert/src/java/com/samskivert/swing/DimenInfo.java index ddcf2c54..5963e3a5 100644 --- a/projects/samskivert/src/java/com/samskivert/swing/DimenInfo.java +++ b/projects/samskivert/src/java/com/samskivert/swing/DimenInfo.java @@ -40,6 +40,9 @@ public class DimenInfo public int fixwid; public int fixhei; + public int maxfreewid; + public int maxfreehei; + public int totweight; public Dimension[] dimens; @@ -55,6 +58,8 @@ public class DimenInfo buf.append(", numfix=").append(numfix); buf.append(", fixwid=").append(fixwid); buf.append(", fixhei=").append(fixhei); + buf.append(", maxfreewid=").append(maxfreewid); + buf.append(", maxfreehei=").append(maxfreehei); buf.append(", totweight=").append(totweight); return buf.append("]").toString(); } diff --git a/projects/samskivert/src/java/com/samskivert/swing/GroupLayout.java b/projects/samskivert/src/java/com/samskivert/swing/GroupLayout.java index fad7fb6c..2c64a967 100644 --- a/projects/samskivert/src/java/com/samskivert/swing/GroupLayout.java +++ b/projects/samskivert/src/java/com/samskivert/swing/GroupLayout.java @@ -333,6 +333,13 @@ public abstract class GroupLayout } else { info.totweight += getWeight(child); + + if (csize.width > info.maxfreewid) { + info.maxfreewid = csize.width; + } + if (csize.height > info.maxfreehei) { + info.maxfreehei = csize.height; + } } info.dimens[i] = csize; diff --git a/projects/samskivert/src/java/com/samskivert/swing/HGroupLayout.java b/projects/samskivert/src/java/com/samskivert/swing/HGroupLayout.java index 94c6f5c7..9c484dc4 100644 --- a/projects/samskivert/src/java/com/samskivert/swing/HGroupLayout.java +++ b/projects/samskivert/src/java/com/samskivert/swing/HGroupLayout.java @@ -60,14 +60,16 @@ public class HGroupLayout extends GroupLayout DimenInfo info = computeDimens(parent, type); Dimension dims = new Dimension(); - if (_policy == STRETCH || _policy == EQUALIZE) { - dims.width = info.maxwid * (info.count - info.numfix) + - info.fixwid + _gap * info.count; + if (_policy == STRETCH) { + dims.width = info.maxfreewid * (info.count - info.numfix) + + info.fixwid; + } else if (_policy == EQUALIZE) { + dims.width = info.maxwid * info.count; } else { // NONE or CONSTRAIN - dims.width = info.totwid + _gap * info.count; + dims.width = info.totwid; } - dims.width -= _gap; + dims.width += (info.count - 1) * _gap; dims.height = info.maxhei; // account for the insets diff --git a/projects/samskivert/src/java/com/samskivert/swing/VGroupLayout.java b/projects/samskivert/src/java/com/samskivert/swing/VGroupLayout.java index 7884ef8d..35bee6ae 100644 --- a/projects/samskivert/src/java/com/samskivert/swing/VGroupLayout.java +++ b/projects/samskivert/src/java/com/samskivert/swing/VGroupLayout.java @@ -60,14 +60,16 @@ public class VGroupLayout extends GroupLayout DimenInfo info = computeDimens(parent, type); Dimension dims = new Dimension(); - if (_policy == STRETCH || _policy == EQUALIZE) { - dims.height = info.maxhei * (info.count - info.numfix) + - info.fixhei + _gap * info.count; - } else { - dims.height = info.tothei + _gap * info.count; + if (_policy == STRETCH) { + dims.height = info.maxfreehei * (info.count - info.numfix) + + info.fixhei; + } else if (_policy == EQUALIZE) { + dims.height = info.maxhei * info.count; + } else { // NONE or CONSTRAIN + dims.height = info.tothei; } - dims.height -= _gap; + dims.height += (info.count - 1) * _gap; dims.width = info.maxwid; // account for the insets