Browse Source

Added whole line selection (triple click).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5429 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
5233909e58
  1. 38
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/SelectionMouseHandler.cs

38
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/SelectionMouseHandler.cs

@ -50,6 +50,10 @@ namespace ICSharpCode.AvalonEdit.Editing
/// </summary> /// </summary>
WholeWord, WholeWord,
/// <summary> /// <summary>
/// whole-line selection (triple click+drag)
/// </summary>
WholeLine,
/// <summary>
/// rectangular selection (alt+click+drag) /// rectangular selection (alt+click+drag)
/// </summary> /// </summary>
Rectangular Rectangular
@ -382,9 +386,15 @@ namespace ICSharpCode.AvalonEdit.Editing
if (shift && !(textArea.Selection is RectangleSelection)) { if (shift && !(textArea.Selection is RectangleSelection)) {
textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldOffset, textArea.Caret.Offset); textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldOffset, textArea.Caret.Offset);
} }
} else {
SimpleSegment startWord;
if (e.ClickCount == 3) {
mode = SelectionMode.WholeLine;
startWord = GetLineAtMousePosition(e);
} else { } else {
mode = SelectionMode.WholeWord; mode = SelectionMode.WholeWord;
var startWord = GetWordAtMousePosition(e); startWord = GetWordAtMousePosition(e);
}
if (startWord == SimpleSegment.Invalid) { if (startWord == SimpleSegment.Invalid) {
mode = SelectionMode.None; mode = SelectionMode.None;
textArea.ReleaseMouseCapture(); 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) int GetOffsetFromMousePosition(MouseEventArgs e, out int visualColumn)
{ {
return GetOffsetFromMousePosition(e.GetPosition(textArea.TextView), out visualColumn); return GetOffsetFromMousePosition(e.GetPosition(textArea.TextView), out visualColumn);
@ -468,7 +496,7 @@ namespace ICSharpCode.AvalonEdit.Editing
{ {
if (e.Handled) if (e.Handled)
return; 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; e.Handled = true;
if (textArea.TextView.VisualLinesValid) { if (textArea.TextView.VisualLinesValid) {
// If the visual lines are not valid, don't extend the selection. // 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); textArea.Selection = new RectangleSelection(textArea.Document, oldOffset, textArea.Caret.Offset);
else else
textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldOffset, textArea.Caret.Offset); textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldOffset, textArea.Caret.Offset);
} else if (mode == SelectionMode.WholeWord) { } else if (mode == SelectionMode.WholeWord || mode == SelectionMode.WholeLine) {
var newWord = GetWordAtMousePosition(e); var newWord = (mode == SelectionMode.WholeLine) ? GetLineAtMousePosition(e) : GetWordAtMousePosition(e);
if (newWord != SimpleSegment.Invalid) { if (newWord != SimpleSegment.Invalid) {
textArea.Selection = new SimpleSelection(Math.Min(newWord.Offset, startWord.Offset), textArea.Selection = new SimpleSelection(Math.Min(newWord.Offset, startWord.Offset),
Math.Max(newWord.EndOffset, startWord.EndOffset)); 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) // -> this was not a drag start (mouse didn't move after mousedown)
SetCaretOffsetToMousePosition(e); SetCaretOffsetToMousePosition(e);
textArea.Selection = Selection.Empty; 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); ExtendSelectionToMouse(e);
} }
mode = SelectionMode.None; mode = SelectionMode.None;

Loading…
Cancel
Save