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
--- /dev/null
+<?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
--- /dev/null
+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