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();
        }
    }
}
minGapLength = 128; /// <summary> /// when the gap exceeds this size, reallocate a smaller buffer /// </summary> const int maxGapLength = 4096; public int Length { get { return buffer.Length - gapLength; } } /// <summary> /// Gets the buffer content. /// </summary> public string Text { get { if (textContent == null) textContent = GetText(0, Length); return textContent; } set { Debug.Assert(value != null); textContent = value; lastGetTextResult = null; buffer = new char[value.Length + minGapLength]; value.CopyTo(0, buffer, 0, value.Length); gapBeginOffset = value.Length; gapEndOffset = buffer.Length; gapLength = gapEndOffset - gapBeginOffset; } } public char GetCharAt(int offset) { return offset < gapBeginOffset ? buffer[offset] : buffer[offset + gapLength]; } public string GetText(int offset, int length) { if (length == 0) return string.Empty; if (lastGetTextRequestOffset == offset && lastGetTextResult != null && length == lastGetTextResult.Length) return lastGetTextResult; int end = offset + length; string result; if (end < gapBeginOffset) { result = new string(buffer, offset, length); } else if (offset > gapBeginOffset) { result = new string(buffer, offset + gapLength, length); } else { int block1Size = gapBeginOffset - offset; int block2Size = end - gapBeginOffset; StringBuilder buf = new StringBuilder(block1Size + block2Size); buf.Append(buffer, offset, block1Size); buf.Append(buffer, gapEndOffset, block2Size); result = buf.ToString(); } lastGetTextRequestOffset = offset; lastGetTextResult = result; return result; } /// <summary> /// Inserts text at the specified offset. /// </summary> public void Insert(int offset, string text) { Debug.Assert(offset >= 0 && offset <= Length); if (text.Length == 0) return; textContent = null; lastGetTextResult = null; PlaceGap(offset, text.Length); text.CopyTo(0, buffer, gapBeginOffset, text.Length); gapBeginOffset += text.Length; gapLength = gapEndOffset - gapBeginOffset; } /// <summary> /// Remove <paramref name="length"/> characters at <paramref name="offset"/>. /// Leave a gap of at least <paramref name="reserveGapSize"/>. /// </summary> public void Remove(int offset, int length, int reserveGapSize) { Debug.Assert(offset >= 0 && offset <= Length); Debug.Assert(length >= 0 && offset + length <= Length); Debug.Assert(reserveGapSize >= 0); if (length == 0) return; textContent = null; lastGetTextResult = null; PlaceGap(offset, reserveGapSize - length); gapEndOffset += length; // delete removed text gapLength = gapEndOffset - gapBeginOffset; if (gapLength - reserveGapSize > maxGapLength && gapLength - reserveGapSize > buffer.Length / 4) { // shrink gap MakeNewBuffer(gapBeginOffset, reserveGapSize + minGapLength); } } void PlaceGap(int newGapOffset, int minRequiredGapLength) { if (gapLength < minRequiredGapLength) { // enlarge gap MakeNewBuffer(newGapOffset, minRequiredGapLength + Math.Max(minGapLength, buffer.Length / 8)); } else { while (newGapOffset < gapBeginOffset) { buffer[--gapEndOffset] = buffer[--gapBeginOffset]; } while (newGapOffset > gapBeginOffset) { buffer[gapBeginOffset++] = buffer[gapEndOffset++]; } } } void MakeNewBuffer(int newGapOffset, int newGapLength) { char[] newBuffer = new char[Length + newGapLength]; Debug.WriteLine("GapTextBuffer was reallocated, new size=" + newBuffer.Length); if (newGapOffset < gapBeginOffset) { // gap is moving backwards // first part: Array.Copy(buffer, 0, newBuffer, 0, newGapOffset); // moving middle part: Array.Copy(buffer, newGapOffset, newBuffer, newGapOffset + newGapLength, gapBeginOffset - newGapOffset); // last part: Array.Copy(buffer, gapEndOffset, newBuffer, newBuffer.Length - (buffer.Length - gapEndOffset), buffer.Length - gapEndOffset); } else { // gap is moving forwards // first part: Array.Copy(buffer, 0, newBuffer, 0, gapBeginOffset); // moving middle part: Array.Copy(buffer, gapEndOffset, newBuffer, gapBeginOffset, newGapOffset - gapBeginOffset); // last part: int lastPartLength = newBuffer.Length - (newGapOffset + newGapLength); Array.Copy(buffer, buffer.Length - lastPartLength, newBuffer, newGapOffset + newGapLength, lastPartLength); } gapBeginOffset = newGapOffset; gapEndOffset = newGapOffset + newGapLength; gapLength = newGapLength; buffer = newBuffer; } } */ }