diff options
| author | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2019-04-08 13:49:55 +0300 |
|---|---|---|
| committer | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2019-04-08 13:49:55 +0300 |
| commit | fc8a05358a92cc3c77c5f1e30d536807ef0614fd (patch) | |
| tree | c65f696ebd60f3790145721307c255e5a339923f /Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Document/DocumentChangeEventArgs.cs | |
| parent | b4a71931ea52636c6b36376aa9d71697ccf73524 (diff) | |
| download | Tango-fc8a05358a92cc3c77c5f1e30d536807ef0614fd.tar.gz Tango-fc8a05358a92cc3c77c5f1e30d536807ef0614fd.zip | |
were added scripting projects
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Document/DocumentChangeEventArgs.cs')
| -rw-r--r-- | Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Document/DocumentChangeEventArgs.cs | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Document/DocumentChangeEventArgs.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Document/DocumentChangeEventArgs.cs new file mode 100644 index 000000000..17307680a --- /dev/null +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Document/DocumentChangeEventArgs.cs @@ -0,0 +1,131 @@ +// 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 Tango.Scripting.Editors.Utils; +using System; + +namespace Tango.Scripting.Editors.Document +{ + /// <summary> + /// Describes a change of the document text. + /// This class is thread-safe. + /// </summary> + [Serializable] + public class DocumentChangeEventArgs : EventArgs + { + /// <summary> + /// The offset at which the change occurs. + /// </summary> + public int Offset { get; private set; } + + /// <summary> + /// The text that was removed. + /// </summary> + public string RemovedText { get; private set; } + + /// <summary> + /// The number of characters removed. + /// </summary> + public int RemovalLength { + get { return RemovedText.Length; } + } + + /// <summary> + /// The text that was inserted. + /// </summary> + public string InsertedText { get; private set; } + + /// <summary> + /// The number of characters inserted. + /// </summary> + public int InsertionLength { + get { return InsertedText.Length; } + } + + volatile OffsetChangeMap offsetChangeMap; + + /// <summary> + /// Gets the OffsetChangeMap associated with this document change. + /// </summary> + /// <remarks>The OffsetChangeMap instance is guaranteed to be frozen and thus thread-safe.</remarks> + public OffsetChangeMap OffsetChangeMap { + get { + OffsetChangeMap map = offsetChangeMap; + if (map == null) { + // create OffsetChangeMap on demand + map = OffsetChangeMap.FromSingleElement(CreateSingleChangeMapEntry()); + offsetChangeMap = map; + } + return map; + } + } + + internal OffsetChangeMapEntry CreateSingleChangeMapEntry() + { + return new OffsetChangeMapEntry(this.Offset, this.RemovalLength, this.InsertionLength); + } + + /// <summary> + /// Gets the OffsetChangeMap, or null if the default offset map (=single replacement) is being used. + /// </summary> + internal OffsetChangeMap OffsetChangeMapOrNull { + get { + return offsetChangeMap; + } + } + + /// <summary> + /// Gets the new offset where the specified offset moves after this document change. + /// </summary> + public int GetNewOffset(int offset, AnchorMovementType movementType) + { + if (offsetChangeMap != null) + return offsetChangeMap.GetNewOffset(offset, movementType); + else + return CreateSingleChangeMapEntry().GetNewOffset(offset, movementType); + } + + /// <summary> + /// Creates a new DocumentChangeEventArgs object. + /// </summary> + public DocumentChangeEventArgs(int offset, string removedText, string insertedText) + : this(offset, removedText, insertedText, null) + { + } + + /// <summary> + /// Creates a new DocumentChangeEventArgs object. + /// </summary> + public DocumentChangeEventArgs(int offset, string removedText, string insertedText, OffsetChangeMap offsetChangeMap) + { + ThrowUtil.CheckNotNegative(offset, "offset"); + ThrowUtil.CheckNotNull(removedText, "removedText"); + ThrowUtil.CheckNotNull(insertedText, "insertedText"); + + this.Offset = offset; + this.RemovedText = removedText; + this.InsertedText = insertedText; + + if (offsetChangeMap != null) { + if (!offsetChangeMap.IsFrozen) + throw new ArgumentException("The OffsetChangeMap must be frozen before it can be used in DocumentChangeEventArgs"); + if (!offsetChangeMap.IsValidForDocumentChange(offset, removedText.Length, insertedText.Length)) + throw new ArgumentException("OffsetChangeMap is not valid for this document change", "offsetChangeMap"); + this.offsetChangeMap = offsetChangeMap; + } + } + + /// <summary> + /// Creates DocumentChangeEventArgs for the reverse change. + /// </summary> + public DocumentChangeEventArgs Invert() + { + OffsetChangeMap map = this.OffsetChangeMapOrNull; + if (map != null) { + map = map.Invert(); + map.Freeze(); + } + return new DocumentChangeEventArgs(this.Offset, this.InsertedText, this.RemovedText, map); + } + } +} |
