]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix for #2195 - TabSheet problems in Safari
authorArtur Signell <artur.signell@itmill.com>
Mon, 10 Nov 2008 10:58:57 +0000 (10:58 +0000)
committerArtur Signell <artur.signell@itmill.com>
Mon, 10 Nov 2008 10:58:57 +0000 (10:58 +0000)
svn changeset:5838/svn branch:trunk

WebContent/ITMILL/themes/default/styles.css
WebContent/ITMILL/themes/default/tabsheet/tabsheet.css
src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomComponent.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetPanel.java

index ad0782b8275f8352fe07bb51047a41a1906cc230..0ea9b658506c2ac7cea5d61d052237832d0de451 100644 (file)
@@ -358,10 +358,10 @@ input.i-modified,
  * Link component styles 
  * (useless to move into a separate file)
  */
-
-.i-link span {
-       text-decoration: underline;
-       cursor:pointer;
+.i-link a {
+       font-size: 13px;
+       line-height: 18px;
+       color: #464f52;
 }
 
 /**
@@ -1974,6 +1974,7 @@ input.i-modified,
        background-color: #fff;
        border-bottom: 1px solid #dee2e3;
        border-top: none;
+       position: relative;
 }
 
 .i-tabsheet-hidetabs .i-tabsheet-content {
index 90dcbbbbb50746cd9dae4b8c2c7d1afcabb8bc29..fee91776a89f32dcb1c223ff2c01e93e35bdd3a4 100644 (file)
        background-color: #fff;
        border-bottom: 1px solid #dee2e3;
        border-top: none;
+       position: relative;
 }\r
 \r
 .i-tabsheet-hidetabs .i-tabsheet-content {\r
index b0124809fc92d25ec7b81d9c4ddcdc3a1ae72fa8..4bf30467b718e600a76c14d547b798a73c05db9e 100644 (file)
@@ -22,6 +22,7 @@ public class ICustomComponent extends SimplePanel implements Container {
     private Paintable component;
     private boolean rendering;
     private String width;
+    private RenderSpace renderSpace = new RenderSpace();
 
     public ICustomComponent() {
         super();
@@ -49,6 +50,10 @@ public class ICustomComponent extends SimplePanel implements Container {
             }
             p.updateFromUIDL(child, client);
         }
+
+        renderSpace.setWidth(getElement().getOffsetWidth());
+        renderSpace.setHeight(getElement().getOffsetHeight());
+
         rendering = false;
     }
 
@@ -79,13 +84,14 @@ public class ICustomComponent extends SimplePanel implements Container {
     }
 
     public RenderSpace getAllocatedSpace(Widget child) {
-        return new RenderSpace(getElement().getOffsetWidth(), getElement()
-                .getOffsetHeight());
+        return renderSpace;
     }
 
     @Override
     public void setHeight(String height) {
         super.setHeight(height);
+        renderSpace.setHeight(getElement().getOffsetHeight());
+
         if (!height.equals(this.height)) {
             this.height = height;
             if (!rendering) {
@@ -97,6 +103,8 @@ public class ICustomComponent extends SimplePanel implements Container {
     @Override
     public void setWidth(String width) {
         super.setWidth(width);
+        renderSpace.setWidth(getElement().getOffsetWidth());
+
         if (!width.equals(this.width)) {
             this.width = width;
             if (!rendering) {
index 04531d30344dd321b3afc1d430629c95f92875a5..9dc38c4f66b3434dcac0b2c0782b655548676dcc 100644 (file)
@@ -399,7 +399,7 @@ public class ITabsheet extends ITabsheetBase implements
 
         ITabsheet.this.iLayout();
         (content).updateFromUIDL(contentUIDL, client);
-        fixHeight();
+        fixVisibleTabSize();
         ITabsheet.this.removeStyleDependentName("loading");
         if (previousVisibleWidget != null) {
             DOM.setStyleAttribute(previousVisibleWidget.getElement(),
@@ -422,11 +422,10 @@ public class ITabsheet extends ITabsheetBase implements
             // Set proper values for content element
             DOM.setStyleAttribute(contentNode, "height", contentHeight + "px");
             renderSpace.setHeight(contentHeight);
-            contentNode.getStyle().setProperty("position", "relative");
         } else {
             DOM.setStyleAttribute(contentNode, "height", "");
             renderSpace.setHeight(0);
-            fixHeight();
+            fixVisibleTabSize();
         }
         iLayout();
     }
@@ -458,24 +457,28 @@ public class ITabsheet extends ITabsheetBase implements
 
         updateTabScroller();
 
-        if (tp.getVisibleWidget() >= 0) {
-            Util.runWebkitOverflowAutoFix(DOM.getParent(tp.getWidget(
-                    tp.getVisibleWidget()).getElement()));
-        }
+        tp.runWebkitOverflowAutoFix();
     }
 
-    private void fixHeight() {
-        if (isDynamicHeight()) {
-            if (tp.getVisibleWidget() >= 0) {
-                Widget widget = tp.getWidget(tp.getVisibleWidget());
-                int widgetHeight = widget.getOffsetHeight();
-                DOM.setStyleAttribute(tp.getElement(), "height", widgetHeight
-                        + "px");
-                tp.setVisibleWidgetHeight(widgetHeight);
-            }
-        } else {
-            DOM.setStyleAttribute(tp.getElement(), "height", "");
+    /**
+     * Sets the size of the visible tab (component). As the tab is set to
+     * position: absolute (to work around a firefox flickering bug) we must keep
+     * this up-to-date by hand.
+     */
+    private void fixVisibleTabSize() {
+        /*
+         * The overflow=auto element must have a height specified, otherwise it
+         * will be just as high as the contents and no scrollbars will appear
+         */
+        int height = -1;
+        int width = -1;
+        if (!isDynamicHeight()) {
+            height = renderSpace.getHeight();
+        }
+        if (!isDynamicWidth()) {
+            width = renderSpace.getWidth();
         }
+        tp.fixVisibleTabSize(width, height);
 
     }
 
@@ -568,7 +571,7 @@ public class ITabsheet extends ITabsheetBase implements
              * Size has changed so we let the child components know about the
              * new size.
              */
-            fixHeight();
+            fixVisibleTabSize();
             iLayout();
 
             return false;
index b5eff5b122a76d448c90abc65587482882f73f6e..bae3b10c8cc2329d8ec80927d8faa60532d69210 100644 (file)
@@ -8,6 +8,7 @@ import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;\r
 import com.google.gwt.user.client.ui.ComplexPanel;\r
 import com.google.gwt.user.client.ui.Widget;\r
+import com.itmill.toolkit.terminal.gwt.client.Util;\r
 \r
 /**\r
  * A panel that displays all of its child widgets in a 'deck', where only one\r
@@ -116,16 +117,38 @@ public class ITabsheetPanel extends ComplexPanel {
     }\r
 \r
     private void unHide(Element e) {\r
-        DOM.setStyleAttribute(e, "top", "");\r
-        DOM.setStyleAttribute(e, "left", "");\r
+        DOM.setStyleAttribute(e, "top", "0px");\r
+        DOM.setStyleAttribute(e, "left", "0px");\r
         DOM.setStyleAttribute(e, "visibility", "");\r
-\r
     }\r
 \r
-    public void setVisibleWidgetHeight(int widgetHeight) {\r
-        DOM.setStyleAttribute(DOM.getParent(visibleWidget.getElement()),\r
-                "height", widgetHeight + "px");\r
+    public void fixVisibleTabSize(int width, int height) {\r
+        if (visibleWidget == null) {\r
+            return;\r
+        }\r
+\r
+        if (height < 0) {\r
+            height = visibleWidget.getOffsetHeight();\r
+        }\r
+        if (width < 0) {\r
+            width = visibleWidget.getOffsetWidth();\r
+        }\r
 \r
+        // i-tabsheet-tabsheetpanel height\r
+        getElement().getStyle().setPropertyPx("height", height);\r
+        getElement().getStyle().setPropertyPx("width", width);\r
+\r
+        // widget wrapper height\r
+        Element wrapperDiv = DOM.getParent(visibleWidget.getElement());\r
+        wrapperDiv.getStyle().setPropertyPx("height", height);\r
+        wrapperDiv.getStyle().setPropertyPx("width", width);\r
     }\r
 \r
+    public void runWebkitOverflowAutoFix() {\r
+        if (visibleWidget != null) {\r
+            Util.runWebkitOverflowAutoFix(DOM.getParent(visibleWidget\r
+                    .getElement()));\r
+        }\r
+\r
+    }\r
 }\r