]> source.dussan.org Git - vaadin-framework.git/commitdiff
Move ClientConnector.setParent to Component and Extension (#11777)
authorArtur Signell <artur@vaadin.com>
Mon, 10 Jun 2013 16:28:57 +0000 (19:28 +0300)
committerVaadin Code Review <review@vaadin.com>
Tue, 11 Jun 2013 08:08:47 +0000 (08:08 +0000)
Change-Id: I1f0b2597f621160329ddc432869277b2758efd52

server/src/com/vaadin/server/AbstractClientConnector.java
server/src/com/vaadin/server/AbstractExtension.java
server/src/com/vaadin/server/ClientConnector.java
server/src/com/vaadin/server/DragAndDropService.java
server/src/com/vaadin/server/Extension.java
server/src/com/vaadin/ui/AbstractComponent.java
server/src/com/vaadin/ui/Component.java
server/src/com/vaadin/ui/Window.java

index 01f7d9af4207169e0d1be412d312b653e762becb..c3101924dd074b74ec024280f94f7ef8ab76b9e0 100644 (file)
@@ -84,8 +84,6 @@ public abstract class AbstractClientConnector implements ClientConnector,
 
     private ArrayList<Extension> extensions = new ArrayList<Extension>();
 
-    private ClientConnector parent;
-
     /**
      * The EventRouter used for the event model.
      */
@@ -563,38 +561,6 @@ public abstract class AbstractClientConnector implements ClientConnector,
         markAsDirty();
     }
 
-    @Override
-    public void setParent(ClientConnector parent) {
-
-        // If the parent is not changed, don't do anything
-        if (parent == this.parent) {
-            return;
-        }
-
-        if (parent != null && this.parent != null) {
-            throw new IllegalStateException(getClass().getName()
-                    + " already has a parent.");
-        }
-
-        // Send detach event if the component have been connected to a window
-        if (isAttached()) {
-            detach();
-        }
-
-        // Connect to new parent
-        this.parent = parent;
-
-        // Send attach event if connected to an application
-        if (isAttached()) {
-            attach();
-        }
-    }
-
-    @Override
-    public ClientConnector getParent() {
-        return parent;
-    }
-
     /*
      * (non-Javadoc)
      * 
index 00496aed4a4faccf4f524abcf4ff85c106da19c9..0387ad1b0880a9fd94ba0e2f5d5dd7e0de99d5f5 100644 (file)
@@ -33,6 +33,8 @@ public abstract class AbstractExtension extends AbstractClientConnector
         implements Extension {
     private boolean previouslyAttached = false;
 
+    private ClientConnector parent;
+
     /**
      * Gets a type that the parent must be an instance of. Override this if the
      * extension only support certain targets, e.g. if only TextFields can be
@@ -69,7 +71,7 @@ public abstract class AbstractExtension extends AbstractClientConnector
 
         Class<? extends ClientConnector> supportedParentType = getSupportedParentType();
         if (parent == null || supportedParentType.isInstance(parent)) {
-            super.setParent(parent);
+            internalSetParent(parent);
             previouslyAttached = true;
         } else {
             throw new IllegalArgumentException(getClass().getName()
@@ -79,4 +81,33 @@ public abstract class AbstractExtension extends AbstractClientConnector
         }
     }
 
+    /**
+     * Actually sets the parent and calls required listeners.
+     * 
+     * @since 7.1
+     * @param parent
+     *            The parent to set
+     */
+    private void internalSetParent(ClientConnector parent) {
+
+        // Send a detach event if the component is currently attached
+        if (isAttached()) {
+            detach();
+        }
+
+        // Connect to new parent
+        this.parent = parent;
+
+        // Send attach event if the component is now attached
+        if (isAttached()) {
+            attach();
+        }
+
+    }
+
+    @Override
+    public ClientConnector getParent() {
+        return parent;
+    }
+
 }
index 9e328bb6ef374f8188d90b318463e8be7f7eb612..3c06d5743c96b85e84924f60d5fae17e1c5aaac1 100644 (file)
@@ -27,8 +27,6 @@ import com.vaadin.event.ConnectorEvent;
 import com.vaadin.event.ConnectorEventListener;
 import com.vaadin.shared.Connector;
 import com.vaadin.shared.communication.SharedState;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.ComponentContainer;
 import com.vaadin.ui.UI;
 import com.vaadin.util.ReflectTools;
 
