--- NSTextView.m Sat Nov 24 10:50:07 2001 +++ ../../../core/gui/Source/NSTextView.m Thu Dec 13 11:24:06 2001 @@ -2493,6 +2493,156 @@ [self setSelectedRange: NSMakeRange (newLocation, 0)]; } +- (void) moveToBeginningOfDocument: (id) sender +{ + if ( [_textStorage length] > 0) + { + [self setSelectedRange: NSMakeRange(0,0)]; + } +} + +- (void) moveToBeginningOfLine: (id) sender +{ + NSRange aRange; + NSRect aRect; + + // We do nothing if we are at the beginning of the text + if (_selected_range.location == 0) + { + return; + } + + aRect = [_layoutManager lineFragmentRectForGlyphAtIndex: _selected_range.location + effectiveRange: &aRange]; + + [self setSelectedRange: NSMakeRange(aRange.location,0) ]; +} + +- (void) moveToEndOfDocument: (id) sender +{ + if ( [_textStorage length] > 0) + { + [self setSelectedRange: NSMakeRange([_textStorage length],0)]; + } +} + +- (void) moveToEndOfLine: (id) sender +{ + NSRange aRange; + NSRect aRect; + + // We do nothing if we are at the end of the text + if (_selected_range.location == [_textStorage length]) + { + return; + } + + aRect = [_layoutManager lineFragmentRectForGlyphAtIndex: _selected_range.location + effectiveRange: &aRange]; + + // We are at the last line of of document, we don't need to move back from + // one character. + if ( NSMaxRange(aRange) == [_textStorage length] ) + { + [self setSelectedRange: NSMakeRange(NSMaxRange(aRange),0) ]; + } + else + { + [self setSelectedRange: NSMakeRange(NSMaxRange(aRange) - 1,0) ]; + } +} + +- (void) moveWordBackward: (id) sender +{ + unsigned int length; + + length = [_textStorage length]; + + if (_selected_range.location == 0 || length == 0) + { + return; + } + else + { + NSCharacterSet *aCharacterSet; + unsigned int i; + + aCharacterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; + + // We search for the first whitespace/newline character before our current + // caret position. + for (i = (_selected_range.location - 1); i > 0; i--) + { + if ( [aCharacterSet characterIsMember: [[self string] characterAtIndex: i]] ) + { + break; + } + } + + [self setSelectedRange: NSMakeRange (i, 0)]; + } +} + +- (void) moveWordForward: (id) sender +{ + unsigned int length; + + length = [_textStorage length]; + + if (_selected_range.location == length || length == 0) + { + return; + } + else + { + NSCharacterSet *aCharacterSet; + unsigned int i; + + aCharacterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; + + // We must verify if we are already on a whitespace/newline character. If so, + // we move forward by one character. + if ( [aCharacterSet characterIsMember: [[self string] + characterAtIndex: _selected_range.location] ] ) + { + _selected_range.location += 1; + } + + // We search for the first whitespace/newline character after our current + // caret position. + for (i = _selected_range.location; i < length; i++) + { + if ( [aCharacterSet characterIsMember: [[self string] characterAtIndex: i]] ) + { + break; + } + } + + [self setSelectedRange: NSMakeRange(i, 0)]; + } +} + +- (void) selectAll: (id) sender +{ + if ( [_textStorage length] > 0 ) + { + [self setSelectedRange: NSMakeRange(0, [_textStorage length]) ]; + } +} + +- (void) selectLine: (id) sender +{ + if ( [_textStorage length] > 0 ) + { + NSRange aRange; + NSRect aRect; + + aRect = [_layoutManager lineFragmentRectForGlyphAtIndex: _selected_range.location + effectiveRange: &aRange]; + + [self setSelectedRange: aRange]; + } +} - (BOOL) acceptsFirstResponder {