13 changed files with 159 additions and 123 deletions
@ -0,0 +1,119 @@
@@ -0,0 +1,119 @@
|
||||
// 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 System; |
||||
using System.Collections.Generic; |
||||
using ICSharpCode.AvalonEdit.Highlighting; |
||||
using ICSharpCode.NRefactory.Editor; |
||||
|
||||
namespace ICSharpCode.AvalonEdit.AddIn |
||||
{ |
||||
public class MultiHighlighter : IHighlighter |
||||
{ |
||||
readonly IHighlighter[] nestedHighlighters; |
||||
readonly IDocument document; |
||||
|
||||
public MultiHighlighter(IDocument document, params IHighlighter[] nestedHighlighters) |
||||
{ |
||||
if (document == null) |
||||
throw new ArgumentNullException("document"); |
||||
if (nestedHighlighters == null) |
||||
throw new ArgumentNullException("additionalHighlighters"); |
||||
|
||||
foreach (var highlighter in nestedHighlighters) { |
||||
if (highlighter == null) |
||||
throw new ArgumentException("nulls not allowed!"); |
||||
if (document != highlighter.Document) |
||||
throw new ArgumentException("all highlighters must be assigned to the same document!"); |
||||
} |
||||
|
||||
this.nestedHighlighters = nestedHighlighters; |
||||
this.document = document; |
||||
} |
||||
|
||||
public event HighlightingStateChangedEventHandler HighlightingStateChanged { |
||||
add { |
||||
foreach (var highlighter in nestedHighlighters) { |
||||
highlighter.HighlightingStateChanged += value; |
||||
} |
||||
} |
||||
remove { |
||||
foreach (var highlighter in nestedHighlighters) { |
||||
highlighter.HighlightingStateChanged -= value; |
||||
} |
||||
} |
||||
} |
||||
|
||||
public IDocument Document { |
||||
get { |
||||
return document; |
||||
} |
||||
} |
||||
|
||||
public HighlightingColor DefaultTextColor { |
||||
get { |
||||
if (nestedHighlighters.Length > 0) |
||||
return nestedHighlighters[0].DefaultTextColor; |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public IEnumerable<HighlightingColor> GetColorStack(int lineNumber) |
||||
{ |
||||
List<HighlightingColor> list = new List<HighlightingColor>(); |
||||
for (int i = nestedHighlighters.Length - 1; i >= 0; i--) { |
||||
var s = nestedHighlighters[i].GetColorStack(lineNumber); |
||||
if (s != null) |
||||
list.AddRange(s); |
||||
} |
||||
return list; |
||||
} |
||||
|
||||
public HighlightedLine HighlightLine(int lineNumber) |
||||
{ |
||||
HighlightedLine line = new HighlightedLine(document, document.GetLineByNumber(lineNumber)); |
||||
foreach (IHighlighter h in nestedHighlighters) { |
||||
line.MergeWith(h.HighlightLine(lineNumber)); |
||||
} |
||||
return line; |
||||
} |
||||
|
||||
public void UpdateHighlightingState(int lineNumber) |
||||
{ |
||||
foreach (var h in nestedHighlighters) { |
||||
h.UpdateHighlightingState(lineNumber); |
||||
} |
||||
} |
||||
|
||||
public void BeginHighlighting() |
||||
{ |
||||
foreach (var h in nestedHighlighters) { |
||||
h.BeginHighlighting(); |
||||
} |
||||
} |
||||
|
||||
public void EndHighlighting() |
||||
{ |
||||
foreach (var h in nestedHighlighters) { |
||||
h.EndHighlighting(); |
||||
} |
||||
} |
||||
|
||||
public HighlightingColor GetNamedColor(string name) |
||||
{ |
||||
foreach (var h in nestedHighlighters) { |
||||
var color = h.GetNamedColor(name); |
||||
if (color != null) |
||||
return color; |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public void Dispose() |
||||
{ |
||||
foreach (var h in nestedHighlighters) { |
||||
h.Dispose(); |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue