static void OnDeleteLine(object target, ExecutedRoutedEventArgs args)
        {
            TextArea textArea = GetTextArea(target);

            if (textArea != null && textArea.Document != null)
            {
                int firstLineIndex, lastLineIndex;
                if (textArea.Selection.Length == 0)
                {
                    // There is no selection, simply delete current line
                    firstLineIndex = lastLineIndex = textArea.Caret.Line;
                }
                else
                {
                    // There is a selection, remove all lines affected by it (use Min/Max to be independent from selection direction)
                    firstLineIndex = Math.Min(textArea.Selection.StartPosition.Line, textArea.Selection.EndPosition.Line);
                    lastLineIndex  = Math.Max(textArea.Selection.StartPosition.Line, textArea.Selection.EndPosition.Line);
                }
                DocumentLine startLine = textArea.Document.GetLineByNumber(firstLineIndex);
                DocumentLine endLine   = textArea.Document.GetLineByNumber(lastLineIndex);
                textArea.Selection = Selection.Create(textArea, startLine.Offset, endLine.Offset + endLine.TotalLength);
                textArea.RemoveSelectedText();
                args.Handled = true;
            }
        }
        /// <inheritdoc/>
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);
            if (!e.Handled && TextView != null && textArea != null)
            {
                e.Handled = true;
                textArea.Focus();

                SimpleSegment currentSeg = GetTextLineSegment(e);
                if (currentSeg == SimpleSegment.Invalid)
                {
                    return;
                }
                textArea.Caret.Offset = currentSeg.Offset + currentSeg.Length;
                if (CaptureMouse())
                {
                    selecting      = true;
                    selectionStart = new AnchorSegment(Document, currentSeg.Offset, currentSeg.Length);
                    if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
                    {
                        SimpleSelection simpleSelection = textArea.Selection as SimpleSelection;
                        if (simpleSelection != null)
                        {
                            selectionStart = new AnchorSegment(Document, simpleSelection.SurroundingSegment);
                        }
                    }
                    textArea.Selection = Selection.Create(textArea, selectionStart);
                    if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
                    {
                        ExtendSelection(currentSeg);
                    }
                }
            }
        }
示例#3
0
        private void textArea_Drop(object sender, DragEventArgs e)
        {
            try
            {
                DragDropEffects effect = GetEffect(e);
                e.Effects = effect;
                if (effect != DragDropEffects.None)
                {
                    int start = textArea.Caret.Offset;
                    if (mode == SelectionMode.Drag && textArea.Selection.Contains(start))
                    {
                        Debug.WriteLine("Drop: did not drop: drop target is inside selection");
                        e.Effects = DragDropEffects.None;
                    }
                    else
                    {
                        Debug.WriteLine("Drop: insert at " + start);

                        var pastingEventArgs = new DataObjectPastingEventArgs(e.Data, true, DataFormats.UnicodeText);
                        textArea.RaiseEvent(pastingEventArgs);
                        if (pastingEventArgs.CommandCancelled)
                        {
                            return;
                        }

                        string text = EditingCommandHandler.GetTextToPaste(pastingEventArgs, textArea);
                        if (text == null)
                        {
                            return;
                        }
                        bool rectangular = pastingEventArgs.DataObject.GetDataPresent(RectangleSelection.RectangularSelectionDataType);

                        // Mark the undo group with the currentDragDescriptor, if the drag
                        // is originating from the same control. This allows combining
                        // the undo groups when text is moved.
                        textArea.Document.UndoStack.StartUndoGroup(this.currentDragDescriptor);
                        try
                        {
                            if (rectangular && RectangleSelection.PerformRectangularPaste(textArea, textArea.Caret.Position, text, true))
                            {
                            }
                            else
                            {
                                textArea.Document.Insert(start, text);
                                textArea.Selection = Selection.Create(textArea, start, start + text.Length);
                            }
                        }
                        finally
                        {
                            textArea.Document.UndoStack.EndUndoGroup();
                        }
                    }
                    e.Handled = true;
                }
            }
            catch (Exception ex)
            {
                OnDragException(ex);
            }
        }
        void textArea_Drop(object sender, DragEventArgs e)
        {
            try
            {
                DragDropEffects effect = GetEffect(e);
                e.Effects = effect;
                if (effect != DragDropEffects.None)
                {
                    string text = e.Data.GetData(DataFormats.UnicodeText, true) as string;
                    if (text != null)
                    {
                        int start = textArea.Caret.Offset;
                        if (mode == SelectionMode.Drag && textArea.Selection.Contains(start))
                        {
                            Debug.WriteLine("Drop: did not drop: drop target is inside selection");
                            e.Effects = DragDropEffects.None;
                        }
                        else
                        {
                            Debug.WriteLine("Drop: insert at " + start);

                            bool rectangular = e.Data.GetDataPresent(RectangleSelection.RectangularSelectionDataType);

                            string newLine = TextUtilities.GetNewLineFromDocument(textArea.Document, textArea.Caret.Line);
                            text = TextUtilities.NormalizeNewLines(text, newLine);

                            // Mark the undo group with the currentDragDescriptor, if the drag
                            // is originating from the same control. This allows combining
                            // the undo groups when text is moved.
                            textArea.Document.UndoStack.StartUndoGroup(currentDragDescriptor);
                            try
                            {
                                if (rectangular && RectangleSelection.PerformRectangularPaste(textArea, textArea.Caret.Position, text, true))
                                {
                                }
                                else
                                {
                                    textArea.Document.Insert(start, text);
                                    textArea.Selection = Selection.Create(textArea, start, start + text.Length);
                                }
                            }
                            finally
                            {
                                textArea.Document.UndoStack.EndUndoGroup();
                            }
                        }
                        e.Handled = true;
                    }
                }
            }
            catch (Exception ex)
            {
                OnDragException(ex);
            }
        }
