diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
index cd4e7a87d6..a965f51524 100644
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
@@ -50,6 +50,7 @@
3.5
+
3.0
@@ -116,5 +117,10 @@
QuickClassBrowser.cs
+
+ {8035765F-D51F-4A0C-A746-2FD100E19419}
+ ICSharpCode.SharpDevelop.Widgets
+ False
+
\ No newline at end of file
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs
index 838f16b390..12102accc8 100644
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs
@@ -21,7 +21,8 @@ using System.Windows.Threading;
namespace ICSharpCode.AvalonEdit.AddIn
{
- public class AvalonEditViewContent : AbstractViewContent, IEditable, IMementoCapable, ITextEditorProvider, IPositionable, IParseInformationListener
+ public class AvalonEditViewContent
+ : AbstractViewContent, IEditable, IMementoCapable, ITextEditorProvider, IPositionable, IParseInformationListener, IToolsHost
{
readonly CodeEditor codeEditor = new CodeEditor();
@@ -33,6 +34,12 @@ namespace ICSharpCode.AvalonEdit.AddIn
file.ForceInitializeView(this);
codeEditor.Document.Changed += textEditor_Document_Changed;
codeEditor.CaretPositionChanged += CaretChanged;
+ codeEditor.TextCopied += codeEditor_TextCopied;
+ }
+
+ void codeEditor_TextCopied(object sender, ICSharpCode.AvalonEdit.Editing.TextEventArgs e)
+ {
+ TextEditorSideBar.Instance.PutInClipboardRing(e.Text);
}
void textEditor_Document_Changed(object sender, DocumentChangeEventArgs e)
@@ -248,5 +255,9 @@ namespace ICSharpCode.AvalonEdit.AddIn
}));
}
#endregion
+
+ object IToolsHost.ToolsContent {
+ get { return TextEditorSideBar.Instance; }
+ }
}
}
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
index b4c503b891..3ed7143c19 100644
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
@@ -193,9 +193,18 @@ namespace ICSharpCode.AvalonEdit.AddIn
textEditor.TextArea.TextView.MouseRightButtonDown += TextViewMouseRightButtonDown;
textEditor.TextArea.TextView.ContextMenuOpening += TextViewContextMenuOpening;
+ textEditor.TextArea.TextCopied += textEditor_TextArea_TextCopied;
return textEditor;
}
+
+ public event EventHandler TextCopied;
+
+ void textEditor_TextArea_TextCopied(object sender, TextEventArgs e)
+ {
+ if (TextCopied != null)
+ TextCopied(this, e);
+ }
protected virtual void DisposeTextEditor(TextEditor textEditor)
{
diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs
index 335e94ed80..fdfef02ff6 100644
--- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs
@@ -307,6 +307,10 @@ namespace ICSharpCode.AvalonEdit.Editing
static void CopySelectedText(TextArea textArea)
{
Clipboard.SetDataObject(textArea.Selection.CreateDataObject(textArea), true);
+
+ string text = textArea.Selection.GetText(textArea.Document);
+ text = NewLineFinder.NormalizeNewLines(text, Environment.NewLine);
+ textArea.OnTextCopied(new TextEventArgs(text));
}
const string LineSelectedType = "MSDEVLineSelect"; // This is the type VS 2003 and 2005 use for flagging a whole line copy
@@ -316,7 +320,8 @@ namespace ICSharpCode.AvalonEdit.Editing
ISegment wholeLine = new SimpleSegment(line.Offset, line.TotalLength);
string text = textArea.Document.GetText(wholeLine);
// Ensure we use the appropriate newline sequence for the OS
- DataObject data = new DataObject(NewLineFinder.NormalizeNewLines(text, Environment.NewLine));
+ text = NewLineFinder.NormalizeNewLines(text, Environment.NewLine);
+ DataObject data = new DataObject(text);
// Also copy text in HTML format to clipboard - good for pasting text into Word
// or to the SharpDevelop forums.
@@ -328,6 +333,8 @@ namespace ICSharpCode.AvalonEdit.Editing
data.SetData(LineSelectedType, lineSelected, false);
Clipboard.SetDataObject(data, true);
+
+ textArea.OnTextCopied(new TextEventArgs(text));
}
static void CanPaste(object target, CanExecuteRoutedEventArgs args)
diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs
index 3a8a8afa49..3cf059e5ee 100644
--- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs
@@ -781,5 +781,44 @@ namespace ICSharpCode.AvalonEdit.Editing
{
return textView.Services.GetService(serviceType);
}
+
+ ///
+ /// Occurs when text inside the TextArea was copied.
+ ///
+ public event EventHandler TextCopied;
+
+ internal void OnTextCopied(TextEventArgs e)
+ {
+ if (TextCopied != null)
+ TextCopied(this, e);
+ }
+ }
+
+ ///
+ /// EventArgs with text.
+ ///
+ [Serializable]
+ public class TextEventArgs : EventArgs
+ {
+ string text;
+
+ ///
+ /// Gets the text.
+ ///
+ public string Text {
+ get {
+ return text;
+ }
+ }
+
+ ///
+ /// Creates a new TextEventArgs instance.
+ ///
+ public TextEventArgs(string text)
+ {
+ if (text == null)
+ throw new ArgumentNullException("text");
+ this.text = text;
+ }
}
}
diff --git a/src/Main/Base/Project/Src/Gui/Components/SideBar/TextEditorSideBar.cs b/src/Main/Base/Project/Src/Gui/Components/SideBar/TextEditorSideBar.cs
index 665d67d87d..a6141b1e24 100644
--- a/src/Main/Base/Project/Src/Gui/Components/SideBar/TextEditorSideBar.cs
+++ b/src/Main/Base/Project/Src/Gui/Components/SideBar/TextEditorSideBar.cs
@@ -167,5 +167,15 @@ namespace ICSharpCode.SharpDevelop.Gui
return el;
}
+
+ protected override object StartItemDrag(SideTabItem draggedItem)
+ {
+ if (this.ActiveTab.ChoosedItem != draggedItem && this.ActiveTab.Items.Contains(draggedItem)) {
+ this.ActiveTab.ChoosedItem = draggedItem;
+ }
+ var dataObject = new System.Windows.DataObject();
+ dataObject.SetText(draggedItem.Tag.ToString());
+ return dataObject;
+ }
}
}