summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorAnna Koskinen <anna@vaadin.com>2015-10-07 09:44:44 +0300
committerVaadin Code Review <review@vaadin.com>2016-05-16 10:03:28 +0000
commit1a9fc1e00bef79f6e379bdc587698522fca4591a (patch)
tree0007ddfa152a24b37bd53fc1cab10ac8595b420a /client
parent7d2d091ecbb0b995dc46074725eabb456609cdf3 (diff)
downloadvaadin-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.java53
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());