]> source.dussan.org Git - vaadin-framework.git/commitdiff
enabled scrolling in toolkit + some other minor changes
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Tue, 7 Oct 2008 11:24:39 +0000 (11:24 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Tue, 7 Oct 2008 11:24:39 +0000 (11:24 +0000)
svn changeset:5602/svn branch:trunk

23 files changed:
src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java
src/com/itmill/toolkit/terminal/gwt/client/Container.java
src/com/itmill/toolkit/terminal/gwt/client/RenderInformation.java
src/com/itmill/toolkit/terminal/gwt/client/RenderSpace.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/Util.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ICoordinateLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomComponent.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IExpandLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IFormLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IPanel.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupView.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanel.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetPanel.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IView.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IWindow.java
src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/IAbsoluteGrid.java
src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/ISizeableGridLayout.java

index e6499e6408d5116db9475daf5cc28d399aec9e8c..6e0b4e34938e29f2c3db4a2c1c0509449209f0ab 100755 (executable)
@@ -101,8 +101,8 @@ public class ApplicationConnection {
      * 
      * Used in JSNI functions
      * 
-     * @SuppressWarnings
      */
+    @SuppressWarnings("unused")
     private final JavaScriptObject ttClientWrapper = null;
 
     private int activeRequests = 0;
@@ -203,6 +203,7 @@ public class ApplicationConnection {
     /**
      * Helper for tt initialization
      */
+    @SuppressWarnings("unused")
     private JavaScriptObject getVersionInfo() {
         return configuration.getVersionInfoJSObject();
     }
@@ -288,7 +289,7 @@ public class ApplicationConnection {
                         endRequest();
                         if (!applicationRunning) {
                             // start failed, let's try to start the next app
-                            configuration.startNextApplication();
+                            ApplicationConfiguration.startNextApplication();
                         }
                     }
 
@@ -299,7 +300,7 @@ public class ApplicationConnection {
                         } else {
                             applicationRunning = true;
                             handleWhenCSSLoaded(response);
-                            configuration.startNextApplication();
+                            ApplicationConfiguration.startNextApplication();
                         }
                     }
 
@@ -998,6 +999,14 @@ public class ApplicationConnection {
         float relativeWidth = Util.parseRelativeSize(w);
         float relativeHeight = Util.parseRelativeSize(h);
 
+        // first set absolute sizes
+        if (relativeHeight < 0.0) {
+            component.setHeight(h);
+        }
+        if (relativeWidth < 0.0) {
+            component.setWidth(w);
+        }
+
         if (relativeHeight >= 0.0 || relativeWidth >= 0.0) {
             // One or both is relative
             FloatSize relativeSize = new FloatSize(relativeWidth,
@@ -1009,12 +1018,6 @@ public class ApplicationConnection {
             componentRelativeSizes.remove(component);
         }
 
-        if (relativeHeight < 0.0) {
-            component.setHeight(h);
-        }
-        if (relativeWidth < 0.0) {
-            component.setWidth(w);
-        }
     }
 
     /**
@@ -1054,46 +1057,86 @@ public class ApplicationConnection {
             return;
         }
 
-        Size availPixels = Util.getLayout(widget).getAllocatedSpace(widget);
-        if (relativeSize.getWidth() >= 0) {
+        boolean horizontalScrollBar = false;
+        boolean verticalScrollBar = false;
 
-            if (availPixels != null) {
+        RenderSpace renderSpace = Util.getLayout(widget).getAllocatedSpace(
+                widget);
+
+        if (relativeSize.getHeight() >= 0) {
+            if (renderSpace != null) {
+
+                if (renderSpace.getScrollbarSize() > 0) {
+                    if (relativeSize.getWidth() > 100) {
+                        horizontalScrollBar = true;
+                    } else if (relativeSize.getWidth() < 0
+                            && renderSpace.getWidth() > 0) {
+                        int offsetWidth = widget.getOffsetWidth();
+                        int width = renderSpace.getWidth();
+                        if (offsetWidth > width) {
+                            horizontalScrollBar = true;
+                        }
+                    }
+                }
 
-                int width = availPixels.getWidth();
-                width *= relativeSize.getWidth() / 100.0;
+                int height = renderSpace.getHeight();
+                if (horizontalScrollBar) {
+                    height -= renderSpace.getScrollbarSize();
+                }
+                height = (int) (height * relativeSize.getHeight() / 100.0);
 
-                if (width >= 0) {
-                    // getConsole().log(
-                    // "Widget " + widget.getClass().getName() + "/"
-                    // + widget.hashCode() + " relative width "
-                    // + relativeSize.getWidth() + "%: " + width
-                    // + "px");
-                    widget.setWidth(width + "px");
+                if (height < 0) {
+                    height = 0;
                 }
+                // getConsole().log(
+                // "Widget " + widget.getClass().getName() + "/"
+                // + widget.hashCode() + " relative height "
+                // + relativeSize.getHeight() + "%: " + height
+                // + "px");
+                widget.setHeight(height + "px");
             } else {
-                widget.setWidth(relativeSize.getWidth() + "%");
+                widget.setHeight(relativeSize.getHeight() + "%");
                 ApplicationConnection.getConsole().error(
                         Util.getLayout(widget).getClass().getName()
                                 + " did not produce allocatedSpace for "
                                 + widget.getClass().getName());
             }
         }
-        if (relativeSize.getHeight() >= 0) {
-            if (availPixels != null) {
-
-                int height = availPixels.getHeight();
-                height *= relativeSize.getHeight() / 100.0;
-
-                if (height >= 0) {
-                    // getConsole().log(
-                    // "Widget " + widget.getClass().getName() + "/"
-                    // + widget.hashCode() + " relative height "
-                    // + relativeSize.getHeight() + "%: " + height
-                    // + "px");
-                    widget.setHeight(height + "px");
+
+        if (relativeSize.getWidth() >= 0) {
+
+            if (renderSpace != null) {
+
+                int width = renderSpace.getWidth();
+
+                if (renderSpace.getScrollbarSize() > 0) {
+                    if (relativeSize.getHeight() > 100) {
+                        verticalScrollBar = true;
+                    } else if (relativeSize.getHeight() < 0
+                            && renderSpace.getHeight() > 0
+                            && widget.getOffsetHeight() > renderSpace
+                                    .getHeight()) {
+                        verticalScrollBar = true;
+                    }
                 }
+
+                if (verticalScrollBar) {
+                    width -= renderSpace.getScrollbarSize();
+                }
+                width = (int) (width * relativeSize.getWidth() / 100.0);
+
+                if (width < 0) {
+                    width = 0;
+                }
+
+                // getConsole().log(
+                // "Widget " + widget.getClass().getName() + "/"
+                // + widget.hashCode() + " relative width "
+                // + relativeSize.getWidth() + "%: " + width
+                // + "px");
+                widget.setWidth(width + "px");
             } else {
-                widget.setHeight(relativeSize.getHeight() + "%");
+                widget.setWidth(relativeSize.getWidth() + "%");
                 ApplicationConnection.getConsole().error(
                         Util.getLayout(widget).getClass().getName()
                                 + " did not produce allocatedSpace for "
index f6303c584c6a7b8187c373c7746f4fef85c9493f..1a22a87d18b697f674412d94d7fa0729062cc98a 100644 (file)
@@ -7,7 +7,6 @@ package com.itmill.toolkit.terminal.gwt.client;
 import java.util.Set;
 
 import com.google.gwt.user.client.ui.Widget;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 public interface Container extends Paintable {
 
@@ -69,6 +68,6 @@ public interface Container extends Paintable {
      * @param child
      * @return
      */
-    Size getAllocatedSpace(Widget child);
+    RenderSpace getAllocatedSpace(Widget child);
 
 }
index 060d7044e70c3b63411847e45b875cd3a26c2432..d30afca1fc58bc9a89a43981ca73e81d3d42bc5f 100644 (file)
@@ -10,7 +10,7 @@ import com.google.gwt.user.client.Element;
  */\r
 public class RenderInformation {\r
 \r
-    private Size contentArea = new Size(0, 0);\r
+    private RenderSpace contentArea = new RenderSpace();\r
     private Size renderedSize = new Size(-1, -1);\r
 \r
     public void setContentAreaWidth(int w) {\r
@@ -21,7 +21,7 @@ public class RenderInformation {
         contentArea.setHeight(h);\r
     }\r
 \r
-    public Size getContentAreaSize() {\r
+    public RenderSpace getContentAreaSize() {\r
         return contentArea;\r
 \r
     }\r
@@ -92,6 +92,9 @@ public class RenderInformation {
             return other.width == width && other.height == height;\r
         }\r
 \r
+        public Size() {\r
+        }\r
+\r
         public Size(int width, int height) {\r
             this.height = height;\r
             this.width = width;\r
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/RenderSpace.java b/src/com/itmill/toolkit/terminal/gwt/client/RenderSpace.java
new file mode 100644 (file)
index 0000000..9e16f16
--- /dev/null
@@ -0,0 +1,51 @@
+package com.itmill.toolkit.terminal.gwt.client;
+
+import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
+
+/**
+ * Contains information about render area.
+ */
+public class RenderSpace extends Size {
+
+    private int scrollBarSize = 0;
+
+    public RenderSpace(int width, int height) {
+        super(width, height);
+    }
+
+    public RenderSpace() {
+    }
+
+    public RenderSpace(int width, int height, boolean useNativeScrollbarSize) {
+        super(width, height);
+        if (useNativeScrollbarSize) {
+            scrollBarSize = Util.getNativeScrollbarSize();
+        }
+    }
+
+    /**
+     * Returns pixels available vertically for contained widget, including
+     * possible scrollbars.
+     */
+    public int getHeight() {
+        return super.getHeight();
+    }
+
+    /**
+     * Returns pixels available horizontally for contained widget, including
+     * possible scrollbars.
+     */
+    public int getWidth() {
+        return super.getWidth();
+    }
+
+    /**
+     * In case containing block has oveflow: auto, this method must return
+     * number of pixels used by scrollbar. Returning zero means either that no
+     * scrollbar will be visible.
+     */
+    public int getScrollbarSize() {
+        return scrollBarSize;
+    }
+
+}
index 396a2fd3260383d1012bfa09cf8a940ec0bca2c6..97f92abda62d30dea4b4ac3a393437fb9b140fad 100644 (file)
@@ -11,6 +11,7 @@ import java.util.Set;
 
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.RootPanel;
 import com.google.gwt.user.client.ui.Widget;
 
 public class Util {
@@ -27,18 +28,6 @@ public class Util {
             debugger;
     }-*/;
 
-    /**
-     * Nulls oncontextmenu function on given element. We need to manually clear
-     * context menu events due bad browsers memory leaks, since GWT don't
-     * support them.
-     * 
-     * @param el
-     */
-    public native static void removeContextMenuEvent(Element el)
-    /*-{
-       el.oncontextmenu = null;
-    }-*/;
-
     /**
      * Called when the size of one or more widgets have changed during
      * rendering. Finds parent container and notifies them of the size change.
@@ -233,4 +222,24 @@ public class Util {
 
     }
 
+    private static int detectedScrollbarSize = -1;
+
+    public static int getNativeScrollbarSize() {
+        if (detectedScrollbarSize < 0) {
+            Element scroller = DOM.createDiv();
+            scroller.getStyle().setProperty("width", "50px");
+            scroller.getStyle().setProperty("height", "50px");
+            scroller.getStyle().setProperty("overflow", "scroll");
+            scroller.getStyle().setProperty("position", "absolute");
+            scroller.getStyle().setProperty("marginLeft", "-5000px");
+            RootPanel.getBodyElement().appendChild(scroller);
+            detectedScrollbarSize = scroller.getOffsetWidth()
+                    - scroller.getPropertyInt("clientWidth");
+            assert detectedScrollbarSize != 0;
+            RootPanel.getBodyElement().removeChild(scroller);
+
+        }
+        return detectedScrollbarSize;
+    }
+
 }
index b09b8510511057ef843e3849d8fa180d2534b8f9..e73f4e5bc8ea4806edb6f78a1269ffa5e8238e78 100644 (file)
@@ -10,6 +10,7 @@ import com.google.gwt.user.client.Command;
 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.Timer;
 import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.ComplexPanel;
 import com.google.gwt.user.client.ui.Widget;
@@ -18,8 +19,8 @@ import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
 import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 import com.itmill.toolkit.terminal.gwt.client.ICaption;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 public class IAccordion extends ITabsheetBase implements
         ContainerResizedListener {
@@ -34,6 +35,8 @@ public class IAccordion extends ITabsheetBase implements
 
     private HashMap lazyUpdateMap = new HashMap();
 
+    private RenderSpace renderSpace = new RenderSpace(0, 0, true);
+
     public IAccordion() {
         super(CLASSNAME);
         // IE6 needs this to calculate offsetHeight correctly
@@ -157,6 +160,25 @@ public class IAccordion extends ITabsheetBase implements
         }
 
         client.runDescendentsLayout(item);
+
+        if (BrowserInfo.get().getWebkitVersion() > 0) {
+            final Element selectedTabContent = getSelectedStack()
+                    .getContainerElement();
+            DeferredCommand.addCommand(new Command() {
+                public void execute() {
+                    // Dough, safari scoll auto means actually just a moped
+                    selectedTabContent.getStyle().setProperty("overflow",
+                            "hidden");
+                    (new Timer() {
+                        @Override
+                        public void run() {
+                            selectedTabContent.getStyle().setProperty(
+                                    "overflow", "auto");
+                        }
+                    }).schedule(1);
+                }
+            });
+        }
     }
 
     /**
@@ -177,6 +199,8 @@ public class IAccordion extends ITabsheetBase implements
                 fixContentNodeSize(contentSpace);
             } else {
                 DOM.setStyleAttribute(content, "height", "");
+                renderSpace.setHeight(0);
+                renderSpace.setWidth(content.getOffsetWidth());
             }
         }
 
@@ -187,6 +211,10 @@ public class IAccordion extends ITabsheetBase implements
                 DOM
                         .setStyleAttribute(content, "width", getOffsetWidth()
                                 + "px");
+            } else {
+                // update render information
+                renderSpace.setHeight(contentHeight);
+                renderSpace.setWidth(content.getOffsetWidth());
             }
         }
 
@@ -335,9 +363,8 @@ public class IAccordion extends ITabsheetBase implements
         return false;
     }
 
-    public Size getAllocatedSpace(Widget child) {
-        // TODO Auto-generated method stub
-        return null;
+    public RenderSpace getAllocatedSpace(Widget child) {
+        return renderSpace;
     }
 
 }
index 3588333dc4f57eb93ed7e59ad3687de2b567947d..3e4ebf58c72f7b687e34bcddb34ee97a31dbb1f1 100644 (file)
@@ -18,8 +18,8 @@ import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 import com.itmill.toolkit.terminal.gwt.client.ICaption;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 public class ICoordinateLayout extends ComplexPanel implements Container,
         ContainerResizedListener {
@@ -868,8 +868,8 @@ public class ICoordinateLayout extends ComplexPanel implements Container,
      * @return
      */
     protected native String getMargin(Element e, String CSSProp)/*-{
-                                                                                                                                                                                                                                                                                                                                                                                                                                                    return $wnd.getComputedStyle(e,null).getPropertyValue(CSSProp);
-                                                                                                                                                                                                                                                                                                                                                                                                                                                    }-*/;
+                                                                                                                                                                                                                                                                                                                                                                                                                                                        return $wnd.getComputedStyle(e,null).getPropertyValue(CSSProp);
+                                                                                                                                                                                                                                                                                                                                                                                                                                                        }-*/;
 
     /**
      * Retrieves margin info in IE
@@ -878,8 +878,8 @@ public class ICoordinateLayout extends ComplexPanel implements Container,
      * @return
      */
     protected native String getIEMargin(Element e)/*-{ 
-                                                                                                                                                                                                                                                                                                                                                                                                                                                    return e.currentStyle.margin;
-                                                                                                                                                                                                                                                                                                                                                                                                                                                    }-*/;
+                                                                                                                                                                                                                                                                                                                                                                                                                                                        return e.currentStyle.margin;
+                                                                                                                                                                                                                                                                                                                                                                                                                                                        }-*/;
 
     /**
      * @return all components that are not captions
@@ -898,12 +898,13 @@ public class ICoordinateLayout extends ComplexPanel implements Container,
         return true;
     }
 
-    public Size getAllocatedSpace(Widget child) {
+    public RenderSpace getAllocatedSpace(Widget child) {
         Element area = componentToArea.get(child);
         if (area != null) {
-            return new Size(area.getOffsetWidth(), area.getOffsetHeight());
+            return new RenderSpace(area.getOffsetWidth(), area
+                    .getOffsetHeight());
         } else {
-            return new Size(layout[WIDTH], layout[HEIGHT]);
+            return new RenderSpace(layout[WIDTH], layout[HEIGHT]);
         }
     }
 
index 207005635f0e237e0c859f4e7f20ff9082a584ec..2907a5e82f3c7582eefcddbb76d26ffa72a2032f 100644 (file)
@@ -11,8 +11,8 @@ import com.google.gwt.user.client.ui.Widget;
 import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
 import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 public class ICustomComponent extends SimplePanel implements Container {
 
@@ -69,11 +69,9 @@ public class ICustomComponent extends SimplePanel implements Container {
         return false;
     }
 
-    public Size getAllocatedSpace(Widget child) {
-        Size space = new Size(getElement().getOffsetWidth(), getElement()
+    public RenderSpace getAllocatedSpace(Widget child) {
+        return new RenderSpace(getElement().getOffsetWidth(), getElement()
                 .getOffsetHeight());
-
-        return space;
     }
 
 }
index c5a73c788dcf0a331e132fcf527370ed2d97eedd..5a87897067a1eabd27ca074f187099d7a62f23c7 100644 (file)
@@ -19,8 +19,8 @@ import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 import com.itmill.toolkit.terminal.gwt.client.ICaption;
 import com.itmill.toolkit.terminal.gwt.client.ICaptionWrapper;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 /**
  * Custom Layout implements complex layout defined with HTML template.
@@ -478,7 +478,7 @@ public class ICustomLayout extends ComplexPanel implements Paintable,
         return false;
     }
 
-    public Size getAllocatedSpace(Widget child) {
+    public RenderSpace getAllocatedSpace(Widget child) {
         // TODO Auto-generated method stub
         return null;
     }
index 6ec950c5f06c1b71fdc2ffb7ddab1e091f96c9a3..92d3fd712e13500be48a69781ceb9dd5e1e42666 100644 (file)
@@ -24,9 +24,9 @@ import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 import com.itmill.toolkit.terminal.gwt.client.ICaption;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
 import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.StyleConstants;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 /**
  * @author IT Mill Ltd
@@ -848,7 +848,7 @@ public class IExpandLayout extends ComplexPanel implements
 
     }
 
-    public Size getAllocatedSpace(Widget child) {
+    public RenderSpace getAllocatedSpace(Widget child) {
         int width = 0, height = 0;
 
         if (orientationMode == ORIENTATION_HORIZONTAL) {
@@ -869,7 +869,7 @@ public class IExpandLayout extends ComplexPanel implements
             }
         }
 
-        return new Size(width, height);
+        return new RenderSpace(width, height, child == expandedWidget);
     }
 
 }
index c68d6c854a8fbeedb4552637d140838012ea5750..8acb767098f38679620c659bc71694dd554652ad 100644 (file)
@@ -17,8 +17,8 @@ import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 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.RenderInformation.Size;\r
 \r
 public class IForm extends ComplexPanel implements Container,\r
         ContainerResizedListener {\r
@@ -167,7 +167,7 @@ public class IForm extends ComplexPanel implements Container,
         client.runDescendentsLayout(this);\r
     }\r
 \r
-    public Size getAllocatedSpace(Widget child) {\r
+    public RenderSpace getAllocatedSpace(Widget child) {\r
         return renderInformation.getContentAreaSize();\r
     }\r
 \r
index cbff24e00d81ef5ba8c6e091fcc6ecb878473b7a..1260f0745427546ad8d9d8a16edda59b12de91d2 100644 (file)
@@ -17,10 +17,10 @@ import com.google.gwt.user.client.ui.Widget;
 import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
 import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.StyleConstants;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
 import com.itmill.toolkit.terminal.gwt.client.Util;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 /**
  * Two col Layout that places caption on left col and field on right col
@@ -309,7 +309,7 @@ public class IFormLayout extends FlexTable implements Container {
         return false;
     }
 
-    public Size getAllocatedSpace(Widget child) {
+    public RenderSpace getAllocatedSpace(Widget child) {
         // TODO Auto-generated method stub
         return null;
     }
index fba04b6d8ff8559c8966deedccf2aced77ca1f75..e7d4dd3c82e27f80882f5dedf9489c03ab64eeff 100644 (file)
@@ -26,9 +26,9 @@ import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 import com.itmill.toolkit.terminal.gwt.client.ICaptionWrapper;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.StyleConstants;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 public class IGridLayout extends SimplePanel implements Paintable, Container,
         ContainerResizedListener {
@@ -295,7 +295,7 @@ public class IGridLayout extends SimplePanel implements Paintable, Container,
             return false;
         }
 
-        public Size getAllocatedSpace(Widget child) {
+        public RenderSpace getAllocatedSpace(Widget child) {
             // TODO Auto-generated method stub
             return null;
         }
@@ -327,7 +327,7 @@ public class IGridLayout extends SimplePanel implements Paintable, Container,
         return false;
     }
 
-    public Size getAllocatedSpace(Widget child) {
+    public RenderSpace getAllocatedSpace(Widget child) {
         // TODO Auto-generated method stub
         return null;
     }
index 7e39db07c0aa3fc94a2fe25e5041876eeade4119..788e50def5a8bb897c0b9c614f188e9921ae7462 100644 (file)
@@ -20,6 +20,7 @@ import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 import com.itmill.toolkit.terminal.gwt.client.ICaption;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
 import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
 import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
@@ -657,6 +658,7 @@ public class IOrderedLayout extends Panel implements Container,
      * Furthermore, enable/disable fixed mode
      */
     public void setWidth(String newWidth) {
+        super.setWidth(newWidth);
 
         if (newWidth == null || newWidth.equals("")) {
             width = null;
@@ -1589,17 +1591,17 @@ public class IOrderedLayout extends Panel implements Container,
 
     }
 
-    public Size getAllocatedSpace(Widget child) {
+    public RenderSpace getAllocatedSpace(Widget child) {
         final int index = childWidgets.indexOf(child);
         if (index >= 0) {
             WidgetWrapper wrapper = childWidgetWrappers.get(index);
             int w = wrapper.getAllocatedWidth();
             int h = wrapper.getAllocatedHeight();
 
-            return new Size(w, h);
+            return new RenderSpace(w, h);
 
+        } else {
+            return new RenderSpace();
         }
-
-        return new Size(0, 0);
     }
 }
index be8655f9f4256a0d879ecd7788d2d79096dd02c1..d4d6719082d06665cae68232a62d14655f475606 100644 (file)
@@ -6,22 +6,24 @@ package com.itmill.toolkit.terminal.gwt.client.ui;
 
 import java.util.Set;
 
+import com.google.gwt.user.client.Command;
 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.Event;
+import com.google.gwt.user.client.Timer;
 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.BrowserInfo;
-import com.itmill.toolkit.terminal.gwt.client.ClientExceptionHandler;
 import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 import com.itmill.toolkit.terminal.gwt.client.IErrorMessage;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
 import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
 import com.itmill.toolkit.terminal.gwt.client.Util;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 public class IPanel extends SimplePanel implements Container,
         ContainerResizedListener {
@@ -62,7 +64,9 @@ public class IPanel extends SimplePanel implements Container,
 
     private RenderInformation renderInformation = new RenderInformation();
 
-    private int borderPaddingHorizontal = 0;
+    private int borderPaddingHorizontal = -1;
+
+    private int borderPaddingVertical = -1;
 
     public IPanel() {
         super();
@@ -278,74 +282,6 @@ public class IPanel extends SimplePanel implements Container,
 
         }
 
-        if (height != null && height != "") {
-            final boolean hasChildren = getWidget() != null;
-            Element contentEl = null;
-            String origPositioning = null;
-
-            if (hasChildren) {
-                // Remove children temporary form normal flow to detect proper
-                // size
-                contentEl = getWidget().getElement();
-                origPositioning = DOM.getStyleAttribute(contentEl, "position");
-                DOM.setStyleAttribute(contentEl, "position", "absolute");
-            }
-
-            // Set defaults
-            DOM.setStyleAttribute(contentNode, "overflow", "hidden");
-            DOM.setStyleAttribute(contentNode, "height", "");
-
-            // Calculate target height
-            super.setHeight(height);
-            final int targetHeight = getOffsetHeight();
-
-            // Calculate used height
-            super.setHeight("");
-            if (BrowserInfo.get().isIE() && !hasChildren) {
-                DOM.setStyleAttribute(contentNode, "height", "0px");
-            }
-
-            final int bottomTop = DOM.getElementPropertyInt(bottomDecoration,
-                    "offsetTop");
-            final int bottomHeight = DOM.getElementPropertyInt(
-                    bottomDecoration, "offsetHeight");
-            final int elementTop = DOM.getElementPropertyInt(getElement(),
-                    "offsetTop");
-
-            final int usedHeight = bottomTop + bottomHeight - elementTop;
-
-            // Calculate content area height (don't allow negative values)
-            int contentAreaHeight = targetHeight - usedHeight;
-            if (contentAreaHeight < 0) {
-                contentAreaHeight = 0;
-            }
-
-            renderInformation.setContentAreaHeight(contentAreaHeight);
-
-            // Set proper values for content element
-            DOM.setStyleAttribute(contentNode, "height", contentAreaHeight
-                    + "px");
-            DOM.setStyleAttribute(contentNode, "overflow", "auto");
-
-            // Restore content to flow
-            if (hasChildren) {
-                DOM.setStyleAttribute(contentEl, "position", origPositioning);
-            }
-
-            // restore scroll position
-            DOM.setElementPropertyInt(contentNode, "scrollTop", scrollTop);
-            DOM.setElementPropertyInt(contentNode, "scrollLeft", scrollLeft);
-
-        } else {
-            DOM.setStyleAttribute(contentNode, "height", "");
-        }
-
-        if (width != null && !width.equals("")) {
-            renderInformation.setContentAreaWidth(renderInformation
-                    .getRenderedSize().getWidth()
-                    - borderPaddingHorizontal);
-        }
-
         if (runGeckoFix && BrowserInfo.get().isGecko()) {
             // workaround for #1764
             if (width == null || width.equals("")) {
@@ -370,6 +306,22 @@ public class IPanel extends SimplePanel implements Container,
             }
         }
 
+        if (BrowserInfo.get().getWebkitVersion() > 0) {
+            DeferredCommand.addCommand(new Command() {
+                public void execute() {
+                    // Dough, safari scoll auto means actually just a moped
+                    contentNode.getStyle().setProperty("overflow", "hidden");
+                    (new Timer() {
+                        @Override
+                        public void run() {
+                            contentNode.getStyle().setProperty("overflow",
+                                    "auto");
+                        }
+                    }).schedule(1);
+                }
+            });
+        }
+
         client.runDescendentsLayout(this);
     }
 
@@ -394,7 +346,7 @@ public class IPanel extends SimplePanel implements Container,
                 client.updateVariable(id, "scrollLeft", scrollLeft, false);
             }
         } else if (errorIndicatorElement != null
-                && DOM.compare(target, errorIndicatorElement)) {
+                && target == errorIndicatorElement) {
             switch (type) {
             case Event.ONMOUSEOVER:
                 if (errorMessage != null) {
@@ -416,36 +368,58 @@ public class IPanel extends SimplePanel implements Container,
         }
     }
 
-    /**
-     * Panel handles dimensions by itself.
-     */
     @Override
     public void setHeight(String height) {
         this.height = height;
+        super.setHeight(height);
+        if (height != null && height != "") {
+            final int targetHeight = getOffsetHeight();
+            int containerHeight = targetHeight - captionNode.getOffsetHeight()
+                    - bottomDecoration.getOffsetHeight()
+                    - getContainerBorderHeight();
+            if (containerHeight < 0) {
+                containerHeight = 0;
+            }
+            DOM
+                    .setStyleAttribute(contentNode, "height", containerHeight
+                            + "px");
+        } else {
+            DOM.setStyleAttribute(contentNode, "height", "");
+        }
+    }
+
+    private int getContainerBorderHeight() {
+        if (borderPaddingVertical < 0) {
+            detectContainerBorders();
+        }
+        return borderPaddingVertical;
     }
 
-    /**
-     * Panel handles dimensions by itself.
-     */
     @Override
     public void setWidth(String width) {
         this.width = width;
 
         super.setWidth(width);
 
-        if (width.endsWith("px")) {
-            try {
-                // FIXME: More sane implementation
-                borderPaddingHorizontal = Util.measureHorizontalPadding(
-                        contentNode, -2);
-                if (borderPaddingHorizontal < 0) {
-                    borderPaddingHorizontal = -borderPaddingHorizontal;
-                }
-            } catch (Exception e) {
-                ClientExceptionHandler.displayError(e);
-            }
+    }
+
+    private int getContainerBorderWidth() {
+        if (borderPaddingHorizontal < 0) {
+            detectContainerBorders();
         }
+        return borderPaddingHorizontal;
+    }
 
+    private void detectContainerBorders() {
+        DOM.setStyleAttribute(contentNode, "overflow", "hidden");
+        borderPaddingHorizontal = contentNode.getOffsetWidth()
+                - contentNode.getPropertyInt("clientWidth");
+        assert borderPaddingHorizontal >= 0;
+        borderPaddingVertical = contentNode.getOffsetHeight()
+                - contentNode.getPropertyInt("clientHeight");
+        assert borderPaddingVertical >= 0;
+
+        DOM.setStyleAttribute(contentNode, "overflow", "auto");
     }
 
     public boolean hasChildComponent(Widget component) {
@@ -460,31 +434,47 @@ public class IPanel extends SimplePanel implements Container,
         // TODO
     }
 
-    public Size getAllocatedSpace(Widget child) {
-        return renderInformation.getContentAreaSize();
+    private RenderSpace contentNodeSize;
+
+    public RenderSpace getAllocatedSpace(Widget child) {
+        if (contentNodeSize == null) {
+            contentNodeSize = new RenderSpace(-1, -1) {
+
+                @Override
+                public int getHeight() {
+                    return contentNode.getOffsetHeight()
+                            - getContainerBorderHeight();
+                }
+
+                @Override
+                public int getWidth() {
+                    return contentNode.getOffsetWidth()
+                            - getContainerBorderWidth();
+                }
+
+                @Override
+                public int getScrollbarSize() {
+                    return Util.getNativeScrollbarSize();
+                }
+
+            };
+        }
+        return contentNodeSize;
     }
 
     public boolean requestLayout(Set<Paintable> child) {
-
         if (height != null && width != null) {
             /*
              * If the height and width has been specified the child components
              * cannot make the size of the layout change
              */
-
             return true;
         }
-
-        if (renderInformation.updateSize(getElement())) {
-            return false;
-        } else {
-            return true;
-        }
-
+        return !renderInformation.updateSize(getElement());
     }
 
     public void updateCaption(Paintable component, UIDL uidl) {
-        // TODO
+        // NOP: layouts caption, errors etc not rendered in Panel
     }
 
 }
index 2ab507bd8c714dd96f8d780812b0da656ab46041..f0a0254f30df44a8a415128108af2d06a9c13106 100644 (file)
@@ -20,8 +20,8 @@ import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.ICaption;
 import com.itmill.toolkit.terminal.gwt.client.ICaptionWrapper;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 public class IPopupView extends HTML implements Paintable {
 
@@ -170,10 +170,10 @@ public class IPopupView extends HTML implements Paintable {
     }
 
     public static native void nativeBlur(Element e) /*-{ 
-                                                    if(e.focus) {
-                                                    e.blur();
-                                                    }
-                                                    }-*/;
+                                                       if(e.focus) {
+                                                       e.blur();
+                                                       }
+                                                       }-*/;
 
     private class CustomPopup extends IToolkitOverlay implements Container {
 
@@ -316,7 +316,7 @@ public class IPopupView extends HTML implements Paintable {
             return false;
         }
 
-        public Size getAllocatedSpace(Widget child) {
+        public RenderSpace getAllocatedSpace(Widget child) {
             // TODO Auto-generated method stub
             return null;
         }
index fb279b48abf4433bce4d9cbf81429da6eddb49c4..30661d43542e511d369ac6f2b79d6b3e2d9554a9 100644 (file)
@@ -20,9 +20,9 @@ import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
 import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
 import com.itmill.toolkit.terminal.gwt.client.Util;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 public class ISplitPanel extends ComplexPanel implements Container,
         ContainerResizedListener {
@@ -70,8 +70,10 @@ public class ISplitPanel extends ComplexPanel implements Container,
 
     private String height = null;
 
-    private RenderInformation renderInformationFirst = new RenderInformation();
-    private RenderInformation renderInformationSecond = new RenderInformation();
+    private RenderSpace firstRenderSpace = new RenderSpace(0, 0, true);
+    private RenderSpace secondRenderSpace = new RenderSpace(0, 0, true);
+
+    RenderInformation renderInformation = new RenderInformation();
 
     public ISplitPanel() {
         this(ORIENTATION_HORIZONTAL);
@@ -114,7 +116,7 @@ public class ISplitPanel extends ComplexPanel implements Container,
 
         DOM.setStyleAttribute(firstContainer, "overflow", "auto");
         DOM.setStyleAttribute(secondContainer, "overflow", "auto");
-        if (Util.isIE7()) {
+        if (BrowserInfo.get().isIE7()) {
             /*
              * Part I of IE7 weirdness hack, will be set to auto in layout phase
              * 
@@ -151,7 +153,7 @@ public class ISplitPanel extends ComplexPanel implements Container,
             return;
         }
 
-        renderInformationFirst.updateSize(getElement());
+        renderInformation.updateSize(getElement());
 
         setSplitPosition(uidl.getStringAttribute("position"));
 
@@ -211,7 +213,7 @@ public class ISplitPanel extends ComplexPanel implements Container,
             return;
         }
 
-        renderInformationFirst.updateSize(getElement());
+        renderInformation.updateSize(getElement());
 
         int wholeSize;
         int pixelPosition;
@@ -249,12 +251,11 @@ public class ISplitPanel extends ComplexPanel implements Container,
             DOM.setStyleAttribute(secondContainer, "left",
                     (pixelPosition + getSplitterSize()) + "px");
 
-            int contentHeight = renderInformationFirst.getRenderedSize()
-                    .getHeight();
-            renderInformationFirst.setContentAreaHeight(contentHeight);
-            renderInformationFirst.setContentAreaWidth(pixelPosition);
-            renderInformationSecond.setContentAreaHeight(contentHeight);
-            renderInformationSecond.setContentAreaWidth(secondContainerWidth);
+            int contentHeight = renderInformation.getRenderedSize().getHeight();
+            firstRenderSpace.setHeight(contentHeight);
+            firstRenderSpace.setWidth(pixelPosition);
+            secondRenderSpace.setHeight(contentHeight);
+            secondRenderSpace.setWidth(secondContainerWidth);
 
             break;
         case ORIENTATION_VERTICAL:
@@ -283,12 +284,11 @@ public class ISplitPanel extends ComplexPanel implements Container,
             DOM.setStyleAttribute(secondContainer, "top",
                     (pixelPosition + getSplitterSize()) + "px");
 
-            int contentWidth = renderInformationFirst.getRenderedSize()
-                    .getWidth();
-            renderInformationFirst.setContentAreaHeight(pixelPosition);
-            renderInformationFirst.setContentAreaWidth(contentWidth);
-            renderInformationSecond.setContentAreaHeight(secondContainerHeight);
-            renderInformationSecond.setContentAreaWidth(contentWidth);
+            int contentWidth = renderInformation.getRenderedSize().getWidth();
+            firstRenderSpace.setHeight(pixelPosition);
+            firstRenderSpace.setWidth(contentWidth);
+            secondRenderSpace.setHeight(secondContainerHeight);
+            secondRenderSpace.setWidth(contentWidth);
 
             break;
         }
@@ -310,7 +310,7 @@ public class ISplitPanel extends ComplexPanel implements Container,
             }
         }
 
-        renderInformationFirst.updateSize(getElement());
+        renderInformation.updateSize(getElement());
 
     }
 
@@ -480,11 +480,11 @@ public class ISplitPanel extends ComplexPanel implements Container,
         super.setWidth(width);
     }
 
-    public Size getAllocatedSpace(Widget child) {
+    public RenderSpace getAllocatedSpace(Widget child) {
         if (child == firstChild) {
-            return renderInformationFirst.getContentAreaSize();
+            return firstRenderSpace;
         } else if (child == secondChild) {
-            return renderInformationSecond.getContentAreaSize();
+            return secondRenderSpace;
         }
 
         return null;
@@ -508,7 +508,7 @@ public class ISplitPanel extends ComplexPanel implements Container,
             return true;
         }
 
-        if (renderInformationFirst.updateSize(getElement())) {
+        if (renderInformation.updateSize(getElement())) {
             return false;
         } else {
             return true;
index 161c2e8091570471994393964d8a33cf96b8ceb2..cee2cebe4a03ef760d3a97aa57a3cffe957e5d98 100644 (file)
@@ -13,17 +13,19 @@ 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.Event;
+import com.google.gwt.user.client.Timer;
 import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.ComplexPanel;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.Widget;
 import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
+import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
 import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
 import com.itmill.toolkit.terminal.gwt.client.ICaption;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
 import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 public class ITabsheet extends ITabsheetBase implements
         ContainerResizedListener {
@@ -115,8 +117,8 @@ public class ITabsheet extends ITabsheetBase implements
     private final Element scrollerPrev; // tab-scroller prev button element
     private int scrollerIndex = 0;
 
-    private final TabBar tb;
-    private final ITabsheetPanel tp;
+    private final TabBar tb = new TabBar();
+    private final ITabsheetPanel tp = new ITabsheetPanel();
     private final Element contentNode, deco;
 
     private final HashMap captions = new HashMap();
@@ -183,8 +185,6 @@ public class ITabsheet extends ITabsheetBase implements
         DOM.appendChild(getElement(), tabs);
 
         // Tabs
-        tb = new TabBar();
-        tp = new ITabsheetPanel();
         tp.setStyleName(CLASSNAME + "-tabsheetpanel");
         contentNode = DOM.createDiv();
 
@@ -216,8 +216,7 @@ public class ITabsheet extends ITabsheetBase implements
     public void onBrowserEvent(Event event) {
 
         // Tab scrolling
-        if (isScrolledTabs()
-                && DOM.compare(DOM.eventGetTarget(event), scrollerPrev)) {
+        if (isScrolledTabs() && DOM.eventGetTarget(event) == scrollerPrev) {
             if (scrollerIndex > 0) {
                 scrollerIndex--;
                 DOM.setStyleAttribute(DOM.getChild(DOM.getFirstChild(DOM
@@ -225,8 +224,7 @@ public class ITabsheet extends ITabsheetBase implements
                         "display", "");
                 updateTabScroller();
             }
-        } else if (isClippedTabs()
-                && DOM.compare(DOM.eventGetTarget(event), scrollerNext)) {
+        } else if (isClippedTabs() && DOM.eventGetTarget(event) == scrollerNext) {
             int tabs = tb.getTabCount();
             if (scrollerIndex + 1 <= tabs) {
                 DOM.setStyleAttribute(DOM.getChild(DOM.getFirstChild(DOM
@@ -351,68 +349,67 @@ public class ITabsheet extends ITabsheetBase implements
     }
 
     public void setHeight(String height) {
-        if (this.height == null && height == null) {
-            return;
-        }
-        String oldHeight = this.height;
+        super.setHeight(height);
         this.height = height;
-        if ((this.height != null && height == null)
-                || (this.height == null && height != null)
-                || !height.equals(oldHeight)) {
-            iLayout();
-        }
-    }
-
-    public void setWidth(String width) {
-        String oldWidth = this.width;
-        this.width = width;
-        if ("100%".equals(width)) {
-            // Allow browser to calculate width
-            super.setWidth("");
-        } else {
-            super.setWidth(width);
-        }
-        if ((this.width != null && width == null)
-                || (this.width == null && width != null)
-                || !width.equals(oldWidth)) {
-            // Run descendant layout functions
-            client.runDescendentsLayout(this);
-        }
-    }
-
-    public void iLayout() {
-        renderInformation.updateSize(getElement());
-
-        if (height != null && height != "") {
-            super.setHeight(height);
-
+        if (height != null && !"".equals(height)) {
             int contentHeight = getOffsetHeight()
                     - DOM.getElementPropertyInt(deco, "offsetHeight")
-                    - tb.getOffsetHeight();
+                    - tb.getOffsetHeight() - 5;
             if (contentHeight < 0) {
                 contentHeight = 0;
             }
 
             // Set proper values for content element
             DOM.setStyleAttribute(contentNode, "height", contentHeight + "px");
+            renderSpace.setHeight(contentHeight);
             DOM.setStyleAttribute(contentNode, "overflow", "auto");
-            tp.setHeight("100%");
-
         } else {
             DOM.setStyleAttribute(contentNode, "height", "");
             DOM.setStyleAttribute(contentNode, "overflow", "");
+            renderSpace.setHeight(0);
+        }
+        iLayout();
+    }
+
+    public void setWidth(String width) {
+        super.setWidth(width);
+        this.width = width;
+        if ("".equals(width)) {
+            renderSpace.setWidth(0);
+            contentNode.getStyle().setProperty("width", "");
+        } else {
+            int contentWidth = getOffsetWidth() - getContentAreaBorderWidth();
+            contentNode.getStyle().setProperty("width", contentWidth + "px");
+            renderSpace.setWidth(contentWidth);
         }
+        iLayout();
+    }
+
+    public void iLayout() {
+        renderInformation.updateSize(getElement());
 
         if (client != null) {
             client.runDescendentsLayout(this);
         }
 
-        renderInformation.setContentAreaWidth(tp.getElement().getOffsetWidth());
-        renderInformation.setContentAreaHeight(tp.getElement()
-                .getOffsetHeight());
-
         updateTabScroller();
 
+        if (BrowserInfo.get().getWebkitVersion() > 0) {
+            DeferredCommand.addCommand(new Command() {
+                public void execute() {
+                    // Dough, safari scoll auto means actually just a moped
+                    contentNode.getStyle().setProperty("overflow", "hidden");
+                    (new Timer() {
+                        @Override
+                        public void run() {
+                            contentNode.getStyle().setProperty("overflow",
+                                    "auto");
+                        }
+                    }).schedule(100);
+                }
+            });
+        }
+
     }
 
     /**
@@ -517,9 +514,27 @@ public class ITabsheet extends ITabsheetBase implements
 
     }
 
-    public Size getAllocatedSpace(Widget child) {
-        // All tabs have equal amount of space allocated
+    private int borderW = -1;
+
+    private void detectBorder() {
+        String property = contentNode.getStyle().getProperty("overflow");
+        contentNode.getStyle().setProperty("overflow", "hidden");
+        borderW = contentNode.getOffsetWidth()
+                - contentNode.getPropertyInt("clientWidth");
+        contentNode.getStyle().setProperty("overflow", property);
+    }
 
-        return renderInformation.getContentAreaSize();
+    private int getContentAreaBorderWidth() {
+        if (borderW < 0) {
+            detectBorder();
+        }
+        return borderW;
+    }
+
+    private RenderSpace renderSpace = new RenderSpace(0, 0, true);
+
+    public RenderSpace getAllocatedSpace(Widget child) {
+        // All tabs have equal amount of space allocated
+        return renderSpace;
     }
 }
index 0f18345da2d419f9862a7fcd75cf3b81f5f0852b..8ace8121aa57fb53d9f4b49102daa3708b3960ef 100644 (file)
@@ -21,7 +21,7 @@ import com.google.gwt.user.client.ui.Widget;
 public class ITabsheetPanel extends ComplexPanel {\r
 \r
     private Widget visibleWidget;\r
-    private boolean fullheight = false;\r
+    private int contentHeight;\r
 \r
     /**\r
      * Creates an empty tabsheet panel.\r
@@ -44,9 +44,6 @@ public class ITabsheetPanel extends ComplexPanel {
 \r
     private Element createContainerElement() {\r
         Element el = DOM.createDiv();\r
-        if (fullheight) {\r
-            DOM.setStyleAttribute(el, "height", "100%");\r
-        }\r
         hide(el);\r
         return el;\r
     }\r
@@ -109,33 +106,9 @@ public class ITabsheetPanel extends ComplexPanel {
         }\r
     }\r
 \r
-    /*\r
-     * Gets only called with 100% or ""\r
-     */\r
-    public void setHeight(String height) {\r
-        super.setHeight(height);\r
-        if ("100%".equals(height)) {\r
-            if (!fullheight) {\r
-                int childCount = DOM.getChildCount(getElement());\r
-                for (int i = 0; i < childCount; i++) {\r
-                    DOM.setStyleAttribute(DOM.getChild(getElement(), i),\r
-                            "height", "100%");\r
-                }\r
-                fullheight = true;\r
-            }\r
-        } else if (fullheight) {\r
-            int childCount = DOM.getChildCount(getElement());\r
-            for (int i = 0; i < childCount; i++) {\r
-                DOM.setStyleAttribute(DOM.getChild(getElement(), i), "height",\r
-                        "");\r
-            }\r
-            fullheight = false;\r
-        }\r
-    }\r
-\r
     private void hide(Element e) {\r
-        DOM.setStyleAttribute(e, "width", getOffsetWidth() + "px");\r
-        DOM.setStyleAttribute(e, "height", getOffsetHeight() + "px");\r
+        DOM.setStyleAttribute(e, "width", "0px");\r
+        DOM.setStyleAttribute(e, "height", "0px");\r
         DOM.setStyleAttribute(e, "overflow", "hidden");\r
         DOM.setStyleAttribute(e, "visibility", "hidden");\r
         DOM.setStyleAttribute(e, "position", "absolute");\r
@@ -144,17 +117,16 @@ public class ITabsheetPanel extends ComplexPanel {
     }\r
 \r
     private void unHide(Element e) {\r
+        DOM.setStyleAttribute(e, "marginLeft", "0px");\r
+        DOM.setStyleAttribute(e, "marginTop", "0px");\r
         DOM.setStyleAttribute(e, "position", "");\r
         DOM.setStyleAttribute(e, "top", "");\r
         DOM.setStyleAttribute(e, "left", "");\r
         DOM.setStyleAttribute(e, "visibility", "");\r
         DOM.setStyleAttribute(e, "width", "");\r
-        if (fullheight) {\r
-            DOM.setStyleAttribute(e, "height", "100%");\r
-        } else {\r
-            DOM.setStyleAttribute(e, "height", "");\r
-        }\r
+        DOM.setStyleAttribute(e, "height", "");\r
         DOM.setStyleAttribute(e, "overflow", "");\r
 \r
     }\r
+\r
 }\r
index d41062b10c58ddb2427613c2ed1529ed06ff0766..8e601bd140d282da9343085cc833922247f06e2a 100644 (file)
@@ -26,10 +26,9 @@ import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
 import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.Focusable;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
 import com.itmill.toolkit.terminal.gwt.client.Util;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 
 /**
  * 
@@ -65,8 +64,6 @@ public class IView extends SimplePanel implements Container,
      */
     private Timer resizeTimer;
 
-    private RenderInformation renderInformation = new RenderInformation();
-
     public IView(String elementId) {
         super();
         setStyleName(CLASSNAME);
@@ -186,8 +183,6 @@ public class IView extends SimplePanel implements Container,
             layout = lo;
         }
 
-        updateContentAreaSize();
-
         layout.updateFromUIDL(childUidl, client);
 
         // Update subwindows
@@ -289,14 +284,6 @@ public class IView extends SimplePanel implements Container,
 
     }
 
-    private void updateContentAreaSize() {
-        renderInformation.setContentAreaWidth(getElement().getOffsetWidth());
-
-        // For some reason IView has a 1 pixel padding
-        renderInformation
-                .setContentAreaHeight(getElement().getOffsetHeight() - 1);
-    }
-
     @Override
     public void onBrowserEvent(Event event) {
         super.onBrowserEvent(event);
@@ -331,8 +318,6 @@ public class IView extends SimplePanel implements Container,
                                     "window h" + IView.this.height);
                         }
                         if (changed) {
-                            updateContentAreaSize();
-
                             ApplicationConnection
                                     .getConsole()
                                     .log(
@@ -363,7 +348,6 @@ public class IView extends SimplePanel implements Container,
             ApplicationConnection.getConsole().log(
                     "Running layout functions due window resize");
 
-            updateContentAreaSize();
             connection.runDescendentsLayout(this);
 
             DOM.setStyleAttribute(getElement(), "overflow", overflow);
@@ -387,17 +371,54 @@ public class IView extends SimplePanel implements Container,
         connection.sendPendingVariableChangesSync();
     }
 
-    private static native void focusElement(Element e)
-    /*-{ 
-       e.focus();
-    }-*/;
-
     public String onWindowClosing() {
         return null;
     }
 
-    public Size getAllocatedSpace(Widget child) {
-        return renderInformation.getContentAreaSize();
+    private final RenderSpace myRenderSpace = new RenderSpace() {
+        private int excessHeight = -1;
+        private int excessWidth = -1;
+
+        @Override
+        public int getHeight() {
+            return getElement().getOffsetHeight() - getExcessHeight();
+        }
+
+        private int getExcessHeight() {
+            if (excessHeight < 0) {
+                detetExessSize();
+            }
+            return excessHeight;
+        }
+
+        private void detetExessSize() {
+            getElement().getStyle().setProperty("overflow", "hidden");
+            excessHeight = getElement().getOffsetHeight()
+                    - getElement().getPropertyInt("clientHeight");
+            excessWidth = getElement().getOffsetWidth()
+                    - getElement().getPropertyInt("clientWidth");
+        }
+
+        @Override
+        public int getWidth() {
+            return getElement().getOffsetWidth() - getExcessWidth();
+        }
+
+        private int getExcessWidth() {
+            if (excessWidth < 0) {
+                detetExessSize();
+            }
+            return excessWidth;
+        }
+
+        @Override
+        public int getScrollbarSize() {
+            return Util.getNativeScrollbarSize();
+        }
+    };
+
+    public RenderSpace getAllocatedSpace(Widget child) {
+        return myRenderSpace;
     }
 
     public boolean hasChildComponent(Widget component) {
index 8de7a9e366ff959c591c96757adcd906c1530db5..77d2573f54afd73735f6677e243a7999e914e26b 100644 (file)
@@ -5,6 +5,7 @@
 package com.itmill.toolkit.terminal.gwt.client.ui;
 
 import java.util.Iterator;
+import java.util.Set;
 import java.util.Vector;
 
 import com.google.gwt.user.client.Command;
@@ -20,7 +21,9 @@ import com.google.gwt.user.client.ui.ScrollPanel;
 import com.google.gwt.user.client.ui.Widget;
 import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
 import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
+import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
 import com.itmill.toolkit.terminal.gwt.client.Util;
 
@@ -31,7 +34,7 @@ import com.itmill.toolkit.terminal.gwt.client.Util;
  * 
  * @author IT Mill Ltd
  */
-public class IWindow extends IToolkitOverlay implements Paintable,
+public class IWindow extends IToolkitOverlay implements Container,
         ScrollListener {
 
     private static final int MIN_HEIGHT = 60;
@@ -329,6 +332,7 @@ public class IWindow extends IToolkitOverlay implements Paintable,
             }
         } else if (!showingUrl) {
             contentPanel.setWidget((Widget) lo);
+            layout = lo;
         }
         lo.updateFromUIDL(childUidl, client);
 
@@ -774,4 +778,48 @@ public class IWindow extends IToolkitOverlay implements Paintable,
         borderWidthHorizontal = windowWidth - contentWidth;
     }
 
+    public RenderSpace getAllocatedSpace(Widget child) {
+        if (child == layout) {
+            return new RenderSpace() {
+                @Override
+                public int getHeight() {
+                    return contentPanel.getOffsetHeight();
+                }
+
+                @Override
+                public int getWidth() {
+                    return contentPanel.getOffsetWidth();
+                }
+
+                @Override
+                public int getScrollbarSize() {
+                    return Util.getNativeScrollbarSize();
+                }
+            };
+        } else {
+            // Exception ??
+            return null;
+        }
+    }
+
+    public boolean hasChildComponent(Widget component) {
+        if (component == layout) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public void replaceChildComponent(Widget oldComponent, Widget newComponent) {
+        contentPanel.setWidget(newComponent);
+    }
+
+    public boolean requestLayout(Set<Paintable> child) {
+        return true;
+    }
+
+    public void updateCaption(Paintable component, UIDL uidl) {
+        // NOP, window has own caption, layout captio not rendered
+    }
+
 }
index 54f81f44b23d361536241187045a71dc6c2a0181..38ce97192d7544c96dc80105310e233ead62c253 100644 (file)
@@ -286,7 +286,9 @@ public class IAbsoluteGrid extends Composite implements
                 cell.render();
                 cell.vAling();
             }
-            client.runDescendentsLayout(ap);
+            if (client != null) {
+                client.runDescendentsLayout(ap);
+            }
         }
     }
 
index e639c99b48e71b4a6897731ca46123c8ede91094..ed07b06f2a0dec43aeb5c9186a71477451c27a14 100644 (file)
@@ -14,8 +14,8 @@ import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
 import com.itmill.toolkit.terminal.gwt.client.Container;
 import com.itmill.toolkit.terminal.gwt.client.ICaption;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
 import com.itmill.toolkit.terminal.gwt.client.ui.MarginInfo;
 
 /**
@@ -255,7 +255,7 @@ public class ISizeableGridLayout extends IAbsoluteGrid implements Paintable,
         return false;
     }
 
-    public Size getAllocatedSpace(Widget child) {
+    public RenderSpace getAllocatedSpace(Widget child) {
         // TODO Auto-generated method stub
         return null;
     }