Adds a new pref config called lineWrapping to Edit and Diff

What this config does is it either enables or disables lineWrapping,
disabling line wrapping can cause changes that have long lines to simply
be cut off.

With it enabled it will line wrap the text making it easer to read instead
of it being cutoff.

Gerrit 2.8.1 did lineWrapping so bringing this back. But it is set to the
default false so it is not enabled by default in Edit or Diff sections.

We should probaly set it as true in gerrit 2.13.

This also will partially fix bug

https://phabricator.wikimedia.org/T144565

which is filled downstream. Reason why this is partially fixed is because
the pref is not set to true by default and logged out users will still
see no line wrapping.

Bug: Issue 4292
Bug: Issue 2410
Change-Id: I8600778f1068c217e335755a3138e8cb64bc8b3e
diff --git a/Documentation/rest-api-accounts.txt b/Documentation/rest-api-accounts.txt
index 18613eb..5459306 100644
--- a/Documentation/rest-api-accounts.txt
+++ b/Documentation/rest-api-accounts.txt
@@ -1358,6 +1358,7 @@
     "show_whitespace_errors": true,
     "hide_line_numbers": true,
     "match_brackets": true,
+    "line_wrapping": false,
     "auto_close_brackets": true
   }
 ----
@@ -1390,6 +1391,7 @@
     "syntax_highlighting": true,
     "hide_line_numbers": true,
     "match_brackets": true,
+    "line_wrapping": false,
     "auto_close_brackets": true
   }
 ----
@@ -1714,6 +1716,8 @@
 file was added; the right pane is empty when a file was deleted.
 |`match_brackets`              |not set if `false`|
 Whether matching brackets should be highlighted.
+|`line_wrapping`               |not set if `false`|
+Whether to enable line wrapping or not.
 |===========================================
 
 [[diff-preferences-input]]
@@ -1767,6 +1771,8 @@
 True if the line numbers should be hidden.
 |`tab_size`                    |optional|
 Number of spaces that should be used to display one tab.
+|`line_wrapping`               |optional|
+Whether to enable line wrapping or not.
 |===========================================
 
 [[edit-preferences-info]]
@@ -1803,6 +1809,8 @@
 Whether line numbers should be hidden.
 |`match_brackets`              |not set if `false`|
 Whether matching brackets should be highlighted.
+|`line_wrapping`               |not set if `false`|
+Whether to enable line wrapping or not.
 |`auto_close_brackets`         |not set if `false`|
 Whether brackets and quotes should be auto-closed during typing.
 |===========================================
diff --git a/Documentation/user-review-ui.txt b/Documentation/user-review-ui.txt
index 8b7e5fb..859765c 100644
--- a/Documentation/user-review-ui.txt
+++ b/Documentation/user-review-ui.txt
@@ -1087,6 +1087,15 @@
 +
 Large files that exceed 4000 lines will not be fully rendered.
 
+- [[line-wrapping]]`Line Wrapping`:
++
+Controls weather to enable line wrapping or not.
++
+If `false` is selected then line wrapping is disabled.
+This is the default option.
++
+If `true` is selected then line wrapping is enabled.
+
 [[keyboard-shortcuts]]
 == Keyboard Shortcuts
 
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/DiffPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/DiffPreferencesIT.java
index 5b2e7ba..9dbb1ff 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/DiffPreferencesIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/DiffPreferencesIT.java
@@ -64,6 +64,7 @@
     assertThat(o.renderEntireFile).isNull();
     assertThat(o.hideEmptyPane).isNull();
     assertThat(o.matchBrackets).isNull();
+    assertThat(o.lineWrapping).isNull();
     assertThat(o.ignoreWhitespace).isEqualTo(d.ignoreWhitespace);
     assertThat(o.theme).isEqualTo(d.theme);
   }
@@ -95,6 +96,7 @@
     i.renderEntireFile ^= true;
     i.hideEmptyPane ^= true;
     i.matchBrackets ^= true;
+    i.lineWrapping ^= true;
 
     RestResponse r = adminSession.put("/accounts/" + admin.email
         + "/preferences.diff", i);
@@ -122,6 +124,7 @@
     assertThat(o.renderEntireFile).isEqualTo(i.renderEntireFile);
     assertThat(o.hideEmptyPane).isEqualTo(i.hideEmptyPane);
     assertThat(o.matchBrackets).isEqualTo(i.matchBrackets);
