[analyzer] Better UI in html reports for displaying shortcuts help
authorGeorge Karpenkov <ekarpenkov@apple.com>
Wed, 17 Jan 2018 20:06:26 +0000 (20:06 +0000)
committerGeorge Karpenkov <ekarpenkov@apple.com>
Wed, 17 Jan 2018 20:06:26 +0000 (20:06 +0000)
Make the help window accessible, but don't show by default.
Use a different CSS class from macro.

llvm-svn: 322750

clang/lib/Rewrite/HTMLRewrite.cpp
clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp

index d324784..349b088 100644 (file)
@@ -311,6 +311,10 @@ void html::AddHeaderFooterInternalBuiltinCSS(Rewriter &R, FileID FID,
           "  -webkit-border-radius:5px;  -webkit-box-shadow:1px 1px 7px #000; "
           "  border-radius:5px;  box-shadow:1px 1px 7px #000; "
           "position: absolute; top: -1em; left:10em; z-index: 1 } \n"
+      " #tooltiphint { position: fixed; width: 50em; margin-left: -25em;"
+                     "left: 50%; padding: 10px; border: 1px solid #b0b0b0;"
+                     "border-radius: 2px; box-shadow: 1px 1px 7px black; "
+                     "background-color: #c0c0c0; z-index: 2; }\n"
       " .macro { color: darkmagenta; background-color:LemonChiffon;"
              // Macros are position: relative to provide base for expansions.
              " position: relative }\n"
index 6356251..acddcef 100644 (file)
@@ -101,6 +101,9 @@ private:
 
   /// \return Executed lines from \p D in JSON format.
   std::string serializeExecutedLines(const PathDiagnostic &D);
+
+  /// \return Javascript for displaying shortcuts help;
+  std::string showHelpJavascript();
 };
 
 } // end anonymous namespace
@@ -347,6 +350,8 @@ void HTMLDiagnostics::FinalizeHTML(const PathDiagnostic& D, Rewriter &R,
   int LineNumber = path.back()->getLocation().asLocation().getExpansionLineNumber();
   int ColumnNumber = path.back()->getLocation().asLocation().getExpansionColumnNumber();
 
+  R.InsertTextBefore(SMgr.getLocForStartOfFile(FID), showHelpJavascript());
+
   R.InsertTextBefore(SMgr.getLocForStartOfFile(FID),
                      generateKeyboardNavigationJavascript());
 
@@ -399,9 +404,17 @@ void HTMLDiagnostics::FinalizeHTML(const PathDiagnostic& D, Rewriter &R,
 </table>
 <!-- REPORTSUMMARYEXTRA -->
 <h3>Annotated Source Code</h3>
-<p><span class='macro'>[?]
-  <span class='expansion'>Use j/k keys for keyboard navigation</span>
-</span></p>
+<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a>
+   to see keyboard shortcuts</p>
+<div id='tooltiphint' hidden="true">
+  <p>Keyboard shortcuts: </p>
+  <ul>
+    <li>Use 'j/k' keys for keyboard navigation</li>
+    <li>Use 'Shift+S' to show/hide relevant lines</li>
+    <li>Use '?' to toggle this window</li>
+  </ul>
+  <a href="#" onclick="toggleHelp(); return false;">Close</a>
+</div>
 )<<<";
 
     R.InsertTextBefore(SMgr.getLocForStartOfFile(FID), os.str());
@@ -461,6 +474,34 @@ void HTMLDiagnostics::FinalizeHTML(const PathDiagnostic& D, Rewriter &R,
   html::AddHeaderFooterInternalBuiltinCSS(R, FID, Entry->getName());
 }
 
+std::string HTMLDiagnostics::showHelpJavascript() {
+  return R"<<<(
+<script type='text/javascript'>
+
+var toggleHelp = function() {
+    var hint = document.querySelector("#tooltiphint");
+    var attributeName = "hidden";
+    if (hint.hasAttribute(attributeName)) {
+      hint.removeAttribute(attributeName);
+    } else {
+      hint.setAttribute("hidden", "true");
+    }
+};
+window.addEventListener("keydown", function (event) {
+  if (event.defaultPrevented) {
+    return;
+  }
+  if (event.key == "?") {
+    toggleHelp();
+  } else {
+    return;
+  }
+  event.preventDefault();
+});
+</script>
+)<<<";
+}
+
 std::string
 HTMLDiagnostics::showRelevantLinesJavascript(const PathDiagnostic &D) {
   std::string s;