package com.axellience.vuegwt.client.gwtpanel;

import com.axellience.vuegwt.client.VueGWT;
import com.axellience.vuegwt.client.component.VueComponent;
import com.axellience.vuegwt.client.vue.VueFactory;
import com.axellience.vuegwt.client.vue.VueJsConstructor;
import com.google.gwt.user.client.ui.SimplePanel;

/**
 * Wrap a {@link VueComponent} instance in a GWT Panel
 * @author Adrien Baron
 */
public class VueGwtPanel<T extends VueComponent> extends SimplePanel
{
    private T vueComponentInstance;

    public VueGwtPanel(VueFactory<T> vueFactory)
    {
        this(vueFactory.getJsConstructor());
    }

    public VueGwtPanel(VueJsConstructor<T> vueJsConstructor)
    {
        super();
        vueComponentInstance = vueJsConstructor.instantiate();
    }

    public VueGwtPanel(Class<T> vueClass)
    {
        this(VueGWT.getFactory(vueClass));
    }

    @Override
    protected void onAttach()
    {
        super.onAttach();
        vueComponentInstance.$mount(getElement());
    }

    public T vue()
    {
        return this.vueComponentInstance;
    }
}

@@ -281,20 +281,19 @@
 gwt.
-user
+dom
 .client.
 ui.S
@@ -292,22 +292,103 @@
 ent.
-ui.SimplePanel
+Document;%0Aimport com.google.gwt.dom.client.Element;%0Aimport com.google.gwt.user.client.ui.Widget
 ;%0A%0A/
@@ -449,32 +449,8 @@
 nel%0A
- * @author Adrien Baron%0A
  */%0A
@@ -510,19 +510,14 @@
 nds 
-SimplePanel
+Widget
 %0A%7B%0A 
@@ -527,16 +527,22 @@
 private 
+final 
 T vueCom
@@ -745,24 +745,79 @@
    super();%0A
+        setElement(Document.get().createDivElement());%0A
         vueC
@@ -966,24 +966,97 @@
 ass));%0A    %7D
+%0A    %0A    public T vue()%0A    %7B%0A        return vueComponentInstance;%0A    %7D
 %0A%0A    @Overr
@@ -1080,22 +1080,20 @@
  void on
-Attach
+Load
 ()%0A    %7B
@@ -1113,14 +1113,12 @@
 r.on
-Attach
+Load
 ();%0A
@@ -1129,103 +1129,329 @@
     
-vueComponentInstance.$mount(getElement());%0A    %7D%0A%0A    public T vue()%0A    %7B%0A        return this.
+if (!isMounted()) %7B%0A            mountVueComponent();%0A        %7D%0A    %7D%0A%0A    private boolean isMounted()%0A    %7B%0A        return getElement().hasChildNodes();%0A    %7D%0A%0A    private void mountVueComponent()%0A    %7B%0A        Element vueElement = Document.get().createDivElement();%0A        getElement().appendChild(vueElement);%0A        
 vueC
@@ -1458,26 +1458,45 @@
 omponentInstance
+.$mount(vueElement)
 ;%0A    %7D%0A%7D%0A

Fix VueGwtPanel to be able to remove it from another widget