Updated the default app created by WebAppCreator so it looks a little better, is a little less complicated, and show how to add GWT functionality to an existing page.

Patch by: jlabanca
Review by: scottb (WebAppCreator.java), bruce (peer programming, TBR)



git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4711 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc b/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc
index 6a25968..d18ab20 100644
--- a/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc
@@ -4,12 +4,17 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyUpEvent;
+import com.google.gwt.event.dom.client.KeyUpHandler;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.DialogBox;
-import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.RootPanel;
+import com.google.gwt.user.client.ui.TextBox;
 import com.google.gwt.user.client.ui.VerticalPanel;
 
 /**
@@ -18,66 +23,102 @@
 public class @moduleShortName implements EntryPoint {
 
   /**
-   * Create a remote service proxy to talk to the server-side Echo service.
+   * Create a remote service proxy to talk to the server-side Greeting service.
    */
-  private final EchoServiceAsync echoService = GWT.create(EchoService.class);
+  private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
 
   /**
    * This is the entry point method.
    */
   public void onModuleLoad() {
-    Image img = new Image("http://code.google.com/webtoolkit/logo-185x175.png");
-    Button button = new Button("Click me");
+    final Button sendButton = new Button("Send");
+    final TextBox nameField = new TextBox();
+    nameField.setText("GWT User");
 
-    // We can add style names
-    button.addStyleName("pc-template-btn");
-    // or we can set an id on a specific element for styling
-    img.getElement().setId("pc-template-img");
+    // We can add style names to widgets
+    sendButton.addStyleName("sendButton");
 
-    VerticalPanel vPanel = new VerticalPanel();
-    vPanel.setWidth("100%");
-    vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
-    vPanel.add(img);
-    vPanel.add(button);
+    // Add the nameField and sendButton to the RootPanel
+    // Use RootPanel.get() to get the entire body element
+    RootPanel.get("nameFieldContainer").add(nameField);
+    RootPanel.get("sendButtonContainer").add(sendButton);
 
-    // Add image and button to the RootPanel
-    RootPanel.get().add(vPanel);
+    // Focus the cursor on the name field when the app loads
+    nameField.setFocus(true);
+    nameField.selectAll();
 
-    // Create the dialog box
+    // Create the popup dialog box
     final DialogBox dialogBox = new DialogBox();
+    dialogBox.setText("Remote Procedure Call");
     dialogBox.setAnimationEnabled(true);
-    Button closeButton = new Button("close");
+    final Button closeButton = new Button("Close");
+    // We can set the id of a widget by accessing its Element
+    closeButton.getElement().setId("closeButton");
+    final Label textToServerLabel = new Label();
+    final HTML serverResponseLabel = new HTML();
     VerticalPanel dialogVPanel = new VerticalPanel();
-    dialogVPanel.setWidth("100%");
-    dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
+    dialogVPanel.addStyleName("dialogVPanel");
+    dialogVPanel.add(new HTML("<b>Sending name to the server:</b>"));
+    dialogVPanel.add(textToServerLabel);
+    dialogVPanel.add(new HTML("<br><b>Server replies:</b>"));
+    dialogVPanel.add(serverResponseLabel);
+    dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
     dialogVPanel.add(closeButton);
+    dialogBox.setWidget(dialogVPanel);
 
+    // Add a handler to close the DialogBox
     closeButton.addClickHandler(new ClickHandler() {
       public void onClick(ClickEvent event) {
         dialogBox.hide();
+        sendButton.setEnabled(true);
+        sendButton.setFocus(true);
       }
     });
 
-    // Set the contents of the Widget
-    dialogBox.setWidget(dialogVPanel);
-
-    button.addClickHandler(new ClickHandler() {
+    // Create a handler for the sendButton and nameField
+    class MyHandler implements ClickHandler, KeyUpHandler {
+      /**
+       * Fired when the user clicks on the sendButton.
+       */
       public void onClick(ClickEvent event) {
-        final String textToServer = "Hello GWT World!";
-        final String dialogBoxText = "Sending to the server: " + textToServer;
-        dialogBox.setText(dialogBoxText);
-        dialogBox.center();
-        dialogBox.show();
-        echoService.echo(textToServer, new AsyncCallback<String>() {
+        sendNameToServer();
+      }
+
+      /**
+       * Fired when the user types in the nameField.
+       */
+      public void onKeyUp(KeyUpEvent event) {
+        if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
+          sendNameToServer();
+        }
+      }
+
+      /**
+       * Send the name from the nameField to the server and wait for a response.
+       */
+      private void sendNameToServer() {
+        sendButton.setEnabled(false);
+        String textToServer = nameField.getText();
+        textToServerLabel.setText(textToServer);
+        serverResponseLabel.setText("");
+        greetingService.greetServer(textToServer, new AsyncCallback<String>() {
           public void onFailure(Throwable caught) {
             Window.alert("Rpc failure");
+            sendButton.setEnabled(true);
           }
 
           public void onSuccess(String result) {
-            dialogBox.setText(dialogBoxText + "\n " + result);
+            serverResponseLabel.setHTML(result);
+            dialogBox.center();
+            closeButton.setFocus(true);
           }
         });
       }
-    });
+    }
+
+    // Add a handler to send the name to the server
+    MyHandler handler = new MyHandler();
+    sendButton.addClickHandler(handler);
+    nameField.addKeyUpHandler(handler);
   }
 }
