diff options
Diffstat (limited to 'Liaison/LiTableView.m')
-rw-r--r-- | Liaison/LiTableView.m | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/Liaison/LiTableView.m b/Liaison/LiTableView.m new file mode 100644 index 0000000..9fa66f6 --- /dev/null +++ b/Liaison/LiTableView.m @@ -0,0 +1,166 @@ +#import "LiTableView.h" + +@implementation LiTableView ++ (void)load +{ + [self poseAsClass: [NSTableView class]]; +} + +- methodSignatureForSelector: (SEL)aSelector +{ + id signature; + + signature = [super methodSignatureForSelector: aSelector]; + if (signature == nil) { + NSString *selString; + + selString = NSStringFromSelector(aSelector); + + if ([selString isEqualToString: @"validateMenuItem:"]) { + signature = [[self delegate] methodSignatureForSelector: @selector(validateMenuItem:)]; + } else if ([selString isEqualToString: @"delete:"]) { + if ([self isKindOfClass: [NSOutlineView class]]) + signature = [[self dataSource] methodSignatureForSelector: @selector(deleteSelectedRowsInOutlineView:)]; + else + signature = [[self dataSource] methodSignatureForSelector: + @selector(deleteSelectedRowsInTableView:)]; + } else if ([[self delegate] respondsToSelector: aSelector]) + signature = [[self delegate] methodSignatureForSelector: aSelector]; + } + return signature; +} + +- (void)forwardInvocation: (NSInvocation *)anInvocation +{ + NSString *selString; + + selString = NSStringFromSelector([anInvocation selector]); + if ([selString isEqualToString: @"validateMenuItem:"]) { + [anInvocation setTarget: [self delegate]]; + [anInvocation invoke]; + } else if ([selString isEqualToString: @"delete:"]) { + [anInvocation setTarget: [self dataSource]]; + if ([self isKindOfClass: [NSOutlineView class]]) { + [anInvocation setSelector: @selector(deleteSelectedRowsInOutlineView:)]; + } else { + [anInvocation setSelector: @selector(deleteSelectedRowsInTableView:)]; + } + + [anInvocation setArgument: &self atIndex: 2]; + [anInvocation invoke]; + } else if ([[self delegate] respondsToSelector: [anInvocation selector]]) { + [anInvocation setTarget: [self delegate]]; + [anInvocation invoke]; + } else + [super forwardInvocation: anInvocation]; +} + +- (BOOL)respondsToSelector: (SEL)aSelector +{ + NSString *selString; + + if ([super respondsToSelector: aSelector]) + return YES; + + selString = NSStringFromSelector(aSelector); + if ([selString isEqualToString: @"validateMenuItem:"]) { + return [[self delegate] respondsToSelector: aSelector]; + } else if ([selString isEqualToString: @"delete:"]) { + if ([self isKindOfClass: [NSOutlineView class]]) { + return [[self dataSource] respondsToSelector: + @selector(deleteSelectedRowsInOutlineView:)]; + } else { + return [[self dataSource] respondsToSelector: @selector(deleteSelectedRowsInTableView:)]; + } + } + return [[self delegate] respondsToSelector: aSelector]; +} + +- (void)keyDown: (NSEvent *)theEvent +{ + NSString *keyString; + unichar keyChar; + + keyString = [theEvent charactersIgnoringModifiers]; + keyChar = [keyString characterAtIndex: 0]; + switch (keyChar) { + case 0177: // Delete Key + case NSDeleteFunctionKey: + case NSDeleteCharFunctionKey: { + SEL selector; + + if ([self isKindOfClass: [NSOutlineView class]]) { + selector = @selector(deleteSelectedRowsInOutlineView:); + } else { + selector = @selector(deleteSelectedRowsInTableView:); + } + if ([self selectedRow] >= 0 && + [[self dataSource] respondsToSelector: selector]) { + [[self dataSource] performSelector: selector + withObject: self]; + } + break; + } default: + [super keyDown: theEvent]; + } +} + +- (BOOL)becomeFirstResponder +{ + BOOL rc; + + rc = [super becomeFirstResponder]; + if (rc == YES) { + SEL selector; + + if ([self isKindOfClass: [NSOutlineView class]]) + selector = @selector(outlineViewDidBecomeFirstResponder:); + else + selector = @selector(tableViewDidBecomeFirstResponder:); + + if ([[self delegate] respondsToSelector: selector]) + [[self delegate] performSelector: selector + withObject: self]; + } + return rc; +} + +- (void)mouseDown: (NSEvent *)theEvent +{ + if ([[self delegate] respondsToSelector: @selector(mouseDownEvent:)]) + [[self delegate] performSelector: @selector(mouseDownEvent:) + withObject: theEvent]; + [super mouseDown: theEvent]; +} + +- (unsigned int)draggingSourceOperationMaskForLocal: (BOOL)isLocal +{ + if (isLocal) + return NSDragOperationPrivate; + else + return NSDragOperationCopy | NSDragOperationLink | NSDragOperationGeneric; +} + +- (void)textDidEndEditing: (NSNotification *)aNotification +{ + int keyPressed; + + keyPressed = [[[aNotification userInfo] objectForKey: @"NSTextMovement"] intValue]; + if (keyPressed == NSReturnTextMovement) { + NSMutableDictionary *newUserInfo; + NSNotification *newNotification; + + newUserInfo = [NSMutableDictionary dictionaryWithDictionary: + [aNotification userInfo]]; + [newUserInfo setObject: [NSNumber numberWithInt:0] + forKey: @"NSTextMovement"]; + newNotification = [NSNotification notificationWithName: [aNotification name] + object: [aNotification object] + userInfo: newUserInfo]; + [super textDidEndEditing: newNotification]; + + [[self window] makeFirstResponder: self]; + } else + [super textDidEndEditing: aNotification]; +} +@end
\ No newline at end of file |