\r
private RenderInformation renderInformation = new RenderInformation();\r
\r
- private int borderPaddingHorizontal;\r
-\r
- private int borderPaddingVertical;\r
+ private int borderPaddingHorizontal = -1;\r
\r
private boolean rendering = false;\r
\r
\r
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
rendering = true;\r
- boolean measure = false;\r
- if (this.client == null) {\r
- this.client = client;\r
- measure = true;\r
- }\r
+ this.client = client;\r
\r
if (client.updateComponent(this, uidl, false)) {\r
rendering = false;\r
return;\r
}\r
\r
- if (measure) {\r
- // Measure the border when the style names have been set\r
- borderPaddingVertical = getOffsetHeight();\r
- int ow = getOffsetWidth();\r
- int dow = desc.getOffsetWidth();\r
- borderPaddingHorizontal = ow - dow;\r
- }\r
-\r
boolean legendEmpty = true;\r
if (uidl.hasAttribute("caption")) {\r
DOM.setInnerText(caption, uidl.getStringAttribute("caption"));\r
// TODO Check if this is needed\r
client.runDescendentsLayout(this);\r
\r
- final UIDL layoutUidl = uidl.getChildUIDL(0);\r
- Container newLo = (Container) client.getPaintable(layoutUidl);\r
- if (lo == null) {\r
- lo = newLo;\r
- add((Widget) lo, fieldContainer);\r
- } else if (lo != newLo) {\r
- client.unregisterPaintable(lo);\r
- remove((Widget) lo);\r
- lo = newLo;\r
- add((Widget) lo, fieldContainer);\r
- }\r
- lo.updateFromUIDL(layoutUidl, client);\r
-\r
+ // first render footer so it will be easier to handle relative height of\r
+ // main layout\r
if (uidl.getChildCount() > 1) {\r
// render footer\r
Container newFooter = (Container) client.getPaintable(uidl\r
}\r
footer = newFooter;\r
footer.updateFromUIDL(uidl.getChildUIDL(1), client);\r
+ updateSize();\r
} else {\r
if (footer != null) {\r
remove((Widget) footer);\r
client.unregisterPaintable(footer);\r
+ updateSize();\r
}\r
}\r
\r
+ final UIDL layoutUidl = uidl.getChildUIDL(0);\r
+ Container newLo = (Container) client.getPaintable(layoutUidl);\r
+ if (lo == null) {\r
+ lo = newLo;\r
+ add((Widget) lo, fieldContainer);\r
+ } else if (lo != newLo) {\r
+ client.unregisterPaintable(lo);\r
+ remove((Widget) lo);\r
+ lo = newLo;\r
+ add((Widget) lo, fieldContainer);\r
+ }\r
+ lo.updateFromUIDL(layoutUidl, client);\r
+\r
rendering = false;\r
}\r
\r
\r
renderInformation.setContentAreaHeight(renderInformation\r
.getRenderedSize().getHeight()\r
- - borderPaddingVertical);\r
+ - getSpaceConsumedVertically());\r
if (BrowserInfo.get().isIE6()) {\r
getElement().getStyle().setProperty("overflow", "hidden");\r
}\r
\r
public RenderSpace getAllocatedSpace(Widget child) {\r
if (child == lo) {\r
- int hPixels = 0;\r
- if (!"".equals(height)) {\r
- hPixels = getOffsetHeight();\r
- hPixels -= borderPaddingVertical;\r
- hPixels -= footerContainer.getOffsetHeight();\r
- hPixels -= errorMessage.getOffsetHeight();\r
- hPixels -= desc.getOffsetHeight();\r
-\r
- }\r
-\r
- return new RenderSpace(renderInformation.getContentAreaSize()\r
- .getWidth(), hPixels);\r
+ return renderInformation.getContentAreaSize();\r
} else if (child == footer) {\r
return new RenderSpace(renderInformation.getContentAreaSize()\r
.getWidth(), 0);\r
updateSize();\r
}\r
\r
+ /**\r
+ * @return pixels consumed by decoration, captions, descrioptiosn etc.. In\r
+ * other words space, not used by the actual layout in form.\r
+ */\r
+ private int getSpaceConsumedVertically() {\r
+ int offsetHeight2 = fieldSet.getOffsetHeight();\r
+ int offsetHeight3 = fieldContainer.getOffsetHeight();\r
+ int borderPadding = offsetHeight2 - offsetHeight3;\r
+ return borderPadding;\r
+ }\r
+\r
@Override\r
public void setWidth(String width) {\r
+ if (borderPaddingHorizontal < 0) {\r
+ // measure excess size lazyly after stylename setting, but before\r
+ // setting width\r
+ int ow = getOffsetWidth();\r
+ int dow = desc.getOffsetWidth();\r
+ borderPaddingHorizontal = ow - dow;\r
+ }\r
if (Util.equals(this.width, width)) {\r
return;\r
}\r
--- /dev/null
+package com.vaadin.tests.components.form;
+
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.CssLayout;
+import com.vaadin.ui.Form;
+import com.vaadin.ui.Label;
+
+public class FormWithRelativelySizedLayout extends TestBase {
+
+ @Override
+ protected String getDescription() {
+ return "Forms mainlayouts relative height should be everyting left out from footer and possible borders/paddings. ";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 3488;
+ }
+
+ @Override
+ protected void setup() {
+
+ Form f = new Form();
+ f.setCaption("Form, full size");
+
+ f.setWidth("100%");
+ f.setHeight("100%");
+
+ Label l = new Label(
+ "This green label should consume all available space, pushing ok button to bottom of the view");
+ l.setSizeFull();
+
+ CssLayout lo = new CssLayout() {
+ @Override
+ protected String getCss(Component c) {
+ return "background: green;color:red;";
+ }
+ };
+ lo.setSizeFull();
+
+ f.setLayout(lo);
+ lo.addComponent(l);
+
+ f.getFooter().addComponent(new Button("OK button"));
+
+ getLayout().setSizeFull();
+ getLayout().addComponent(f);
+ }
+
+}