Thank you  Jason  for your usefull response

I missed it and it helps us to find a better solution than override the
gwt-user.jar  but there is still something wrong.
The wrap() method calls widget.onAttach(); so the wrapped widget is attached
when  created, we can't put it in the used hierarchie of Gwt widget
components : ie you can't call
myHTMLFragment.getChildren().add(w);
because when the parent (myHTMLFragment) will be attached, the recursive
call of the wrappedWidget.onAttach() will failed.
We have to manage the wrapped widgets with our own hierarchy like this :

@Override
    public void add(Widget w) {
        if (w.isAttached()) // wrapped widget
            register(w);
        else
            super.add(w);
    }

    public void register(Widget w) {
        getWrappedChildren().add(w);

    }


    @Override
    protected void doDetachChildren() {
        super.doDetachChildren();
        DeferredCommand.addCommand(new Command(){
            public void execute() {
            for (Widget widget : getWrappedChildren())
                if (widget.getParent() == null){// wrapped elements
                    RootPanel.detachNow(widget);//wrapped widget are
detached //
                }

        }});


    }
it work fine but what happen's when you want to re-attache the HTMLFragment
? who can re-attach the wrapped widget ? (the onAttach() is protected)
the only way we found is to put wrapped widgets in the gwt hierachie after
the call of RootPanel.detachNow(widget);
and that's not a very good solution!
Nicolas


On Tue, Feb 10, 2009 at 7:30 PM, Jason Essington
<[email protected]>wrote:

> RootPanel.detachNow(Widget) method should be called before removing a
> wrapped widget from DOM to prevent your memory leak.
>
> I believe that this method is documented in every widget that implements
> .wrap()
>
> -jason
>
>
> On Feb 10, 2009, at 10:55 AM, Nicolas Wetzel wrote:
>
> Hi all! ,
>
> The Widget.wrap()  API is very usefull to build widgets(fragments)  from
> html templates retrieved from server or bound with the java widget class at
> the compilation time (generators).
> By this way,  the design (HTML+CSS) is entirely delagated to Web
> Developpers, Java Gwt Developpers have to manage only with GWT Widget which
> are in fact only controllers:
>
> Each controler pick up some html element by id left in its corresponding
> template and "build" gwt widget (TextBox,Label etc...) with the wrap API  to
> manage the (dynamic) behavior.
> No css gwt api is used, no Panel for composition is used.
>
> Everything works fine while the  widget fragment is attached to the DOM
> (RootPanel) but there is a trouble :
>   If the widget fragment is detached its components (i e widgets created
> with the wrap api)  are not garbaged because they don't have any parent.
>   So there is a memory leak. The wrap method doesn't alow to link the life
> cycle of the component to its logical parent i e the widget parent. Here is
> the code of the wrap method :
>
> public static Label wrap(Element element) {
>     // Assert that the element is attached.
>     assert Document.get().getBody().isOrHasChild(element);
>
>     Label label = new Label(element);
>
>     // Mark it attached and remember it for cleanup.
>     label.onAttach();
>     RootPanel.detachOnWindowClose(label);
>
>     return label;
>   }
>
>
> By the call of "RootPanel.detachOnWindowClose(label);" the widget is
> gabaged only when the main window is closed. It is  not very clean if the
> fragment is garbaged. We reported this touble
> http://code.google.com/p/google-web-toolkit/issues/detail?id=3113     in
> the bug tracker few months ago but it still in the same state .
>
>
>
>
>
>
>
>
>
>
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to