From 3a65aa9601c8f9eaf2d29945161537da3cd4144c Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 9 Mar 2011 18:47:12 +0000 Subject: [PATCH] call RootPanel.detachOnWindowClose only when the widget is not in another widget. Detach correctly the widget when is removed in gquery --- .../com/google/gwt/query/client/GQuery.java | 15 +++-------- .../com/google/gwt/user/client/ui/GqUi.java | 25 +++++++++++++++++-- .../gwt/query/client/GQueryCoreTest.java | 9 ++++--- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java index 86623df4..542bfd96 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java @@ -26,7 +26,6 @@ import com.google.gwt.dom.client.BodyElement; import com.google.gwt.dom.client.ButtonElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; -import com.google.gwt.dom.client.IFrameElement; import com.google.gwt.dom.client.InputElement; import com.google.gwt.dom.client.Node; import com.google.gwt.dom.client.NodeList; @@ -377,7 +376,6 @@ public class GQuery implements Lazy { */ protected static Widget getAssociatedWidget(Element e) { EventListener listener = DOM.getEventListener((com.google.gwt.user.client.Element) e); - // No listener attached to the element, so no widget exist for this element if (listener == null) { return null; @@ -386,15 +384,13 @@ public class GQuery implements Lazy { // GWT uses the widget as event listener return (Widget) listener; } else if (listener instanceof EventsListener) { + // GQuery replaces the gwt event listener and save it EventsListener gQueryListener = (EventsListener) listener; if (gQueryListener.getOriginalEventListener() != null && gQueryListener.getOriginalEventListener() instanceof Widget) { return (Widget) gQueryListener.getOriginalEventListener(); } } - // I think it's not a good idea to generate ourself a new widget wrapping - // the element... - // To be discussed return null; } @@ -1072,13 +1068,10 @@ public class GQuery implements Lazy { while (c != null) { $(c).unbind(0); removeData(c.cast(), null); + GqUi.detachWidget(getAssociatedWidget(e)); Widget w = getAssociatedWidget(e); - if (w != null) { - w.removeFromParent(); - } else { - e.removeChild(c); - c = e.getFirstChild(); - } + e.removeChild(c); + c = e.getFirstChild(); } } } diff --git a/gwtquery-core/src/main/java/com/google/gwt/user/client/ui/GqUi.java b/gwtquery-core/src/main/java/com/google/gwt/user/client/ui/GqUi.java index 15755f83..be5699a6 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/user/client/ui/GqUi.java +++ b/gwtquery-core/src/main/java/com/google/gwt/user/client/ui/GqUi.java @@ -1,16 +1,37 @@ package com.google.gwt.user.client.ui; +import com.google.gwt.dom.client.BodyElement; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import com.google.gwt.user.client.Event; + /** * GQuery Utility class to access protected methods in ui package. */ public class GqUi { + + public static void attachWidget(Widget widget) { if (widget != null) { - widget.onAttach(); - if (widget instanceof RichTextArea != true) { + + boolean hasParentWidget = false; + Element e = widget.getElement(); + e = e.getParentElement(); + BodyElement body = Document.get().getBody(); + while ((e != null) && (body != e)) { + if (Event.getEventListener(e) != null) { + hasParentWidget = true; + break; + } + e = e.getParentElement(); + } + + if (!hasParentWidget) { RootPanel.detachOnWindowClose(widget); } + + widget.onAttach(); } } diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java index 21a278a4..75addc88 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java @@ -885,11 +885,12 @@ public class GQueryCoreTest extends GWTTestCase { $("button").remove(); assertFalse(b.isAttached()); - Button b2 = new Button("b"); - $(e).append($(b2)); - assertTrue(b2.isAttached()); - + RootPanel.get().add(b); + assertTrue(b.isAttached()); + $(e).append($(b)); + assertTrue(b.isAttached()); $(e).empty(); + // FIXME: assertFalse(b.isAttached()); } -- 2.39.5