aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/SideChains/RealTimeGraphX-master/RealTimeGraphX/GraphObject.cs
blob: d37110c5c56da1ce456613e6e4c5e5ae68c9cd09 (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
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace RealTimeGraphX
{
    /// <summary>
    /// Represents an <see cref="INotifyPropertyChanged"/> supported graph object.
    /// </summary>
    /// <seealso cref="System.ComponentModel.INotifyPropertyChanged" />
    public abstract class GraphObject : INotifyPropertyChanged
    {
        /// <summary>
        /// Occurs when a property value changes.
        /// </summary>
        [field: NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Raises the property changed event.
        /// </summary>
        /// <param name="propName">Name of the property.</param>
        protected virtual void RaisePropertyChangedAuto([CallerMemberName] string caller = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(caller));
        }

        /// <summary>
        /// Raises the property changed event.
        /// </summary>
        /// <param name="propName">Name of the property.</param>
        protected virtual void RaisePropertyChanged(String propName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        }
    }
}
/// <see cref="VisualLineElement.RelativeTextOffset"/> to find the actual text string. /// </summary> public VisualLineText(VisualLine parentVisualLine, int length) : base(length, length) { if (parentVisualLine == null) throw new ArgumentNullException("parentVisualLine"); this.parentVisualLine = parentVisualLine; } /// <summary> /// Override this method to control the type of new VisualLineText instances when /// the visual line is split due to syntax highlighting. /// </summary> protected virtual VisualLineText CreateInstance(int length) { return new VisualLineText(parentVisualLine, length); } /// <inheritdoc/> public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context) { if (context == null) throw new ArgumentNullException("context"); int relativeOffset = startVisualColumn - VisualColumn; StringSegment text = context.GetText(context.VisualLine.FirstDocumentLine.Offset + RelativeTextOffset + relativeOffset, DocumentLength - relativeOffset); return new TextCharacters(text.Text, text.Offset, text.Count, this.TextRunProperties); } /// <inheritdoc/> public override bool IsWhitespace(int visualColumn) { int offset = visualColumn - this.VisualColumn + parentVisualLine.FirstDocumentLine.Offset + this.RelativeTextOffset; return char.IsWhiteSpace(parentVisualLine.Document.GetCharAt(offset)); } /// <inheritdoc/> public override TextSpan<CultureSpecificCharacterBufferRange> GetPrecedingText(int visualColumnLimit, ITextRunConstructionContext context) { if (context == null) throw new ArgumentNullException("context"); int relativeOffset = visualColumnLimit - VisualColumn; StringSegment text = context.GetText(context.VisualLine.FirstDocumentLine.Offset + RelativeTextOffset, relativeOffset); CharacterBufferRange range = new CharacterBufferRange(text.Text, text.Offset, text.Count); return new TextSpan<CultureSpecificCharacterBufferRange>(range.Length, new CultureSpecificCharacterBufferRange(this.TextRunProperties.CultureInfo, range)); } /// <inheritdoc/> public override bool CanSplit { get { return true; } } /// <inheritdoc/> public override void Split(int splitVisualColumn, IList<VisualLineElement> elements, int elementIndex) { if (splitVisualColumn <= VisualColumn || splitVisualColumn >= VisualColumn + VisualLength) throw new ArgumentOutOfRangeException("splitVisualColumn", splitVisualColumn, "Value must be between " + (VisualColumn + 1) + " and " + (VisualColumn + VisualLength - 1)); if (elements == null) throw new ArgumentNullException("elements"); if (elements[elementIndex] != this) throw new ArgumentException("Invalid elementIndex - couldn't find this element at the index"); int relativeSplitPos = splitVisualColumn - VisualColumn; VisualLineText splitPart = CreateInstance(DocumentLength - relativeSplitPos); SplitHelper(this, splitPart, splitVisualColumn, relativeSplitPos + RelativeTextOffset); elements.Insert(elementIndex + 1, splitPart); } /// <inheritdoc/> public override int GetRelativeOffset(int visualColumn) { return this.RelativeTextOffset + visualColumn - this.VisualColumn; } /// <inheritdoc/> public override int GetVisualColumn(int relativeTextOffset) { return this.VisualColumn + relativeTextOffset - this.RelativeTextOffset; } /// <inheritdoc/> public override int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) { int textOffset = parentVisualLine.StartOffset + this.RelativeTextOffset; int pos = TextUtilities.GetNextCaretPosition(parentVisualLine.Document, textOffset + visualColumn - this.VisualColumn, direction, mode); if (pos < textOffset || pos > textOffset + this.DocumentLength) return -1; else return this.VisualColumn + pos - textOffset; } } }