From c7173845cf2e2bb1d760e18090864e6415bea4b5 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 30 Aug 2009 16:43:54 +0000 Subject: [PATCH] Fixed ArgumentOutOfRangeException in Caret when closing a folding section. Added IsReadOnly property to AvalonEdit.TextEditor. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4839 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../ICSharpCode.AvalonEdit/Editing/Caret.cs | 4 +++ .../Editing/NoReadOnlySections.cs | 19 +++++++++++++ .../ICSharpCode.AvalonEdit/TextEditor.cs | 28 +++++++++++++++++++ .../Src/ExceptionBox.cs | 2 +- 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs index e7b903edae..425077258d 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs @@ -46,6 +46,10 @@ namespace ICSharpCode.AvalonEdit.Editing if (visible) { Show(); } + // required because the visual columns might have changed if the + // element generators did something differently than on the last run + // (e.g. a FoldingSection was collapsed) + InvalidateVisualColumn(); } void TextView_ScrollOffsetChanged(object sender, EventArgs e) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/NoReadOnlySections.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/NoReadOnlySections.cs index 135946f87b..df0a8b044c 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/NoReadOnlySections.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/NoReadOnlySections.cs @@ -6,6 +6,7 @@ // using System; +using System.Linq; using System.Collections.Generic; using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Utils; @@ -32,4 +33,22 @@ namespace ICSharpCode.AvalonEdit.Editing return ExtensionMethods.Sequence(segment); } } + + /// + /// that completely disables editing. + /// + sealed class ReadOnlyDocument : IReadOnlySectionProvider + { + public static readonly ReadOnlyDocument Instance = new ReadOnlyDocument(); + + public bool CanInsert(int offset) + { + return false; + } + + public IEnumerable GetDeletableSegments(ISegment segment) + { + return Enumerable.Empty(); + } + } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditor.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditor.cs index c250d5d06a..840ca93720 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditor.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditor.cs @@ -326,6 +326,34 @@ namespace ICSharpCode.AvalonEdit } #endregion + #region IsReadOnly + /// + /// IsReadOnly dependency property. + /// + public static readonly DependencyProperty IsReadOnlyProperty = + DependencyProperty.Register("IsReadOnly", typeof(bool), typeof(TextEditor), + new FrameworkPropertyMetadata(Boxes.False, OnIsReadOnlyChanged)); + + /// + /// Specifies whether the user can change the text editor content. + /// Setting this property will replace the + /// TextArea.ReadOnlySectionProvider. + /// + public bool IsReadOnly { + get { return (bool)GetValue(IsReadOnlyProperty); } + set { SetValue(IsReadOnlyProperty, Boxes.Box(value)); } + } + + static void OnIsReadOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + TextEditor editor = (TextEditor)d; + if ((bool)e.NewValue) + editor.TextArea.ReadOnlySectionProvider = NoReadOnlySections.Instance; + else + editor.TextArea.ReadOnlySectionProvider = NoReadOnlySections.Instance; + } + #endregion + #region TextBoxBase-like methods /// /// Appends text to the end of the document. diff --git a/src/Main/ICSharpCode.SharpDevelop.Sda/Src/ExceptionBox.cs b/src/Main/ICSharpCode.SharpDevelop.Sda/Src/ExceptionBox.cs index 4686e5507a..e38d91a44a 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Sda/Src/ExceptionBox.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Sda/Src/ExceptionBox.cs @@ -218,7 +218,7 @@ namespace ICSharpCode.SharpDevelop.Sda if (MessageBox.Show(StringParser.Parse("${res:ICSharpCode.SharpDevelop.ExceptionBox.QuitWarning}"), MessageService.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.DefaultDesktopOnly) == DialogResult.Yes) { - Application.Exit(); + Process.GetCurrentProcess().Kill(); } }