]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merged [9694] "Test case and fix for #3639 - DateField's popup calendar sometimes...
authorArtur Signell <artur.signell@itmill.com>
Tue, 10 Nov 2009 09:31:45 +0000 (09:31 +0000)
committerArtur Signell <artur.signell@itmill.com>
Tue, 10 Nov 2009 09:31:45 +0000 (09:31 +0000)
svn changeset:9696/svn branch:6.2

src/com/vaadin/terminal/gwt/client/ui/VPopupCalendar.java
tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.html [new file with mode: 0644]
tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.java [new file with mode: 0644]

index 9b74167689e54a775a7c474680f55f23c7d59e1e..0f269722de8fa9640641a515929a77721f8da010 100644 (file)
@@ -78,19 +78,36 @@ public class VPopupCalendar extends VTextualDate implements Paintable, Field,
                 public void setPosition(int offsetWidth, int offsetHeight) {\r
                     final int w = offsetWidth;\r
                     final int h = offsetHeight;\r
+                    final int browserWindowWidth = Window.getClientWidth()\r
+                            + Window.getScrollLeft();\r
+                    final int browserWindowHeight = Window.getClientHeight()\r
+                            + Window.getScrollTop();\r
                     int t = calendarToggle.getAbsoluteTop();\r
                     int l = calendarToggle.getAbsoluteLeft();\r
-                    if (l + w > Window.getClientWidth()\r
-                            + Window.getScrollLeft()) {\r
-                        l = Window.getClientWidth() + Window.getScrollLeft()\r
-                                - w;\r
+\r
+                    // Add a little extra space to the right to avoid\r
+                    // problems with IE6/IE7 scrollbars and to make it look\r
+                    // nicer.\r
+                    int extraSpace = 30;\r
+\r
+                    boolean overflowRight = false;\r
+                    if (l + +w + extraSpace > browserWindowWidth) {\r
+                        overflowRight = true;\r
+                        // Part of the popup is outside the browser window \r
+                        // (to the right)\r
+                        l = browserWindowWidth - w - extraSpace;\r
                     }\r
-                    if (t + h + calendarToggle.getOffsetHeight() + 30 > Window\r
-                            .getClientHeight()\r
-                            + Window.getScrollTop()) {\r
-                        t = Window.getClientHeight() + Window.getScrollTop()\r
-                                - h - calendarToggle.getOffsetHeight() - 30;\r
-                        l += calendarToggle.getOffsetWidth();\r
+\r
+                    if (t + h + calendarToggle.getOffsetHeight() + 30 > browserWindowHeight) {\r
+                        // Part of the popup is outside the browser window\r
+                        // (below)\r
+                        t = browserWindowHeight - h\r
+                                - calendarToggle.getOffsetHeight() - 30;\r
+                        if (!overflowRight) {\r
+                            // Show to the right of the popup button unless we\r
+                            // are in the lower right corner of the screen\r
+                            l += calendarToggle.getOffsetWidth();\r
+                        }\r
                     }\r
 \r
                     // fix size\r
diff --git a/tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.html b/tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.html
new file mode 100644 (file)
index 0000000..6bc285e
--- /dev/null
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\r
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">\r
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+<link rel="selenium.base" href="" />\r
+<title>New Test</title>\r
+</head>\r
+<body>\r
+<table cellpadding="1" cellspacing="1" border="1">\r
+<thead>\r
+<tr><td rowspan="1" colspan="3">New Test</td></tr>\r
+</thead><tbody>\r
+<tr>\r
+       <td>open</td>\r
+       <td>/run/com.vaadin.tests.components.datefield.DateFieldPopupOffScreen</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>screenCapture</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>mouseClick</td>\r
+       <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[2]/VPopupCalendar[0]/domChild[1]</td>\r
+       <td>10,10</td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>pause</td>\r
+       <td>300</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>screenCapture</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>mouseClick</td>\r
+       <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VPopupCalendar[0]/domChild[1]</td>\r
+       <td>10,12</td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>pause</td>\r
+       <td>300</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>screenCapture</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>mouseClick</td>\r
+       <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[4]/VPopupCalendar[0]/domChild[1]</td>\r
+       <td>8,10</td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>pause</td>\r
+       <td>300</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>screenCapture</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>mouseClick</td>\r
+       <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[1]/VPopupCalendar[0]/domChild[1]</td>\r
+       <td>7,13</td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>pause</td>\r
+       <td>300</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>screenCapture</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>mouseClick</td>\r
+       <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VPopupCalendar[0]/domChild[1]</td>\r
+       <td>11,14</td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>pause</td>\r
+       <td>300</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>waitForVaadin</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>screenCapture</td>\r
+       <td></td>\r
+       <td></td>\r
+</tr>\r
+\r
+</tbody></table>\r
+</body>\r
+</html>\r
diff --git a/tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.java b/tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.java
new file mode 100644 (file)
index 0000000..1690bd6
--- /dev/null
@@ -0,0 +1,63 @@
+package com.vaadin.tests.components.datefield;\r
+\r
+import java.sql.Date;\r
+\r
+import com.vaadin.tests.components.AbstractTestCase;\r
+import com.vaadin.ui.Alignment;\r
+import com.vaadin.ui.DateField;\r
+import com.vaadin.ui.GridLayout;\r
+import com.vaadin.ui.Window;\r
+\r
+public class DateFieldPopupOffScreen extends AbstractTestCase {\r
+\r
+    @Override\r
+    protected String getDescription() {\r
+        return "Test for the popup position from a DateField. The popup should always be on-screen even if the DateField is close the the edge of the browser.";\r
+    }\r
+\r
+    @Override\r
+    protected Integer getTicketNumber() {\r
+        return 3639;\r
+    }\r
+\r
+    @Override\r
+    public void init() {\r
+        Window mainWindow = new Window(getClass().getName());\r
+\r
+        GridLayout mainLayout = new GridLayout(3, 3);\r
+        mainLayout.setSizeFull();\r
+\r
+        DateField df;\r
+\r
+        df = createDateField();\r
+        mainLayout.addComponent(df, 2, 0);\r
+        mainLayout.setComponentAlignment(df, Alignment.TOP_RIGHT);\r
+\r
+        df = createDateField();\r
+        mainLayout.addComponent(df, 2, 1);\r
+        mainLayout.setComponentAlignment(df, Alignment.MIDDLE_RIGHT);\r
+\r
+        df = createDateField();\r
+        mainLayout.addComponent(df, 2, 2);\r
+        mainLayout.setComponentAlignment(df, Alignment.BOTTOM_RIGHT);\r
+\r
+        df = createDateField();\r
+        mainLayout.addComponent(df, 0, 2);\r
+        mainLayout.setComponentAlignment(df, Alignment.BOTTOM_LEFT);\r
+\r
+        df = createDateField();\r
+        mainLayout.addComponent(df, 1, 2);\r
+        mainLayout.setComponentAlignment(df, Alignment.BOTTOM_CENTER);\r
+\r
+        mainWindow.setContent(mainLayout);\r
+        setMainWindow(mainWindow);\r
+    }\r
+\r
+    private DateField createDateField() {\r
+        DateField df = new DateField();\r
+        df\r
+                .setDescription("This is a long, multiline tooltip.<br/>It should always be on screen so it can be read.");\r
+        df.setValue(new Date(1000000L));\r
+        return df;\r
+    }\r
+}\r