All pastes #440835 Raw Edit

delegation

public text v1 · immutable
·published 2007-04-15 09:58 UTC
rendered paste body
#import <Cocoa/Cocoa.h>

@interface JNTextViewController : NSObject
{
}
- (BOOL) textView: (NSTextView *) textView doCommandBySelector: (SEL) commandSelector;
@end

@implementation JNTextViewController

- (NSRange) rangeOfCurrentLine: (NSTextView *) textView
{
   NSRange rangeBeforeCursor;
   NSRange aRange;
   
   rangeBeforeCursor.location = 0;
   rangeBeforeCursor.length = [textView selectedRange].location;
   aRange = [[textView string] rangeOfString: @"\n" options: NSBackwardsSearch range: rangeBeforeCursor];
   aRange.length = rangeBeforeCursor.length - aRange.location - 1;
   
   if(aRange.location == NSNotFound) {
      aRange.location = 0;
      aRange.length = [[textView string] length];
   } else {
      ++aRange.location;  
   }
   
   return aRange;
}

- (void) insertNewline: (NSTextView *) textView
{
   NSString *currentLine;
   NSCharacterSet *nonWhitespaceCharacterSet;
   NSRange rangeOfCurrentLine;
   int firstNonWhitespaceIndex;
   
   rangeOfCurrentLine = [self rangeOfCurrentLine: textView];
   currentLine = [[textView string] substringWithRange: rangeOfCurrentLine];
   nonWhitespaceCharacterSet = [[NSCharacterSet whitespaceCharacterSet] invertedSet];
   firstNonWhitespaceIndex = [currentLine rangeOfCharacterFromSet: nonWhitespaceCharacterSet].location;
   if(firstNonWhitespaceIndex == NSNotFound) firstNonWhitespaceIndex = [currentLine length];
   [textView insertText: @"\n"];
   [textView insertText: [currentLine substringToIndex: firstNonWhitespaceIndex]];
}

- (BOOL) textView: (NSTextView *) textView doCommandBySelector: (SEL) commandSelector
{
   if(commandSelector == @selector(insertNewline:)) {
      [self insertNewline: textView];
      return YES;
   } else {
      return NO;
   }
}

@end