Adding display of project state to Projects -> List page

This is intended to make it more obvious if a project is hidden,
read-only, or active.

This shows an icon in the Projects list only if project is hidden
or read-only, but not when the project is active.

Change-Id: Ibb7f84abfc82483bdef9866265e823fed139d592
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java
index 80d65b0..dffa7c4 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java
@@ -57,4 +57,7 @@
 
   @Source("draftComments.png")
   public ImageResource draftComments();
+
+  @Source("readOnly.png")
+  public ImageResource readOnly();
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java
index da88034..23e13d4 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java
@@ -37,6 +37,7 @@
 import com.google.gwt.user.client.ui.Anchor;
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwtexpui.globalkey.client.NpTextBox;
 
@@ -131,6 +132,23 @@
 
       @Override
       protected void populate(final int row, final ProjectInfo k) {
+        Image state = new Image();
+        switch (k.state()) {
+          case HIDDEN:
+            state.setResource(Gerrit.RESOURCES.redNot());
+            state.setTitle(Util.toLongString(k.state()));
+            table.setWidget(row, ProjectsTable.C_STATE, state);
+            break;
+          case READ_ONLY:
+            state.setResource(Gerrit.RESOURCES.readOnly());
+            state.setTitle(Util.toLongString(k.state()));
+            table.setWidget(row, ProjectsTable.C_STATE, state);
+            break;
+          default:
+            // Intentionally left blank, do not show an icon when active.
+            break;
+        }
+
         FlowPanel fp = new FlowPanel();
         fp.add(new ProjectSearchLink(k.name_key()));
         fp.add(new HighlightingInlineHyperlink(k.name(), link(k), subname));
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java
index 80c1feb..cab45b5 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java
@@ -28,6 +28,12 @@
   public final native String name() /*-{ return this.name; }-*/;
   public final native String description() /*-{ return this.description; }-*/;
 
+  public final Project.State state() {
+    return Project.State.valueOf(getStringState());
+  }
+
+  private final native String getStringState() /*-{ return this.state; }-*/;
+
   @Override
   public final String getDisplayString() {
     if (description() != null) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/readOnly.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/readOnly.png
new file mode 100644
index 0000000..32ba406
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/readOnly.png
Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
index a99348d..289e6fe 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
@@ -25,9 +25,10 @@
 import java.util.List;
 
 public class ProjectsTable extends NavigationTable<ProjectInfo> {
-  public static final int C_NAME = 1;
-  public static final int C_DESCRIPTION = 2;
-  public static final int C_REPO_BROWSER = 3;
+  public static final int C_STATE = 1;
+  public static final int C_NAME = 2;
+  public static final int C_DESCRIPTION = 3;
+  public static final int C_REPO_BROWSER = 4;
 
   public ProjectsTable() {
     super(Util.C.projectItemHelp());
@@ -35,10 +36,14 @@
   }
 
   protected void initColumnHeaders() {
+    table.setText(0, C_STATE, Util.C.projectStateAbbrev());
+    table.getCellFormatter().getElement(0, C_STATE)
+        .setTitle(Util.C.projectStateHelp());
     table.setText(0, C_NAME, Util.C.projectName());
     table.setText(0, C_DESCRIPTION, Util.C.projectDescription());
 
     final FlexCellFormatter fmt = table.getFlexCellFormatter();
+    fmt.addStyleName(0, C_STATE, Gerrit.RESOURCES.css().iconHeader());
     fmt.addStyleName(0, C_NAME, Gerrit.RESOURCES.css().dataHeader());
     fmt.addStyleName(0, C_DESCRIPTION, Gerrit.RESOURCES.css().dataHeader());
   }
@@ -78,6 +83,7 @@
     applyDataRowStyle(row);
 
     final FlexCellFormatter fmt = table.getFlexCellFormatter();
+    fmt.addStyleName(row, C_STATE, Gerrit.RESOURCES.css().iconCell());
     fmt.addStyleName(row, C_NAME, Gerrit.RESOURCES.css().dataCell());
     fmt.addStyleName(row, C_NAME, Gerrit.RESOURCES.css().projectNameColumn());
     fmt.addStyleName(row, C_DESCRIPTION, Gerrit.RESOURCES.css().dataCell());
@@ -86,6 +92,7 @@
   }
 
   protected void populate(final int row, final ProjectInfo k) {
+    table.setText(row, C_STATE, k.state().toString());
     table.setText(row, C_NAME, k.name());
     table.setText(row, C_DESCRIPTION, k.description());
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java
index 1919cd3..bcfb394 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java
@@ -23,4 +23,6 @@
   String projectName();
   String projectDescription();
   String projectItemHelp();
+  String projectStateAbbrev();
+  String projectStateHelp();
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.properties
index 8a72355..1e0e185 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.properties
@@ -3,4 +3,6 @@
 
 projectName = Project Name
 projectDescription = Project Description
-projectItemHelp = project
\ No newline at end of file
+projectItemHelp = project
+projectStateAbbrev = S
+projectStateHelp = State
\ No newline at end of file
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
index 59b544a..f777039 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
@@ -271,6 +271,7 @@
               info.name = parentState.getProject().getName();
               info.description = Strings.emptyToNull(
                   parentState.getProject().getDescription());
+              info.state = parentState.getProject().getState();
             } else {
               rejected.add(parentState.getProject().getName());
               continue;
@@ -313,6 +314,8 @@
             info.description = Strings.emptyToNull(e.getProject().getDescription());
           }
 
+          info.state = e.getProject().getState();
+
           try {
             if (!showBranch.isEmpty()) {
               Repository git = repoManager.openRepository(projectName);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java
index 8db5cbb..72910a3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java
@@ -41,6 +41,7 @@
     Project.NameKey parentName = p.getParent(allProjects);
     info.parent = parentName != null ? parentName.get() : null;
     info.description = Strings.emptyToNull(p.getDescription());
+    info.state = p.getState();
     info.finish();
     return info;
   }
@@ -51,6 +52,7 @@
     public String name;
     public String parent;
     public String description;
+    public Project.State state;
     public Map<String, String> branches;
 
     void finish() {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
index f4449f0..459e392 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
@@ -41,6 +41,10 @@
     return control.getProject().getNameKey();
   }
 
+  public Project.State getState() {
+    return control.getProject().getState();
+  }
+
   public ProjectControl getControl() {
     return control;
   }