(cm)
| 1890 | |
| 1891 | // Finish an operation, updating the display and signalling delayed events |
| 1892 | function endOperation(cm) { |
| 1893 | var op = cm.curOp, doc = cm.doc, display = cm.display; |
| 1894 | cm.curOp = null; |
| 1895 | |
| 1896 | if (op.updateMaxLine) findMaxLine(cm); |
| 1897 | |
| 1898 | // If it looks like an update might be needed, call updateDisplay |
| 1899 | if (op.viewChanged || op.forceUpdate || op.scrollTop != null || |
| 1900 | op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || |
| 1901 | op.scrollToPos.to.line >= display.viewTo) || |
| 1902 | display.maxLineChanged && cm.options.lineWrapping) { |
| 1903 | var updated = updateDisplay(cm, {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); |
| 1904 | if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop; |
| 1905 | } |
| 1906 | // If no update was run, but the selection changed, redraw that. |
| 1907 | if (!updated && op.selectionChanged) updateSelection(cm); |
| 1908 | if (!updated && op.startHeight != cm.doc.height) updateScrollbars(cm); |
| 1909 | |
| 1910 | // Propagate the scroll position to the actual DOM scroller |
| 1911 | if (op.scrollTop != null && display.scroller.scrollTop != op.scrollTop) { |
| 1912 | var top = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop)); |
| 1913 | display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = top; |
| 1914 | } |
| 1915 | if (op.scrollLeft != null && display.scroller.scrollLeft != op.scrollLeft) { |
| 1916 | var left = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft)); |
| 1917 | display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = left; |
| 1918 | alignHorizontally(cm); |
| 1919 | } |
| 1920 | // If we need to scroll a specific position into view, do so. |
| 1921 | if (op.scrollToPos) { |
| 1922 | var coords = scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos.from), |
| 1923 | clipPos(cm.doc, op.scrollToPos.to), op.scrollToPos.margin); |
| 1924 | if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords); |
| 1925 | } |
| 1926 | |
| 1927 | if (op.selectionChanged) restartBlink(cm); |
| 1928 | |
| 1929 | if (cm.state.focused && op.updateInput) |
| 1930 | resetInput(cm, op.typing); |
| 1931 | |
| 1932 | // Fire events for markers that are hidden/unidden by editing or |
| 1933 | // undoing |
| 1934 | var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; |
| 1935 | if (hidden) for (var i = 0; i < hidden.length; ++i) |
| 1936 | if (!hidden[i].lines.length) signal(hidden[i], "hide"); |
| 1937 | if (unhidden) for (var i = 0; i < unhidden.length; ++i) |
| 1938 | if (unhidden[i].lines.length) signal(unhidden[i], "unhide"); |
| 1939 | |
| 1940 | var delayed; |
| 1941 | if (!--delayedCallbackDepth) { |
| 1942 | delayed = delayedCallbacks; |
| 1943 | delayedCallbacks = null; |
| 1944 | } |
| 1945 | // Fire change events, and delayed event handlers |
| 1946 | if (op.changeObjs) { |
| 1947 | for (var i = 0; i < op.changeObjs.length; i++) |
| 1948 | signal(cm, "change", cm, op.changeObjs[i]); |
| 1949 | signal(cm, "changes", cm, op.changeObjs); |
no test coverage detected