94ee4c928517de2a49067a9b03735baef351e0ba979368cd651a99acccb349ec5c4a5c443969d21d4365e61b1b3ae782b184b6788bdf4f66af78564074c297 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { lineNumberFor } from "../line/utils_line.js"
  2. import { compensateForHScroll } from "../measurement/position_measurement.js"
  3. import { elt } from "../util/dom.js"
  4. import { updateGutterSpace } from "./update_display.js"
  5. // Re-align line numbers and gutter marks to compensate for
  6. // horizontal scrolling.
  7. export function alignHorizontally(cm) {
  8. let display = cm.display, view = display.view
  9. if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return
  10. let comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft
  11. let gutterW = display.gutters.offsetWidth, left = comp + "px"
  12. for (let i = 0; i < view.length; i++) if (!view[i].hidden) {
  13. if (cm.options.fixedGutter) {
  14. if (view[i].gutter)
  15. view[i].gutter.style.left = left
  16. if (view[i].gutterBackground)
  17. view[i].gutterBackground.style.left = left
  18. }
  19. let align = view[i].alignable
  20. if (align) for (let j = 0; j < align.length; j++)
  21. align[j].style.left = left
  22. }
  23. if (cm.options.fixedGutter)
  24. display.gutters.style.left = (comp + gutterW) + "px"
  25. }
  26. // Used to ensure that the line number gutter is still the right
  27. // size for the current document size. Returns true when an update
  28. // is needed.
  29. export function maybeUpdateLineNumberWidth(cm) {
  30. if (!cm.options.lineNumbers) return false
  31. let doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display
  32. if (last.length != display.lineNumChars) {
  33. let test = display.measure.appendChild(elt("div", [elt("div", last)],
  34. "CodeMirror-linenumber CodeMirror-gutter-elt"))
  35. let innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW
  36. display.lineGutter.style.width = ""
  37. display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1
  38. display.lineNumWidth = display.lineNumInnerWidth + padding
  39. display.lineNumChars = display.lineNumInnerWidth ? last.length : -1
  40. display.lineGutter.style.width = display.lineNumWidth + "px"
  41. updateGutterSpace(cm.display)
  42. return true
  43. }
  44. return false
  45. }