Repository: wicket
Updated Branches:
  refs/heads/master b0fc628f1 -> 0eb596df3


WICKET-5265 recreate fence mark when removing and readding a fencedfeedbackpanel


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/0eb596df
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/0eb596df
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/0eb596df

Branch: refs/heads/master
Commit: 0eb596df3003006cb3d99988fc2e1f65e16c14cb
Parents: b0fc628
Author: Carl-Eric Menzel <cmen...@wicketbuch.de>
Authored: Mon Sep 29 08:30:41 2014 +0200
Committer: Carl-Eric Menzel <cmen...@apache.org>
Committed: Mon Sep 29 13:04:36 2014 +0200

----------------------------------------------------------------------
 .../wicket/feedback/FencedFeedbackPanel.java    | 67 ++++++++++++++------
 .../html/panel/FencedFeedbackPanelTest.java     | 17 +++++
 2 files changed, 63 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0eb596df/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..42e1344 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,29 @@ 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 onReAdd()
+       {
+               if (this.fence != null)
+               {
+                       // The fence mark is removed when the feedback panel is 
removed from the hierarchy.
+                       // see onRemove().
+                       // when the panel is re-added, we recreate the fence 
mark.
+                       incrementFenceCount();
+               }
+               super.onReAdd();
+       }
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/0eb596df/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/FencedFeedbackPanelTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/FencedFeedbackPanelTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/FencedFeedbackPanelTest.java
index 3f9e7c6..df351cc 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/FencedFeedbackPanelTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/FencedFeedbackPanelTest.java
@@ -171,6 +171,23 @@ public class FencedFeedbackPanelTest
 
        }
 
+       @Test
+       public void reAdding()
+       {
+               TestPage page = scope.getTester().startPage(TestPage.class);
+               MarkupContainer container = page.containerFeedback.getParent();
+
+               page.containerFeedback.remove();
+               page.containerFeedback2.remove();
+
+               container.add(page.containerFeedback);
+               page.containerInput.error("error");
+
+               assertTrue(page.containerFeedback.anyMessage());
+               assertFalse(page.formFeedback.anyMessage());
+       }
+
+
        public static class TestPage extends WebPage implements 
IMarkupResourceStreamProvider
        {
                FencedFeedbackPanel externalFeedback, formFeedback, 
containerFeedback, containerFeedback2;

Reply via email to