From d7380ba37150638e8a2b364454c222cf06495fbd Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 31 Jan 2012 09:58:15 +0200 Subject: [PATCH] Split CustomComponent, CustomField and CustomLayout into widget + paintable --- .../gwt/client/ui/VCustomComponent.java | 68 ++------------- .../client/ui/VCustomComponentPaintable.java | 79 +++++++++++++++++ .../terminal/gwt/client/ui/VCustomLayout.java | 77 ++-------------- .../gwt/client/ui/VCustomLayoutPaintable.java | 87 +++++++++++++++++++ src/com/vaadin/ui/CustomComponent.java | 4 +- src/com/vaadin/ui/CustomField.java | 4 +- src/com/vaadin/ui/CustomLayout.java | 4 +- 7 files changed, 186 insertions(+), 137 deletions(-) create mode 100644 src/com/vaadin/terminal/gwt/client/ui/VCustomComponentPaintable.java create mode 100644 src/com/vaadin/terminal/gwt/client/ui/VCustomLayoutPaintable.java diff --git a/src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java b/src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java index 39d1ee462c..5ecd50baff 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java @@ -6,81 +6,27 @@ package com.vaadin.terminal.gwt.client.ui; import java.util.Set; -import com.google.gwt.core.client.Scheduler; -import com.google.gwt.user.client.Command; 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.RenderSpace; -import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; -import com.vaadin.terminal.gwt.client.VPaintableMap; -import com.vaadin.terminal.gwt.client.VPaintableWidget; -public class VCustomComponent extends SimplePanel implements Container { +public class VCustomComponent extends SimplePanel { private static final String CLASSNAME = "v-customcomponent"; private String height; - private ApplicationConnection client; - private boolean rendering; + ApplicationConnection client; + boolean rendering; private String width; - private RenderSpace renderSpace = new RenderSpace(); + RenderSpace renderSpace = new RenderSpace(); public VCustomComponent() { super(); setStyleName(CLASSNAME); } - public void updateFromUIDL(UIDL uidl, final ApplicationConnection client) { - rendering = true; - if (client.updateComponent(this, uidl, true)) { - rendering = false; - return; - } - this.client = client; - - final UIDL child = uidl.getChildUIDL(0); - if (child != null) { - final VPaintableWidget paintable = client.getPaintable(child); - Widget widget = paintable.getWidgetForPaintable(); - if (widget != getWidget()) { - if (getWidget() != null) { - client.unregisterPaintable(VPaintableMap.get(client) - .getPaintable(getWidget())); - clear(); - } - setWidget(widget); - } - paintable.updateFromUIDL(child, client); - } - - boolean updateDynamicSize = updateDynamicSize(); - if (updateDynamicSize) { - Scheduler.get().scheduleDeferred(new Command() { - public void execute() { - // FIXME deferred relative size update needed to fix some - // scrollbar issues in sampler. This must be the wrong way - // to do it. Might be that some other component is broken. - client.handleComponentRelativeSize(VCustomComponent.this); - - } - }); - } - - renderSpace.setWidth(getElement().getOffsetWidth()); - renderSpace.setHeight(getElement().getOffsetHeight()); - - /* - * Needed to update client size if the size of this component has - * changed and the child uses relative size(s). - */ - client.runDescendentsLayout(this); - - rendering = false; - } - - private boolean updateDynamicSize() { + boolean updateDynamicSize() { boolean updated = false; if (isDynamicWidth()) { int childWidth = Util.getRequiredWidth(getWidget()); @@ -121,10 +67,6 @@ public class VCustomComponent extends SimplePanel implements Container { } } - public void updateCaption(VPaintableWidget component, UIDL uidl) { - // NOP, custom component dont render composition roots caption - } - public boolean requestLayout(Set children) { // If a child grows in size, it will not necessarily be calculated // correctly unless we remove previous size definitions diff --git a/src/com/vaadin/terminal/gwt/client/ui/VCustomComponentPaintable.java b/src/com/vaadin/terminal/gwt/client/ui/VCustomComponentPaintable.java new file mode 100644 index 0000000000..3abcd9cd75 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/VCustomComponentPaintable.java @@ -0,0 +1,79 @@ +package com.vaadin.terminal.gwt.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.ui.Widget; +import com.vaadin.terminal.gwt.client.ApplicationConnection; +import com.vaadin.terminal.gwt.client.UIDL; +import com.vaadin.terminal.gwt.client.VPaintableMap; +import com.vaadin.terminal.gwt.client.VPaintableWidget; + +public class VCustomComponentPaintable extends + VAbstractPaintableWidgetContainer { + + public void updateFromUIDL(UIDL uidl, final ApplicationConnection client) { + getWidgetForPaintable().rendering = true; + if (client.updateComponent(this, uidl, true)) { + getWidgetForPaintable().rendering = false; + return; + } + getWidgetForPaintable().client = client; + + final UIDL child = uidl.getChildUIDL(0); + if (child != null) { + final VPaintableWidget paintable = client.getPaintable(child); + Widget widget = paintable.getWidgetForPaintable(); + if (widget != getWidgetForPaintable().getWidget()) { + if (getWidgetForPaintable().getWidget() != null) { + client.unregisterPaintable(VPaintableMap.get(client) + .getPaintable(getWidgetForPaintable().getWidget())); + getWidgetForPaintable().clear(); + } + getWidgetForPaintable().setWidget(widget); + } + paintable.updateFromUIDL(child, client); + } + + boolean updateDynamicSize = getWidgetForPaintable().updateDynamicSize(); + if (updateDynamicSize) { + Scheduler.get().scheduleDeferred(new Command() { + public void execute() { + // FIXME deferred relative size update needed to fix some + // scrollbar issues in sampler. This must be the wrong way + // to do it. Might be that some other component is broken. + client.handleComponentRelativeSize(getWidgetForPaintable()); + + } + }); + } + + getWidgetForPaintable().renderSpace.setWidth(getWidgetForPaintable() + .getElement().getOffsetWidth()); + getWidgetForPaintable().renderSpace.setHeight(getWidgetForPaintable() + .getElement().getOffsetHeight()); + + /* + * Needed to update client size if the size of this component has + * changed and the child uses relative size(s). + */ + client.runDescendentsLayout(getWidgetForPaintable()); + + getWidgetForPaintable().rendering = false; + } + + @Override + protected Widget createWidget() { + return GWT.create(VCustomComponent.class); + } + + @Override + public VCustomComponent getWidgetForPaintable() { + return (VCustomComponent) super.getWidgetForPaintable(); + } + + public void updateCaption(VPaintableWidget component, UIDL uidl) { + // NOP, custom component dont render composition roots caption + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/VCustomLayout.java b/src/com/vaadin/terminal/gwt/client/ui/VCustomLayout.java index 787be254f6..9b067267ff 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VCustomLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VCustomLayout.java @@ -18,7 +18,6 @@ import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; -import com.vaadin.terminal.gwt.client.Container; import com.vaadin.terminal.gwt.client.ContainerResizedListener; import com.vaadin.terminal.gwt.client.RenderInformation.FloatSize; import com.vaadin.terminal.gwt.client.RenderSpace; @@ -35,8 +34,8 @@ import com.vaadin.terminal.gwt.client.VPaintableWidget; * @author Vaadin Ltd * */ -public class VCustomLayout extends ComplexPanel implements VPaintableWidget, - Container, ContainerResizedListener { +public class VCustomLayout extends ComplexPanel implements + ContainerResizedListener { public static final String CLASSNAME = "v-customlayout"; @@ -44,7 +43,7 @@ public class VCustomLayout extends ComplexPanel implements VPaintableWidget, private final HashMap locationToElement = new HashMap(); /** Location-name to contained widget map */ - private final HashMap locationToWidget = new HashMap(); + final HashMap locationToWidget = new HashMap(); /** Widget to captionwrapper map */ private final HashMap paintableToCaptionWrapper = new HashMap(); @@ -53,12 +52,12 @@ public class VCustomLayout extends ComplexPanel implements VPaintableWidget, String currentTemplateName; /** Unexecuted scripts loaded from the template */ - private String scripts = ""; + String scripts = ""; /** Paintable ID of this paintable */ - private String pid; + String pid; - private ApplicationConnection client; + ApplicationConnection client; /** Has the template been loaded from contents passed in UIDL **/ private boolean hasTemplateContents = false; @@ -132,66 +131,8 @@ public class VCustomLayout extends ComplexPanel implements VPaintableWidget, locationToWidget.put(location, widget); } - /** Update the layout from UIDL */ - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - this.client = client; - // ApplicationConnection manages generic component features - if (client.updateComponent(this, uidl, true)) { - return; - } - - pid = uidl.getId(); - if (!hasTemplate()) { - // Update HTML template only once - initializeHTML(uidl, client); - } - - // Evaluate scripts - eval(scripts); - scripts = null; - - iLayout(); - // TODO Check if this is needed - client.runDescendentsLayout(this); - - Set oldWidgets = new HashSet(); - oldWidgets.addAll(locationToWidget.values()); - - // For all contained widgets - for (final Iterator i = uidl.getChildIterator(); i.hasNext();) { - final UIDL uidlForChild = (UIDL) i.next(); - if (uidlForChild.getTag().equals("location")) { - final String location = uidlForChild.getStringAttribute("name"); - UIDL childUIDL = uidlForChild.getChildUIDL(0); - final VPaintableWidget childPaintable = client - .getPaintable(childUIDL); - Widget childWidget = childPaintable.getWidgetForPaintable(); - try { - setWidget(childWidget, location); - childPaintable.updateFromUIDL(childUIDL, client); - } catch (final IllegalArgumentException e) { - // If no location is found, this component is not visible - } - oldWidgets.remove(childWidget); - } - } - for (Iterator iterator = oldWidgets.iterator(); iterator - .hasNext();) { - Widget oldWidget = iterator.next(); - if (oldWidget.isAttached()) { - // slot of this widget is emptied, remove it - remove(oldWidget); - } - } - - iLayout(); - // TODO Check if this is needed - client.runDescendentsLayout(this); - - } - /** Initialize HTML-layout. */ - private void initializeHTML(UIDL uidl, ApplicationConnection client) { + void initializeHTML(UIDL uidl, ApplicationConnection client) { final String newTemplateContents = uidl .getStringAttribute("templateContents"); @@ -264,7 +205,7 @@ public class VCustomLayout extends ComplexPanel implements VPaintableWidget, return false; }-*/; - private boolean hasTemplate() { + boolean hasTemplate() { if (currentTemplateName == null && !hasTemplateContents) { return false; } else { @@ -295,7 +236,7 @@ public class VCustomLayout extends ComplexPanel implements VPaintableWidget, } /** Evaluate given script in browser document */ - private static native void eval(String script) + static native void eval(String script) /*-{ try { if (script != null) diff --git a/src/com/vaadin/terminal/gwt/client/ui/VCustomLayoutPaintable.java b/src/com/vaadin/terminal/gwt/client/ui/VCustomLayoutPaintable.java new file mode 100644 index 0000000000..7997355136 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/VCustomLayoutPaintable.java @@ -0,0 +1,87 @@ +package com.vaadin.terminal.gwt.client.ui; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Widget; +import com.vaadin.terminal.gwt.client.ApplicationConnection; +import com.vaadin.terminal.gwt.client.UIDL; +import com.vaadin.terminal.gwt.client.VPaintableWidget; + +public class VCustomLayoutPaintable extends VAbstractPaintableWidgetContainer { + + /** Update the layout from UIDL */ + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { + getWidgetForPaintable().client = client; + // ApplicationConnection manages generic component features + if (client.updateComponent(this, uidl, true)) { + return; + } + + getWidgetForPaintable().pid = uidl.getId(); + if (!getWidgetForPaintable().hasTemplate()) { + // Update HTML template only once + getWidgetForPaintable().initializeHTML(uidl, client); + } + + // Evaluate scripts + VCustomLayout.eval(getWidgetForPaintable().scripts); + getWidgetForPaintable().scripts = null; + + getWidgetForPaintable().iLayout(); + // TODO Check if this is needed + client.runDescendentsLayout(getWidgetForPaintable()); + + Set oldWidgets = new HashSet(); + oldWidgets.addAll(getWidgetForPaintable().locationToWidget.values()); + + // For all contained widgets + for (final Iterator i = uidl.getChildIterator(); i.hasNext();) { + final UIDL uidlForChild = (UIDL) i.next(); + if (uidlForChild.getTag().equals("location")) { + final String location = uidlForChild.getStringAttribute("name"); + UIDL childUIDL = uidlForChild.getChildUIDL(0); + final VPaintableWidget childPaintable = client + .getPaintable(childUIDL); + Widget childWidget = childPaintable.getWidgetForPaintable(); + try { + getWidgetForPaintable().setWidget(childWidget, location); + childPaintable.updateFromUIDL(childUIDL, client); + } catch (final IllegalArgumentException e) { + // If no location is found, this component is not visible + } + oldWidgets.remove(childWidget); + } + } + for (Iterator iterator = oldWidgets.iterator(); iterator + .hasNext();) { + Widget oldWidget = iterator.next(); + if (oldWidget.isAttached()) { + // slot of this widget is emptied, remove it + getWidgetForPaintable().remove(oldWidget); + } + } + + getWidgetForPaintable().iLayout(); + // TODO Check if this is needed + client.runDescendentsLayout(getWidgetForPaintable()); + + } + + @Override + public VCustomLayout getWidgetForPaintable() { + return (VCustomLayout) super.getWidgetForPaintable(); + } + + @Override + protected Widget createWidget() { + return GWT.create(VCustomLayout.class); + } + + public void updateCaption(VPaintableWidget paintable, UIDL uidl) { + getWidgetForPaintable().updateCaption(paintable, uidl); + + } +} diff --git a/src/com/vaadin/ui/CustomComponent.java b/src/com/vaadin/ui/CustomComponent.java index 0f891ac0fa..7aba34b6bb 100644 --- a/src/com/vaadin/ui/CustomComponent.java +++ b/src/com/vaadin/ui/CustomComponent.java @@ -9,7 +9,7 @@ import java.util.Iterator; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; -import com.vaadin.terminal.gwt.client.ui.VCustomComponent; +import com.vaadin.terminal.gwt.client.ui.VCustomComponentPaintable; import com.vaadin.ui.ClientWidget.LoadStyle; /** @@ -27,7 +27,7 @@ import com.vaadin.ui.ClientWidget.LoadStyle; * @since 3.0 */ @SuppressWarnings("serial") -@ClientWidget(value = VCustomComponent.class, loadStyle = LoadStyle.EAGER) +@ClientWidget(value = VCustomComponentPaintable.class, loadStyle = LoadStyle.EAGER) public class CustomComponent extends AbstractComponentContainer { /** diff --git a/src/com/vaadin/ui/CustomField.java b/src/com/vaadin/ui/CustomField.java index 72f863ca8b..73f9050363 100644 --- a/src/com/vaadin/ui/CustomField.java +++ b/src/com/vaadin/ui/CustomField.java @@ -11,7 +11,7 @@ import java.util.Iterator; import com.vaadin.data.Property; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; -import com.vaadin.terminal.gwt.client.ui.VCustomComponent; +import com.vaadin.terminal.gwt.client.ui.VCustomComponentPaintable; /** * A {@link Field} whose UI content can be constructed by the user, enabling the @@ -35,7 +35,7 @@ import com.vaadin.terminal.gwt.client.ui.VCustomComponent; * * @since 7.0 */ -@ClientWidget(VCustomComponent.class) +@ClientWidget(VCustomComponentPaintable.class) public abstract class CustomField extends AbstractField implements ComponentContainer { diff --git a/src/com/vaadin/ui/CustomLayout.java b/src/com/vaadin/ui/CustomLayout.java index dc473fb549..fb0c369969 100644 --- a/src/com/vaadin/ui/CustomLayout.java +++ b/src/com/vaadin/ui/CustomLayout.java @@ -12,7 +12,7 @@ import java.util.Iterator; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; -import com.vaadin.terminal.gwt.client.ui.VCustomLayout; +import com.vaadin.terminal.gwt.client.ui.VCustomLayoutPaintable; /** *

@@ -44,7 +44,7 @@ import com.vaadin.terminal.gwt.client.ui.VCustomLayout; * @since 3.0 */ @SuppressWarnings("serial") -@ClientWidget(VCustomLayout.class) +@ClientWidget(VCustomLayoutPaintable.class) public class CustomLayout extends AbstractLayout { private static final int BUFFER_SIZE = 10000; -- 2.39.5