From 69c8610dce41eabad58ba5c20f094554c78785fe Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke <marijnh@gmail.com>
Date: Tue, 20 Aug 2013 16:40:08 +0200
Subject: [PATCH] [fullscreen addon] Add

---
 addon/display/fullscreen.css |  6 +++++
 addon/display/fullscreen.js  | 26 ++++++++++++++++++++
 demo/fullscreen.html         | 46 ++++++++----------------------------
 doc/compress.html            |  1 +
 doc/manual.html              |  7 ++++++
 5 files changed, 50 insertions(+), 36 deletions(-)
 create mode 100644 addon/display/fullscreen.css
 create mode 100644 addon/display/fullscreen.js

diff --git a/addon/display/fullscreen.css b/addon/display/fullscreen.css
new file mode 100644
index 000000000..00ad677ff
--- /dev/null
+++ b/addon/display/fullscreen.css
@@ -0,0 +1,6 @@
+.CodeMirror-fullscreen {
+  position: fixed;
+  top: 0; left: 0; right: 0; bottom: 0;
+  height: auto;
+  z-index: 9999;
+}
diff --git a/addon/display/fullscreen.js b/addon/display/fullscreen.js
new file mode 100644
index 000000000..1ceee327d
--- /dev/null
+++ b/addon/display/fullscreen.js
@@ -0,0 +1,26 @@
+(function() {
+  "use strict";
+
+  CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
+    if (old == CodeMirror.Init) old = false;
+    if (!old == !val) return;
+    if (val) setFullscreen(cm);
+    else setNormal(cm);
+  });
+
+  function setFullscreen(cm) {
+    cm.state.restoreScreenScrollPos = {top: window.pageYOffset, left: window.pageXOffset};
+    cm.getWrapperElement().className += " CodeMirror-fullscreen";
+    document.documentElement.style.overflow = "hidden";
+    cm.refresh();
+  }
+
+  function setNormal(cm) {
+    var wrap = cm.getWrapperElement();
+    wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
+    document.documentElement.style.overflow = "";
+    var scroll = cm.state.restoreScreenScrollPos;
+    window.scrollTo(scroll.left, scroll.top);
+    cm.refresh();
+  }
+})();
diff --git a/demo/fullscreen.html b/demo/fullscreen.html
index 8cf8005bd..827d55d0c 100644
--- a/demo/fullscreen.html
+++ b/demo/fullscreen.html
@@ -5,18 +5,12 @@
 <link rel=stylesheet href="../doc/docs.css">
 
 <link rel="stylesheet" href="../lib/codemirror.css">
+<link rel="stylesheet" href="../addon/display/fullscreen.css">
 <link rel="stylesheet" href="../theme/night.css">
 <script src="../lib/codemirror.js"></script>
 <script src="../mode/xml/xml.js"></script>
-<style type="text/css">
-      .CodeMirror-fullscreen {
-        display: block;
-        position: absolute;
-        top: 0; left: 0;
-        width: 100%;
-        z-index: 9999;
-      }
-    </style>
+<script src="../addon/display/fullscreen.js"></script>
+
 <div id=nav>
   <a href="http://codemirror.net"><img id=logo src="../doc/logo.png"></a>
 
@@ -114,43 +108,23 @@
 
 </textarea></form>
   <script>
-    function isFullScreen(cm) {
-      return /\bCodeMirror-fullscreen\b/.test(cm.getWrapperElement().className);
-    }
-    function winHeight() {
-      return window.innerHeight || (document.documentElement || document.body).clientHeight;
-    }
-    function setFullScreen(cm, full) {
-      var wrap = cm.getWrapperElement();
-      if (full) {
-        wrap.className += " CodeMirror-fullscreen";
-        wrap.style.height = winHeight() + "px";
-        document.documentElement.style.overflow = "hidden";
-      } else {
-        wrap.className = wrap.className.replace(" CodeMirror-fullscreen", "");
-        wrap.style.height = "";
-        document.documentElement.style.overflow = "";
-      }
-      cm.refresh();
-    }
-    CodeMirror.on(window, "resize", function() {
-      var showing = document.body.getElementsByClassName("CodeMirror-fullscreen")[0];
-      if (!showing) return;
-      showing.CodeMirror.getWrapperElement().style.height = winHeight() + "px";
-    });
     var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
       lineNumbers: true,
       theme: "night",
       extraKeys: {
         "F11": function(cm) {
-          setFullScreen(cm, !isFullScreen(cm));
+          cm.setOption("fullScreen", !cm.getOption("fullScreen"));
         },
         "Esc": function(cm) {
-          if (isFullScreen(cm)) setFullScreen(cm, false);
+          if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
         }
       }
     });
   </script>
 
-    <p>Press <strong>F11</strong> when cursor is in the editor to toggle full screen editing. <strong>Esc</strong> can also be used to <i>exit</i> full screen editing.</p>
+    <p>Demonstration of
+    the <a href="../doc/manual.html#addon_fullscreen">fullscreen</a>
+    addon. Press <strong>F11</strong> when cursor is in the editor to
+    toggle full screen editing. <strong>Esc</strong> can also be used
+    to <i>exit</i> full screen editing.</p>
   </article>
diff --git a/doc/compress.html b/doc/compress.html
index fbb559e4c..f4d766b8c 100644
--- a/doc/compress.html
+++ b/doc/compress.html
@@ -157,6 +157,7 @@
           <option value="http://codemirror.net/addon/edit/continuelist.js">continuelist.js</option>
           <option value="http://codemirror.net/addon/dialog/dialog.js">dialog.js</option>
           <option value="http://codemirror.net/addon/fold/foldcode.js">foldcode.js</option>
+          <option value="http://codemirror.net/addon/display/fullscreen.js">fullscreen.js</option>
           <option value="http://codemirror.net/addon/hint/html-hint.js">html-hint.js</option>
           <option value="http://codemirror.net/addon/fold/indent-fold.js">indent-fold.js</option>
           <option value="http://codemirror.net/addon/hint/javascript-hint.js">javascript-hint.js</option>
diff --git a/doc/manual.html b/doc/manual.html
index c1cf9f9c6..0541c8937 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -2114,6 +2114,13 @@
       whenever it doesn't contain any text.
       See <a href="../demo/placeholder.html">the demo</a>.</dd>
 
+      <dt id="addon_fullscreen"><a href="../addon/display/fullscreen.js"><code>display/fullscreen.js</code></a></dt>
+      <dd>Defines an option <code>fullScreen</code> that, when set
+      to <code>true</code>, will make the editor full-screen (as in,
+      taking up the whole browser window). Depends
+      on <a href="../addon/display/fullscreen.css"><code>fullscreen.css</code></a>. <a href="../demo/fullscreen.html">Demo
+      here</a>.</dd>
+
       <dt id="addon_merge"><a href="../addon/merge/merge.js"><code>merge/merge.js</code></a></dt>
       <dd>Implements an interface for merging changes, using either a
       2-way or a 3-way view. The <code>CodeMirror.MergeView</code>
-- 
GitLab