bool ZLTextAreaController::preparePaintInfo() { if ((myPaintState == NOTHING_TO_PAINT) || (myPaintState == READY)) { return false; } myArea.myLineInfoCache.insert(myArea.myLineInfos.begin(), myArea.myLineInfos.end()); switch (myPaintState) { default: break; case TO_SCROLL_FORWARD: if (!myArea.myEndCursor.paragraphCursor().isLast() || !myArea.myEndCursor.isEndOfParagraph()) { ZLTextWordCursor startCursor; switch (myScrollingMode) { case NO_OVERLAPPING: break; case KEEP_LINES: startCursor = findLineFromEnd(myOverlappingValue); break; case SCROLL_LINES: startCursor = findLineFromStart(myOverlappingValue); if (startCursor.isEndOfParagraph()) { startCursor.nextParagraph(); } break; case SCROLL_PERCENTAGE: startCursor = findPercentFromStart(myOverlappingValue); break; } if (!startCursor.isNull() && (startCursor == myArea.myStartCursor)) { startCursor = findLineFromStart(1); } if (!startCursor.isNull()) { ZLTextWordCursor endCursor = buildInfos(startCursor); if (!visiblePageIsEmpty() && ((myScrollingMode != KEEP_LINES) || (endCursor != myArea.myEndCursor))) { myArea.myStartCursor = startCursor; myArea.myEndCursor = endCursor; break; } } myArea.myStartCursor = myArea.myEndCursor; myArea.myEndCursor = buildInfos(myArea.myStartCursor); } break; case TO_SCROLL_BACKWARD: if (!myArea.myStartCursor.paragraphCursor().isFirst() || !myArea.myStartCursor.isStartOfParagraph()) { switch (myScrollingMode) { case NO_OVERLAPPING: myArea.myStartCursor = findStart(myArea.myStartCursor, PIXEL_UNIT, myArea.height()); break; case KEEP_LINES: { ZLTextWordCursor endCursor = findLineFromStart(myOverlappingValue); if (!endCursor.isNull() && (endCursor == myArea.myEndCursor)) { endCursor = findLineFromEnd(1); } if (!endCursor.isNull()) { ZLTextWordCursor startCursor = findStart(endCursor, PIXEL_UNIT, myArea.height()); myArea.myStartCursor = (startCursor != myArea.myStartCursor) ? startCursor : findStart(myArea.myStartCursor, PIXEL_UNIT, myArea.height()); } else { myArea.myStartCursor = findStart(myArea.myStartCursor, PIXEL_UNIT, myArea.height()); } break; } case SCROLL_LINES: myArea.myStartCursor = findStart(myArea.myStartCursor, LINE_UNIT, myOverlappingValue); break; case SCROLL_PERCENTAGE: myArea.myStartCursor = findStart(myArea.myStartCursor, PIXEL_UNIT, myArea.height() * myOverlappingValue / 100); break; } myArea.myEndCursor = buildInfos(myArea.myStartCursor); if (visiblePageIsEmpty()) { myArea.myStartCursor = findStart(myArea.myStartCursor, LINE_UNIT, 1); myArea.myEndCursor = buildInfos(myArea.myStartCursor); } } break; case START_IS_KNOWN: myArea.myEndCursor = buildInfos(myArea.myStartCursor); if (visiblePageIsEmpty()) { ZLTextWordCursor startCursor = findLineFromStart(1); if (!startCursor.isNull()) { myArea.myStartCursor = startCursor; if (myArea.myStartCursor.isEndOfParagraph()) { myArea.myStartCursor.nextParagraph(); } myArea.myEndCursor = buildInfos(myArea.myStartCursor); } } break; case END_IS_KNOWN: myArea.myStartCursor = findStart(myArea.myEndCursor, PIXEL_UNIT, myArea.height()); myArea.myEndCursor = buildInfos(myArea.myStartCursor); break; } myPaintState = READY; myArea.myLineInfoCache.clear(); return true; }
void TextView::preparePaintInfo() { context().setLeftMargin(TextStyleCollection::instance().baseStyle().LeftMarginOption.value()); context().setRightMargin(TextStyleCollection::instance().baseStyle().RightMarginOption.value()); context().setTopMargin(TextStyleCollection::instance().baseStyle().TopMarginOption.value()); context().setBottomMargin(TextStyleCollection::instance().baseStyle().BottomMarginOption.value()); int newWidth = context().width(); int newHeight = myStyle.textAreaHeight(); if ((newWidth != myOldWidth) || (newHeight != myOldHeight)) { myOldWidth = newWidth; myOldHeight = newHeight; rebuildPaintInfo(false); } if ((myPaintState == NOTHING_TO_PAINT) || (myPaintState == READY)) { return; } myLineInfoCache.insert(myLineInfos.begin(), myLineInfos.end()); switch (myPaintState) { default: break; case TO_SCROLL_FORWARD: if (!myEndCursor.paragraphCursor().isLast() || !myEndCursor.isEndOfParagraph()) { WordCursor startCursor; switch (myScrollingMode) { case NO_OVERLAPPING: break; case KEEP_LINES: startCursor = findLineFromEnd(myOverlappingValue); break; case SCROLL_LINES: startCursor = findLineFromStart(myOverlappingValue); break; case SCROLL_PERCENTAGE: startCursor = findPercentFromStart(myOverlappingValue); break; } if (!startCursor.isNull() && (startCursor == myStartCursor)) { startCursor = findLineFromStart(1); } if (!startCursor.isNull()) { WordCursor endCursor = buildInfos(startCursor); if (!pageIsEmpty() && ((myScrollingMode != KEEP_LINES) || (endCursor != myEndCursor))) { myStartCursor = startCursor; myEndCursor = endCursor; break; } } myStartCursor = myEndCursor; myEndCursor = buildInfos(myStartCursor); } break; case TO_SCROLL_BACKWARD: if (!myStartCursor.paragraphCursor().isFirst() || !myStartCursor.isStartOfParagraph()) { switch (myScrollingMode) { case NO_OVERLAPPING: myStartCursor = findStart(myStartCursor, PIXEL_UNIT, myStyle.textAreaHeight()); break; case KEEP_LINES: { WordCursor endCursor = findLineFromStart(myOverlappingValue); if (!endCursor.isNull() && (endCursor == myEndCursor)) { endCursor = findLineFromEnd(1); } if (!endCursor.isNull()) { WordCursor startCursor = findStart(endCursor, PIXEL_UNIT, myStyle.textAreaHeight()); myStartCursor = (startCursor != myStartCursor) ? startCursor : findStart(myStartCursor, PIXEL_UNIT, myStyle.textAreaHeight()); } else { myStartCursor = findStart(myStartCursor, PIXEL_UNIT, myStyle.textAreaHeight()); } break; } case SCROLL_LINES: myStartCursor = findStart(myStartCursor, LINE_UNIT, myOverlappingValue); break; case SCROLL_PERCENTAGE: myStartCursor = findStart(myStartCursor, PIXEL_UNIT, myStyle.textAreaHeight() * myOverlappingValue / 100); break; } myEndCursor = buildInfos(myStartCursor); } break; case START_IS_KNOWN: myEndCursor = buildInfos(myStartCursor); break; case END_IS_KNOWN: myStartCursor = findStart(myEndCursor, PIXEL_UNIT, myStyle.textAreaHeight()); myEndCursor = buildInfos(myStartCursor); break; } myPaintState = READY; myLineInfoCache.clear(); }