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 &lt;wicket:body&gt; 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>

Reply via email to