Provides an integration test for IsRenderable
Review at http://gwt-code-reviews.appspot.com/1527804
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10540 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/IsRenderable.java b/user/src/com/google/gwt/user/client/ui/IsRenderable.java
index d4bf0fe..b7b065e 100644
--- a/user/src/com/google/gwt/user/client/ui/IsRenderable.java
+++ b/user/src/com/google/gwt/user/client/ui/IsRenderable.java
@@ -31,7 +31,8 @@
/**
* Replace the previous contents of the receiver with the given element,
- * presumed to have been created via a previous call to {@link #render}.
+ * presumed to have been created and stamped via a previous call to
+ * {@link #render}.
*/
void claimElement(Element element);
diff --git a/user/src/com/google/gwt/user/client/ui/RenderableStamper.java b/user/src/com/google/gwt/user/client/ui/RenderableStamper.java
index 3393271..f22a72e 100644
--- a/user/src/com/google/gwt/user/client/ui/RenderableStamper.java
+++ b/user/src/com/google/gwt/user/client/ui/RenderableStamper.java
@@ -89,8 +89,4 @@
elementBuilder.id(token);
return elementBuilder;
}
-
- private String getToken() {
- return token;
- }
}
diff --git a/user/src/com/google/gwt/user/client/ui/UIObject.java b/user/src/com/google/gwt/user/client/ui/UIObject.java
index b6b9ec1..10985d3 100644
--- a/user/src/com/google/gwt/user/client/ui/UIObject.java
+++ b/user/src/com/google/gwt/user/client/ui/UIObject.java
@@ -851,7 +851,7 @@
* <p>
* Note that this method is normally called only on the top element
* of an IsRenderable tree. Children instead will receive {@link
- * IsRenderable#render} and {@link IsRenderable#wrap}.
+ * IsRenderable#render} and {@link IsRenderable#claimElement(Element)}.
*
* @see PotentialElement
* @see IsRenderable
diff --git a/user/test/com/google/gwt/uibinder/LazyWidgetBuilderSuite.java b/user/test/com/google/gwt/uibinder/LazyWidgetBuilderSuite.java
index a5f1303..23342b5 100644
--- a/user/test/com/google/gwt/uibinder/LazyWidgetBuilderSuite.java
+++ b/user/test/com/google/gwt/uibinder/LazyWidgetBuilderSuite.java
@@ -16,6 +16,7 @@
package com.google.gwt.uibinder;
import com.google.gwt.junit.tools.GWTTestSuite;
+import com.google.gwt.uibinder.test.client.IsRenderableIntegrationTest;
import com.google.gwt.uibinder.test.client.SafeHtmlAsComponentsTest;
import com.google.gwt.uibinder.test.client.UiRendererTest;
@@ -29,6 +30,7 @@
GWTTestSuite suite = new GWTTestSuite(
"Tests that rely on the useLazyWidgetBuilders switch");
+ suite.addTestSuite(IsRenderableIntegrationTest.class);
suite.addTestSuite(SafeHtmlAsComponentsTest.class);
suite.addTestSuite(UiRendererTest.class);
diff --git a/user/test/com/google/gwt/uibinder/test/client/IsRenderableIntegrationTest.Deep.ui.xml b/user/test/com/google/gwt/uibinder/test/client/IsRenderableIntegrationTest.Deep.ui.xml
new file mode 100644
index 0000000..90df8ab
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/IsRenderableIntegrationTest.Deep.ui.xml
@@ -0,0 +1,45 @@
+<!-- -->
+<!-- Copyright 2011 Google Inc. -->
+<!-- Licensed under the Apache License, Version 2.0 (the "License"); you -->
+<!-- may not use this file except in compliance with the License. You may -->
+<!-- may obtain a copy of the License at -->
+<!-- -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0 -->
+<!-- -->
+<!-- Unless required by applicable law or agreed to in writing, software -->
+<!-- distributed under the License is distributed on an "AS IS" BASIS, -->
+<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -->
+<!-- implied. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<ui:UiBinder
+ xmlns:ui="urn:ui:com.google.gwt.uibinder"
+ xmlns:gwt="urn:import:com.google.gwt.user.client.ui"
+ xmlns:test="urn:import:com.google.gwt.uibinder.test.client"
+ >
+ <gwt:RenderablePanel ui:field="top" styleName="test">
+ <div ui:field="outerDiv" class="ble">Outer div</div>
+ <test:SimpleRenderable ui:field="outerRenderable">Outer renderable</test:SimpleRenderable>
+ <gwt:Label ui:field="outerLabel">Outer label</gwt:Label>
+ <test:RenderableComposite ui:field="outerComposite"/>
+
+ <ui:msg description="A photo promo">
+ Outer i18n image
+ <gwt:Image ui:field="outerI18nImage" styleName="ble" />
+ while browsing your photos.
+ </ui:msg>
+
+ <gwt:RenderablePanel ui:field="childPanel" styleName="test">
+ <div ui:field="innerDiv" class="ble">Inner div</div>
+ <test:SimpleRenderable ui:field="innerRenderable">Inner renderable</test:SimpleRenderable>
+ <gwt:Label ui:field="innerLabel">Inner label</gwt:Label>
+ <test:RenderableComposite ui:field="innerComposite"/>
+
+ <ui:msg description="A photo promo">
+ Inner i18n image
+ <gwt:Image ui:field="innerI18nImage" styleName="ble" />
+ while browsing your photos.
+ </ui:msg>
+ </gwt:RenderablePanel>
+
+ </gwt:RenderablePanel>
+</ui:UiBinder>
diff --git a/user/test/com/google/gwt/uibinder/test/client/IsRenderableIntegrationTest.Shallow.ui.xml b/user/test/com/google/gwt/uibinder/test/client/IsRenderableIntegrationTest.Shallow.ui.xml
new file mode 100644
index 0000000..a9fb250
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/IsRenderableIntegrationTest.Shallow.ui.xml
@@ -0,0 +1,19 @@
+<!-- -->
+<!-- Copyright 2011 Google Inc. -->
+<!-- Licensed under the Apache License, Version 2.0 (the "License"); you -->
+<!-- may not use this file except in compliance with the License. You may -->
+<!-- may obtain a copy of the License at -->
+<!-- -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0 -->
+<!-- -->
+<!-- Unless required by applicable law or agreed to in writing, software -->
+<!-- distributed under the License is distributed on an "AS IS" BASIS, -->
+<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -->
+<!-- implied. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<ui:UiBinder
+ xmlns:ui="urn:ui:com.google.gwt.uibinder"
+ xmlns:test="urn:import:com.google.gwt.uibinder.test.client"
+ >
+ <test:SimpleRenderable ui:field="widget">Tip-top level renderable</test:SimpleRenderable>
+</ui:UiBinder>
diff --git a/user/test/com/google/gwt/uibinder/test/client/IsRenderableIntegrationTest.java b/user/test/com/google/gwt/uibinder/test/client/IsRenderableIntegrationTest.java
new file mode 100644
index 0000000..9de281b
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/IsRenderableIntegrationTest.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.test.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.DivElement;
+import com.google.gwt.event.logical.shared.ValueChangeEvent;
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.IsRenderable;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.PotentialElement;
+import com.google.gwt.user.client.ui.RenderablePanel;
+import com.google.gwt.user.client.ui.RootPanel;
+
+/**
+ * Integration test for {@link com.google.gwt.user.client.ui.IsRenderable
+ * IsRenderable}.
+ */
+public class IsRenderableIntegrationTest extends GWTTestCase {
+ static class Deep {
+ interface Binder extends UiBinder<IsRenderable, Deep> {
+ }
+
+ static final Binder binder = GWT.create(Binder.class);
+
+ @UiField
+ RenderablePanel top;
+ @UiField
+ DivElement outerDiv;
+ @UiField
+ DivElement innerDiv;
+ @UiField
+ SimpleRenderable outerRenderable;
+ @UiField
+ Label outerLabel;
+ @UiField
+ Label innerLabel;
+ @UiField
+ SimpleRenderable innerRenderable;
+ @UiField
+ Image outerI18nImage;
+ @UiField
+ Image innerI18nImage;
+ @UiField
+ RenderableComposite outerComposite;
+ @UiField
+ RenderableComposite innerComposite;
+
+ Object receivedValue;
+
+ Deep() {
+ binder.createAndBindUi(this);
+ }
+
+ @UiHandler("outerRenderable")
+ void onValueChange(ValueChangeEvent<Object> event) {
+ receivedValue = event.getValue();
+ }
+ }
+
+ static class Shallow {
+ interface Binder extends UiBinder<IsRenderable, Shallow> {
+ }
+
+ static final Binder binder = GWT.create(Binder.class);
+
+ @UiField
+ SimpleRenderable widget;
+
+ Shallow() {
+ binder.createAndBindUi(this);
+ }
+ }
+
+ @Override
+ public String getModuleName() {
+ return "com.google.gwt.uibinder.test.LazyWidgetBuilderSuite";
+ }
+
+ public void testDeep() {
+ Deep deep = new Deep();
+ assertTrue(PotentialElement.isPotential(deep.top.getElement()));
+ assertTrue(PotentialElement.isPotential(deep.outerRenderable.getElement()));
+ assertTrue(PotentialElement.isPotential(deep.innerRenderable.getElement()));
+
+ /*
+ * This is pretty surprising. I don't think it's a good idea to be filling
+ * in the owner's fields at some arbitrary later date. I doubt it's a real
+ * speed up, since the things will still have to be instantiated before the
+ * user sees them, and it seems guaranteed to be a source of confusion.
+ *
+ * Hmm. What keeps the object that fills in the the fields at attach time
+ * from being gc'd? And are we sure it's not leaking?
+ *
+ * Although I suppose we have no choice with dom children. Interesting
+ * problem.
+ */
+ assertNull(deep.outerI18nImage);
+ assertNull(deep.innerI18nImage);
+ assertNull(deep.outerLabel);
+ assertNull(deep.innerLabel);
+ assertNull(deep.innerLabel);
+ assertNull(deep.outerDiv);
+ assertNull(deep.innerDiv);
+
+ // Oh dear, we're not even consistent about it. That means the above is a
+ // bug, period.
+ assertNotNull(deep.outerComposite);
+ assertNotNull(deep.innerComposite);
+ assertTrue(PotentialElement.isPotential(deep.outerComposite.getWidget().getElement()));
+ assertTrue(PotentialElement.isPotential(deep.innerComposite.getWidget().getElement()));
+
+ try {
+ RootPanel.get().add(deep.top);
+
+ assertEquals("Outer div", deep.outerDiv.getInnerText());
+ assertEquals("Inner div", deep.innerDiv.getInnerText());
+
+ assertEquals("[string built]Outer renderable",
+ deep.outerRenderable.getElement().getInnerText());
+ assertEquals("[string built]Inner renderable",
+ deep.innerRenderable.getElement().getInnerText());
+
+ assertNotNull(deep.outerI18nImage);
+ assertNotNull(deep.innerI18nImage);
+
+ assertEquals("Outer label", deep.outerLabel.getText());
+ assertEquals("Inner label", deep.innerLabel.getText());
+
+ assertEquals("[string built]Renderable",
+ deep.outerComposite.getWidget().getElement().getInnerText());
+ assertEquals("[string built]Renderable",
+ deep.innerComposite.getWidget().getElement().getInnerText());
+
+ // Test event handling. It is cool as hell that this works!
+ deep.outerRenderable.setValue("foo");
+ assertEquals("foo", deep.receivedValue);
+
+ /*
+ * This is really a test of SimpleRenderable itself, but what the hell.
+ * That class might be useful some day.
+ */
+ deep.outerRenderable.setText("fnord");
+ assertEquals("[updated]fnord", deep.outerRenderable.getElement().getInnerText());
+
+ } finally {
+ deep.top.removeFromParent();
+ }
+ }
+
+ public void testLegacyComposite() {
+ LegacyComposite legacyComposite = new LegacyComposite();
+ assertEquals("span", legacyComposite.span.getInnerText());
+ }
+
+ public void testNestedRenderableComposite() {
+ RenderableComposite.Meta meta = new RenderableComposite.Meta();
+ assertTrue(PotentialElement.isPotential(meta.getElement()));
+
+ try {
+ RootPanel.get().add(meta);
+ assertEquals("[dom built]Renderable",
+ meta.getWidget().getElement().getInnerText());
+ } finally {
+ meta.removeFromParent();
+ }
+ }
+
+ public void testRenderableComposite() {
+ RenderableComposite renderableComposite = new RenderableComposite();
+ assertTrue(PotentialElement.isPotential(renderableComposite.getElement()));
+
+ // TODO(rdcastro) This results in an NPE
+ // assertEquals("something useful", renderableComposite.toString());
+
+ try {
+ RootPanel.get().add(renderableComposite);
+ assertEquals("[dom built]Renderable",
+ renderableComposite.getWidget().getElement().getInnerText());
+ } finally {
+ renderableComposite.removeFromParent();
+ }
+ }
+
+
+ public void testShallow() {
+ Shallow shallow = new Shallow();
+ assertTrue(PotentialElement.isPotential(shallow.widget.getElement()));
+ try {
+ RootPanel.get().add(shallow.widget);
+ assertEquals("[dom built]" + shallow.widget.getText(),
+ shallow.widget.getElement().getInnerText());
+ } finally {
+ shallow.widget.removeFromParent();
+ }
+ }
+}
diff --git a/user/test/com/google/gwt/uibinder/test/client/LegacyComposite.java b/user/test/com/google/gwt/uibinder/test/client/LegacyComposite.java
new file mode 100644
index 0000000..b677d5a
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/LegacyComposite.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.test.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.SpanElement;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * Used by {@link IsRenderableIntegrationTest}.
+ */
+public class LegacyComposite extends Composite {
+ interface Binder extends UiBinder<Widget, LegacyComposite> {
+ }
+ private static final Binder BINDER = GWT.create(Binder.class);
+
+ @UiField SpanElement span;
+
+ public LegacyComposite() {
+ initWidget(BINDER.createAndBindUi(this));
+ }
+
+ @Override
+ public Widget getWidget() {
+ return super.getWidget();
+ }
+}
\ No newline at end of file
diff --git a/user/test/com/google/gwt/uibinder/test/client/LegacyComposite.ui.xml b/user/test/com/google/gwt/uibinder/test/client/LegacyComposite.ui.xml
new file mode 100644
index 0000000..20d1071
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/LegacyComposite.ui.xml
@@ -0,0 +1,19 @@
+<!-- -->
+<!-- Copyright 2011 Google Inc. -->
+<!-- Licensed under the Apache License, Version 2.0 (the "License"); you -->
+<!-- may not use this file except in compliance with the License. You may -->
+<!-- may obtain a copy of the License at -->
+<!-- -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0 -->
+<!-- -->
+<!-- Unless required by applicable law or agreed to in writing, software -->
+<!-- distributed under the License is distributed on an "AS IS" BASIS, -->
+<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -->
+<!-- implied. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<ui:UiBinder
+ xmlns:ui="urn:ui:com.google.gwt.uibinder"
+ xmlns:gwt="urn:import:com.google.gwt.user.client.ui"
+ >
+ <gwt:HTML>When does this <span ui:field='span'>span</span> get filled?</gwt:HTML>
+</ui:UiBinder>
diff --git a/user/test/com/google/gwt/uibinder/test/client/RenderableComposite.java b/user/test/com/google/gwt/uibinder/test/client/RenderableComposite.java
new file mode 100644
index 0000000..125d482
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/RenderableComposite.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.test.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * Used by {@link IsRenderableIntegrationTest}.
+ */
+public class RenderableComposite extends Composite {
+ interface Binder extends UiBinder<Widget, RenderableComposite> {
+ }
+ private static final Binder BINDER = GWT.create(Binder.class);
+
+ static class Meta extends Composite {
+ Meta() {
+ initWidget(new RenderableComposite());
+ }
+ @Override
+ public Widget getWidget() {
+ return super.getWidget();
+ }
+ }
+
+ public RenderableComposite() {
+ initWidget(BINDER.createAndBindUi(this));
+ }
+
+ @Override
+ public Widget getWidget() {
+ return super.getWidget();
+ }
+}
diff --git a/user/test/com/google/gwt/uibinder/test/client/RenderableComposite.ui.xml b/user/test/com/google/gwt/uibinder/test/client/RenderableComposite.ui.xml
new file mode 100644
index 0000000..ce33402
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/RenderableComposite.ui.xml
@@ -0,0 +1,20 @@
+<!-- -->
+<!-- Copyright 2011 Google Inc. -->
+<!-- Licensed under the Apache License, Version 2.0 (the "License"); you -->
+<!-- may not use this file except in compliance with the License. You may -->
+<!-- may obtain a copy of the License at -->
+<!-- -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0 -->
+<!-- -->
+<!-- Unless required by applicable law or agreed to in writing, software -->
+<!-- distributed under the License is distributed on an "AS IS" BASIS, -->
+<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -->
+<!-- implied. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<ui:UiBinder
+ xmlns:ui="urn:ui:com.google.gwt.uibinder"
+ xmlns:gwt="urn:import:com.google.gwt.user.client.ui"
+ xmlns:test="urn:import:com.google.gwt.uibinder.test.client"
+ >
+ <test:SimpleRenderable>Renderable</test:SimpleRenderable>
+</ui:UiBinder>
diff --git a/user/test/com/google/gwt/uibinder/test/client/SimpleRenderable.java b/user/test/com/google/gwt/uibinder/test/client/SimpleRenderable.java
new file mode 100644
index 0000000..de8fc30
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/SimpleRenderable.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.test.client;
+
+import com.google.gwt.dom.builder.client.DomBuilderFactory;
+import com.google.gwt.dom.builder.shared.DivBuilder;
+import com.google.gwt.dom.builder.shared.ElementBuilderBase;
+import com.google.gwt.dom.builder.shared.ElementBuilderFactory;
+import com.google.gwt.dom.builder.shared.HtmlBuilderFactory;
+import com.google.gwt.dom.builder.shared.HtmlElementBuilderBase;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.event.logical.shared.ValueChangeEvent;
+import com.google.gwt.event.logical.shared.ValueChangeHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.safehtml.shared.SafeHtml;
+import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+import com.google.gwt.user.client.ui.HasText;
+import com.google.gwt.user.client.ui.HasValue;
+import com.google.gwt.user.client.ui.IsRenderable;
+import com.google.gwt.user.client.ui.PotentialElement;
+import com.google.gwt.user.client.ui.RenderableStamper;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * Used by {@link IsRenderableIntegrationTest}. A simple implementation of
+ * IsRenderable. Note that the actual building for both string based and dom
+ * based versions happens in one place, {@link #build(ElementBuilderFactory)}.
+ * <p>
+ * Note also that that the widget's contents are simply re-rendered when the
+ * widget's state changes, in this case in {@link #setText}. This is a bad idea
+ * for large widgets, but for little leaf widgets like this one is probably just
+ * fine.
+ * <p>
+ * It would probably be a good refactor a production super class out of this
+ * once the IsRenderable interface settles down.
+ * <p>
+ * It's HasValue aspect is just meant for unit testing, not anything to
+ * generalize.
+ */
+public class SimpleRenderable extends Widget implements IsRenderable, HasText, HasValue<Object> {
+
+ private String text = "";
+ private Object value;
+
+ public SimpleRenderable() {
+ setElement(PotentialElement.build(this));
+ }
+
+ @Override
+ public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Object> handler) {
+ return addHandler(handler, ValueChangeEvent.getType());
+ }
+
+ @Override
+ public void claimElement(Element element) {
+ setElement(element);
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ @Override
+ public Object getValue() {
+ return value;
+ }
+
+ @Override
+ public void initializeClaimedElement() {
+ }
+
+ @Override
+ public SafeHtml render(RenderableStamper stamper) {
+ HtmlBuilderFactory factory = HtmlBuilderFactory.get();
+ String realText = text;
+ text = "[string built]" + text;
+ HtmlElementBuilderBase<?> builder = (HtmlElementBuilderBase<?>) build(factory);
+ text = realText;
+ return stamper.stamp(builder.asSafeHtml());
+ }
+
+ @Override
+ public void render(RenderableStamper stamper, SafeHtmlBuilder safeHtmlBuilder) {
+ safeHtmlBuilder.append(render(stamper));
+ }
+
+ @Override
+ public Element resolvePotentialElement() {
+ String realText = text;
+ text = "[dom built]" + text;
+ ElementBuilderBase<?> builder = build(DomBuilderFactory.get());
+ text = realText;
+ setElement(builder.finish());
+ return getElement();
+ }
+
+ @Override
+ public void setText(String text) {
+ this.text = text;
+ updateElement();
+ }
+
+ @Override
+ public void setValue(Object value) {
+ setValue(value, false);
+ }
+
+ @Override
+ public void setValue(Object newValue, boolean fireEvents) {
+ Object oldValue = value;
+ value = newValue;
+ ValueChangeEvent.fireIfNotEqual(this, oldValue, newValue);
+ }
+
+ private ElementBuilderBase<?> build(ElementBuilderFactory factory) {
+ DivBuilder builder = factory.createDivBuilder();
+ builder.text(text).end();
+ return builder;
+ }
+
+ private boolean domIsReal() {
+ return !PotentialElement.isPotential(getElement());
+ }
+
+ private void updateElement() {
+ if (domIsReal()) {
+ String realText = text;
+ text = "[updated]" + text;
+ /*
+ * Sleazey. If this is to get real, should split rendering into the outer
+ * builder and the inner builder. Update can just call the inner builder.
+ * But we'd still have to make a bunch of dom calls to tear down the old
+ * guts, something like while (el.firstChild) {
+ * el.removeChild(el.firstChild); }
+ *
+ * Have to wonder if that actually would be any faster than rebuilding the
+ * guts as string
+ */
+ ElementBuilderBase<?> builder = build(DomBuilderFactory.get());
+ getElement().setInnerHTML(builder.finish().getInnerHTML());
+ text = realText;
+ }
+ }
+}