From 41b10e921c3c1d58b760442aa82d799822706012 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 9 Mar 2011 21:03:52 +0100 Subject: [PATCH 1/3] fixed scrolling in Console-Pads --- .../TextEditorOptions.cs | 27 +++++++++++++++++++ .../Src/Gui/Pads/AbstractConsolePad.cs | 10 +++++++ 2 files changed, 37 insertions(+) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs index 565429002d..8a967e31a2 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs @@ -3,6 +3,7 @@ using System; using System.ComponentModel; +using System.Reflection; using System.Text; namespace ICSharpCode.AvalonEdit @@ -13,6 +14,32 @@ namespace ICSharpCode.AvalonEdit [Serializable] public class TextEditorOptions : INotifyPropertyChanged { + #region ctor + /// + /// Initializes an empty instance of TextEditorOptions. + /// + public TextEditorOptions() + { + } + + /// + /// Initializes a new instance of TextEditorOptions by copying all values + /// from to the new instance. + /// + public TextEditorOptions(TextEditorOptions options) + { + // get all the fields in the class + FieldInfo[] fields = GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + + // copy each value over to 'this' + foreach(FieldInfo fi in fields) { + if (fi.IsNotSerialized) + continue; + fi.SetValue(this, fi.GetValue(options)); + } + } + #endregion + #region PropertyChanged handling /// [field: NonSerialized] diff --git a/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs b/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs index 7e033aaa92..4a588e840d 100755 --- a/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs @@ -1,6 +1,7 @@ // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) +using ICSharpCode.AvalonEdit; using ICSharpCode.Core.Presentation; using System; using System.Collections.Generic; @@ -262,6 +263,8 @@ namespace ICSharpCode.SharpDevelop.Gui internal ITextEditor editorAdapter; internal BeginReadOnlySectionProvider readOnlyRegion; + static TextEditorOptions consoleOptions; + public ConsoleControl() { this.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) }); @@ -276,6 +279,13 @@ namespace ICSharpCode.SharpDevelop.Gui this.editor.SetValue(Grid.RowProperty, 0); this.editor.ShowLineNumbers = false; + if (consoleOptions == null) { + consoleOptions = new TextEditorOptions(editor.Options); + consoleOptions.AllowScrollBelowDocument = false; + } + + this.editor.Options = consoleOptions; + this.Children.Add(editor); editor.TextArea.ReadOnlySectionProvider = readOnlyRegion = new BeginReadOnlySectionProvider(); From b4f6f3a435bba08603528058e51890db13f55e47 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 10 Mar 2011 22:28:31 +0100 Subject: [PATCH 2/3] Fixed bug introduced in b7b12d310e2021338c3e12e9926ecf380a44e471 (Reduce memory usage when dealing with long lines and word-wrapping) --- .../Rendering/LinkElementGenerator.cs | 16 ++++++++++------ .../Rendering/SingleCharacterElementGenerator.cs | 5 ++--- .../Rendering/VisualLine.cs | 10 ++++++++-- .../Utils/StringSegment.cs | 2 +- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/LinkElementGenerator.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/LinkElementGenerator.cs index 70d59358ae..354281fce8 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/LinkElementGenerator.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/LinkElementGenerator.cs @@ -57,25 +57,29 @@ namespace ICSharpCode.AvalonEdit.Rendering this.RequireControlModifierForClick = options.RequireControlModifierForHyperlinkClick; } - Match GetMatch(int startOffset) + Match GetMatch(int startOffset, out int matchOffset) { int endOffset = CurrentContext.VisualLine.LastDocumentLine.EndOffset; StringSegment relevantText = CurrentContext.GetText(startOffset, endOffset - startOffset); - return linkRegex.Match(relevantText.Text, relevantText.Offset, relevantText.Count); + Match m = linkRegex.Match(relevantText.Text, relevantText.Offset, relevantText.Count); + matchOffset = m.Success ? m.Index - relevantText.Offset + startOffset : -1; + return m; } /// public override int GetFirstInterestedOffset(int startOffset) { - Match m = GetMatch(startOffset); - return m.Success ? startOffset + m.Index : -1; + int matchOffset; + GetMatch(startOffset, out matchOffset); + return matchOffset; } /// public override VisualLineElement ConstructElement(int offset) { - Match m = GetMatch(offset); - if (m.Success && m.Index == 0) { + int matchOffset; + Match m = GetMatch(offset, out matchOffset); + if (m.Success && matchOffset == offset) { Uri uri = GetUriFromMatch(m); if (uri == null) return null; diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/SingleCharacterElementGenerator.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/SingleCharacterElementGenerator.cs index 4ff5def317..1ad5dcb207 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/SingleCharacterElementGenerator.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/SingleCharacterElementGenerator.cs @@ -62,9 +62,8 @@ namespace ICSharpCode.AvalonEdit.Rendering DocumentLine endLine = CurrentContext.VisualLine.LastDocumentLine; StringSegment relevantText = CurrentContext.GetText(startOffset, endLine.EndOffset - startOffset); - int endPos = relevantText.Offset + relevantText.Count; - for (int i = relevantText.Offset; i < endPos; i++) { - char c = relevantText.Text[i]; + for (int i = 0; i < relevantText.Count; i++) { + char c = relevantText.Text[relevantText.Offset + i]; switch (c) { case ' ': if (ShowSpaces) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLine.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLine.cs index 2e4136b41a..53b606521f 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLine.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLine.cs @@ -137,8 +137,14 @@ namespace ICSharpCode.AvalonEdit.Rendering askInterestOffset = 0; offset += element.DocumentLength; if (offset > currentLineEnd) { - LastDocumentLine = document.GetLineByOffset(offset); - currentLineEnd = LastDocumentLine.Offset + LastDocumentLine.Length; + DocumentLine newEndLine = document.GetLineByOffset(offset); + if (newEndLine == this.LastDocumentLine) { + throw new InvalidOperationException( + "The VisualLineElementGenerator " + g.GetType().Name + + " produced an element which ends within the line delimiter"); + } + currentLineEnd = newEndLine.Offset + newEndLine.Length; + this.LastDocumentLine = newEndLine; } break; } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/StringSegment.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/StringSegment.cs index 8a39ea874f..cb5467f128 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/StringSegment.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/StringSegment.cs @@ -1,5 +1,5 @@ // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under MIT X11 license (for details please see \doc\license.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; From c610e1b0b9e0b8cef53299ef7e3eb20eb37f9961 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 10 Mar 2011 22:32:16 +0100 Subject: [PATCH 3/3] Fix issue in TextEditorOptions copy constructor. --- .../ICSharpCode.AvalonEdit/TextEditorOptions.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs index 8a967e31a2..cfa383c776 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs @@ -29,13 +29,12 @@ namespace ICSharpCode.AvalonEdit public TextEditorOptions(TextEditorOptions options) { // get all the fields in the class - FieldInfo[] fields = GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); - + FieldInfo[] fields = typeof(TextEditorOptions).GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + // copy each value over to 'this' foreach(FieldInfo fi in fields) { - if (fi.IsNotSerialized) - continue; - fi.SetValue(this, fi.GetValue(options)); + if (!fi.IsNotSerialized) + fi.SetValue(this, fi.GetValue(options)); } } #endregion