/*! \reimp */ void TextDocumentLayout::documentChanged(int from, int /*charsRemoved*/, int charsAdded) { QTextDocument *doc = document(); int newBlockCount = doc->blockCount(); QTextBlock changeStartBlock = doc->findBlock(from); QTextBlock changeEndBlock = doc->findBlock(qMax(0, from + charsAdded - 1)); if (changeStartBlock == changeEndBlock && newBlockCount == d->blockCount) { QTextBlock block = changeStartBlock; if (block.isValid() && block.layout()->lineCount()) { QRectF oldBr = blockBoundingRect(block); layoutBlock(block); QRectF newBr = blockBoundingRect(block); if (newBr.height() == oldBr.height()) { if (!d->blockUpdate) emit updateBlock(block); return; } } } else { QTextBlock block = changeStartBlock; do { block.clearLayout(); if (block == changeEndBlock) break; block = block.next(); } while(block.isValid()); } if (newBlockCount != d->blockCount) { int changeEnd = changeEndBlock.blockNumber(); int blockDiff = newBlockCount - d->blockCount; int oldChangeEnd = changeEnd - blockDiff; if (d->maximumWidthBlockNumber > oldChangeEnd) d->maximumWidthBlockNumber += blockDiff; d->blockCount = newBlockCount; if (d->blockCount == 1) d->maximumWidth = blockWidth(doc->firstBlock()); if (!d->blockDocumentSizeChanged) emit documentSizeChanged(documentSize()); if (blockDiff == 1 && changeEnd == newBlockCount -1 ) { if (!d->blockUpdate) { QTextBlock b = changeStartBlock; for(;;) { emit updateBlock(b); if (b == changeEndBlock) break; b = b.next(); } } return; } } if (!d->blockUpdate) emit update(QRectF(0., -doc->documentMargin(), 1000000000., 1000000000.)); // optimization potential }