aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/EditView.cxx
diff options
context:
space:
mode:
authorZufu Liu <unknown>2021-10-22 11:26:03 +1100
committerZufu Liu <unknown>2021-10-22 11:26:03 +1100
commit67759806434b36d47d5f08810854a661f2e992d1 (patch)
tree08049736dcc01d323c08f4489caf2c74970c0f2d /src/EditView.cxx
parentf4b4a177900d6315f40850b07cdb6daa649c0595 (diff)
downloadscintilla-mirror-67759806434b36d47d5f08810854a661f2e992d1.tar.gz
Feature [feature-requests:#1417] Change line wrapping to seek to line length
then backtrack to good break.
Diffstat (limited to 'src/EditView.cxx')
-rw-r--r--src/EditView.cxx61
1 files changed, 35 insertions, 26 deletions
diff --git a/src/EditView.cxx b/src/EditView.cxx
index 3ad33f2d6..762aa8187 100644
--- a/src/EditView.cxx
+++ b/src/EditView.cxx
@@ -564,46 +564,55 @@ void EditView::LayoutLine(const EditModel &model, Surface *surface, const ViewSt
ll->wrapIndent = vstyle.aveCharWidth; // Indent to show start visual
ll->lines = 0;
// Calculate line start positions based upon width.
- Sci::Position lastGoodBreak = 0;
Sci::Position lastLineStart = 0;
- XYACCUMULATOR startOffset = 0;
+ XYACCUMULATOR startOffset = width;
Sci::Position p = 0;
- while (p < ll->numCharsInLine) {
- if ((ll->positions[p + 1] - startOffset) >= width) {
+ const Wrap wrapState = vstyle.wrap.state;
+ const Sci::Position numCharsInLine = ll->numCharsInLine;
+ while (p < numCharsInLine) {
+ while (p < numCharsInLine && ll->positions[p + 1] < startOffset) {
+ p++;
+ }
+ if (p < numCharsInLine) {
+ // backtrack to find lastGoodBreak
+ Sci::Position lastGoodBreak = p;
+ if (p > 0) {
+ lastGoodBreak = model.pdoc->MovePositionOutsideChar(p + posLineStart, -1) - posLineStart;
+ }
+ if (wrapState != Wrap::Char) {
+ Sci::Position pos = lastGoodBreak;
+ while (pos > lastLineStart) {
+ // style boundary and space
+ if (wrapState != Wrap::WhiteSpace && (ll->styles[pos - 1] != ll->styles[pos])) {
+ break;
+ }
+ if (IsBreakSpace(ll->chars[pos - 1]) && !IsBreakSpace(ll->chars[pos])) {
+ break;
+ }
+ pos = model.pdoc->MovePositionOutsideChar(pos + posLineStart - 1, -1) - posLineStart;
+ }
+ if (pos > lastLineStart) {
+ lastGoodBreak = pos;
+ }
+ }
if (lastGoodBreak == lastLineStart) {
// Try moving to start of last character
if (p > 0) {
- lastGoodBreak = model.pdoc->MovePositionOutsideChar(p + posLineStart, -1)
- - posLineStart;
+ lastGoodBreak = model.pdoc->MovePositionOutsideChar(p + posLineStart, -1) - posLineStart;
}
if (lastGoodBreak == lastLineStart) {
// Ensure at least one character on line.
- lastGoodBreak = model.pdoc->MovePositionOutsideChar(lastGoodBreak + posLineStart + 1, 1)
- - posLineStart;
+ lastGoodBreak = model.pdoc->MovePositionOutsideChar(lastGoodBreak + posLineStart + 1, 1) - posLineStart;
}
}
lastLineStart = lastGoodBreak;
ll->lines++;
- ll->SetLineStart(ll->lines, static_cast<int>(lastGoodBreak));
- startOffset = ll->positions[lastGoodBreak];
+ ll->SetLineStart(ll->lines, static_cast<int>(lastLineStart));
+ startOffset = ll->positions[lastLineStart];
// take into account the space for start wrap mark and indent
- startOffset -= ll->wrapIndent;
- p = lastGoodBreak + 1;
- continue;
- }
- if (p > 0) {
- if (vstyle.wrap.state == Wrap::Char) {
- lastGoodBreak = model.pdoc->MovePositionOutsideChar(p + posLineStart, -1)
- - posLineStart;
- p = model.pdoc->MovePositionOutsideChar(p + 1 + posLineStart, 1) - posLineStart;
- continue;
- } else if ((vstyle.wrap.state == Wrap::Word) && (ll->styles[p] != ll->styles[p - 1])) {
- lastGoodBreak = p;
- } else if (IsSpaceOrTab(ll->chars[p - 1]) && !IsSpaceOrTab(ll->chars[p])) {
- lastGoodBreak = p;
- }
+ startOffset += width - ll->wrapIndent;
+ p = lastLineStart + 1;
}
- p++;
}
ll->lines++;
}