From 0d92946de9642605d9e05c2d66e1af279ed269ed Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 9 Mar 2011 18:02:14 +0000 Subject: [PATCH] moving back WidgetsUtils, new class GqUi to access protected methods of ui package. Detach widgets when removing elements --- .../com/google/gwt/query/client/GQuery.java | 30 ++++++++++++++----- .../gwt/query/client/plugins/Widgets.java | 2 +- .../client/plugins/events/EventsListener.java | 8 +++-- .../plugins/widgets/ButtonWidgetFactory.java | 1 - .../plugins/widgets/DateBoxWidgetFactory.java | 1 - .../widgets/DisclosurePanelWidgetFactory.java | 1 - .../plugins/widgets/ListBoxWidgetFactory.java | 1 - .../widgets/PasswordTextBoxWidgetFactory.java | 1 - .../widgets/RichTextWidgetFactory.java | 1 - .../widgets/SuggestBoxWidgetFactory.java | 1 - .../widgets/TabPanelWidgetFactory.java | 1 - .../plugins/widgets/TextBoxWidgetFactory.java | 1 - .../client/plugins/widgets}/WidgetsUtils.java | 18 ++++------- .../com/google/gwt/user/client/ui/GqUi.java | 24 +++++++++++++++ .../gwt/query/client/GQueryCoreTest.java | 18 +++++++++++ 15 files changed, 76 insertions(+), 33 deletions(-) rename gwtquery-core/src/main/java/com/google/gwt/{user/client/ui => query/client/plugins/widgets}/WidgetsUtils.java (87%) create mode 100644 gwtquery-core/src/main/java/com/google/gwt/user/client/ui/GqUi.java 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 0b516b22..86623df4 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 @@ -47,10 +47,12 @@ import com.google.gwt.query.client.js.JsNodeArray; import com.google.gwt.query.client.js.JsUtils; import com.google.gwt.query.client.plugins.Plugin; import com.google.gwt.query.client.plugins.events.EventsListener; +import com.google.gwt.query.client.plugins.widgets.WidgetsUtils; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.GqUi; import com.google.gwt.user.client.ui.Widget; import java.util.ArrayList; @@ -1061,14 +1063,22 @@ public class GQuery implements Lazy { * whenever you create a new iframe and you want to add dynamic content to it. */ public GQuery empty() { - // TODO: add memory leak cleanup, remove event handlers, and - // data caches + // TODO: add memory leak cleanup, remove event handlers for (Element e : elements()) { if (e.getNodeType() == Element.DOCUMENT_NODE) { emptyDocument(e. cast()); } else { - while (e.getFirstChild() != null) { - e.removeChild(e.getFirstChild()); + Node c = e.getFirstChild(); + while (c != null) { + $(c).unbind(0); + removeData(c.cast(), null); + Widget w = getAssociatedWidget(e); + if (w != null) { + w.removeFromParent(); + } else { + e.removeChild(c); + c = e.getFirstChild(); + } } } } @@ -1957,9 +1967,12 @@ public class GQuery implements Lazy { */ public GQuery remove() { for (Element e : elements()) { - // TODO: cleanup event bindings + $(e).unbind(0); removeData(e, null); - if (e.getParentNode() != null) { + Widget w = getAssociatedWidget(e); + if (w != null && w.isAttached()) { + w.removeFromParent(); + } else if (e.getParentNode() != null) { e.getParentNode().removeChild(e); } } @@ -2834,8 +2847,10 @@ public class GQuery implements Lazy { // e.getOwnerDocument(); if (e.getNodeType() == Node.DOCUMENT_NODE) { e = e. cast().getBody(); - } + } for (int j = 0; j < g.size(); j++) { + Widget w = getAssociatedWidget(g.get(j)); + GqUi.detachWidget(w); Node n = g.get(j); if (g.size() > 1) { n = n.cloneNode(true); @@ -2855,6 +2870,7 @@ public class GQuery implements Lazy { newNodes.addNode(e.getParentNode().insertBefore(n, e)); break; } + GqUi.attachWidget(w); } } if (newNodes.size() > g.size()) { diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/Widgets.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/Widgets.java index 3df324dc..b32fc82c 100755 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/Widgets.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/Widgets.java @@ -23,6 +23,7 @@ import com.google.gwt.query.client.GQuery; import com.google.gwt.query.client.plugins.widgets.ButtonWidgetFactory; import com.google.gwt.query.client.plugins.widgets.DateBoxWidgetFactory; import com.google.gwt.query.client.plugins.widgets.DisclosurePanelWidgetFactory; +import com.google.gwt.query.client.plugins.widgets.WidgetsUtils; import com.google.gwt.query.client.plugins.widgets.DisclosurePanelWidgetFactory.DisclosurePanelOptions; import com.google.gwt.query.client.plugins.widgets.ListBoxWidgetFactory; import com.google.gwt.query.client.plugins.widgets.ListBoxWidgetFactory.ListBoxOptions; @@ -43,7 +44,6 @@ import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; -import com.google.gwt.user.client.ui.WidgetsUtils; import com.google.gwt.user.datepicker.client.DateBox; /** diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/events/EventsListener.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/events/EventsListener.java index cf4f2e5d..69efd260 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/events/EventsListener.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/events/EventsListener.java @@ -223,10 +223,12 @@ public class EventsListener implements EventListener { .createArray().cast(); for (int i = 0; i < elementEvents.length(); i++) { BindFunction listener = elementEvents.get(i); - - if (!listener.hasEventType(eventbits) || (namespace != null && namespace.length() != 0 && !listener.nameSpace.equals(namespace))) { - newList.add(listener); + boolean matchNS = namespace == null || namespace.isEmpty() || listener.nameSpace.equals(namespace); + boolean matchEV = eventbits <= 0 || listener.hasEventType(eventbits); + if (matchNS && matchEV) { + continue; } + newList.add(listener); } elementEvents = newList; } diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/ButtonWidgetFactory.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/ButtonWidgetFactory.java index 93cc7755..31b1a7a7 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/ButtonWidgetFactory.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/ButtonWidgetFactory.java @@ -2,7 +2,6 @@ package com.google.gwt.query.client.plugins.widgets; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.WidgetsUtils; /** * Factory used to create a {@link Button} widget. A {@link Button} is created diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/DateBoxWidgetFactory.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/DateBoxWidgetFactory.java index 829cbe8a..b92130c7 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/DateBoxWidgetFactory.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/DateBoxWidgetFactory.java @@ -7,7 +7,6 @@ import java.util.Date; import com.google.gwt.dom.client.Element; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.query.client.GQuery; -import com.google.gwt.user.client.ui.WidgetsUtils; import com.google.gwt.user.datepicker.client.DateBox; import com.google.gwt.user.datepicker.client.DateBox.DefaultFormat; diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/DisclosurePanelWidgetFactory.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/DisclosurePanelWidgetFactory.java index a272ffdc..3de90040 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/DisclosurePanelWidgetFactory.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/DisclosurePanelWidgetFactory.java @@ -7,7 +7,6 @@ import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.DisclosurePanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.WidgetsUtils; public class DisclosurePanelWidgetFactory implements WidgetFactory { diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/ListBoxWidgetFactory.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/ListBoxWidgetFactory.java index f5b8ad0d..36982903 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/ListBoxWidgetFactory.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/ListBoxWidgetFactory.java @@ -7,7 +7,6 @@ import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.SelectElement; import com.google.gwt.query.client.GQuery; import com.google.gwt.user.client.ui.ListBox; -import com.google.gwt.user.client.ui.WidgetsUtils; /** * Factory used to create a {@link ListBox} widget. diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/PasswordTextBoxWidgetFactory.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/PasswordTextBoxWidgetFactory.java index 9d6c0fb7..6e988b4d 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/PasswordTextBoxWidgetFactory.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/PasswordTextBoxWidgetFactory.java @@ -5,7 +5,6 @@ import static com.google.gwt.query.client.GQuery.$; import com.google.gwt.dom.client.Element; import com.google.gwt.query.client.GQuery; import com.google.gwt.user.client.ui.PasswordTextBox; -import com.google.gwt.user.client.ui.WidgetsUtils; /** * Factory used to create a {@link PasswordTextBox} widget. A diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/RichTextWidgetFactory.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/RichTextWidgetFactory.java index b5c5e46c..59ec23d1 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/RichTextWidgetFactory.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/RichTextWidgetFactory.java @@ -5,7 +5,6 @@ import static com.google.gwt.query.client.GQuery.$; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.RichTextArea; -import com.google.gwt.user.client.ui.WidgetsUtils; /** * Factory used to create a {@link RichTextArea} widget. diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/SuggestBoxWidgetFactory.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/SuggestBoxWidgetFactory.java index 9b85dae3..77b3f391 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/SuggestBoxWidgetFactory.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/SuggestBoxWidgetFactory.java @@ -9,7 +9,6 @@ import com.google.gwt.query.client.GQuery; import com.google.gwt.user.client.ui.MultiWordSuggestOracle; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestOracle; -import com.google.gwt.user.client.ui.WidgetsUtils; /** * Factory used to create a {@link SuggestBox} widget. diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/TabPanelWidgetFactory.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/TabPanelWidgetFactory.java index 1de9c94f..8143b685 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/TabPanelWidgetFactory.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/TabPanelWidgetFactory.java @@ -8,7 +8,6 @@ import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.Widget; -import com.google.gwt.user.client.ui.WidgetsUtils; /** * Factory used to create a {@link Button} widget. A {@link Button} is created diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/TextBoxWidgetFactory.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/TextBoxWidgetFactory.java index fe389da2..22de997e 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/TextBoxWidgetFactory.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/TextBoxWidgetFactory.java @@ -5,7 +5,6 @@ import static com.google.gwt.query.client.GQuery.$; import com.google.gwt.dom.client.Element; import com.google.gwt.query.client.GQuery; import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.WidgetsUtils; /** * Factory used to create a {@link TextBox} widget. A {@link TextBox} is created diff --git a/gwtquery-core/src/main/java/com/google/gwt/user/client/ui/WidgetsUtils.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/WidgetsUtils.java similarity index 87% rename from gwtquery-core/src/main/java/com/google/gwt/user/client/ui/WidgetsUtils.java rename to gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/WidgetsUtils.java index 445bdc8b..cd73f6a0 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/user/client/ui/WidgetsUtils.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/widgets/WidgetsUtils.java @@ -1,7 +1,9 @@ -package com.google.gwt.user.client.ui; +package com.google.gwt.query.client.plugins.widgets; import com.google.gwt.dom.client.Element; import com.google.gwt.query.client.GQuery; +import com.google.gwt.user.client.ui.GqUi; +import com.google.gwt.user.client.ui.Widget; public class WidgetsUtils { @@ -60,18 +62,8 @@ public class WidgetsUtils { */ public static void replaceOrAppend(Element e, Widget widget) { assert e != null && widget != null; - - if (widget.isAttached()) { - widget.removeFromParent(); - } - + GqUi.detachWidget(widget); replaceOrAppend(e, widget.getElement()); - - widget.onAttach(); - - if (widget instanceof RichTextArea != true) { - RootPanel.detachOnWindowClose(widget); - } + GqUi.attachWidget(widget); } - } 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 new file mode 100644 index 00000000..15755f83 --- /dev/null +++ b/gwtquery-core/src/main/java/com/google/gwt/user/client/ui/GqUi.java @@ -0,0 +1,24 @@ +package com.google.gwt.user.client.ui; + + +/** + * 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) { + RootPanel.detachOnWindowClose(widget); + } + } + } + + public static void detachWidget(Widget widget){ + if (widget != null) { + if (widget.isAttached()) { + widget.removeFromParent(); + } + } + } +} 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 824abf51..21a278a4 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 @@ -874,6 +874,24 @@ public class GQueryCoreTest extends GWTTestCase { assertEquals(2, $(new Label(""), new TextArea()).size()); } + + public void testGQueryWidgetManipulation() { + + String content = "
"; + $(e).html(content); + Button b = new Button("b"); + RootPanel.get().add(b); + assertTrue(b.isAttached()); + $("button").remove(); + assertFalse(b.isAttached()); + + Button b2 = new Button("b"); + $(e).append($(b2)); + assertTrue(b2.isAttached()); + + $(e).empty(); + + } public void testGQueryMap() { String content = "

"; -- 2.39.5