You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
859 lines
32 KiB
859 lines
32 KiB
// 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 System.Collections.ObjectModel; |
|
using System.ComponentModel.Design; |
|
using System.Globalization; |
|
using System.IO; |
|
using System.Linq; |
|
using System.Windows; |
|
using System.Windows.Controls; |
|
using System.Windows.Media; |
|
using System.Xml; |
|
using System.Xml.Linq; |
|
using ICSharpCode.AvalonEdit.Editing; |
|
using ICSharpCode.AvalonEdit.Folding; |
|
using ICSharpCode.AvalonEdit.Highlighting; |
|
using ICSharpCode.AvalonEdit.Highlighting.Xshd; |
|
using ICSharpCode.AvalonEdit.Rendering; |
|
using ICSharpCode.Core; |
|
using ICSharpCode.NRefactory.Utils; |
|
using ICSharpCode.SharpDevelop; |
|
using ICSharpCode.SharpDevelop.Debugging; |
|
using ICSharpCode.SharpDevelop.Editor; |
|
using ICSharpCode.SharpDevelop.Gui; |
|
using Microsoft.Win32; |
|
|
|
namespace ICSharpCode.AvalonEdit.AddIn.Options |
|
{ |
|
public partial class HighlightingOptions : OptionPanel |
|
{ |
|
public HighlightingOptions() |
|
{ |
|
// ensure all definitions from AddIns are registered so that they are available for the example view |
|
AvalonEditDisplayBinding.RegisterAddInHighlightingDefinitions(); |
|
|
|
InitializeComponent(); |
|
textEditor.Document.UndoStack.SizeLimit = 0; |
|
CodeEditorOptions.Instance.BindToTextEditor(textEditor); |
|
textEditor.Options = new TextEditorOptions(CodeEditorOptions.Instance); |
|
bracketHighlighter = new BracketHighlightRenderer(textEditor.TextArea.TextView); |
|
foldingManager = FoldingManager.Install(textEditor.TextArea); |
|
textMarkerService = new TextMarkerService(textEditor.Document); |
|
textEditor.TextArea.TextView.BackgroundRenderers.Add(textMarkerService); |
|
textEditor.TextArea.TextView.LineTransformers.Add(textMarkerService); |
|
textEditor.Document.GetRequiredService<IServiceContainer>().AddService(typeof(ITextMarkerService), textMarkerService); |
|
} |
|
|
|
BracketHighlightRenderer bracketHighlighter; |
|
FoldingManager foldingManager; |
|
TextMarkerService textMarkerService; |
|
List<CustomizedHighlightingColor> customizationList; |
|
|
|
public const string FoldingControls = "Folding controls"; |
|
public const string FoldingSelectedControls = "Selected folding controls"; |
|
public const string FoldingTextMarkers = "Folding markers"; |
|
|
|
static SolidColorBrush CreateFrozenBrush(Color color) |
|
{ |
|
SolidColorBrush brush = new SolidColorBrush(color); |
|
brush.Freeze(); |
|
return brush; |
|
} |
|
|
|
public static void ApplyToRendering(TextEditor editor, IEnumerable<CustomizedHighlightingColor> customisations) |
|
{ |
|
bool assignedFoldingMarker = false, assignedSelectedFoldingControls = false, assignedFoldingTextMarkers = false; |
|
|
|
editor.ClearValue(FoldingMargin.FoldingMarkerBrushProperty); |
|
editor.ClearValue(FoldingMargin.FoldingMarkerBackgroundBrushProperty); |
|
editor.ClearValue(FoldingMargin.SelectedFoldingMarkerBrushProperty); |
|
editor.ClearValue(FoldingMargin.SelectedFoldingMarkerBackgroundBrushProperty); |
|
|
|
FoldingElementGenerator.TextBrush = FoldingElementGenerator.DefaultTextBrush; |
|
|
|
bool assignedErrorColor = false; |
|
bool assignedWarningColor = false; |
|
bool assignedMessageColor = false; |
|
|
|
foreach (var instance in ErrorPainter.Instances) { |
|
instance.ErrorColor = Colors.Red; |
|
instance.WarningColor = Colors.Orange; |
|
instance.MessageColor = Colors.Blue; |
|
} |
|
|
|
foreach (CustomizedHighlightingColor color in customisations) { |
|
switch (color.Name) { |
|
case FoldingControls: |
|
if (assignedFoldingMarker) |
|
continue; |
|
assignedFoldingMarker = true; |
|
if (color.Foreground != null) |
|
editor.SetValue(FoldingMargin.FoldingMarkerBrushProperty, |
|
CreateFrozenBrush(color.Foreground.Value)); |
|
if (color.Background != null) |
|
editor.SetValue(FoldingMargin.FoldingMarkerBackgroundBrushProperty, |
|
CreateFrozenBrush(color.Background.Value)); |
|
break; |
|
case FoldingSelectedControls: |
|
if (assignedSelectedFoldingControls) |
|
continue; |
|
assignedSelectedFoldingControls = true; |
|
if (color.Foreground != null) |
|
editor.SetValue(FoldingMargin.SelectedFoldingMarkerBrushProperty, |
|
CreateFrozenBrush(color.Foreground.Value)); |
|
if (color.Background != null) |
|
editor.SetValue(FoldingMargin.SelectedFoldingMarkerBackgroundBrushProperty, |
|
CreateFrozenBrush(color.Background.Value)); |
|
break; |
|
case FoldingTextMarkers: |
|
if (assignedFoldingTextMarkers) |
|
continue; |
|
assignedFoldingTextMarkers = true; |
|
if (color.Foreground != null) |
|
FoldingElementGenerator.TextBrush = CreateFrozenBrush(color.Foreground.Value); |
|
break; |
|
case ErrorPainter.ErrorColorName: |
|
if (assignedErrorColor) |
|
continue; |
|
assignedErrorColor = true; |
|
if (color.Foreground != null) { |
|
foreach (var instance in ErrorPainter.Instances) { |
|
instance.ErrorColor = color.Foreground.Value; |
|
} |
|
} |
|
break; |
|
case ErrorPainter.WarningColorName: |
|
if (assignedWarningColor) |
|
continue; |
|
assignedWarningColor = true; |
|
if (color.Foreground != null) { |
|
foreach (var instance in ErrorPainter.Instances) { |
|
instance.WarningColor = color.Foreground.Value; |
|
} |
|
} |
|
break; |
|
case ErrorPainter.MessageColorName: |
|
if (assignedMessageColor) |
|
continue; |
|
assignedMessageColor = true; |
|
if (color.Foreground != null) { |
|
foreach (var instance in ErrorPainter.Instances) { |
|
instance.MessageColor = color.Foreground.Value; |
|
} |
|
} |
|
break; |
|
} |
|
} |
|
} |
|
|
|
XshdSyntaxDefinition LoadBuiltinXshd(string name) |
|
{ |
|
using (Stream s = typeof(HighlightingManager).Assembly.GetManifestResourceStream(name)) { |
|
using (XmlTextReader reader = new XmlTextReader(s)) { |
|
return HighlightingLoader.LoadXshd(reader); |
|
} |
|
} |
|
} |
|
|
|
List<XshdSyntaxDefinition> allSyntaxDefinitions; |
|
|
|
public override void LoadOptions() |
|
{ |
|
base.LoadOptions(); |
|
if (allSyntaxDefinitions == null) { |
|
var builtins = from name in typeof(HighlightingManager).Assembly.GetManifestResourceNames().AsParallel() |
|
where name.StartsWith(typeof(HighlightingManager).Namespace + ".Resources.", StringComparison.OrdinalIgnoreCase) |
|
&& name.EndsWith(".xshd", StringComparison.OrdinalIgnoreCase) |
|
select LoadBuiltinXshd(name); |
|
var extended = ICSharpCode.Core.AddInTree.BuildItems<AddInTreeSyntaxMode>(SyntaxModeDoozer.Path, null, false) |
|
.AsParallel() |
|
.Select(m => m.LoadXshd()); |
|
allSyntaxDefinitions = extended.AsEnumerable().Concat(builtins) |
|
.DistinctBy(def => def.Name) |
|
.OrderBy(def => def.Name) |
|
.ToList(); |
|
} |
|
customizationList = new List<CustomizedHighlightingColor>(CustomizedHighlightingColor.LoadColors()); |
|
|
|
CreateDefaultEntries(null, out defaultText, defaultEntries); |
|
|
|
languageComboBox.Items.Clear(); |
|
languageComboBox.Items.Add(new XshdSyntaxDefinition { Name = "All languages" }); |
|
foreach (XshdSyntaxDefinition def in allSyntaxDefinitions.Where(d => !d.Name.Equals("XmlDoc", StringComparison.OrdinalIgnoreCase))) |
|
languageComboBox.Items.Add(def); |
|
if (allSyntaxDefinitions.Count > 0) |
|
languageComboBox.SelectedIndex = 0; |
|
} |
|
|
|
void LanguageComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) |
|
{ |
|
listBox.ItemsSource = null; |
|
XshdSyntaxDefinition xshd = (XshdSyntaxDefinition)languageComboBox.SelectedItem; |
|
if (xshd != null) { |
|
IHighlightingItem defaultText; |
|
ObservableCollection<IHighlightingItem> list = new ObservableCollection<IHighlightingItem>(); |
|
CreateDefaultEntries(languageComboBox.SelectedIndex == 0 ? null : xshd.Name, out defaultText, list); |
|
listBox.ItemsSource = list; |
|
|
|
if (languageComboBox.SelectedIndex > 0) { |
|
// Create entries for all customizable colors in the syntax highlighting definition |
|
// (but don't do this for the "All languages" pseudo-entry) |
|
IHighlightingDefinition def = HighlightingManager.Instance.GetDefinition(xshd.Name); |
|
if (def == null) { |
|
throw new InvalidOperationException("Expected that all XSHDs are registered in default highlighting manager; but highlighting definition was not found"); |
|
} else { |
|
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); |
|
list.Add(item); |
|
item.PropertyChanged += item_PropertyChanged; |
|
} |
|
} |
|
} |
|
} |
|
if (listBox.Items.Count > 0) |
|
listBox.SelectedIndex = 0; |
|
} |
|
} |
|
|
|
class ColorVisitor : IXshdVisitor |
|
{ |
|
internal readonly List<XshdColor> foundColors = new List<XshdColor>(); |
|
readonly HashSet<XshdSyntaxDefinition> visitedDefinitons = new HashSet<XshdSyntaxDefinition>(); |
|
IList<XshdSyntaxDefinition> allSyntaxDefinitions; |
|
|
|
public ColorVisitor(IList<XshdSyntaxDefinition> 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<XshdColor>()); |
|
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<XshdColor>()); |
|
return null; |
|
} |
|
|
|
public object VisitRule(XshdRule rule) |
|
{ |
|
return rule.ColorReference.AcceptVisitor(this); |
|
} |
|
} |
|
|
|
void CreateDefaultEntries(string language, out IHighlightingItem defaultText, IList<IHighlightingItem> items) |
|
{ |
|
// Create entry for "default text/background" |
|
defaultText = new SimpleHighlightingItem(CustomizingHighlighter.DefaultTextAndBackground, ta => ta.Document.Text = "Normal text") { |
|
Foreground = SystemColors.WindowTextColor, |
|
Background = SystemColors.WindowColor |
|
}; |
|
defaultText = new CustomizedHighlightingItem(customizationList, defaultText, language, canSetFont: false); |
|
defaultText.PropertyChanged += item_PropertyChanged; |
|
items.Add(defaultText); |
|
|
|
// Create entry for "Selected text" |
|
IHighlightingItem selectedText = new SimpleHighlightingItem( |
|
CustomizingHighlighter.SelectedText, |
|
ta => { |
|
ta.Document.Text = "Selected text"; |
|
ta.Selection = Selection.Create(ta, 0, 13); |
|
}) |
|
{ |
|
Foreground = SystemColors.HighlightTextColor, |
|
Background = SystemColors.HighlightColor |
|
}; |
|
selectedText = new CustomizedHighlightingItem(customizationList, selectedText, language, canSetFont: false); |
|
selectedText.PropertyChanged += item_PropertyChanged; |
|
items.Add(selectedText); |
|
|
|
// Create entry for "Non-printable characters" |
|
IHighlightingItem nonPrintChars = new SimpleHighlightingItem( |
|
CustomizingHighlighter.NonPrintableCharacters, |
|
ta => { |
|
ta.Document.Text = " \r \r\n \n"; |
|
}) |
|
{ |
|
Foreground = Colors.LightGray |
|
}; |
|
nonPrintChars = new CustomizedHighlightingItem(customizationList, nonPrintChars, language, canSetFont: false, canSetBackground: false); |
|
nonPrintChars.PropertyChanged += item_PropertyChanged; |
|
items.Add(nonPrintChars); |
|
|
|
// Create entry for "Line numbers" |
|
IHighlightingItem lineNumbers = new SimpleHighlightingItem( |
|
CustomizingHighlighter.LineNumbers, |
|
ta => { |
|
ta.Document.Text = "These are just" + Environment.NewLine + |
|
"multiple" + Environment.NewLine + |
|
"lines of" + Environment.NewLine + |
|
"text"; |
|
}) |
|
{ |
|
Foreground = Colors.Gray |
|
}; |
|
lineNumbers = new CustomizedHighlightingItem(customizationList, lineNumbers, language, canSetFont: false, canSetBackground: false); |
|
lineNumbers.PropertyChanged += item_PropertyChanged; |
|
items.Add(lineNumbers); |
|
|
|
// Create entry for "Bracket highlight" |
|
IHighlightingItem bracketHighlight = new SimpleHighlightingItem( |
|
BracketHighlightRenderer.BracketHighlight, |
|
ta => { |
|
ta.Document.Text = "(simple) example"; |
|
XshdSyntaxDefinition xshd = (XshdSyntaxDefinition)languageComboBox.SelectedItem; |
|
if (xshd == null) |
|
return; |
|
var customizationsForCurrentLanguage = customizationList.Where(c => c.Language == null || c.Language == xshd.Name); |
|
BracketHighlightRenderer.ApplyCustomizationsToRendering(bracketHighlighter, customizationsForCurrentLanguage); |
|
bracketHighlighter.SetHighlight(new BracketSearchResult(0, 1, 7, 1)); |
|
}) |
|
{ |
|
Foreground = BracketHighlightRenderer.DefaultBorder, |
|
Background = BracketHighlightRenderer.DefaultBackground |
|
}; |
|
bracketHighlight = new CustomizedHighlightingItem(customizationList, bracketHighlight, language, canSetFont: false); |
|
bracketHighlight.PropertyChanged += item_PropertyChanged; |
|
items.Add(bracketHighlight); |
|
|
|
// Create entry for "Folding controls" |
|
IHighlightingItem foldingControls = new SimpleHighlightingItem( |
|
FoldingControls, |
|
ta => { |
|
ta.Document.Text = "This" + Environment.NewLine + |
|
"is a folding" + Environment.NewLine + |
|
"example"; |
|
foldingManager.CreateFolding(0, 10); |
|
}) |
|
{ |
|
Foreground = Colors.Gray, |
|
Background = Colors.White |
|
}; |
|
foldingControls = new CustomizedHighlightingItem(customizationList, foldingControls, language, canSetFont: false); |
|
foldingControls.PropertyChanged += item_PropertyChanged; |
|
items.Add(foldingControls); |
|
|
|
// Create entry for "Selected folding controls" |
|
IHighlightingItem selectedFoldingControls = new SimpleHighlightingItem( |
|
FoldingSelectedControls, |
|
ta => { |
|
ta.Document.Text = "This" + Environment.NewLine + |
|
"is a folding" + Environment.NewLine + |
|
"example"; |
|
foldingManager.CreateFolding(0, 10); |
|
}) |
|
{ |
|
Foreground = Colors.Black, |
|
Background = Colors.White |
|
}; |
|
selectedFoldingControls = new CustomizedHighlightingItem(customizationList, selectedFoldingControls, language, canSetFont: false); |
|
selectedFoldingControls.PropertyChanged += item_PropertyChanged; |
|
items.Add(selectedFoldingControls); |
|
|
|
// Create entry for "Folding text markers" |
|
IHighlightingItem foldingTextMarker = new SimpleHighlightingItem( |
|
FoldingTextMarkers, |
|
ta => { |
|
ta.Document.Text = "This" + Environment.NewLine + |
|
"is a folding" + Environment.NewLine + |
|
"example"; |
|
foldingManager.CreateFolding(0, 10).IsFolded = true; |
|
}) |
|
{ |
|
Foreground = Colors.Gray |
|
}; |
|
foldingTextMarker = new CustomizedHighlightingItem(customizationList, foldingTextMarker, language, canSetFont: false, canSetBackground: false); |
|
foldingTextMarker.PropertyChanged += item_PropertyChanged; |
|
items.Add(foldingTextMarker); |
|
|
|
IHighlightingItem linkText = new SimpleHighlightingItem( |
|
CustomizingHighlighter.LinkText, |
|
ta => { |
|
ta.Document.Text = "http://icsharpcode.net" + Environment.NewLine + "me@example.com"; |
|
}) |
|
{ |
|
Foreground = Colors.Blue, |
|
Background = Colors.Transparent |
|
}; |
|
linkText = new CustomizedHighlightingItem(customizationList, linkText, language, canSetFont: false); |
|
linkText.PropertyChanged += item_PropertyChanged; |
|
items.Add(linkText); |
|
|
|
IHighlightingItem errorMarker = new SimpleHighlightingItem( |
|
ErrorPainter.ErrorColorName, |
|
ta => { |
|
ta.Document.Text = "some error"; |
|
ITextMarker marker = textMarkerService.Create(0, 5); |
|
marker.Tag = (Action<IHighlightingItem, ITextMarker>)delegate(IHighlightingItem item, ITextMarker m) { |
|
m.MarkerTypes = TextMarkerTypes.SquigglyUnderline; |
|
m.MarkerColor = item.Foreground; |
|
}; |
|
}) |
|
{ |
|
Foreground = Colors.Red |
|
}; |
|
errorMarker = new CustomizedHighlightingItem(customizationList, errorMarker, language, canSetFont: false, canSetBackground: false); |
|
errorMarker.PropertyChanged += item_PropertyChanged; |
|
items.Add(errorMarker); |
|
|
|
IHighlightingItem warningMarker = new SimpleHighlightingItem( |
|
ErrorPainter.WarningColorName, |
|
ta => { |
|
ta.Document.Text = "some warning"; |
|
ITextMarker marker = textMarkerService.Create(0, 5); |
|
marker.Tag = (Action<IHighlightingItem, ITextMarker>)delegate(IHighlightingItem item, ITextMarker m) { |
|
m.MarkerTypes = TextMarkerTypes.SquigglyUnderline; |
|
m.MarkerColor = item.Foreground; |
|
}; |
|
}) |
|
{ |
|
Foreground = Colors.Orange |
|
}; |
|
warningMarker = new CustomizedHighlightingItem(customizationList, warningMarker, language, canSetFont: false, canSetBackground: false); |
|
warningMarker.PropertyChanged += item_PropertyChanged; |
|
items.Add(warningMarker); |
|
|
|
IHighlightingItem messageMarker = new SimpleHighlightingItem( |
|
ErrorPainter.MessageColorName, |
|
ta => { |
|
ta.Document.Text = "some message"; |
|
ITextMarker marker = textMarkerService.Create(0, 5); |
|
marker.Tag = (Action<IHighlightingItem, ITextMarker>)delegate(IHighlightingItem item, ITextMarker m) { |
|
m.MarkerTypes = TextMarkerTypes.SquigglyUnderline; |
|
m.MarkerColor = item.Foreground; |
|
}; |
|
}) |
|
{ |
|
Foreground = Colors.Blue |
|
}; |
|
messageMarker = new CustomizedHighlightingItem(customizationList, messageMarker, language, canSetFont: false, canSetBackground: false); |
|
messageMarker.PropertyChanged += item_PropertyChanged; |
|
items.Add(messageMarker); |
|
|
|
IHighlightingItem breakpointMarker = new SimpleHighlightingItem( |
|
BreakpointBookmark.BreakpointMarker, |
|
ta => { |
|
ta.Document.Text = "some code with a breakpoint"; |
|
ITextMarker marker = textMarkerService.Create(0, ta.Document.TextLength); |
|
marker.Tag = (Action<IHighlightingItem, ITextMarker>)delegate(IHighlightingItem item, ITextMarker m) { |
|
m.BackgroundColor = item.Background; |
|
m.ForegroundColor = item.Foreground; |
|
}; |
|
}) |
|
{ |
|
Background = BreakpointBookmark.DefaultBackground, |
|
Foreground = BreakpointBookmark.DefaultForeground |
|
}; |
|
breakpointMarker = new CustomizedHighlightingItem(customizationList, breakpointMarker, language, canSetFont: false); |
|
breakpointMarker.PropertyChanged += item_PropertyChanged; |
|
items.Add(breakpointMarker); |
|
|
|
IHighlightingItem currentStatementMarker = new SimpleHighlightingItem( |
|
CurrentLineBookmark.Name, |
|
ta => { |
|
ta.Document.Text = "current statement line"; |
|
ITextMarker marker = textMarkerService.Create(0, ta.Document.TextLength); |
|
marker.Tag = (Action<IHighlightingItem, ITextMarker>)delegate(IHighlightingItem item, ITextMarker m) { |
|
m.BackgroundColor = item.Background; |
|
m.ForegroundColor = item.Foreground; |
|
}; |
|
}) |
|
{ |
|
Background = CurrentLineBookmark.DefaultBackground, |
|
Foreground = CurrentLineBookmark.DefaultForeground |
|
}; |
|
currentStatementMarker = new CustomizedHighlightingItem(customizationList, currentStatementMarker, language, canSetFont: false); |
|
currentStatementMarker.PropertyChanged += item_PropertyChanged; |
|
items.Add(currentStatementMarker); |
|
|
|
IHighlightingItem columnRuler = new SimpleHighlightingItem( |
|
CustomizingHighlighter.ColumnRuler, |
|
ta => { |
|
ta.Document.Text = "some line with a lot of text"; |
|
ta.TextView.Options.ColumnRulerPosition = 15; |
|
ta.TextView.Options.ShowColumnRuler = true; |
|
}) |
|
{ |
|
Foreground = Colors.LightGray |
|
}; |
|
columnRuler = new CustomizedHighlightingItem(customizationList, columnRuler, language, canSetFont: false, canSetBackground: false); |
|
columnRuler.PropertyChanged += item_PropertyChanged; |
|
items.Add(columnRuler); |
|
} |
|
|
|
void item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) |
|
{ |
|
UpdatePreview(); |
|
} |
|
|
|
public override bool SaveOptions() |
|
{ |
|
CustomizedHighlightingColor.SaveColors(customizationList); |
|
return base.SaveOptions(); |
|
} |
|
|
|
void ResetButtonClick(object sender, RoutedEventArgs e) |
|
{ |
|
IHighlightingItem item = resetButton.DataContext as IHighlightingItem; |
|
if (item != null) |
|
item.Reset(); |
|
} |
|
|
|
void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) |
|
{ |
|
UpdatePreview(); |
|
} |
|
|
|
HighlightingColorizer colorizer; |
|
|
|
void UpdatePreview() |
|
{ |
|
XshdSyntaxDefinition xshd = (XshdSyntaxDefinition)languageComboBox.SelectedItem; |
|
if (xshd != null) { |
|
var customizationsForCurrentLanguage = customizationList.Where(c => c.Language == null || c.Language == xshd.Name); |
|
CustomizingHighlighter.ApplyCustomizationsToDefaultElements(textEditor, customizationsForCurrentLanguage); |
|
ApplyToRendering(textEditor, customizationsForCurrentLanguage); |
|
var item = (IHighlightingItem)listBox.SelectedItem; |
|
TextView textView = textEditor.TextArea.TextView; |
|
foldingManager.Clear(); |
|
textMarkerService.RemoveAll(m => true); |
|
textView.LineTransformers.Remove(colorizer); |
|
colorizer = null; |
|
if (item != null) { |
|
if (item.ParentDefinition != null) { |
|
var highlighter = new CustomizingHighlighter( |
|
new DocumentHighlighter(textView.Document, item.ParentDefinition), |
|
customizationsForCurrentLanguage |
|
); |
|
colorizer = new HighlightingColorizer(highlighter); |
|
textView.LineTransformers.Add(colorizer); |
|
} |
|
textEditor.Select(0, 0); |
|
bracketHighlighter.SetHighlight(null); |
|
item.ShowExample(textEditor.TextArea); |
|
ITextMarker m = textMarkerService.TextMarkers.SingleOrDefault(); |
|
if (m != null && m.Tag != null) { |
|
((Action<IHighlightingItem, ITextMarker>)m.Tag)(item, m); |
|
} |
|
} |
|
} |
|
} |
|
|
|
void ImportButtonClick(object sender, RoutedEventArgs e) |
|
{ |
|
OpenFileDialog dialog = new OpenFileDialog { |
|
Filter = @"All known settings|*.vssettings;*.sdsettings|Visual Studio settings (*.vssettings)|*.vssettings|SharpDevelop settings (*.sdsettings)|*.sdsettings", |
|
CheckFileExists = true |
|
}; |
|
if (dialog.ShowDialog() != true) |
|
return; |
|
switch (Path.GetExtension(dialog.FileName).ToUpperInvariant()) { |
|
case ".VSSETTINGS": |
|
LoadVSSettings(XDocument.Load(dialog.FileName)); |
|
break; |
|
case ".SDSETTINGS": |
|
LoadSDSettings(XDocument.Load(dialog.FileName)); |
|
break; |
|
} |
|
} |
|
#region VSSettings |
|
void LoadVSSettings(XDocument document) |
|
{ |
|
XElement[] items; |
|
if (!CheckVersionAndFindCategory(document, out items) || items == null) { |
|
Core.MessageService.ShowError("${res:Dialog.HighlightingEditor.NotSupportedMessage}"); |
|
return; |
|
} |
|
if (!MessageService.AskQuestion("${res:Dialog.HighlightingEditor.OverwriteCustomizationsMessage}")) |
|
return; |
|
ResetAllButtonClick(null, null); |
|
foreach (var item in items) { |
|
string key = item.Attribute("Name").Value; |
|
var entry = ParseEntry(item); |
|
foreach (var sdKey in mapping[key]) { |
|
IHighlightingItem color; |
|
if (FindSDColor(sdKey, out color)) { |
|
color.Bold = entry.Item3; |
|
color.UseDefaultForeground = !entry.Item1.HasValue; |
|
if (entry.Item1 != null) |
|
color.Foreground = entry.Item1.Value; |
|
color.UseDefaultBackground = !entry.Item2.HasValue; |
|
if (entry.Item2 != null) |
|
color.Background = entry.Item2.Value; |
|
} |
|
} |
|
} |
|
} |
|
|
|
readonly List<IHighlightingItem> defaultEntries = new List<IHighlightingItem>(); |
|
IHighlightingItem defaultText; |
|
|
|
bool FindSDColor(string sdKey, out IHighlightingItem item) |
|
{ |
|
string language = null; |
|
int dot = sdKey.IndexOf('.'); |
|
if (dot > 0) { |
|
language = sdKey.Substring(0, dot); |
|
sdKey = sdKey.Substring(dot + 1); |
|
} |
|
if ((language == null && languageComboBox.SelectedIndex == 0) |
|
|| (language == ((XshdSyntaxDefinition)languageComboBox.SelectedItem).Name)) { |
|
item = listBox.Items.OfType<IHighlightingItem>().FirstOrDefault(i => i.Name == sdKey); |
|
} else if (language == null) { |
|
item = defaultEntries.FirstOrDefault(i => i.Name == sdKey); |
|
} else { |
|
var def = allSyntaxDefinitions.FirstOrDefault(d => d.Name == language); |
|
var highlighting = HighlightingManager.Instance.GetDefinition(language); |
|
item = null; |
|
if (def != null && highlighting != null) { |
|
var visitor = new ColorVisitor(allSyntaxDefinitions); |
|
def.AcceptElements(visitor); |
|
var color = visitor.foundColors.FirstOrDefault(i => i.Name == sdKey); |
|
if (color != null) { |
|
item = new NamedColorHighlightingItem(defaultText, color) { ParentDefinition = highlighting }; |
|
item = new CustomizedHighlightingItem(customizationList, item, language); |
|
} |
|
} |
|
} |
|
return item != null; |
|
} |
|
|
|
// VS => SD |
|
static readonly MultiDictionary<string, string> mapping = new MultiDictionary<string, string>(StringComparer.Ordinal) { |
|
{ "Brace Matching (Rectangle)", BracketHighlightRenderer.BracketHighlight }, |
|
{ "Collapsible Text", FoldingTextMarkers }, |
|
{ "Comment", "VBNET.Comment" }, |
|
{ "Comment", "C#.Comment" }, |
|
{ "Compiler Error", ErrorPainter.ErrorColorName }, |
|
{ "CSS Comment", "CSS.Comment" }, |
|
{ "CSS Keyword", "" }, |
|
{ "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", "" }, |
|
{ "HTML Comment", "" }, |
|
{ "HTML Element Name", "" }, |
|
{ "HTML Entity", "" }, |
|
{ "HTML Operator", "" }, |
|
{ "HTML Server-Side Script", "" }, |
|
{ "HTML Tag Delimiter", "" }, |
|
{ "Identifier", "C#.MethodCall" }, |
|
{ "Inactive Selected Text", "" }, |
|
{ "Indicator Margin", "" }, |
|
{ "Keyword", "C#.ThisOrBaseReference" }, |
|
{ "Keyword", "C#.NullOrValueKeywords" }, |
|
{ "Keyword", "C#.Keywords" }, |
|
{ "Keyword", "C#.GotoKeywords" }, |
|
{ "Keyword", "C#.ContextKeywords" }, |
|
{ "Keyword", "C#.ExceptionKeywords" }, |
|
{ "Keyword", "C#.CheckedKeyword" }, |
|
{ "Keyword", "C#.UnsafeKeywords" }, |
|
{ "Keyword", "C#.OperatorKeywords" }, |
|
{ "Keyword", "C#.ParameterModifiers" }, |
|
{ "Keyword", "C#.Modifiers" }, |
|
{ "Keyword", "C#.Visibility" }, |
|
{ "Keyword", "C#.NamespaceKeywords" }, |
|
{ "Keyword", "C#.GetSetAddRemove" }, |
|
{ "Keyword", "C#.TrueFalse" }, |
|
{ "Keyword", "C#.TypeKeywords" }, |
|
{ "Keyword", "C#.ValueTypes" }, |
|
{ "Keyword", "C#.ReferenceTypes" }, |
|
{ "Keyword", "VBNET.DateLiteral" }, |
|
{ "Keyword", "VBNET.Preprocessor" }, |
|
{ "Keyword", "VBNET.DataTypes" }, |
|
{ "Keyword", "VBNET.Operators" }, |
|
{ "Keyword", "VBNET.Constants" }, |
|
{ "Keyword", "VBNET.Keywords" }, |
|
{ "Keyword", "VBNET.FunctionKeywords" }, |
|
{ "Keyword", "VBNET.ContextKeywords" }, |
|
{ "Line Numbers", CustomizingHighlighter.LineNumbers }, |
|
{ "MarkerFormatDefinition/HighlightedReference", "" }, |
|
{ "Number", "C#.NumberLiteral" }, |
|
{ "Operator", "C#.Punctuation" }, |
|
{ "outlining.collapsehintadornment", "" }, |
|
{ "outlining.square", FoldingControls }, |
|
{ "outlining.square", FoldingSelectedControls }, |
|
{ "outlining.verticalrule", "" }, |
|
{ "Plain Text", "" }, |
|
{ "Plain Text", CustomizingHighlighter.DefaultTextAndBackground }, |
|
{ "Preprocessor Keyword", "" }, |
|
{ "Preprocessor Keyword", "C#.Preprocessor" }, |
|
{ "Razor Code", "" }, |
|
{ "Script Comment", "" }, |
|
{ "Script Identifier", "" }, |
|
{ "Script Keyword", "" }, |
|
{ "Script Number", "" }, |
|
{ "Script Operator", "" }, |
|
{ "Script String", "" }, |
|
{ "Selected Text", "" }, |
|
{ "Selected Text", CustomizingHighlighter.SelectedText }, |
|
{ "String", "VBNET.String" }, |
|
{ "String", "C#.String" }, |
|
{ "String(C# @ Verbatim)", "" }, |
|
{ "Syntax Error", "" }, |
|
{ "urlformat", CustomizingHighlighter.LinkText }, |
|
{ "User Types", "" }, |
|
{ "User Types(Delegates)", "" }, |
|
{ "User Types(Enums)", "" }, |
|
{ "User Types(Interfaces)", "" }, |
|
{ "User Types(Value types)", "" }, |
|
{ "Warning", ErrorPainter.WarningColorName }, |
|
{ "XAML Attribute Quotes", "" }, |
|
{ "XAML Attribute Value", "" }, |
|
{ "XAML Attribute", "" }, |
|
{ "XAML CData Section", "" }, |
|
{ "XAML Comment", "" }, |
|
{ "XAML Delimiter", "" }, |
|
{ "XAML Markup Extension Class", "" }, |
|
{ "XAML Markup Extension Parameter Name", "" }, |
|
{ "XAML Markup Extension Parameter Value", "" }, |
|
{ "XAML Name", "" }, |
|
{ "XAML Text", "" }, |
|
{ "XML Attribute Quotes", "" }, |
|
{ "XML Attribute Value", "XML.AttributeValue" }, |
|
{ "XML Attribute", "XML.AttributeName" }, |
|
{ "XML CData Section", "XML.CData" }, |
|
{ "XML Comment", "XML.Comment" }, |
|
{ "XML Delimiter", "" }, |
|
{ "XML Doc Comment", "C#.DocComment" }, |
|
{ "XML Doc Tag", "C#.KnownDocTags" }, |
|
{ "XML Doc Comment", "VBNET.DocComment" }, |
|
{ "XML Doc Tag", "VBNET.KnownDocTags" }, |
|
{ "XML Name", "XML.XmlTag" }, |
|
{ "XML Name", "XML.XmlDeclaration" }, |
|
{ "XML Name", "XML.DocType" }, |
|
{ "XML Text", "XML." + CustomizingHighlighter.DefaultTextAndBackground }, |
|
}; |
|
|
|
Tuple<Color?, Color?, bool> ParseEntry(XElement element) |
|
{ |
|
Color? fore = null; |
|
Color? back = null; |
|
bool isBold = false; |
|
|
|
var attribute = element.Attribute("Foreground"); |
|
if (attribute != null) |
|
fore = ParseColor(attribute.Value); |
|
attribute = element.Attribute("Background"); |
|
if (attribute != null) |
|
back = ParseColor(attribute.Value); |
|
attribute = element.Attribute("BoldFont"); |
|
if (attribute != null) |
|
isBold = attribute.Value == "Yes"; |
|
|
|
return Tuple.Create(fore, back, isBold); |
|
} |
|
|
|
Color? ParseColor(string s) |
|
{ |
|
if (string.IsNullOrWhiteSpace(s)) |
|
return null; |
|
if (s.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) |
|
s = s.Substring(2); |
|
if (s.Length < 8) |
|
return null; |
|
if (string.CompareOrdinal(s.Substring(0, 2), "02") == 0) |
|
return null; |
|
byte r, g, b; |
|
if (!byte.TryParse(s.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out b)) |
|
return Colors.Transparent; |
|
if (!byte.TryParse(s.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out g)) |
|
return Colors.Transparent; |
|
if (!byte.TryParse(s.Substring(6, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out r)) |
|
return Colors.Transparent; |
|
return Color.FromRgb(r, g, b); |
|
} |
|
|
|
bool CheckVersionAndFindCategory(XDocument document, out XElement[] categoryItems) |
|
{ |
|
categoryItems = null; |
|
var node = document.Root; |
|
var appID = document.Root.Element("ApplicationIdentity"); |
|
var category = document.Root.Descendants("Category").FirstOrDefault(e => e.Attribute("GUID") != null && e.Attribute("GUID").Value == "{A27B4E24-A735-4D1D-B8E7-9716E1E3D8E0}"); |
|
if (category != null) |
|
categoryItems = category.Descendants("Item").ToArray(); |
|
if (node.Name != "UserSettings" || appID == null || category == null) |
|
return false; |
|
return appID.Attribute("version") != null && appID.Attribute("version").Value == "10.0"; |
|
} |
|
#endregion |
|
|
|
#region SDSettings |
|
void LoadSDSettings(XDocument document) |
|
{ |
|
var version = document.Root.Attribute("version"); |
|
if (version != null && version.Value != Properties.FileVersion.ToString()) { |
|
Core.MessageService.ShowError("Settings version not supported!"); |
|
return; |
|
} |
|
var p = Properties.Load(document.Root); |
|
customizationList = p.GetList<CustomizedHighlightingColor>("CustomizedHighlightingRules").ToList(); |
|
LanguageComboBox_SelectionChanged(null, null); |
|
} |
|
#endregion |
|
|
|
void ExportButtonClick(object sender, RoutedEventArgs e) |
|
{ |
|
SaveFileDialog dialog = new SaveFileDialog { |
|
Filter = @"SharpDevelop settings (*.sdsettings)|*.sdsettings", |
|
}; |
|
if (dialog.ShowDialog() != true) |
|
return; |
|
Save(dialog.FileName); |
|
} |
|
|
|
void Save(string fileName) |
|
{ |
|
Properties p = new Properties(); |
|
p.SetList("CustomizedHighlightingRules", customizationList); |
|
XElement root = p.Save(); |
|
root.SetAttributeValue("version", Properties.FileVersion.ToString()); |
|
new XDocument(root).Save(fileName); |
|
} |
|
|
|
void ResetAllButtonClick(object sender, RoutedEventArgs e) |
|
{ |
|
customizationList.Clear(); |
|
LanguageComboBox_SelectionChanged(null, null); |
|
UpdatePreview(); |
|
} |
|
} |
|
}
|
|
|