Repository: wicket Updated Branches: refs/heads/master 46684ffdf -> 8953bd2cb
WICKET-5724 Queueing component in autocomponent Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/8953bd2c Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8953bd2c Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8953bd2c Branch: refs/heads/master Commit: 8953bd2cb91f8b62d4f26395156986b19e161720 Parents: 46684ff Author: adelbene <[email protected]> Authored: Wed Oct 15 12:14:45 2014 +0200 Committer: adelbene <[email protected]> Committed: Wed Oct 15 12:33:32 2014 +0200 ---------------------------------------------------------------------- .../java/org/apache/wicket/MarkupContainer.java | 71 ++++++++++++++------ .../filter/RelativePathPrefixHandler.java | 59 +++------------- 2 files changed, 61 insertions(+), 69 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/8953bd2c/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java index 1ec4f02..4b40921 100644 --- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java +++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java @@ -35,7 +35,6 @@ import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.MarkupType; import org.apache.wicket.markup.WicketTag; import org.apache.wicket.markup.html.border.Border; -import org.apache.wicket.markup.html.internal.InlineEnclosure; import org.apache.wicket.markup.resolver.ComponentResolvers; import org.apache.wicket.model.IComponentInheritedModel; import org.apache.wicket.model.IModel; @@ -262,9 +261,31 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp children_remove(index); } add(component); - + + /** + * https://issues.apache.org/jira/browse/WICKET-5724 + */ + queueChildContainer(component); + return true; } + + /** + * Try to queue a child markup container if the current + * component queue still contain items. + * + * @param component + * The children markup container + */ + private void queueChildContainer(final Component component) + { + if (queue != null && !queue.isEmpty() && + component instanceof MarkupContainer) + { + MarkupContainer childContainer = (MarkupContainer)component; + childContainer.queue(queue); + } + } /** * @param component @@ -1661,24 +1682,8 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp { Component component = (Component)child; component.detach(); - - // We need to keep InlineEnclosures for Ajax request handling. - // TODO this is really ugly. Feature request for 1.5: change auto-component that - // they don't need to be removed anymore. - if (!(component instanceof InlineEnclosure) && component.isAuto()) - { - children_remove(i); - } } } - - if (children instanceof ChildList) - { - ChildList lst = (ChildList)children; - Object[] tmp = new Object[lst.size]; - System.arraycopy(lst.childs, 0, tmp, 0, lst.size); - children = tmp; - } } /** @@ -1986,7 +1991,35 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp queue = new ComponentQueue(); } queue.add(components); - + + return innerQueue(); + } + + /** + * Queues components over the current container and using the given component queue. + * + * @param queue + * the component queue to use. + * @return + */ + protected MarkupContainer queue(ComponentQueue queue) + { + ComponentQueue currentQueue = this.queue; + this.queue = queue; + + MarkupContainer markupContainer = innerQueue(); + this.queue = currentQueue; + + return markupContainer; + } + + /** + * Runs the actual queuing process. + * + * @return + */ + protected MarkupContainer innerQueue() + { MarkupContainer region = null; Page page = null; http://git-wip-us.apache.org/repos/asf/wicket/blob/8953bd2c/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java index 79edb52..5e66d95 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java @@ -17,6 +17,7 @@ package org.apache.wicket.markup.parser.filter; import java.text.ParseException; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; @@ -99,10 +100,9 @@ public final class RelativePathPrefixHandler extends AbstractMarkupFilter /** * https://issues.apache.org/jira/browse/WICKET-5724 * - * Says if we are inside an head tag or wicket:head tag. - * + * Unique index to generate new tag ids. * */ - private boolean insideHead; + private final AtomicInteger componentIndex = new AtomicInteger(); /** * Constructor for the IComponentResolver role. @@ -128,21 +128,9 @@ public final class RelativePathPrefixHandler extends AbstractMarkupFilter { if (tag.isClose()) { - if (isHeadTag(tag)) - { - //outside head tag - insideHead = false; - } - return tag; } - if (isHeadTag(tag)) - { - //inside head tag - insideHead = true; - } - String wicketIdAttr = getWicketNamespace() + ":" + "id"; // Don't touch any wicket:id component and any auto-components @@ -162,60 +150,31 @@ public final class RelativePathPrefixHandler extends AbstractMarkupFilter { if (tag.getId() == null) { - tag.setId(getWicketRelativePathPrefix(null)); + tag.setId(getWicketRelativePathPrefix(null) + + componentIndex.getAndIncrement()); tag.setAutoComponentTag(true); - - /** - * https://issues.apache.org/jira/browse/WICKET-5724 - * Transparent component inside page body must allow - * queued children components. - */ - if(!insideHead) - { - tag.setAutoComponentFactory(new ComponentTag.IAutoComponentFactory() - { - @Override - public Component newComponent(MarkupContainer container, ComponentTag tag) - { - String id = tag.getId() + container.getPage().getAutoIndex(); - tag.setId(id); - - return new TransparentWebMarkupContainer(id); - } - }); - } } + tag.addBehavior(RELATIVE_PATH_BEHAVIOR); tag.setModified(true); + break; } } return tag; } - - private boolean isHeadTag(ComponentTag tag) - { - if (HtmlHeaderSectionHandler.HEAD.equalsIgnoreCase(tag.getName())) - { - return true; - } - return false; - } - @Override public Component resolve(final MarkupContainer container, final MarkupStream markupStream, final ComponentTag tag) { - if ((tag != null) && (tag.getId().equals(getWicketRelativePathPrefix(markupStream)))) + if ((tag != null) && (tag.getId().startsWith(getWicketRelativePathPrefix(markupStream)))) { - String id = tag.getId() + container.getPage().getAutoIndex(); - // we do not want to mess with the hierarchy, so the container has to be // transparent as it may have wicket components inside. for example a raw anchor tag // that contains a label. - return new TransparentWebMarkupContainer(id); + return new TransparentWebMarkupContainer(tag.getId()); } return null; }
