diff options
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/VPaintableWidgetContainer.java | 4 | ||||
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidgetContainer.java | 34 |
2 files changed, 37 insertions, 1 deletions
diff --git a/src/com/vaadin/terminal/gwt/client/VPaintableWidgetContainer.java b/src/com/vaadin/terminal/gwt/client/VPaintableWidgetContainer.java index baf266546d..da48eeb2fb 100644 --- a/src/com/vaadin/terminal/gwt/client/VPaintableWidgetContainer.java +++ b/src/com/vaadin/terminal/gwt/client/VPaintableWidgetContainer.java @@ -4,6 +4,8 @@ package com.vaadin.terminal.gwt.client; +import java.util.Collection; + import com.google.gwt.user.client.ui.HasWidgets; /** @@ -40,6 +42,6 @@ public interface VPaintableWidgetContainer extends VPaintableWidget { * @return A collection of children for this paintable. An empty collection * if there are no children. */ - // public Collection<VPaintableWidget> getChildren(); + public Collection<VPaintableWidget> getChildren(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidgetContainer.java b/src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidgetContainer.java index 1f78c02f58..ebdb05a6c8 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidgetContainer.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidgetContainer.java @@ -3,6 +3,13 @@ */ package com.vaadin.terminal.gwt.client.ui; +import java.util.ArrayList; +import java.util.Collection; + +import com.google.gwt.user.client.ui.HasWidgets; +import com.google.gwt.user.client.ui.Widget; +import com.vaadin.terminal.gwt.client.VPaintableMap; +import com.vaadin.terminal.gwt.client.VPaintableWidget; import com.vaadin.terminal.gwt.client.VPaintableWidgetContainer; public abstract class VAbstractPaintableWidgetContainer extends @@ -14,4 +21,31 @@ public abstract class VAbstractPaintableWidgetContainer extends public VAbstractPaintableWidgetContainer() { } + public Collection<VPaintableWidget> getChildren() { + Collection<VPaintableWidget> children = new ArrayList<VPaintableWidget>(); + + addDescendantPaintables(getWidgetForPaintable(), children, + VPaintableMap.get(getConnection())); + + return children; + } + + private static void addDescendantPaintables(Widget widget, + Collection<VPaintableWidget> paintables, VPaintableMap paintableMap) { + // FIXME: Store hierarchy instead of doing lookup every time + + if (widget instanceof HasWidgets) { + for (Widget child : (HasWidgets) widget) { + VPaintableWidget paintable = paintableMap.getPaintable(child); + if (paintable != null) { + // If child is a paintable, add it to the collection + paintables.add(paintable); + } else { + // Else keep looking for paintables inside the child widget + addDescendantPaintables(child, paintables, paintableMap); + } + } + } + } + } |