/* Copyright 2015 Hardcoded Software (http://www.hardcoded.net) This software is licensed under the "GPLv3" License as described in the "LICENSE" file, which should be included with this package. The terms are also available at http://www.gnu.org/licenses/gpl-3.0.html */ #import "HSTableView.h" #import "NSEventAdditions.h" @implementation HSTableView /* NSTableView */ - (void)keyDown:(NSEvent *)event { if (![self dispatchSpecialKeys:event]) { [super keyDown:event]; } } - (id )delegate { return (id )[super delegate]; } - (void)setDelegate:(id )aDelegate { [super setDelegate:aDelegate]; id delegate = [self delegate]; if ([delegate respondsToSelector:@selector(tableViewWasDoubleClicked:)]) { [self setTarget:[self delegate]]; [self setDoubleAction:@selector(tableViewWasDoubleClicked:)]; } } - (void)textDidEndEditing:(NSNotification *)notification { notification = [self processTextDidEndEditing:notification]; NSView *nextKeyView = [self nextKeyView]; [self setNextKeyView:nil]; [super textDidEndEditing:notification]; [self setNextKeyView:nextKeyView]; if ([self editedColumn] == -1) { if (!manualEditionStop) { id delegate = [self delegate]; if ([delegate respondsToSelector:@selector(tableViewDidEndEditing:)]) { [delegate tableViewDidEndEditing:self]; } } // We may have lost the focus [[self window] makeFirstResponder:self]; } } /* NSTextView delegate */ - (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)command { if (command == @selector(cancelOperation:)) { [self stopEditing]; // The stop editing has to happen before the cancelEdits id delegate = [self delegate]; if ([delegate respondsToSelector:@selector(tableViewCancelsEdition:)]) { [delegate tableViewCancelsEdition:self]; } return YES; } return NO; } /* Public methods */ - (void)updateSelection { NSIndexSet *selection = [[self delegate] selectedIndexes]; [self selectRowIndexes:selection byExtendingSelection:NO]; } // Calling this does not result in a tableViewDidEndEditing: call - (void)stopEditing { // If we're not editing, don't do anything because we don't want to steal focus from another view if ([self editedColumn] >= 0) { manualEditionStop = YES; [[self window] makeFirstResponder:self]; // This will abort edition manualEditionStop = NO; } } - (NSScrollView *)wrapInScrollView; { /* When programmatically creating an NSTableView, we have to wrap it in a scroll view for it to behave properly. */ NSScrollView *container = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]; [container setDocumentView:self]; [container setHasVerticalScroller:YES]; [container setHasHorizontalScroller:YES]; [container setAutohidesScrollers:YES]; return [container autorelease]; } @end