From: Matti Tahvonen Date: Mon, 16 Jun 2008 13:49:46 +0000 (+0000) Subject: fixes #1729, implemented height handling to IOrderedLayoutHorizontal and using it... X-Git-Tag: 6.7.0.beta1~4579 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ff465f37b9b4faf6a46a9e33254833cac45433ea;p=vaadin-framework.git fixes #1729, implemented height handling to IOrderedLayoutHorizontal and using it if height but not width set for horizontal ordered layout svn changeset:4900/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetSet.java b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetSet.java index 9c4b4aff5d..d43c26d6b1 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetSet.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetSet.java @@ -212,13 +212,18 @@ public class DefaultWidgetSet implements WidgetSet { } else if ("window".equals(tag)) { return "com.itmill.toolkit.terminal.gwt.client.ui.IWindow"; } else if ("orderedlayout".equals(tag)) { - if (uidl.hasAttribute("height")) { - return "com.itmill.toolkit.terminal.gwt.client.ui.absolutegrid.ISizeableOrderedLayout"; - } else if ("horizontal".equals(uidl - .getStringAttribute("orientation"))) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutHorizontal"; + if ("horizontal".equals(uidl.getStringAttribute("orientation"))) { + if (uidl.hasAttribute("height") && uidl.hasAttribute("width")) { + return "com.itmill.toolkit.terminal.gwt.client.ui.absolutegrid.ISizeableOrderedLayout"; + } else { + return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutHorizontal"; + } } else { - return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutVertical"; + if (uidl.hasAttribute("height")) { + return "com.itmill.toolkit.terminal.gwt.client.ui.absolutegrid.ISizeableOrderedLayout"; + } else { + return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutVertical"; + } } } else if ("label".equals(tag)) { return "com.itmill.toolkit.terminal.gwt.client.ui.ILabel"; 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 851e6c5628..6720574bbc 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java @@ -54,6 +54,8 @@ public abstract class IOrderedLayout extends ComplexPanel implements Container { private boolean hasComponentSpacing; + private MarginInfo margins = new MarginInfo(0); + public IOrderedLayout(int orientation) { orientationMode = orientation; constructDOM(); @@ -85,7 +87,9 @@ public abstract class IOrderedLayout extends ComplexPanel implements Container { } // Handle layout margins - handleMargins(uidl); + if (margins.getBitMask() != uidl.getIntAttribute("margins")) { + handleMargins(uidl); + } // hasComponentSpacing = uidl.getBooleanAttribute("spacing"); @@ -148,7 +152,11 @@ public abstract class IOrderedLayout extends ComplexPanel implements Container { this.insert(child, index); } else { // insert new child before old one - final int index = getPaintableIndex(oldChild); // TODO this returns wrong value if captions are used + final int index = getPaintableIndex(oldChild); // TODO this + // returns wrong + // value if + // captions are + // used insert(child, index); } ((Paintable) child).updateFromUIDL(childUidl, client); @@ -307,7 +315,7 @@ public abstract class IOrderedLayout extends ComplexPanel implements Container { public int getPaintableCount() { int size = 0; - for(Iterator it = getChildren().iterator(); it.hasNext();) { + for (Iterator it = getChildren().iterator(); it.hasNext();) { Widget w = (Widget) it.next(); if (!(w instanceof Caption)) { size++; @@ -318,7 +326,7 @@ public abstract class IOrderedLayout extends ComplexPanel implements Container { public int getPaintableIndex(Widget child) { int i = 0; - for(Iterator it = getChildren().iterator(); it.hasNext();) { + for (Iterator it = getChildren().iterator(); it.hasNext();) { Widget w = (Widget) it.next(); if (w == child) { return i; @@ -330,8 +338,7 @@ public abstract class IOrderedLayout extends ComplexPanel implements Container { } protected void handleMargins(UIDL uidl) { - final MarginInfo margins = new MarginInfo(uidl - .getIntAttribute("margins")); + margins = new MarginInfo(uidl.getIntAttribute("margins")); setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_TOP, margins.hasTop()); setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_RIGHT, diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayoutHorizontal.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayoutHorizontal.java index 340b001f20..105103e901 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayoutHorizontal.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayoutHorizontal.java @@ -4,9 +4,78 @@ package com.itmill.toolkit.terminal.gwt.client.ui; -public class IOrderedLayoutHorizontal extends IOrderedLayout { +import com.google.gwt.user.client.DOM; +import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener; +import com.itmill.toolkit.terminal.gwt.client.UIDL; +import com.itmill.toolkit.terminal.gwt.client.Util; + +public class IOrderedLayoutHorizontal extends IOrderedLayout implements + ContainerResizedListener { + + private String height; + private boolean relativeHeight; + private int marginHeight = 0; public IOrderedLayoutHorizontal() { super(ORIENTATION_HORIZONTAL); } + + public void setHeight(String newHeight) { + super.setHeight(newHeight); + if (newHeight != null && !newHeight.equals("")) { + if (!newHeight.equals(height)) { + height = newHeight; + if (newHeight.indexOf("%") > 0) { + relativeHeight = true; + DOM.setStyleAttribute(getElement(), "overflow", "hidden"); + } else { + relativeHeight = false; + DOM.setStyleAttribute(getElement(), "overflow", ""); + } + setInternalHeight(); + } + } else { + if (newHeight != null) { + // clear existing height values + DOM.setStyleAttribute(getElement(), "overflow", ""); + DOM.setStyleAttribute(DOM.getFirstChild(margin), "height", ""); + + newHeight = null; + relativeHeight = false; + } + } + } + + protected void handleMargins(UIDL uidl) { + super.handleMargins(uidl); + if (height != null) { + marginHeight = -1; + setInternalHeight(); + } + } + + private void setInternalHeight() { + int availSpace = DOM + .getElementPropertyInt(getElement(), "clientHeight"); + if (marginHeight < 0) { + DOM.setStyleAttribute(margin, "height", height); + int tmp = DOM.getElementPropertyInt(margin, "offsetHeight"); + marginHeight = tmp + - DOM.getElementPropertyInt(getElement(), "clientHeight"); + DOM.setStyleAttribute(margin, "height", ""); + } + + availSpace -= marginHeight; + + DOM.setStyleAttribute(DOM.getFirstChild(margin), "height", availSpace + + "px"); + + } + + public void iLayout() { + if (relativeHeight) { + setInternalHeight(); + } + Util.runDescendentsLayout(this); + } }