A couple of comments on previous posts
- you can always assign your own wicket:id like <wicket:enclosure
wicket:id="myEnclosure" child="label1">
- yes, <wicket:enclosure> creates an auto component (no java code
necessary) that is auto-added to the container which at that point in
time gets rendered, when during the render process the markup stream
hits the enclosure tag . And it gets automatically removed again which
means you can not have any state with it.

I looked at the patch and have a couple questions

It seems you try to achieve 2 very different things:

a)  "Changing the visibility of a child component in Ajax callback
method will not affect the entire enclosure but just the child
component itself. This is because only the child component is added to
the AjaxRequestTarget."

what is the limitation here? Enclosure checks the childComponent's
visibility before it renders the Enclosure. At the end that's the
whole idea of Enclosure. You never explicity change the Enclosure's
visibility. You always (with and without ajax) change the visibility
of the child component. Do I misunderstand something?

b) you prefer a wicket:enclosure attribute over a wicket:enclosure tag
you prefer <div wicket:enclosure="child:label1"> over
<wicket:enclosure child="label1">
Neither requires any java code. Neither is really longer or shorter
than the other. Neither requires more or less boilerplate. It seems to
me a matter of personal preference. That's up to the community what
you like. We can have either or both. I'm personally more in favour of
the tag, but that's of course only my opinion.

- Juergen


