From 22e8f6cd84772760cda21baf67d68268523d6614 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Mon, 2 May 2011 15:12:40 +0000 Subject: maybe fixes #6834 (can't reproduce as described, but this fixes an other related (possibly same) issue with Firefox 4) svn changeset:18588/svn branch:6.6 --- src/com/vaadin/terminal/gwt/client/Util.java | 35 ++++++++++++++++++++++ .../vaadin/terminal/gwt/client/ui/VTextField.java | 16 +++++----- 2 files changed, 44 insertions(+), 7 deletions(-) (limited to 'src/com') diff --git a/src/com/vaadin/terminal/gwt/client/Util.java b/src/com/vaadin/terminal/gwt/client/Util.java index e6819efc44..70af13bd4b 100644 --- a/src/com/vaadin/terminal/gwt/client/Util.java +++ b/src/com/vaadin/terminal/gwt/client/Util.java @@ -1202,4 +1202,39 @@ public class Util { return null; }-*/ ; + + /** + * Kind of stronger version of isAttached(). In addition to std isAttached, + * this method checks that this widget nor any of its parents is hidden. Can + * be e.g used to check whether component should react to some events or + * not. + * + * @param widget + * @return true if attached and displayed + */ + public static boolean isAttachedAndDisplayed(Widget widget) { + if (widget.isAttached()) { + /* + * Failfast using offset size, then by iterating the widget tree + */ + boolean notZeroSized = widget.getOffsetHeight() > 0 + || widget.getOffsetWidth() > 0; + return notZeroSized || checkVisibilityRecursively(widget); + } else { + return false; + } + } + + private static boolean checkVisibilityRecursively(Widget widget) { + if (widget.isVisible()) { + Widget parent = widget.getParent(); + if (parent == null) { + return true; // root panel + } else { + return checkVisibilityRecursively(parent); + } + } else { + return false; + } + } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTextField.java b/src/com/vaadin/terminal/gwt/client/ui/VTextField.java index e275d7a9ac..3df2e356d1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VTextField.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VTextField.java @@ -24,6 +24,7 @@ import com.vaadin.terminal.gwt.client.EventId; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; +import com.vaadin.terminal.gwt.client.VConsole; import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.BeforeShortcutActionListener; @@ -419,14 +420,15 @@ public class VTextField extends TextBoxBase implements Paintable, Field, * @return true iff the value was updated */ protected boolean updateCursorPosition() { - int cursorPos = getCursorPos(); - if (lastCursorPos != cursorPos) { - client.updateVariable(id, VAR_CURSOR, cursorPos, false); - lastCursorPos = cursorPos; - return true; - } else { - return false; + if (Util.isAttachedAndDisplayed(this)) { + int cursorPos = getCursorPos(); + if (lastCursorPos != cursorPos) { + client.updateVariable(id, VAR_CURSOR, cursorPos, false); + lastCursorPos = cursorPos; + return true; + } } + return false; } private static VTextField focusedTextField; -- cgit v1.2.3