public bool Contains(MarkupRange testRange)
        {
            // Select just the inner-most text to normalize the MarkupRange before comparing it.
            testRange.SelectInner();

            int pos = BinarySearch(words.Keys, testRange.Start.PointerRaw, new MarkupPointerComparer());

            if (pos >= 0)
            {
                if (words.Values[pos].End.IsLeftOf(testRange.End))
                {
                    Debug.Fail("testRange partially overlaps with range");
                    try
                    {
                        Debug.WriteLine("testRange: [" + testRange.Text + "]");
                        Debug.WriteLine("thisRange: [" + words.Values[pos].Text + "]");
                    }
                    catch (Exception e)
                    {
                        Debug.WriteLine(e.ToString());
                    }
                }
                return(true);
            }

            pos = (~pos) - 1;

            if (pos < 0)
            {
                return(false);
            }

            if (words.Values[pos].End.IsRightOf(testRange.Start))
            {
                if (words.Values[pos].End.IsLeftOf(testRange.End))
                {
#if DEBUG
                    MarkupRange temp = testRange.Clone();
                    temp.Start.MoveToPointer(words.Values[pos].End);
                    if ((temp.Text ?? "").Trim().Length > 0)
                    {
                        Debug.Fail("testRange partially overlaps with range");
                        try
                        {
                            Debug.WriteLine("testRange: [" + testRange.Text + "]");
                            Debug.WriteLine("thisRange: [" + words.Values[pos].Text + "]");
                            Debug.WriteLine("overlap:   [" + temp.Text + "]");
                        }
                        catch (Exception e)
                        {
                            Debug.WriteLine(e.ToString());
                        }
                    }
#endif
                }
                return(true);
            }

            return(false);
        }
        public void Add(MarkupRange range)
        {
            MarkupRange newRange = range.Clone();

            newRange.Start.Cling   = false;
            newRange.End.Cling     = false;
            newRange.Start.Gravity = _POINTER_GRAVITY.POINTER_GRAVITY_Right;
            newRange.End.Gravity   = _POINTER_GRAVITY.POINTER_GRAVITY_Left;

            // Select just the inner-most text so that it is easier to compare to other MarkupRanges.
            newRange.SelectInner();

            try
            {
                words.Add(newRange.Start.PointerRaw, newRange);
            }
            catch (ArgumentException ex)
            {
                Trace.Fail(ex.ToString());
            }
        }