scrollpastend.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. (function(mod) {
  2. if (typeof exports == "object" && typeof module == "object") // CommonJS
  3. mod(require("../../lib/codemirror"));
  4. else if (typeof define == "function" && define.amd) // AMD
  5. define(["../../lib/codemirror"], mod);
  6. else // Plain browser env
  7. mod(CodeMirror);
  8. })(function(CodeMirror) {
  9. "use strict";
  10. CodeMirror.defineOption("scrollPastEnd", false, function(cm, val, old) {
  11. if (old && old != CodeMirror.Init) {
  12. cm.off("change", onChange);
  13. cm.off("refresh", updateBottomMargin);
  14. cm.display.lineSpace.parentNode.style.paddingBottom = "";
  15. cm.state.scrollPastEndPadding = null;
  16. }
  17. if (val) {
  18. cm.on("change", onChange);
  19. cm.on("refresh", updateBottomMargin);
  20. updateBottomMargin(cm);
  21. }
  22. });
  23. function onChange(cm, change) {
  24. if (CodeMirror.changeEnd(change).line == cm.lastLine())
  25. updateBottomMargin(cm);
  26. }
  27. function updateBottomMargin(cm) {
  28. var padding = "";
  29. if (cm.lineCount() > 1) {
  30. var totalH = cm.display.scroller.clientHeight - 30,
  31. lastLineH = cm.getLineHandle(cm.lastLine()).height;
  32. padding = (totalH - lastLineH) + "px";
  33. }
  34. if (cm.state.scrollPastEndPadding != padding) {
  35. cm.state.scrollPastEndPadding = padding;
  36. cm.display.lineSpace.parentNode.style.paddingBottom = padding;
  37. cm.setSize();
  38. }
  39. }
  40. });