Esempio n. 1
0
        /// <summary>
        /// Tries to find a selection boundary LogicalDirection.Forward of
        /// the current position.
        /// </summary>
        public bool MoveToNextWordBreak(TextNavigator navigator)
        {
            int index;

            // If the array of break positions hasn't been created and
            // populated yet, do that work now.
            if (null == breakPositions)
            {
                if (!BreakText(navigator, false, out breakPositions))
                {
                    return(false);
                }
            }

            index = breakPositions.BinarySearch(navigator);
            if (index < 0)
            {
                index = (~index);
            }
            else
            {
                index += 1;
            }

            if ((index > breakPositions.Count - 1) &&
                (0 != navigator.TextContainer.End.CompareTo((TextPosition)breakPositions[breakPositions.Count - 1])))
            {
                breakPositions = null;
                if (!BreakText(navigator, false, out breakPositions))
                {
                    return(false);
                }
                index = breakPositions.BinarySearch(navigator);
                if (index < 0)
                {
                    index = (~index);
                }
                else
                {
                    index += 1;
                }
            }

            if ((index < 0) || (index > breakPositions.Count - 1))
            {
                return(false);
            }

            navigator.MoveToPosition((TextPosition)breakPositions[index]);
            return(true);
        }
Esempio n. 2
0
        internal static string GenerateText(TextPosition begin, TextPosition end)
        {
            StringBuilder  output    = new StringBuilder();
            TextNavigator  navigator = begin.CreateNavigator();
            TextSymbolType type;

            char[] buffer = new char[1];
            char   ch;

            if (begin.TextContainer != end.TextContainer)
            {
                throw new ArgumentException(SR.Get(SRID.BeginEndTextContainerMismatch));
            }

            navigator.MoveToPosition(begin);
            type = navigator.GetSymbolType(LogicalDirection.Forward);
            while (navigator < end)
            {
                switch (type)
                {
                case TextSymbolType.Character:
                    navigator.GetText(LogicalDirection.Forward, 1, navigator.TextContainer.End, buffer, 0);
                    ch = buffer[0];
                    output.Append(ch);
                    break;

                case TextSymbolType.EmbeddedObject:
                    ch = '\xF8FF';          // Private use Unicode.
                    output.Append(ch);
                    break;

                case TextSymbolType.ElementStart:
                case TextSymbolType.ElementEnd:
                    if (IsBreakingSymbol(navigator, LogicalDirection.Forward))
                    {
                        output.Append(" ");
                    }
                    break;
                }

                navigator.MoveByDistance(1);
                type = navigator.GetSymbolType(LogicalDirection.Forward);
            }

            return(output.ToString());
        }
Esempio n. 3
0
        internal bool BreakText(TextPosition position, bool isSpelling, out ArrayList positionList)
        {
            TextNavigator start      = position.CreateNavigator();
            TextNavigator end        = position.CreateNavigator();
            TextNavigator checkLeft  = position.CreateNavigator();
            TextNavigator checkRight = position.CreateNavigator();
            bool          leftEdge   = false;
            bool          rightEdge  = false;
            int           distance   = 32;
            int           index;
            bool          foundBreaks = false;

            positionList = null;

            while (!(leftEdge && rightEdge))
            {
                if (!leftEdge)
                {
                    if (start.TextContainer.Start.GetDistanceTo(start) > distance)
                    {
                        start.MoveByDistance(-(distance));
                    }
                    else
                    {
                        start.MoveToPosition(start.TextContainer.Start);
                        leftEdge = true;
                    }

                    MoveNaviForward(start);
                    MoveNaviBackward(start);
                }

                if (!rightEdge)
                {
                    if (end.GetDistanceTo(end.TextContainer.End) > distance)
                    {
                        end.MoveByDistance(distance);
                    }
                    else
                    {
                        end.MoveToPosition(end.TextContainer.End);
                        rightEdge = true;
                    }

                    MoveNaviBackward(end);
                    MoveNaviForward(end);
                }

                if (BreakText(start, end, isSpelling, out positionList))
                {
                    foundBreaks = true;
                }
                else
                {
                    continue;
                }

                if (!leftEdge)
                {
                    index = positionList.BinarySearch(checkLeft);
                    if (index < 0)
                    {
                        index = (~index);
                    }
                    index -= 1;

                    leftEdge = (index >= 0);
                }

                if (!rightEdge)
                {
                    index = positionList.BinarySearch(checkRight);
                    if (index < 0)
                    {
                        index = (~index);
                    }
                    else
                    {
                        index += 1;
                    }

                    rightEdge = (index < positionList.Count);
                }
            }
            return(foundBreaks);
        }