Author: jdonnerstag
Date: Tue Oct 20 08:19:17 2009
New Revision: 826993

URL: http://svn.apache.org/viewvc?rev=826993&view=rev
Log:
simplified Enclosure

Modified:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java?rev=826993&r1=826992&r2=826993&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
 Tue Oct 20 08:19:17 2009
@@ -16,18 +16,17 @@
  */
 package org.apache.wicket.markup.html.internal;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.Response;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupException;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.parser.filter.EnclosureHandler;
-import org.apache.wicket.markup.resolver.ComponentResolvers;
+import org.apache.wicket.response.NullResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -83,8 +82,6 @@
        /** Id of the child component that will control visibility of the 
enclosure */
        private final CharSequence childId;
 
-       private transient Map<Component, Boolean> changes;
-
        /**
         * Construct.
         * 
@@ -105,7 +102,6 @@
        }
 
        /**
-        * 
         * @see org.apache.wicket.MarkupContainer#isTransparentResolver()
         */
        @Override
@@ -143,72 +139,40 @@
        }
 
        /**
-        * 
         * @see 
org.apache.wicket.MarkupContainer#onComponentTagBody(org.apache.wicket.markup.MarkupStream,
         *      org.apache.wicket.markup.ComponentTag)
         */
        @Override
-       protected void onComponentTagBody(final MarkupStream markupStream, 
ComponentTag enclosureOpenTag)
+       protected void onComponentTagBody(MarkupStream markupStream, 
ComponentTag openTag)
        {
-               // init changes map
-               changes = new HashMap<Component, Boolean>();
-
                // enclosure's parent container
-               final MarkupContainer container = getEnclosureParent();
-
-               // iterate over all child tags and make sure all components are 
present, resolving them if
-               // necessary
-               ensureAllChildrenPresent(container, markupStream, 
enclosureOpenTag);
+               MarkupContainer container = getEnclosureParent();
 
                Component controller = container.get(childId.toString());
                checkChildComponent(controller);
 
                // set the enclosure visibility
-               setVisible(controller.determineVisibility());
+               boolean visible = controller.determineVisibility();
 
-               // transfer visibility to direct children
-               applyEnclosureVisibilityToChildren(container, markupStream, 
enclosureOpenTag);
-
-               // render components inside the enclosure if its visible or 
skip it if it is not
-               if (isVisible() == true)
+               if (visible)
                {
-                       super.onComponentTagBody(markupStream, 
enclosureOpenTag);
+                       super.onComponentTagBody(markupStream, openTag);
                }
                else
                {
-                       markupStream.skipToMatchingCloseTag(enclosureOpenTag);
-               }
-       }
-
-       /**
-        * 
-        * @param container
-        * @param markupStream
-        * @param enclosureOpenTag
-        */
-       private void applyEnclosureVisibilityToChildren(final MarkupContainer 
container,
-               final MarkupStream markupStream, final ComponentTag 
enclosureOpenTag)
-       {
-               DirectChildTagIterator it = new 
DirectChildTagIterator(markupStream, enclosureOpenTag);
-               while (it.hasNext())
-               {
-                       final ComponentTag tag = it.next();
-                       if (tag.isAutoComponentTag() == false)
+                       RequestCycle cycle = getRequestCycle();
+                       Response response = cycle.getResponse();
+                       try
                        {
-                               final Component child = 
container.get(tag.getId());
-                               final boolean childVisibility = 
child.isVisibilityAllowed();
+                               cycle.setResponse(NullResponse.getInstance());
 
-                               // we only apply visibility changes to hide a 
component, otherwise it would be
-                               // possible to unhide a component which should 
be hidden
-                               if (!isVisible() && childVisibility)
-                               {
-                                       // record original visiblity allowed 
value, will restore later
-                                       changes.put(child, childVisibility);
-                                       child.setVisibilityAllowed(false);
-                               }
+                               super.onComponentTagBody(markupStream, openTag);
+                       }
+                       finally
+                       {
+                               cycle.setResponse(response);
                        }
                }
-               it.rewind();
        }
 
        /**
@@ -228,87 +192,4 @@
                                "Programming error: childComponent == enclose 
component; endless loop");
                }
        }
-
-       /**
-        * 
-        * @param container
-        * @param markupStream
-        * @param enclosureOpenTag
-        */
-       private void ensureAllChildrenPresent(final MarkupContainer container,
-               final MarkupStream markupStream, ComponentTag enclosureOpenTag)
-       {
-               DirectChildTagIterator it = new 
DirectChildTagIterator(markupStream, enclosureOpenTag);
-               while (it.hasNext())
-               {
-                       final ComponentTag tag = it.next();
-
-                       if (tag.isAutoComponentTag() == false)
-                       {
-                               Component child = container.get(tag.getId());
-                               if (child == null)
-                               {
-                                       // component does not yet exist in the 
container, attempt to resolve it using
-                                       // resolvers
-                                       final int tagIndex = 
it.getCurrentIndex();
-
-                                       // because the resolvers can auto-add 
and therefore immediately render the
-                                       // component
-                                       // we have to buffer the output since 
we do not yet know the visibility of the
-                                       // enclosure
-                                       CharSequence buffer = new 
ResponseBufferZone(getRequestCycle(), markupStream)
-                                       {
-                                               @Override
-                                               protected void 
executeInsideBufferedZone()
-                                               {
-                                                       
markupStream.setCurrentIndex(tagIndex);
-                                                       
ComponentResolvers.resolve(container, markupStream, tag);
-                                               }
-                                       }.execute();
-
-                                       child = container.get(tag.getId());
-                                       checkChildComponent(child);
-
-                                       if (buffer.length() > 0)
-                                       {
-                                               // we have already rendered 
this child component, insert a stub component
-                                               // that
-                                               // will dump the markup during 
the normal render process if the enclosure is
-                                               // visible
-                                               final Component stub = new 
AutoMarkupLabel(child.getId(), buffer);
-                                               container.replace(stub); // ok 
here because we are replacing auto with auto
-                                       }
-                               }
-                       }
-               }
-               it.rewind();
-       }
-
-       /**
-        * @see org.apache.wicket.Component#onDetach()
-        */
-       @Override
-       protected void onDetach()
-       {
-               restoreOriginalChildVisibility();
-               super.onDetach();
-       }
-
-       /**
-        * 
-        */
-       private void restoreOriginalChildVisibility()
-       {
-               if (changes != null)
-               {
-                       MarkupContainer container = getEnclosureParent();
-
-                       // restore original visibility statuses
-                       for (Map.Entry<Component, Boolean> entry : 
changes.entrySet())
-                       {
-                               
entry.getKey().setVisibilityAllowed(entry.getValue());
-                       }
-                       changes = null;
-               }
-       }
 }


Reply via email to