Exemple #1
0
        public int CompareTo(object obj)
        {
            if (!(obj is RichString))
            {
                return(-1);
            }

            RichString s = (RichString)obj;

            return(s.Offset - myOffset);
        }
Exemple #2
0
        /// <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");
        }
Exemple #3
0
        /// <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)));
        }
Exemple #4
0
        /// <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);
        }