示例#5
0
 /// <inheritdoc/>
 public override Selection UpdateOnDocumentChange(DocumentChangeEventArgs e)
 {
     if (e == null)
     {
         throw new ArgumentNullException(nameof(e));
     }
     return(Selection.Create(
                textArea,
                new TextViewPosition(textArea.Document.GetLocation(e.GetNewOffset(startOffset, AnchorMovementType.Default)), start.VisualColumn),
                new TextViewPosition(textArea.Document.GetLocation(e.GetNewOffset(endOffset, AnchorMovementType.Default)), end.VisualColumn)
                ));
 }
        static void OnDeleteLine(object target, ExecutedRoutedEventArgs args)
        {
            TextArea textArea = GetTextArea(target);

            if (textArea != null && textArea.Document != null)
            {
                DocumentLine currentLine = textArea.Document.GetLineByNumber(textArea.Caret.Line);
                textArea.Selection = Selection.Create(textArea, currentLine.Offset, currentLine.Offset + currentLine.TotalLength);
                textArea.RemoveSelectedText();
                args.Handled = true;
            }
        }
示例#7
0
        public void SetDocumentToNull()
        {
            TextArea textArea = new TextArea();

            textArea.Document     = new TextDocument("1\n2\n3\n4th line");
            textArea.Caret.Offset = 6;
            textArea.Selection    = Selection.Create(textArea, 3, 6);
            textArea.Document     = null;
            Assert.AreEqual(0, textArea.Caret.Offset);
            Assert.AreEqual(new TextLocation(1, 1), textArea.Caret.Location);
            Assert.IsTrue(textArea.Selection.IsEmpty);
        }
示例#8
0
        public void ClearCaretAndSelectionOnDocumentChange()
        {
            TextArea textArea = new TextArea();

            textArea.Document     = new TextDocument("1\n2\n3\n4th line");
            textArea.Caret.Offset = 6;
            textArea.Selection    = Selection.Create(textArea, 3, 6);
            textArea.Document     = new TextDocument("1\n2nd");
            Assert.AreEqual(0, textArea.Caret.Offset);
            Assert.AreEqual(new TextLocation(1, 1), textArea.Caret.Location);
            Assert.IsTrue(textArea.Selection.IsEmpty);
        }
