From cfe6e9b760b34ebb2ea1bbaf9531cbba2dc2ac5c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Leif=20=C3=85strand?= Date: Wed, 8 Feb 2012 16:37:41 +0200 Subject: [PATCH] Provide sizing information for paintables (#8313) --- .../terminal/gwt/client/VPaintableWidget.java | 54 ++++++++++++++++++ .../client/ui/VAbstractPaintableWidget.java | 57 ++++++++++++++++++- 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/VPaintableWidget.java b/src/com/vaadin/terminal/gwt/client/VPaintableWidget.java index a66129fd87..6b9e97b2de 100644 --- a/src/com/vaadin/terminal/gwt/client/VPaintableWidget.java +++ b/src/com/vaadin/terminal/gwt/client/VPaintableWidget.java @@ -31,4 +31,58 @@ public interface VPaintableWidget extends VPaintable { public VPaintableWidgetContainer getParent(); public MeasuredSize getMeasuredSize(); + + /** + * Returns true if the width of this paintable is currently + * undefined. If the width is undefined, the actual width of the paintable + * is defined by its contents. + * + * @return true if the width is undefined, else + * false + */ + public boolean isUndefinedWidth(); + + /** + * Returns true if the height of this paintable is currently + * undefined. If the height is undefined, the actual height of the paintable + * is defined by its contents. + * + * @return true if the height is undefined, else + * false + */ + public boolean isUndefinedHeight(); + + /** + * Returns true if the width of this paintable is currently + * relative. If the width is relative, the actual width of the paintable is + * a percentage of the size allocated to it by its parent. + * + * @return true if the width is undefined, else + * false + */ + public boolean isRelativeWidth(); + + /** + * Returns true if the height of this paintable is currently + * relative. If the height is relative, the actual height of the paintable + * is a percentage of the size allocated to it by its parent. + * + * @return true if the width is undefined, else + * false + */ + public boolean isRelativeHeight(); + + /** + * Gets the width of this paintable as defined on the server. + * + * @return the server side width definition + */ + public String getDefinedWidth(); + + /** + * Gets the height of this paintable as defined on the server. + * + * @return the server side height definition + */ + public String getDefinedHeight(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidget.java b/src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidget.java index e45387a116..7941da04b7 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidget.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidget.java @@ -8,6 +8,7 @@ import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.Focusable; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; +import com.vaadin.terminal.gwt.client.MeasureManager; import com.vaadin.terminal.gwt.client.MeasureManager.MeasuredSize; import com.vaadin.terminal.gwt.client.TooltipInfo; import com.vaadin.terminal.gwt.client.UIDL; @@ -24,12 +25,15 @@ public abstract class VAbstractPaintableWidget implements VPaintableWidget { private ApplicationConnection connection; private String id; - private final MeasuredSize measuredSize = new MeasuredSize(); + private final MeasuredSize measuredSize = new MeasuredSize(this); /* State variables */ private boolean enabled = true; private boolean visible = true; + private String definedWidth = ""; + private String definedHeight = ""; + /** * Default constructor */ @@ -183,7 +187,56 @@ public abstract class VAbstractPaintableWidget implements VPaintableWidget { * taken into account */ - getConnection().updateComponentSize(this, uidl); + updateComponentSize(uidl); + } + + private void updateComponentSize(UIDL uidl) { + String w = uidl.hasAttribute("width") ? uidl + .getStringAttribute("width") : ""; + + String h = uidl.hasAttribute("height") ? uidl + .getStringAttribute("height") : ""; + + // Dirty if either dimension changed between relative and non-relative + MeasureManager.MeasuredSize measuredSize = getMeasuredSize(); + if (!measuredSize.isDirty() + && (w.endsWith("%") != definedWidth.endsWith("%") || h + .endsWith("%") != definedHeight.endsWith("%"))) { + measuredSize.setDirty(true); + } + + definedWidth = w; + definedHeight = h; + + // Set defined sizes + Widget component = getWidgetForPaintable(); + + component.setHeight(h); + component.setWidth(w); + } + + public boolean isRelativeHeight() { + return definedHeight.endsWith("%"); + } + + public boolean isRelativeWidth() { + return definedWidth.endsWith("%"); + } + + public boolean isUndefinedHeight() { + return definedHeight.length() == 0; + } + + public boolean isUndefinedWidth() { + return definedWidth.length() == 0; + } + + public String getDefinedHeight() { + return definedHeight; + } + + public String getDefinedWidth() { + return definedWidth; } /** -- 2.39.5