diff --git a/src/apps/haiku-depot/textview/TextDocumentView.cpp b/src/apps/haiku-depot/textview/TextDocumentView.cpp index 2ac29ef9c4..c3c9cd4166 100644 --- a/src/apps/haiku-depot/textview/TextDocumentView.cpp +++ b/src/apps/haiku-depot/textview/TextDocumentView.cpp @@ -9,6 +9,7 @@ #include #include +#include TextDocumentView::TextDocumentView(const char* name) @@ -88,12 +89,20 @@ TextDocumentView::FrameResized(float width, float height) void TextDocumentView::MouseDown(BPoint where) { + int32 modifiers = 0; + if (Window() != NULL && Window()->CurrentMessage() != NULL) + Window()->CurrentMessage()->FindInt32("modifiers", modifiers); + + fMouseDown = true; + bool extendSelection = (modifiers & B_SHIFT_KEY) != 0; + SetCaret(where, extendSelection); } void TextDocumentView::MouseUp(BPoint where) { + fMouseDown = false; } @@ -101,6 +110,8 @@ void TextDocumentView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage) { + if (fMouseDown) + SetCaret(where, true); } @@ -198,6 +209,23 @@ TextDocumentView::SetInsets(float left, float top, float right, float bottom) } +void +TextDocumentView::SetCaret(const BPoint& location, bool extendSelection) +{ + if (fTextDocument.Get() == NULL) + return; + + bool rightOfChar = false; + int32 caretOffset = fTextDocumentLayout.TextOffsetAt( + location.x - fInsetLeft, location.y - fInsetTop, rightOfChar); + + if (rightOfChar) + caretOffset++; + + _SetCaretOffset(caretOffset, true, extendSelection); +} + + // #pragma mark - private diff --git a/src/apps/haiku-depot/textview/TextDocumentView.h b/src/apps/haiku-depot/textview/TextDocumentView.h index 0d5bf6e12b..9860284a58 100644 --- a/src/apps/haiku-depot/textview/TextDocumentView.h +++ b/src/apps/haiku-depot/textview/TextDocumentView.h @@ -42,6 +42,10 @@ public: void SetInsets(float horizontal, float vertical); void SetInsets(float left, float top, float right, float bottom); + + void SetCaret(const BPoint& where, + bool extendSelection); + private: float _TextLayoutWidth(float viewWidth) const;