diff --git a/user/src/com/google/gwt/user/tools/AppCss.csssrc b/user/src/com/google/gwt/user/tools/AppCss.csssrc
index 3cf302f..d1e1ad4 100644
--- a/user/src/com/google/gwt/user/tools/AppCss.csssrc
+++ b/user/src/com/google/gwt/user/tools/AppCss.csssrc
@@ -2,11 +2,29 @@
 
 
 /** Example rules used by the template application (remove for your app) */
-.pc-template-btn {
-  display: block;
-  font-size: 16pt
+h1 {
+  font-size: 2em;
+  font-weight: bold;
+  color: #777777;
+  margin: 40px 0px 70px;
+  text-align: center;
 }
 
-#pc-template-img {
-  margin-top: 20px;
+.sendButton {
+  display: block;
+  font-size: 16pt;
+}
+
+/** Most GWT widgets already have a style name defined */
+.gwt-DialogBox {
+  width: 400px;
+}
+
+.dialogVPanel {
+  margin: 5px;
+}
+
+/** Set ids using widget.getElement().setId("idOfElement") */
+#closeButton {
+  margin: 15px 6px 6px;
 }
diff --git a/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc b/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc
index 47a42e3..f3b8917 100644
--- a/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc
+++ b/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc
@@ -16,7 +16,7 @@
     <!--                                           -->
     <!-- Any title is fine                         -->
     <!--                                           -->
-    <title>@moduleShortName</title>
+    <title>Web Application Starter Project</title>
     
     <!--                                           -->
     <!-- This script loads your compiled module.   -->
@@ -36,5 +36,16 @@
     <!-- OPTIONAL: include this if you want history support -->
     <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
 
+    <h1>Web Application Starter Project</h1>
+
+    <table align="center">
+      <tr>
+        <td colspan="2" style="font-weight:bold;">Please enter your name:</td>        
+      </tr>
+      <tr>
+        <td id="nameFieldContainer"></td>
+        <td id="sendButtonContainer"></td>
+      </tr>
+    </table>
   </body>
 </html>
diff --git a/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc b/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc
index c15d89b..e91fb2e 100644
--- a/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc
@@ -3,8 +3,8 @@
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
 /**
- * The async counterpart of <code>EchoService</code>. 
+ * The async counterpart of <code>GreetingService</code>.
  */
