void CopyData (TextEditorData data, Selection selection)
{
copiedDocument = null;
monoDocument = null;
if (selection != null && data != null && data.Document != null) {
copiedDocument = new TextDocument ();
monoDocument = new TextDocument ();
this.docStyle = data.ColorStyle;
this.options = data.Options;
this.mode = SyntaxModeService.GetSyntaxMode (monoDocument, data.MimeType);
switch (selection.SelectionMode) {
case SelectionMode.Normal:
isBlockMode = false;
var segment = selection.GetSelectionRange (data);
var text = data.GetTextAt (segment);
copiedDocument.Text = text;
monoDocument.Text = text;
var line = data.Document.GetLineByOffset (segment.Offset);
var spanStack = line.StartSpan.Clone ();
SyntaxModeService.ScanSpans (data.Document, this.mode as SyntaxMode, this.mode as SyntaxMode, spanStack, line.Offset, segment.Offset);
this.copiedDocument.GetLine (DocumentLocation.MinLine).StartSpan = spanStack;
break;
case SelectionMode.Block:
isBlockMode = true;
DocumentLocation visStart = data.LogicalToVisualLocation (selection.Anchor);
DocumentLocation visEnd = data.LogicalToVisualLocation (selection.Lead);
int startCol = System.Math.Min (visStart.Column, visEnd.Column);
int endCol = System.Math.Max (visStart.Column, visEnd.Column);
for (int lineNr = selection.MinLine; lineNr <= selection.MaxLine; lineNr++) {
DocumentLine curLine = data.Document.GetLine (lineNr);
int col1 = curLine.GetLogicalColumn (data, startCol) - 1;
int col2 = System.Math.Min (curLine.GetLogicalColumn (data, endCol) - 1, curLine.Length);
if (col1 < col2) {
copiedDocument.Insert (copiedDocument.TextLength, data.Document.GetTextAt (curLine.Offset + col1, col2 - col1));
monoDocument.Insert (monoDocument.TextLength, data.Document.GetTextAt (curLine.Offset + col1, col2 - col1));
}
if (lineNr < selection.MaxLine) {
// Clipboard line end needs to be system dependend and not the document one.
copiedDocument.Insert (copiedDocument.TextLength, Environment.NewLine);
// \r in mono document stands for block selection line end.
monoDocument.Insert (monoDocument.TextLength, "\r");
}
}
line = data.Document.GetLine (selection.MinLine);
spanStack = line.StartSpan.Clone ();
SyntaxModeService.ScanSpans (data.Document, this.mode as SyntaxMode, this.mode as SyntaxMode, spanStack, line.Offset, line.Offset + startCol);
this.copiedDocument.GetLine (DocumentLocation.MinLine).StartSpan = spanStack;
break;
}
} else {
copiedDocument = null;
}
}