/// <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); }
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()); }
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); }