]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix for #2254 - Form size problems
authorArtur Signell <artur.signell@itmill.com>
Tue, 2 Dec 2008 08:57:47 +0000 (08:57 +0000)
committerArtur Signell <artur.signell@itmill.com>
Tue, 2 Dec 2008 08:57:47 +0000 (08:57 +0000)
svn changeset:6060/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/Util.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IFormLayout.java

index 8f54716578513047a1c2317798bffff6c98c9316..cd446bb59a58bde1369259de6df6bb64a7e5fd64 100644 (file)
@@ -6,6 +6,7 @@ package com.itmill.toolkit.terminal.gwt.client;
 
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
@@ -14,6 +15,7 @@ import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.HasWidgets;
 import com.google.gwt.user.client.ui.RootPanel;
 import com.google.gwt.user.client.ui.Widget;
 import com.itmill.toolkit.terminal.gwt.client.RenderInformation.FloatSize;
@@ -46,8 +48,8 @@ public class Util {
         Map<Container, Set<Paintable>> childWidgets = new HashMap<Container, Set<Paintable>>();
 
         for (Widget widget : widgets) {
-            // ApplicationConnection.getConsole().log(
-            // "Widget " + Util.getSimpleName(widget) + " size updated");
+            ApplicationConnection.getConsole().log(
+                    "Widget " + Util.getSimpleName(widget) + " size updated");
             Widget parent = widget.getParent();
             while (parent != null && !(parent instanceof Container)) {
                 parent = parent.getParent();
@@ -500,4 +502,32 @@ public class Util {
         }
     }
 
+    public static boolean equals(Object a, Object b) {
+        if (a == null) {
+            return b == null;
+        }
+
+        return a.equals(b);
+    }
+
+    public static void updateRelativeChildrenAndSendSizeUpdateEvent(
+            ApplicationConnection client, HasWidgets container) {
+        /*
+         * Relative sized children must be updated first so the component has
+         * the correct outer dimensions when signaling a size change to the
+         * parent.
+         */
+        Iterator<Widget> childIterator = container.iterator();
+        while (childIterator.hasNext()) {
+            Widget w = childIterator.next();
+            // alert("Update relative size for " + getSimpleName(w));
+            client.handleComponentRelativeSize(w);
+        }
+
+        // alert("abc");
+        HashSet<Widget> widgets = new HashSet<Widget>();
+        widgets.add((Widget) container);
+        Util.componentSizeUpdated(widgets);
+    }
+
 }
index 1f4025fe3f4ea2ff197877a845fd698cef223eb4..23193f5d1d176dcbfa6f0da42016b6f0938756ec 100644 (file)
@@ -12,19 +12,18 @@ import com.google.gwt.user.client.ui.ComplexPanel;
 import com.google.gwt.user.client.ui.Widget;\r
 import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;\r
 import com.itmill.toolkit.terminal.gwt.client.Container;\r
-import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;\r
 import com.itmill.toolkit.terminal.gwt.client.IErrorMessage;\r
 import com.itmill.toolkit.terminal.gwt.client.Paintable;\r
 import com.itmill.toolkit.terminal.gwt.client.RenderInformation;\r
 import com.itmill.toolkit.terminal.gwt.client.RenderSpace;\r
 import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
+import com.itmill.toolkit.terminal.gwt.client.Util;\r
 \r
-public class IForm extends ComplexPanel implements Container,\r
-        ContainerResizedListener {\r
+public class IForm extends ComplexPanel implements Container {\r
 \r
-    private String height;\r
+    private String height = "";\r
 \r
-    private String width;\r
+    private String width = "";\r
 \r
     public static final String CLASSNAME = "i-form";\r
 \r
@@ -122,7 +121,7 @@ public class IForm extends ComplexPanel implements Container,
             DOM.setInnerHTML(desc, "");\r
         }\r
 \r
-        iLayout();\r
+        updateSize();\r
         // TODO Check if this is needed\r
         client.runDescendentsLayout(this);\r
 \r
@@ -161,7 +160,7 @@ public class IForm extends ComplexPanel implements Container,
         }\r
     }\r
 \r
