]> source.dussan.org Git - vaadin-framework.git/commitdiff
merged [9424] (partly by hand because of source folder refactoring) from 6.1
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 28 Oct 2009 10:11:27 +0000 (10:11 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 28 Oct 2009 10:11:27 +0000 (10:11 +0000)
svn changeset:9425/svn branch:6.2

src/com/vaadin/terminal/gwt/client/ui/VForm.java
tests/src/com/vaadin/tests/components/form/FormWithRelativelySizedLayout.java [new file with mode: 0644]

index 97fbf9b72aa48030f744a5a8cc73679f423a7f22..7117d2cebff60982cdcbb77fd6b9282efb3d25b3 100644 (file)
@@ -48,9 +48,7 @@ public class VForm extends ComplexPanel implements Container {
 \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
@@ -75,25 +73,13 @@ public class VForm extends ComplexPanel implements Container {
 \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
@@ -138,19 +124,8 @@ public class VForm extends ComplexPanel implements Container {
         // 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
@@ -165,13 +140,28 @@ public class VForm extends ComplexPanel implements Container {
             }\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
@@ -181,7 +171,7 @@ public class VForm extends ComplexPanel implements Container {
 \r
         renderInformation.setContentAreaHeight(renderInformation\r
                 .getRenderedSize().getHeight()\r
-                - borderPaddingVertical);\r
+                - getSpaceConsumedVertically());\r
         if (BrowserInfo.get().isIE6()) {\r
             getElement().getStyle().setProperty("overflow", "hidden");\r
         }\r
@@ -192,18 +182,7 @@ public class VForm extends ComplexPanel implements Container {
 \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
@@ -271,8 +250,26 @@ public class VForm extends ComplexPanel implements Container {
         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
diff --git a/tests/src/com/vaadin/tests/components/form/FormWithRelativelySizedLayout.java b/tests/src/com/vaadin/tests/components/form/FormWithRelativelySizedLayout.java
new file mode 100644 (file)
index 0000000..17fe447
--- /dev/null
@@ -0,0 +1,52 @@
+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);
+    }
+
+}