+    assertThat(o.lineWrapping).isEqualTo(i.lineWrapping);
     assertThat(o.ignoreWhitespace).isEqualTo(i.ignoreWhitespace);
     assertThat(o.theme).isEqualTo(i.theme);
 
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/EditPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/EditPreferencesIT.java
index cf89c5a..b97219c 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/EditPreferencesIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/EditPreferencesIT.java
@@ -44,6 +44,7 @@
     assertThat(out.syntaxHighlighting).isTrue();
     assertThat(out.hideLineNumbers).isNull();
     assertThat(out.matchBrackets).isTrue();
+    assertThat(out.lineWrapping).isNull();
     assertThat(out.autoCloseBrackets).isNull();
     assertThat(out.theme).isEqualTo(Theme.DEFAULT);
     assertThat(out.keyMapType).isEqualTo(KeyMapType.DEFAULT);
@@ -58,6 +59,7 @@
     out.syntaxHighlighting = false;
     out.hideLineNumbers = true;
     out.matchBrackets = false;
+    out.lineWrapping = true;
     out.autoCloseBrackets = true;
     out.theme = Theme.TWILIGHT;
     out.keyMapType = KeyMapType.EMACS;
@@ -100,6 +102,7 @@
     assertThat(out.syntaxHighlighting).isNull();
     assertThat(out.hideLineNumbers).isEqualTo(in.hideLineNumbers);
     assertThat(out.matchBrackets).isNull();
+    assertThat(out.lineWrapping).isEqualTo(in.lineWrapping);
     assertThat(out.autoCloseBrackets).isEqualTo(in.autoCloseBrackets);
     assertThat(out.theme).isEqualTo(in.theme);
     assertThat(out.keyMapType).isEqualTo(in.keyMapType);
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java
index 703f7b3..18555cf 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java
@@ -56,6 +56,7 @@
   public Boolean renderEntireFile;
   public Boolean hideEmptyPane;
   public Boolean matchBrackets;
+  public Boolean lineWrapping;
   public Theme theme;
   public Whitespace ignoreWhitespace;
   public Boolean retainHeader;
@@ -86,6 +87,7 @@
     i.renderEntireFile = false;
     i.hideEmptyPane = false;
     i.matchBrackets = false;
+    i.lineWrapping = false;
     return i;
   }
 }
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/EditPreferencesInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/EditPreferencesInfo.java
index 3e45523..fe11b32 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/EditPreferencesInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/EditPreferencesInfo.java
@@ -25,6 +25,7 @@
   public Boolean syntaxHighlighting;
   public Boolean hideLineNumbers;
   public Boolean matchBrackets;
+  public Boolean lineWrapping;
   public Boolean autoCloseBrackets;
   public Theme theme;
   public KeyMapType keyMapType;
@@ -40,6 +41,7 @@
     i.syntaxHighlighting = true;
     i.hideLineNumbers = false;
     i.matchBrackets = true;
+    i.lineWrapping = false;
     i.autoCloseBrackets = false;
     i.theme = Theme.DEFAULT;
     i.keyMapType = KeyMapType.DEFAULT;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java
index 7d543d8..daf1181 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java
@@ -47,6 +47,7 @@
     p.skipUncommented(in.skipUncommented);
     p.skipDeleted(in.skipDeleted);
     p.matchBrackets(in.matchBrackets);
+    p.lineWrapping(in.lineWrapping);
     return p;
   }
 
@@ -71,6 +72,7 @@
     p.renderEntireFile = renderEntireFile();
     p.hideEmptyPane = hideEmptyPane();
     p.matchBrackets = matchBrackets();
+    p.lineWrapping = lineWrapping();
     p.theme = theme();
     p.ignoreWhitespace = ignoreWhitespace();
   }
@@ -141,6 +143,7 @@
   public final native void skipUncommented(boolean s) /*-{ this.skip_uncommented = s }-*/;
   public final native void skipDeleted(boolean s) /*-{ this.skip_deleted = s }-*/;
   public final native void matchBrackets(boolean m) /*-{ this.match_brackets = m }-*/;
