From 1d56b4e5fb9df13c106256cfc6eb6ee534b1ea96 Mon Sep 17 00:00:00 2001 From: Joonas Lehtinen Date: Thu, 14 Jun 2007 11:33:12 +0000 Subject: [PATCH] New component replacement method, split orderedlayout to horizontal and vertical layouts, groundwork for caption delegation to layouts svn changeset:1714/svn branch:trunk --- .../terminal/gwt/client/CaptionWrapper.java | 43 +++++++++++++ .../toolkit/terminal/gwt/client/Client.java | 22 ++++--- .../gwt/client/DefaultWidgetFactory.java | 24 ++++++-- .../terminal/gwt/client/WidgetFactory.java | 4 +- .../terminal/gwt/client/ui/TkButton.java | 34 ++++++----- .../terminal/gwt/client/ui/TkCheckBox.java | 15 +++-- .../gwt/client/ui/TkHorizontalLayout.java | 50 +++++++++++++++ .../gwt/client/ui/TkOrderedLayout.java | 61 ------------------- .../gwt/client/ui/TkVerticalLayout.java | 50 +++++++++++++++ 9 files changed, 204 insertions(+), 99 deletions(-) create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/CaptionWrapper.java create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/TkHorizontalLayout.java delete mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/TkOrderedLayout.java create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/TkVerticalLayout.java diff --git a/src/com/itmill/toolkit/terminal/gwt/client/CaptionWrapper.java b/src/com/itmill/toolkit/terminal/gwt/client/CaptionWrapper.java new file mode 100644 index 0000000000..dfe72bbf7d --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/CaptionWrapper.java @@ -0,0 +1,43 @@ +package com.itmill.toolkit.terminal.gwt.client; + +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +public class CaptionWrapper extends VerticalPanel { + + Label caption; + Widget widget; + + public CaptionWrapper(Widget toBeWrapped) { + widget = toBeWrapped; + add(widget); + } + + public void updateCaption(UIDL uidl) { + String c = uidl.getStringAttribute("caption"); + // TODO Description and error messages + if (c == null) { + if (caption == null) return; + remove(caption); + caption = null; + } else { + if (caption == null) { + caption = new Label(c); + insert(caption, 0); + } + else + caption.setText(c); + } + } + + public static boolean isNeeded(UIDL uidl) { + if (uidl.getStringAttribute("caption") != null) return true; + // TODO Description and error messages + return false; + } + + public Widget getWidget() { + return widget; + } +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/Client.java b/src/com/itmill/toolkit/terminal/gwt/client/Client.java index d5102b47cc..b03ac55cf1 100755 --- a/src/com/itmill/toolkit/terminal/gwt/client/Client.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/Client.java @@ -81,7 +81,7 @@ public class Client implements EntryPoint { private void makeUidlRequest(String requestData) { console.log("Making UIDL Request with params: " + requestData); rb = new RequestBuilder(RequestBuilder.GET, appUri - + "/UIDL/?requestId=" + (++requestCount) + "&" + requestData); + + "/UIDL/?requestId=" + (Math.random()) + "&" + requestData); try { rb.sendRequest(requestData, new RequestCallback() { public void onError(Request request, Throwable exception) { @@ -150,7 +150,7 @@ public class Client implements EntryPoint { } public Widget createWidgetFromUIDL(UIDL uidlForChild) { - Widget w = widgetFactory.createWidget(uidlForChild, null); + Widget w = widgetFactory.createWidget(uidlForChild); if (w instanceof Paintable) { registerPaintable(uidlForChild.getId(), (Paintable) w); ((Paintable)w).updateFromUIDL(uidlForChild, this); @@ -226,15 +226,21 @@ public class Client implements EntryPoint { public void setWidgetFactory(WidgetFactory widgetFactory) { this.widgetFactory = widgetFactory; } - - public void repaintComponent(Widget component, UIDL uidl) { + + public static Layout getParentLayout(Widget component) { Widget parent = component.getParent(); while (parent != null && !(parent instanceof Layout)) parent = parent.getParent(); - if (parent != null && ((Layout)parent).hasChildComponent(component)) { - ((Layout) parent).replaceChildComponent(component,createWidgetFromUIDL(uidl)); - } - + if (parent != null && ((Layout)parent).hasChildComponent(component)) + return (Layout) parent; + return null; } + public boolean replaceComponentWithCorrectImplementation(Widget currentWidget, UIDL uidl) { + if (widgetFactory.isCorrectImplementation(currentWidget, uidl)) return false; + Layout parent = getParentLayout(currentWidget); + if (parent == null) return false; + parent.replaceChildComponent(currentWidget, createWidgetFromUIDL(uidl)); + return true; + } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java index 74b149b8ce..ecb50865ac 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java @@ -1,12 +1,14 @@ package com.itmill.toolkit.terminal.gwt.client; +import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ui.TkButton; import com.itmill.toolkit.terminal.gwt.client.ui.TkCheckBox; import com.itmill.toolkit.terminal.gwt.client.ui.TkEmbedded; import com.itmill.toolkit.terminal.gwt.client.ui.TkGridLayout; +import com.itmill.toolkit.terminal.gwt.client.ui.TkHorizontalLayout; import com.itmill.toolkit.terminal.gwt.client.ui.TkLabel; -import com.itmill.toolkit.terminal.gwt.client.ui.TkOrderedLayout; +import com.itmill.toolkit.terminal.gwt.client.ui.TkVerticalLayout; import com.itmill.toolkit.terminal.gwt.client.ui.TkPanel; import com.itmill.toolkit.terminal.gwt.client.ui.TkSelect; import com.itmill.toolkit.terminal.gwt.client.ui.TkTable; @@ -18,19 +20,23 @@ import com.itmill.toolkit.terminal.gwt.client.ui.TkWindow; public class DefaultWidgetFactory implements WidgetFactory { - public Widget createWidget(UIDL uidl, String theme) { + public Widget createWidget(UIDL uidl) { String tag = uidl.getTag(); - - if ("button".equals(tag)){ + + if ("button".equals(tag)) { if ("switch".equals(uidl.getStringAttribute("type"))) return new TkCheckBox(); return new TkButton(); } if ("window".equals(tag)) return new TkWindow(); - if ("orderedlayout".equals(tag)) - return new TkOrderedLayout(); + if ("orderedlayout".equals(tag)) { + if ("horizontal".equals(uidl.getStringAttribute("orientation"))) + return new TkHorizontalLayout(); + else + return new TkVerticalLayout(); + } if ("label".equals(tag)) return new TkLabel(); if ("gridlayout".equals(tag)) @@ -53,4 +59,10 @@ public class DefaultWidgetFactory implements WidgetFactory { return new TkUnknownComponent(); } + public boolean isCorrectImplementation(Widget currentWidget, UIDL uidl) { + + // TODO This implementation should be optimized + return GWT.getTypeName(currentWidget).equals(GWT.getTypeName(createWidget(uidl))); + } + } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/WidgetFactory.java b/src/com/itmill/toolkit/terminal/gwt/client/WidgetFactory.java index a9f52525fa..b4a32c4059 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/WidgetFactory.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/WidgetFactory.java @@ -4,6 +4,8 @@ import com.google.gwt.user.client.ui.Widget; public interface WidgetFactory { - Widget createWidget(UIDL uidl, String theme); + Widget createWidget(UIDL uidl); + + boolean isCorrectImplementation(Widget currentWidget, UIDL uidl); } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkButton.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkButton.java index 187b29f093..45d0f6864f 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkButton.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkButton.java @@ -7,33 +7,37 @@ import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; public class TkButton extends com.google.gwt.user.client.ui.Button implements - Paintable, ClickListener { + Paintable { String id; Client client; public TkButton() { - addClickListener(this); + addClickListener(new ClickListener() { + + public void onClick(Widget sender) { + if (id == null || client == null) + return; + client.updateVariable(id, "state", true, true); + } + }); } public void updateFromUIDL(UIDL uidl, Client client) { - if (uidl.getStringAttribute("type") != null) { - if (this.client != null) - client.repaintComponent(this, uidl); - else - throw new IllegalStateException( - "Can not paint button of type: " - + uidl.getStringAttribute("type")); - } + + // Ensure correct implementation + if (client.replaceComponentWithCorrectImplementation(this, uidl)) + return; + + // Save details this.client = client; id = uidl.getId(); + + // Set text setText(uidl.getStringAttribute("caption")); - } - public void onClick(Widget sender) { - if (id == null || client == null) - return; - client.updateVariable(id, "state", true, true); + // TODO Handle description and errormessages } + } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkCheckBox.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkCheckBox.java index df8b1671f8..1e91dbc050 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkCheckBox.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkCheckBox.java @@ -28,17 +28,16 @@ public class TkCheckBox extends com.google.gwt.user.client.ui.CheckBox } public void updateFromUIDL(UIDL uidl, Client client) { - if (!"switch".equals(uidl.getStringAttribute("type"))) { - if (this.client != null) - client.repaintComponent(this, uidl); - else - throw new IllegalStateException( - "Can not paint button of type: " - + uidl.getStringAttribute("type")); - } + + // Ensure correct implementation + if (client.replaceComponentWithCorrectImplementation(this, uidl)) + return; + // Save details this.client = client; id = uidl.getId(); + + // Set text setText(uidl.getStringAttribute("caption")); setChecked(uidl.getBooleanVariable("state")); immediate = uidl.getBooleanAttribute("immediate"); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkHorizontalLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkHorizontalLayout.java new file mode 100644 index 0000000000..47ee39fad7 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkHorizontalLayout.java @@ -0,0 +1,50 @@ +package com.itmill.toolkit.terminal.gwt.client.ui; + +import java.util.Iterator; + +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.itmill.toolkit.terminal.gwt.client.Client; +import com.itmill.toolkit.terminal.gwt.client.Layout; +import com.itmill.toolkit.terminal.gwt.client.Paintable; +import com.itmill.toolkit.terminal.gwt.client.UIDL; + +public class TkHorizontalLayout extends HorizontalPanel implements Paintable, Layout { + + public void updateFromUIDL(UIDL uidl, Client client) { + +// Ensure correct implementation + if (client.replaceComponentWithCorrectImplementation(this, uidl)) + return; + + // TODO Should update instead of just redraw + clear(); + + for (Iterator i = uidl.getChildIterator(); i.hasNext();) { + UIDL uidlForChild = (UIDL) i.next(); + Widget child = client.createWidgetFromUIDL(uidlForChild); + add(child); + } + } + + public void replaceChildComponent(Widget from, Widget to) { + int index = getWidgetIndex(from); + if (index >= 0) { + remove(index); + insert(to, index); + } + } + + public boolean hasChildComponent(Widget paintable) { + return getWidgetIndex(paintable) >= 0; + } + + public boolean updateCaption(Widget component, UIDL uidl) { + + if (!hasChildComponent(component) || uidl == null) return false; + + + return false; + } + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkOrderedLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkOrderedLayout.java deleted file mode 100644 index 876baee612..0000000000 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkOrderedLayout.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.itmill.toolkit.terminal.gwt.client.ui; - -import java.util.Iterator; - -import com.google.gwt.user.client.ui.CellPanel; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.IndexedPanel; -import com.google.gwt.user.client.ui.Panel; -import com.google.gwt.user.client.ui.SimplePanel; -import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.user.client.ui.Widget; -import com.google.gwt.user.client.ui.WidgetCollection; -import com.itmill.toolkit.terminal.gwt.client.Client; -import com.itmill.toolkit.terminal.gwt.client.Layout; -import com.itmill.toolkit.terminal.gwt.client.Paintable; -import com.itmill.toolkit.terminal.gwt.client.UIDL; - -public class TkOrderedLayout extends Composite implements Paintable, Layout { - - SimplePanel container = new SimplePanel(); - - IndexedPanel panel; - - public TkOrderedLayout() { - initWidget(container); - } - - public void updateFromUIDL(UIDL uidl, Client client) { - container.clear(); - - if ("horizontal".equals(uidl.getStringAttribute("orientation"))) - panel = new HorizontalPanel(); - else - panel = new VerticalPanel(); - - container.add((Panel) panel); - - for (Iterator i = uidl.getChildIterator(); i.hasNext();) { - UIDL uidlForChild = (UIDL) i.next(); - Widget child = client.createWidgetFromUIDL(uidlForChild); - ((Panel) panel).add(child); - } - } - - public void replaceChildComponent(Widget from, Widget to) { - int index = panel.getWidgetIndex(from); - if (index >= 0) { - panel.remove(index); - if (panel instanceof HorizontalPanel) - ((HorizontalPanel) panel).insert(to, index); - else - ((VerticalPanel) panel).insert(to, index); - } - } - - public boolean hasChildComponent(Widget paintable) { - return panel.getWidgetIndex(paintable) >= 0; - } - -} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkVerticalLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkVerticalLayout.java new file mode 100644 index 0000000000..e61f1b0fa1 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkVerticalLayout.java @@ -0,0 +1,50 @@ +package com.itmill.toolkit.terminal.gwt.client.ui; + +import java.util.Iterator; + +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.itmill.toolkit.terminal.gwt.client.Client; +import com.itmill.toolkit.terminal.gwt.client.Layout; +import com.itmill.toolkit.terminal.gwt.client.Paintable; +import com.itmill.toolkit.terminal.gwt.client.UIDL; + +public class TkVerticalLayout extends VerticalPanel implements Paintable, Layout { + + public void updateFromUIDL(UIDL uidl, Client client) { + +// Ensure correct implementation + if (client.replaceComponentWithCorrectImplementation(this, uidl)) + return; + + // TODO Should update instead of just redraw + clear(); + + for (Iterator i = uidl.getChildIterator(); i.hasNext();) { + UIDL uidlForChild = (UIDL) i.next(); + Widget child = client.createWidgetFromUIDL(uidlForChild); + add(child); + } + } + + public void replaceChildComponent(Widget from, Widget to) { + int index = getWidgetIndex(from); + if (index >= 0) { + remove(index); + insert(to, index); + } + } + + public boolean hasChildComponent(Widget paintable) { + return getWidgetIndex(paintable) >= 0; + } + + public boolean updateCaption(Widget component, UIDL uidl) { + + if (!hasChildComponent(component) || uidl == null) return false; + + + return false; + } + +} -- 2.39.5