aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/ObjectToPropertiesConverter.cs
blob: 09e7b527a9db7e4128c93071b7d54904504938b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace Tango.MachineStudio.Developer.Converters
{
    public class ObjectToPropertiesConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                var properties = value.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => (!x.PropertyType.IsClass && !typeof(IEnumerable).IsAssignableFrom(x.PropertyType)) || x.PropertyType == typeof(String)).ToList();
                return properties.Select(x => new { x.Name, Value = x.GetValue(value) });
            }
            else
            {
                return null;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
class="o">= document; this.DocumentLine = documentLine; this.Sections = new NullSafeCollection<HighlightedSection>(); } /// <summary> /// Gets the document associated with this HighlightedLine. /// </summary> public TextDocument Document { get; private set; } /// <summary> /// Gets the document line associated with this HighlightedLine. /// </summary> public DocumentLine DocumentLine { get; private set; } /// <summary> /// Gets the highlighted sections. /// The sections are not overlapping, but they may be nested. /// In that case, outer sections come in the list before inner sections. /// The sections are sorted by start offset. /// </summary> public IList<HighlightedSection> Sections { get; private set; } /// <summary> /// Gets the default color of all text outside a <see cref="HighlightedSection"/>. /// </summary> public HighlightingColor DefaultTextColor { get; set; } sealed class HtmlElement : IComparable<HtmlElement> { internal readonly int Offset; internal readonly int Nesting; internal readonly bool IsEnd; internal readonly HighlightingColor Color; public HtmlElement(int offset, int nesting, bool isEnd, HighlightingColor color) { this.Offset = offset; this.Nesting = nesting; this.IsEnd = isEnd; this.Color = color; } public int CompareTo(HtmlElement other) { int r = Offset.CompareTo(other.Offset); if (r != 0) return r; if (IsEnd != other.IsEnd) { if (IsEnd) return -1; else return 1; } else { if (IsEnd) return other.Nesting.CompareTo(Nesting); else return Nesting.CompareTo(other.Nesting); } } } /// <summary> /// Produces HTML code for the line, with &lt;span class="colorName"&gt; tags. /// </summary> public string ToHtml(HtmlOptions options) { int startOffset = this.DocumentLine.Offset; return ToHtml(startOffset, startOffset + this.DocumentLine.Length, options); } /// <summary> /// Produces HTML code for a section of the line, with &lt;span class="colorName"&gt; tags. /// </summary> public string ToHtml(int startOffset, int endOffset, HtmlOptions options) { if (options == null) throw new ArgumentNullException("options"); int documentLineStartOffset = this.DocumentLine.Offset; int documentLineEndOffset = documentLineStartOffset + this.DocumentLine.Length; if (startOffset < documentLineStartOffset || startOffset > documentLineEndOffset) throw new ArgumentOutOfRangeException("startOffset", startOffset, "Value must be between " + documentLineStartOffset + " and " + documentLineEndOffset); if (endOffset < startOffset || endOffset > documentLineEndOffset) throw new ArgumentOutOfRangeException("endOffset", endOffset, "Value must be between startOffset and " + documentLineEndOffset); ISegment requestedSegment = new SimpleSegment(startOffset, endOffset - startOffset); List<HtmlElement> elements = new List<HtmlElement>(); for (int i = 0; i < this.Sections.Count; i++) { HighlightedSection s = this.Sections[i]; if (s.GetOverlap(requestedSegment).Length > 0) { elements.Add(new HtmlElement(s.Offset, i, false, s.Color)); elements.Add(new HtmlElement(s.Offset + s.Length, i, true, s.Color)); } } elements.Sort(); TextDocument document = this.Document; StringWriter w = new StringWriter(CultureInfo.InvariantCulture); int textOffset = startOffset; foreach (HtmlElement e in elements) { int newOffset = Math.Min(e.Offset, endOffset); if (newOffset > startOffset) { HtmlClipboard.EscapeHtml(w, document.GetText(textOffset, newOffset - textOffset), options); } textOffset = Math.Max(textOffset, newOffset); if (options.ColorNeedsSpanForStyling(e.Color)) { if (e.IsEnd) { w.Write("</span>"); } else { w.Write("<span"); options.WriteStyleAttributeForColor(w, e.Color); w.Write('>'); } } } HtmlClipboard.EscapeHtml(w, document.GetText(textOffset, endOffset - textOffset), options); return w.ToString(); } /// <inheritdoc/> public override string ToString() { return "[" + GetType().Name + " " + ToHtml(new HtmlOptions()) + "]"; } } }