WICKET-3335 nested borders working. everything should be working. needs more cleanup and javadoc
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/2e57d8db Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/2e57d8db Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/2e57d8db Branch: refs/heads/master Commit: 2e57d8db33b88889413f1396dbd4389904cf7e7f Parents: b9ddb88 Author: Igor Vaynberg <igor.vaynb...@gmail.com> Authored: Sat Feb 15 00:40:48 2014 -0800 Committer: Igor Vaynberg <igor.vaynb...@gmail.com> Committed: Thu Feb 20 23:37:15 2014 -0800 ---------------------------------------------------------------------- .../java/org/apache/wicket/DequeueContext.java | 5 +- .../java/org/apache/wicket/MarkupContainer.java | 11 +- .../wicket/markup/html/border/Border.java | 102 ++++++++++++++++++- .../wicket/queueing/ComponentQueueingTest.java | 24 ++--- .../org/apache/wicket/queueing/HasPath.java | 7 +- .../queueing/nestedborders/OuterBorder.html | 2 +- 6 files changed, 128 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/2e57d8db/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java b/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java index 8324161..4e62c3e 100644 --- a/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java +++ b/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java @@ -1,13 +1,14 @@ package org.apache.wicket; import org.apache.wicket.markup.ComponentTag; +import org.apache.wicket.markup.IMarkupFragment; import org.apache.wicket.markup.Markup; import org.apache.wicket.markup.MarkupElement; import org.apache.wicket.util.collections.ArrayListStack; public class DequeueContext { - private final Markup markup; + private final IMarkupFragment markup; private int index; private ComponentTag next; private ArrayListStack<ComponentTag> tags = new ArrayListStack<>(); @@ -37,7 +38,7 @@ public class DequeueContext } } - public DequeueContext(Markup markup, MarkupContainer root) + public DequeueContext(IMarkupFragment markup, MarkupContainer root) { this.markup = markup; containers.push(root); http://git-wip-us.apache.org/repos/asf/wicket/blob/2e57d8db/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 72f7cc9..e213f35 100644 --- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java +++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java @@ -2080,7 +2080,7 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp private void internalDequeue() { - Markup markup = getAssociatedMarkup(); + IMarkupFragment markup = getDequeueMarkup(); if (markup == null) { // markup not found, skip dequeuing @@ -2121,7 +2121,7 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp if (child != null) { - add(child); + addDequeuedComponent(child, tag); if (child instanceof IQueueRegion) { ((MarkupContainer)child).dequeue(); @@ -2159,6 +2159,11 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp } } + + protected IMarkupFragment getDequeueMarkup() { + return getAssociatedMarkup(); + } + protected boolean supportsDequeueingFrom(ComponentTag tag) { if (tag instanceof WicketTag) { WicketTag wicketTag=(WicketTag)tag; @@ -2172,7 +2177,7 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp return true; } - protected Component findComponentToDequeue(ComponentTag tag) + public Component findComponentToDequeue(ComponentTag tag) { return queue == null ? null : queue.remove(tag.getId()); } http://git-wip-us.apache.org/repos/asf/wicket/blob/2e57d8db/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java index 3c5b0d7..54fa141 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java @@ -26,6 +26,7 @@ import org.apache.wicket.markup.MarkupException; import org.apache.wicket.markup.MarkupFragment; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.TagUtils; +import org.apache.wicket.markup.WicketTag; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.BorderMarkupSourcingStrategy; import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy; @@ -162,7 +163,7 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes super(id, model); body = new BorderBodyContainer(id + "_" + BODY); - addToBorder(body); + queueToBorder(body); } /** @@ -398,7 +399,7 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes /** * The container to be associated with the <wicket:body> tag */ - public class BorderBodyContainer extends WebMarkupContainer + public class BorderBodyContainer extends WebMarkupContainer implements IQueueRegion { private static final long serialVersionUID = 1L; @@ -535,5 +536,102 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes return markup.find(child.getId()); } + + protected IMarkupFragment getDequeueMarkup() { + Border border=findParent(Border.class); + IMarkupFragment fragment=findParent(Border.class).getMarkup(); + /* + * we want to get the contents of the border here (the markup that + * is represented by the body tag) to do this we need to strip the + * tag that the border is attached to (usually the first tag) + */ + + int i=0; + while (i<fragment.size()) { + MarkupElement element=fragment.get(i); + if (element instanceof ComponentTag&&((ComponentTag)element).getId().equals(border.getId()) ){ + break; + } + i++; + } + + if (i>=fragment.size()) { + throw new IllegalStateException("Could not find starting border tag for border: "+border.getId()+" in markup: "+fragment); + } + + + /* + * (i) is now at the border tag, find the next component tag which + */ + + i++; + while (i<fragment.size()) { + MarkupElement element = fragment.get(i); + if (element instanceof ComponentTag) { + break; + } + i++; + } + + ComponentTag tag=(ComponentTag) fragment.get(i); + if (tag.isClose()) { + // this closes the border tag, border only has raw markup + return null; + } + + return new MarkupFragment(fragment, i); + + + } + + @Override + public Component findComponentToDequeue(ComponentTag tag) { + /* the body container is allowed to search for queued components + * all the way to the page even though it is an IQueueRegion so it can + * find components queueud below the border + */ + + Component component=super.findComponentToDequeue(tag); + if (component!=null) { + return component; + } + + MarkupContainer cursor=getParent(); + while (cursor!=null) { + component=cursor.findComponentToDequeue(tag); + if (component!=null) { + return component; + } + if (cursor instanceof BorderBodyContainer) { + // optimization - find call above wouldve already recursed to page + break; + } + cursor=cursor.getParent(); + } + return null; + } + } + + + @Override + protected boolean supportsDequeueingFrom(ComponentTag tag) { + if ((tag instanceof WicketTag)&&((WicketTag)tag).isBodyTag()) { + return true; + } + + return super.supportsDequeueingFrom(tag); + } + + @Override + public Component findComponentToDequeue(ComponentTag tag) { + if ((tag instanceof WicketTag)&&((WicketTag)tag).isBodyTag()) { + return getBodyContainer(); + } + return super.findComponentToDequeue(tag); + } + + @Override + protected void addDequeuedComponent(Component component, ComponentTag tag) { + addToBorder(component); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/2e57d8db/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java b/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java index 751462e..e716329 100644 --- a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java @@ -584,22 +584,21 @@ public class ComponentQueueingTest extends WicketTestCase MarkupContainer a = new A(), b = new B(), r = new R(), s = new S(); TestBorder border = new TestBorder("border"); - border.setBorderMarkup("<wicket:border><p wicket:id='r'><p wicket:id='s'>" + - "<wicket:body/></p></p></wicket:border>"); + border.setBorderMarkup("<wicket:border><b1 wicket:id='r'><b2 wicket:id='s'>" + + "<wicket:body/></b2></b1></wicket:border>"); border.queueToBorder(r, s); TestPage p = new TestPage(); - p.setPageMarkup("<p wicket:id='a'><p wicket:id='border'><p wicket:id='b'></p></p></p>"); + p.setPageMarkup("<out1 wicket:id='a'><p wicket:id='border'><in1 wicket:id='b'></in1></p></out1>"); p.queue(a, border, b); tester.startPage(p); - assertThat(p, hasPath(new Path(a, border, r, s))); - assertThat(p, hasPath(new Path(a, border, border.getBodyContainer(), b))); + assertThat(p, hasPath(new Path(a, border, r, s, border.getBodyContainer(), b))); } - @Ignore + @Test public void dequeueWithNestedBorders() { @@ -613,19 +612,18 @@ public class ComponentQueueingTest extends WicketTestCase innerBorder.queueToBorder(c, d); - // TODO WICKET-3335 Where to queue 's' to make it work ?! - outerBorder.queue(s); + outerBorder.queueToBorder(s); + TestPage p = new TestPage(); p.setPageMarkup("<p wicket:id='a'><p wicket:id='outerBorder'><p wicket:id='b'></p></p></p>"); - + p.queue(b, outerBorder, a); tester.startPage(p); - - assertThat(p, hasPath(new Path(a, outerBorder, outerBorder.getBodyContainer(), b))); - assertThat(p, hasPath(new Path(a, outerBorder, r, innerBorder, c, d))); - assertThat(p, hasPath(new Path(a, outerBorder, r, innerBorder, innerBorder.getBodyContainer(), s))); + + assertThat(p, hasPath(new Path(a, outerBorder, r, innerBorder, c, d, innerBorder.getBodyContainer(), s))); + assertThat(p, hasPath(new Path(a, outerBorder, r, outerBorder.getBodyContainer(), b))); } private static class A extends WebMarkupContainer http://git-wip-us.apache.org/repos/asf/wicket/blob/2e57d8db/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java b/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java index 3095095..3613f1f 100644 --- a/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java +++ b/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java @@ -48,11 +48,14 @@ class HasPath extends TypeSafeMatcher<Component> return false; } - cursor = ((MarkupContainer)cursor).get(path.get(i).getId()); - if (cursor == null) + String id = path.get(i).getId(); + Component child = ((MarkupContainer)cursor).get(id); + if (child== null) { return false; } + + cursor=child; if (!path.get(i).getType().isAssignableFrom(cursor.getClass())) { return false; http://git-wip-us.apache.org/repos/asf/wicket/blob/2e57d8db/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html b/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html index cbe392d..4986b1d 100644 --- a/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html +++ b/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html @@ -3,7 +3,7 @@ <wicket:border> <p wicket:id="r"> <p wicket:id="innerBorder"> - <p wicket="s"></p> + <p wicket:id="s"></p> </p> <wicket:body/> </p>