-    public void iLayout() {\r
+    public void updateSize() {\r
 \r
         renderInformation.updateSize(getElement());\r
 \r
@@ -184,7 +183,9 @@ public class IForm extends ComplexPanel implements Container,
                 hPixels -= desc.getOffsetHeight();\r
 \r
             }\r
-            return new RenderSpace(fieldContainer.getOffsetWidth(), 0);\r
+\r
+            return new RenderSpace(renderInformation.getContentAreaSize()\r
+                    .getWidth(), hPixels);\r
         } else if (child == footer) {\r
             return new RenderSpace(footerContainer.getOffsetWidth(), 0);\r
         } else {\r
@@ -240,14 +241,30 @@ public class IForm extends ComplexPanel implements Container,
 \r
     @Override\r
     public void setHeight(String height) {\r
+        if (this.height.equals(height)) {\r
+            return;\r
+        }\r
+\r
         this.height = height;\r
         super.setHeight(height);\r
 \r
+        updateSize();\r
     }\r
 \r
     @Override\r
     public void setWidth(String width) {\r
+        if (Util.equals(this.width, width)) {\r
+            return;\r
+        }\r
+\r
         this.width = width;\r
         super.setWidth(width);\r
+\r
+        updateSize();\r
+\r
+        if (height.equals("")) {\r
+            // Width might affect height\r
+            Util.updateRelativeChildrenAndSendSizeUpdateEvent(client, this);\r
+        }\r
     }\r
 }\r
index 9504edcae7e959629e1fbb86872d0b2dd2b099e0..05b42e89cf2fe75511ca702c3e6eaa68914eee9a 100644 (file)
@@ -13,6 +13,7 @@ import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.FlexTable;
 import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.SimplePanel;
 import com.google.gwt.user.client.ui.Widget;
 import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
 import com.itmill.toolkit.terminal.gwt.client.Container;
@@ -25,122 +26,174 @@ import com.itmill.toolkit.terminal.gwt.client.Util;
 /**
  * Two col Layout that places caption on left col and field on right col
  */
