]> source.dussan.org Git - vaadin-framework.git/commitdiff
New component replacement method, split orderedlayout to horizontal and vertical...
authorJoonas Lehtinen <joonas.lehtinen@itmill.com>
Thu, 14 Jun 2007 11:33:12 +0000 (11:33 +0000)
committerJoonas Lehtinen <joonas.lehtinen@itmill.com>
Thu, 14 Jun 2007 11:33:12 +0000 (11:33 +0000)
svn changeset:1714/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/CaptionWrapper.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/Client.java
src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java
src/com/itmill/toolkit/terminal/gwt/client/WidgetFactory.java
src/com/itmill/toolkit/terminal/gwt/client/ui/TkButton.java
src/com/itmill/toolkit/terminal/gwt/client/ui/TkCheckBox.java
src/com/itmill/toolkit/terminal/gwt/client/ui/TkHorizontalLayout.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/TkOrderedLayout.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ui/TkVerticalLayout.java [new file with mode: 0644]

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 (file)
index 0000000..dfe72bb
--- /dev/null
@@ -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;
+       }
+}
index d5102b47ccc88bcb4fc631206438a74d58f7c16b..b03ac55cf1dc069df135b67b5bbd53f4f9d87b7d 100755 (executable)
@@ -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;
+       }
 
 }
index 74b149b8ce3ac8c06116f20a7e3f3feaa448543b..ecb50865ac8c9be47b0e60a6e6178c5dd05e623d 100644 (file)
@@ -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)));
+       }
+
 }
index a9f52525faef901ebec1d78d9a1ca2f66d813ba1..b4a32c4059810ea5423aec5cc8fc8764353ee74d 100644 (file)
@@ -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);
        
 }
index 187b29f0930ac64985e30ce19233938e4795de38..45d0f6864f38ea95d6a97e3cac597d89f511b1d4 100644 (file)
@@ -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
        }
+
 }
index df8b1671f8c7c6978294fa58a66daa8f160e536c..1e91dbc0505c3d8996a225bc30b983136b1feba0 100644 (file)
@@ -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 (file)
index 0000000..47ee39f
--- /dev/null
@@ -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 (file)
index 876baee..0000000
+++ /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 (file)
index 0000000..e61f1b0
--- /dev/null
@@ -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;
+       }
+
+}