+  public final native void lineWrapping(boolean w) /*-{ this.line_wrapping = w }-*/;
   public final native boolean intralineDifference() /*-{ return this.intraline_difference || false }-*/;
   public final native boolean showLineEndings() /*-{ return this.show_line_endings || false }-*/;
   public final native boolean showTabs() /*-{ return this.show_tabs || false }-*/;
@@ -157,6 +160,7 @@
   public final native boolean skipUncommented() /*-{ return this.skip_uncommented || false }-*/;
   public final native boolean skipDeleted() /*-{ return this.skip_deleted || false }-*/;
   public final native boolean matchBrackets() /*-{ return this.match_brackets || false }-*/;
+  public final native boolean lineWrapping() /*-{ return this.line_wrapping || false }-*/;
 
   private final native void setThemeRaw(String i) /*-{ this.theme = i }-*/;
   private final native void setIgnoreWhitespaceRaw(String i) /*-{ this.ignore_whitespace = i }-*/;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EditPreferences.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EditPreferences.java
index 6e4b1c7..39af4d4 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EditPreferences.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EditPreferences.java
@@ -31,6 +31,7 @@
     p.syntaxHighlighting(in.syntaxHighlighting);
     p.hideLineNumbers(in.hideLineNumbers);
     p.matchBrackets(in.matchBrackets);
+    p.lineWrapping(in.lineWrapping);
     p.autoCloseBrackets(in.autoCloseBrackets);
     p.theme(in.theme);
     p.keyMapType(in.keyMapType);
@@ -47,6 +48,7 @@
     p.syntaxHighlighting = syntaxHighlighting();
     p.hideLineNumbers = hideLineNumbers();
     p.matchBrackets = matchBrackets();
+    p.lineWrapping = lineWrapping();
     p.autoCloseBrackets = autoCloseBrackets();
     p.theme = theme();
     p.keyMapType = keyMapType();
@@ -71,6 +73,7 @@
   public final native void syntaxHighlighting(boolean s) /*-{ this.syntax_highlighting = s }-*/;
   public final native void hideLineNumbers(boolean s) /*-{ this.hide_line_numbers = s }-*/;
   public final native void matchBrackets(boolean m) /*-{ this.match_brackets = m }-*/;
