Revision: 2689 http://skim-app.svn.sourceforge.net/skim-app/?rev=2689&view=rev Author: hofman Date: 2007-08-20 11:21:29 -0700 (Mon, 20 Aug 2007)
Log Message: ----------- Implement undo, reordering, delete for bookmarks. Use custom data objects for bookmarks. Modified Paths: -------------- trunk/Dutch.lproj/BookmarksWindow.nib/classes.nib trunk/Dutch.lproj/BookmarksWindow.nib/keyedobjects.nib trunk/English.lproj/BookmarksWindow.nib/classes.nib trunk/English.lproj/BookmarksWindow.nib/keyedobjects.nib trunk/French.lproj/BookmarksWindow.nib/classes.nib trunk/French.lproj/BookmarksWindow.nib/keyedobjects.nib trunk/Italian.lproj/BookmarksWindow.nib/classes.nib trunk/Italian.lproj/BookmarksWindow.nib/keyedobjects.nib trunk/NSTableView_SKExtensions.h trunk/NSTableView_SKExtensions.m trunk/SKApplicationController.m trunk/SKBookmarkController.h trunk/SKBookmarkController.m trunk/SKThumbnailTableView.h trunk/SKThumbnailTableView.m Modified: trunk/Dutch.lproj/BookmarksWindow.nib/classes.nib =================================================================== --- trunk/Dutch.lproj/BookmarksWindow.nib/classes.nib 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/Dutch.lproj/BookmarksWindow.nib/classes.nib 2007-08-20 18:21:29 UTC (rev 2689) @@ -5,6 +5,7 @@ { CLASS = SKBookmarkController; LANGUAGE = ObjC; + OUTLETS = {tableView = NSTableView; }; SUPERCLASS = NSWindowController; } ); Modified: trunk/Dutch.lproj/BookmarksWindow.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/English.lproj/BookmarksWindow.nib/classes.nib =================================================================== --- trunk/English.lproj/BookmarksWindow.nib/classes.nib 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/English.lproj/BookmarksWindow.nib/classes.nib 2007-08-20 18:21:29 UTC (rev 2689) @@ -5,6 +5,7 @@ { CLASS = SKBookmarkController; LANGUAGE = ObjC; + OUTLETS = {tableView = NSTableView; }; SUPERCLASS = NSWindowController; } ); Modified: trunk/English.lproj/BookmarksWindow.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/French.lproj/BookmarksWindow.nib/classes.nib =================================================================== --- trunk/French.lproj/BookmarksWindow.nib/classes.nib 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/French.lproj/BookmarksWindow.nib/classes.nib 2007-08-20 18:21:29 UTC (rev 2689) @@ -5,6 +5,7 @@ { CLASS = SKBookmarkController; LANGUAGE = ObjC; + OUTLETS = {tableView = NSTableView; }; SUPERCLASS = NSWindowController; } ); Modified: trunk/French.lproj/BookmarksWindow.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/Italian.lproj/BookmarksWindow.nib/classes.nib =================================================================== --- trunk/Italian.lproj/BookmarksWindow.nib/classes.nib 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/Italian.lproj/BookmarksWindow.nib/classes.nib 2007-08-20 18:21:29 UTC (rev 2689) @@ -5,6 +5,7 @@ { CLASS = SKBookmarkController; LANGUAGE = ObjC; + OUTLETS = {tableView = NSTableView; }; SUPERCLASS = NSWindowController; } ); Modified: trunk/Italian.lproj/BookmarksWindow.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/NSTableView_SKExtensions.h =================================================================== --- trunk/NSTableView_SKExtensions.h 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/NSTableView_SKExtensions.h 2007-08-20 18:21:29 UTC (rev 2689) @@ -40,5 +40,12 @@ @interface NSTableView (SKExtensions) +- (BOOL)canDelete; +- (void)delete:(id)sender; [EMAIL PROTECTED] + [EMAIL PROTECTED] NSObject (NSTableViewSKExtendedDelegate) +- (void)tableView:(NSTableView *)aTableView deleteRowsWithIndexes:(NSIndexSet *)rowIndexes; +- (BOOL)tableView:(NSTableView *)aTableView canDeleteRowsWithIndexes:(NSIndexSet *)rowIndexes; @end Modified: trunk/NSTableView_SKExtensions.m =================================================================== --- trunk/NSTableView_SKExtensions.m 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/NSTableView_SKExtensions.m 2007-08-20 18:21:29 UTC (rev 2689) @@ -63,7 +63,9 @@ unichar eventChar = [characters length] > 0 ? [characters characterAtIndex:0] : 0; unsigned modifierFlags = [theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask; - if (eventChar == NSHomeFunctionKey && (modifierFlags & ~NSFunctionKeyMask) == 0) + if ((eventChar == NSDeleteCharacter || eventChar == NSDeleteFunctionKey) && modifierFlags == 0 && [self canDelete]) + [self delete:self]; + else if (eventChar == NSHomeFunctionKey && (modifierFlags & ~NSFunctionKeyMask) == 0) [self scrollToBeginningOfDocument:nil]; else if (eventChar == NSEndFunctionKey && (modifierFlags & ~NSFunctionKeyMask) == 0) [self scrollToEndOfDocument:nil]; @@ -71,4 +73,25 @@ originalKeyDown(self, _cmd, theEvent); } +- (BOOL)canDelete { + NSIndexSet *indexes = [self selectedRowIndexes]; + return [indexes count] && + [[self delegate] respondsToSelector:@selector(tableView:canDeleteRowsWithIndexes:)] && + [[self delegate] respondsToSelector:@selector(tableView:deleteRowsWithIndexes:)] && + [[self delegate] tableView:self canDeleteRowsWithIndexes:indexes]; +} + +- (void)delete:(id)sender { + if ([self canDelete]) + [[self delegate] tableView:self deleteRowsWithIndexes:[self selectedRowIndexes]]; + else + NSBeep(); +} + +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { + if ([menuItem action] == @selector(delete:)) + return [self canDelete]; + return YES; +} + @end Modified: trunk/SKApplicationController.m =================================================================== --- trunk/SKApplicationController.m 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/SKApplicationController.m 2007-08-20 18:21:29 UTC (rev 2689) @@ -212,11 +212,8 @@ } - (IBAction)openBookmark:(id)sender { - int i = [sender tag]; - NSArray *bookmarks = [[SKBookmarkController sharedBookmarkController] bookmarks]; - NSDictionary *bm = [bookmarks objectAtIndex:i]; - - [[SKBookmarkController sharedBookmarkController] openBookmarks:[NSArray arrayWithObjects:bm, nil]]; + SKBookmark *bookmark = [sender representedObject]; + [[SKBookmarkController sharedBookmarkController] openBookmarks:[NSArray arrayWithObjects:bookmark, nil]]; } #pragma mark Support @@ -229,10 +226,10 @@ if (iMax > 0) [menu addItem:[NSMenuItem separatorItem]]; for (i = 0; i < iMax; i++) { - NSDictionary *bm = [bookmarks objectAtIndex:i]; - NSMenuItem *item = [menu addItemWithTitle:[bm objectForKey:@"label"] action:@selector(openBookmark:) keyEquivalent:@""]; + SKBookmark *bm = [bookmarks objectAtIndex:i]; + NSMenuItem *item = [menu addItemWithTitle:[bm label] action:@selector(openBookmark:) keyEquivalent:@""]; [item setTarget:self]; - [item setTag:i]; + [item setRepresentedObject:bm]; } } Modified: trunk/SKBookmarkController.h =================================================================== --- trunk/SKBookmarkController.h 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/SKBookmarkController.h 2007-08-20 18:21:29 UTC (rev 2689) @@ -40,8 +40,10 @@ @interface SKBookmarkController : NSWindowController { + IBOutlet NSTableView *tableView; NSMutableArray *bookmarks; NSMutableArray *recentDocuments; + NSUndoManager *undoManager; } + (id)sharedBookmarkController; @@ -55,6 +57,7 @@ - (void)addBookmarkForPath:(NSString *)path pageIndex:(unsigned)pageIndex label:(NSString *)label; - (void)saveBookmarks; +- (void)handleBookmarkChangedNotification:(NSNotification *)notification; - (NSString *)bookmarksFilePath; - (void)openBookmarks:(NSArray *)items; @@ -63,10 +66,30 @@ - (unsigned int)pageIndexForRecentDocumentAtPath:(NSString *)path; - (NSArray *)snapshotsAtPath:(NSString *)path; [EMAIL PROTECTED] +- (NSUndoManager *)undoManager; [EMAIL PROTECTED] SKPageIndexTransformer : NSValueTransformer @end [EMAIL PROTECTED] SKAliasDataTransformer : NSValueTransformer + [EMAIL PROTECTED] SKBookmark : NSObject <NSCopying> { + NSString *path; + NSData *aliasData; + NSString *label; + unsigned int pageIndex; +} + +- (id)initWithPath:(NSString *)aPath aliasData:(NSData *)aData pageIndex:(unsigned)aPageIndex label:(NSString *)aLabel; +- (id)initWithPath:(NSString *)aPath pageIndex:(unsigned)aPageIndex label:(NSString *)aLabel; +- (id)initWithDictionary:(NSDictionary *)dictionary; + +- (NSDictionary *)dictionaryValue; + +- (NSString *)path; +- (NSData *)aliasData; +- (NSString *)resolvedPath; +- (unsigned int)pageIndex; +- (NSNumber *)pageNumber; +- (NSString *)label; +- (void)setLabel:(NSString *)newLabel; + @end Modified: trunk/SKBookmarkController.m =================================================================== --- trunk/SKBookmarkController.m 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/SKBookmarkController.m 2007-08-20 18:21:29 UTC (rev 2689) @@ -41,15 +41,16 @@ #import "SKDocument.h" #import "SKMainWindowController.h" #import "Files_SKExtensions.h" +#import "NSTableView_SKExtensions.h" +static NSString *SKBookmarkRowsPboardType = @"SKBookmarkRowsPboardType"; +static NSString *SKBookmarkChangedNotification = @"SKBookmarkChangedNotification"; + @implementation SKBookmarkController static unsigned int maxRecentDocumentsCount = 0; + (void)initialize { - [NSValueTransformer setValueTransformer:[[[SKPageIndexTransformer alloc] init] autorelease] forName:@"SKPageIndexTransformer"]; - [NSValueTransformer setValueTransformer:[[[SKAliasDataTransformer alloc] init] autorelease] forName:@"SKAliasDataTransformer"]; - maxRecentDocumentsCount = [[NSUserDefaults standardUserDefaults] integerForKey:@"SKMaximumDocumentPageHistoryCount"]; if (maxRecentDocumentsCount == 0) maxRecentDocumentsCount = 50; @@ -80,10 +81,22 @@ NSLog(@"Error deserializing: %@", error); [error release]; } else if ([plist isKindOfClass:[NSDictionary class]]) { - [bookmarks addObjectsFromArray:[plist objectForKey:@"bookmarks"]]; [recentDocuments addObjectsFromArray:[plist objectForKey:@"recentDocuments"]]; + NSEnumerator *dictEnum = [[plist objectForKey:@"bookmarks"] objectEnumerator]; + NSDictionary *dict; + + while (dict = [dictEnum nextObject]) { + SKBookmark *bookmark = [[SKBookmark alloc] initWithDictionary:dict]; + [bookmarks addObject:bookmark]; + [bookmark release]; + } } } + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleBookmarkChangedNotification:) + name:SKBookmarkChangedNotification + object:nil]; } return self; } @@ -96,11 +109,19 @@ - (NSString *)windowNibName { return @"BookmarksWindow"; } +- (void)windowDidLoad { + [self setWindowFrameAutosaveName:@"SKBookmarksWindow"]; + [tableView registerForDraggedTypes:[NSArray arrayWithObjects:SKBookmarkRowsPboardType, nil]]; +} + +#pragma mark Bookmarks + - (NSArray *)bookmarks { return bookmarks; } - (void)setBookmarks:(NSArray *)newBookmarks { + [[[self undoManager] prepareWithInvocationTarget:self] setBookmarks:[[bookmarks copy] autorelease]]; return [bookmarks setArray:newBookmarks]; } @@ -113,11 +134,13 @@ } - (void)insertObject:(id)obj inBookmarksAtIndex:(unsigned)index { + [[[self undoManager] prepareWithInvocationTarget:self] removeObjectFromBookmarksAtIndex:index]; [bookmarks insertObject:obj atIndex:index]; [self saveBookmarks]; } - (void)removeObjectFromBookmarksAtIndex:(unsigned)index { + [[[self undoManager] prepareWithInvocationTarget:self] insertObject:[bookmarks objectAtIndex:index] inBookmarksAtIndex:index]; [bookmarks removeObjectAtIndex:index]; [self saveBookmarks]; } @@ -125,11 +148,13 @@ - (void)addBookmarkForPath:(NSString *)path pageIndex:(unsigned)pageIndex label:(NSString *)label { if (path == nil) return; - NSData *data = [[BDAlias aliasWithPath:path] aliasData]; - NSMutableDictionary *bm = [NSMutableDictionary dictionaryWithObjectsAndKeys:path, @"path", label, @"label", [NSNumber numberWithUnsignedInt:pageIndex], @"pageIndex", data, @"_BDAlias", nil]; - [[self mutableArrayValueForKey:@"bookmarks"] addObject:bm]; + SKBookmark *bookmark = [[SKBookmark alloc] initWithPath:path pageIndex:pageIndex label:label]; + [[self mutableArrayValueForKey:@"bookmarks"] addObject:bookmark]; + [bookmark release]; } +#pragma mark Recent Documents + - (NSArray *)recentDocuments { return recentDocuments; } @@ -182,7 +207,7 @@ } - (void)saveBookmarks { - NSDictionary *bookmarksDictionary = [NSDictionary dictionaryWithObjectsAndKeys:bookmarks, @"bookmarks", recentDocuments, @"recentDocuments", nil]; + NSDictionary *bookmarksDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[bookmarks valueForKey:@"dictionaryValue"], @"bookmarks", recentDocuments, @"recentDocuments", nil]; NSString *error = nil; NSPropertyListFormat format = NSPropertyListXMLFormat_v1_0; NSData *data = [NSPropertyListSerialization dataFromPropertyList:bookmarksDictionary format:format errorDescription:&error]; @@ -195,6 +220,10 @@ } } +- (void)handleBookmarkChangedNotification:(NSNotification *)notification { + [self saveBookmarks]; +} + - (NSString *)bookmarksFilePath { static NSString *bookmarksPath = nil; @@ -225,24 +254,19 @@ return bookmarksPath; } -- (void)controlTextDidEndEditing:(NSNotification *)notification { - [self saveBookmarks]; -} - - (void)openBookmarks:(NSArray *)items { NSEnumerator *bmEnum = [items objectEnumerator]; - NSDictionary *bm; + SKBookmark *bm; while (bm = [bmEnum nextObject]) { id document = nil; - NSURL *fileURL = [[BDAlias aliasWithData:[bm objectForKey:@"_BDAlias"]] fileURL]; + NSString *path = [bm resolvedPath]; + NSURL *fileURL = path ? [NSURL fileURLWithPath:path] : nil; NSError *error; - if (fileURL == nil && [bm objectForKey:@"path"]) - fileURL = [NSURL fileURLWithPath:[bm objectForKey:@"path"]]; if (fileURL && NO == SKFileIsInTrash(fileURL)) { if (document = [[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:fileURL display:YES error:&error]) { - [[document mainWindowController] setPageNumber:[[bm objectForKey:@"pageIndex"] unsignedIntValue] + 1]; + [[document mainWindowController] setPageNumber:[bm pageIndex] + 1]; } else { [NSApp presentError:error]; } @@ -250,41 +274,157 @@ } } [EMAIL PROTECTED] +#pragma mark Undo support +- (NSUndoManager *)undoManager { + if(undoManager == nil) + undoManager = [[NSUndoManager alloc] init]; + return undoManager; +} [EMAIL PROTECTED] SKPageIndexTransformer +- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)sender { + return [self undoManager]; +} -+ (Class)transformedValueClass { - return [NSNumber class]; +#pragma mark NSTableView datasource methods + +- (int)numberOfRowsInTableView:(NSTableView *)tv { return 0; } + +- (id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row { return nil; } + +- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard { + [pboard declareTypes:[NSArray arrayWithObjects:SKBookmarkRowsPboardType, nil] owner:nil]; + [pboard setPropertyList:[NSNumber numberWithUnsignedInt:[rowIndexes firstIndex]] forType:SKBookmarkRowsPboardType]; + return YES; } -+ (BOOL)allowsReverseTransformation { +- (NSDragOperation)tableView:(NSTableView *)tv validateDrop:(id <NSDraggingInfo>)info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op { + NSPasteboard *pboard = [info draggingPasteboard]; + NSString *type = [pboard availableTypeFromArray:[NSArray arrayWithObjects:SKBookmarkRowsPboardType, nil]]; + + if (type) { + [tv setDropRow:row == -1 ? [tv numberOfRows] : row dropOperation:NSTableViewDropAbove]; + return NSDragOperationMove; + } + return NSDragOperationNone; +} + +- (BOOL)tableView:(NSTableView *)tv acceptDrop:(id <NSDraggingInfo>)info row:(int)row dropOperation:(NSTableViewDropOperation)op { + NSPasteboard *pboard = [info draggingPasteboard]; + NSString *type = [pboard availableTypeFromArray:[NSArray arrayWithObjects:SKBookmarkRowsPboardType, nil]]; + + if (type) { + int draggedRow = [[pboard propertyListForType:SKBookmarkRowsPboardType] intValue]; + SKBookmark *bookmark = [[bookmarks objectAtIndex:draggedRow] retain]; + [self removeObjectFromBookmarksAtIndex:draggedRow]; + [self insertObject:bookmark inBookmarksAtIndex:row < draggedRow ? row : row - 1]; + [bookmark release]; + [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO]; + return YES; + } return NO; } -- (id)transformedValue:(id)number { - return [NSNumber numberWithUnsignedInt:[number unsignedIntValue] + 1]; +#pragma mark NSTableView delegate methods + +- (NSString *)tableView:(NSTableView *)tv toolTipForCell:(NSCell *)cell rect:(NSRectPointer)rect tableColumn:(NSTableColumn *)tableColumn row:(int)row mouseLocation:(NSPoint)mouseLocation { + NSString *tcID = [tableColumn identifier]; + SKBookmark *bookmark = [self objectInBookmarksAtIndex:row]; + + if ([tcID isEqualToString:@"label"]) { + return [bookmark label]; + } else if ([tcID isEqualToString:@"file"]) { + return [bookmark resolvedPath]; + } else if ([tcID isEqualToString:@"page"]) { + return [[bookmark pageNumber] stringValue]; + } + return nil; } +- (void)tableView:(NSTableView *)aTableView deleteRowsWithIndexes:(NSIndexSet *)rowIndexes { + int row = [rowIndexes firstIndex]; + [self removeObjectFromBookmarksAtIndex:row]; +} + +- (BOOL)tableView:(NSTableView *)aTableView canDeleteRowsWithIndexes:(NSIndexSet *)rowIndexes { + return YES; +} + @end +#pragma mark - [EMAIL PROTECTED] SKAliasDataTransformer [EMAIL PROTECTED] SKBookmark -+ (Class)transformedValueClass { - return [NSString class]; +- (id)initWithPath:(NSString *)aPath aliasData:(NSData *)aData pageIndex:(unsigned)aPageIndex label:(NSString *)aLabel { + if (self = [super init]) { + path = [aPath copy]; + aliasData = [aData copy]; + pageIndex = aPageIndex; + label = [aLabel copy]; + } + return self; } -+ (BOOL)allowsReverseTransformation { - return NO; +- (id)initWithPath:(NSString *)aPath pageIndex:(unsigned)aPageIndex label:(NSString *)aLabel { + return [self initWithPath:aPath aliasData:[[BDAlias aliasWithPath:aPath] aliasData] pageIndex:aPageIndex label:aLabel]; } -- (id)transformedValue:(id)dictionary { - NSString *path = [[BDAlias aliasWithData:[dictionary valueForKey:@"_BDAlias"]] fullPathNoUI]; - if (path == nil) - path = [dictionary valueForKey:@"path"]; - return path; +- (id)initWithDictionary:(NSDictionary *)dictionary { + return [self initWithPath:[dictionary objectForKey:@"path"] aliasData:[dictionary objectForKey:@"_BDAlias"] pageIndex:[[dictionary objectForKey:@"pageIndex"] unsignedIntValue] label:[dictionary objectForKey:@"label"]]; } +- (id)copyWithZone:(NSZone *)aZone { + return [[[self class] allocWithZone:aZone] initWithPath:path aliasData:aliasData pageIndex:pageIndex label:label]; +} + +- (void)dealloc { + [[[SKBookmarkController sharedBookmarkController] undoManager] removeAllActionsWithTarget:self]; + [path release]; + [aliasData release]; + [label release]; + [super dealloc]; +} + +- (NSDictionary *)dictionaryValue { + return [NSDictionary dictionaryWithObjectsAndKeys:path, @"path", aliasData, @"_BDAlias", [NSNumber numberWithUnsignedInt:pageIndex], @"pageIndex", label, @"label", nil]; +} + +- (NSString *)path { + return [[path retain] autorelease]; +} + +- (NSData *)aliasData { + return aliasData; +} + +- (NSString *)resolvedPath { + NSString *resolvedPath = [[BDAlias aliasWithData:aliasData] fullPathNoUI]; + if (resolvedPath == nil) + resolvedPath = path; + return resolvedPath; +} + +- (unsigned int)pageIndex { + return pageIndex; +} + +- (NSNumber *)pageNumber { + return [NSNumber numberWithUnsignedInt:pageIndex + 1]; +} + +- (NSString *)label { + return label; +} + +- (void)setLabel:(NSString *)newLabel { + if (label != newLabel) { + NSUndoManager *undoManager = [[SKBookmarkController sharedBookmarkController] undoManager]; + [(SKBookmark *)[undoManager prepareWithInvocationTarget:self] setLabel:label]; + [label release]; + label = [newLabel retain]; + [[NSNotificationCenter defaultCenter] postNotificationName:SKBookmarkChangedNotification object:self]; + } +} + @end Modified: trunk/SKThumbnailTableView.h =================================================================== --- trunk/SKThumbnailTableView.h 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/SKThumbnailTableView.h 2007-08-20 18:21:29 UTC (rev 2689) @@ -49,7 +49,6 @@ @interface SKSnapshotTableView : SKThumbnailTableView -- (BOOL)canDelete; @end @@ -59,12 +58,6 @@ @end [EMAIL PROTECTED] NSObject (SKSnapshotTableViewDelegate) -- (void)tableView:(NSTableView *)aTableView deleteRowsWithIndexes:(NSIndexSet *)rowIndexes; -- (BOOL)tableView:(NSTableView *)aTableView canDeleteRowsWithIndexes:(NSIndexSet *)rowIndexes; [EMAIL PROTECTED] - - @interface NSObject (SKThumbnailTableViewDelegate) - (NSArray *)tableViewHighlightedRows:(NSTableView *)tableView; - (BOOL)tableView:(NSTableView *)tableView commandSelectRow:(int)rowIndex; Modified: trunk/SKThumbnailTableView.m =================================================================== --- trunk/SKThumbnailTableView.m 2007-08-20 10:51:17 UTC (rev 2688) +++ trunk/SKThumbnailTableView.m 2007-08-20 18:21:29 UTC (rev 2689) @@ -176,38 +176,6 @@ @implementation SKSnapshotTableView -- (BOOL)canDelete { - NSIndexSet *indexes = [self selectedRowIndexes]; - return [indexes count] && - [[self delegate] respondsToSelector:@selector(tableView:canDeleteRowsWithIndexes:)] && - [[self delegate] respondsToSelector:@selector(tableView:deleteRowsWithIndexes:)] && - [[self delegate] tableView:self canDeleteRowsWithIndexes:indexes]; -} - -- (void)delete:(id)sender { - if ([self canDelete]) - [[self delegate] tableView:self deleteRowsWithIndexes:[self selectedRowIndexes]]; - else - NSBeep(); -} - -- (void)keyDown:(NSEvent *)theEvent { - NSString *characters = [theEvent charactersIgnoringModifiers]; - unichar eventChar = [characters length] > 0 ? [characters characterAtIndex:0] : 0; - unsigned int modifiers = [theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask; - - if ((eventChar == NSDeleteCharacter || eventChar == NSDeleteFunctionKey) && modifiers == 0 && [self canDelete]) - [self delete:self]; - else - [super keyDown:theEvent]; -} - -- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - if ([menuItem action] == @selector(delete:)) - return [self canDelete]; - return [super validateMenuItem:menuItem]; -} - @end #pragma mark - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ Skim-app-commit mailing list Skim-app-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/skim-app-commit