-public class IFormLayout extends FlexTable implements Container {
+public class IFormLayout extends SimplePanel implements Container {
 
     private final static String CLASSNAME = "i-formlayout";
 
-    HashMap componentToCaption = new HashMap();
     private ApplicationConnection client;
-    private HashMap componentToError = new HashMap();
+    private IFormLayoutTable table;
+
+    private String width = "";
+    private String height = "";
 
     public IFormLayout() {
         super();
         setStylePrimaryName(CLASSNAME);
-        DOM.setElementProperty(getElement(), "cellPadding", "0");
-        DOM.setElementProperty(getElement(), "cellSpacing", "0");
+        table = new IFormLayoutTable();
+        setWidget(table);
     }
 
-    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
-        this.client = client;
+    public class IFormLayoutTable extends FlexTable {
 
-        if (client.updateComponent(this, uidl, true)) {
-            return;
+        private HashMap componentToCaption = new HashMap();
+        private HashMap componentToError = new HashMap();
+
+        public IFormLayoutTable() {
+            DOM.setElementProperty(getElement(), "cellPadding", "0");
+            DOM.setElementProperty(getElement(), "cellSpacing", "0");
         }
 
-        final MarginInfo margins = new MarginInfo(uidl
-                .getIntAttribute("margins"));
-
-        Element margin = getElement();
-        setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_TOP,
-                margins.hasTop());
-        setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_RIGHT,
-                margins.hasRight());
-        setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_BOTTOM,
-                margins.hasBottom());
-        setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_LEFT,
-                margins.hasLeft());
-
-        setStyleName(margin, CLASSNAME + "-" + "spacing", uidl
-                .hasAttribute("spacing"));
-
-        int i = 0;
-        for (final Iterator it = uidl.getChildIterator(); it.hasNext(); i++) {
-            prepareCell(i, 1);
-            final UIDL childUidl = (UIDL) it.next();
-            final Paintable p = client.getPaintable(childUidl);
-            Caption caption = (Caption) componentToCaption.get(p);
-            if (caption == null) {
-                caption = new Caption(p, client);
-                componentToCaption.put(p, caption);
+        public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
+            final MarginInfo margins = new MarginInfo(uidl
+                    .getIntAttribute("margins"));
+
+            Element margin = getElement();
+            setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_TOP,
+                    margins.hasTop());
+            setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_RIGHT,
+                    margins.hasRight());
+            setStyleName(margin,
+                    CLASSNAME + "-" + StyleConstants.MARGIN_BOTTOM, margins
+                            .hasBottom());
+            setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_LEFT,
+                    margins.hasLeft());
+
+            setStyleName(margin, CLASSNAME + "-" + "spacing", uidl
+                    .hasAttribute("spacing"));
+
+            int i = 0;
+            for (final Iterator it = uidl.getChildIterator(); it.hasNext(); i++) {
+                prepareCell(i, 1);
+                final UIDL childUidl = (UIDL) it.next();
+                final Paintable p = client.getPaintable(childUidl);
+                Caption caption = (Caption) componentToCaption.get(p);
+                if (caption == null) {
+                    caption = new Caption(p, client);
+                    componentToCaption.put(p, caption);
+                }
+                ErrorFlag error = (ErrorFlag) componentToError.get(p);
+                if (error == null) {
+                    error = new ErrorFlag();
+                    componentToError.put(p, error);
+                }
+                prepareCell(i, 2);
+                final Paintable oldComponent = (Paintable) getWidget(i, 2);
+                if (oldComponent == null) {
+                    setWidget(i, 2, (Widget) p);
+                } else if (oldComponent != p) {
+                    client.unregisterPaintable(oldComponent);
+                    setWidget(i, 2, (Widget) p);
+                }
+                getCellFormatter().setStyleName(i, 2,
+                        CLASSNAME + "-contentcell");
+                getCellFormatter().setStyleName(i, 0,
+                        CLASSNAME + "-captioncell");
+                setWidget(i, 0, caption);
+
+                getCellFormatter().setStyleName(i, 1, CLASSNAME + "-errorcell");
+                setWidget(i, 1, error);
+
+                p.updateFromUIDL(childUidl, client);
+
+                String rowstyles = CLASSNAME + "-row";
+                if (i == 0) {
+                    rowstyles += " " + CLASSNAME + "-firstrow";
+                }
+                if (!it.hasNext()) {
+                    rowstyles += " " + CLASSNAME + "-lastrow";
+                }
+
+                getRowFormatter().setStyleName(i, rowstyles);
+
             }
