diff options
author | Neil <nyamatongwe@gmail.com> | 2014-02-26 12:08:20 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2014-02-26 12:08:20 +1100 |
commit | 1f51cbbccab97cb10f1cbf63b422c6a9cb4dfa78 (patch) | |
tree | 6a64fc8a895321291bea24a95988b43a8635c722 /src/PositionCache.cxx | |
parent | ebba676e693c952b36546bff7870602f3b269b7f (diff) | |
download | scintilla-mirror-1f51cbbccab97cb10f1cbf63b422c6a9cb4dfa78.tar.gz |
Refactor methods for converting screen points to and from document index, moving code
from Editor to LineLayout.
Diffstat (limited to 'src/PositionCache.cxx')
-rw-r--r-- | src/PositionCache.cxx | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx index db64b1160..90a3f02f0 100644 --- a/src/PositionCache.cxx +++ b/src/PositionCache.cxx @@ -132,6 +132,10 @@ int LineLayout::LineLastVisible(int line) const { } } +Range LineLayout::SubLineRange(int subLine) const { + return Range(LineStart(subLine), LineLastVisible(subLine)); +} + bool LineLayout::InLine(int offset, int line) const { return ((offset >= LineStart(line)) && (offset < LineStart(line + 1))) || ((offset == numCharsInLine) && (line == (lines-1))); @@ -205,6 +209,46 @@ int LineLayout::FindBefore(XYPOSITION x, int lower, int upper) const { return lower; } + +int LineLayout::FindPositionFromX(XYPOSITION x, Range range, bool charPosition) const { + int pos = FindBefore(x, range.start, range.end); + while (pos < range.end) { + if (charPosition) { + if (x < (positions[pos + 1])) { + return pos; + } + } else { + if (x < ((positions[pos] + positions[pos + 1]) / 2)) { + return pos; + } + } + pos++; + } + return range.end; +} + +Point LineLayout::PointFromPosition(int posInLine, int lineHeight) const { + Point pt; + // In case of very long line put x at arbitrary large position + if (posInLine > maxLineLength) { + pt.x = positions[maxLineLength] - positions[LineStart(lines)]; + } + + for (int subLine = 0; subLine < lines; subLine++) { + const Range rangeSubLine = SubLineRange(subLine); + if (posInLine >= rangeSubLine.start) { + pt.y = subLine*lineHeight; + if (posInLine <= rangeSubLine.end) { + pt.x = positions[posInLine] - positions[rangeSubLine.start]; + if (rangeSubLine.start != 0) // Wrapped lines may be indented + pt.x += wrapIndent; + break; + } + } + } + return pt; +} + int LineLayout::EndLineStyle() const { return styles[numCharsBeforeEOL > 0 ? numCharsBeforeEOL-1 : 0]; } |