You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2014/02/21 08:37:39 UTC

[14/31] git commit: WICKET-3335 nested borders working. everything should be working. needs more cleanup and javadoc

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 <ig...@gmail.com>
Authored: Sat Feb 15 00:40:48 2014 -0800
Committer: Igor Vaynberg <ig...@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>