From 4b814bdbf0f91afa1725b262cac492648852ffaf Mon Sep 17 00:00:00 2001 From: vspader Date: Mon, 15 Oct 2007 03:29:30 +0000 Subject: [PATCH] Added back update notifications back to the file drawer. Removed no-longer-used files. Removed debugging messages. --- Application/AppController.h | 4 +- Application/AppController.m | 3 +- Cog.xcodeproj/project.pbxproj | 10 - English.lproj/MainMenu.nib/classes.nib | 10 +- English.lproj/MainMenu.nib/info.nib | 2 +- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 58081 -> 58428 bytes FileDrawer/DirectoryNode.m | 19 +- FileDrawer/FileIconCell.m | 6 +- FileDrawer/FileOutlineView.m | 3 - FileDrawer/FileTreeController.h | 30 --- FileDrawer/FileTreeController.m | 208 -------------------- FileDrawer/FileTreeWatcher.h | 25 --- FileDrawer/FileTreeWatcher.m | 62 ------ FileDrawer/PathNode.h | 9 +- FileDrawer/PathNode.m | 108 ++++++++-- FileDrawer/SmartFolderNode.m | 33 ++-- Plugins/FileSource/FileSource.m | 9 +- Plugins/MAD/MADDecoder.m | 6 - TODO | 3 +- ThirdParty/UKKQueue/UKKQueue.m | 3 +- 20 files changed, 141 insertions(+), 412 deletions(-) delete mode 100644 FileDrawer/FileTreeController.h delete mode 100644 FileDrawer/FileTreeController.m delete mode 100644 FileDrawer/FileTreeWatcher.h delete mode 100644 FileDrawer/FileTreeWatcher.m diff --git a/Application/AppController.h b/Application/AppController.h index 46ca8cc2d..d6a1fddc3 100644 --- a/Application/AppController.h +++ b/Application/AppController.h @@ -7,7 +7,7 @@ @class PlaybackController; @class PlaylistController; @class PlaylistView; -@class FileTreeController; +@class FileTreeDataSource; @class FileOutlineView; @class AppleRemote; @class PlaylistLoader; @@ -33,7 +33,7 @@ IBOutlet NSDrawer *infoDrawer; IBOutlet NSDrawer *fileDrawer; - IBOutlet FileTreeController *fileTreeController; + IBOutlet FileTreeDataSource *fileTreeDataSource; IBOutlet FileOutlineView *fileOutlineView; IBOutlet PlaylistView *playlistView; diff --git a/Application/AppController.m b/Application/AppController.m index 945ef235d..993c54f8c 100644 --- a/Application/AppController.m +++ b/Application/AppController.m @@ -3,7 +3,6 @@ #import "PlaybackController.h" #import "PlaylistController.h" #import "PlaylistView.h" -#import "FileTreeController.h" #import "FileOutlineView.h" #import "NDHotKeyEvent.h" #import "AppleRemote.h" @@ -400,7 +399,7 @@ increase/decrease as long as the user holds the left/right, plus/minus button */ [self registerHotKeys]; } else if ([keyPath isEqualToString:@"values.fileDrawerRootPath"]) { - [fileTreeController setRootPath:[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileDrawerRootPath"]]; + [fileTreeDataSource setRootPath:[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileDrawerRootPath"]]; } else if ([keyPath isEqualToString:@"values.remoteEnabled"] || [keyPath isEqualToString:@"values.remoteOnlyOnActive"]) { if([[NSUserDefaults standardUserDefaults] boolForKey:@"remoteEnabled"]) { diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index 37d65df79..325d1e4fb 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -123,7 +123,6 @@ 8EFFCD610AA093AF00C458A5 /* FileIconCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD450AA093AF00C458A5 /* FileIconCell.m */; }; 8EFFCD630AA093AF00C458A5 /* FileNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD470AA093AF00C458A5 /* FileNode.m */; }; 8EFFCD650AA093AF00C458A5 /* FileOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD490AA093AF00C458A5 /* FileOutlineView.m */; }; - 8EFFCD690AA093AF00C458A5 /* FileTreeWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD4D0AA093AF00C458A5 /* FileTreeWatcher.m */; }; 8EFFCD6F0AA093AF00C458A5 /* PathNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD530AA093AF00C458A5 /* PathNode.m */; }; /* End PBXBuildFile section */ @@ -613,10 +612,6 @@ 8EFFCD470AA093AF00C458A5 /* FileNode.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileNode.m; sourceTree = ""; }; 8EFFCD480AA093AF00C458A5 /* FileOutlineView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileOutlineView.h; sourceTree = ""; }; 8EFFCD490AA093AF00C458A5 /* FileOutlineView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileOutlineView.m; sourceTree = ""; }; - 8EFFCD4A0AA093AF00C458A5 /* FileTreeController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileTreeController.h; sourceTree = ""; }; - 8EFFCD4B0AA093AF00C458A5 /* FileTreeController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileTreeController.m; sourceTree = ""; }; - 8EFFCD4C0AA093AF00C458A5 /* FileTreeWatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileTreeWatcher.h; sourceTree = ""; }; - 8EFFCD4D0AA093AF00C458A5 /* FileTreeWatcher.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileTreeWatcher.m; sourceTree = ""; }; 8EFFCD520AA093AF00C458A5 /* PathNode.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PathNode.h; sourceTree = ""; }; 8EFFCD530AA093AF00C458A5 /* PathNode.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PathNode.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -1151,10 +1146,6 @@ 8EFFCD490AA093AF00C458A5 /* FileOutlineView.m */, 1769D7CF0CC2BFF7003F455B /* FileTreeDataSource.h */, 1769D7D00CC2BFF7003F455B /* FileTreeDataSource.m */, - 8EFFCD4A0AA093AF00C458A5 /* FileTreeController.h */, - 8EFFCD4B0AA093AF00C458A5 /* FileTreeController.m */, - 8EFFCD4C0AA093AF00C458A5 /* FileTreeWatcher.h */, - 8EFFCD4D0AA093AF00C458A5 /* FileTreeWatcher.m */, 8EFFCD420AA093AF00C458A5 /* DirectoryNode.h */, 8EFFCD430AA093AF00C458A5 /* DirectoryNode.m */, 8EFFCD460AA093AF00C458A5 /* FileNode.h */, @@ -1507,7 +1498,6 @@ 8EFFCD610AA093AF00C458A5 /* FileIconCell.m in Sources */, 8EFFCD630AA093AF00C458A5 /* FileNode.m in Sources */, 8EFFCD650AA093AF00C458A5 /* FileOutlineView.m in Sources */, - 8EFFCD690AA093AF00C458A5 /* FileTreeWatcher.m in Sources */, 8EFFCD6F0AA093AF00C458A5 /* PathNode.m in Sources */, 8E07AAF30AAC910500A4B32F /* SS_PrefsController.m in Sources */, 8E07AB790AAC930B00A4B32F /* PreferencesController.m in Sources */, diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib index c279543b4..261c25b1d 100644 --- a/English.lproj/MainMenu.nib/classes.nib +++ b/English.lproj/MainMenu.nib/classes.nib @@ -25,11 +25,10 @@ CLASS = AppController; LANGUAGE = ObjC; OUTLETS = { - addURLPanel = NSPanel; fileButton = NSButton; fileDrawer = NSDrawer; fileOutlineView = FileOutlineView; - fileTreeController = FileTreeController; + fileTreeDataSource = FileTreeDataSource; infoButton = NSButton; infoDrawer = NSDrawer; mainWindow = NSPanel; @@ -50,7 +49,6 @@ showTrackColumn = NSMenuItem; showYearColumn = NSMenuItem; shuffleButton = NSButton; - urlComboBox = NSComboBox; }; SUPERCLASS = NSObject; }, @@ -82,10 +80,10 @@ SUPERCLASS = NSOutlineView; }, { - CLASS = FileTreeController; + CLASS = FileTreeDataSource; LANGUAGE = ObjC; - OUTLETS = {playlistLoader = PlaylistLoader; }; - SUPERCLASS = NSTreeController; + OUTLETS = {outlineView = NSOutlineView; }; + SUPERCLASS = NSObject; }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = InfoController; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib index e953b87cb..9fc7298e3 100644 --- a/English.lproj/MainMenu.nib/info.nib +++ b/English.lproj/MainMenu.nib/info.nib @@ -35,8 +35,8 @@ IBOpenObjects 1063 - 268 29 + 268 21 1156 1324 diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index ddaaac14d7430dffa278647ce33ce565528eb362..3e974c716f186e34b5f2a920f0d685a5341e73ff 100644 GIT binary patch delta 33241 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 GWB)%BrgO~z delta 32864 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 diff --git a/FileDrawer/DirectoryNode.m b/FileDrawer/DirectoryNode.m index e0827badf..e87c45fda 100644 --- a/FileDrawer/DirectoryNode.m +++ b/FileDrawer/DirectoryNode.m @@ -11,9 +11,6 @@ #import "FileNode.h" #import "SmartFolderNode.h" -#import "FileTreeController.h" -#import "FileTreeWatcher.h" - @implementation DirectoryNode - (BOOL)isLeaf @@ -21,19 +18,11 @@ return NO; } -- (NSArray *)subpaths +- (void)updatePath { - if (subpaths == nil) - { - subpaths = [[NSMutableArray alloc] init]; - NSArray *contents = [[[NSFileManager defaultManager] directoryContentsAtPath:path] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; - NSLog(@"Contents: %@", contents); - [self processPaths: contents]; - -// [[controller watcher] addPath:[self path]]; - } - - return subpaths; + NSArray *contents = [[[NSFileManager defaultManager] directoryContentsAtPath:path] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + + [self processPaths: contents]; } @end diff --git a/FileDrawer/FileIconCell.m b/FileDrawer/FileIconCell.m index d88370c50..9c7935dfd 100644 --- a/FileDrawer/FileIconCell.m +++ b/FileDrawer/FileIconCell.m @@ -7,14 +7,14 @@ // #import "FileIconCell.h" - +#import "PathNode.h" @implementation FileIconCell - (void)setObjectValue:(id)o { - if ([o respondsToSelector:@selector(icon)]) { - [super setObjectValue:[[o path] lastPathComponent]]; + if ([o respondsToSelector:@selector(icon)] && [o respondsToSelector:@selector(displayPath)]) { + [super setObjectValue:[o displayPath]]; [super setImage: [o icon]]; } else { diff --git a/FileDrawer/FileOutlineView.m b/FileDrawer/FileOutlineView.m index 880510d6c..16af03081 100644 --- a/FileDrawer/FileOutlineView.m +++ b/FileDrawer/FileOutlineView.m @@ -31,9 +31,6 @@ [c setDataCell: dataCell]; NSLog(@"Setting data cell!"); } - - dataSource = [[FileTreeDataSource alloc] initWithRoot: [[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileDrawerRootPath"] ]; - [self setDataSource: dataSource]; } diff --git a/FileDrawer/FileTreeController.h b/FileDrawer/FileTreeController.h deleted file mode 100644 index 6f6127156..000000000 --- a/FileDrawer/FileTreeController.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// FileTreeController.h -// Cog -// -// Created by Vincent Spader on 8/20/2006. -// Copyright 2006 Vincent Spader. All rights reserved. -// - -#import - -@class FileTreeWatcher; -@class PlaylistLoader; - -@interface FileTreeController : NSTreeController -{ - IBOutlet PlaylistLoader *playlistLoader; - - NSString *rootPath; - - FileTreeWatcher *watcher; -} - -- (FileTreeWatcher *)watcher; - -- (id)rootPath; -- (void)setRootPath:(id)r; -- (void)refreshRoot; -- (NSArray *)acceptableFileTypes; - -@end diff --git a/FileDrawer/FileTreeController.m b/FileDrawer/FileTreeController.m deleted file mode 100644 index 745efa9e2..000000000 --- a/FileDrawer/FileTreeController.m +++ /dev/null @@ -1,208 +0,0 @@ -// -// FileTreeController.m -// Cog -// -// Created by Vincent Spader on 8/20/2006. -// Copyright 2006 Vincent Spader. All rights reserved. -// - -#import "FileTreeController.h" -#import "FileTreeWatcher.h" -#import "DirectoryNode.h" -#import "ImageTextCell.h" -#import "KFTypeSelectTableView.h" -#import "PlaylistLoader.h" - -@implementation FileTreeController - -- (void)awakeFromNib -{ - watcher = [[FileTreeWatcher alloc] init]; - [watcher setDelegate:self]; - - [self setRootPath: [[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileDrawerRootPath"] ]; -} - -- (void)dealloc -{ - [rootPath release]; - [watcher release]; - - [super dealloc]; -} - -- (id)rootPath -{ - return rootPath; -} - -- (void)setRootPath:(id)r -{ - [r retain]; - [rootPath release]; - rootPath = r; - - [self refreshRoot]; -} - -- (void) refreshRoot -{ - DirectoryNode *base = [[DirectoryNode alloc] initWithPath:rootPath controller:self]; -// [self setContent: [base subpaths]]; - - [base release]; - - [watcher addPath:rootPath]; -} - -//BUG IN NSTREECONTROLLER'S SETCONTENT. FIX YOUR SHIT, APPLE! -- (void)setContent:(id)content -{ - if(![content isEqual:[self content]]) - { - NSArray *paths = [[self selectionIndexPaths] retain]; - [super setContent:nil]; - [super setContent:content]; - [self setSelectionIndexPaths:paths]; - [paths release]; - } -} - -- (void)refreshPath:(NSString *)path -{ - if ([path compare:rootPath] == NSOrderedSame) { - [self refreshRoot]; - - return; - } - - NSArray *pathComponents = [path pathComponents]; - NSArray *rootComponents = [rootPath pathComponents]; - int i = 0; - while (i < [rootComponents count] && i < [pathComponents count] && - NSOrderedSame == [[rootComponents objectAtIndex: i] compare:[pathComponents objectAtIndex: i]]) - { - i++; - } - - - id p; - NSEnumerator *e = [[self content] objectEnumerator]; - while ((p = [e nextObject])) - { - id c = [pathComponents objectAtIndex:i]; - if (NSOrderedSame == [[[p path] lastPathComponent] compare:c]) { - if (i == [pathComponents count] - 1) { - [p setSubpaths:nil]; -// [self rearrangeObjects]; - } - else { - e = [[c subpaths] objectEnumerator]; - i++; - } - } - } -} - -- (NSArray *)acceptableFileTypes -{ - return [playlistLoader acceptableFileTypes]; -} - -- (FileTreeWatcher *)watcher -{ - return watcher; -} - -- (BOOL)outlineView:(NSOutlineView *)olv writeItems:(NSArray*)items toPasteboard:(NSPasteboard*)pboard { - //Get selected paths - NSMutableArray *paths = [NSMutableArray arrayWithCapacity:[items count]]; - NSEnumerator *e = [items objectEnumerator]; - id p; - - while (p = [e nextObject]) { - int i; - id n = nil; - NSIndexPath *ip = [p indexPath]; - - for (i = 0; i < [ip length]; i++) - { - NSArray *a = (n == nil) ? [self content] : [n subpaths]; - n = [a objectAtIndex:[ip indexAtPosition:i]]; - } - - [paths addObject:[n path]]; - } - - [pboard declareTypes:[NSArray arrayWithObjects:NSFilenamesPboardType,nil] owner:nil]; //add it to pboard - [pboard setPropertyList:paths forType:NSFilenamesPboardType]; - - return YES; -} - - -// Required Protocol Bullshit (RPB) This is neccessary so it can be used as a datasource for drag/drop things. - - - (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item - { - return nil; - } - - - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item - { - return NO; - } - - - (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item - { - return 0; - } - - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item - { - return nil; - } - -//End of RPB - - -//For type-select - -- (void)configureTypeSelectTableView:(KFTypeSelectTableView *)tableView -{ - [tableView setSearchWraps:YES]; -} - -- (int)typeSelectTableViewInitialSearchRow:(id)tableView -{ - return [tableView selectedRow]; -} - -// Return the string value used for type selection -- (NSString *)typeSelectTableView:(KFTypeSelectTableView *)tableView stringValueForTableColumn:(NSTableColumn *)col row:(int)row -{ - id item = [tableView itemAtRow:row]; - - //Reaching down into NSTreeController...yikes - return [[[item observedObject] path] lastPathComponent]; -} - -//End type-select - -- (void)addSelectedToPlaylist { - NSMutableArray *urls = [[NSMutableArray alloc] init]; - NSArray *nodes = [self selectedObjects]; - NSEnumerator *e = [nodes objectEnumerator]; - - id n; - while (n = [e nextObject]) { - NSURL *url = [[NSURL alloc] initFileURLWithPath:[n path]]; - [urls addObject:url]; - [url release]; - } - - [playlistLoader addURLs:urls sort:YES]; - [urls release]; -} - - -@end diff --git a/FileDrawer/FileTreeWatcher.h b/FileDrawer/FileTreeWatcher.h deleted file mode 100644 index 1b78ffd89..000000000 --- a/FileDrawer/FileTreeWatcher.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// FileTreeDelegate.h -// BindTest -// -// Created by Vincent Spader on 8/20/06. -// Copyright 2006 Vincent Spader. All rights reserved. -// - -#import - -@class UKKQueue; - -@interface FileTreeWatcher : NSObject { - UKKQueue *kqueue; - id delegate; - - NSMutableArray *watchedPaths; -} - -- (void)addPath: (NSString *)path; -- (void)removePath: (NSString *)path; - --(void) setDelegate: (id)d; - -@end diff --git a/FileDrawer/FileTreeWatcher.m b/FileDrawer/FileTreeWatcher.m deleted file mode 100644 index d5d44d95b..000000000 --- a/FileDrawer/FileTreeWatcher.m +++ /dev/null @@ -1,62 +0,0 @@ -// -// FileTreeDelegate.m -// BindTest -// -// Created by Vincent Spader on 8/20/06. -// Copyright 2006 Vincent Spader. All rights reserved. -// - -#import "FileTreeWatcher.h" - -#import "UKKQueue.h" - -@implementation FileTreeWatcher - -- (id)init -{ - self = [super init]; - if (self) - { - kqueue = [[UKKQueue alloc] init]; - [kqueue setDelegate:self]; - - watchedPaths = [[NSMutableArray alloc] init]; - } - - return self; -} - -- (void)dealloc -{ - [delegate release]; - [super dealloc]; -} - - -- (void)addPath: (NSString *)path -{ - if ([watchedPaths containsObject:path] == NO) { - [watchedPaths addObject:path]; - - [kqueue addPath: path]; - } -} - -- (void)removePath: (NSString *)path -{ - [watchedPaths removeObject:path]; - [kqueue removePath:path]; -} - --(void) setDelegate: (id)d -{ - delegate = [d retain]; -} - - --(void) watcher: (id)kq receivedNotification: (NSString*)nm forPath: (NSString*)fpath -{ - [delegate refreshPath: fpath]; -} - -@end diff --git a/FileDrawer/PathNode.h b/FileDrawer/PathNode.h index dc6e1e5c1..05a96f247 100644 --- a/FileDrawer/PathNode.h +++ b/FileDrawer/PathNode.h @@ -8,15 +8,21 @@ #import +@class FileTreeDataSource; + @interface PathNode : NSObject { + FileTreeDataSource *dataSource; + NSString *path; + NSString *displayPath; //The pretty path to display. + NSImage *icon; NSArray *subpaths; } -- (id)initWithPath:(NSString *)p; +- (id)initWithDataSource:(FileTreeDataSource *)ds path:(NSString *)p; - (NSString *)path; - (void)setPath:(NSString *)p; @@ -26,6 +32,7 @@ - (NSArray *)subpaths; - (void)setSubpaths:(NSArray *)s; +- (NSString *)displayPath; - (NSImage *)icon; - (BOOL)isLeaf; diff --git a/FileDrawer/PathNode.m b/FileDrawer/PathNode.m index 6269a69f0..98cfb63bc 100644 --- a/FileDrawer/PathNode.m +++ b/FileDrawer/PathNode.m @@ -10,44 +10,76 @@ #import "CogAudio/AudioPlayer.h" +#import "FileTreeDataSource.h" + +#import "UKKQueue.h" + @class FileNode; @class DirectoryNode; @class SmartFolderNode; @implementation PathNode -- (id)initWithPath:(NSString *)p +- (id)initWithDataSource:(FileTreeDataSource *)ds path:(NSString *)p { self = [super init]; if (self) { + dataSource = ds; [self setPath: p]; } return self; } -- (void)dealloc +- (void)stopWatching { - [path release]; - [icon release]; - - if (subpaths) { - [subpaths release]; - subpaths = nil; - } + if (path) + { + NSLog(@"Stopped watching...: %@", path); - [super dealloc]; + //Remove all in one go + [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self]; + + [[UKKQueue sharedFileWatcher] removePath:path]; + } +} + +- (void)startWatching +{ + if (path) + { + NSLog(@"WATCHING! %@ %i", path, path); + + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(updatePathNotification:) name:UKFileWatcherRenameNotification object:nil]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(updatePathNotification:) name:UKFileWatcherWriteNotification object:nil]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(updatePathNotification:) name:UKFileWatcherDeleteNotification object:nil]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(updatePathNotification:) name:UKFileWatcherAttributeChangeNotification object:nil]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(updatePathNotification:) name:UKFileWatcherSizeIncreaseNotification object:nil]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(updatePathNotification:) name:UKFileWatcherLinkCountChangeNotification object:nil]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(updatePathNotification:) name:UKFileWatcherAccessRevocationNotification object:nil]; + + [[UKKQueue sharedFileWatcher] addPath:path]; + } } - (void)setPath:(NSString *)p { [p retain]; - [path release]; + [self stopWatching]; + + [path release]; + path = p; + [self startWatching]; + + [displayPath release]; + displayPath = [[NSFileManager defaultManager] displayNameAtPath:path]; + [displayPath retain]; + [icon release]; icon = [[NSWorkspace sharedWorkspace] iconForFile:path]; [icon retain]; @@ -60,6 +92,28 @@ return path; } +- (void)updatePath +{ +} + +- (void)updatePathNotification:(NSNotification *)notification +{ + [self performSelectorOnMainThread:@selector(updatePathNotificationMainThread:) withObject:notification waitUntilDone:YES]; +} + +- (void)updatePathNotificationMainThread:(NSNotification *)notification +{ + NSString *p = [[notification userInfo] objectForKey:@"path"]; + if (p == path) + { + NSLog(@"Update path notification: %@", [NSThread currentThread]); + + [self updatePath]; + + [dataSource reloadPathNode:self]; + } +} + - (void)processPaths: (NSArray *)contents { NSMutableArray *newSubpaths = [[NSMutableArray alloc] init]; @@ -78,7 +132,7 @@ if ([[s pathExtension] caseInsensitiveCompare:@"savedSearch"] == NSOrderedSame) { - newNode = [[SmartFolderNode alloc] initWithPath:newSubpath]; + newNode = [[SmartFolderNode alloc] initWithDataSource:dataSource path:newSubpath]; } else { @@ -92,9 +146,13 @@ } if (isDir) - newNode = [[DirectoryNode alloc] initWithPath: newSubpath]; + { + newNode = [[DirectoryNode alloc] initWithDataSource:dataSource path: newSubpath]; + } else - newNode = [[FileNode alloc] initWithPath: newSubpath]; + { + newNode = [[FileNode alloc] initWithDataSource:dataSource path: newSubpath]; + } } [newSubpaths addObject:newNode]; @@ -102,13 +160,18 @@ [newNode release]; } - [self setSubpaths:[[newSubpaths copy] autorelease]]; + [self setSubpaths:newSubpaths]; [newSubpaths release]; } - (NSArray *)subpaths { + if (subpaths == nil) + { + [self updatePath]; + } + return subpaths; } @@ -125,11 +188,26 @@ return YES; } +- (NSString *)displayPath +{ + return displayPath; +} - (NSImage *)icon { return icon; } +- (void)dealloc +{ + [self stopWatching]; + + [path release]; + [icon release]; + + [subpaths release]; + + [super dealloc]; +} @end diff --git a/FileDrawer/SmartFolderNode.m b/FileDrawer/SmartFolderNode.m index d6c6c1e00..85a0dba71 100644 --- a/FileDrawer/SmartFolderNode.m +++ b/FileDrawer/SmartFolderNode.m @@ -17,26 +17,23 @@ return NO; } -- (NSArray *)subpaths +- (void)updatePath { - if (subpaths == nil) - { - NSDictionary *doc = [NSDictionary dictionaryWithContentsOfFile:path]; - NSString *rawQuery = [doc objectForKey:@"RawQuery"]; - NSArray *searchPaths = [[doc objectForKey:@"SearchCriteria"] objectForKey:@"CurrentFolderPath"]; - - // Ugh, Carbon from now on... - MDQueryRef query = MDQueryCreate(kCFAllocatorDefault, (CFStringRef)rawQuery, NULL, NULL); - - MDQuerySetSearchScope(query, (CFArrayRef)searchPaths, 0); - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryFinished:) name:(NSString*)kMDQueryDidFinishNotification object:(id)query]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryUpdate:) name:(NSString*)kMDQueryDidUpdateNotification object:(id)query]; - - MDQueryExecute(query, kMDQueryWantsUpdates); - } + NSDictionary *doc = [NSDictionary dictionaryWithContentsOfFile:path]; + NSString *rawQuery = [doc objectForKey:@"RawQuery"]; + NSArray *searchPaths = [[doc objectForKey:@"SearchCriteria"] objectForKey:@"CurrentFolderPath"]; - return subpaths; + // Ugh, Carbon from now on... + MDQueryRef query = MDQueryCreate(kCFAllocatorDefault, (CFStringRef)rawQuery, NULL, NULL); + + MDQuerySetSearchScope(query, (CFArrayRef)searchPaths, 0); + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryFinished:) name:(NSString*)kMDQueryDidFinishNotification object:(id)query]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryUpdate:) name:(NSString*)kMDQueryDidUpdateNotification object:(id)query]; + + MDQueryExecute(query, kMDQueryWantsUpdates); + + //Note: This is asynchronous! } - (void)setSubpaths:(id)s diff --git a/Plugins/FileSource/FileSource.m b/Plugins/FileSource/FileSource.m index dc7c45640..aba6bff7f 100644 --- a/Plugins/FileSource/FileSource.m +++ b/Plugins/FileSource/FileSource.m @@ -46,8 +46,11 @@ [_url release]; _url = nil; - fclose(_fd); - _fd = NULL; + if (_fd) + { + fclose(_fd); + _fd = NULL; + } } - (NSURL *)url @@ -74,7 +77,7 @@ } - (void)dealloc { - NSLog(@"DEALLOCATING SOURCE"); + [self close]; [super dealloc]; } diff --git a/Plugins/MAD/MADDecoder.m b/Plugins/MAD/MADDecoder.m index fb7bd8d94..1222f472f 100644 --- a/Plugins/MAD/MADDecoder.m +++ b/Plugins/MAD/MADDecoder.m @@ -566,12 +566,6 @@ static inline signed int scale (mad_fixed_t sample) mad_stream_finish(&_stream); } -- (void)dealloc -{ - NSLog(@"Decoder dealloc"); - [super dealloc]; -} - - (double)seekToTime:(double)milliseconds { unsigned long new_position; diff --git a/TODO b/TODO index 52826501e..9b91915e0 100644 --- a/TODO +++ b/TODO @@ -1 +1,2 @@ -Fix playback and leaks. Playback is very much busted when doing lots of next/forward/moving around. \ No newline at end of file +Ensure file drawer works with metadata search (Smart folders). +Add alias support. \ No newline at end of file diff --git a/ThirdParty/UKKQueue/UKKQueue.m b/ThirdParty/UKKQueue/UKKQueue.m index 3217ef49f..b48286fbd 100644 --- a/ThirdParty/UKKQueue/UKKQueue.m +++ b/ThirdParty/UKKQueue/UKKQueue.m @@ -355,7 +355,8 @@ static UKKQueue * gUKKQueueSharedQueueSingleton = nil; if( ev.fflags ) { NSString* fpath = [[(NSString *)ev.udata retain] autorelease]; // In case one of the notified folks removes the path. - //NSLog(@"UKKQueue: Detected file change: %@", fpath); + + //NSLog(@"UKKQueue: Detected file change: %@ %i", fpath, fpath); [[NSWorkspace sharedWorkspace] noteFileSystemChanged: fpath]; //NSLog(@"ev.flags = %u",ev.fflags); // DEBUG ONLY!