Highlight patch sets that have drafts

On the change screen, if a patch set has a draft comment, its header will
be highlighted.

Bug: Issue 667
Change-Id: I537db90a940c9df7c4b7c28974adac5b29c8abf4
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java
index 489ff00..031f248 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java
@@ -176,6 +176,7 @@
   String patchSetLink();
   String patchSetRevision();
   String patchSetUserIdentity();
+  String patchSetWithDraft();
   String patchSizeCell();
   String pluginsTable();
   String posscore();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
index 76f77a2..14c3d77 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
@@ -110,6 +110,11 @@
     } else {
       addOpenHandler(this);
     }
+
+    if(ps.getHasDraftComments()) {
+      addStyleName(Gerrit.RESOURCES.css().patchSetWithDraft());
+    }
+
   }
 
   public void setDiffBaseId(PatchSet.Id diffBaseId) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css b/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css
index 9425443..192698e 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css
@@ -872,6 +872,10 @@
   font-size: 8pt;
 }
 
+.patchSetWithDraft .header td {
+  color: #ff5555;
+}
+
 .changeScreen .gwt-DisclosurePanel .content {
   margin-bottom: 10px;
 }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java
index 120b9af..56f481a 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java
@@ -178,6 +178,12 @@
     ResultSet<PatchSet> source = db.patchSets().byChange(changeId);
     List<PatchSet> patches = new ArrayList<PatchSet>();
     for (PatchSet ps : source) {
+      final CurrentUser user = control.getCurrentUser();
+      if (user instanceof IdentifiedUser) {
+        final Account.Id me = ((IdentifiedUser) user).getAccountId();
+        ps.setHasDraftComments(db.patchComments()
+            .draftByPatchSetAuthor(ps.getId(), me).toList().size() > 0);
+      }
       if (control.isPatchVisible(ps, db)) {
         patches.add(ps);
       }
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java
index 54c556d..4afddfd 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java
@@ -136,6 +136,9 @@
   @Column(id = 5)
   protected boolean draft;
 
+  /** Not persisted in the database */
+  protected boolean hasDraftComments;
+
   protected PatchSet() {
   }
 
@@ -187,6 +190,14 @@
     return id.toRefName();
   }
 
+  public boolean getHasDraftComments() {
+    return hasDraftComments;
+  }
+
+  public void setHasDraftComments(boolean hasDraftComments) {
+    this.hasDraftComments = hasDraftComments;
+  }
+
   @Override
   public String toString() {
     return "[PatchSet " + getId().toString() + "]";