@@ -1,5 +1,7 @@ | |||
package com.itmill.toolkit.terminal.gwt.client; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.Component; | |||
public class BooleanVariable extends Variable { | |||
private boolean value = true; | |||
@@ -9,7 +11,7 @@ public class BooleanVariable extends Variable { | |||
} | |||
void update() { | |||
public void update() { | |||
owner.getClient().updateVariable(this); | |||
if(immediate) | |||
owner.getClient().flushVariables(); |
@@ -15,6 +15,7 @@ import com.google.gwt.xml.client.Document; | |||
import com.google.gwt.xml.client.Node; | |||
import com.google.gwt.xml.client.NodeList; | |||
import com.google.gwt.xml.client.XMLParser; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.Component; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.RootWindow; | |||
/** |
@@ -1,178 +0,0 @@ | |||
package com.itmill.toolkit.terminal.gwt.client; | |||
import java.util.HashMap; | |||
import java.util.Vector; | |||
import com.google.gwt.core.client.EntryPoint; | |||
import com.google.gwt.http.client.Request; | |||
import com.google.gwt.http.client.RequestBuilder; | |||
import com.google.gwt.http.client.RequestCallback; | |||
import com.google.gwt.http.client.RequestException; | |||
import com.google.gwt.http.client.Response; | |||
import com.google.gwt.http.client.URL; | |||
import com.google.gwt.user.client.ui.RootPanel; | |||
import com.google.gwt.xml.client.Document; | |||
import com.google.gwt.xml.client.Node; | |||
import com.google.gwt.xml.client.NodeList; | |||
import com.google.gwt.xml.client.XMLParser; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.RootWindow; | |||
/** | |||
* Entry point classes define <code>onModuleLoad()</code>. | |||
*/ | |||
public class GwtClient implements EntryPoint { | |||
private String appUri = "http://localhost:8080/tk/HelloWorld"; | |||
// TODO remove repaintAll things start to pile up | |||
private RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, appUri + "/UIDL/?repaintAll=1&"); | |||
private Console console; | |||
private RootWindow rw; | |||
private Vector pendingVariables = new Vector(); | |||
private HashMap components = new HashMap(); | |||
private int requestCount = 0; | |||
private LegacyClientWrapper lClient; | |||
/** | |||
* This is the entry point method. | |||
*/ | |||
public void onModuleLoad() { | |||
console = new Console(RootPanel.get("itmtk-loki")); | |||
console.log("muutos"); | |||
console.log("Starting app"); | |||
console.log("Makin fake UIDL Request to fool servlet of an app init"); | |||
RequestBuilder rb2 = new RequestBuilder(RequestBuilder.GET, appUri); | |||
try { | |||
rb2.sendRequest("", new RequestCallback() { | |||
public void onResponseReceived(Request request, Response response) { | |||
console.log("Got fake response... sending initial UIDL request"); | |||
makeUidlRequest("repaintAll=1"); | |||
} | |||
public void onError(Request request, Throwable exception) { | |||
// TODO Auto-generated method stub | |||
} | |||
}); | |||
} catch (RequestException e1) { | |||
// TODO Auto-generated catch block | |||
e1.printStackTrace(); | |||
} | |||
} | |||
private void makeUidlRequest(String requestData) { | |||
console.log("Making UIDL Request"); | |||
rb = new RequestBuilder(RequestBuilder.GET, appUri + "/UIDL/?requestId=" + (++requestCount) + "&" + requestData); | |||
try { | |||
rb.sendRequest(requestData, new RequestCallback() { | |||
public void onError(Request request, Throwable exception) { | |||
console.error("Got error"); | |||
} | |||
public void onResponseReceived(Request request, Response response) { | |||
console.log("Got response:"); | |||
Document doc = XMLParser.parse(response.getText()); | |||
console.log(doc.toString()); | |||
handleUIDL(doc); | |||
} | |||
}); | |||
console.log("Request sent"); | |||
} catch (RequestException e) { | |||
console.error(e.getMessage()); | |||
} | |||
} | |||
private void handleUIDL(Document doc) { | |||
NodeList changes = doc.getElementsByTagName("change"); | |||
for(int i = 0; i < changes.getLength(); i++) { | |||
applyChange(changes.item(i).getFirstChild()); | |||
} | |||
} | |||
private void applyChange(Node n) { | |||
if(n.getNodeName().equals("window")) { | |||
console.log("Rendering main window"); | |||
rw = new RootWindow(n, this); | |||
rw.setClient(this); | |||
} else { | |||
int pid = Component.getIdFromUidl(n); | |||
console.log("Updating node: " + n.getNodeName() + ", PID:"+pid); | |||
Component c = getPaintable(pid); | |||
c.updateFromUidl(n); | |||
} | |||
} | |||
/** | |||
* Queues a changed variable to be sent to server | |||
* | |||
* @param variable | |||
*/ | |||
public void updateVariable(Variable variable) { | |||
// remove variable first so we will maintain the correct order (in case of "double change") | |||
pendingVariables.remove(variable); | |||
pendingVariables.add(variable); | |||
} | |||
/** | |||
* Sends queued variables to server | |||
* | |||
*/ | |||
public void flushVariables() { | |||
StringBuffer sb = new StringBuffer(); | |||
int i = 0; | |||
while (!pendingVariables.isEmpty()) { | |||
Variable v = (Variable) pendingVariables.lastElement(); | |||
pendingVariables.removeElement(v); | |||
if (i > 0) { | |||
sb.append("&"); | |||
} | |||
// encode the characters in the name | |||
String encodedName = URL.encodeComponent(v.getId()); | |||
sb.append(encodedName); | |||
sb.append("="); | |||
// encode the characters in the value | |||
String encodedValue = URL.encodeComponent(v.getEncodedValue()); | |||
sb.append(encodedValue); | |||
} | |||
String buf = sb.toString(); | |||
console.log("Making following request to server:"); | |||
console.log(buf); | |||
makeUidlRequest(buf); | |||
} | |||
public void registerComponent(Component component) { | |||
components.put(""+component.getId(), component ); | |||
} | |||
public Component getPaintable(int pid) { | |||
return (Component) components.get(""+pid); | |||
} | |||
public LegacyClientWrapper getLegacyClient() { | |||
if(lClient == null) | |||
lClient = new LegacyClientWrapper(); | |||
return lClient; | |||
} | |||
} | |||
@@ -1,5 +1,7 @@ | |||
package com.itmill.toolkit.terminal.gwt.client; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.Component; | |||
public abstract class Variable { | |||
protected Component owner; |
@@ -5,6 +5,7 @@ import java.util.HashMap; | |||
import com.google.gwt.xml.client.NamedNodeMap; | |||
import com.google.gwt.xml.client.Node; | |||
import com.google.gwt.xml.client.NodeList; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.Component; | |||
public class VariableFactory { | |||
@@ -1,22 +1,16 @@ | |||
package com.itmill.toolkit.terminal.gwt.client; | |||
package com.itmill.toolkit.terminal.gwt.client.ui; | |||
import com.google.gwt.user.client.ui.Widget; | |||
import com.google.gwt.xml.client.Node; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.ContainerComponent; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.TkButton; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.TkLabel; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.TkLegacyComponent; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.TkOrderedLayout; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.TkTextField; | |||
import com.itmill.toolkit.terminal.gwt.client.ui.TkUnknown; | |||
import com.itmill.toolkit.terminal.gwt.client.Client; | |||
public abstract class Component { | |||
private ContainerComponent parent; | |||
protected GwtClient client; | |||
protected Client client; | |||
private final int id; | |||
public Component(int id, GwtClient c) { | |||
public Component(int id, Client c) { | |||
client = c; | |||
this.id = id; | |||
} | |||
@@ -36,7 +30,7 @@ public abstract class Component { | |||
return false; | |||
} | |||
public static Component createComponent(Node uidl, GwtClient cli) { | |||
public static Component createComponent(Node uidl, Client cli) { | |||
Component c = null; | |||
String nodeName = uidl.getNodeName(); | |||
if(nodeName.equals("label")) { | |||
@@ -65,7 +59,7 @@ public abstract class Component { | |||
return parent; | |||
} | |||
public GwtClient getClient() { | |||
public Client getClient() { | |||
if(client == null) | |||
client = parent.getClient(); | |||
return client; |
@@ -2,18 +2,17 @@ package com.itmill.toolkit.terminal.gwt.client.ui; | |||
import com.google.gwt.xml.client.Node; | |||
import com.google.gwt.xml.client.NodeList; | |||
import com.itmill.toolkit.terminal.gwt.client.Component; | |||
import com.itmill.toolkit.terminal.gwt.client.GwtClient; | |||
import com.itmill.toolkit.terminal.gwt.client.Client; | |||
abstract class ContainerComponent extends Component { | |||
public ContainerComponent(int id, GwtClient c) { | |||
public ContainerComponent(int id, Client c) { | |||
super(id, c); | |||
} | |||
abstract void appendChild(Component c); | |||
public void renderChildNodes(Node n, GwtClient cli) { | |||
public void renderChildNodes(Node n, Client cli) { | |||
NodeList children = n.getChildNodes(); | |||
for(int i = 0; i < children.getLength(); i++) { | |||
Node child = children.item(i); |
@@ -4,15 +4,14 @@ package com.itmill.toolkit.terminal.gwt.client.ui; | |||
import com.google.gwt.user.client.ui.RootPanel; | |||
import com.google.gwt.user.client.ui.Widget; | |||
import com.google.gwt.xml.client.Node; | |||
import com.itmill.toolkit.terminal.gwt.client.Component; | |||
import com.itmill.toolkit.terminal.gwt.client.GwtClient; | |||
import com.itmill.toolkit.terminal.gwt.client.Client; | |||
public class RootWindow extends ContainerComponent { | |||
private RootPanel rp; | |||
private GwtClient client; | |||
private Client client; | |||
public RootWindow(Node uidl, GwtClient c) { | |||
public RootWindow(Node uidl, Client c) { | |||
super(0,c); | |||
// root panel must be attached to client before childs can be rendered | |||
setClient(c); | |||
@@ -34,11 +33,11 @@ public class RootWindow extends ContainerComponent { | |||
return rp; | |||
} | |||
public void setClient(GwtClient client) { | |||
public void setClient(Client client) { | |||
this.client = client; | |||
} | |||
public GwtClient getClient() { | |||
public Client getClient() { | |||
return this.client; | |||
} | |||
@@ -7,8 +7,7 @@ import com.google.gwt.xml.client.NamedNodeMap; | |||
import com.google.gwt.xml.client.Node; | |||
import com.google.gwt.xml.client.NodeList; | |||
import com.itmill.toolkit.terminal.gwt.client.BooleanVariable; | |||
import com.itmill.toolkit.terminal.gwt.client.Component; | |||
import com.itmill.toolkit.terminal.gwt.client.GwtClient; | |||
import com.itmill.toolkit.terminal.gwt.client.Client; | |||
import com.itmill.toolkit.terminal.gwt.client.VariableFactory; | |||
public class TkButton extends Component { | |||
@@ -16,7 +15,7 @@ public class TkButton extends Component { | |||
private Button b; | |||
private BooleanVariable state; | |||
public TkButton(Node uidl, GwtClient c) { | |||
public TkButton(Node uidl, Client c) { | |||
super(getIdFromUidl(uidl), c); | |||
b = new Button(); | |||
updateFromUidl(uidl); |
@@ -5,14 +5,13 @@ import com.google.gwt.user.client.ui.Widget; | |||
import com.google.gwt.xml.client.NamedNodeMap; | |||
import com.google.gwt.xml.client.Node; | |||
import com.google.gwt.xml.client.NodeList; | |||
import com.itmill.toolkit.terminal.gwt.client.Component; | |||
import com.itmill.toolkit.terminal.gwt.client.GwtClient; | |||
import com.itmill.toolkit.terminal.gwt.client.Client; | |||
public class TkLabel extends Component { | |||
private Label l; | |||
public TkLabel(Node uidl, GwtClient cli) { | |||
public TkLabel(Node uidl, Client cli) { | |||
super(getIdFromUidl(uidl), cli); | |||
l = new Label(); |
@@ -6,15 +6,14 @@ import com.google.gwt.user.client.ui.Panel; | |||
import com.google.gwt.user.client.ui.VerticalPanel; | |||
import com.google.gwt.user.client.ui.Widget; | |||
import com.google.gwt.xml.client.Node; | |||
import com.itmill.toolkit.terminal.gwt.client.Component; | |||
import com.itmill.toolkit.terminal.gwt.client.GwtClient; | |||
import com.itmill.toolkit.terminal.gwt.client.Client; | |||
import com.itmill.toolkit.terminal.gwt.client.LegacyClientWrapper; | |||
public class TkLegacyComponent extends Component { | |||
private Label l; | |||
public TkLegacyComponent(Node uidl, GwtClient cli) { | |||
public TkLegacyComponent(Node uidl, Client cli) { | |||
super(getIdFromUidl(uidl), cli); | |||
// TODO Check if client has legacy client instantiated |
@@ -3,14 +3,13 @@ package com.itmill.toolkit.terminal.gwt.client.ui; | |||
import com.google.gwt.user.client.ui.FlowPanel; | |||
import com.google.gwt.user.client.ui.Widget; | |||
import com.google.gwt.xml.client.Node; | |||
import com.itmill.toolkit.terminal.gwt.client.Component; | |||
import com.itmill.toolkit.terminal.gwt.client.GwtClient; | |||
import com.itmill.toolkit.terminal.gwt.client.Client; | |||
public class TkOrderedLayout extends ContainerComponent { | |||
private FlowPanel p; | |||
public TkOrderedLayout(Node uidl, GwtClient cli) { | |||
public TkOrderedLayout(Node uidl, Client cli) { | |||
super(getIdFromUidl(uidl), cli); | |||
p = new FlowPanel(); |
@@ -5,15 +5,14 @@ import com.google.gwt.user.client.ui.Widget; | |||
import com.google.gwt.xml.client.NamedNodeMap; | |||
import com.google.gwt.xml.client.Node; | |||
import com.google.gwt.xml.client.NodeList; | |||
import com.itmill.toolkit.terminal.gwt.client.Component; | |||
import com.itmill.toolkit.terminal.gwt.client.GwtClient; | |||
import com.itmill.toolkit.terminal.gwt.client.Client; | |||
public class TkTextField extends Component { | |||
private TextBox tb; | |||
public TkTextField(Node uidl, GwtClient cli) { | |||
public TkTextField(Node uidl, Client cli) { | |||
super(getIdFromUidl(uidl),cli); | |||
tb = new TextBox(); |
@@ -3,14 +3,13 @@ package com.itmill.toolkit.terminal.gwt.client.ui; | |||
import com.google.gwt.user.client.ui.Label; | |||
import com.google.gwt.user.client.ui.Widget; | |||
import com.google.gwt.xml.client.Node; | |||
import com.itmill.toolkit.terminal.gwt.client.Component; | |||
import com.itmill.toolkit.terminal.gwt.client.GwtClient; | |||
import com.itmill.toolkit.terminal.gwt.client.Client; | |||
public class TkUnknown extends Component { | |||
private Label l; | |||
public TkUnknown(Node uidl, GwtClient cli) { | |||
public TkUnknown(Node uidl, Client cli) { | |||
super(getIdFromUidl(uidl),cli); | |||
l = new Label("No client side component found for " + uidl.getNodeName()); |