public void UpdateOffsetsAndInvalidate(IEnumerable <DocumentChangeEventArgs> changes)
        {
            foreach (DocumentChangeEventArgs change in changes)
            {
                // Update offsets of all items
                segments.UpdateOffsets(change);

                // Remove any items affected by the change
                AXmlParser.Log("Changed {0}-{1}", change.Offset, change.Offset + change.InsertionLength);
                // Removing will cause one of the ends to be set to change.Offset
                // FindSegmentsContaining includes any segments touching
                // so that conviniently takes care of the +1 byte
                var segmentsContainingOffset = segments.FindOverlappingSegments(change.Offset, change.InsertionLength);
                foreach (AXmlObject obj in segmentsContainingOffset.OfType <AXmlObject>().Where(o => o.IsCached))
                {
                    InvalidateCache(obj, false);
                }
                foreach (TouchedRange range in segmentsContainingOffset.OfType <TouchedRange>())
                {
                    AXmlParser.Log("Found that {0} dependeds on ({1}-{2})", range.TouchedByObject, range.StartOffset, range.EndOffset);
                    InvalidateCache(range.TouchedByObject, true);
                    segments.Remove(range);
                }
            }
        }