aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Signell <artur.signell@itmill.com>2009-11-10 09:31:45 +0000
committerArtur Signell <artur.signell@itmill.com>2009-11-10 09:31:45 +0000
commit7f65fde61b2251b4c756df54a2b8e3a0fb3fe7b3 (patch)
tree347a36f18fe1326767462a02586592a7c0c56084
parentb9e7081a5103b2feb3e6944701f1288950e78280 (diff)
downloadvaadin-framework-7f65fde61b2251b4c756df54a2b8e3a0fb3fe7b3.tar.gz
vaadin-framework-7f65fde61b2251b4c756df54a2b8e3a0fb3fe7b3.zip
Merged [9694] "Test case and fix for #3639 - DateField's popup calendar sometimes rendered out of sight" from 6.1
svn changeset:9696/svn branch:6.2
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VPopupCalendar.java37
-rw-r--r--tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.html157
-rw-r--r--tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.java63
3 files changed, 247 insertions, 10 deletions
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VPopupCalendar.java b/src/com/vaadin/terminal/gwt/client/ui/VPopupCalendar.java
index 9b74167689..0f269722de 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VPopupCalendar.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VPopupCalendar.java
@@ -78,19 +78,36 @@ public class VPopupCalendar extends VTextualDate implements Paintable, Field,
public void setPosition(int offsetWidth, int offsetHeight) {
final int w = offsetWidth;
final int h = offsetHeight;
+ final int browserWindowWidth = Window.getClientWidth()
+ + Window.getScrollLeft();
+ final int browserWindowHeight = Window.getClientHeight()
+ + Window.getScrollTop();
int t = calendarToggle.getAbsoluteTop();
int l = calendarToggle.getAbsoluteLeft();
- if (l + w > Window.getClientWidth()
- + Window.getScrollLeft()) {
- l = Window.getClientWidth() + Window.getScrollLeft()
- - w;
+
+ // Add a little extra space to the right to avoid
+ // problems with IE6/IE7 scrollbars and to make it look
+ // nicer.
+ int extraSpace = 30;
+
+ boolean overflowRight = false;
+ if (l + +w + extraSpace > browserWindowWidth) {
+ overflowRight = true;
+ // Part of the popup is outside the browser window
+ // (to the right)
+ l = browserWindowWidth - w - extraSpace;
}
- if (t + h + calendarToggle.getOffsetHeight() + 30 > Window
- .getClientHeight()
- + Window.getScrollTop()) {
- t = Window.getClientHeight() + Window.getScrollTop()
- - h - calendarToggle.getOffsetHeight() - 30;
- l += calendarToggle.getOffsetWidth();
+
+ if (t + h + calendarToggle.getOffsetHeight() + 30 > browserWindowHeight) {
+ // Part of the popup is outside the browser window
+ // (below)
+ t = browserWindowHeight - h
+ - calendarToggle.getOffsetHeight() - 30;
+ if (!overflowRight) {
+ // Show to the right of the popup button unless we
+ // are in the lower right corner of the screen
+ l += calendarToggle.getOffsetWidth();
+ }
}
// fix size
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
index 0000000000..6bc285ee72
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.html
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="" />
+<title>New Test</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">New Test</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.datefield.DateFieldPopupOffScreen</td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[2]/VPopupCalendar[0]/domChild[1]</td>
+ <td>10,10</td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>pause</td>
+ <td>300</td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VPopupCalendar[0]/domChild[1]</td>
+ <td>10,12</td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>pause</td>
+ <td>300</td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[4]/VPopupCalendar[0]/domChild[1]</td>
+ <td>8,10</td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>pause</td>
+ <td>300</td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[1]/VPopupCalendar[0]/domChild[1]</td>
+ <td>7,13</td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>pause</td>
+ <td>300</td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsdatefieldDateFieldPopupOffScreen::/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VPopupCalendar[0]/domChild[1]</td>
+ <td>11,14</td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>pause</td>
+ <td>300</td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
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
index 0000000000..1690bd61ce
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.java
@@ -0,0 +1,63 @@
+package com.vaadin.tests.components.datefield;
+
+import java.sql.Date;
+
+import com.vaadin.tests.components.AbstractTestCase;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.Window;
+
+public class DateFieldPopupOffScreen extends AbstractTestCase {
+
+ @Override
+ protected String getDescription() {
+ 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.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 3639;
+ }
+
+ @Override
+ public void init() {
+ Window mainWindow = new Window(getClass().getName());
+
+ GridLayout mainLayout = new GridLayout(3, 3);
+ mainLayout.setSizeFull();
+
+ DateField df;
+
+ df = createDateField();
+ mainLayout.addComponent(df, 2, 0);
+ mainLayout.setComponentAlignment(df, Alignment.TOP_RIGHT);
+
+ df = createDateField();
+ mainLayout.addComponent(df, 2, 1);
+ mainLayout.setComponentAlignment(df, Alignment.MIDDLE_RIGHT);
+
+ df = createDateField();
+ mainLayout.addComponent(df, 2, 2);
+ mainLayout.setComponentAlignment(df, Alignment.BOTTOM_RIGHT);
+
+ df = createDateField();
+ mainLayout.addComponent(df, 0, 2);
+ mainLayout.setComponentAlignment(df, Alignment.BOTTOM_LEFT);
+
+ df = createDateField();
+ mainLayout.addComponent(df, 1, 2);
+ mainLayout.setComponentAlignment(df, Alignment.BOTTOM_CENTER);
+
+ mainWindow.setContent(mainLayout);
+ setMainWindow(mainWindow);
+ }
+
+ private DateField createDateField() {
+ DateField df = new DateField();
+ df
+ .setDescription("This is a long, multiline tooltip.<br/>It should always be on screen so it can be read.");
+ df.setValue(new Date(1000000L));
+ return df;
+ }
+}