aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/itmill/toolkit/ui/AbstractComponent.java7
-rw-r--r--src/com/itmill/toolkit/ui/AbstractComponentContainer.java24
2 files changed, 29 insertions, 2 deletions
diff --git a/src/com/itmill/toolkit/ui/AbstractComponent.java b/src/com/itmill/toolkit/ui/AbstractComponent.java
index 73afcb6aa8..3508266d91 100644
--- a/src/com/itmill/toolkit/ui/AbstractComponent.java
+++ b/src/com/itmill/toolkit/ui/AbstractComponent.java
@@ -450,15 +450,18 @@ public abstract class AbstractComponent implements Component, MethodEventSource
*/
public void setParent(Component parent) {
- // If the parent is not changed, dont do nothing
+ // If the parent is not changed, don't do anything
if (parent == this.parent) {
return;
}
+ if (parent != null && this.parent != null) {
+ throw new IllegalStateException("Component already has a parent.");
+ }
+
// Send detach event if the component have been connected to a window
if (getApplication() != null) {
detach();
- this.parent = null;
}
// Connect to new parent
diff --git a/src/com/itmill/toolkit/ui/AbstractComponentContainer.java b/src/com/itmill/toolkit/ui/AbstractComponentContainer.java
index 5251e99438..d0169535b7 100644
--- a/src/com/itmill/toolkit/ui/AbstractComponentContainer.java
+++ b/src/com/itmill/toolkit/ui/AbstractComponentContainer.java
@@ -169,6 +169,30 @@ public abstract class AbstractComponentContainer extends AbstractComponent
* @see com.itmill.toolkit.ui.ComponentContainer#addComponent(Component)
*/
public void addComponent(Component c) {
+ if (c instanceof ComponentContainer) {
+ // Make sure we're not adding the component inside it's own content
+ for (Component parent = this; parent != null; parent = parent
+ .getParent()) {
+ if (parent == c) {
+ throw new IllegalArgumentException(
+ "Component cannot be added inside it's own content");
+ }
+ }
+ }
+
+ if (c.getParent() != null) {
+ // If the component already has a parent, try to remove it
+ try {
+ ComponentContainer oldParent = (ComponentContainer) c
+ .getParent();
+ oldParent.removeComponent(c);
+ } catch (Exception e) {
+ throw new IllegalStateException(
+ "Component could be removed from it's old parent.");
+ }
+
+ }
+
c.setParent(this);
fireComponentAttachEvent(c);
}