Tidies keyboard shortcut dialogs and updated cursor styles

Reorganizes the keyboard shortcut list for change view with smaller
groups of shortcuts. Also tidies up the dialog for the diff view a bit.

Updates the style for the selected line in the diff view and fixes the
focus when the diff expand/collapse buttons are activated. The scroll
behavior is changed slightly.

Change-Id: I8e520f725f4706aaad6e8bd8b99dd0e274d2f830
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
index 132766b..976cf9b 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
@@ -178,7 +178,9 @@
           view-mode="[[_userPrefs.diff_view]]"></gr-diff>
     </template>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
-    <gr-diff-cursor id="cursor"></gr-diff-cursor>
+    <gr-diff-cursor
+        id="cursor"
+        fold-offset-top="[[topMargin]]"></gr-diff-cursor>
   </template>
   <script src="gr-file-list.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
index 5219b4e..3257469 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
@@ -127,20 +127,26 @@
       }
     },
 
-    _expandAllDiffs: function() {
+    _expandAllDiffs: function(e) {
       this._showInlineDiffs = true;
       this._forEachDiff(function(diff) {
         diff.hidden = false;
         diff.reload();
       });
+      if (e && e.target) {
+        e.target.blur();
+      }
     },
 
-    _collapseAllDiffs: function() {
+    _collapseAllDiffs: function(e) {
       this._showInlineDiffs = false;
       this._forEachDiff(function(diff) {
         diff.hidden = true;
       });
       this.$.cursor.handleDiffUpdate();
+      if (e && e.target) {
+        e.target.blur();
+      }
     },
 
     _computeCommentsString: function(comments, patchNum, path) {
diff --git a/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html
index 0e4d8f0..5b70769 100644
--- a/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html
+++ b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html
@@ -161,42 +161,49 @@
             <td></td><td class="header">File list</td>
           </tr>
           <tr>
-            <td><span class="key">j</span></td>
-            <td>Select next item</td>
+            <td><span class="key">j</span> or <span class="key">↓</span></td>
+            <td>Select next file</td>
           </tr>
           <tr>
-            <td><span class="key">k</span></td>
-            <td>Select previous item</td>
+            <td><span class="key">k</span> or <span class="key">↑</span></td>
+            <td>Select previous file</td>
           </tr>
           <tr>
-            <td><span class="key">↓</span></td>
-            <td>Select next item</td>
+            <td><span class="key">Enter</span> or <span class="key">o</span></td>
+            <td>Show selected file</td>
           </tr>
           <tr>
-            <td><span class="key">↑</span></td>
-            <td>Select previous item</td>
+            <td></td><td class="header">Diffs</td>
+          </tr>
+          <tr>
+            <td><span class="key">j</span> or <span class="key">↓</span></td>
+            <td>Go to next line</td>
+          </tr>
+          <tr>
+            <td><span class="key">k</span> or <span class="key">↑</span></td>
+            <td>Go to previous line</td>
           </tr>
           <tr>
             <td><span class="key">n</span></td>
-            <td>Show next diff chunk</td>
+            <td>Go to next diff chunk</td>
           </tr>
           <tr>
             <td><span class="key">p</span></td>
-            <td>Show previous diff chunk</td>
+            <td>Go to previous diff chunk</td>
           </tr>
           <tr>
             <td>
               <span class="key modifier">Shift</span>
               <span class="key">n</span>
             </td>
-            <td>Show next comment thread</td>
+            <td>Go to next comment thread</td>
           </tr>
           <tr>
             <td>
               <span class="key modifier">Shift</span>
               <span class="key">p</span>
             </td>
-            <td>Show previous comment thread</td>
+            <td>Go to previous comment thread</td>
           </tr>
           <tr>
             <td>
@@ -218,10 +225,6 @@
             </td>
             <td>Draft new comment</td>
           </tr>
-          <tr>
-            <td><span class="key">Enter</span> or <span class="key">o</span></td>
-            <td>Show selected file</td>
-          </tr>
         </tbody>
         <!-- Diff View -->
         <tbody hidden$="[[!_computeInView(view, 'gr-diff-view')]]" hidden>
@@ -229,11 +232,11 @@
             <td></td><td class="header">Actions</td>
           </tr>
           <tr>
-            <td><span class="key">j</span></td>
+            <td><span class="key">j</span> or <span class="key">↓</span></td>
             <td>Show next line</td>
           </tr>
           <tr>
-            <td><span class="key">k</span></td>
+            <td><span class="key">k</span> or <span class="key">↑</span></td>
             <td>Show previous line</td>
           </tr>
           <tr>
@@ -259,14 +262,6 @@
             <td>Show previous comment thread</td>
           </tr>
           <tr>
-            <td><span class="key">↓</span></td>
-            <td>Show next line</td>
-          </tr>
-          <tr>
-            <td><span class="key">↑</span></td>
-            <td>Show previous line</td>
-          </tr>
-          <tr>
             <td>
               <span class="key modifier">Shift</span>
               <span class="key">←</span>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html
index f58916e..5a41709 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html
@@ -21,8 +21,9 @@
   <template>
     <gr-cursor-manager
         id="cursorManager"
-        scroll
+        scroll="keep-visible"
         cursor-target-class="target-row"
+        fold-offset-top="[[foldOffsetTop]]"
         target="{{diffRow}}"></gr-cursor-manager>
   </template>
   <script src="gr-diff-cursor.js"></script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
index 77b5b57..3f71892 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
@@ -53,6 +53,11 @@
           return [];
         },
       },
+
+      foldOffsetTop: {
+        type: Number,
+        value: 0,
+      },
     },
 
     observers: [
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
index 7595bb2..e4603b8 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
@@ -43,13 +43,15 @@
       .section {
         background-color: #eee;
       }
-      .diff-row.target-row {
-        outline: .2em solid #ddd;
-      }
       .diff-row.target-row.target-side-left .lineNum.left,
       .diff-row.target-row.target-side-right .lineNum.right,
       .diff-row.target-row.unified .lineNum {
-        background-color: #ccc;
+        background-color: #BBDEFB;
+      }
+      .diff-row.target-row.target-side-left .lineNum.left:before,
+      .diff-row.target-row.target-side-right .lineNum.right:before,
+      .diff-row.target-row.unified .lineNum:before {
+        color: #000;
       }
       .blank,
       .content {
@@ -72,9 +74,6 @@
       .canComment .lineNum[data-value] {
         cursor: pointer;
       }
-      .canComment .lineNum[data-value]:before {
-        text-decoration: underline;
-      }
       .canComment .lineNum[data-value]:hover:before {
         background-color: #ccc;
       }
diff --git a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js
index b0a349c..e1990c4 100644
--- a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js
+++ b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js
@@ -14,6 +14,12 @@
 (function() {
   'use strict';
 
+  var ScrollBehavior = {
+    ALWAYS: 'always',
+    NEVER: 'never',
+    KEEP_VISIBLE: 'keep-visible',
+  };
+
   Polymer({
     is: 'gr-cursor-manager',
 
@@ -46,9 +52,24 @@
         type: String,
         value: null,
       },
+
+      /**
+       * The scroll behavior for the cursor. Values are 'never', 'always' and
+       * 'keep-visible'. 'keep-visible' will only scroll if the cursor is beyond
+       * the viewport.
+       */
       scroll: {
-        type: Boolean,
-        value: false,
+        type: String,
+        value: ScrollBehavior.NEVER,
+      },
+
+      /**
+       * When using the 'keep-visible' scroll behavior, set an offset to the top
+       * of the window for what is considered above the upper fold.
+       */
+      foldOffsetTop: {
+        type: Number,
+        value: 0,
       },
     },
 
@@ -181,7 +202,7 @@
     },
 
     _scrollToTarget: function() {
-      if (!this.target || !this.scroll) { return; }
+      if (!this.target || this.scroll === ScrollBehavior.NEVER) { return; }
 
       // Calculate where the element is relative to the window.
       var top = this.target.offsetTop;
@@ -191,6 +212,10 @@
         top += offsetParent.offsetTop;
       }
 
+      if (this.scroll === ScrollBehavior.KEEP_VISIBLE &&
+          top > window.pageYOffset + this.foldOffsetTop &&
+          top < window.pageYOffset + window.innerHeight) { return; }
+
       // Scroll the element to the middle of the window. Dividing by a third
       // instead of half the inner height feels a bit better otherwise the
       // element appears to be below the center of the window even when it