-public interface EchoServiceAsync {
-  void echo(String input, AsyncCallback<String> callback);
+public interface GreetingServiceAsync {
+  void greetServer(String input, AsyncCallback<String> callback);
 }
diff --git a/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc b/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc
index aeeeff7..0402cb6 100644
--- a/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc
@@ -6,7 +6,7 @@
 /**
  * The client side stub for the Rpc service.
  */
-@RemoteServiceRelativePath("echo")
-public interface EchoService extends RemoteService {
-  String echo(String input);
+@RemoteServiceRelativePath("greet")
+public interface GreetingService extends RemoteService {
+  String greetServer(String name);
 }
diff --git a/user/src/com/google/gwt/user/tools/RpcServerTemplate.javasrc b/user/src/com/google/gwt/user/tools/RpcServerTemplate.javasrc
index 3f4ae7e..2b122de 100644
--- a/user/src/com/google/gwt/user/tools/RpcServerTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/RpcServerTemplate.javasrc
@@ -1,16 +1,18 @@
 package @serverPackage;
 
-import @clientPackage.EchoService;
+import @clientPackage.GreetingService;
 import com.google.gwt.user.server.rpc.RemoteServiceServlet;
 
 /**
  * The server side implementation of the Rpc service.
  */
-public class EchoServiceImpl extends RemoteServiceServlet implements
-    EchoService {
+public class GreetingServiceImpl extends RemoteServiceServlet implements
+    GreetingService {
 
-  public String echo(String input) {
-    return "Server says: " + input;
+  public String greetServer(String input) {
+    String serverInfo = getServletContext().getServerInfo();
+    String userAgent = getThreadLocalRequest().getHeader("User-Agent");
+    return "Hello, " + input + "!<br><br>I am running " + serverInfo
+        + ".<br><br>It looks like you are using:<br>" + userAgent;
   }
-
 }
diff --git a/user/src/com/google/gwt/user/tools/WebAppCreator.java b/user/src/com/google/gwt/user/tools/WebAppCreator.java
index 552d454..3ded7e8 100644
--- a/user/src/com/google/gwt/user/tools/WebAppCreator.java
+++ b/user/src/com/google/gwt/user/tools/WebAppCreator.java
@@ -29,7 +29,9 @@
 import com.google.gwt.util.tools.Utility;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -237,6 +239,7 @@
     File srcDir = Utility.getDirectory(outDir, "src", true);
     File warDir = Utility.getDirectory(outDir, "war", true);
     File webInfDir = Utility.getDirectory(warDir, "WEB-INF", true);
+    File libDir = Utility.getDirectory(webInfDir, "lib", true);
     File moduleDir = Utility.getDirectory(srcDir, modulePackageName.replace(
         '.', '/'), true);
     File clientDir = Utility.getDirectory(moduleDir, "client", true);
@@ -282,6 +285,7 @@
     replacements.put("@antEclipseRule", antEclipseRule);
 
     List<FileCreator> files = new ArrayList<FileCreator>();
+    List<FileCreator> libs = new ArrayList<FileCreator>();
     if (!onlyEclipse) {
       files.add(new FileCreator(moduleDir, moduleShortName + ".gwt.xml",
           "Module.gwt.xml"));
@@ -291,22 +295,24 @@
       files.add(new FileCreator(webInfDir, "web.xml", "web.xml"));
       files.add(new FileCreator(clientDir, moduleShortName + ".java",
           "AppClassTemplate.java"));
-      files.add(new FileCreator(clientDir, "EchoService" + ".java",
+      files.add(new FileCreator(clientDir, "GreetingService" + ".java",
           "RpcClientTemplate.java"));
-      files.add(new FileCreator(clientDir, "EchoServiceAsync" + ".java",
+      files.add(new FileCreator(clientDir, "GreetingServiceAsync" + ".java",
           "RpcAsyncClientTemplate.java"));
-      files.add(new FileCreator(serverDir, "EchoServiceImpl" + ".java",
+      files.add(new FileCreator(serverDir, "GreetingServiceImpl" + ".java",
           "RpcServerTemplate.java"));
       files.add(new FileCreator(outDir, "build.xml", "project.ant.xml"));
     }
     if (!noEclipse) {
       assert new File(gwtDevPath).isAbsolute();
+      libs.add(new FileCreator(libDir, "gwt-servlet.jar", gwtServletPath));
       files.add(new FileCreator(outDir, ".project", ".project"));
       files.add(new FileCreator(outDir, ".classpath", ".classpath"));
       files.add(new FileCreator(outDir, moduleShortName + ".launch",
           "App.launch"));
     }
 
+    // copy source files, replacing the content as needed
     for (FileCreator fileCreator : files) {
       File file = Utility.createNormalFile(fileCreator.destDir,
           fileCreator.destName, overwrite, ignore);
@@ -320,6 +326,17 @@
         Utility.writeTemplateFile(file, data, replacements);
       }
     }
+
+    // copy libs directly
+    for (FileCreator fileCreator : libs) {
+      File file = Utility.createNormalFile(fileCreator.destDir,
+          fileCreator.destName, overwrite, ignore);
+      if (file != null) {
+        FileInputStream is = new FileInputStream(fileCreator.sourceName);
+        FileOutputStream os = new FileOutputStream(file);
+        Util.copy(is, os);
+      }
+    }
   }
 
   protected boolean run() {
diff --git a/user/src/com/google/gwt/user/tools/web.xmlsrc b/user/src/com/google/gwt/user/tools/web.xmlsrc
index 28baff4..15cdaa5 100644
--- a/user/src/com/google/gwt/user/tools/web.xmlsrc
+++ b/user/src/com/google/gwt/user/tools/web.xmlsrc
@@ -8,13 +8,13 @@
   
   <!-- Servlets -->
   <servlet>
-    <servlet-name>echoServlet</servlet-name>
-    <servlet-class>@serverPackage.EchoServiceImpl</servlet-class>
+    <servlet-name>greetServlet</servlet-name>
+    <servlet-class>@serverPackage.GreetingServiceImpl</servlet-class>
   </servlet>
   
   <servlet-mapping>
-    <servlet-name>echoServlet</servlet-name>
-    <url-pattern>/@renameTo/echo</url-pattern>
+    <servlet-name>greetServlet</servlet-name>
+    <url-pattern>/@renameTo/greet</url-pattern>
   </servlet-mapping>
 
 </web-app>