From d4068f00876df287401bf6a752a289737b3922a3 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 14 Sep 2009 20:54:34 +0000 Subject: [PATCH] Implemented TextEditorSideBar for AvalonEdit. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4929 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../AvalonEdit.AddIn/AvalonEdit.AddIn.csproj | 6 +++ .../Src/AvalonEditViewContent.cs | 13 ++++++- .../AvalonEdit.AddIn/Src/CodeEditor.cs | 9 +++++ .../Editing/EditingCommandHandler.cs | 9 ++++- .../Editing/TextArea.cs | 39 +++++++++++++++++++ .../Components/SideBar/TextEditorSideBar.cs | 10 +++++ 6 files changed, 84 insertions(+), 2 deletions(-) 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; + } } }