diff options
author | Anna Koskinen <anna@vaadin.com> | 2015-10-07 09:44:44 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2016-05-16 10:03:28 +0000 |
commit | 1a9fc1e00bef79f6e379bdc587698522fca4591a (patch) | |
tree | 0007ddfa152a24b37bd53fc1cab10ac8595b420a /client | |
parent | 7d2d091ecbb0b995dc46074725eabb456609cdf3 (diff) | |
download | vaadin-framework-1a9fc1e00bef79f6e379bdc587698522fca4591a.tar.gz vaadin-framework-1a9fc1e00bef79f6e379bdc587698522fca4591a.zip |
Tooltip might not close when moving outside of UI (#13370)
Change-Id: Iee39b7251af20ff25cf220e91f1b3c123345f711
Diffstat (limited to 'client')
-rw-r--r-- | client/src/main/java/com/vaadin/client/VTooltip.java | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/client/src/main/java/com/vaadin/client/VTooltip.java b/client/src/main/java/com/vaadin/client/VTooltip.java index f3d65cd20a..39d0682821 100644 --- a/client/src/main/java/com/vaadin/client/VTooltip.java +++ b/client/src/main/java/com/vaadin/client/VTooltip.java @@ -20,7 +20,19 @@ import com.google.gwt.aria.client.RelevantValue; import com.google.gwt.aria.client.Roles; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style.Display; -import com.google.gwt.event.dom.client.*; +import com.google.gwt.event.dom.client.BlurEvent; +import com.google.gwt.event.dom.client.BlurHandler; +import com.google.gwt.event.dom.client.DomEvent; +import com.google.gwt.event.dom.client.FocusEvent; +import com.google.gwt.event.dom.client.FocusHandler; +import com.google.gwt.event.dom.client.KeyDownEvent; +import com.google.gwt.event.dom.client.KeyDownHandler; +import com.google.gwt.event.dom.client.MouseDownEvent; +import com.google.gwt.event.dom.client.MouseDownHandler; +import com.google.gwt.event.dom.client.MouseMoveEvent; +import com.google.gwt.event.dom.client.MouseMoveHandler; +import com.google.gwt.event.dom.client.MouseOutEvent; +import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; @@ -462,6 +474,8 @@ public class VTooltip extends VOverlay { // tooltip closeTimer.cancel(); closing = false; + } else if (type == Event.ONMOUSEOUT) { + tooltipEventHandler.handleOnMouseOut(DOM.eventGetTarget(event)); } } @@ -481,7 +495,8 @@ public class VTooltip extends VOverlay { } private class TooltipEventHandler implements MouseMoveHandler, - KeyDownHandler, FocusHandler, BlurHandler, MouseDownHandler { + KeyDownHandler, FocusHandler, BlurHandler, MouseDownHandler, + MouseOutHandler { /** * Marker for handling of tooltip through focus @@ -629,6 +644,39 @@ public class VTooltip extends VOverlay { handledByFocus = isFocused; currentElement = element; } + + @Override + public void onMouseOut(MouseOutEvent moe) { + Element element = WidgetUtil.getElementUnderMouse(moe + .getNativeEvent()); + handleOnMouseOut(element); + } + + private void handleOnMouseOut(Element element) { + if (element == null) { + // hide if mouse is outside of browser window + handleHideEvent(); + } else { + Widget owner = getOwner(); + if (owner != null && !owner.getElement().isOrHasChild(element) + && !hasCommonOwner(owner, element)) { + // hide if mouse is no longer within the UI nor an overlay + // that belongs to the UI, e.g. a Window + handleHideEvent(); + } + } + } + + private boolean hasCommonOwner(Widget owner, Element element) { + ComponentConnector connector = Util.findPaintable( + getApplicationConnection(), element); + if (connector != null && connector.getConnection() != null + && connector.getConnection().getUIConnector() != null) { + return owner.equals(connector.getConnection().getUIConnector() + .getWidget()); + } + return false; + } } private final TooltipEventHandler tooltipEventHandler = new TooltipEventHandler(); @@ -641,6 +689,7 @@ public class VTooltip extends VOverlay { */ public void connectHandlersToWidget(Widget widget) { Profiler.enter("VTooltip.connectHandlersToWidget"); + widget.addDomHandler(tooltipEventHandler, MouseOutEvent.getType()); widget.addDomHandler(tooltipEventHandler, MouseMoveEvent.getType()); widget.addDomHandler(tooltipEventHandler, MouseDownEvent.getType()); widget.addDomHandler(tooltipEventHandler, KeyDownEvent.getType()); |