示例#9
0
 void ExtendSelection(SimpleSegment currentSeg)
 {
     if (currentSeg.Offset < selectionStart.Offset)
     {
         textArea.Caret.Offset = currentSeg.Offset;
         textArea.Selection    = Selection.Create(textArea, currentSeg.Offset, selectionStart.Offset + selectionStart.Length);
     }
     else
     {
         textArea.Caret.Offset = currentSeg.Offset + currentSeg.Length;
         textArea.Selection    = Selection.Create(textArea, selectionStart.Offset, currentSeg.Offset + currentSeg.Length);
     }
 }
        /// <inheritdoc/>
        public override Selection UpdateOnDocumentChange(DocumentChangeEventArgs e)
        {
            if (e == null)
            {
                throw new ArgumentNullException("e");
            }
            TextViewPosition newStart = start;
            TextViewPosition newEnd   = end;

            // by changing the existing TextViewPosition, we preserve the VisualColumn (though it might become invalid)
            // and the IsAtEndOfLine property.
            newStart.Location = textArea.Document.GetLocation(e.GetNewOffset(startOffset, AnchorMovementType.Default));
            newEnd.Location   = textArea.Document.GetLocation(e.GetNewOffset(endOffset, AnchorMovementType.Default));
            return(Selection.Create(textArea, newStart, newEnd));
        }
示例#11
0
        /// <inheritdoc/>
        protected void OnMouseLeftButtonDowns(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);
            if (!e.Handled && TextView != null && textArea != null)
            {
                e.Handled = true;
                textArea.Focus();

                SimpleSegment currentSeg = GetTextLineSegment(e);
                if (currentSeg == SimpleSegment.Invalid)
                {
                    return;
                }
                textArea.Caret.Offset = currentSeg.Offset + currentSeg.Length;

                int i = 0;
                while (Char.IsWhiteSpace(textArea.Document.Text[currentSeg.Offset + i]) && i < currentSeg.Length)
                {
                    i++;
                }

                if (CaptureMouse())
                {
                    selecting      = true;
                    selectionStart = new AnchorSegment(Document, currentSeg.Offset + i, currentSeg.Length - i);
                    if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
                    {
                        SimpleSelection simpleSelection = textArea.Selection as SimpleSelection;
                        if (simpleSelection != null)
                        {
                            selectionStart = new AnchorSegment(Document, simpleSelection.SurroundingSegment);
                        }
                    }
                    textArea.Selection = Selection.Create(textArea, selectionStart);
                    if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
                    {
                        ExtendSelection(currentSeg);
                    }
                    textArea.Caret.BringCaretToView(0.0);
                }
            }
        }
示例#12
0
        void ExtendSelectionToMouse(MouseEventArgs e)
        {
            TextViewPosition oldPosition = textArea.Caret.Position;

            if (mode == SelectionMode.Normal || mode == SelectionMode.Rectangular)
            {
                SetCaretOffsetToMousePosition(e);
                if (mode == SelectionMode.Normal && textArea.Selection is RectangleSelection)
                {
                    textArea.Selection = new SimpleSelection(textArea, oldPosition, textArea.Caret.Position);
                }
                else if (mode == SelectionMode.Rectangular && !(textArea.Selection is RectangleSelection))
                {
                    textArea.Selection = new RectangleSelection(textArea, oldPosition, textArea.Caret.Position);
                }
                else
                {
                    textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldPosition, textArea.Caret.Position);
                }
            }
            else if (mode == SelectionMode.WholeWord || mode == SelectionMode.WholeLine)
            {
                var newWord = (mode == SelectionMode.WholeLine) ? GetLineAtMousePosition(e) : GetWordAtMousePosition(e);
                if (newWord != SimpleSegment.Invalid)
                {
                    textArea.Selection = Selection.Create(textArea,
                                                          Math.Min(newWord.Offset, startWord.Offset),
                                                          Math.Max(newWord.EndOffset, startWord.EndOffset));
                    // moves caret to start or end of selection
                    if (newWord.Offset < startWord.Offset)
                    {
                        textArea.Caret.Offset = newWord.Offset;
                    }
                    else
                    {
                        textArea.Caret.Offset = Math.Max(newWord.EndOffset, startWord.EndOffset);
                    }
                }
            }
            textArea.Caret.BringCaretToView(5.0);
        }
