From e925ef6ab8071356ef9f6862ed3848f89caf0488 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Thu, 18 Sep 2008 06:16:24 +0000 Subject: [PATCH] Fix for #2029 - orderedlayout width calculations svn changeset:5427/svn branch:trunk --- .../gwt/client/ContainerResizedListener.java | 8 ++- .../toolkit/terminal/gwt/client/Util.java | 17 +++++- .../terminal/gwt/client/ui/IAccordion.java | 6 ++- .../terminal/gwt/client/ui/ICustomLayout.java | 6 ++- .../terminal/gwt/client/ui/IExpandLayout.java | 6 ++- .../toolkit/terminal/gwt/client/ui/IForm.java | 4 +- .../terminal/gwt/client/ui/IGridLayout.java | 6 ++- .../gwt/client/ui/IOrderedLayout.java | 54 +++++++++++++++---- .../terminal/gwt/client/ui/IPanel.java | 2 +- .../terminal/gwt/client/ui/IScrollTable.java | 6 ++- .../terminal/gwt/client/ui/ISlider.java | 2 +- .../terminal/gwt/client/ui/ISplitPanel.java | 6 ++- .../terminal/gwt/client/ui/ITabsheet.java | 6 ++- .../terminal/gwt/client/ui/ITextField.java | 28 +++++++--- .../terminal/gwt/client/ui/ITextualDate.java | 6 ++- .../client/ui/absolutegrid/IAbsoluteGrid.java | 2 +- 16 files changed, 135 insertions(+), 30 deletions(-) diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ContainerResizedListener.java b/src/com/itmill/toolkit/terminal/gwt/client/ContainerResizedListener.java index f299c985dd..d3634a1804 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ContainerResizedListener.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ContainerResizedListener.java @@ -15,6 +15,12 @@ public interface ContainerResizedListener { * function on its ancestors that implement NeedsLayout in case their * container has resized. runAnchestorsLayout(HasWidgets parent) function * from Util class may be a good helper for this. + * + * The width and height parameters specifies the space available for the + * component (in pixels) if the parent container can or want to produce + * these numbers. If the parent container does not know (has not calculated) + * or cannot produce (undefined dimensions) one of these numbers -1 is + * passed. */ - public void iLayout(); + public void iLayout(int availableWidth, int availableHeight); } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/Util.java b/src/com/itmill/toolkit/terminal/gwt/client/Util.java index b3fb7260e3..8981054d70 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/Util.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/Util.java @@ -48,7 +48,16 @@ public class Util { while (childWidgets.hasNext()) { final Widget child = (Widget) childWidgets.next(); if (child instanceof ContainerResizedListener) { - ((ContainerResizedListener) child).iLayout(); + int w = -1, h = -1; + + if (container instanceof WidgetSpaceAllocator) { + w = ((WidgetSpaceAllocator) container) + .getAllocatedWidth(child); + h = ((WidgetSpaceAllocator) container) + .getAllocatedHeight(child); + } + + ((ContainerResizedListener) child).iLayout(w, h); } else if (child instanceof HasWidgets) { final HasWidgets childContainer = (HasWidgets) child; runDescendentsLayout(childContainer); @@ -56,6 +65,12 @@ public class Util { } } + public interface WidgetSpaceAllocator { + int getAllocatedWidth(Widget child); + + int getAllocatedHeight(Widget child); + } + /** * Returns closest parent Widget in hierarchy that implements Container * interface diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java index 7923d3d977..1790e01540 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java @@ -114,7 +114,11 @@ public class IAccordion extends ITabsheetBase implements this.height = height; } - public void iLayout() { + private void iLayout() { + iLayout(-1, -1); + } + + public void iLayout(int availableWidth, int availableHeight) { StackItem item = getSelectedStack(); if (item == null) { return; diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java index a01f387546..e10f996503 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java @@ -412,7 +412,11 @@ public class ICustomLayout extends ComplexPanel implements Paintable, widgetToCaptionWrapper.clear(); } - public void iLayout() { + private void iLayout() { + iLayout(-1, -1); + } + + public void iLayout(int availableWidth, int availableHeight) { if (!iLayoutJS(DOM.getFirstChild(getElement()))) { Util.runDescendentsLayout(this); } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IExpandLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IExpandLayout.java index 601aa250a9..081660cd83 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IExpandLayout.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IExpandLayout.java @@ -373,7 +373,11 @@ public class IExpandLayout extends ComplexPanel implements return getWidgetIndex(component) >= 0; } - public void iLayout() { + private void iLayout() { + iLayout(-1, -1); + } + + public void iLayout(int availableWidth, int availableHeight) { if (orientationMode == ORIENTATION_HORIZONTAL) { int pixels; if ("".equals(height)) { diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java index 639d5fbb88..596574dfe0 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java @@ -98,7 +98,7 @@ public class IForm extends ComplexPanel implements Paintable, DOM.setInnerHTML(desc, ""); } - iLayout(); + iLayout(-1, -1); final UIDL layoutUidl = uidl.getChildUIDL(0); Container newLo = (Container) client.getPaintable(layoutUidl); @@ -135,7 +135,7 @@ public class IForm extends ComplexPanel implements Paintable, } } - public void iLayout() { + public void iLayout(int availableWidth, int availableHeight) { Util.runDescendentsLayout(this); } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java index 88a6ad1f46..e418ec109a 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java @@ -288,7 +288,11 @@ public class IGridLayout extends SimplePanel implements Paintable, Container, } - public void iLayout() { + private void iLayout() { + iLayout(-1, -1); + } + + public void iLayout(int availableWidth, int availableHeight) { if (needsLayout) { super.setWidth(width); if (meterElement == null) { diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java index 02a3a84448..213b6f0764 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java @@ -20,6 +20,7 @@ import com.itmill.toolkit.terminal.gwt.client.ICaption; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; import com.itmill.toolkit.terminal.gwt.client.Util; +import com.itmill.toolkit.terminal.gwt.client.Util.WidgetSpaceAllocator; /** * Full implementation of OrderedLayout client peer. @@ -239,7 +240,7 @@ import com.itmill.toolkit.terminal.gwt.client.Util; * @author IT Mill Ltd */ public class IOrderedLayout extends Panel implements Container, - ContainerResizedListener { + ContainerResizedListener, WidgetSpaceAllocator { public static final String CLASSNAME = "i-orderedlayout"; @@ -305,7 +306,7 @@ public class IOrderedLayout extends Panel implements Container, * List of child widget wrappers. These wrappers are in exact same indexes * as the widgets in childWidgets list. */ - private final Vector childWidgetWrappers = new Vector(); + private final Vector childWidgetWrappers = new Vector(); /** Whether the component has spacing enabled. */ private boolean hasComponentSpacing; @@ -396,7 +397,7 @@ public class IOrderedLayout extends Panel implements Container, // Reinsert all widget wrappers to this container final int currentOrientationMode = orientationMode; for (int i = 0; i < childWidgetWrappers.size(); i++) { - WidgetWrapper wr = (WidgetWrapper) childWidgetWrappers.get(i); + WidgetWrapper wr = childWidgetWrappers.get(i); orientationMode = oldOrientationMode; tableMode = oldTableMode; Element oldWrElement = wr.getElementWrappingWidgetAndCaption(); @@ -1273,6 +1274,23 @@ public class IOrderedLayout extends Panel implements Container, && margins.hasBottom() ? marginBottom + "px" : ""); } } + + public int getAllocatedHeight() { + if (lastForcedPixelHeight == -1) { + return -1; + } + + int available = lastForcedPixelHeight; + // Must remove caption height to report correct size to child + if (caption != null) { + available -= caption.getOffsetHeight(); + } + return available; + } + + public int getAllocatedWidth() { + return lastForcedPixelWidth; + } } /* documented at super */ @@ -1310,7 +1328,7 @@ public class IOrderedLayout extends Panel implements Container, } final int removeFromIndex = childWidgets.indexOf(child); - final WidgetWrapper wrapper = (WidgetWrapper) childWidgetWrappers + final WidgetWrapper wrapper = childWidgetWrappers .get(removeFromIndex); Element wrapperElement = wrapper.getElement(); final int nonWidgetChildElements = DOM @@ -1385,8 +1403,7 @@ public class IOrderedLayout extends Panel implements Container, * from the DOM. */ final int index = childWidgets.indexOf(child); - final WidgetWrapper wrapper = (WidgetWrapper) childWidgetWrappers - .get(index); + final WidgetWrapper wrapper = childWidgetWrappers.get(index); DOM.removeChild(wrappedChildContainer, wrapper.getElement()); childWidgetWrappers.remove(index); @@ -1423,8 +1440,7 @@ public class IOrderedLayout extends Panel implements Container, public void updateCaption(Paintable component, UIDL uidl) { final int index = childWidgets.indexOf(component); if (index >= 0) { - ((WidgetWrapper) childWidgetWrappers.get(index)).updateCaption( - uidl, component); + childWidgetWrappers.get(index).updateCaption(uidl, component); } } @@ -1434,9 +1450,29 @@ public class IOrderedLayout extends Panel implements Container, } /* documented at super */ - public void iLayout() { + public void iLayout(int availableWidth, int availableHeight) { updateChildSizes(); Util.runDescendentsLayout(this); childLayoutsHaveChanged = false; } + + public int getAllocatedHeight(Widget child) { + final int index = childWidgets.indexOf(child); + if (index >= 0) { + WidgetWrapper wrapper = childWidgetWrappers.get(index); + return wrapper.getAllocatedHeight(); + } + + return -1; + } + + public int getAllocatedWidth(Widget child) { + final int index = childWidgets.indexOf(child); + if (index >= 0) { + WidgetWrapper wrapper = childWidgetWrappers.get(index); + return wrapper.getAllocatedWidth(); + } + + return -1; + } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IPanel.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IPanel.java index b15ae537ec..315d2d0d1a 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IPanel.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IPanel.java @@ -234,7 +234,7 @@ public class IPanel extends SimplePanel implements Paintable, } } - public void iLayout() { + public void iLayout(int availableWidth, int availableHeight) { iLayout(true); } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java index 4b9e6051af..ccf2c7a0ff 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java @@ -656,7 +656,11 @@ public class IScrollTable extends Composite implements Table, ScrollListener, initializedAndAttached = true; } - public void iLayout() { + private void iLayout() { + iLayout(-1, -1); + } + + public void iLayout(int availableWidth, int availableHeight) { if (height != null) { if (height.equals("100%")) { /* diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java index a6d5b6e2a2..196187b2e5 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java @@ -391,7 +391,7 @@ public class ISlider extends Widget implements Paintable, Field, setValue(new Double(v), animate, roundup); } - public void iLayout() { + public void iLayout(int availableWidth, int availableHeight) { if (vertical) { setHeight(); } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanel.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanel.java index 67f45d6ac8..7e2acebb53 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanel.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanel.java @@ -183,12 +183,16 @@ public class ISplitPanel extends ComplexPanel implements Paintable, iLayout(); } + private void iLayout() { + iLayout(-1, -1); + } + /* * Calculates absolutely positioned container places/sizes (non-Javadoc) * * @see com.itmill.toolkit.terminal.gwt.client.NeedsLayout#layout() */ - public void iLayout() { + public void iLayout(int availableWidth, int availableHeight) { if (!isAttached()) { return; } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java index 1a0eb557fc..566c81f896 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java @@ -376,7 +376,11 @@ public class ITabsheet extends ITabsheetBase implements } } - public void iLayout() { + private void iLayout() { + iLayout(-1, -1); + } + + public void iLayout(int availableWidth, int availableHeight) { if (height != null && height != "") { super.setHeight(height); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java index 8e2d874384..836b9b03d9 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java @@ -166,20 +166,36 @@ public class ITextField extends TextBoxBase implements Paintable, Field, } } - public void iLayout() { + private void iLayout() { + iLayout(-1, -1); + } + + public void iLayout(int availableWidth, int availableHeight) { if (proportionalWidth >= 0) { - int availPixels = (int) (DOM.getElementPropertyInt(DOM - .getParent(getElement()), "clientWidth") * proportionalWidth); + int availPixels = availableWidth; + if (availPixels < 0) { + availPixels = (DOM.getElementPropertyInt(DOM + .getParent(getElement()), "clientWidth")); + } + availPixels *= proportionalWidth; + availPixels -= getExtraHorizontalPixels(); if (availPixels >= 0) { super.setWidth(availPixels + "px"); } } if (proportionalHeight >= 0) { - int availPixels = (int) (DOM.getElementPropertyInt(DOM - .getParent(getElement()), "clientHeight") * proportionalHeight); + int availPixels = availableHeight; + if (availPixels < 0) { + availPixels = (DOM.getElementPropertyInt(DOM + .getParent(getElement()), "clientHeight")); + } + availPixels *= proportionalHeight; availPixels -= getExtraVerticalPixels(); - super.setHeight(availPixels + "px"); + + if (availPixels >= 0) { + super.setHeight(availPixels + "px"); + } } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java index 46ae202986..a115c238ae 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java @@ -272,7 +272,11 @@ public class ITextualDate extends IDateField implements Paintable, Field, return fieldExtraWidth; } - public void iLayout() { + private void iLayout() { + iLayout(-1, -1); + } + + public void iLayout(int availableWidth, int availableHeight) { if (needLayout) { text.setWidth((getOffsetWidth() - getFieldExtraWidth()) + "px"); } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/IAbsoluteGrid.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/IAbsoluteGrid.java index 7375e96eb1..87bb203924 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/IAbsoluteGrid.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/IAbsoluteGrid.java @@ -264,7 +264,7 @@ public class IAbsoluteGrid extends Composite implements } } - public void iLayout() { + public void iLayout(int availableWidth, int availableHeight) { boolean sizeChanged = false; int newWidth = getOffsetWidth(); if (offsetWidth != newWidth) { -- 2.39.5