(cm)
| 1375 | } |
| 1376 | |
| 1377 | function endOperation(cm) { |
| 1378 | var op = cm.curOp, doc = cm.doc, display = cm.display; |
| 1379 | cm.curOp = null; |
| 1380 | |
| 1381 | if (op.updateMaxLine) computeMaxLength(cm); |
| 1382 | if (display.maxLineChanged && !cm.options.lineWrapping && display.maxLine) { |
| 1383 | var width = measureLineWidth(cm, display.maxLine); |
| 1384 | display.sizer.style.minWidth = Math.max(0, width + 3) + "px"; |
| 1385 | display.maxLineChanged = false; |
| 1386 | var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth); |
| 1387 | if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos) |
| 1388 | setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true); |
| 1389 | } |
| 1390 | var newScrollPos, updated; |
| 1391 | if (op.updateScrollPos) { |
| 1392 | newScrollPos = op.updateScrollPos; |
| 1393 | } else if (op.selectionChanged && display.scroller.clientHeight) { // don't rescroll if not visible |
| 1394 | var coords = cursorCoords(cm, doc.sel.head); |
| 1395 | newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom); |
| 1396 | } |
| 1397 | if (op.changes.length || op.forceUpdate || newScrollPos && newScrollPos.scrollTop != null) { |
| 1398 | updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop, op.forceUpdate); |
| 1399 | if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop; |
| 1400 | } |
| 1401 | if (!updated && op.selectionChanged) updateSelection(cm); |
| 1402 | if (op.updateScrollPos) { |
| 1403 | var top = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, newScrollPos.scrollTop)); |
| 1404 | var left = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, newScrollPos.scrollLeft)); |
| 1405 | display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = top; |
| 1406 | display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = left; |
| 1407 | alignHorizontally(cm); |
| 1408 | if (op.scrollToPos) |
| 1409 | scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos.from), |
| 1410 | clipPos(cm.doc, op.scrollToPos.to), op.scrollToPos.margin); |
| 1411 | } else if (newScrollPos) { |
| 1412 | scrollCursorIntoView(cm); |
| 1413 | } |
| 1414 | if (op.selectionChanged) restartBlink(cm); |
| 1415 | |
| 1416 | if (cm.state.focused && op.updateInput) |
| 1417 | resetInput(cm, op.userSelChange); |
| 1418 | |
| 1419 | var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; |
| 1420 | if (hidden) for (var i = 0; i < hidden.length; ++i) |
| 1421 | if (!hidden[i].lines.length) signal(hidden[i], "hide"); |
| 1422 | if (unhidden) for (var i = 0; i < unhidden.length; ++i) |
| 1423 | if (unhidden[i].lines.length) signal(unhidden[i], "unhide"); |
| 1424 | |
| 1425 | var delayed; |
| 1426 | if (!--delayedCallbackDepth) { |
| 1427 | delayed = delayedCallbacks; |
| 1428 | delayedCallbacks = null; |
| 1429 | } |
| 1430 | if (op.textChanged) |
| 1431 | signal(cm, "change", cm, op.textChanged); |
| 1432 | if (op.cursorActivity) signal(cm, "cursorActivity", cm); |
| 1433 | if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i](); |
| 1434 | } |
no test coverage detected