public override TextRange GetNextWord() { TextExtent currentWord = GetTextExtent(CurrentPosition); if (currentWord.Span.End < _textBuffer.AdvancedTextBuffer.CurrentSnapshot.Length) { // If the current point is at the end of the line, look for the next word on the next line if ((CurrentPosition == EndOfLine) && (CurrentPosition != _textBuffer.AdvancedTextBuffer.CurrentSnapshot.Length)) { TextPoint textPoint = Clone(); textPoint.MoveToBeginningOfNextLine(); textPoint.MoveTo(textPoint.StartOfLine); TextExtent wordOnNextLine = GetTextExtent(textPoint.CurrentPosition); if (wordOnNextLine.IsSignificant) { return(textPoint.GetCurrentWord()); } else if (wordOnNextLine.Span.End >= textPoint.EndOfLine) { return(textPoint.GetTextRange(textPoint.EndOfLine)); } return(textPoint.GetNextWord()); } // By default, VS stops at line breaks when determing word // boundaries. else if (ShouldStopAtEndOfLine(currentWord.Span.End) || IsCurrentWordABlankLine(currentWord)) { return(GetTextRange(currentWord.Span.End)); } TextExtent nextWord = GetTextExtent(currentWord.Span.End); if (!nextWord.IsSignificant) { nextWord = GetTextExtent(nextWord.Span.End); } int start = nextWord.Span.Start; int end = nextWord.Span.End; // The text structure navigator can return a word with whitespace attached at the end. // Handle that case here. start = Math.Max(start, currentWord.Span.End); TextPoint startPoint = Clone(); TextPoint endPoint = Clone(); startPoint.MoveTo(start); endPoint.MoveTo(end); return(_bufferPrimitivesFactory.CreateTextRange(_textBuffer, startPoint, endPoint)); } return(_bufferPrimitivesFactory.CreateTextRange(_textBuffer, TextBuffer.GetEndPoint(), TextBuffer.GetEndPoint())); }
public override bool ToggleCase() { if (IsEmpty) { TextPoint nextPoint = _startPoint.Clone(); nextPoint.MoveToNextCharacter(); TextRange nextCharacter = _startPoint.GetTextRange(nextPoint); string nextCharacterString = nextCharacter.GetText(); if (char.IsUpper(nextCharacterString, 0)) { nextCharacterString = nextCharacterString.ToLower(CultureInfo.CurrentCulture); } else { nextCharacterString = nextCharacterString.ToUpper(CultureInfo.CurrentCulture); } return(nextCharacter.ReplaceText(nextCharacterString)); } else { int startPosition = _startPoint.CurrentPosition; using (ITextEdit textEdit = TextBuffer.AdvancedTextBuffer.CreateEdit()) { for (int i = _startPoint.CurrentPosition; i < _endPoint.CurrentPosition; i++) { char newChar = textEdit.Snapshot[i]; if (char.IsUpper(newChar)) { newChar = char.ToLower(newChar, CultureInfo.CurrentCulture); } else { newChar = char.ToUpper(newChar, CultureInfo.CurrentCulture); } if (!textEdit.Replace(i, 1, newChar.ToString(CultureInfo.CurrentCulture))) { textEdit.Cancel(); return(false); // break out early if any edit fails to reduce the time of the failure case } } textEdit.Apply(); if (textEdit.Canceled) { return(false); } } _startPoint.MoveTo(startPosition); } return(true); }
public override TextRange GetTextRange(TextPoint otherPoint) { return(_bufferPoint.GetTextRange(otherPoint)); }