From 26fd5e98047f0522303bd4257cb64a1d66736d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sat, 7 Dec 2013 12:15:13 +0100 Subject: [PATCH] TextDocumentLayout: Added TextOffsetAt() It iterates over the ParagraphLayoutInfos and finds the one which must contain the location. Untestet. --- .../textview/TextDocumentLayout.cpp | 23 +++++++++++++++++++ .../haiku-depot/textview/TextDocumentLayout.h | 3 +++ 2 files changed, 26 insertions(+) diff --git a/src/apps/haiku-depot/textview/TextDocumentLayout.cpp b/src/apps/haiku-depot/textview/TextDocumentLayout.cpp index 940048ce02..d977cd2320 100644 --- a/src/apps/haiku-depot/textview/TextDocumentLayout.cpp +++ b/src/apps/haiku-depot/textview/TextDocumentLayout.cpp @@ -144,6 +144,29 @@ TextDocumentLayout::GetTextBounds(int32 textOffset, float& x1, float& y1, } +int32 +TextDocumentLayout::TextOffsetAt(float x, float y, bool& rightOfCenter) +{ + _ValidateLayout(); + + int32 textOffset = 0; + rightOfCenter = false; + + int32 paragraphs = fParagraphLayouts.CountItems(); + for (int32 i = 0; i < paragraphs; i++) { + const ParagraphLayoutInfo& info = fParagraphLayouts.ItemAtFast(i); + if (y > info.y + info.layout->Height()) { + textOffset += info.layout->CountGlyphs(); + continue; + } + + textOffset += info.layout->TextOffsetAt(x, y - info.y, rightOfCenter); + break; + } + + return textOffset; +} + // #pragma mark - private diff --git a/src/apps/haiku-depot/textview/TextDocumentLayout.h b/src/apps/haiku-depot/textview/TextDocumentLayout.h index dda4d373d6..676b10ca46 100644 --- a/src/apps/haiku-depot/textview/TextDocumentLayout.h +++ b/src/apps/haiku-depot/textview/TextDocumentLayout.h @@ -92,6 +92,9 @@ public: float& x1, float& y1, float& x2, float& y2); + int32 TextOffsetAt(float x, float y, + bool& rightOfCenter); + private: void _Init(); void _ValidateLayout();