internal bool CalculateClickLocation (double x, double y, out DocumentLocation clickLocation) { VisualLocationTranslator trans = new VisualLocationTranslator (this); clickLocation = trans.PointToLocation (x, y); if (clickLocation.Line < DocumentLocation.MinLine || clickLocation.Column < DocumentLocation.MinColumn) return false; DocumentLine line = Document.GetLine (clickLocation.Line); if (line != null && clickLocation.Column >= line.Length + 1 && GetWidth (Document.GetTextAt (line.SegmentIncludingDelimiter) + "-") < x) { clickLocation = new DocumentLocation (clickLocation.Line, line.Length + 1); if (textEditor.GetTextEditorData ().HasIndentationTracker && textEditor.Options.IndentStyle == IndentStyle.Virtual && clickLocation.Column == 1) { int indentationColumn = this.textEditor.GetTextEditorData ().GetVirtualIndentationColumn (clickLocation); if (indentationColumn > clickLocation.Column) clickLocation = new DocumentLocation (clickLocation.Line, indentationColumn); } } return true; }
protected internal override void MousePressed (MarginMouseEventArgs args) { base.MousePressed (args); if (args.TriggersContextMenu ()) return; inSelectionDrag = false; inDrag = false; Selection selection = textEditor.MainSelection; int anchor = selection != null ? selection.GetAnchorOffset (this.textEditor.GetTextEditorData ()) : -1; int oldOffset = textEditor.Caret.Offset; string link = GetLink != null ? GetLink (args) : null; if (!String.IsNullOrEmpty (link)) { textEditor.FireLinkEvent (link, args.Button, args.ModifierState); return; } if (args.Button == 1) { VisualLocationTranslator trans = new VisualLocationTranslator (this); clickLocation = trans.PointToLocation (args.X, args.Y); if (clickLocation.Line < DocumentLocation.MinLine || clickLocation.Column < DocumentLocation.MinColumn) return; LineSegment line = Document.GetLine (clickLocation.Line); bool isHandled = false; if (line != null) { foreach (TextMarker marker in line.Markers) { if (marker is IActionTextMarker) { isHandled |= ((IActionTextMarker)marker).MousePressed (this.textEditor, args); if (isHandled) break; } } } if (isHandled) return; if (line != null && clickLocation.Column >= line.Length + 1 && GetWidth (Document.GetTextAt (line.SegmentIncludingDelimiter) + "-") < args.X) { clickLocation = new DocumentLocation (clickLocation.Line, line.Length + 1); if (textEditor.GetTextEditorData ().HasIndentationTracker && textEditor.Options.IndentStyle == IndentStyle.Virtual) { int indentationColumn = this.textEditor.GetTextEditorData ().GetVirtualIndentationColumn (clickLocation); if (indentationColumn > clickLocation.Column) clickLocation = new DocumentLocation (clickLocation.Line, indentationColumn); } } int offset = Document.LocationToOffset (clickLocation); if (offset < 0) { textEditor.RunAction (CaretMoveActions.ToDocumentEnd); return; } if (args.Button == 2 && selection != null && selection.Contains (Document.OffsetToLocation (offset))) { textEditor.ClearSelection (); return; } if (args.Type == EventType.TwoButtonPress) { var data = textEditor.GetTextEditorData (); mouseWordStart = data.FindCurrentWordStart (offset); mouseWordEnd = data.FindCurrentWordEnd (offset); Caret.Offset = mouseWordEnd; textEditor.MainSelection = new Selection (textEditor.Document.OffsetToLocation (mouseWordStart), textEditor.Document.OffsetToLocation (mouseWordEnd)); inSelectionDrag = true; mouseSelectionMode = MouseSelectionMode.Word; return; } else if (args.Type == EventType.ThreeButtonPress) { int lineNr = Document.OffsetToLineNumber (offset); textEditor.SetSelectLines (lineNr, lineNr); inSelectionDrag = true; mouseSelectionMode = MouseSelectionMode.WholeLine; return; } mouseSelectionMode = MouseSelectionMode.SingleChar; if (textEditor.IsSomethingSelected && textEditor.SelectionRange.Offset <= offset && offset < textEditor.SelectionRange.EndOffset && clickLocation != textEditor.Caret.Location) { inDrag = true; } else { if ((args.ModifierState & Gdk.ModifierType.ShiftMask) == ModifierType.ShiftMask) { inSelectionDrag = true; Caret.PreserveSelection = true; if (!textEditor.IsSomethingSelected) { textEditor.MainSelection = new Selection (Caret.Location, clickLocation); Caret.Location = clickLocation; } else { Caret.Location = clickLocation; textEditor.ExtendSelectionTo (clickLocation); } Caret.PreserveSelection = false; } else { inSelectionDrag = false; textEditor.ClearSelection (); Caret.Location = clickLocation; } textEditor.RequestResetCaretBlink (); } } DocumentLocation docLocation = PointToLocation (args.X, args.Y); if (docLocation.Line < DocumentLocation.MinLine || docLocation.Column < DocumentLocation.MinColumn) return; // disable middle click on windows. if (!Platform.IsWindows && args.Button == 2 && this.textEditor.CanEdit (docLocation.Line)) { TextSegment selectionRange = TextSegment.Invalid; int offset = Document.LocationToOffset (docLocation); if (selection != null) selectionRange = selection.GetSelectionRange (this.textEditor.GetTextEditorData ()); bool autoScroll = textEditor.Caret.AutoScrollToCaret; textEditor.Caret.AutoScrollToCaret = false; int length = ClipboardActions.PasteFromPrimary (textEditor.GetTextEditorData (), offset); textEditor.Caret.Offset = oldOffset; if (selection != null) { if (offset < selectionRange.EndOffset) { oldOffset += length; anchor += length; selection = new Selection (Document.OffsetToLocation (selectionRange.Offset + length), Document.OffsetToLocation (selectionRange.Offset + length + selectionRange.Length)); } textEditor.MainSelection = selection; } if (autoScroll) textEditor.Caret.ActivateAutoScrollWithoutMove (); } }