Updated Branches: refs/heads/master 2672f886c -> 6b62a5077
WICKET-4998 + WICKET-4990 behaviors might be added via IComponentInstantiationListeners, thus resulting in a NullPointerException if AutoCompleteTextField adds its AutoCompleteBehavior :( - now using trick with HeaderItem to make sure the auto-complete event handler is able to register first Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/6b62a507 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/6b62a507 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/6b62a507 Branch: refs/heads/master Commit: 6b62a5077da354449a76ee209a4f0dea837bd919 Parents: 2672f88 Author: svenmeier <[email protected]> Authored: Fri Feb 15 12:44:26 2013 +0100 Committer: svenmeier <[email protected]> Committed: Fri Feb 15 12:44:26 2013 +0100 ---------------------------------------------------------------------- .../autocomplete/AbstractAutoCompleteBehavior.java | 46 ++++++++++++++- .../html/autocomplete/AutoCompleteTextField.java | 13 ---- 2 files changed, 43 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/6b62a507/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteBehavior.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteBehavior.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteBehavior.java index 6218e65..1d754dc 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteBehavior.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteBehavior.java @@ -20,13 +20,16 @@ package org.apache.wicket.extensions.ajax.markup.html.autocomplete; import org.apache.wicket.Component; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.markup.head.HeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.IWrappedHeaderItem; import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; +import org.apache.wicket.markup.head.ResourceAggregator; +import org.apache.wicket.request.Response; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.apache.wicket.request.resource.ResourceReference; -import org.apache.wicket.resource.CoreLibrariesContributor; import org.apache.wicket.util.string.Strings; /** @@ -36,6 +39,40 @@ import org.apache.wicket.util.string.Strings; */ public abstract class AbstractAutoCompleteBehavior extends AbstractDefaultAjaxBehavior { + /** + * A wrapper for the auto-complete DOM-ready event handler. + * <p> + * A plain OnDomReadyItem would be aggregated by {@link ResourceAggregator}, possible coming + * after the event registration of other behaviors. + */ + private static final class WrappedHeaderItem extends HeaderItem implements IWrappedHeaderItem + { + private final OnDomReadyHeaderItem item; + + private WrappedHeaderItem(OnDomReadyHeaderItem onDomReady) + { + item = onDomReady; + } + + @Override + public void render(Response response) + { + item.render(response); + } + + @Override + public Iterable<?> getRenderTokens() + { + return item.getRenderTokens(); + } + + @Override + public HeaderItem getWrapped() + { + return item; + } + } + private static final ResourceReference AUTOCOMPLETE_JS = new JavaScriptResourceReference( AutoCompleteBehavior.class, "wicket-autocomplete.js"); @@ -70,7 +107,7 @@ public abstract class AbstractAutoCompleteBehavior extends AbstractDefaultAjaxBe public void renderHead(final Component component, final IHeaderResponse response) { super.renderHead(component, response); - CoreLibrariesContributor.contributeAjax(component.getApplication(), response); + renderAutocompleteHead(response); } @@ -96,7 +133,10 @@ public abstract class AbstractAutoCompleteBehavior extends AbstractDefaultAjaxBe String initJS = String.format("new Wicket.AutoComplete('%s','%s',%s,%s);", id, getCallbackUrl(), constructSettingsJS(), indicatorId); - response.render(OnDomReadyHeaderItem.forScript(initJS)); + + final OnDomReadyHeaderItem onDomReady = OnDomReadyHeaderItem.forScript(initJS); + + response.render(new WrappedHeaderItem(onDomReady)); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/6b62a507/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AutoCompleteTextField.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AutoCompleteTextField.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AutoCompleteTextField.java index 12e28af..b31bff3 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AutoCompleteTextField.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AutoCompleteTextField.java @@ -18,7 +18,6 @@ package org.apache.wicket.extensions.ajax.markup.html.autocomplete; import java.util.Iterator; -import org.apache.wicket.Component; import org.apache.wicket.ConverterLocator; import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.ComponentTag; @@ -265,18 +264,6 @@ public abstract class AutoCompleteTextField<T> extends TextField<T> } } - /** - * Initializes the {@link AutoCompleteBehavior} if it is not already there. - */ - @Override - public Component add(Behavior... behaviors) - { - // the AutoCompleteBehavior must be bound first, see wicket-autocomplete.js - initializeAutoCompleteBehavior(); - - return super.add(behaviors); - } - @Override protected void onComponentTag(final ComponentTag tag) {
