aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/INavigationObjectReceiver.cs
blob: 5072881d232e49c00213ff577c3034d51959f6fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tango.MachineStudio.Common.Navigation
{
    /// <summary>
    /// Represents an object which supports receiving an object as part of the navigation to it.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface INavigationObjectReceiver<T>
    {
        /// <summary>
        /// Called when navigation system is going to navigate to this instance with the specified object.
        /// </summary>
        /// <param name="obj">The object.</param>
        void OnNavigatedToWithObject(T obj);
    }
}
o.Scripting.Editors.Editing { /// <summary> /// Implementation for <see cref="IReadOnlySectionProvider"/> that stores the segments /// in a <see cref="TextSegmentCollection{T}"/>. /// </summary> public class TextSegmentReadOnlySectionProvider<T> : IReadOnlySectionProvider where T : TextSegment { readonly TextSegmentCollection<T> segments; /// <summary> /// Gets the collection storing the read-only segments. /// </summary> public TextSegmentCollection<T> Segments { get { return segments; } } /// <summary> /// Creates a new TextSegmentReadOnlySectionProvider instance for the specified document. /// </summary> public TextSegmentReadOnlySectionProvider(TextDocument textDocument) { segments = new TextSegmentCollection<T>(textDocument); } /// <summary> /// Creates a new TextSegmentReadOnlySectionProvider instance using the specified TextSegmentCollection. /// </summary> public TextSegmentReadOnlySectionProvider(TextSegmentCollection<T> segments) { if (segments == null) throw new ArgumentNullException("segments"); this.segments = segments; } /// <summary> /// Gets whether insertion is possible at the specified offset. /// </summary> public virtual bool CanInsert(int offset) { foreach (TextSegment segment in segments.FindSegmentsContaining(offset)) { if (segment.StartOffset < offset && offset < segment.EndOffset) return false; } return true; } /// <summary> /// Gets the deletable segments inside the given segment. /// </summary> public virtual IEnumerable<ISegment> GetDeletableSegments(ISegment segment) { if (segment == null) throw new ArgumentNullException("segment"); int readonlyUntil = segment.Offset; foreach (TextSegment ts in segments.FindOverlappingSegments(segment)) { int start = ts.StartOffset; int end = start + ts.Length; if (start > readonlyUntil) { yield return new SimpleSegment(readonlyUntil, start - readonlyUntil); } if (end > readonlyUntil) { readonlyUntil = end; } } int endOffset = segment.EndOffset; if (readonlyUntil < endOffset) { yield return new SimpleSegment(readonlyUntil, endOffset - readonlyUntil); } } } }