On Sat, Feb 19, 2011 at 2:20 PM, Juergen Donnerstag <[email protected]> wrote: > 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.
the problem with the tag is that it is not rendered into the markup so cannot be targetted via ajax. -igor > > - Juergen > > > On Tue, Feb 8, 2011 at 7:34 AM, Igor Vaynberg <[email protected]> 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 <[email protected]> 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 >>> <[email protected]>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 < >>>> [email protected]> 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 <[email protected]>: >>>>> > 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 < >>>>> [email protected] >>>>> >> wrote: >>>>> > >>>>> >> On Thu, Jan 20, 2011 at 1:51 PM, Igor Vaynberg < >>>>> [email protected] >>>>> >> >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* >>>>> >> >>>>> > >>>>> >>>> >>>> >>> >> >
