PageRenderTime 7ms CodeModel.GetById 1ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 0ms

/AvalonEdit/ICSharpCode.AvalonEdit/Document/DocumentChangeEventArgs.cs

http://github.com/icsharpcode/ILSpy
C# | 123 lines | 70 code | 11 blank | 42 comment | 10 complexity | f6767280c18a08367346e1945f04877f MD5 | raw file
  1// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
  2// 
  3// Permission is hereby granted, free of charge, to any person obtaining a copy of this
  4// software and associated documentation files (the "Software"), to deal in the Software
  5// without restriction, including without limitation the rights to use, copy, modify, merge,
  6// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
  7// to whom the Software is furnished to do so, subject to the following conditions:
  8// 
  9// The above copyright notice and this permission notice shall be included in all copies or
 10// substantial portions of the Software.
 11// 
 12// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 13// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 14// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
 15// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 16// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 17// DEALINGS IN THE SOFTWARE.
 18
 19using System;
 20using ICSharpCode.AvalonEdit.Document;
 21using ICSharpCode.NRefactory.Editor;
 22
 23namespace ICSharpCode.AvalonEdit.Document
 24{
 25	/// <summary>
 26	/// Describes a change of the document text.
 27	/// This class is thread-safe.
 28	/// </summary>
 29	[Serializable]
 30	public class DocumentChangeEventArgs : TextChangeEventArgs
 31	{
 32		volatile OffsetChangeMap offsetChangeMap;
 33		
 34		/// <summary>
 35		/// Gets the OffsetChangeMap associated with this document change.
 36		/// </summary>
 37		/// <remarks>The OffsetChangeMap instance is guaranteed to be frozen and thus thread-safe.</remarks>
 38		public OffsetChangeMap OffsetChangeMap {
 39			get {
 40				OffsetChangeMap map = offsetChangeMap;
 41				if (map == null) {
 42					// create OffsetChangeMap on demand
 43					map = OffsetChangeMap.FromSingleElement(CreateSingleChangeMapEntry());
 44					offsetChangeMap = map;
 45				}
 46				return map;
 47			}
 48		}
 49		
 50		internal OffsetChangeMapEntry CreateSingleChangeMapEntry()
 51		{
 52			return new OffsetChangeMapEntry(this.Offset, this.RemovalLength, this.InsertionLength);
 53		}
 54		
 55		/// <summary>
 56		/// Gets the OffsetChangeMap, or null if the default offset map (=single replacement) is being used.
 57		/// </summary>
 58		internal OffsetChangeMap OffsetChangeMapOrNull {
 59			get {
 60				return offsetChangeMap;
 61			}
 62		}
 63		
 64		/// <summary>
 65		/// Gets the new offset where the specified offset moves after this document change.
 66		/// </summary>
 67		public override int GetNewOffset(int offset, AnchorMovementType movementType = AnchorMovementType.Default)
 68		{
 69			if (offsetChangeMap != null)
 70				return offsetChangeMap.GetNewOffset(offset, movementType);
 71			else
 72				return CreateSingleChangeMapEntry().GetNewOffset(offset, movementType);
 73		}
 74		
 75		/// <summary>
 76		/// Creates a new DocumentChangeEventArgs object.
 77		/// </summary>
 78		public DocumentChangeEventArgs(int offset, string removedText, string insertedText)
 79			: this(offset, removedText, insertedText, null)
 80		{
 81		}
 82		
 83		/// <summary>
 84		/// Creates a new DocumentChangeEventArgs object.
 85		/// </summary>
 86		public DocumentChangeEventArgs(int offset, string removedText, string insertedText, OffsetChangeMap offsetChangeMap)
 87			: base(offset, removedText, insertedText)
 88		{
 89			SetOffsetChangeMap(offsetChangeMap);
 90		}
 91		
 92		/// <summary>
 93		/// Creates a new DocumentChangeEventArgs object.
 94		/// </summary>
 95		public DocumentChangeEventArgs(int offset, ITextSource removedText, ITextSource insertedText, OffsetChangeMap offsetChangeMap)
 96			: base(offset, removedText, insertedText)
 97		{
 98			SetOffsetChangeMap(offsetChangeMap);
 99		}
100		
101		void SetOffsetChangeMap(OffsetChangeMap offsetChangeMap)
102		{
103			if (offsetChangeMap != null) {
104				if (!offsetChangeMap.IsFrozen)
105					throw new ArgumentException("The OffsetChangeMap must be frozen before it can be used in DocumentChangeEventArgs");
106				if (!offsetChangeMap.IsValidForDocumentChange(this.Offset, this.RemovalLength, this.InsertionLength))
107					throw new ArgumentException("OffsetChangeMap is not valid for this document change", "offsetChangeMap");
108				this.offsetChangeMap = offsetChangeMap;
109			}
110		}
111		
112		/// <inheritdoc/>
113		public override TextChangeEventArgs Invert()
114		{
115			OffsetChangeMap map = this.OffsetChangeMapOrNull;
116			if (map != null) {
117				map = map.Invert();
118				map.Freeze();
119			}
120			return new DocumentChangeEventArgs(this.Offset, this.InsertedText, this.RemovedText, map);
121		}
122	}
123}