Implement service user creation form as screen

By having the form as screen there is now also a direct link to the
form.

Change-Id: I23b0d36b6e4307df85b21b752fe7649fd7b411ab
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserForm.gwt.xml b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserForm.gwt.xml
index 25ad4e0..01f86d2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserForm.gwt.xml
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserForm.gwt.xml
@@ -25,6 +25,6 @@
   <!-- resources to the plugin. No theme inherits lines were      -->
   <!-- added in order to make this plugin as simple as possible   -->
   <!-- Specify the app entry point class.                         -->
-  <entry-point class="com.googlesource.gerrit.plugins.serviceuser.client.CreateServiceUserForm"/>
+  <entry-point class="com.googlesource.gerrit.plugins.serviceuser.client.ServiceUserPlugin"/>
   <stylesheet src="serviceuser.css"/>
 </module>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserMenu.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserMenu.java
index 51cc8d9..c5c31c6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserMenu.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserMenu.java
@@ -26,7 +26,6 @@
 import java.util.List;
 
 public class CreateServiceUserMenu implements TopMenu {
-  public final static String MENU_ID = "serviceuser_create-service-user";
   private final String pluginName;
   private final Provider<CurrentUser> userProvider;
   private final List<MenuEntry> menuEntries;
@@ -39,7 +38,7 @@
     menuEntries = Lists.newArrayList();
     if (canCreateServiceUser()) {
       menuEntries.add(new MenuEntry("People", Collections
-          .singletonList(new MenuItem("Create Service User", "", "", MENU_ID))));
+          .singletonList(new MenuItem("Create Service User", "#/x/" + pluginName + "/create", ""))));
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserForm.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserScreen.java
similarity index 82%
rename from src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserForm.java
rename to src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserScreen.java
index 2b46faf..6fbf3dd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserForm.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserScreen.java
@@ -16,6 +16,7 @@
 
 import com.google.gerrit.plugin.client.Plugin;
 import com.google.gerrit.plugin.client.rpc.RestApi;
+import com.google.gerrit.plugin.client.screen.Screen;
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
@@ -32,27 +33,25 @@
 import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.Panel;
-import com.google.gwt.user.client.ui.RootPanel;
 import com.google.gwt.user.client.ui.TextArea;
 import com.google.gwt.user.client.ui.TextBox;
 import com.google.gwt.user.client.ui.VerticalPanel;
 
