diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj index 23cd725795..adbd8326d2 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj @@ -157,7 +157,7 @@ - + diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs index 635d520763..a60ed414be 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs @@ -52,7 +52,7 @@ namespace ICSharpCode.AvalonEdit.AddIn // add additional highlighters highlighters.AddRange(SD.AddInTree.BuildItems(HighlighterDoozer.AddInPath, document, false)); var multiHighlighter = new MultiHighlighter(document, highlighters.ToArray()); - return new CustomizableHighlightingColorizer.CustomizingHighlighter( + return new CustomizingHighlighter( document, CustomizedHighlightingColor.FetchCustomizations(def.Name), multiHighlighter); } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs index 2f7f9019a5..353ad2de9d 100755 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs @@ -538,7 +538,7 @@ namespace ICSharpCode.AvalonEdit.AddIn public void UpdateCustomizedHighlighting() { string language = this.SyntaxHighlighting != null ? this.SyntaxHighlighting.Name : null; - CustomizableHighlightingColorizer.ApplyCustomizationsToDefaultElements(this, FetchCustomizations(language)); + CustomizingHighlighter.ApplyCustomizationsToDefaultElements(this, FetchCustomizations(language)); BracketHighlightRenderer.ApplyCustomizationsToRendering(this.bracketRenderer, FetchCustomizations(language)); HighlightingOptions.ApplyToRendering(this, FetchCustomizations(language)); this.TextArea.TextView.Redraw(); // manually redraw if default elements didn't change but customized highlightings did diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizingHighlighter.cs similarity index 54% rename from src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs rename to src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizingHighlighter.cs index a7ccab2b11..058cf73e35 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizingHighlighter.cs @@ -3,25 +3,23 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Windows; using System.Windows.Media; using System.Windows.Threading; -using ICSharpCode.AvalonEdit.Document; + using ICSharpCode.AvalonEdit.Editing; using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Rendering; using ICSharpCode.NRefactory.Editor; -using ICSharpCode.SharpDevelop; -using ICSharpCode.SharpDevelop.Editor; namespace ICSharpCode.AvalonEdit.AddIn { /// - /// Applies a set of customizations to syntax highlighting. + /// Wraps another and applies customizations + /// to the highlighting. /// - public class CustomizableHighlightingColorizer : HighlightingColorizer + public class CustomizingHighlighter : IHighlighter, IDisposable { #region ApplyCustomizationsToDefaultElements public const string DefaultTextAndBackground = "Default text/background"; @@ -123,178 +121,152 @@ namespace ICSharpCode.AvalonEdit.AddIn } #endregion - readonly IHighlightingDefinition highlightingDefinition; + readonly TextView textView; readonly IEnumerable customizations; + readonly IHighlighter baseHighlighter; + readonly IDocument document; - [ObsoleteAttribute("Use a normal HighlightingColorizer with a CustomizingHighlighter instead")] - public CustomizableHighlightingColorizer(IHighlightingDefinition highlightingDefinition, IEnumerable customizations) - : base(highlightingDefinition) + public CustomizingHighlighter(TextView textView, IEnumerable customizations, IHighlighter baseHighlighter) { + if (textView == null) + throw new ArgumentNullException("textView"); if (customizations == null) throw new ArgumentNullException("customizations"); - this.highlightingDefinition = highlightingDefinition; + if (baseHighlighter == null) + throw new ArgumentNullException("baseHighlighter"); + + this.textView = textView; + this.document = textView.Document; this.customizations = customizations; + this.baseHighlighter = baseHighlighter; + baseHighlighter.HighlightingStateChanged += highlighter_HighlightingStateChanged; } - protected override void DeregisterServices(TextView textView) + public CustomizingHighlighter(IDocument document, IEnumerable customizations, IHighlighter baseHighlighter) { - textView.Services.RemoveService(typeof(IHighlighter)); - base.DeregisterServices(textView); + if (document == null) + throw new ArgumentNullException("document"); + if (customizations == null) + throw new ArgumentNullException("customizations"); + if (baseHighlighter == null) + throw new ArgumentNullException("baseHighlighter"); + + this.document = document; + this.customizations = customizations; + this.baseHighlighter = baseHighlighter; + baseHighlighter.HighlightingStateChanged += highlighter_HighlightingStateChanged; } + + public IDocument Document { + get { return baseHighlighter.Document; } + } + + public event HighlightingStateChangedEventHandler HighlightingStateChanged; - protected override void RegisterServices(TextView textView) + public void UpdateHighlightingState(int lineNumber) { - base.RegisterServices(textView); -// textView.Services.AddService(typeof(IHighlighter), (CustomizingHighlighter)textView.GetService(typeof(IHighlighter))); + baseHighlighter.UpdateHighlightingState(lineNumber); } - protected override IHighlighter CreateHighlighter(TextView textView, TextDocument document) + void highlighter_HighlightingStateChanged(IHighlighter sender, int fromLineNumber, int toLineNumber) { - return new CustomizingHighlighter(textView, customizations, base.CreateHighlighter(textView, document)); + if (HighlightingStateChanged != null) + HighlightingStateChanged(this, fromLineNumber, toLineNumber); } - internal sealed class CustomizingHighlighter : IHighlighter, IDisposable + public IEnumerable GetSpanColorNamesFromLineStart(int lineNumber) { - readonly TextView textView; - readonly IEnumerable customizations; - readonly IHighlighter baseHighlighter; - readonly IDocument document; - - public CustomizingHighlighter(TextView textView, IEnumerable customizations, IHighlighter baseHighlighter) - { - Debug.Assert(textView != null); - Debug.Assert(customizations != null); - Debug.Assert(baseHighlighter != null); - - this.textView = textView; - this.document = textView.Document; - this.customizations = customizations; - this.baseHighlighter = baseHighlighter; - baseHighlighter.HighlightingStateChanged += highlighter_HighlightingStateChanged; - } - - public CustomizingHighlighter(IDocument document, IEnumerable customizations, IHighlighter baseHighlighter) - { - Debug.Assert(customizations != null); - Debug.Assert(baseHighlighter != null); - - this.document = document; - this.customizations = customizations; - this.baseHighlighter = baseHighlighter; - baseHighlighter.HighlightingStateChanged += highlighter_HighlightingStateChanged; - } - - public IDocument Document { - get { return baseHighlighter.Document; } - } - - public event HighlightingStateChangedEventHandler HighlightingStateChanged; - - public void UpdateHighlightingState(int lineNumber) - { - baseHighlighter.UpdateHighlightingState(lineNumber); - } - - void highlighter_HighlightingStateChanged(IHighlighter sender, int fromLineNumber, int toLineNumber) - { - if (HighlightingStateChanged != null) - HighlightingStateChanged(this, fromLineNumber, toLineNumber); - } - - public IEnumerable GetSpanColorNamesFromLineStart(int lineNumber) - { - // delayed evaluation doesn't cause a problem here: GetColorStack is called immediately, - // only the where/select portion is evaluated later. But that won't be a problem because the - // HighlightingColor instance shouldn't change once it's in use. - return from color in GetColorStack(lineNumber - 1) - where color.Name != null - select color.Name; - } - - public IEnumerable GetColorStack(int lineNumber) - { - return baseHighlighter.GetColorStack(lineNumber); - } - - public HighlightedLine HighlightLine(int lineNumber) - { - HighlightedLine line = baseHighlighter.HighlightLine(lineNumber); - foreach (HighlightedSection section in line.Sections) { - section.Color = CustomizeColor(section.Color, customizations); - } - return line; + // delayed evaluation doesn't cause a problem here: GetColorStack is called immediately, + // only the where/select portion is evaluated later. But that won't be a problem because the + // HighlightingColor instance shouldn't change once it's in use. + return from color in GetColorStack(lineNumber - 1) + where color.Name != null + select color.Name; + } + + public IEnumerable GetColorStack(int lineNumber) + { + return baseHighlighter.GetColorStack(lineNumber); + } + + public HighlightedLine HighlightLine(int lineNumber) + { + HighlightedLine line = baseHighlighter.HighlightLine(lineNumber); + foreach (HighlightedSection section in line.Sections) { + section.Color = CustomizeColor(section.Color, customizations); } + return line; + } - public void InvalidateLine(IDocumentLine line) - { - if (textView == null) - throw new InvalidOperationException("IHighlighter has no TextView assigned!"); - textView.Redraw(line, DispatcherPriority.Background); - } - - public void InvalidateAll() - { - if (textView == null) - throw new InvalidOperationException("IHighlighter has no TextView assigned!"); - textView.Redraw(DispatcherPriority.Background); - } - - public event EventHandler VisibleDocumentLinesChanged { - add { textView.VisualLinesChanged += value; } - remove { textView.VisualLinesChanged -= value; } - } - - public IEnumerable GetVisibleDocumentLines() - { - if (textView == null) - throw new InvalidOperationException("IHighlighter has no TextView assigned!"); - List result = new List(); - foreach (VisualLine line in textView.VisualLines) { - if (line.FirstDocumentLine == line.LastDocumentLine) { - result.Add(line.FirstDocumentLine); - } else { - int firstLineStart = line.FirstDocumentLine.Offset; - int lineEndOffset = firstLineStart + line.FirstDocumentLine.TotalLength; - foreach (VisualLineElement e in line.Elements) { - int elementOffset = firstLineStart + e.RelativeTextOffset; - if (elementOffset >= lineEndOffset) { - var currentLine = this.Document.GetLineByOffset(elementOffset); - lineEndOffset = currentLine.Offset + currentLine.TotalLength; - result.Add(currentLine); - } + public void InvalidateLine(IDocumentLine line) + { + if (textView == null) + throw new InvalidOperationException("IHighlighter has no TextView assigned!"); + textView.Redraw(line, DispatcherPriority.Background); + } + + public void InvalidateAll() + { + if (textView == null) + throw new InvalidOperationException("IHighlighter has no TextView assigned!"); + textView.Redraw(DispatcherPriority.Background); + } + + public event EventHandler VisibleDocumentLinesChanged { + add { textView.VisualLinesChanged += value; } + remove { textView.VisualLinesChanged -= value; } + } + + public IEnumerable GetVisibleDocumentLines() + { + if (textView == null) + throw new InvalidOperationException("IHighlighter has no TextView assigned!"); + List result = new List(); + foreach (VisualLine line in textView.VisualLines) { + if (line.FirstDocumentLine == line.LastDocumentLine) { + result.Add(line.FirstDocumentLine); + } else { + int firstLineStart = line.FirstDocumentLine.Offset; + int lineEndOffset = firstLineStart + line.FirstDocumentLine.TotalLength; + foreach (VisualLineElement e in line.Elements) { + int elementOffset = firstLineStart + e.RelativeTextOffset; + if (elementOffset >= lineEndOffset) { + var currentLine = this.Document.GetLineByOffset(elementOffset); + lineEndOffset = currentLine.Offset + currentLine.TotalLength; + result.Add(currentLine); } } } - return result; } - - public HighlightingColor GetNamedColor(string name) - { - return CustomizeColor(name, customizations); - } - - public HighlightingColor DefaultTextColor { - get { - return GetNamedColor(CustomizableHighlightingColorizer.DefaultTextAndBackground); - } - } - - public void BeginHighlighting() - { - baseHighlighter.BeginHighlighting(); - } - - public void EndHighlighting() - { - baseHighlighter.EndHighlighting(); - } - - public void Dispose() - { - baseHighlighter.Dispose(); + return result; + } + + public HighlightingColor GetNamedColor(string name) + { + return CustomizeColor(name, customizations); + } + + public HighlightingColor DefaultTextColor { + get { + return GetNamedColor(CustomizingHighlighter.DefaultTextAndBackground); } } + public void BeginHighlighting() + { + baseHighlighter.BeginHighlighting(); + } + + public void EndHighlighting() + { + baseHighlighter.EndHighlighting(); + } + + public void Dispose() + { + baseHighlighter.Dispose(); + } + internal static HighlightingColor CustomizeColor(HighlightingColor color, IEnumerable customizations) { if (color == null || color.Name == null) diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DiffControl.xaml.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DiffControl.xaml.cs index ffc2f75ab1..bbb7a7d456 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DiffControl.xaml.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DiffControl.xaml.cs @@ -48,13 +48,13 @@ namespace ICSharpCode.AvalonEdit.AddIn { string language = source.SyntaxHighlighting != null ? source.SyntaxHighlighting.Name : null; editor.TextArea.TextView.LineTransformers.RemoveAll(x => x is HighlightingColorizer); - var customizedHighlighter = new CustomizableHighlightingColorizer.CustomizingHighlighter( + var customizedHighlighter = new CustomizingHighlighter( editor.TextArea.TextView, CustomizedHighlightingColor.FetchCustomizations(language), new DocumentHighlighter(editor.Document, source.SyntaxHighlighting) ); editor.TextArea.TextView.LineTransformers.Insert(0, new HighlightingColorizer(customizedHighlighter)); - CustomizableHighlightingColorizer.ApplyCustomizationsToDefaultElements(editor, CustomizedHighlightingColor.FetchCustomizations(language)); + CustomizingHighlighter.ApplyCustomizationsToDefaultElements(editor, CustomizedHighlightingColor.FetchCustomizations(language)); HighlightingOptions.ApplyToRendering(editor, CustomizedHighlightingColor.FetchCustomizations(language)); editor.TextArea.TextView.Redraw(); // manually redraw if default elements didn't change but customized highlightings did } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs index 4029f61b55..b8f89f0dc5 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs @@ -279,7 +279,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options void CreateDefaultEntries(string language, out IHighlightingItem defaultText, IList items) { // Create entry for "default text/background" - defaultText = new SimpleHighlightingItem(CustomizableHighlightingColorizer.DefaultTextAndBackground, ta => ta.Document.Text = "Normal text") { + defaultText = new SimpleHighlightingItem(CustomizingHighlighter.DefaultTextAndBackground, ta => ta.Document.Text = "Normal text") { Foreground = SystemColors.WindowTextColor, Background = SystemColors.WindowColor }; @@ -289,7 +289,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options // Create entry for "Selected text" IHighlightingItem selectedText = new SimpleHighlightingItem( - CustomizableHighlightingColorizer.SelectedText, + CustomizingHighlighter.SelectedText, ta => { ta.Document.Text = "Selected text"; ta.Selection = Selection.Create(ta, 0, 13); @@ -304,7 +304,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options // Create entry for "Non-printable characters" IHighlightingItem nonPrintChars = new SimpleHighlightingItem( - CustomizableHighlightingColorizer.NonPrintableCharacters, + CustomizingHighlighter.NonPrintableCharacters, ta => { ta.Document.Text = " \r \r\n \n"; }) @@ -317,7 +317,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options // Create entry for "Line numbers" IHighlightingItem lineNumbers = new SimpleHighlightingItem( - CustomizableHighlightingColorizer.LineNumbers, + CustomizingHighlighter.LineNumbers, ta => { ta.Document.Text = "These are just" + Environment.NewLine + "multiple" + Environment.NewLine + @@ -402,7 +402,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options items.Add(foldingTextMarker); IHighlightingItem linkText = new SimpleHighlightingItem( - CustomizableHighlightingColorizer.LinkText, + CustomizingHighlighter.LinkText, ta => { ta.Document.Text = "http://icsharpcode.net" + Environment.NewLine + "me@example.com"; }) @@ -502,7 +502,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options items.Add(currentStatementMarker); IHighlightingItem columnRuler = new SimpleHighlightingItem( - CustomizableHighlightingColorizer.ColumnRuler, + CustomizingHighlighter.ColumnRuler, ta => { ta.Document.Text = "some line with a lot of text"; ta.TextView.Options.ColumnRulerPosition = 15; @@ -546,7 +546,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options XshdSyntaxDefinition xshd = (XshdSyntaxDefinition)languageComboBox.SelectedItem; if (xshd != null) { var customizationsForCurrentLanguage = customizationList.Where(c => c.Language == null || c.Language == xshd.Name); - CustomizableHighlightingColorizer.ApplyCustomizationsToDefaultElements(textEditor, customizationsForCurrentLanguage); + CustomizingHighlighter.ApplyCustomizationsToDefaultElements(textEditor, customizationsForCurrentLanguage); ApplyToRendering(textEditor, customizationsForCurrentLanguage); var item = (IHighlightingItem)listBox.SelectedItem; TextView textView = textEditor.TextArea.TextView; @@ -556,7 +556,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options colorizer = null; if (item != null) { if (item.ParentDefinition != null) { - var highlighter = new CustomizableHighlightingColorizer.CustomizingHighlighter( + var highlighter = new CustomizingHighlighter( textView, customizationsForCurrentLanguage, new DocumentHighlighter(textView.Document, item.ParentDefinition) ); @@ -704,7 +704,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options { "Keyword", "VBNET.Keywords" }, { "Keyword", "VBNET.FunctionKeywords" }, { "Keyword", "VBNET.ContextKeywords" }, - { "Line Numbers", CustomizableHighlightingColorizer.LineNumbers }, + { "Line Numbers", CustomizingHighlighter.LineNumbers }, { "MarkerFormatDefinition/HighlightedReference", "" }, { "Number", "C#.NumberLiteral" }, { "Operator", "C#.Punctuation" }, @@ -713,7 +713,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options { "outlining.square", FoldingSelectedControls }, { "outlining.verticalrule", "" }, { "Plain Text", "" }, - { "Plain Text", CustomizableHighlightingColorizer.DefaultTextAndBackground }, + { "Plain Text", CustomizingHighlighter.DefaultTextAndBackground }, { "Preprocessor Keyword", "" }, { "Preprocessor Keyword", "C#.Preprocessor" }, { "Razor Code", "" }, @@ -724,12 +724,12 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options { "Script Operator", "" }, { "Script String", "" }, { "Selected Text", "" }, - { "Selected Text", CustomizableHighlightingColorizer.SelectedText }, + { "Selected Text", CustomizingHighlighter.SelectedText }, { "String", "VBNET.String" }, { "String", "C#.String" }, { "String(C# @ Verbatim)", "" }, { "Syntax Error", "" }, - { "urlformat", CustomizableHighlightingColorizer.LinkText }, + { "urlformat", CustomizingHighlighter.LinkText }, { "User Types", "" }, { "User Types(Delegates)", "" }, { "User Types(Enums)", "" }, @@ -760,7 +760,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options { "XML Name", "XML.XmlTag" }, { "XML Name", "XML.XmlDeclaration" }, { "XML Name", "XML.DocType" }, - { "XML Text", "XML." + CustomizableHighlightingColorizer.DefaultTextAndBackground }, + { "XML Text", "XML." + CustomizingHighlighter.DefaultTextAndBackground }, }; Tuple ParseEntry(XElement element)