public virtual SyntaxHighlightSegmentList FindAllSegments(string text, bool cached)
 {
     if (AllSegments == null || !cached)
     {
         AllSegments = FindAllSegments(text);
     }
     return(AllSegments);
 }
        public virtual SyntaxHighlightSegmentList FindAllSegments(string text)
        {
            SyntaxHighlightSegmentList res = new SyntaxHighlightSegmentList();

            foreach (string def in Definition)
            {
                Regex           regex   = new Regex(def, Options);
                MatchCollection matches = regex.Matches(text);
                foreach (Match match in matches)
                {
                    res.Add(new SyntaxHighlightSegment(match.Index, match.Index + match.Length));
                }
            }
            res.RemoveOverlappingSegments();
            return(res);
        }
        /// <summary>
        /// Remove segments from this list that are overlapped by another segments in the same list
        /// </summary>
        public virtual void RemoveOverlappingSegments()
        {
            SyntaxHighlightSegmentList res = new SyntaxHighlightSegmentList();

            res.AddRange(this);
            for (int i = res.Count - 1; i >= 0; i--)
            {
                for (int j = 0; j < i; j++)
                {
                    if (this[j].SuperiorTo(res[i]))
                    {
                        res.RemoveAt(i);
                        break;
                    }
                }
            }
            this.Clear();
            this.AddRange(res);
        }
        /// <summary>
        /// Remove segments from this list that are overlapped by those in masterList
        /// </summary>
        /// <param name="masterList"></param>
        public virtual void RemoveOverlappingSegments(SyntaxHighlightSegmentList masterList)
        {
            SyntaxHighlightSegmentList res = new SyntaxHighlightSegmentList();

            foreach (SyntaxHighlightSegment thisSegment in this)
            {
                bool doAdd = true;
                foreach (SyntaxHighlightSegment masterSegment in masterList)
                {
                    if (masterSegment.SuperiorTo(thisSegment))
                    {
                        doAdd = false;
                        break;
                    }
                }
                if (doAdd)
                {
                    res.Add(thisSegment);
                }
            }
            this.Clear();
            this.AddRange(res);
        }