CM3: Add support for dark themes

84a66d82d36d554c1844acff11d1a62f10c174ed added support for light and
dark themes, but dark themes weren't enabled, as diff styles have
to be adjusted to correspond with dark colors.

101a8c4b65ebee4d54afddad10db05f5b9698ba9 reverted the preparation
for dark themes support.

This change enables support for subset of dark themes and switch
dynamicaly the diff styles to dark colors, when dark theme was
selected.

Change-Id: Ic220baf8f19366c04520b61e893a0d11912805ef
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
index 6d09cec..8a64e76 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
@@ -39,6 +39,7 @@
   interface DiffTableStyle extends CssResource {
     String fullscreen();
     String intralineBg();
+    String dark();
     String diff();
     String noIntraline();
     String activeLine();
@@ -68,7 +69,8 @@
   private SideBySide2 parent;
   private boolean headerVisible;
 
-  DiffTable(SideBySide2 parent, PatchSet.Id base, PatchSet.Id revision, String path) {
+  DiffTable(SideBySide2 parent, PatchSet.Id base, PatchSet.Id revision,
+      String path) {
     patchSetSelectBoxA = new PatchSetSelectBox2(
         parent, DisplaySide.A, revision.getParentKey(), base, path);
     patchSetSelectBoxB = new PatchSetSelectBox2(
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
index 3c2ced9..09eacaa 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
@@ -79,6 +79,14 @@
     .noIntraline .a .intralineBg { background-color: #faa; }
     .noIntraline .b .intralineBg { background-color: #9f9; }
 
+    .dark .a .diff { background-color: #400; }
+    .dark .b .diff { background-color: #444; }
+
+    .dark .a .intralineBg { background-color: #888; }
+    .dark .b .intralineBg { background-color: #bbb; }
+    .dark .noIntraline .a .intralineBg { background-color: #400; }
+    .dark .noIntraline .b .intralineBg { background-color: #444; }
+
     .patchSetNav {
       background-color: #f7f7f7;
       line-height: 1;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java
index b4ac7f2..ed7c3b6 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java
@@ -302,6 +302,7 @@
   @UiHandler("theme")
   void onTheme(ChangeEvent e) {
     prefs.theme(Theme.valueOf(theme.getValue(theme.getSelectedIndex())));
+    view.setThemeStyles(prefs.theme().isDark());
     view.operation(new Runnable() {
       @Override
       public void run() {
@@ -397,5 +398,14 @@
     theme.addItem(
         Theme.NEAT.name().toLowerCase(),
         Theme.NEAT.name());
+    theme.addItem(
+        Theme.MIDNIGHT.name().toLowerCase(),
+        Theme.MIDNIGHT.name());
+    theme.addItem(
+        Theme.NIGHT.name().toLowerCase(),
+        Theme.NIGHT.name());
+    theme.addItem(
+        Theme.TWILIGHT.name().toLowerCase(),
+        Theme.TWILIGHT.name());
   }
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
index 78ec0ac..364d94c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
@@ -482,6 +482,7 @@
   }
 
   private void display(final CommentsCollections comments) {
+    setThemeStyles(prefs.theme().isDark());
     setShowTabs(prefs.showTabs());
     setShowIntraline(prefs.intralineDifference());
     if (prefs.showLineNumbers()) {
@@ -560,6 +561,14 @@
     return diff.intraline_status();
   }
 
+  void setThemeStyles(boolean d) {
+    if (d) {
+      diffTable.addStyleName(DiffTable.style.dark());
+    } else {
+      diffTable.removeStyleName(DiffTable.style.dark());
+    }
+  }
+
   void setShowTabs(boolean b) {
     if (b) {
       diffTable.addStyleName(DiffTable.style.showTabs());
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountDiffPreference.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountDiffPreference.java
index 7d73574..a19ae08 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountDiffPreference.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountDiffPreference.java
@@ -56,10 +56,26 @@
   }
 
   public static enum Theme {
+    // Light themes
     DEFAULT,
     ECLIPSE,
     ELEGANT,
     NEAT,
+    // Dark themes
+    MIDNIGHT,
+    NIGHT,
+    TWILIGHT;
+
+    public boolean isDark() {
+      switch (this) {
+        case MIDNIGHT:
+        case NIGHT:
+        case TWILIGHT:
+          return true;
+        default:
+          return false;
+      }
+    }
   }
 
   public static AccountDiffPreference createDefault(Account.Id accountId) {
diff --git a/lib/codemirror/cm3.defs b/lib/codemirror/cm3.defs
index fad0034..9679b1b 100644
--- a/lib/codemirror/cm3.defs
+++ b/lib/codemirror/cm3.defs
@@ -6,7 +6,10 @@
 CM3_THEMES = [
   'theme/eclipse.css',
   'theme/elegant.css',
+  'theme/midnight.css',
   'theme/neat.css',
+  'theme/night.css',
+  'theme/twilight.css',
 ]
 
 CM3_JS = [