Merge "SideBySide2: Fix loss of focus during resize of draft comments"
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 10b2640..4bd08b1 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
@@ -75,8 +75,6 @@
 
   private SideBySide2 parent;
   private boolean header;
-  private boolean headerVisible;
-  private boolean autoHideHeader;
   private boolean visibleA;
   private ChangeType changeType;
 
@@ -91,7 +89,6 @@
     initWidget(uiBinder.createAndBindUi(this));
     this.scrollbar = new Scrollbar(this);
     this.parent = parent;
-    this.headerVisible = true;
     this.visibleA = true;
   }
 
@@ -127,30 +124,16 @@
     }
   }
 
-  boolean isHeaderVisible() {
-    return headerVisible;
-  }
-
   void setHeaderVisible(boolean show) {
-    headerVisible = !autoHideHeader || show;
-    showHeader(headerVisible);
-  }
-
-  private void showHeader(boolean show) {
-    UIObject.setVisible(patchSetNavRow, show);
-    UIObject.setVisible(diffHeaderRow, show && header);
-    if (show) {
-      parent.header.removeStyleName(style.fullscreen());
-    } else {
-      parent.header.addStyleName(style.fullscreen());
-    }
-    parent.resizeCodeMirror();
-  }
-
-  void setAutoHideDiffHeader(boolean hide) {
-    autoHideHeader = hide;
-    if (!hide) {
-      showHeader(true);
+    if (show != UIObject.isVisible(patchSetNavRow)) {
+      UIObject.setVisible(patchSetNavRow, show);
+      UIObject.setVisible(diffHeaderRow, show && header);
+      if (show) {
+        parent.header.removeStyleName(style.fullscreen());
+      } else {
+        parent.header.addStyleName(style.fullscreen());
+      }
+      parent.resizeCodeMirror();
     }
   }
 
@@ -169,7 +152,6 @@
   void set(DiffPreferences prefs, JsArray<RevisionInfo> list, DiffInfo info,
       boolean editExists, int currentPatchSet, boolean open) {
     this.changeType = info.change_type();
-    this.autoHideHeader = prefs.autoHideDiffTableHeader();
     patchSetSelectBoxA.setUpPatchSetNav(list, info.meta_a(), editExists,
         currentPatchSet, open);
     patchSetSelectBoxB.setUpPatchSetNav(list, info.meta_b(), editExists,
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 70bde00..433ce5e 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
@@ -334,7 +334,6 @@
   void onAutoHideDiffTableHeader(ValueChangeEvent<Boolean> e) {
     prefs.autoHideDiffTableHeader(!e.getValue());
     view.setAutoHideDiffHeader(!e.getValue());
-    view.resizeCodeMirror();
   }
 
   @UiHandler("manualReview")
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java
index 61e00c3..4ee09d2 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java
@@ -25,12 +25,15 @@
   private ScrollCallback active;
   private ScrollCallback callbackA;
   private ScrollCallback callbackB;
+  private CodeMirror cmB;
+  private boolean autoHideDiffTableHeader;
 
   ScrollSynchronizer(DiffTable diffTable,
       CodeMirror cmA, CodeMirror cmB,
       LineMapper mapper) {
     this.diffTable = diffTable;
     this.mapper = mapper;
+    this.cmB = cmB;
 
     callbackA = new ScrollCallback(cmA, cmB, DisplaySide.A);
     callbackB = new ScrollCallback(cmB, cmA, DisplaySide.B);
@@ -38,15 +41,23 @@
     cmB.on("scroll", callbackB);
   }
 
+  void setAutoHideDiffTableHeader(boolean autoHide) {
+    if (autoHide) {
+      updateDiffTableHeader(cmB.getScrollInfo());
+    } else {
+      diffTable.setHeaderVisible(true);
+    }
+    autoHideDiffTableHeader = autoHide;
+  }
+
   void syncScroll(DisplaySide masterSide) {
     (masterSide == DisplaySide.A ? callbackA : callbackB).sync();
   }
 
-  private void updateScreenHeader(ScrollInfo si) {
-    if (si.top() == 0 && !diffTable.isHeaderVisible()) {
+  private void updateDiffTableHeader(ScrollInfo si) {
+    if (si.top() == 0) {
       diffTable.setHeaderVisible(true);
-    } else if (si.top() > 0.5 * si.clientHeight()
-        && diffTable.isHeaderVisible()) {
+    } else if (si.top() > 0.5 * si.clientHeight()) {
       diffTable.setHeaderVisible(false);
     }
   }
@@ -84,7 +95,9 @@
       }
       if (active == this) {
         ScrollInfo si = src.getScrollInfo();
-        updateScreenHeader(si);
+        if (autoHideDiffTableHeader) {
+          updateDiffTableHeader(si);
+        }
         dst.scrollTo(si.left(), align(si.top()));
         state = 0;
       }
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 5195024..75e0d90 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
@@ -603,6 +603,7 @@
 
     prefsAction = new PreferencesAction(this, prefs);
     header.init(prefsAction, getLinks(), diff.side_by_side_web_links());
+    scrollSynchronizer.setAutoHideDiffTableHeader(prefs.autoHideDiffTableHeader());
 
     if (prefs.syntaxHighlighting() && fileSize.compareTo(FileSize.SMALL) > 0) {
       Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@@ -757,7 +758,7 @@
   }
 
   void setAutoHideDiffHeader(boolean hide) {
-    diffTable.setAutoHideDiffHeader(hide);
+    scrollSynchronizer.setAutoHideDiffTableHeader(hide);
   }
 
   private void render(DiffInfo diff) {