diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/EditView.cxx | 2 | ||||
-rw-r--r-- | src/EditView.h | 2 | ||||
-rw-r--r-- | src/Editor.cxx | 8 | ||||
-rw-r--r-- | src/Editor.h | 2 | ||||
-rw-r--r-- | src/PositionCache.h | 17 |
5 files changed, 24 insertions, 7 deletions
diff --git a/src/EditView.cxx b/src/EditView.cxx index 8ffc1bcff..b2855eb97 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -650,7 +650,7 @@ Range EditView::RangeDisplayLine(Surface *surface, const EditModel &model, int l return rangeSubLine; } -SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditModel &model, Point pt, bool canReturnInvalid, bool charPosition, bool virtualSpace, const ViewStyle &vs) { +SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditModel &model, PointDocument pt, bool canReturnInvalid, bool charPosition, bool virtualSpace, const ViewStyle &vs) { pt.x = pt.x - vs.textStart; int visibleLine = static_cast<int>(floor(pt.y / vs.lineHeight)); if (!canReturnInvalid && (visibleLine < 0)) diff --git a/src/EditView.h b/src/EditView.h index 83dd8bb1f..8551daa3b 100644 --- a/src/EditView.h +++ b/src/EditView.h @@ -114,7 +114,7 @@ public: Point LocationFromPosition(Surface *surface, const EditModel &model, SelectionPosition pos, int topLine, const ViewStyle &vs, PointEnd pe); Range RangeDisplayLine(Surface *surface, const EditModel &model, int lineVisible, const ViewStyle &vs); - SelectionPosition SPositionFromLocation(Surface *surface, const EditModel &model, Point pt, bool canReturnInvalid, + SelectionPosition SPositionFromLocation(Surface *surface, const EditModel &model, PointDocument pt, bool canReturnInvalid, bool charPosition, bool virtualSpace, const ViewStyle &vs); SelectionPosition SPositionFromLineX(Surface *surface, const EditModel &model, int lineDoc, int x, const ViewStyle &vs); int DisplayFromPosition(Surface *surface, const EditModel &model, int pos, const ViewStyle &vs); diff --git a/src/Editor.cxx b/src/Editor.cxx index 5c9e20d71..8e4ebf18a 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -283,8 +283,8 @@ Point Editor::GetVisibleOriginInMain() const { return Point(0,0); } -Point Editor::DocumentPointFromView(Point ptView) const { - Point ptDocument = ptView; +PointDocument Editor::DocumentPointFromView(Point ptView) const { + PointDocument ptDocument(ptView); if (wMargin.GetID()) { Point ptOrigin = GetVisibleOriginInMain(); ptDocument.x += ptOrigin.x; @@ -399,8 +399,8 @@ SelectionPosition Editor::SPositionFromLocation(Point pt, bool canReturnInvalid, if (pt.y < 0) return SelectionPosition(INVALID_POSITION); } - pt = DocumentPointFromView(pt); - return view.SPositionFromLocation(surface, *this, pt, canReturnInvalid, charPosition, virtualSpace, vs); + PointDocument ptdoc = DocumentPointFromView(pt); + return view.SPositionFromLocation(surface, *this, ptdoc, canReturnInvalid, charPosition, virtualSpace, vs); } int Editor::PositionFromLocation(Point pt, bool canReturnInvalid, bool charPosition) { diff --git a/src/Editor.h b/src/Editor.h index 64eb42db7..864bac94f 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -275,7 +275,7 @@ protected: // ScintillaBase subclass needs access to much of Editor // The top left visible point in main window coordinates. Will be 0,0 except for // scroll views where it will be equivalent to the current scroll position. virtual Point GetVisibleOriginInMain() const; - Point DocumentPointFromView(Point ptView) const; // Convert a point from view space to document + PointDocument DocumentPointFromView(Point ptView) const; // Convert a point from view space to document int TopLineOfMain() const; // Return the line at Main's y coordinate 0 virtual PRectangle GetClientRectangle() const; virtual PRectangle GetClientDrawingRectangle(); diff --git a/src/PositionCache.h b/src/PositionCache.h index 5a829b76b..c0d2b7f3e 100644 --- a/src/PositionCache.h +++ b/src/PositionCache.h @@ -16,6 +16,23 @@ static inline bool IsEOLChar(char ch) { return (ch == '\r') || (ch == '\n'); } +/** +* A point in document space. +* Uses double for sufficient resolution in large (>20,000,000 line) documents. +*/ +class PointDocument { +public: + double x; + double y; + + explicit PointDocument(double x_ = 0, double y_ = 0) : x(x_), y(y_) { + } + + // Conversion from Point. + explicit PointDocument(Point pt) : x(pt.x), y(pt.y) { + } +}; + // There are two points for some positions and this enumeration // can choose between the end of the first line or subline // and the start of the next line or subline. |