-            ErrorFlag error = (ErrorFlag) componentToError.get(p);
-            if (error == null) {
-                error = new ErrorFlag();
-                componentToError.put(p, error);
+
+            while (getRowCount() > i) {
+                final Paintable p = (Paintable) getWidget(i, 2);
+                client.unregisterPaintable(p);
+                componentToCaption.remove(p);
+                removeRow(i);
             }
-            prepareCell(i, 2);
-            final Paintable oldComponent = (Paintable) getWidget(i, 2);
-            if (oldComponent == null) {
-                setWidget(i, 2, (Widget) p);
-            } else if (oldComponent != p) {
-                client.unregisterPaintable(oldComponent);
-                setWidget(i, 2, (Widget) p);
+
+        }
+
+        public void replaceChildComponent(Widget oldComponent,
+                Widget newComponent) {
+            int i;
+            for (i = 0; i < getRowCount(); i++) {
+                if (oldComponent == getWidget(i, 1)) {
+                    final Caption newCap = new Caption(
+                            (Paintable) newComponent, client);
+                    setWidget(i, 0, newCap);
+                    setWidget(i, 1, newComponent);
+                    break;
+                }
             }
-            getCellFormatter().setStyleName(i, 2, CLASSNAME + "-contentcell");
-            getCellFormatter().setStyleName(i, 0, CLASSNAME + "-captioncell");
-            setWidget(i, 0, caption);
 
-            getCellFormatter().setStyleName(i, 1, CLASSNAME + "-errorcell");
-            setWidget(i, 1, error);
+        }
 
-            p.updateFromUIDL(childUidl, client);
+        public boolean hasChildComponent(Widget component) {
+            return componentToCaption.containsKey(component);
+        }
 
-            String rowstyles = CLASSNAME + "-row";
-            if (i == 0) {
-                rowstyles += " " + CLASSNAME + "-firstrow";
+        public void updateCaption(Paintable component, UIDL uidl) {
+            final Caption c = (Caption) componentToCaption.get(component);
+            if (c != null) {
+                c.updateCaption(uidl);
             }
-            if (!it.hasNext()) {
-                rowstyles += " " + CLASSNAME + "-lastrow";
+            final ErrorFlag e = (ErrorFlag) componentToError.get(component);
+            if (e != null) {
+                e.updateFromUIDL(uidl, component);
             }
 
-            getRowFormatter().setStyleName(i, rowstyles);
+        }
+
+        public int getAllocatedWidth(Widget child, int availableWidth) {
+            Caption caption = (Caption) componentToCaption.get(child);
+            ErrorFlag error = (ErrorFlag) componentToError.get(child);
+            int width = availableWidth;
 
+            if (caption != null) {
+                width -= DOM.getParent(caption.getElement()).getOffsetWidth();
+            }
+            if (error != null) {
+                width -= DOM.getParent(error.getElement()).getOffsetWidth();
+            }
+
+            return width;
         }
 
-        while (getRowCount() > i) {
-            final Paintable p = (Paintable) getWidget(i, 2);
-            client.unregisterPaintable(p);
-            componentToCaption.remove(p);
-            removeRow(i);
+    }
+
+    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
+        this.client = client;
+
+        if (client.updateComponent(this, uidl, true)) {
+            return;
         }
+
+        table.updateFromUIDL(uidl, client);
     }
 
     public boolean hasChildComponent(Widget component) {
-        return componentToCaption.containsKey(component);
+        return table.hasChildComponent(component);
     }
 
     public void replaceChildComponent(Widget oldComponent, Widget newComponent) {
-        int i;
-        for (i = 0; i < getRowCount(); i++) {
-            if (oldComponent == getWidget(i, 1)) {
-                final Caption newCap = new Caption((Paintable) newComponent,
-                        client);
-                setWidget(i, 0, newCap);
-                setWidget(i, 1, newComponent);
-                break;
-            }
-        }
+        table.replaceChildComponent(oldComponent, newComponent);
     }
 
     public void updateCaption(Paintable component, UIDL uidl) {
-        final Caption c = (Caption) componentToCaption.get(component);
-        if (c != null) {
-            c.updateCaption(uidl);
-        }
-        final ErrorFlag e = (ErrorFlag) componentToError.get(component);
-        if (e != null) {
-            e.updateFromUIDL(uidl, component);
-        }
+        table.updateCaption(component, uidl);
     }
 
     public class Caption extends HTML {
@@ -305,14 +358,50 @@ public class IFormLayout extends FlexTable implements Container {
     }
 
     public boolean requestLayout(Set<Paintable> child) {
-        // TODO Auto-generated method stub
-        return false;
+        if (height.equals("") || width.equals("")) {
+            // A dynamic size might change due to children changes
+            return false;
+        }
+
+        return true;
     }
 
     public RenderSpace getAllocatedSpace(Widget child) {
-        com.google.gwt.dom.client.Element pe = child.getElement()
-                .getParentElement();
-        return new RenderSpace(pe.getOffsetWidth(), pe.getOffsetHeight(), false);
+        int width = 0;
+        int height = 0;
+
+        if (!this.width.equals("")) {
+            int availableWidth = getOffsetWidth();
+            width = table.getAllocatedWidth(child, availableWidth);
+        }
+
+        return new RenderSpace(width, height, false);
+    }
+
+    @Override
+    public void setHeight(String height) {
+        if (this.height.equals(height)) {
+            return;
+        }
+
+        this.height = height;
+        super.setHeight(height);
+    }
+
+    @Override
+    public void setWidth(String width) {
+        if (this.width.equals(width)) {
+            return;
+        }
+
+        this.width = width;
+        super.setWidth(width);
+
+        if (height.equals("")) {
+            // Width might affect height
+            Util.updateRelativeChildrenAndSendSizeUpdateEvent(client, this);
+        }
+
     }
 
 }