diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ExpressionHighlightRenderer.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ExpressionHighlightRenderer.cs index 925d18ecfe..4c6d2768cf 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ExpressionHighlightRenderer.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ExpressionHighlightRenderer.cs @@ -22,8 +22,8 @@ namespace ICSharpCode.AvalonEdit.AddIn Pen borderPen; Brush backgroundBrush; TextView textView; - readonly Color borderColor = Color.FromArgb(52, 30, 130, 255); //Color.FromArgb(180, 70, 230, 70)) - readonly Color fillColor = Color.FromArgb(22, 30, 130, 255); //Color.FromArgb(40, 60, 255, 60) + public readonly Color DefaultBorderColor = Color.FromArgb(52, 30, 130, 255); //Color.FromArgb(180, 70, 230, 70)) + public readonly Color DefaultFillColor = Color.FromArgb(22, 30, 130, 255); //Color.FromArgb(40, 60, 255, 60) readonly int borderThickness = 1; readonly int cornerRadius = 1; @@ -45,8 +45,8 @@ namespace ICSharpCode.AvalonEdit.AddIn if (textView == null) throw new ArgumentNullException("textView"); this.textView = textView; - this.borderPen = new Pen(new SolidColorBrush(borderColor), borderThickness); - this.backgroundBrush = new SolidColorBrush(fillColor); + this.borderPen = new Pen(new SolidColorBrush(DefaultBorderColor), borderThickness); + this.backgroundBrush = new SolidColorBrush(DefaultFillColor); this.borderPen.Freeze(); this.backgroundBrush.Freeze(); this.textView.BackgroundRenderers.Add(this); 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 5d5892aaf3..ccdffa66bf 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs @@ -171,7 +171,6 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options from name in typeof(HighlightingManager).Assembly.GetManifestResourceNames().AsParallel() where name.StartsWith(typeof(HighlightingManager).Namespace + ".Resources.", StringComparison.OrdinalIgnoreCase) && name.EndsWith(".xshd", StringComparison.OrdinalIgnoreCase) - && !name.EndsWith("XmlDoc.xshd", StringComparison.OrdinalIgnoreCase) select LoadBuiltinXshd(name) ).Concat( ICSharpCode.Core.AddInTree.BuildItems(SyntaxModeDoozer.Path, null, false).AsParallel() @@ -187,7 +186,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options languageComboBox.Items.Clear(); languageComboBox.Items.Add(new XshdSyntaxDefinition { Name = "All languages" }); - foreach (XshdSyntaxDefinition def in allSyntaxDefinitions) + foreach (XshdSyntaxDefinition def in allSyntaxDefinitions.Where(d => !d.Name.Equals("XmlDoc", StringComparison.OrdinalIgnoreCase))) languageComboBox.Items.Add(def); if (allSyntaxDefinitions.Count > 0) languageComboBox.SelectedIndex = 0; @@ -210,7 +209,9 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options if (def == null) { throw new InvalidOperationException("Expected that all XSHDs are registered in default highlighting manager; but highlighting definition was not found"); } else { - foreach (XshdColor namedColor in xshd.Elements.OfType()) { + var visitor = new ColorVisitor(allSyntaxDefinitions); + xshd.AcceptElements(visitor); + foreach (XshdColor namedColor in visitor.foundColors) { if (namedColor.ExampleText != null) { IHighlightingItem item = new NamedColorHighlightingItem(defaultText, namedColor) { ParentDefinition = def }; item = new CustomizedHighlightingItem(customizationList, item, xshd.Name); @@ -225,6 +226,60 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options } } + class ColorVisitor : IXshdVisitor + { + internal readonly List foundColors = new List(); + readonly HashSet visitedDefinitons = new HashSet(); + IList allSyntaxDefinitions; + + public ColorVisitor(IList allSyntaxDefinitions) + { + this.allSyntaxDefinitions = allSyntaxDefinitions; + } + + public object VisitRuleSet(XshdRuleSet ruleSet) + { + ruleSet.AcceptElements(this); + return null; + } + + public object VisitColor(XshdColor color) + { + foundColors.Add(color); + return null; + } + + public object VisitKeywords(XshdKeywords keywords) + { + return keywords.ColorReference.AcceptVisitor(this); + } + + public object VisitSpan(XshdSpan span) + { + if (span.RuleSetReference.InlineElement != null) + return span.RuleSetReference.AcceptVisitor(this); + XshdSyntaxDefinition definition = allSyntaxDefinitions.SingleOrDefault(def => def.Name == span.RuleSetReference.ReferencedDefinition); + if (definition != null && visitedDefinitons.Add(definition)) + foundColors.AddRange(definition.Elements.OfType()); + return null; + } + + public object VisitImport(XshdImport import) + { + if (import.RuleSetReference.InlineElement != null) + return import.RuleSetReference.AcceptVisitor(this); + XshdSyntaxDefinition definition = allSyntaxDefinitions.SingleOrDefault(def => def.Name == import.RuleSetReference.ReferencedDefinition); + if (definition != null && visitedDefinitons.Add(definition)) + foundColors.AddRange(definition.Elements.OfType()); + return null; + } + + public object VisitRule(XshdRule rule) + { + return rule.ColorReference.AcceptVisitor(this); + } + } + void CreateDefaultEntries(string language, out IHighlightingItem defaultText, IList items) { // Create entry for "default text/background" @@ -597,16 +652,15 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options static readonly MultiDictionary mapping = new MultiDictionary(StringComparer.Ordinal) { { "Brace Matching (Rectangle)", BracketHighlightRenderer.BracketHighlight }, { "Collapsible Text", FoldingTextMarkers }, - { "Comment", "XML.Comment" }, { "Comment", "VBNET.Comment" }, { "Comment", "C#.Comment" }, { "Compiler Error", ErrorPainter.ErrorColorName }, { "CSS Comment", "CSS.Comment" }, { "CSS Keyword", "" }, - { "CSS Property Name", "" }, - { "CSS Property Value", "" }, - { "CSS Selector", "" }, - { "CSS String Value", "" }, + { "CSS Property Name", "CSS.Property" }, + { "CSS Property Value", "CSS.Value" }, + { "CSS Selector", "CSS.Selector" }, + { "CSS String Value", "CSS.String" }, { "Excluded Code", "" }, { "HTML Attribute Value", "" }, { "HTML Attribute", "" }, @@ -687,10 +741,10 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options { "XAML Name", "" }, { "XAML Text", "" }, { "XML Attribute Quotes", "" }, - { "XML Attribute Value", "XML." }, - { "XML Attribute", "" }, - { "XML CData Section", "" }, - { "XML Comment", "" }, + { "XML Attribute Value", "XML.AttributeValue" }, + { "XML Attribute", "XML.AttributeName" }, + { "XML CData Section", "XML.CData" }, + { "XML Comment", "XML.Comment" }, { "XML Delimiter", "" }, { "XML Doc Comment", "" }, { "XML Doc Tag", "" }, diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/NamedColorHighlightingItem.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/NamedColorHighlightingItem.cs index 5ecfa112c0..75890d92b2 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/NamedColorHighlightingItem.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/NamedColorHighlightingItem.cs @@ -2,13 +2,15 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using System.ComponentModel; +using System.Linq; using System.Windows; using System.Windows.Media; - using ICSharpCode.AvalonEdit.Editing; using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Highlighting.Xshd; +using ICSharpCode.Core; namespace ICSharpCode.AvalonEdit.AddIn.Options { @@ -127,7 +129,16 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options public void ShowExample(TextArea exampleTextArea) { - exampleTextArea.Document.Text = color.ExampleText; + exampleTextArea.Document.Text = StringParser.Parse(color.ExampleText, GetXshdProperties().ToArray()); + } + + IEnumerable GetXshdProperties() + { + IHighlightingDefinition2 def = ParentDefinition as IHighlightingDefinition2; + if (def == null) + yield break; + foreach (var p in def.Properties) + yield return new StringTagPair(p.Key, p.Value); } event System.ComponentModel.PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged { add {} remove {} } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingManager.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingManager.cs index 8c86206007..c38a71295a 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingManager.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingManager.cs @@ -20,7 +20,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// public class HighlightingManager : IHighlightingDefinitionReferenceResolver { - sealed class DelayLoadedHighlightingDefinition : IHighlightingDefinition + sealed class DelayLoadedHighlightingDefinition : IHighlightingDefinition2 { readonly object lockObj = new object(); readonly string name; @@ -104,6 +104,15 @@ namespace ICSharpCode.AvalonEdit.Highlighting { return this.Name; } + + public IDictionary Properties { + get { + var def = GetDefinition() as IHighlightingDefinition2; + if (def != null) + return def.Properties; + return null; + } + } } readonly object lockObj = new object(); diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlightingDefinition.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlightingDefinition.cs index 03eb631b58..7489fb8188 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlightingDefinition.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlightingDefinition.cs @@ -40,4 +40,15 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// IEnumerable NamedHighlightingColors { get; } } + + /// + /// Extension of IHighlightingDefinition to avoid breaking changes in the API. + /// + public interface IHighlightingDefinition2 : IHighlightingDefinition + { + /// + /// Gets the list of properties. + /// + IDictionary Properties { get; } + } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/CSharp-Mode.xshd b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/CSharp-Mode.xshd index 5c56d04118..cea3101957 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/CSharp-Mode.xshd +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/CSharp-Mode.xshd @@ -27,6 +27,8 @@ + + TODO diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/ModeV2.xsd b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/ModeV2.xsd index f4f9fce1ea..53cd376e26 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/ModeV2.xsd +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/ModeV2.xsd @@ -50,6 +50,13 @@ + + + + + + + @@ -135,6 +142,7 @@ + diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/VBNET-Mode.xshd b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/VBNET-Mode.xshd index 3487615593..b22555a29e 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/VBNET-Mode.xshd +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/VBNET-Mode.xshd @@ -18,6 +18,8 @@ + + " diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/XmlDoc.xshd b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/XmlDoc.xshd index 0b76b92a49..e4303de6af 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/XmlDoc.xshd +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/XmlDoc.xshd @@ -1,9 +1,9 @@ - - - - + + + + diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/V2Loader.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/V2Loader.cs index b13c1417b5..93519ae958 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/V2Loader.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/V2Loader.cs @@ -64,6 +64,9 @@ namespace ICSharpCode.AvalonEdit.Highlighting.Xshd case "RuleSet": c.Add(ParseRuleSet(reader)); break; + case "Property": + c.Add(ParseProperty(reader)); + break; case "Color": c.Add(ParseNamedColor(reader)); break; @@ -85,6 +88,15 @@ namespace ICSharpCode.AvalonEdit.Highlighting.Xshd } } + static XshdElement ParseProperty(XmlReader reader) + { + XshdProperty property = new XshdProperty(); + SetPosition(property, reader); + property.Name = reader.GetAttribute("name"); + property.Value = reader.GetAttribute("value"); + return property; + } + static XshdRuleSet ParseRuleSet(XmlReader reader) { XshdRuleSet ruleSet = new XshdRuleSet(); diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs index d8bae25056..c5a15cf1e7 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs @@ -5,15 +5,15 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Text.RegularExpressions; - using ICSharpCode.AvalonEdit.Utils; namespace ICSharpCode.AvalonEdit.Highlighting.Xshd { [Serializable] - sealed class XmlHighlightingDefinition : IHighlightingDefinition + sealed class XmlHighlightingDefinition : IHighlightingDefinition2 { public string Name { get; private set; } @@ -37,6 +37,9 @@ namespace ICSharpCode.AvalonEdit.Highlighting.Xshd throw new HighlightingDefinitionInvalidException("Could not find main RuleSet."); // Translate elements within the rulesets (resolving references and processing imports) xshd.AcceptElements(new TranslateElementVisitor(this, rnev.ruleSets, resolver)); + + foreach (var p in xshd.Elements.OfType()) + propDict.Add(p.Name, p.Value); } #region RegisterNamedElements @@ -358,6 +361,8 @@ namespace ICSharpCode.AvalonEdit.Highlighting.Xshd Dictionary ruleSetDict = new Dictionary(); Dictionary colorDict = new Dictionary(); + [OptionalField] + Dictionary propDict = new Dictionary(); public HighlightingRuleSet MainRuleSet { get; private set; } @@ -391,5 +396,11 @@ namespace ICSharpCode.AvalonEdit.Highlighting.Xshd { return this.Name; } + + public IDictionary Properties { + get { + return propDict; + } + } } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XshdProperty.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XshdProperty.cs new file mode 100644 index 0000000000..eb5f2c3ee4 --- /dev/null +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XshdProperty.cs @@ -0,0 +1,38 @@ +// 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; + +namespace ICSharpCode.AvalonEdit.Highlighting.Xshd +{ + /// + /// A property in an Xshd file. + /// + [Serializable] + public class XshdProperty : XshdElement + { + /// + /// Gets/sets the name. + /// + public string Name { get; set; } + + /// + /// Gets/sets the value. + /// + public string Value { get; set; } + + /// + /// Creates a new XshdColor instance. + /// + public XshdProperty() + { + } + + /// + public override object AcceptVisitor(IXshdVisitor visitor) + { + return null; +// return visitor.VisitProperty(this); + } + } +} diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj index 4b76eeda25..3c8bdf8d74 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj @@ -212,6 +212,7 @@ +