From 2bbeefdaf20fadf7c5192d5a51aa562945ad028c Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 19 Sep 2011 15:36:59 +0200 Subject: [PATCH] Allow using DocumentHighlighter with ReadOnlyDocument. --- .../Src/CustomizableHighlightingColorizer.cs | 6 ++- .../Highlighting/DocumentHighlighter.cs | 43 ++++++++++--------- .../Highlighting/HighlightedLine.cs | 13 +++--- .../Highlighting/HighlightingColorizer.cs | 4 +- .../Highlighting/HtmlClipboard.cs | 4 +- .../Highlighting/IHighlighter.cs | 4 +- 6 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs index 22f99bdb23..e8ab5e3a2b 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs @@ -12,6 +12,8 @@ using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Editing; using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Rendering; +using ICSharpCode.AvalonEdit.Utils; +using ICSharpCode.NRefactory.Editor; namespace ICSharpCode.AvalonEdit.AddIn { @@ -119,11 +121,11 @@ namespace ICSharpCode.AvalonEdit.AddIn this.baseHighlighter = baseHighlighter; } - public TextDocument Document { + public IDocument Document { get { return baseHighlighter.Document; } } - public ICSharpCode.AvalonEdit.Utils.ImmutableStack GetSpanStack(int lineNumber) + public ImmutableStack GetSpanStack(int lineNumber) { return baseHighlighter.GetSpanStack(lineNumber); } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs index 8a201fad36..a2200ee781 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs @@ -6,9 +6,9 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; - using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Utils; +using ICSharpCode.NRefactory.Editor; using SpanStack = ICSharpCode.AvalonEdit.Utils.ImmutableStack; namespace ICSharpCode.AvalonEdit.Highlighting @@ -26,14 +26,14 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// readonly CompressingTreeList storedSpanStacks = new CompressingTreeList(object.ReferenceEquals); readonly CompressingTreeList isValid = new CompressingTreeList((a, b) => a == b); - readonly TextDocument document; + readonly IDocument document; readonly HighlightingRuleSet baseRuleSet; bool isHighlighting; /// /// Gets the document that this DocumentHighlighter is highlighting. /// - public TextDocument Document { + public IDocument Document { get { return document; } } @@ -52,6 +52,20 @@ namespace ICSharpCode.AvalonEdit.Highlighting InvalidateHighlighting(); } + /// + /// Creates a new DocumentHighlighter instance. + /// + public DocumentHighlighter(ReadOnlyDocument document, HighlightingRuleSet baseRuleSet) + { + if (document == null) + throw new ArgumentNullException("document"); + if (baseRuleSet == null) + throw new ArgumentNullException("baseRuleSet"); + this.document = document; + this.baseRuleSet = baseRuleSet; + InvalidateHighlighting(); + } + void ILineTracker.BeforeRemoveLine(DocumentLine line) { CheckIsHighlighting(); @@ -125,19 +139,6 @@ namespace ICSharpCode.AvalonEdit.Highlighting int firstInvalidLine; - /// - /// Highlights the specified document line. - /// - /// The line to highlight. - /// A line object that represents the highlighted sections. - [ObsoleteAttribute("Use the (int lineNumber) overload instead")] - public HighlightedLine HighlightLine(DocumentLine line) - { - if (!document.Lines.Contains(line)) - throw new ArgumentException("The specified line does not belong to the document."); - return HighlightLine(line.LineNumber); - } - /// public HighlightedLine HighlightLine(int lineNumber) { @@ -146,7 +147,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting isHighlighting = true; try { HighlightUpTo(lineNumber); - DocumentLine line = document.GetLineByNumber(lineNumber); + IDocumentLine line = document.GetLineByNumber(lineNumber); highlightedLine = new HighlightedLine(document, line); HighlightLineAndUpdateTreeList(line, lineNumber); return highlightedLine; @@ -187,7 +188,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting } } - void HighlightLineAndUpdateTreeList(DocumentLine line, int lineNumber) + void HighlightLineAndUpdateTreeList(IDocumentLine line, int lineNumber) { //Debug.WriteLine("Highlight line " + lineNumber + (highlightedLine != null ? "" : " (span stack only)")); spanStack = storedSpanStacks[lineNumber - 1]; @@ -236,7 +237,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// This callback must not call HighlightLine or InvalidateHighlighting. /// It may call GetSpanStack, but only for the changed line and lines above. /// This method must not modify the document. - protected virtual void OnHighlightStateChanged(DocumentLine line, int lineNumber) + protected virtual void OnHighlightStateChanged(IDocumentLine line, int lineNumber) { } @@ -254,10 +255,10 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// HighlightedLine highlightedLine; - void HighlightLineInternal(DocumentLine line) + void HighlightLineInternal(IDocumentLine line) { lineStartOffset = line.Offset; - lineText = document.GetText(line.Offset, line.Length); + lineText = document.GetText(lineStartOffset, line.Length); position = 0; ResetColorStack(); HighlightingRuleSet currentRuleSet = this.CurrentRuleSet; diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightedLine.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightedLine.cs index 71aa3be684..98cd9e882d 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightedLine.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightedLine.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; + using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Utils; using ICSharpCode.NRefactory.Editor; @@ -19,12 +20,12 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// /// Creates a new HighlightedLine instance. /// - public HighlightedLine(TextDocument document, DocumentLine documentLine) + public HighlightedLine(IDocument document, IDocumentLine documentLine) { if (document == null) throw new ArgumentNullException("document"); - if (!document.Lines.Contains(documentLine)) - throw new ArgumentException("Line is null or not part of document"); + //if (!document.Lines.Contains(documentLine)) + // throw new ArgumentException("Line is null or not part of document"); this.Document = document; this.DocumentLine = documentLine; this.Sections = new NullSafeCollection(); @@ -33,12 +34,12 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// /// Gets the document associated with this HighlightedLine. /// - public TextDocument Document { get; private set; } + public IDocument Document { get; private set; } /// /// Gets the document line associated with this HighlightedLine. /// - public DocumentLine DocumentLine { get; private set; } + public IDocumentLine DocumentLine { get; private set; } /// /// Gets the highlighted sections. @@ -117,7 +118,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting } elements.Sort(); - TextDocument document = this.Document; + IDocument document = this.Document; StringWriter w = new StringWriter(CultureInfo.InvariantCulture); int textOffset = startOffset; foreach (HtmlElement e in elements) { diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs index 1c55bd8dd3..ecfa17f2d2 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs @@ -6,9 +6,9 @@ using System.Diagnostics; using System.Windows; using System.Windows.Media; using System.Windows.Threading; - using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Rendering; +using ICSharpCode.NRefactory.Editor; namespace ICSharpCode.AvalonEdit.Highlighting { @@ -206,7 +206,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting this.textView = textView; } - protected override void OnHighlightStateChanged(DocumentLine line, int lineNumber) + protected override void OnHighlightStateChanged(IDocumentLine line, int lineNumber) { base.OnHighlightStateChanged(line, lineNumber); if (colorizer.lineNumberBeingColorized != lineNumber) { diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HtmlClipboard.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HtmlClipboard.cs index d1b9f167b8..a9c6540c29 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HtmlClipboard.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HtmlClipboard.cs @@ -66,7 +66,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// The part of the document to create HTML for. You can pass null to create HTML for the whole document. /// The options for the HTML creation. /// HTML code for the document part. - public static string CreateHtmlFragment(TextDocument document, IHighlighter highlighter, ISegment segment, HtmlOptions options) + public static string CreateHtmlFragment(IDocument document, IHighlighter highlighter, ISegment segment, HtmlOptions options) { if (document == null) throw new ArgumentNullException("document"); @@ -79,7 +79,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting StringBuilder html = new StringBuilder(); int segmentEndOffset = segment.EndOffset; - DocumentLine line = document.GetLineByOffset(segment.Offset); + IDocumentLine line = document.GetLineByOffset(segment.Offset); while (line != null && line.Offset < segmentEndOffset) { HighlightedLine highlightedLine; if (highlighter != null) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs index 9207fcea45..d956cffbdd 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs @@ -2,8 +2,8 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Utils; +using ICSharpCode.NRefactory.Editor; namespace ICSharpCode.AvalonEdit.Highlighting { @@ -16,7 +16,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// /// Gets the underlying text document. /// - TextDocument Document { get; } + IDocument Document { get; } /// /// Gets the span stack at the end of the specified line.