On Sat, Feb 15, 2014 at 9:40 AM, <[email protected]> wrote:

> 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/384d748c
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/384d748c
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/384d748c
>
> Branch: refs/heads/sandbox/component-queueing-2
> Commit: 384d748c150031fa584aa44fce2f0a7e05e98531
> Parents: 14797ed
> Author: Igor Vaynberg <[email protected]>
> Authored: Sat Feb 15 00:40:48 2014 -0800
> Committer: Igor Vaynberg <[email protected]>
> Committed: Sat Feb 15 00:40:48 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/384d748c/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/384d748c/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/384d748c/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);
>

why it is necessary to use queueing for the border body ?
it makes me think that something got broken in the default ( add(child) )
functionality and maybe user applications that don't want to use queueing
will be required to


>         }
>
>         /**
> @@ -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/384d748c/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/384d748c/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/384d748c/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