diff options
4 files changed, 42 insertions, 5 deletions
diff --git a/WebContent/VAADIN/themes/base/common/common.scss b/WebContent/VAADIN/themes/base/common/common.scss index e7fdd3fe84..d6dfed11df 100644 --- a/WebContent/VAADIN/themes/base/common/common.scss +++ b/WebContent/VAADIN/themes/base/common/common.scss @@ -204,6 +204,12 @@ body &.v-app-loading { padding: 2px; } +/* Fix for IE9 caret bug #11152 */ +input, +textarea { + position: relative; +} + .v-drag-element { z-index: 60000; /* override any other position: properties */ diff --git a/client/src/com/vaadin/client/ui/AbstractClickEventHandler.java b/client/src/com/vaadin/client/ui/AbstractClickEventHandler.java index bd2654df75..2f97d30ece 100644 --- a/client/src/com/vaadin/client/ui/AbstractClickEventHandler.java +++ b/client/src/com/vaadin/client/ui/AbstractClickEventHandler.java @@ -33,6 +33,7 @@ import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.Event.NativePreviewHandler; import com.vaadin.client.ComponentConnector; import com.vaadin.client.Util; +import com.vaadin.client.VConsole; public abstract class AbstractClickEventHandler implements MouseDownHandler, MouseUpHandler, DoubleClickHandler, ContextMenuHandler { @@ -77,7 +78,7 @@ public abstract class AbstractClickEventHandler implements MouseDownHandler, && elementUnderMouse == lastMouseDownTarget) { mouseUpPreviewMatched = true; } else { - System.out.println("Ignoring mouseup from " + VConsole.log("Ignoring mouseup from " + elementUnderMouse + " when mousedown was on " + lastMouseDownTarget); } diff --git a/client/src/com/vaadin/client/ui/VNativeButton.java b/client/src/com/vaadin/client/ui/VNativeButton.java index 6fd5d8d2ee..6e1c5bae77 100644 --- a/client/src/com/vaadin/client/ui/VNativeButton.java +++ b/client/src/com/vaadin/client/ui/VNativeButton.java @@ -16,9 +16,14 @@ package com.vaadin.client.ui; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.MouseEvent; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Button; @@ -26,6 +31,7 @@ import com.vaadin.client.ApplicationConnection; import com.vaadin.client.BrowserInfo; import com.vaadin.client.MouseEventDetailsBuilder; import com.vaadin.client.Util; +import com.vaadin.client.VConsole; import com.vaadin.shared.MouseEventDetails; import com.vaadin.shared.ui.button.ButtonServerRpc; @@ -60,6 +66,8 @@ public class VNativeButton extends Button implements ClickHandler { */ private boolean clickPending; + private boolean cancelNextClick = false; + /** For internal use only. May be removed or replaced in the future. */ public boolean disableOnClick = false; @@ -71,8 +79,8 @@ public class VNativeButton extends Button implements ClickHandler { addClickHandler(this); - sinkEvents(Event.ONMOUSEDOWN); - sinkEvents(Event.ONMOUSEUP); + sinkEvents(Event.ONMOUSEDOWN | Event.ONLOAD | Event.ONMOUSEMOVE + | Event.ONFOCUS); } @Override @@ -95,6 +103,7 @@ public class VNativeButton extends Button implements ClickHandler { } else if (DOM.eventGetType(event) == Event.ONMOUSEDOWN && event.getButton() == Event.BUTTON_LEFT) { clickPending = true; + } else if (DOM.eventGetType(event) == Event.ONMOUSEMOVE) { clickPending = false; } else if (DOM.eventGetType(event) == Event.ONMOUSEOUT) { @@ -102,6 +111,21 @@ public class VNativeButton extends Button implements ClickHandler { click(); } clickPending = false; + } else if (event.getTypeInt() == Event.ONFOCUS) { + if (BrowserInfo.get().isIE() && clickPending) { + /* + * The focus event will mess up IE and IE will not trigger the + * mouse up event (which in turn triggers the click event) until + * the mouse is moved. This will result in it appearing as a + * native button not triggering the event. So we manually + * trigger the click here and cancel the next original event + * which will occur on the next mouse move. See ticket #11094 + * for details. + */ + click(); + clickPending = false; + cancelNextClick = true; + } } } @@ -120,7 +144,8 @@ public class VNativeButton extends Button implements ClickHandler { */ @Override public void onClick(ClickEvent event) { - if (paintableId == null || client == null) { + if (paintableId == null || client == null || cancelNextClick) { + cancelNextClick = false; return; } diff --git a/server/src/com/vaadin/ui/DateField.java b/server/src/com/vaadin/ui/DateField.java index 78c86ceb00..1a8955801b 100644 --- a/server/src/com/vaadin/ui/DateField.java +++ b/server/src/com/vaadin/ui/DateField.java @@ -19,8 +19,10 @@ package com.vaadin.ui; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; @@ -594,8 +596,11 @@ public class DateField extends AbstractField<Date> implements calendar = Calendar.getInstance(); // Start by a zeroed calendar to avoid having values for lower // resolution variables e.g. time when resolution is day + int min, field; for (Resolution r : Resolution.getResolutionsLowerThan(resolution)) { - calendar.set(r.getCalendarField(), 0); + field = r.getCalendarField(); + min = calendar.getActualMinimum(field); + calendar.set(field, min); } calendar.set(Calendar.MILLISECOND, 0); } |