Repository: wicket Updated Branches: refs/heads/WICKET-5265 [created] 9c60d34e3
re-create fence mark after remove and re-add Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/9c60d34e Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/9c60d34e Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/9c60d34e Branch: refs/heads/WICKET-5265 Commit: 9c60d34e3b5e7e0c1702e7fd504dbeac8749959a Parents: 70b7327 Author: Carl-Eric Menzel <[email protected]> Authored: Mon Aug 18 11:50:15 2014 +0200 Committer: Carl-Eric Menzel <[email protected]> Committed: Mon Aug 18 11:50:15 2014 +0200 ---------------------------------------------------------------------- .../wicket/feedback/FencedFeedbackPanel.java | 70 ++++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/9c60d34e/wicket-core/src/main/java/org/apache/wicket/feedback/FencedFeedbackPanel.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/feedback/FencedFeedbackPanel.java b/wicket-core/src/main/java/org/apache/wicket/feedback/FencedFeedbackPanel.java index f7df59e..042a8e7 100644 --- a/wicket-core/src/main/java/org/apache/wicket/feedback/FencedFeedbackPanel.java +++ b/wicket-core/src/main/java/org/apache/wicket/feedback/FencedFeedbackPanel.java @@ -29,13 +29,13 @@ import org.apache.wicket.markup.html.panel.FeedbackPanel; * the nesting of these panels to work correctly without displaying the same feedback message twice. * A constructor that does not takes a fencing component creates a catch-all panel that shows * messages that do not come from inside any fence or from the {@link Session}. - * + * <p/> * <h2>IN DEPTH EXPLANATION</h2> * <p> * It is often very useful to have feedback panels that show feedback that comes from inside a * certain container only. For example given a page with the following structure: * </p> - * + * <p/> * <pre> * Page * Form1 @@ -72,7 +72,7 @@ import org.apache.wicket.markup.html.panel.FeedbackPanel; * fencing component. There is usually one instance of such a panel at the top of the page to * display notifications of success. * </p> - * + * * @author igor */ public class FencedFeedbackPanel extends FeedbackPanel @@ -89,7 +89,7 @@ public class FencedFeedbackPanel extends FeedbackPanel /** * Creates a catch-all feedback panel that will show messages not coming from any fence, * including messages coming from {@link Session} - * + * * @param id */ public FencedFeedbackPanel(String id) @@ -100,7 +100,7 @@ public class FencedFeedbackPanel extends FeedbackPanel /** * Creates a feedback panel that will only show messages if they original from, or inside of, * the {@code fence} component and not from any inner fence. - * + * * @param id * @param fence */ @@ -111,11 +111,10 @@ public class FencedFeedbackPanel extends FeedbackPanel /** * Creates a catch-all instance with a filter. - * - * @see #FencedFeedbackPanel(String) - * + * * @param id * @param filter + * @see #FencedFeedbackPanel(String) */ public FencedFeedbackPanel(String id, IFeedbackMessageFilter filter) { @@ -124,12 +123,11 @@ public class FencedFeedbackPanel extends FeedbackPanel /** * Creates a fenced feedback panel with a filter. - * - * @see #FencedFeedbackPanel(String, Component) - * + * * @param id * @param fence * @param filter + * @see #FencedFeedbackPanel(String, Component) */ public FencedFeedbackPanel(String id, Component fence, IFeedbackMessageFilter filter) { @@ -137,12 +135,17 @@ public class FencedFeedbackPanel extends FeedbackPanel this.fence = fence; if (fence != null) { - Integer count = fence.getMetaData(FENCE_KEY); - count = count == null ? 1 : count + 1; - fence.setMetaData(FENCE_KEY, count); + incrementFenceCount(); } } + private void incrementFenceCount() + { + Integer count = fence.getMetaData(FENCE_KEY); + count = count == null ? 1 : count + 1; + fence.setMetaData(FENCE_KEY, count); + } + @Override protected void onRemove() { @@ -151,12 +154,17 @@ public class FencedFeedbackPanel extends FeedbackPanel { // decrement the fence count - Integer count = fence.getMetaData(FENCE_KEY); - count = (count == null || count == 1) ? null : count - 1; - fence.setMetaData(FENCE_KEY, count); + decrementFenceCount(); } } + private void decrementFenceCount() + { + Integer count = fence.getMetaData(FENCE_KEY); + count = (count == null || count == 1) ? null : count - 1; + fence.setMetaData(FENCE_KEY, count); + } + @Override protected FeedbackMessagesModel newFeedbackMessagesModel() { @@ -166,7 +174,7 @@ public class FencedFeedbackPanel extends FeedbackPanel @Override protected List<FeedbackMessage> collectMessages(Component panel, - IFeedbackMessageFilter filter) + IFeedbackMessageFilter filter) { if (fence == null) { @@ -177,7 +185,7 @@ public class FencedFeedbackPanel extends FeedbackPanel @Override protected boolean shouldRecurseInto(Component component) { - return component.getMetaData(FENCE_KEY) == null; + return !componentIsMarkedAsFence(component); } }.collect(filter); } @@ -191,12 +199,32 @@ public class FencedFeedbackPanel extends FeedbackPanel protected boolean shouldRecurseInto(Component component) { // only recurse into components that are not fences - - return component.getMetaData(FENCE_KEY) == null; + return !componentIsMarkedAsFence(component); } }.setIncludeSession(false).collect(filter); } } }; } + + private boolean componentIsMarkedAsFence(Component component) + { + return component.getMetaData(FENCE_KEY) != null; + } + + @Override + protected void onAddToPage() + { + if (this.fence != null) + { + // The fence mark is removed when the feedback panel is removed from the hierarchy. + // We can't see when it is re-added, so we check before rendering whether the + // fence mark is actually set on our fence component. If not, we recreate it. + if (!componentIsMarkedAsFence(this.fence)) + { + incrementFenceCount(); + } + } + super.onAddToPage(); + } }
