|
|
@@ -37,18 +37,19 @@ class ScrollSyncHelper {
|
|
|
*
|
|
|
* @returns {{ previous: CodeLineElement, next?: CodeLineElement }}
|
|
|
*/
|
|
|
- getElementsForSourceLine(element, targetLine) {
|
|
|
- const lines = this.getCodeLineElements(element);
|
|
|
- let previous = lines[0] || null;
|
|
|
- for (const entry of lines) {
|
|
|
- if (entry.line === targetLine) {
|
|
|
- return { previous: entry, next: null };
|
|
|
- } else if (entry.line > targetLine) {
|
|
|
- return { previous, next: entry };
|
|
|
- }
|
|
|
- previous = entry;
|
|
|
- }
|
|
|
- return { previous };
|
|
|
+ getElementsForSourceLine(element, targetLine) {
|
|
|
+ const lines = this.getCodeLineElements(element);
|
|
|
+ let previous = lines[0] || null;
|
|
|
+ for (const entry of lines) {
|
|
|
+ if (entry.line === targetLine) {
|
|
|
+ return { previous: entry, next: null };
|
|
|
+ }
|
|
|
+ else if (entry.line > targetLine) {
|
|
|
+ return { previous, next: entry };
|
|
|
+ }
|
|
|
+ previous = entry;
|
|
|
+ }
|
|
|
+ return { previous };
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -59,51 +60,52 @@ class ScrollSyncHelper {
|
|
|
*
|
|
|
* @returns {{ previous: CodeLineElement, next?: CodeLineElement }}
|
|
|
*/
|
|
|
- getLineElementsAtPageOffset(parentElement, offset) {
|
|
|
- const lines = this.getCodeLineElements(parentElement);
|
|
|
+ getLineElementsAtPageOffset(parentElement, offset) {
|
|
|
+ const lines = this.getCodeLineElements(parentElement);
|
|
|
|
|
|
const position = offset - parentElement.scrollTop + this.getParentElementOffset(parentElement);
|
|
|
|
|
|
- let lo = -1;
|
|
|
- let hi = lines.length - 1;
|
|
|
- while (lo + 1 < hi) {
|
|
|
- const mid = Math.floor((lo + hi) / 2);
|
|
|
+ let lo = -1;
|
|
|
+ let hi = lines.length - 1;
|
|
|
+ while (lo + 1 < hi) {
|
|
|
+ const mid = Math.floor((lo + hi) / 2);
|
|
|
const bounds = lines[mid].element.getBoundingClientRect();
|
|
|
- if (bounds.top + bounds.height >= position) {
|
|
|
- hi = mid;
|
|
|
- } else {
|
|
|
- lo = mid;
|
|
|
- }
|
|
|
+ if (bounds.top + bounds.height >= position) {
|
|
|
+ hi = mid;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ lo = mid;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- const hiElement = lines[hi];
|
|
|
- if (hi >= 1 && hiElement.element.getBoundingClientRect().top > position) {
|
|
|
- const loElement = lines[lo];
|
|
|
- const bounds = loElement.element.getBoundingClientRect();
|
|
|
+ const hiElement = lines[hi];
|
|
|
+ if (hi >= 1 && hiElement.element.getBoundingClientRect().top > position) {
|
|
|
+ const loElement = lines[lo];
|
|
|
+ const bounds = loElement.element.getBoundingClientRect();
|
|
|
let previous = { element: loElement.element, line: loElement.line };
|
|
|
if (bounds.height > 0) {
|
|
|
previous.line += (position - bounds.top) / (bounds.height);
|
|
|
}
|
|
|
const next = { element: hiElement.element, line: hiElement.line, fractional: 0 };
|
|
|
- return { previous, next };
|
|
|
- }
|
|
|
+ return { previous, next };
|
|
|
+ }
|
|
|
|
|
|
- const bounds = hiElement.element.getBoundingClientRect();
|
|
|
+ const bounds = hiElement.element.getBoundingClientRect();
|
|
|
const previous = { element: hiElement.element, line: hiElement.line + (position - bounds.top) / (bounds.height) };
|
|
|
- return { previous };
|
|
|
+ return { previous };
|
|
|
}
|
|
|
|
|
|
getEditorLineNumberForPageOffset(parentElement, offset) {
|
|
|
const { previous, next } = this.getLineElementsAtPageOffset(parentElement, offset);
|
|
|
- if (previous) {
|
|
|
- if (next) {
|
|
|
+ if (previous) {
|
|
|
+ if (next) {
|
|
|
const betweenProgress = (offset - parentElement.scrollTop - previous.element.getBoundingClientRect().top) / (next.element.getBoundingClientRect().top - previous.element.getBoundingClientRect().top);
|
|
|
- return previous.line + betweenProgress * (next.line - previous.line);
|
|
|
- } else {
|
|
|
- return previous.line;
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
+ return previous.line + betweenProgress * (next.line - previous.line);
|
|
|
+ } else {
|
|
|
+ return previous.line;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -116,7 +118,7 @@ class ScrollSyncHelper {
|
|
|
const style = window.getComputedStyle(parentElement, null);
|
|
|
const paddingTop = +(style.paddingTop.replace('px', ''));
|
|
|
|
|
|
- return offsetY + paddingTop;
|
|
|
+ return offsetY + paddingTop;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -125,23 +127,24 @@ class ScrollSyncHelper {
|
|
|
* @param {Element} previewElement
|
|
|
* @param {number} line
|
|
|
*/
|
|
|
- scrollPreview(previewElement, line) {
|
|
|
- const { previous, next } = this.getElementsForSourceLine(previewElement, line);
|
|
|
- if (previous) {
|
|
|
- let scrollTo = 0;
|
|
|
- if (next) {
|
|
|
- // Between two elements. Go to percentage offset between them.
|
|
|
- const betweenProgress = (line - previous.line) / (next.line - previous.line);
|
|
|
- const elementOffset = next.element.getBoundingClientRect().top - previous.element.getBoundingClientRect().top;
|
|
|
- scrollTo = previous.element.getBoundingClientRect().top + betweenProgress * elementOffset;
|
|
|
- } else {
|
|
|
- scrollTo = previous.element.getBoundingClientRect().top;
|
|
|
+ scrollPreview(previewElement, line) {
|
|
|
+ const { previous, next } = this.getElementsForSourceLine(previewElement, line);
|
|
|
+ if (previous) {
|
|
|
+ let scrollTo = 0;
|
|
|
+ if (next) {
|
|
|
+ // Between two elements. Go to percentage offset between them.
|
|
|
+ const betweenProgress = (line - previous.line) / (next.line - previous.line);
|
|
|
+ const elementOffset = next.element.getBoundingClientRect().top - previous.element.getBoundingClientRect().top;
|
|
|
+ scrollTo = previous.element.getBoundingClientRect().top + betweenProgress * elementOffset;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ scrollTo = previous.element.getBoundingClientRect().top;
|
|
|
}
|
|
|
|
|
|
scrollTo -= this.getParentElementOffset(previewElement);
|
|
|
|
|
|
previewElement.scroll(0, previewElement.scrollTop + scrollTo);
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -151,8 +154,8 @@ class ScrollSyncHelper {
|
|
|
* @param {number} line
|
|
|
*/
|
|
|
scrollPreviewToRevealOverflowing(previewElement, line) {
|
|
|
- const { previous, next } = this.getElementsForSourceLine(previewElement, line);
|
|
|
- if (previous) {
|
|
|
+ const { previous, next } = this.getElementsForSourceLine(previewElement, line);
|
|
|
+ if (previous) {
|
|
|
const parentElementOffset = this.getParentElementOffset(previewElement);
|
|
|
const prevElmTop = previous.element.getBoundingClientRect().top - parentElementOffset;
|
|
|
const prevElmBottom = previous.element.getBoundingClientRect().bottom - parentElementOffset;
|
|
|
@@ -172,7 +175,7 @@ class ScrollSyncHelper {
|
|
|
}
|
|
|
|
|
|
previewElement.scroll(0, scrollTo);
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|