-import com.googlesource.gerrit.plugins.serviceuser.CreateServiceUserMenu;
+public class CreateServiceUserScreen extends VerticalPanel {
+  static class Factory implements Screen.EntryPoint {
+    @Override
+    public void onLoad(Screen screen) {
+      screen.setPageTitle("Create Service User");
+      screen.show(new CreateServiceUserScreen());
+    }
+  }
 
-public class CreateServiceUserForm extends Plugin {
-  private DialogBox dialogBox;
   private TextBox usernameTxt;
   private TextArea sshKeyTxt;
   private String onSuccessMessage;
 
-  @Override
-  public void onModuleLoad() {
-    dialogBox = new DialogBox(false, false);
-    dialogBox.setText("Create Service User");
-    dialogBox.setAnimationEnabled(true);
-
-    final VerticalPanel p = new VerticalPanel();
-    p.setStyleName("panel");
+  CreateServiceUserScreen() {
+    setStyleName("serviceuser-panel");
 
     Panel usernamePanel = new VerticalPanel();
     usernamePanel.add(new Label("Username:"));
@@ -81,7 +80,7 @@
     usernameTxt.sinkEvents(Event.ONPASTE);
     usernameTxt.setVisibleLength(40);
     usernamePanel.add(usernameTxt);
-    p.add(usernamePanel);
+    add(usernamePanel);
 
     Panel sshKeyPanel = new VerticalPanel();
     sshKeyPanel.add(new Label("Public SSH Key:"));
@@ -117,13 +116,13 @@
     sshKeyTxt.setCharacterWidth(80);
     sshKeyTxt.getElement().setPropertyBoolean("spellcheck", false);
     sshKeyPanel.add(sshKeyTxt);
-    p.add(sshKeyPanel);
+    add(sshKeyPanel);
 
     HorizontalPanel buttons = new HorizontalPanel();
-    p.add(buttons);
+    add(buttons);
 
     final Button createButton = new Button("Create");
-    createButton.addStyleName("createButton");
+    createButton.addStyleName("serviceuser-createButton");
     createButton.addClickHandler(new ClickHandler() {
       @Override
       public void onClick(final ClickEvent event) {
@@ -134,29 +133,10 @@
     createButton.setEnabled(false);
     new OnEditEnabler(createButton, usernameTxt);
 
-    Button closeButton = new Button("Close");
-    closeButton.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        hide();
-      }
-    });
-    buttons.add(closeButton);
+    usernameTxt.setFocus(true);
+    createButton.setEnabled(false);
 
-    dialogBox.setWidget(p);
-
-    RootPanel rootPanel = RootPanel.get(CreateServiceUserMenu.MENU_ID);
-    rootPanel.getElement().removeAttribute("href");
-    rootPanel.addDomHandler(new ClickHandler() {
-        @Override
-        public void onClick(ClickEvent event) {
-          dialogBox.center();
-          dialogBox.show();
-          usernameTxt.setFocus(true);
-          createButton.setEnabled(false);
-        }
-    }, ClickEvent.getType());
-
-    new RestApi("config").id("server").view("serviceuser", "messages")
+    new RestApi("config").id("server").view(Plugin.get().getPluginName(), "messages")
         .get(new AsyncCallback<MessagesInfo>() {
           @Override
           public void onSuccess(MessagesInfo info) {
@@ -164,7 +144,7 @@
 
             String infoMessage = info.getInfoMessage();
             if (infoMessage != null && !"".equals(infoMessage)) {
-              p.insert(new HTML(infoMessage), 0);
+              insert(new HTML(infoMessage), 0);
             }
           }
 
@@ -189,14 +169,14 @@
 
       @Override
       public void onSuccess(JavaScriptObject result) {
-        hide();
+        clearForm();
 
         final DialogBox successDialog = new DialogBox();
         successDialog.setText("Service User Created");
         successDialog.setAnimationEnabled(true);
 
         Panel p = new VerticalPanel();
-        p.setStyleName("panel");
+        p.setStyleName("serviceuser-panel");
         p.add(new Label("The service user '" + username + "' was created."));
         Button okButton = new Button("OK");
         okButton.addClickHandler(new ClickHandler() {
@@ -222,8 +202,7 @@
     });
   }
 
-  private void hide() {
-    dialogBox.hide();
+  private void clearForm() {
     usernameTxt.setValue("");
     sshKeyTxt.setValue("");
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserPlugin.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserPlugin.java
new file mode 100644
index 0000000..ae1d203
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserPlugin.java
@@ -0,0 +1,26 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// 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.googlesource.gerrit.plugins.serviceuser.client;
+
+import com.google.gerrit.plugin.client.Plugin;
+import com.google.gerrit.plugin.client.PluginEntryPoint;
+
+public class ServiceUserPlugin extends PluginEntryPoint {
+
+  @Override
+  public void onPluginLoad() {
+    Plugin.get().screen("create", new CreateServiceUserScreen.Factory());
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/public/serviceuser.css b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/public/serviceuser.css
index 1b8d364..f037212 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/public/serviceuser.css
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/public/serviceuser.css
@@ -1,108 +1,8 @@
-body, table td, select {
-  font-family: sans-serif;
-  font-size: small;
-}
-pre {
-  font-family: "courier new", courier;
-  font-size: small;
-}
-body {
-  color: black;
-  margin: 0px;
-  border: 0px;
-  padding: 0px;
-  background: #fff;
-  direction: ltr;
-}
-a, a:visited, a:hover {
-  color: #0000AA;
-}
-
-/**
- * The reference theme can be used to determine when this style sheet has
- * loaded.  Create a hidden div element with absolute position, assign the style
- * name below, and attach it to the DOM.  Use a timer to detect when the
- * element's height and width are set to 5px.
- */
-.gwt-Reference-standard {
-  height: 5px;
-  width: 5px;
-  zoom: 1;
-}
-
-.gwt-Button {
-  margin: 0;
-  padding: 3px 5px;
-  text-decoration: none;
-  font-size: small;
-  cursor: pointer;
-  border: 1px outset #ccc;
-}
-.gwt-Button:active {
-  border: 1px inset #ccc;
-}
-.gwt-Button:hover {
-  border-color: #9cf #69e #69e #7af;
-}
-.gwt-Button[disabled] {
-  cursor: default;
-  color: #888;
-}
-.gwt-Button[disabled]:hover {
-  border: 1px outset #ccc;
-}
-
-.gwt-DialogBox .Caption {
-  background: #e3e8f3;
-  padding: 4px 4px 4px 8px;
-  cursor: default;
-  border-bottom: 1px solid #bbbbbb;
-  border-top: 5px solid #d0e4f6;
-  border-left: 5px solid #d0e4f6;
-  border-right: 5px solid #d0e4f6;
-}
-
-.gwt-DialogBox .dialogContent {
-}
-
-.gwt-DialogBox .dialogMiddleCenter {
-  padding: 3px;
-  background: white;
-  border-left: 5px solid #d0e4f6;
-  border-right: 5px solid #d0e4f6;
-  border-bottom: 5px solid #d0e4f6;
-}
-
-.gwt-DialogBox .dialogTopLeftInner {
-  width: 5px;
-  zoom: 1;
-}
-.gwt-DialogBox .dialogTopRightInner {
-  width: 8px;
-  zoom: 1;
-}
-.gwt-DialogBox .dialogBottomLeftInner {
-  width: 5px;
-  height: 8px;
-  zoom: 1;
-}
-
-.gwt-DialogBox .dialogBottomRightInner {
-  width: 5px;
-  height: 8px;
-  zoom: 1;
-}
-
-#serviceuser_create-service-user {
-  cursor: pointer;
-}
-
-.panel {
+.serviceuser-panel {
   border-spacing: 0px 5px;
 }
 
-.createButton {
-  margin-left: 35px !important;
-  margin-right: 450px !important;
+.serviceuser-createButton {
+  margin-left: 10px !important;
 }