+  public final native void lineWrapping(boolean w) /*-{ this.line_wrapping = w }-*/;
   public final native void autoCloseBrackets(boolean c) /*-{ this.auto_close_brackets = c }-*/;
 
   public final Theme theme() {
@@ -103,6 +106,7 @@
   public final native boolean syntaxHighlighting() /*-{ return this.syntax_highlighting || false }-*/;
   public final native boolean hideLineNumbers() /*-{ return this.hide_line_numbers || false }-*/;
   public final native boolean matchBrackets() /*-{ return this.match_brackets || false }-*/;
+  public final native boolean lineWrapping() /*-{ return this.line_wrapping || false }-*/;
   public final native boolean autoCloseBrackets() /*-{ return this.auto_close_brackets || false }-*/;
   private final native int get(String n, int d) /*-{ return this.hasOwnProperty(n) ? this[n] : d }-*/;
 
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 99ecc9b..e72cf27 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
@@ -80,7 +80,9 @@
     .b { border-left: 1px solid #ddd; }
 
     .a .diff { background-color: #faa; }
-    .b .diff { background-color: #9f9; }
+    /* Set min-width for lineWrapping to make sure it gets enough width
+       before lineWrapping and to make sure it dosent do a ugly line wrap */
+    .b .diff { background-color: #9f9; min-width: 60em; }
     .a .intralineBg { background-color: #fee; }
     .b .intralineBg { background-color: #dfd; }
     .noIntraline .a .intralineBg { background-color: #faa; }
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 f363f9b..c5b1f96 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
@@ -101,6 +101,7 @@
   @UiField ToggleButton expandAllComments;
   @UiField ToggleButton renderEntireFile;
   @UiField ToggleButton matchBrackets;
+  @UiField ToggleButton lineWrapping;
   @UiField ListBox theme;
   @UiField Element modeLabel;
   @UiField ListBox mode;
@@ -193,6 +194,7 @@
     manualReview.setValue(prefs.manualReview());
     expandAllComments.setValue(prefs.expandAllComments());
     matchBrackets.setValue(prefs.matchBrackets());
+    lineWrapping.setValue(prefs.lineWrapping());
     setTheme(prefs.theme());
 
     if (view == null || view.canRenderEntireFile(prefs)) {
@@ -492,6 +494,15 @@
         prefs.matchBrackets());
   }
 
+  @UiHandler("lineWrapping")
+  void onLineWrapping(ValueChangeEvent<Boolean> e) {
+    prefs.lineWrapping(e.getValue());
+    view.getCmFromSide(DisplaySide.A).setOption("lineWrapping",
+        prefs.lineWrapping());
+    view.getCmFromSide(DisplaySide.B).setOption("lineWrapping",
+        prefs.lineWrapping());
+  }
+
   @UiHandler("theme")
   void onTheme(@SuppressWarnings("unused") ChangeEvent e) {
     final Theme newTheme = getSelectedTheme();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.ui.xml
index 2b4817c..7dbbc21 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.ui.xml
@@ -298,6 +298,13 @@
         </g:ToggleButton></td>
       </tr>
       <tr>
+        <th><ui:msg>Line Wrapping</ui:msg></th>
+        <td><g:ToggleButton ui:field='lineWrapping'>
+          <g:upFace><ui:msg>Off</ui:msg></g:upFace>
+          <g:downFace><ui:msg>On</ui:msg></g:downFace>
+        </g:ToggleButton></td>
+      </tr>
+      <tr>
         <td></td>
         <td>
           <g:Button ui:field='apply' styleName='{style.apply}'>
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java
index 6e992b94d..0fdc519 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java
@@ -641,7 +641,7 @@
       .set("lineNumbers", prefs.showLineNumbers())
       .set("tabSize", prefs.tabSize())
       .set("mode", fileSize == FileSize.SMALL ? getContentType(meta) : null)
-      .set("lineWrapping", false)
+      .set("lineWrapping", prefs.lineWrapping())
       .set("scrollbarStyle", "overlay")
       .set("styleSelectedText", true)
       .set("showTrailingSpace", prefs.showWhitespaceErrors())
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java
index dadf5b2..7a439b5 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java
@@ -67,6 +67,7 @@
   @UiField ToggleButton whitespaceErrors;
   @UiField ToggleButton lineNumbers;
   @UiField ToggleButton matchBrackets;
+  @UiField ToggleButton lineWrapping;
   @UiField ToggleButton autoCloseBrackets;
   @UiField ListBox theme;
   @UiField ListBox keyMap;
@@ -101,6 +102,7 @@
     whitespaceErrors.setValue(prefs.showWhitespaceErrors());
     lineNumbers.setValue(prefs.hideLineNumbers());
     matchBrackets.setValue(prefs.matchBrackets());
+    lineWrapping.setValue(prefs.lineWrapping());
     autoCloseBrackets.setValue(prefs.autoCloseBrackets());
     setTheme(prefs.theme());
     setKeyMapType(prefs.keyMapType());
@@ -190,6 +192,14 @@
     }
   }
 
+  @UiHandler("lineWrapping")
+  void onLineWrapping(ValueChangeEvent<Boolean> e) {
+    prefs.lineWrapping(e.getValue());
+    if (view != null) {
+      view.getEditor().setOption("lineWrapping", prefs.lineWrapping());
+    }
+  }
+
   @UiHandler("autoCloseBrackets")
   void onCloseBrackets(ValueChangeEvent<Boolean> e) {
     prefs.autoCloseBrackets(e.getValue());
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.ui.xml
index ab2adcd..3d0692c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.ui.xml
@@ -233,6 +233,13 @@
         </g:ToggleButton></td>
       </tr>
       <tr>
+        <th><ui:msg>Line Wrapping</ui:msg></th>
+        <td><g:ToggleButton ui:field='lineWrapping'>
+          <g:upFace><ui:msg>Off</ui:msg></g:upFace>
+          <g:downFace><ui:msg>On</ui:msg></g:downFace>
+        </g:ToggleButton></td>
+      </tr>
+      <tr>
         <th><ui:msg>Auto Close Brackets</ui:msg></th>
         <td><g:ToggleButton ui:field='autoCloseBrackets'>
           <g:upFace><ui:msg>Off</ui:msg></g:upFace>