示例#13
0
        void ExtendSelectionToMouse(MouseEventArgs e)
        {
            TextViewPosition oldPosition = textArea.Caret.Position;

            if (mode == SelectionMode.Normal || mode == SelectionMode.Rectangular)
            {
                SetCaretOffsetToMousePosition(e);
                if (mode == SelectionMode.Normal && textArea.Selection is RectangleSelection)
                {
                    textArea.Selection = new SimpleSelection(textArea, oldPosition, textArea.Caret.Position);
                }
                else if (mode == SelectionMode.Rectangular && !(textArea.Selection is RectangleSelection))
                {
                    textArea.Selection = new RectangleSelection(textArea, oldPosition, textArea.Caret.Position);
                }
                else
                {
                    textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldPosition, textArea.Caret.Position);
                }
            }
            else if (mode == SelectionMode.WholeWord || mode == SelectionMode.WholeLine)
            {
                var newWord = (mode == SelectionMode.WholeLine) ? GetLineAtMousePosition(e) : GetWordAtMousePosition(e);
                if (newWord != SimpleSegment.Invalid)
                {
                    textArea.Selection = Selection.Create(textArea,
                                                          Math.Min(newWord.Offset, startWord.Offset),
                                                          Math.Max(newWord.EndOffset, startWord.EndOffset));
                    // Set caret offset, but limit the caret to stay inside the selection.
                    // in whole-word selection, it's otherwise possible that we get the caret outside the
                    // selection - but the TextArea doesn't like that and will reset the selection, causing
                    // flickering.
                    SetCaretOffsetToMousePosition(e, textArea.Selection.SurroundingSegment);
                }
            }
            textArea.Caret.BringCaretToView(5.0);
        }
示例#14
0
        /// <inheritdoc/>
        public override Selection UpdateOnDocumentChange(DocumentChangeEventArgs e)
        {
            if (e == null)
            {
                throw new ArgumentNullException("e");
            }
            int newStartOffset, newEndOffset;

            if (startOffset <= endOffset)
            {
                newStartOffset = e.GetNewOffset(startOffset, AnchorMovementType.Default);
                newEndOffset   = Math.Max(newStartOffset, e.GetNewOffset(endOffset, AnchorMovementType.BeforeInsertion));
            }
            else
            {
                newEndOffset   = e.GetNewOffset(endOffset, AnchorMovementType.Default);
                newStartOffset = Math.Max(newEndOffset, e.GetNewOffset(startOffset, AnchorMovementType.BeforeInsertion));
            }
            return(Selection.Create(
                       textArea,
                       new TextViewPosition(textArea.Document.GetLocation(newStartOffset), start.VisualColumn),
                       new TextViewPosition(textArea.Document.GetLocation(newEndOffset), end.VisualColumn)
                       ));
        }
