From 5233909e582493cddbbefa6627512ccd694d6def Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 23 Jan 2010 15:27:11 +0000 Subject: [PATCH] Added whole line selection (triple click). git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5429 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Editing/SelectionMouseHandler.cs | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/SelectionMouseHandler.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/SelectionMouseHandler.cs index bc71d5938f..718dacdc61 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/SelectionMouseHandler.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/SelectionMouseHandler.cs @@ -50,6 +50,10 @@ namespace ICSharpCode.AvalonEdit.Editing /// WholeWord, /// + /// whole-line selection (triple click+drag) + /// + WholeLine, + /// /// rectangular selection (alt+click+drag) /// Rectangular @@ -383,8 +387,14 @@ namespace ICSharpCode.AvalonEdit.Editing textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldOffset, textArea.Caret.Offset); } } else { - mode = SelectionMode.WholeWord; - var startWord = GetWordAtMousePosition(e); + SimpleSegment startWord; + if (e.ClickCount == 3) { + mode = SelectionMode.WholeLine; + startWord = GetLineAtMousePosition(e); + } else { + mode = SelectionMode.WholeWord; + startWord = GetWordAtMousePosition(e); + } if (startWord == SimpleSegment.Invalid) { mode = SelectionMode.None; textArea.ReleaseMouseCapture(); @@ -437,6 +447,24 @@ namespace ICSharpCode.AvalonEdit.Editing } } + SimpleSegment GetLineAtMousePosition(MouseEventArgs e) + { + TextView textView = textArea.TextView; + if (textView == null) return SimpleSegment.Invalid; + Point pos = e.GetPosition(textView); + if (pos.Y < 0) + pos.Y = 0; + if (pos.Y > textView.ActualHeight) + pos.Y = textView.ActualHeight; + pos += textView.ScrollOffset; + VisualLine line = textView.GetVisualLineFromVisualTop(pos.Y); + if (line != null) { + return new SimpleSegment(line.StartOffset, line.LastDocumentLine.EndOffset - line.StartOffset); + } else { + return SimpleSegment.Invalid; + } + } + int GetOffsetFromMousePosition(MouseEventArgs e, out int visualColumn) { return GetOffsetFromMousePosition(e.GetPosition(textArea.TextView), out visualColumn); @@ -468,7 +496,7 @@ namespace ICSharpCode.AvalonEdit.Editing { if (e.Handled) return; - if (mode == SelectionMode.Normal || mode == SelectionMode.WholeWord || mode == SelectionMode.Rectangular) { + if (mode == SelectionMode.Normal || mode == SelectionMode.WholeWord || mode == SelectionMode.WholeLine || mode == SelectionMode.Rectangular) { e.Handled = true; if (textArea.TextView.VisualLinesValid) { // If the visual lines are not valid, don't extend the selection. @@ -518,8 +546,8 @@ namespace ICSharpCode.AvalonEdit.Editing textArea.Selection = new RectangleSelection(textArea.Document, oldOffset, textArea.Caret.Offset); else textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldOffset, textArea.Caret.Offset); - } else if (mode == SelectionMode.WholeWord) { - var newWord = GetWordAtMousePosition(e); + } else if (mode == SelectionMode.WholeWord || mode == SelectionMode.WholeLine) { + var newWord = (mode == SelectionMode.WholeLine) ? GetLineAtMousePosition(e) : GetWordAtMousePosition(e); if (newWord != SimpleSegment.Invalid) { textArea.Selection = new SimpleSelection(Math.Min(newWord.Offset, startWord.Offset), Math.Max(newWord.EndOffset, startWord.EndOffset)); @@ -544,7 +572,7 @@ namespace ICSharpCode.AvalonEdit.Editing // -> this was not a drag start (mouse didn't move after mousedown) SetCaretOffsetToMousePosition(e); textArea.Selection = Selection.Empty; - } else if (mode == SelectionMode.Normal || mode == SelectionMode.WholeWord || mode == SelectionMode.Rectangular) { + } else if (mode == SelectionMode.Normal || mode == SelectionMode.WholeWord || mode == SelectionMode.WholeLine || mode == SelectionMode.Rectangular) { ExtendSelectionToMouse(e); } mode = SelectionMode.None;