You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2010/01/02 10:12:04 UTC
svn commit: r895151 - in
/wicket/trunk/wicket/src/main/java/org/apache/wicket: Component.java
MarkupContainer.java markup/MarkupStream.java
Author: jdonnerstag
Date: Sat Jan 2 09:12:04 2010
New Revision: 895151
URL: http://svn.apache.org/viewvc?rev=895151&view=rev
Log:
fixed bug to call onMarkupAttached on children added to Pages (or any other Components without parent)
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.java
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java?rev=895151&r1=895150&r2=895151&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java Sat Jan 2 09:12:04 2010
@@ -22,6 +22,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
+import java.util.Stack;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.authorization.Action;
@@ -734,9 +735,9 @@
boolean rtn = getFlag(FLAG_MARKUP_ATTACHED);
if (rtn == false)
{
+ setFlag(FLAG_MARKUP_ATTACHED, true);
onMarkupAttached();
}
- setFlag(FLAG_MARKUP_ATTACHED, true);
return rtn;
}
@@ -753,6 +754,93 @@
// get the markup ID from the markup if available
markupIdFromMarkup = getMarkupIdFromMarkup();
+
+ // move the component to its real parent if necessary
+// moveComponentToItsRealParent();
+ }
+
+ /**
+ * Move the component to its real parent if necessary
+ *
+ * @return true, if it has been moved
+ */
+ private boolean moveComponentToItsRealParent()
+ {
+ MarkupContainer parent = getParent();
+ IMarkupFragment markup = getMarkup();
+ if ((parent != null) && (markup != null))
+ {
+ IMarkupFragment parentMarkup = parent.getMarkup(null);
+ if ((parentMarkup != null) && (markup != parentMarkup))
+ {
+ // The component's markup must be in the same file as its parent
+ if (markup.getMarkupResourceStream() == parentMarkup.getMarkupResourceStream())
+ {
+ MarkupStream stream = new MarkupStream(markup);
+ stream.skipUntil(ComponentTag.class);
+ ComponentTag openTag = stream.getTag();
+ if (openTag != null)
+ {
+ MarkupStream parentStream = new MarkupStream(parentMarkup);
+ if (parentStream.skipUntil(ComponentTag.class))
+ {
+ parentStream.next();
+ }
+
+ Stack<ComponentTag> stack = new Stack<ComponentTag>();
+ while (parentStream.skipUntil(ComponentTag.class))
+ {
+ ComponentTag tag = parentStream.getTag();
+ if (openTag == tag)
+ {
+ if (stack.isEmpty() == false)
+ {
+ // This tag belong to the real parent
+ final ComponentTag lastTag = stack.pop();
+ parent.visitChildren(MarkupContainer.class,
+ new IVisitor<MarkupContainer>()
+ {
+ public Object component(final MarkupContainer component)
+ {
+ IMarkupFragment m = component.getMarkup();
+ MarkupStream ms = new MarkupStream(m);
+ ms.skipUntil(ComponentTag.class);
+ if (ms.hasMore() && (lastTag == ms.getTag()))
+ {
+ component.add(Component.this);
+ return IVisitor.STOP_TRAVERSAL;
+ }
+ return IVisitor.CONTINUE_TRAVERSAL;
+ }
+ });
+ }
+ return false;
+ }
+ if (tag.isOpen())
+ {
+ if (tag.hasNoCloseTag() == false)
+ {
+ stack.push(tag);
+ }
+ }
+ else if (tag.isOpenClose())
+ {
+ // noop
+ }
+ else if (tag.isClose())
+ {
+ if (stack.isEmpty() == false)
+ {
+ stack.pop();
+ }
+ }
+ parentStream.next();
+ }
+ }
+ }
+ }
+ }
+ return false;
}
/**
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java?rev=895151&r1=895150&r2=895151&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java Sat Jan 2 09:12:04 2010
@@ -151,7 +151,13 @@
// Check if the markup is available after the child has been added to the parent
try
{
- if ((getParent() != null) && (child.getMarkup() != null))
+ // If not yet triggered, than do now (e.g. Pages)
+ if (getMarkup() != null)
+ {
+ internalOnMarkupAttached();
+ }
+
+ if (child.getMarkup() != null)
{
child.internalOnMarkupAttached();
@@ -1991,52 +1997,53 @@
{
super.onMarkupAttached();
- // Automatically create components for <wicket:xxx> tag.
+ // createAndAddComponentsForWicketTags();
+ }
+
+ /**
+ * Automatically create components for <wicket:xxx> tag.
+ */
+ private void createAndAddComponentsForWicketTags()
+ {
+ // Markup must be available
IMarkupFragment markup = getMarkup();
if ((markup != null) && (markup.size() > 1))
{
- // Skip the first component tag which already belongs to 'this' container
MarkupStream stream = new MarkupStream(markup);
- for (; stream.hasMore(); stream.next())
+
+ // Skip the first component tag which already belongs to 'this' container
+ if (stream.skipUntil(ComponentTag.class))
{
- MarkupElement elem = stream.get();
- if (elem instanceof ComponentTag)
- {
- stream.next();
- break;
- }
+ stream.next();
}
// Search for <wicket:xxx> in the remaining markup and try to resolve the component
- for (; stream.hasMore(); stream.next())
+ while (stream.skipUntil(ComponentTag.class))
{
- MarkupElement elem = stream.get();
- if (elem instanceof ComponentTag)
+ ComponentTag tag = stream.getTag();
+ if (tag.isOpen() || tag.isOpenClose())
{
- ComponentTag tag = (ComponentTag)elem;
- if (tag.isOpen() || tag.isOpenClose())
+ if (tag instanceof WicketTag)
{
- if (elem instanceof WicketTag)
+ Component component = ComponentResolvers.resolve(this, stream, tag);
+ if ((component != null) && (component.getParent() == null))
{
- Component component = ComponentResolvers.resolve(this, stream, tag);
- if ((component != null) && (component.getParent() == null))
+ if (component.getId().equals(tag.getId()) == false)
{
- if (component.getId().equals(tag.getId()) == false)
- {
- // make sure we are able to get() the component during rendering
- tag.setId(component.getId());
- tag.setModified(true);
- }
- add(component);
+ // make sure we are able to get() the component during rendering
+ tag.setId(component.getId());
+ tag.setModified(true);
}
+ add(component);
}
+ }
- if (tag.isOpen())
- {
- stream.skipToMatchingCloseTag(tag);
- }
+ if (tag.isOpen())
+ {
+ stream.skipToMatchingCloseTag(tag);
}
}
+ stream.next();
}
}
}
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.java?rev=895151&r1=895150&r2=895151&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.java Sat Jan 2 09:12:04 2010
@@ -417,6 +417,26 @@
}
/**
+ * Skip until an element of type 'clazz' is found
+ *
+ * @param clazz
+ * @return true if found
+ */
+ public boolean skipUntil(final Class<? extends MarkupElement> clazz)
+ {
+ while (hasMore())
+ {
+ if (clazz.isInstance(current))
+ {
+ return true;
+ }
+ next();
+ }
+
+ return false;
+ }
+
+ /**
* Skips any markup at the current position until the wicket tag name is found.
*
* @param wicketTagName