示例#15
0
        void textArea_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            mode = SelectionMode.None;
            if (!e.Handled && e.ChangedButton == MouseButton.Left)
            {
                ModifierKeys modifiers = Keyboard.Modifiers;
                bool         shift     = (modifiers & ModifierKeys.Shift) == ModifierKeys.Shift;
                if (enableTextDragDrop && e.ClickCount == 1 && !shift)
                {
                    int visualColumn;
                    int offset = GetOffsetFromMousePosition(e, out visualColumn);
                    if (textArea.Selection.Contains(offset))
                    {
                        if (textArea.CaptureMouse())
                        {
                            mode = SelectionMode.PossibleDragStart;
                            possibleDragStartMousePos = e.GetPosition(textArea);
                        }
                        e.Handled = true;
                        return;
                    }
                }

                var oldPosition = textArea.Caret.Position;
                SetCaretOffsetToMousePosition(e);


                if (!shift)
                {
                    textArea.ClearSelection();
                }
                if (textArea.CaptureMouse())
                {
                    if ((modifiers & ModifierKeys.Alt) == ModifierKeys.Alt && textArea.Options.EnableRectangularSelection)
                    {
                        mode = SelectionMode.Rectangular;
                        if (shift && textArea.Selection is RectangleSelection)
                        {
                            textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldPosition, textArea.Caret.Position);
                        }
                    }
                    else if (e.ClickCount == 1 && ((modifiers & ModifierKeys.Control) == 0))
                    {
                        mode = SelectionMode.Normal;
                        if (shift && !(textArea.Selection is RectangleSelection))
                        {
                            textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldPosition, textArea.Caret.Position);
                        }
                    }
                    else
                    {
                        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();
                            return;
                        }
                        if (shift && !textArea.Selection.IsEmpty)
                        {
                            if (startWord.Offset < textArea.Selection.SurroundingSegment.Offset)
                            {
                                textArea.Selection = textArea.Selection.SetEndpoint(new TextViewPosition(textArea.Document.GetLocation(startWord.Offset)));
                            }
                            else if (startWord.EndOffset > textArea.Selection.SurroundingSegment.EndOffset)
                            {
                                textArea.Selection = textArea.Selection.SetEndpoint(new TextViewPosition(textArea.Document.GetLocation(startWord.EndOffset)));
                            }
                            this.startWord = new AnchorSegment(textArea.Document, textArea.Selection.SurroundingSegment);
                        }
                        else
                        {
                            textArea.Selection = Selection.Create(textArea, startWord.Offset, startWord.EndOffset);
                            this.startWord     = new AnchorSegment(textArea.Document, startWord.Offset, startWord.Length);
                        }
                    }
                }
            }
            e.Handled = true;
        }
        void textArea_Drop(object sender, DragEventArgs e)
        {
            try {
                DragDropEffects effect = GetEffect(e);
                e.Effects = effect;
                if (effect != DragDropEffects.None)
                {
                    string text = e.Data.GetData(DataFormats.UnicodeText, true) as string;
                    if (text != null)
                    {
                        int start = textArea.Caret.Offset;
                        if (mode == SelectionMode.Drag && textArea.Selection.Contains(start))
                        {
                            Debug.WriteLine("Drop: did not drop: drop target is inside selection");
                            e.Effects = DragDropEffects.None;
                        }
                        else
                        {
                            Debug.WriteLine("Drop: insert at " + start);

                            bool rectangular = e.Data.GetDataPresent(RectangleSelection.RectangularSelectionDataType);

                            string newLine = TextUtilities.GetNewLineFromDocument(textArea.Document, textArea.Caret.Line);
                            text = TextUtilities.NormalizeNewLines(text, newLine);

                            string pasteFormat;
                            // fill the suggested DataFormat used for the paste action:
                            if (rectangular)
                            {
                                pasteFormat = RectangleSelection.RectangularSelectionDataType;
                            }
                            else
                            {
                                pasteFormat = DataFormats.UnicodeText;
                            }

                            var pastingEventArgs = new DataObjectPastingEventArgs(e.Data, true, pasteFormat);
                            textArea.RaiseEvent(pastingEventArgs);
                            if (pastingEventArgs.CommandCancelled)
                            {
                                return;
                            }

                            // DataObject.PastingEvent handlers might have changed the format to apply.
                            rectangular = pastingEventArgs.FormatToApply == RectangleSelection.RectangularSelectionDataType;

                            // Mark the undo group with the currentDragDescriptor, if the drag
                            // is originating from the same control. This allows combining
                            // the undo groups when text is moved.
                            textArea.Document.UndoStack.StartUndoGroup(this.currentDragDescriptor);
                            try {
                                if (rectangular && RectangleSelection.PerformRectangularPaste(textArea, textArea.Caret.Position, text, true))
                                {
                                }
                                else
                                {
                                    textArea.Document.Insert(start, text);
                                    textArea.Selection = Selection.Create(textArea, start, start + text.Length);
                                }
                            } finally {
                                textArea.Document.UndoStack.EndUndoGroup();
                            }
                        }
                        e.Handled = true;
                    }
                }
            } catch (Exception ex) {
                OnDragException(ex);
            }
        }