On Tue, Feb 8, 2011 at 7:34 AM, Igor Vaynberg <igor.vaynb...@gmail.com> wrote:
> i will try to look over it in the few coming days and give you some feedback.
>
> -igor
>
> On Mon, Feb 7, 2011 at 3:43 AM, Joo Hama <joonas.hamalai...@gmail.com> wrote:
>> Thanks Igor and Jeremy,
>>
>> I managed to resolve these issues and committed a patch to JIRA:
>>
>> https://issues.apache.org/jira/browse/WICKET-3422
>>
>> It introduces an "inline" Enclosure defined as an attribute of a
>> html tag, and a listener to find the right inline Enclosures at the
>> time of Ajax request handling. It seems to work well with the existing
>> wicket
>> code base, and all tests are green. What do you guys think? Is it suitable
>> material to commit to wicket?
>>
>> - Joonas
>> <https://issues.apache.org/jira/browse/WICKET-3422>
>>
>> On Fri, Jan 21, 2011 at 8:41 PM, Joo Hama <joonas.hamalai...@gmail.com>wrote:
>>
>>>
>>> The EnclosureResolver... container.autoAdd seems to be invoked only in the
>>> parsing
>>> phase of the original request, whereas the onBeforeRender is invoked during
>>> handling
>>> of the AjaxRequest (when the listener is attached to the
>>> AjaxRequestTarget).
>>>
>>> I found out that the Enclosure is not a child of a Page, thus making it
>>> quite elusive
>>> to get hold of in the onBeforeRespond event. I even attempted to
>>> read MarkupStream,
>>> and indeed found the tag there. (source below) However, in order to add it
>>> to the requestTarget, we
>>> need to get hold of the component. I tried to read the path of the tag in
>>> the document
>>> using ComponentTag.getPath(), but it was null. This is where i hit brick
>>> wall.
>>>
>>> Is it possible to get hold of the Enclosure component with only
>>> the WicketTag from the
>>> MarkupStream as reference? If not, i think this approach might not be
>>> viable.
>>>
>>>
>>> // Override of the application class method newAjaxRequestTarget, trying to
>>> find enclosures that have
>>> // the child id of a component
>>> // in the ajaxTarget:
>>> //-----------------------
>>> @Override
>>> public AjaxRequestTarget newAjaxRequestTarget(Page page) {
>>>     AjaxRequestTarget target = super.newAjaxRequestTarget(page);
>>>     target.addListener(new AjaxRequestTarget.IListener() {
>>>
>>>         public void onBeforeRespond(Map<String, Component> map,
>>>  AjaxRequestTarget target) { List<String> ids = new ArrayList<String>();
>>> Page page = null; // first read all the component id:s from the target for
>>> (Component component : map.values()) { page = component.getPage();
>>> ids.add(component.getId()); } // then traverse the markupStream to find
>>> enclosureTags if (page != null) { MarkupStream stream =
>>> page.getMarkupStream(); stream.setCurrentIndex(0); while (stream.hasMore())
>>> { stream.skipRawMarkup(); if (stream.hasMore()) { WicketTag tag = new
>>> WicketTag(stream.getTag()); if (tag.isEnclosureTag()) { // Try to match the
>>> enclosureTag:s child id to the ids in the target String childId =
>>> tag.getAttribute("child"); if (childId != null) { String[] parts =
>>> childId.split(":"); childId = parts[parts.length - 1]; for (String id : ids)
>>> { if (id.equals(childId)) { System.err .println("Found enclosure " +
>>> tag.getId() + " at path:" + tag.getPath() + ", who's child is targeted Id="
>>> + childId); } } } } stream.next(); } } } }
>>> public void onAfterRespond(Map<String, Component> map, IJavascriptResponse
>>> response) { System.err.println("onAfterRespond"); } }); return target; }
>>> //-------------
>>>
>>>
>>> On Fri, Jan 21, 2011 at 3:58 PM, Martin Makundi <
>>> martin.maku...@koodaripalvelut.com> wrote:
>>>
>>>> Hi!
>>>>
>>>> EnclosureResolver....container.autoAdd is invoked at render phase?
>>>> Would it be necessary to hook into a different event (instead of
>>>> onBeforeRender) or could it be pre-sniffed at onBeforeRender?
>>>>
>>>> **
>>>> Martin
>>>>
>>>> 2011/1/21 Joo Hama <joonas.hamalai...@gmail.com>:
>>>> > I tested this idea by adding the code below to my web application
>>>> > object. Problem was though,
>>>> > that when viewing the variables in debugger, the enclosure object didn't
>>>> > seem to be included in
>>>> > the tree of the parent objects. It was as if the enclosure was invisible
>>>> to
>>>> > them. Perhaps because
>>>> > Enclosure is a transparent resolver?
>>>> >
>>>> > object tree in my application:
>>>> >
>>>> > - page
>>>> >  - enclosure
>>>> >     - div (the parent of this was shown to be page, not the enclosure)
>>>> >
>>>> >
>>>> > Code:
>>>> > //-----------------------------
>>>> > @Override public AjaxRequestTarget newAjaxRequestTarget(Page page) {
>>>> > AjaxRequestTarget target = super.newAjaxRequestTarget(page);
>>>> > target.addListener(new AjaxRequestTarget.IListener() { public void
>>>> > onBeforeRespond(Map<String, Component> map, AjaxRequestTarget target) {
>>>> > for(Component component : map.values()) { Enclosure parentEnclosure =
>>>> > component.findParent(Enclosure.class); if (parentEnclosure != null) {
>>>> > Enclosure topParent = new Enclosure("DUMMY", "DUMMY"); while (topParent
>>>> !=
>>>> > null) { topParent = parentEnclosure.findParent(Enclosure.class); if
>>>> > (topParent != null) { parentEnclosure = topParent; } }
>>>> > target.addComponent(parentEnclosure); } } } public void
>>>> > onAfterRespond(Map<String, Component> map, IJavascriptResponse response)
>>>> {}
>>>> > }); return target; };
>>>> > //-----------------------
>>>> >
>>>> >
>>>> > On Fri, Jan 21, 2011 at 3:07 AM, Jeremy Thomerson <
>>>> jer...@wickettraining.com
>>>> >> wrote:
>>>> >
>>>> >> On Thu, Jan 20, 2011 at 1:51 PM, Igor Vaynberg <
>>>> igor.vaynb...@gmail.com
>>>> >> >wrote:
>>>> >>
>>>> >> > interesting idea. i think this would require a bit of a trick.
>>>> >> >
>>>> >> > a) modify enclosure tag handler to accept an attribute instead of a
>>>> tag
>>>> >> > b) modify enclosure tag handler to add a bit of metadata to the
>>>> >> > component marking that it belongs to an enclosure
>>>> >> > c) add a ajaxrequesttarget.listener to the request target that checks
>>>> >> > for this bit of metadata and adds the enclosure container to the ajax
>>>> >> > request target.
>>>> >> >
>>>> >> > not sure how feasible this all is because the enclosure container is
>>>> >> > an auto component. but, you are welcome to tinker around.
>>>> >> >
>>>> >> > -igor
>>>> >>
>>>> >>
>>>> >> I, too, like the idea.  Couldn't it be simpler?  Couldn't he:
>>>> >>
>>>> >> 1: Override newAjaxRequestTarget in WebApplication
>>>> >> 2: When he creates an ART, add a listener to it.
>>>> >> 3: In the listener, in onBeforeRespond, do this:
>>>> >>
>>>> >> for(Component component : map.values()) {
>>>> >>    Enclosure parentEnclosure = component.findParent(Enclosure.class);
>>>> >>    while (parentEnclosure != null) {
>>>> >>        Enclosure topParent =
>>>> parentEnclosure.findParent(Enclosure.class);
>>>> >>        if (topParent != null) {
>>>> >>            parentEnclosure = topParent;
>>>> >>        }
>>>> >>    }
>>>> >>    if (parentEnclosure != null) {
>>>> >>        addComponent(parentEnclosure);
>>>> >>    }
>>>> >> }
>>>> >>
>>>> >>
>>>> >>
>>>> >> --
>>>> >> Jeremy Thomerson
>>>> >> http://wickettraining.com
>>>> >> *Need a CMS for Wicket?  Use Brix! http://brixcms.org*
>>>> >>
>>>> >
>>>>
>>>
>>>
>>
>

Reply via email to