@@ -194,37 +192,6 @@ public interface ClientConnector extends Connector {
      */
     public void markAsDirtyRecursive();
 
-    /**
-     * Sets the parent connector of the connector.
-     * 
-     * <p>
-     * This method automatically calls {@link #attach()} if the connector
-     * becomes attached to the application, regardless of whether it was
-     * attached previously. Conversely, if the parent is {@code null} and the
-     * connector is attached to the application, {@link #detach()} is called for
-     * the connector.
-     * </p>
-     * <p>
-     * This method is rarely called directly. One of the
-     * {@link ComponentContainer#addComponent(Component)} or
-     * {@link AbstractClientConnector#addExtension(Extension)} methods are
-     * normally used for adding connectors to a parent and they will call this
-     * method implicitly.
-     * </p>
-     * 
-     * <p>
-     * It is not possible to change the parent without first setting the parent
-     * to {@code null}.
-     * </p>
-     * 
-     * @param parent
-     *            the parent connector
-     * @throws IllegalStateException
-     *             if a parent is given even though the connector already has a
-     *             parent
-     */
-    public void setParent(ClientConnector parent);
-
     /**
      * Checks if the connector is attached to a VaadinSession.
      * 
index df2361e887b1f8e7b43ff5b67a4c5be597f556cc..cef1bb86e76c0ffab8a4caf24a49282f180de9dc 100644 (file)
@@ -314,12 +314,6 @@ public class DragAndDropService implements VariableOwner, ClientConnector {
 
     }
 
-    @Override
-    public void setParent(ClientConnector parent) {
-        // TODO Auto-generated method stub
-
-    }
-
     @Override
     public void attach() {
         // TODO Auto-generated method stub
index 2e632fc6c91b4e14952df1f74502cda8d63106ad..0f3d81598e0096b7d2b38fdbf920b712972beb94 100644 (file)
@@ -35,4 +35,25 @@ public interface Extension extends ClientConnector {
      * removed, it cannot be attached again.
      */
     void remove();
+
+    /**
+     * Sets the parent connector of the connector.
+     * 
+     * This method automatically calls {@link #attach()} if the connector
+     * becomes attached to the session.
+     * <p>
+     * This method is rarely called directly.
+     * {@link AbstractClientConnector#addExtension(Extension)} is normally used
+     * for adding extensions to a parent and it will call this method
+     * implicitly.
+     * </p>
+     * 
+     * @param parent
+     *            the parent connector
+     * @throws IllegalStateException
+     *             if a parent is given even though the connector already has a
+     *             parent
+     */
+    public void setParent(ClientConnector parent);
+
 }
index 9ff36a42d20dd57f016509c3fd54be2bad18bfea..0bf27435fb5ca178cbf8eef3369e1a9c6b438638 100644 (file)
@@ -28,7 +28,6 @@ import java.util.regex.Pattern;
 import com.vaadin.event.ActionManager;
 import com.vaadin.event.ShortcutListener;
 import com.vaadin.server.AbstractClientConnector;
-import com.vaadin.server.ClientConnector;
 import com.vaadin.server.ComponentSizeValidator;
 import com.vaadin.server.ErrorHandler;
 import com.vaadin.server.ErrorMessage;
@@ -94,6 +93,8 @@ public abstract class AbstractComponent extends AbstractClientConnector
 
     private boolean visible = true;
 
+    private HasComponents parent;
+
     /* Constructor */
 
     /**
@@ -451,17 +452,32 @@ public abstract class AbstractComponent extends AbstractClientConnector
      */
     @Override
     public HasComponents getParent() {
-        return (HasComponents) super.getParent();
+        return parent;
     }
 
     @Override
-    public void setParent(ClientConnector parent) {
-        if (parent == null || parent instanceof HasComponents) {
-            super.setParent(parent);
-        } else {
-            throw new IllegalArgumentException(
-                    "The parent of a Component must implement HasComponents, which "
-                            + parent.getClass() + " doesn't do.");
+    public void setParent(HasComponents parent) {
+        // If the parent is not changed, don't do anything
+        if (parent == this.parent) {
+            return;
+        }
+
+        if (parent != null && this.parent != null) {
+            throw new IllegalStateException(getClass().getName()
+                    + " already has a parent.");
+        }
+
+        // Send a detach event if the component is currently attached
+        if (isAttached()) {
+            detach();
+        }
+
+        // Connect to new parent
+        this.parent = parent;
+
+        // Send attach event if the component is now attached
+        if (isAttached()) {
+            attach();
         }
     }
 
index 20958812fc4dbabddc0f45f9212be3954418eb8d..485327bb54ff96b9b1fe69c6947f18e4ddf8a19d 100644 (file)
@@ -332,6 +332,32 @@ public interface Component extends ClientConnector, Sizeable, Serializable {
      */
     public void setVisible(boolean visible);
 
+    /**
+     * Sets the parent connector of the component.
+     * 
+     * <p>
+     * This method automatically calls {@link #attach()} if the component
+     * becomes attached to the session, regardless of whether it was attached
+     * previously. Conversely, if the component currently is attached to the
+     * session, {@link #detach()} is called for the connector before attaching
+     * it to a new parent.
+     * </p>
+     * <p>
+     * This method is rarely called directly.
+     * {@link ComponentContainer#addComponent(Component)} or a
+     * {@link HasComponents} specific method is normally used for adding
+     * components to a parent and the used method will call this method
+     * implicitly.
+     * </p>
+     * 
+     * @param parent
+     *            the parent connector
+     * @throws IllegalStateException
+     *             if a parent is given even though the connector already has a
+     *             parent
+     */
+    public void setParent(HasComponents parent);
+
     /**
      * Gets the parent component of the component.
      * 
index 9f64c9118e6e0ec1ba421f4aff11c1d116ba09f9..700d0eb38725f17479e34e5267c9c4671807639f 100644 (file)
@@ -31,7 +31,6 @@ import com.vaadin.event.ShortcutAction;
 import com.vaadin.event.ShortcutAction.KeyCode;
 import com.vaadin.event.ShortcutAction.ModifierKey;
 import com.vaadin.event.ShortcutListener;
-import com.vaadin.server.ClientConnector;
 import com.vaadin.server.PaintException;
 import com.vaadin.server.PaintTarget;
 import com.vaadin.shared.MouseEventDetails;
@@ -139,7 +138,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
      * )
      */
     @Override
-    public void setParent(ClientConnector parent) {
+    public void setParent(HasComponents parent) {
         if (parent == null || parent instanceof UI) {
             super.setParent(parent);
         } else {