|
|
@ -63,12 +63,15 @@ namespace ICSharpCode.TextEditor |
|
|
|
|
|
|
|
protected void OnDragEnter(object sender, DragEventArgs e) |
|
|
|
{ |
|
|
|
if (e.Data.GetDataPresent(typeof(string))) |
|
|
|
if (IsSupportedData(e.Data)) |
|
|
|
e.Effect = GetDragDropEffect(e); |
|
|
|
} |
|
|
|
|
|
|
|
private void InsertString(int offset, string str) |
|
|
|
{ |
|
|
|
if (str == null) |
|
|
|
return; |
|
|
|
|
|
|
|
textArea.Document.Insert(offset, str); |
|
|
|
|
|
|
|
textArea.SelectionManager.SetSelection( |
|
|
@ -82,17 +85,21 @@ namespace ICSharpCode.TextEditor |
|
|
|
|
|
|
|
protected void OnDragDrop(object sender, DragEventArgs e) |
|
|
|
{ |
|
|
|
// var p = textArea.PointToClient(new Point(e.X, e.Y));
|
|
|
|
if (!IsSupportedData(e.Data)) |
|
|
|
{ |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (e.Data.GetDataPresent(typeof(string))) |
|
|
|
textArea.BeginUpdate(); |
|
|
|
textArea.Document.UndoStack.StartUndoGroup(); |
|
|
|
try |
|
|
|
{ |
|
|
|
textArea.BeginUpdate(); |
|
|
|
textArea.Document.UndoStack.StartUndoGroup(); |
|
|
|
var offset = textArea.Caret.Offset; |
|
|
|
if (textArea.IsReadOnly(offset)) |
|
|
|
return; |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
var offset = textArea.Caret.Offset; |
|
|
|
if (textArea.IsReadOnly(offset)) |
|
|
|
return; |
|
|
|
if (e.Data.GetDataPresent(typeof(DefaultSelection))) |
|
|
|
{ |
|
|
|
var sel = (ISelection)e.Data.GetData(typeof(DefaultSelection)); |
|
|
@ -108,16 +115,33 @@ namespace ICSharpCode.TextEditor |
|
|
|
offset -= len; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
textArea.SelectionManager.ClearSelection(); |
|
|
|
InsertString(offset, (string)e.Data.GetData(typeof(string))); |
|
|
|
textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea)); |
|
|
|
} |
|
|
|
finally |
|
|
|
catch (System.InvalidCastException) |
|
|
|
{ |
|
|
|
textArea.Document.UndoStack.EndUndoGroup(); |
|
|
|
textArea.EndUpdate(); |
|
|
|
/* |
|
|
|
If GetDataPresent(typeof(DefaultSelection)) threw this |
|
|
|
exception, then it's an interprocess DefaultSelection |
|
|
|
COM object that is not serializable! In general, |
|
|
|
GetDataPresent(typeof(...)) throws InvalidCastException |
|
|
|
for drags and drops from other GitExt processes (maybe |
|
|
|
we need to make the data objects [Serializable]?). We |
|
|
|
can get around this exception by doing |
|
|
|
GetDataPresent(String s) [using the string of the type |
|
|
|
name seems to work fine!] Since it is interprocess |
|
|
|
data, just get the string data from it - special |
|
|
|
handling logic in try {} is only valid for selections |
|
|
|
within the current process's text editor! |
|
|
|
*/ |
|
|
|
} |
|
|
|
|
|
|
|
textArea.SelectionManager.ClearSelection(); |
|
|
|
InsertString(offset, (string)e.Data.GetData("System.String")); |
|
|
|
textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea)); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
textArea.Document.UndoStack.EndUndoGroup(); |
|
|
|
textArea.EndUpdate(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -137,7 +161,7 @@ namespace ICSharpCode.TextEditor |
|
|
|
|
|
|
|
textArea.Caret.Position = new TextLocation(realmousepos.X, lineNr); |
|
|
|
textArea.SetDesiredColumn(); |
|
|
|
if (e.Data.GetDataPresent(typeof(string)) && !textArea.IsReadOnly(textArea.Caret.Offset)) |
|
|
|
if (IsSupportedData(e.Data) && !textArea.IsReadOnly(textArea.Caret.Offset)) |
|
|
|
e.Effect = GetDragDropEffect(e); |
|
|
|
else |
|
|
|
e.Effect = DragDropEffects.None; |
|
|
@ -147,5 +171,12 @@ namespace ICSharpCode.TextEditor |
|
|
|
e.Effect = DragDropEffects.None; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static bool IsSupportedData(IDataObject data) |
|
|
|
{ |
|
|
|
return data.GetDataPresent(DataFormats.StringFormat) |
|
|
|
|| data.GetDataPresent(DataFormats.Text) |
|
|
|
|| data.GetDataPresent(DataFormats.UnicodeText); |
|
|
|
} |
|
|
|
} |
|
|
|
} |