public int CompareTo(object obj) { if (!(obj is RichString)) { return(-1); } RichString s = (RichString)obj; return(s.Offset - myOffset); }
/// <summary> /// Gets starting offset of a given part in global coordinates /// </summary> private int GetStartingOffset(RichString part) { int currentOffset = 0; foreach (RichString s in myParts) { if (s == part) { return(currentOffset); } currentOffset += s.Length; } throw new ArgumentException("There's no such part in this text"); }
/// <summary> /// Gets array of parts which lie in the specified range /// </summary> private RichString[] GetStringsInRange(int startOffset, int length) { if (startOffset < 0) { startOffset = 0; } if (startOffset + length > myString.Length) { length = myString.Length - startOffset; } ArrayList strings = new ArrayList(); int offset = startOffset; int endOffset = startOffset + length; while (offset < endOffset) { RichString s = GetPartByOffset(offset); Debug.Assert(s != null, "We've fixed the offsets so we should always find the corresponding string"); int startingOffset = GetStartingOffset(s); int localStartingOffset = offset - startingOffset; if (localStartingOffset > 0) { s = BreakString(s, localStartingOffset, true)[1]; localStartingOffset = 0; } int localEndingOffset = localStartingOffset + length; if (localEndingOffset < s.Length) { s = BreakString(s, localEndingOffset, true)[0]; localEndingOffset = s.Length; } strings.Add(s); offset += s.Length; } return((RichString[])strings.ToArray(typeof(RichString))); }
/// <summary> /// Breaks a part into two parts at given offset /// </summary> private RichString[] BreakString(RichString s, int offset, bool insertParts) { if (offset >= s.Length) { return(null); } RichString[] parts = new RichString[2]; parts[0] = new RichString(s.Offset, offset, s.Style, this); parts[1] = new RichString(s.Offset + offset, s.Length - offset, s.Style, this); if (insertParts) { int index = myParts.IndexOf(s); myParts.Remove(s); myParts.Insert(index, parts[0]); myParts.Insert(index + 1, parts[1]); } return(parts); }