From 609acd1bec1a724fdf37a1363696c1b92ca34261 Mon Sep 17 00:00:00 2001 From: John Ahlroos Date: Thu, 16 May 2013 11:12:48 +0300 Subject: Fixed table height rendering in Android 2.3 #11331 Change-Id: I085d825459416b1487873660c7baf9b0cdb476d2 --- client/src/com/vaadin/client/BrowserInfo.java | 9 +++++++++ client/src/com/vaadin/client/ui/VScrollTable.java | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) (limited to 'client') diff --git a/client/src/com/vaadin/client/BrowserInfo.java b/client/src/com/vaadin/client/BrowserInfo.java index f0a4ccde0a..5185f829fe 100644 --- a/client/src/com/vaadin/client/BrowserInfo.java +++ b/client/src/com/vaadin/client/BrowserInfo.java @@ -388,10 +388,19 @@ public class BrowserInfo { && (getOperatingSystemMajorVersion() == 3 || getOperatingSystemMajorVersion() == 4); } + public boolean isAndroid23() { + return isAndroid() && getOperatingSystemMajorVersion() == 2 + && getOperatingSystemMinorVersion() == 3; + } + private int getOperatingSystemMajorVersion() { return browserDetails.getOperatingSystemMajorVersion(); } + private int getOperatingSystemMinorVersion() { + return browserDetails.getOperatingSystemMinorVersion(); + } + /** * Returns the browser major version e.g., 3 for Firefox 3.5, 4 for Chrome * 4, 8 for Internet Explorer 8. diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java index 8705a826cc..e2e82a1959 100644 --- a/client/src/com/vaadin/client/ui/VScrollTable.java +++ b/client/src/com/vaadin/client/ui/VScrollTable.java @@ -6692,6 +6692,17 @@ public class VScrollTable extends FlowPanel implements HasWidgets, private void setContainerHeight() { if (!isDynamicHeight()) { + + /* + * Android 2.3 cannot measure the height of the inline-block + * properly, and will return the wrong offset height. So for android + * 2.3 we set the element to a block element while measuring and + * then restore it which yields the correct result. #11331 + */ + if (BrowserInfo.get().isAndroid23()) { + getElement().getStyle().setDisplay(Display.BLOCK); + } + containerHeight = getOffsetHeight(); containerHeight -= showColHeaders ? tHead.getOffsetHeight() : 0; containerHeight -= tFoot.getOffsetHeight(); @@ -6699,7 +6710,12 @@ public class VScrollTable extends FlowPanel implements HasWidgets, if (containerHeight < 0) { containerHeight = 0; } + scrollBodyPanel.setHeight(containerHeight + "px"); + + if (BrowserInfo.get().isAndroid23()) { + getElement().getStyle().clearDisplay(); + } } } -- cgit v1.2.3 From 63dd611503ff46392e59951377f501b94cd21f18 Mon Sep 17 00:00:00 2001 From: Marc Englund Date: Thu, 16 May 2013 16:17:17 +0300 Subject: Centers VOverlays in visual viewport on iOS, Android, fixes #11614 Change-Id: I21fc986b2f4253ad0491a49659db793acf77842d Ticket: 11614 --- client/src/com/vaadin/client/ui/VOverlay.java | 65 +++++++++++++++++++++ .../window/CenteredInVisualViewport.java | 66 ++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 uitest/src/com/vaadin/tests/components/window/CenteredInVisualViewport.java (limited to 'client') diff --git a/client/src/com/vaadin/client/ui/VOverlay.java b/client/src/com/vaadin/client/ui/VOverlay.java index d35201460e..9e809758ca 100644 --- a/client/src/com/vaadin/client/ui/VOverlay.java +++ b/client/src/com/vaadin/client/ui/VOverlay.java @@ -27,6 +27,7 @@ import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; @@ -689,4 +690,68 @@ public class VOverlay extends PopupPanel implements CloseHandler { return container; } + @Override + public void center() { + super.center(); + + // Some devices can be zoomed in, we should center to the visual + // viewport for those devices + BrowserInfo b = BrowserInfo.get(); + if (b.isAndroid() || b.isIOS()) { + int left = (getVisualViewportWidth() - getOffsetWidth()) >> 1; + int top = (getVisualViewportHeight() - getOffsetHeight()) >> 1; + setPopupPosition(Math.max(Window.getScrollLeft() + left, 0), + Math.max(Window.getScrollTop() + top, 0)); + } + + } + + /** + * Gets the visual viewport width, which is useful for e.g iOS where the + * view can be zoomed in while keeping the layout viewport intact. + * + * Falls back to layout viewport; for those browsers/devices the difference + * is that the scrollbar with is included (if there is a scrollbar). + * + * @since 7.0.7 + * @return + */ + private int getVisualViewportWidth() { + int w = (int) getSubpixelInnerWidth(); + if (w < 0) { + return Window.getClientWidth(); + } else { + return w; + } + } + + /** + * Gets the visual viewport height, which is useful for e.g iOS where the + * view can be zoomed in while keeping the layout viewport intact. + * + * Falls back to layout viewport; for those browsers/devices the difference + * is that the scrollbar with is included (if there is a scrollbar). + * + * @since 7.0.7 + * @return + */ + private int getVisualViewportHeight() { + int h = (int) getSubpixelInnerHeight(); + if (h < 0) { + return Window.getClientHeight(); + } else { + return h; + } + } + + private native double getSubpixelInnerWidth() + /*-{ + return $wnd.innerWidth !== undefined ? $wnd.innerWidth : -1; + }-*/; + + private native double getSubpixelInnerHeight() + /*-{ + return $wnd.innerHeight !== undefined ? $wnd.innerHeight :-1; + }-*/; + } diff --git a/uitest/src/com/vaadin/tests/components/window/CenteredInVisualViewport.java b/uitest/src/com/vaadin/tests/components/window/CenteredInVisualViewport.java new file mode 100644 index 0000000000..428b2ae3f9 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/window/CenteredInVisualViewport.java @@ -0,0 +1,66 @@ +package com.vaadin.tests.components.window; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.GridLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Window; + +public class CenteredInVisualViewport extends TestBase { + + @Override + protected String getDescription() { + return "Should open centered, even if zoomed in on one button (e.g zoom in iOS)"; + } + + @Override + protected Integer getTicketNumber() { + return 11614; + } + + @Override + protected void setup() { + GridLayout layout = new GridLayout(3, 3); + layout.setWidth("1000px"); + layout.setHeight("1000px"); + addComponent(layout); + + Button b = new Button("Open", new Button.ClickListener() { + + @Override + public void buttonClick(ClickEvent event) { + Window centered = new Window("A window", new Label( + "Centered window")); + centered.center(); + getMainWindow().addWindow(centered); + } + }); + layout.addComponent(b, 0, 0); + + b = new Button("Open", new Button.ClickListener() { + + @Override + public void buttonClick(ClickEvent event) { + Window centered = new Window("A window", new Label( + "Centered window")); + centered.center(); + getMainWindow().addWindow(centered); + } + }); + layout.addComponent(b, 1, 1); + + b = new Button("Open", new Button.ClickListener() { + + @Override + public void buttonClick(ClickEvent event) { + Window centered = new Window("A window", new Label( + "Centered window")); + centered.center(); + getMainWindow().addWindow(centered); + } + }); + layout.addComponent(b, 2, 2); + + } +} -- cgit v1.2.3