From ff18e06fbdf6975039edad123babcb661a51f9b2 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 31 Jan 2012 09:56:41 +0200 Subject: [PATCH] Split AbsoluteLayout into widget + paintable --- .../gwt/client/ui/VAbsoluteLayout.java | 64 ++------------- .../client/ui/VAbsoluteLayoutPaintable.java | 78 +++++++++++++++++++ src/com/vaadin/ui/AbsoluteLayout.java | 4 +- 3 files changed, 85 insertions(+), 61 deletions(-) create mode 100644 src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayoutPaintable.java diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java b/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java index e5982b1078..7a65922314 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java @@ -4,7 +4,6 @@ package com.vaadin.terminal.gwt.client.ui; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; @@ -13,17 +12,12 @@ import java.util.Set; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Style; -import com.google.gwt.event.dom.client.DomEvent.Type; -import com.google.gwt.event.shared.EventHandler; -import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.Container; -import com.vaadin.terminal.gwt.client.EventId; import com.vaadin.terminal.gwt.client.RenderSpace; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; @@ -31,7 +25,7 @@ import com.vaadin.terminal.gwt.client.VCaption; import com.vaadin.terminal.gwt.client.VPaintableMap; import com.vaadin.terminal.gwt.client.VPaintableWidget; -public class VAbsoluteLayout extends ComplexPanel implements Container { +public class VAbsoluteLayout extends ComplexPanel { /** Tag name for widget creation */ public static final String TAGNAME = "absolutelayout"; @@ -49,26 +43,11 @@ public class VAbsoluteLayout extends ComplexPanel implements Container { private Object previousStyleName; - private Map pidToComponentWrappper = new HashMap(); + Map pidToComponentWrappper = new HashMap(); protected ApplicationConnection client; - private boolean rendering; - - private LayoutClickEventHandler clickEventHandler = new LayoutClickEventHandler( - this, EventId.LAYOUT_CLICK) { - - @Override - protected VPaintableWidget getChildComponent(Element element) { - return getComponent(element); - } - - @Override - protected HandlerRegistration registerHandler( - H handler, Type type) { - return addDomHandler(handler, type); - } - }; + boolean rendering; public VAbsoluteLayout() { setElement(Document.get().createDivElement()); @@ -143,40 +122,7 @@ public class VAbsoluteLayout extends ComplexPanel implements Container { parent2.updateCaption(uidl); } - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - rendering = true; - this.client = client; - // TODO margin handling - if (client.updateComponent(this, uidl, true)) { - rendering = false; - return; - } - - clickEventHandler.handleEventHandlerRegistration(client); - - HashSet unrenderedPids = new HashSet( - pidToComponentWrappper.keySet()); - - for (Iterator childIterator = uidl.getChildIterator(); childIterator - .hasNext();) { - UIDL cc = (UIDL) childIterator.next(); - if (cc.getTag().equals("cc")) { - UIDL componentUIDL = cc.getChildUIDL(0); - unrenderedPids.remove(componentUIDL.getId()); - getWrapper(client, componentUIDL).updateFromUIDL(cc); - } - } - - for (String pid : unrenderedPids) { - AbsoluteWrapper absoluteWrapper = pidToComponentWrappper.get(pid); - pidToComponentWrappper.remove(pid); - absoluteWrapper.destroy(); - } - rendering = false; - } - - private AbsoluteWrapper getWrapper(ApplicationConnection client, - UIDL componentUIDL) { + AbsoluteWrapper getWrapper(ApplicationConnection client, UIDL componentUIDL) { AbsoluteWrapper wrapper = pidToComponentWrappper.get(componentUIDL .getId()); if (wrapper == null) { @@ -364,7 +310,7 @@ public class VAbsoluteLayout extends ComplexPanel implements Container { * @return The Paintable which the element is a part of. Null if the element * belongs to the layout and not to a child. */ - private VPaintableWidget getComponent(Element element) { + VPaintableWidget getComponent(Element element) { return Util.getPaintableForElement(client, this, element); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayoutPaintable.java b/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayoutPaintable.java new file mode 100644 index 0000000000..b054e57eeb --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayoutPaintable.java @@ -0,0 +1,78 @@ +package com.vaadin.terminal.gwt.client.ui; + +import java.util.HashSet; +import java.util.Iterator; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.DomEvent.Type; +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.ui.Widget; +import com.vaadin.terminal.gwt.client.ApplicationConnection; +import com.vaadin.terminal.gwt.client.EventId; +import com.vaadin.terminal.gwt.client.UIDL; +import com.vaadin.terminal.gwt.client.VPaintableWidget; +import com.vaadin.terminal.gwt.client.ui.VAbsoluteLayout.AbsoluteWrapper; + +public class VAbsoluteLayoutPaintable extends VAbstractPaintableWidget { + + private LayoutClickEventHandler clickEventHandler = new LayoutClickEventHandler( + this, EventId.LAYOUT_CLICK) { + + @Override + protected VPaintableWidget getChildComponent(Element element) { + return getWidgetForPaintable().getComponent(element); + } + + @Override + protected HandlerRegistration registerHandler( + H handler, Type type) { + return getWidgetForPaintable().addDomHandler(handler, type); + } + }; + + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { + getWidgetForPaintable().rendering = true; + getWidgetForPaintable().client = client; + // TODO margin handling + if (client.updateComponent(this, uidl, true)) { + getWidgetForPaintable().rendering = false; + return; + } + + clickEventHandler.handleEventHandlerRegistration(client); + + HashSet unrenderedPids = new HashSet( + getWidgetForPaintable().pidToComponentWrappper.keySet()); + + for (Iterator childIterator = uidl.getChildIterator(); childIterator + .hasNext();) { + UIDL cc = (UIDL) childIterator.next(); + if (cc.getTag().equals("cc")) { + UIDL componentUIDL = cc.getChildUIDL(0); + unrenderedPids.remove(componentUIDL.getId()); + getWidgetForPaintable().getWrapper(client, componentUIDL) + .updateFromUIDL(cc); + } + } + + for (String pid : unrenderedPids) { + AbsoluteWrapper absoluteWrapper = getWidgetForPaintable().pidToComponentWrappper + .get(pid); + getWidgetForPaintable().pidToComponentWrappper.remove(pid); + absoluteWrapper.destroy(); + } + getWidgetForPaintable().rendering = false; + } + + @Override + protected Widget createWidget() { + return GWT.create(VAbsoluteLayout.class); + } + + @Override + public VAbsoluteLayout getWidgetForPaintable() { + return (VAbsoluteLayout) super.getWidgetForPaintable(); + } +} diff --git a/src/com/vaadin/ui/AbsoluteLayout.java b/src/com/vaadin/ui/AbsoluteLayout.java index d6f9897664..c75073c02b 100644 --- a/src/com/vaadin/ui/AbsoluteLayout.java +++ b/src/com/vaadin/ui/AbsoluteLayout.java @@ -17,7 +17,7 @@ import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Sizeable; import com.vaadin.terminal.gwt.client.EventId; -import com.vaadin.terminal.gwt.client.ui.VAbsoluteLayout; +import com.vaadin.terminal.gwt.client.ui.VAbsoluteLayoutPaintable; /** * AbsoluteLayout is a layout implementation that mimics html absolute @@ -25,7 +25,7 @@ import com.vaadin.terminal.gwt.client.ui.VAbsoluteLayout; * */ @SuppressWarnings("serial") -@ClientWidget(VAbsoluteLayout.class) +@ClientWidget(VAbsoluteLayoutPaintable.class) public class AbsoluteLayout extends AbstractLayout implements LayoutClickNotifier { -- 2.39.5