From 11352ab6de2060d455c253732af30f35b08b9a07 Mon Sep 17 00:00:00 2001 From: mscott Date: Sun, 16 Aug 2009 11:49:34 -0500 Subject: [PATCH] Enhancements to File Tree (contextual menu, sort order, etc.). Added File Tree contextual menu (Add to Playlist, Show in Finder, etc.). File Tree and additions to play list now use Finder sort order. File Tree Root can be set via its popup menu or drag and drop from File Tree. Alias names are now shown in File Tree (aliases are still resolved). Added option to skip reading of cue sheets when adding a folder to play list. --- Cog.xcodeproj/project.pbxproj | 6 + English.lproj/FileTree.xib | 300 ++++++++++++++++-- English.lproj/MainMenu.xib | 143 ++++++--- FileTree/DirectoryNode.m | 2 +- FileTree/FileTreeController.h | 5 + FileTree/FileTreeController.m | 34 ++ FileTree/FileTreeDataSource.h | 4 +- FileTree/FileTreeDataSource.m | 26 +- FileTree/FileTreeOutlineView.m | 53 ++++ FileTree/FileTreeViewController.h | 2 + FileTree/FileTreeViewController.m | 10 +- FileTree/PathNode.h | 2 + FileTree/PathNode.m | 22 +- Playlist/PlaylistLoader.h | 5 + Playlist/PlaylistLoader.m | 25 +- .../General/English.lproj/Preferences.xib | 221 +++++++++---- Utils/NSString+FinderCompare.h | 18 ++ Utils/NSString+FinderCompare.m | 46 +++ 18 files changed, 770 insertions(+), 154 deletions(-) create mode 100644 Utils/NSString+FinderCompare.h create mode 100644 Utils/NSString+FinderCompare.m diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index 64898c9f8..161419cf4 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -168,6 +168,7 @@ 8E9A30160BA792DC0091081B /* NSFileHandle+CreateFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E9A30140BA792DC0091081B /* NSFileHandle+CreateFile.m */; }; 99EAACA80DD1BB7A00423C38 /* APL.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 566D321B0D538550004466A5 /* APL.bundle */; }; B09E96630D74A7BC0064F138 /* stop_current.png in Resources */ = {isa = PBXBuildFile; fileRef = B09E96620D74A7BC0064F138 /* stop_current.png */; }; + F6F96719102C709000D2C9B4 /* NSString+FinderCompare.m in Sources */ = {isa = PBXBuildFile; fileRef = F6F96718102C709000D2C9B4 /* NSString+FinderCompare.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -768,6 +769,8 @@ 8E9A30140BA792DC0091081B /* NSFileHandle+CreateFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileHandle+CreateFile.m"; sourceTree = ""; }; B09E94300D747F7B0064F138 /* WMA.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = WMA.xcodeproj; path = Plugins/WMA/WMA.xcodeproj; sourceTree = ""; }; B09E96620D74A7BC0064F138 /* stop_current.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = stop_current.png; path = Images/stop_current.png; sourceTree = ""; }; + F6F96718102C709000D2C9B4 /* NSString+FinderCompare.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+FinderCompare.m"; sourceTree = ""; }; + F6F9671A102C70C800D2C9B4 /* NSString+FinderCompare.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+FinderCompare.h"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -936,6 +939,8 @@ 178456110F631E31007E8021 /* SideViewController.m */, 172A12A70F59AF8A0078EF0C /* NSString+CogSort.h */, 172A12A80F59AF8A0078EF0C /* NSString+CogSort.m */, + F6F9671A102C70C800D2C9B4 /* NSString+FinderCompare.h */, + F6F96718102C709000D2C9B4 /* NSString+FinderCompare.m */, 8E9A30130BA792DC0091081B /* NSFileHandle+CreateFile.h */, 8E9A30140BA792DC0091081B /* NSFileHandle+CreateFile.m */, 07E18DF10D62B38400BB0E11 /* NSArray+ShuffleUtils.h */, @@ -1936,6 +1941,7 @@ 171CB3DC0F63670D0047EF0A /* PreferencesWindow.m in Sources */, 1778D3CA0F645BF00037E7A0 /* MissingAlbumArtTransformer.m in Sources */, 17FAEBAC0F662985007C8707 /* ToolTipTextField.m in Sources */, + F6F96719102C709000D2C9B4 /* NSString+FinderCompare.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/English.lproj/FileTree.xib b/English.lproj/FileTree.xib index 18f7c3d72..f416eb02f 100644 --- a/English.lproj/FileTree.xib +++ b/English.lproj/FileTree.xib @@ -2,13 +2,14 @@ 1050 - 9G55 + 9L30 677 - 949.43 + 949.54 353.00 YES - + + YES @@ -231,6 +232,78 @@ FileTreeController + + Menu + + YES + + + Add to Playlist + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + 1 + + + + Set as Playlist + + 1048576 + 2147483647 + + + 2 + + + + YES + YES + + + 2147483647 + + + + + + Show in Finder + + 1048576 + 2147483647 + + + 3 + + + + YES + YES + + + 2147483647 + + + + + + Set as Root + + 1048576 + 2147483647 + + + 4 + + + @@ -287,26 +360,6 @@ 88 - - - value: values.fileTreeRootURL - - - - - - value: values.fileTreeRootURL - value - values.fileTreeRootURL - - NSValueTransformerName - StringToURLTransformer - - 2 - - - 89 - fontSize: values.fontSize @@ -371,6 +424,90 @@ 106 + + + value: values.fileTreeRootURL + + + + + + value: values.fileTreeRootURL + value + values.fileTreeRootURL + + NSValueTransformerName + StringToURLTransformer + + 2 + + + 108 + + + + pathControl + + + + 109 + + + + menu + + + + 121 + + + + addToPlaylist: + + + + 122 + + + + showEntryInFinder: + + + + 123 + + + + setAsRoot: + + + + 125 + + + + setAsPlaylist: + + + + 130 + + + + dataSource + + + + 137 + + + + delegate + + + + 139 + @@ -422,8 +559,8 @@ YES - + File Tree View @@ -491,6 +628,51 @@ + + 110 + + + YES + + + + + + + + + ContextualMenu + + + 112 + + + + + 119 + + + + + 124 + + + + + 126 + + + + + 128 + + + + + 129 + + + @@ -500,6 +682,17 @@ -1.IBPluginDependency -2.IBPluginDependency -3.IBPluginDependency + 110.IBEditorWindowLastContentRect + 110.IBPluginDependency + 110.ImportedFromIB2 + 110.editorWindowContentRectSynchronizationRect + 112.IBPluginDependency + 112.ImportedFromIB2 + 119.IBPluginDependency + 124.IBPluginDependency + 126.IBPluginDependency + 128.IBPluginDependency + 129.IBPluginDependency 27.IBPluginDependency 31.IBPluginDependency 55.IBEditorWindowLastContentRect @@ -529,12 +722,23 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{554, 263}, {307, 399}} - com.apple.InterfaceBuilder.CocoaPlugin + {{310, 530}, {169, 103}} com.apple.InterfaceBuilder.CocoaPlugin + {{482, 640}, {187, 133}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{582, 558}, {307, 399}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -574,7 +778,7 @@ - 106 + 139 @@ -611,19 +815,34 @@ FileTreeController NSObject - addToPlaylist: - id + YES + + YES + addToPlaylist: + setAsPlaylist: + setAsRoot: + showEntryInFinder: + + + YES + id + id + id + id + YES YES controller + dataSource outlineView YES SideViewController + FileTreeDataSource NSOutlineView @@ -640,11 +859,13 @@ YES outlineView + pathControl watcher YES NSOutlineView + NSPathControl PathWatcher @@ -673,8 +894,17 @@ FileTreeViewController SideViewController - playlistLoader - PlaylistLoader + YES + + YES + playbackController + playlistLoader + + + YES + PlaybackController + PlaylistLoader + IBProjectSource @@ -847,6 +1077,10 @@ PlaylistLoader NSObject + + clear: + id + playlistController PlaylistController diff --git a/English.lproj/MainMenu.xib b/English.lproj/MainMenu.xib index 591917272..ee82a5959 100644 --- a/English.lproj/MainMenu.xib +++ b/English.lproj/MainMenu.xib @@ -2,16 +2,16 @@ 1050 - 9G55 + 9J61 677 - 949.43 + 949.46 353.00 YES + - YES @@ -891,44 +891,78 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - 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 -OQA + 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 +K54smy2VLpEvjDCGMYIyezN4NHA1bjZmN2I4WjlUOk47SDxDPT0+Oj80QDJBK0IoQyNEIUUdRhpHFUgP +SQpKAUr6S+5M5U3YTs1PwFC0UadSmFOMVH1VcFZiV1VYSVk9WjJbJlwdXRReDV8GYAFg+2H4YvVj9GTz +ZfNm9Gf1aPhp+Wr9a/9tA24GbwpwDXESchVzGnQedSF2JXcneCp5K3oseyx8LX0qfip/JYAjgR2CF4MP +hAeE/oXzhuqH34jWicuKwYu1jKqNn46Uj4mQfZFzkmaTW5RPlUOWOJcsmCGZFpoLmwCb9pzrneGe1p/N +oMOhuqKyo6mkoaWZppKnjKiGqYCqe6t3rHStcq5wr2+wbrFvsnCzc7R2tXu2gLeFuIu5kbqYu5+8p72v +vri/wcDLwdTC38PqxPXGAccOyBrJJ8o0y0PMUM1gzm7PftCO0Z7Sr9PA1NHV5Nb12AjZG9ov20LcV91q +3n/fk+Cp4b3i0+Po5P7mFOcr6EHpWepw64nsoe277tTv7/EK8iXzQvRf9Xz2m/e6+Nr5/Psd/EH9Zf6K +AAAAPgEbAk0C8wPTBLcFmAaXB30IhAllCloLSgw8DTUOJw8nEBgRGhIQExEUCRUHFgQXAhgCGP4aABr6 +G/4c+B37HvQf8yDwIfEi8CPvJO4l6ibrJ+Uo5ingKuAr2izYLdQu0S/NMMkxxjLAM740uDW4NrA3rjin +OaM6njuaPJY9kj6QP4tAikGEQoNDf0R+RXxGfEd5SHZJc0puS2tMZU1iTllPU1BKUUJSOVMvVCZVG1YS +VwVX+ljsWeBa0lvEXLZdpl6ZX4dgeGFoYlljSmQ6ZSxmHGcPaABo8mnkatZryWy6ba5un2+ScIRxd3Jq +c1x0T3VBdjV3JngaeQx5/3rye+N8133Ifrt/rICfgZCCgoN0hGWFV4ZGhzeIJ4kXigeK9ovmjNSNxY6z +j6KQkZGBknGTX5RQlT+WMJcgmBGZA5n0muab2JzMnb+es5+ooJ2hlKKKo4Oke6V1pnCnbKhpqWeqZ6to +rGutb650r3ywhrGRsp6zrrS/tdG25rf8uRS6LbtIvGS9gr6hv8HA4sIFwyjETMVxxpfHvsjkygzLM8xc +zYTOrc/U0P3SJNNL1HLVmNa91+HZBdon20ncaN2I3qbfxeDj4gHjIOQ+5V3me+eZ6Lfp1erz7BDtLe5L +72fwhPGg8rzz1/Tz9g33KPhB+Vv6c/uN/KP9u/7R/+gAAAA+ARsCTQLzA9QEtwWZBpgHfgiFCWYKWwtL +DD0NNg4oDygQGhEcEhETEhQLFQgWBhcEGAQZABoDGv0cARz6Hf0e9x/2IPMh9CLzI/Ik8iXuJu4n6Sjq +KeMq4yveLNwt2C7VL9IwzTHKMsUzwzS9Nbw2tTezOKw5qDqjO588nD2XPpU/kECQQYpCiUOFRIVFg0aC +R4BIfEl6SnVLckxrTWdOXk9YUE9RR1I+UzRUK1UfVhdXCVf+WPBZ5VrXW8lcvF2sXqBfj2CBYXJiZWNY +ZEplP2YxZydoGWkOagJq92vsbOFt127Kb8FwtXGrcp9zlHSKdX12c3dleFp5TXpBezN8Jn0Yfgl+/H/q +gNuByYK5g6eElIWChm6HW4hFiTGKHIsFi/CM2Y3Ejq2Pl5CAkWqSVJM9lCeVEJX7luWXz5i7maaakpt+ +nGudWZ5HnzagJaEWogii+qPupOOl2abQp8mow6nAqr2rvay+rcKuyK/RsNyx6rL6tA21IrY5t1K4bbmK +uqi7ybzrvg+/NcBcwYXCr8PaxQbGM8dgyI/JvsrtzB3NTc59z6vQ29IJ0zfUZNWQ1rvX5NkM2jLbWNx6 +3Zzevd/e4P7iH+NA5GHlgeah58Ho4eoA6x/sPu1c7nrvl/C18dDy7fQH9SL2O/dV+Gz5hfqa+7H8xf3a +/uz//wAAbmRpbgAAAAAAAAMGAACjwAAAVIAAAEzAAACZgAAAJxcAABF7AABQQAAAVEAAAgQ3AAHtwgAB +5+oAAwB4AAIAAAADAA4AHwA2AFUAewCoANwBFwFaAaQB9gJQArIDHQOPBAoEjgUbBbEGUAb4B6oIZQkp +CfcKzwuwDJoNjQ6KD48QnhG5EuEUFxVYFqYYABllGtQcTB3NH1Ug5CJ6JBcluydnKRwq2SygLnAwSjIv +NCA2HjgpOkI8aj6jQO1DRkWrSB1KnE0nT79SY1UUV9Bal11pYEZjLWYeaRlsHG8ocjt1VXh1e5x+x4H3 +hS6Ibou1jwSSWpW5mR+cjKACo3+nBKqRriWxwbVkuRC8w8B9xEHIDcviz7/TpNeR24TffuN+54Trj++e +87L3yfvj//8AAAADAA4AHwA2AFUAewCoANwBFwFaAaQB9gJQArIDHQOPBAoEjgUbBbEGUAb4B6oIZQkp +CfcKzwuwDJoNjQ6KD48QnRG3EtwUDBVJFpIX5xlIGrYcMR25H04g8CKcJFQmFifjKbsrni2NL4cxjTOf +Nbw35TobPF0+rEEHQ3BF6EhtSwBNoFBNUwZVy1ibW3VeWmFIZD5nPGpBbUtwWnNtdoJ5mXyvf8SC2IXs +iQCMFo8tkkeVY5iEm6ie0qIDpTqoeavBrxSycrXeuVe84MB6xCDH0MuJz0zTGtby2tXew+K95sPq1u72 +8yP3Xfun//8AAAADAA4AHwA2AFUAewCoANwBFwFaAaQB9gJQArIDHQOPBAoEjgUbBbEGUAb4B6oIZQkp +CfcKzwuwDJoNjQ6KD48QnRG3EtwUDRVKFpMX6RlKGrkcMx27H08g7yKZJEwmCifTKaUrgy1sL2AxYDNt +NYc3rTniPCU+eEDaQ0xFzkhgSwJNslBwUztWFFj4W+he4mHlZPBoAmsabjZxVXR0d5R6sX3KgN2D7Ib5 +igWNEZAckyiWNZlFnFifcKKNpbGo3qwUr1WyorX+uWq858B5xBfHwMtyzy/S9tbJ2qjek+KL5pHqpu7K +8v33QvuX//8AAGRlc2MAAAAAAAAAGjIyMDlXQSAxMC81NS8yLjIgMjAwOTA1MjUAAAAAAAAAABoAMgAy +ADAAOQBXAEEAIAAxADAALwA1ADUALwAyAC4AMgAgADIAMAAwADkAMAA1ADIANQAAAAAaMjIwOVdBIDEw +LzU1LzIuMiAyMDA5MDUyNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRl +eHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMDkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AABtbW9kAAAAAAAAEKwAAPARMDg4TMYC6wAAAAAAAAAAAAAAAAAAAAAAA NSCalibratedRGBColorSpace 8 @@ -5887,6 +5921,14 @@ OQA 2451 + + + playbackController + + + + 2452 + @@ -8516,7 +8558,7 @@ OQA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{823, 609}, {142, 63}} + {{809, 609}, {142, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -8607,7 +8649,7 @@ OQA com.apple.InterfaceBuilder.CocoaPlugin - {{524, 599}, {299, 293}} + {{524, 599}, {285, 293}} com.apple.InterfaceBuilder.CocoaPlugin {{376, 543}, {299, 293}} @@ -8635,7 +8677,7 @@ OQA - 2451 + 2452 @@ -8841,8 +8883,17 @@ OQA FileTreeViewController SideViewController - playlistLoader - PlaylistLoader + YES + + YES + playbackController + playlistLoader + + + YES + PlaybackController + PlaylistLoader + IBProjectSource diff --git a/FileTree/DirectoryNode.m b/FileTree/DirectoryNode.m index 5ee47ce52..86b7ec7e5 100644 --- a/FileTree/DirectoryNode.m +++ b/FileTree/DirectoryNode.m @@ -20,7 +20,7 @@ - (void)updatePath { - NSArray *contents = [[[NSFileManager defaultManager] directoryContentsAtPath:[url path]] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + NSArray *contents = [[[NSFileManager defaultManager] directoryContentsAtPath:[url path]] sortedArrayUsingSelector:@selector(finderCompare:)]; NSMutableArray *fullPaths = [[NSMutableArray alloc] init]; for (NSString *s in contents) diff --git a/FileTree/FileTreeController.h b/FileTree/FileTreeController.h index 02f99c3c6..90deb12de 100644 --- a/FileTree/FileTreeController.h +++ b/FileTree/FileTreeController.h @@ -7,13 +7,18 @@ // #import +#import "FileTreeDataSource.h" @class SideViewController; @interface FileTreeController : NSObject { IBOutlet SideViewController *controller; IBOutlet NSOutlineView *outlineView; + IBOutlet FileTreeDataSource *dataSource; } - (IBAction)addToPlaylist:(id)sender; +- (IBAction)setAsPlaylist:(id)sender; +- (IBAction)showEntryInFinder:(id)sender; +- (IBAction)setAsRoot:(id)sender; @end diff --git a/FileTree/FileTreeController.m b/FileTree/FileTreeController.m index e5cf05d06..baf030bcd 100644 --- a/FileTree/FileTreeController.m +++ b/FileTree/FileTreeController.m @@ -28,5 +28,39 @@ [urls release]; } +- (IBAction)setAsPlaylist:(id)sender +{ + [controller clear:sender]; + [self addToPlaylist:sender]; +} + +- (IBAction)playPauseResume:(NSObject *)id +{ + [controller playPauseResume:id]; +} + +- (IBAction)showEntryInFinder:(id)sender +{ + unsigned int index; + NSWorkspace* ws = [NSWorkspace sharedWorkspace]; + NSIndexSet *selectedIndexes = [outlineView selectedRowIndexes]; + + for (index = [selectedIndexes firstIndex]; + index != NSNotFound; index = [selectedIndexes indexGreaterThanIndex: index]) + { + NSURL *url = [[outlineView itemAtRow:index] URL]; + [ws selectFile:[url path] inFileViewerRootedAtPath:[url path]]; + } +} + +- (IBAction)setAsRoot:(id)sender +{ + unsigned int index = [[outlineView selectedRowIndexes] firstIndex]; + + if (index != NSNotFound) + { + [dataSource changeURL:[[outlineView itemAtRow:index] URL]]; + } +} @end diff --git a/FileTree/FileTreeDataSource.h b/FileTree/FileTreeDataSource.h index 9834cc053..5ea9597ac 100644 --- a/FileTree/FileTreeDataSource.h +++ b/FileTree/FileTreeDataSource.h @@ -13,13 +13,15 @@ @interface FileTreeDataSource : NSObject { PathNode *rootNode; - + + IBOutlet NSPathControl *pathControl; IBOutlet PathWatcher *watcher; IBOutlet NSOutlineView *outlineView; } - (NSURL *)rootURL; - (void)setRootURL:(NSURL *)rootURL; +- (void)changeURL:(NSURL *)rootURL; - (void)reloadPathNode:(PathNode *)item; diff --git a/FileTree/FileTreeDataSource.m b/FileTree/FileTreeDataSource.m index dccf1a1b7..e99933efe 100644 --- a/FileTree/FileTreeDataSource.m +++ b/FileTree/FileTreeDataSource.m @@ -30,6 +30,8 @@ [self setRootURL: [NSURL URLWithString:[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileTreeRootURL"]]]; + [pathControl setTarget:self]; + [pathControl setAction:@selector(pathControlAction:)]; } - (void) observeValueForKeyPath:(NSString *)keyPath @@ -37,11 +39,27 @@ change:(NSDictionary *)change context:(void *)context { + NSLog([[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileTreeRootURL"]); if ([keyPath isEqualToString:@"values.fileTreeRootURL"]) { [self setRootURL:[NSURL URLWithString:[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileTreeRootURL"]]]; } } +- (void)changeURL:(NSURL *)url +{ + if (url != nil) + { + [[[NSUserDefaultsController sharedUserDefaultsController] defaults] setObject:[url absoluteString] forKey:@"fileTreeRootURL"]; + } +} + +- (void)pathControlAction:(id)sender +{ + if ([pathControl clickedPathComponentCell] != nil && [[pathControl clickedPathComponentCell] URL] != nil) + { + [self changeURL:[[pathControl clickedPathComponentCell] URL]]; + } +} - (NSURL *)rootURL { @@ -131,13 +149,17 @@ - (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray*)items toPasteboard:(NSPasteboard*)pboard { //Get selected paths NSMutableArray *urls = [NSMutableArray arrayWithCapacity:[items count]]; + NSMutableArray *paths = [NSMutableArray arrayWithCapacity:[items count]]; for (id p in items) { [urls addObject:[p URL]]; + [paths addObject:[[p URL] path]]; } - NSLog(@"URLS: %@", urls); - [pboard declareTypes:[NSArray arrayWithObjects:CogUrlsPboardType,nil] owner:nil]; //add it to pboard + NSLog(@"Paths: %@", paths); + [pboard declareTypes:[NSArray arrayWithObjects:CogUrlsPboardType,nil] owner:nil]; //add it to pboard [pboard setData:[NSArchiver archivedDataWithRootObject:urls] forType:CogUrlsPboardType]; + [pboard addTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:self]; + [pboard setPropertyList:paths forType:NSFilenamesPboardType]; return YES; } diff --git a/FileTree/FileTreeOutlineView.m b/FileTree/FileTreeOutlineView.m index 43be2fdcb..52ccbab1c 100644 --- a/FileTree/FileTreeOutlineView.m +++ b/FileTree/FileTreeOutlineView.m @@ -8,11 +8,13 @@ #import "FileTreeOutlineView.h" #import "FileTreeViewController.h" +#import "PlaybackController.h" @implementation FileTreeOutlineView - (void)awakeFromNib { + [[self menu] setAutoenablesItems:NO]; [self setDoubleAction:@selector(addToPlaylist:)]; [self setTarget:[self delegate]]; } @@ -33,6 +35,11 @@ return; } + else if (modifiers == 0 && c == ' ') + { + [[self delegate] playPauseResume:self]; + return; + } } [super keyDown:e]; @@ -40,4 +47,50 @@ return; } +// enables right-click selection for "Show in Finder" contextual menu +-(NSMenu*)menuForEvent:(NSEvent*)event +{ + //Find which row is under the cursor + [[self window] makeFirstResponder:self]; + BOOL isDir; + NSPoint menuPoint = [self convertPoint:[event locationInWindow] fromView:nil]; + NSInteger iRow = [self rowAtPoint:menuPoint]; + NSMenu* contextMenu = [self menu]; + + /* Update the file tree selection before showing menu + Preserves the selection if the row under the mouse is selected (to allow for + multiple items to be selected), otherwise selects the row under the mouse */ + BOOL currentRowIsSelected = [[self selectedRowIndexes] containsIndex:iRow]; + + if (iRow == -1) + { + [self deselectAll:self]; + } + else if (!currentRowIsSelected) + { + [self selectRow:iRow byExtendingSelection:NO]; + } + + if ([self numberOfSelectedRows] > 0) + { + [[contextMenu itemWithTag:1] setEnabled:YES]; // Add to Playlist + [[contextMenu itemWithTag:2] setEnabled:YES]; // Set as Playlist + [[contextMenu itemWithTag:3] setEnabled:YES]; // Show in Finder + + // Only let directories be Set as Root + [[NSFileManager defaultManager] fileExistsAtPath:[[[self itemAtRow:iRow] URL] path] isDirectory:&isDir]; + [[contextMenu itemWithTag:4] setEnabled:(isDir? YES : NO)]; + } + else + { + //No rows are selected, so the menu should be displayed with all items disabled + int i; + for (i=0;i<[contextMenu numberOfItems];i++) { + [[contextMenu itemAtIndex:i] setEnabled:NO]; + } + } + + return contextMenu; +} + @end diff --git a/FileTree/FileTreeViewController.h b/FileTree/FileTreeViewController.h index e0dce9eca..c7bc651f5 100644 --- a/FileTree/FileTreeViewController.h +++ b/FileTree/FileTreeViewController.h @@ -10,8 +10,10 @@ #import "SideViewController.h" @class PlaylistLoader; +@class PlaybackController; @interface FileTreeViewController : SideViewController { IBOutlet PlaylistLoader *playlistLoader; + IBOutlet PlaybackController *playbackController; } @end diff --git a/FileTree/FileTreeViewController.m b/FileTree/FileTreeViewController.m index a47f5f267..7f60047cb 100644 --- a/FileTree/FileTreeViewController.m +++ b/FileTree/FileTreeViewController.m @@ -16,12 +16,20 @@ return [super initWithNibName:@"FileTree" bundle:[NSBundle mainBundle]]; } - - (void)addToPlaylist:(NSArray *)urls { [playlistLoader willInsertURLs:urls origin:URLOriginExternal]; [playlistLoader didInsertURLs:[playlistLoader addURLs:urls sort:YES] origin:URLOriginExternal]; } +- (void)clear:(id)sender +{ + [playlistLoader clear:sender]; +} + +- (void)playPauseResume:(NSObject *)id +{ + [playbackController playPauseResume:id]; +} @end diff --git a/FileTree/PathNode.h b/FileTree/PathNode.h index 943a965e1..6b6a142f4 100644 --- a/FileTree/PathNode.h +++ b/FileTree/PathNode.h @@ -33,6 +33,8 @@ - (void)setSubpaths:(NSArray *)s; - (NSString *)display; +- (void)setDisplay:(NSString *)s; + - (NSImage *)icon; - (BOOL)isLeaf; diff --git a/FileTree/PathNode.m b/FileTree/PathNode.m index 4a6045723..1f2312d43 100644 --- a/FileTree/PathNode.m +++ b/FileTree/PathNode.m @@ -33,13 +33,13 @@ NSURL *resolveAliases(NSURL *url) if (resolvedUrl != NULL) { - NSLog(@"Resolved..."); + //NSLog(@"Resolved..."); return [(NSURL *)resolvedUrl autorelease]; } } } - NSLog(@"Not resolved"); + //NSLog(@"Not resolved"); return url; } @@ -56,7 +56,6 @@ NSURL *resolveAliases(NSURL *url) return self; } - - (void)setURL:(NSURL *)u { [u retain]; @@ -66,7 +65,7 @@ NSURL *resolveAliases(NSURL *url) url = u; [display release]; - display = [[NSFileManager defaultManager] displayNameAtPath:[url path]]; + display = [[NSFileManager defaultManager] displayNameAtPath:[u path]]; [display retain]; [icon release]; @@ -99,12 +98,13 @@ NSURL *resolveAliases(NSURL *url) } NSURL *u = [NSURL fileURLWithPath:s]; + NSString *displayName = [[NSFileManager defaultManager] displayNameAtPath:[u path]]; PathNode *newNode; - NSLog(@"Before: %@", u); + //NSLog(@"Before: %@", u); u = resolveAliases(u); - NSLog(@"After: %@", u); + //NSLog(@"After: %@", u); if ([[s pathExtension] caseInsensitiveCompare:@"savedSearch"] == NSOrderedSame) { @@ -135,7 +135,8 @@ NSURL *resolveAliases(NSURL *url) newNode = [[FileNode alloc] initWithDataSource:dataSource url:u]; } } - + + [newNode setDisplay:displayName]; [newSubpaths addObject:newNode]; [newNode release]; @@ -169,6 +170,13 @@ NSURL *resolveAliases(NSURL *url) return YES; } +- (void)setDisplay:(NSString *)s +{ + [display release]; + display = s; + [display retain]; +} + - (NSString *)display { return display; diff --git a/Playlist/PlaylistLoader.h b/Playlist/PlaylistLoader.h index 67c15d277..310684f1e 100755 --- a/Playlist/PlaylistLoader.h +++ b/Playlist/PlaylistLoader.h @@ -24,6 +24,11 @@ typedef enum { NSOperationQueue *queue; } +- (void)initDefaults; + +// Clear playlist +- (void)clear:(id)sender; + // Load arrays of urls... - (NSArray*)addURLs:(NSArray *)urls sort:(BOOL)sort; - (NSArray*)addURL:(NSURL *)url; diff --git a/Playlist/PlaylistLoader.m b/Playlist/PlaylistLoader.m index f965fd364..214941d39 100755 --- a/Playlist/PlaylistLoader.m +++ b/Playlist/PlaylistLoader.m @@ -26,6 +26,8 @@ self = [super init]; if (self) { + [self initDefaults]; + queue = [[NSOperationQueue alloc] init]; [queue setMaxConcurrentOperationCount:1]; } @@ -33,6 +35,15 @@ return self; } +- (void)initDefaults +{ + NSDictionary *defaultsDictionary = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:YES], @"readCueSheetsInFolders", + nil]; + + [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDictionary]; +} + - (void)dealloc { [queue release]; @@ -151,7 +162,11 @@ BOOL isDir; if ( [manager fileExistsAtPath:absoluteSubpath isDirectory:&isDir] && isDir == NO) { - [urls addObject:[NSURL fileURLWithPath:absoluteSubpath]]; + if ([[absoluteSubpath pathExtension] caseInsensitiveCompare:@"cue"] != NSOrderedSame || + [[NSUserDefaults standardUserDefaults] boolForKey:@"readCueSheetsInFolders"]) + { + [urls addObject:[NSURL fileURLWithPath:absoluteSubpath]]; + } } } @@ -203,7 +218,8 @@ NSArray *sortedURLs; if (sort == YES) { - sortedURLs = [expandedURLs sortedArrayUsingSelector:@selector(compareTrackNumbers:)]; + sortedURLs = [expandedURLs sortedArrayUsingSelector:@selector(finderCompare:)]; +// sortedURLs = [expandedURLs sortedArrayUsingSelector:@selector(compareTrackNumbers:)]; } else { @@ -360,6 +376,11 @@ } } +- (void)clear:(id)sender +{ + [playlistController clear:sender]; +} + - (NSArray*)addURLs:(NSArray *)urls sort:(BOOL)sort { return [self insertURLs:urls atIndex:[[playlistController content] count] sort:sort]; diff --git a/Preferences/General/English.lproj/Preferences.xib b/Preferences/General/English.lproj/Preferences.xib index 52971a996..e792fd979 100644 --- a/Preferences/General/English.lproj/Preferences.xib +++ b/Preferences/General/English.lproj/Preferences.xib @@ -1,23 +1,32 @@ - + 1050 - 9D34 - 667 - 949.33 - 352.00 + 9L30 + 677 + 949.54 + 353.00 YES - - - + + + YES com.apple.InterfaceBuilder.CocoaPlugin + + YES + + YES + + + YES + + YES @@ -42,6 +51,7 @@ 256 {{91, 70}, {82, 19}} + YES -2075001280 @@ -79,6 +89,7 @@ 256 {{175, 62}, {64, 32}} + YES 67239424 @@ -106,6 +117,7 @@ 256 {{45, 72}, {39, 17}} + YES 67239424 @@ -135,6 +147,7 @@ 256 {{17, 47}, {69, 17}} + YES 67239424 @@ -151,6 +164,7 @@ 256 {{40, 22}, {44, 17}} + YES 67239424 @@ -167,6 +181,7 @@ 256 {{91, 45}, {82, 19}} + YES -2075001280 @@ -184,6 +199,7 @@ 256 {{91, 20}, {82, 19}} + YES -2075001280 @@ -201,6 +217,7 @@ 256 {{175, 37}, {64, 32}} + YES 67239424 @@ -224,6 +241,7 @@ 256 {{175, 12}, {64, 32}} + YES 67239424 @@ -245,13 +263,14 @@ {432, 109} + NSView NSResponder - + 256 YES @@ -306,6 +325,7 @@ {432, 74} + NSView @@ -441,6 +461,12 @@ NSResponder + + YES + parseCueOnAdd + readCueInDir + readCueSheetsInFolders + YES @@ -636,7 +662,7 @@ 268 - {{157, 56}, {257, 26}} + {{157, 78}, {257, 26}} YES @@ -701,7 +727,7 @@ 268 - {{157, 23}, {257, 26}} + {{157, 45}, {257, 26}} YES @@ -766,7 +792,7 @@ 268 - {{17, 63}, {129, 17}} + {{17, 85}, {129, 17}} YES @@ -782,7 +808,7 @@ 268 - {{17, 20}, {138, 35}} + {{17, 42}, {138, 35}} YES @@ -795,8 +821,30 @@ + + + 268 + {{18, 18}, {395, 18}} + + YES + + -2080244224 + 0 + Read cue sheets when adding folders to playlist. + + + 1211912703 + 130 + + + + + 200 + 25 + + - {431, 100} + {432, 122} NSView @@ -1349,6 +1397,22 @@ 309 + + + value: values.readCueSheetsInFolders + + + + + + value: values.readCueSheetsInFolders + value + values.readCueSheetsInFolders + 2 + + + 328 + @@ -1793,6 +1857,7 @@ + PlaylistView @@ -1919,6 +1984,20 @@ + + 310 + + + YES + + + + + + 311 + + + @@ -1953,6 +2032,24 @@ 16.ImportedFromIB2 17.IBPluginDependency 17.ImportedFromIB2 + 196.IBPluginDependency + 197.IBPluginDependency + 198.IBPluginDependency + 199.IBPluginDependency + 200.IBPluginDependency + 201.IBPluginDependency + 202.IBPluginDependency + 203.IBPluginDependency + 204.IBPluginDependency + 205.IBPluginDependency + 206.IBPluginDependency + 207.IBPluginDependency + 208.IBPluginDependency + 209.IBPluginDependency + 210.IBPluginDependency + 211.IBPluginDependency + 212.IBPluginDependency + 213.IBPluginDependency 231.IBEditorWindowLastContentRect 231.IBPluginDependency 231.editorWindowContentRectSynchronizationRect @@ -1993,6 +2090,9 @@ 29.ImportedFromIB2 30.IBPluginDependency 30.ImportedFromIB2 + 310.IBPluginDependency + 311.IBPluginDependency + 43.IBEditorWindowLastContentRect 43.IBPluginDependency 43.ImportedFromIB2 44.IBPluginDependency @@ -2069,7 +2169,25 @@ com.apple.InterfaceBuilder.CocoaPlugin - {{449, 587}, {431, 100}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{488, 692}, {432, 122}} com.apple.InterfaceBuilder.CocoaPlugin {{376, 821}, {431, 100}} com.apple.InterfaceBuilder.CocoaPlugin @@ -2110,6 +2228,9 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{468, 859}, {432, 74}} + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2176,7 +2297,7 @@ - 309 + 328 @@ -2221,6 +2342,18 @@ + + GeneralPreferencePane + NSObject + + view + NSView + + + IBProjectSource + GeneralPreferencePane.h + + HotKeyControl NDHotKeyControl @@ -2239,7 +2372,7 @@ HotKeyPane - PreferencePane + GeneralPreferencePane YES @@ -2279,7 +2412,7 @@ HotKeyPane - PreferencePane + GeneralPreferencePane IBUserSource @@ -2301,6 +2434,13 @@ + + NSButton + + IBUserSource + + + NSObject @@ -2317,7 +2457,7 @@ OutputPane - PreferencePane + GeneralPreferencePane takeDeviceID: id @@ -2333,7 +2473,7 @@ OutputPane - PreferencePane + GeneralPreferencePane IBUserSource @@ -2363,35 +2503,6 @@ PlaylistBehaviorArrayController.h - - PrefPaneController - NSObject - - YES - - YES - hotKeyPane - outputPane - playlistView - remoteView - scrobblerView - updatesView - - - YES - HotKeyPane - OutputPane - NSView - NSView - NSView - NSView - - - - IBProjectSource - PrefPaneController.h - - PrefPaneController NSObject @@ -2404,18 +2515,6 @@ - - PreferencePane - NSObject - - view - NSView - - - IBProjectSource - PreferencePane.h - - PreferencePane NSObject diff --git a/Utils/NSString+FinderCompare.h b/Utils/NSString+FinderCompare.h new file mode 100644 index 000000000..7153f3970 --- /dev/null +++ b/Utils/NSString+FinderCompare.h @@ -0,0 +1,18 @@ +/* + * NSString+FinderCompare.h + */ + +#import +#include + +@interface NSString (FinderCompare) + +- (NSComparisonResult)finderCompare:(NSString *)aString; + +@end + +@interface NSURL (FinderCompare) + +- (NSComparisonResult)finderCompare:(NSURL *)aURL; + +@end \ No newline at end of file diff --git a/Utils/NSString+FinderCompare.m b/Utils/NSString+FinderCompare.m new file mode 100644 index 000000000..ea09b22b0 --- /dev/null +++ b/Utils/NSString+FinderCompare.m @@ -0,0 +1,46 @@ +// +// FinderCompare.m +// Created by Pablo Gomez Basanta on 23/7/05. +// From: http://neop.gbtopia.com/?p=27 +// +// Based on: +// http://developer.apple.com/qa/qa2004/qa1159.html +// + +#import "NSString+FinderCompare.h" + + + +@implementation NSString (FinderCompare) + +- (NSComparisonResult)finderCompare:(NSString *)aString +{ + SInt32 compareResult; + + CFIndex lhsLen = [self length];; + CFIndex rhsLen = [aString length]; + + UniChar *lhsBuf = malloc(lhsLen * sizeof(UniChar)); + UniChar *rhsBuf = malloc(rhsLen * sizeof(UniChar)); + + [self getCharacters:lhsBuf]; + [aString getCharacters:rhsBuf]; + + (void) UCCompareTextDefault(kUCCollateComposeInsensitiveMask | kUCCollateWidthInsensitiveMask | kUCCollateCaseInsensitiveMask | kUCCollateDigitsOverrideMask | kUCCollateDigitsAsNumberMask| kUCCollatePunctuationSignificantMask,lhsBuf,lhsLen,rhsBuf,rhsLen,NULL,&compareResult); + + free(lhsBuf); + free(rhsBuf); + + return (CFComparisonResult) compareResult; +} + +@end + +@implementation NSURL (FinderCompare) + +- (NSComparisonResult)finderCompare:(NSURL *)aURL +{ + return [[self absoluteString] finderCompare:[aURL absoluteString]]; +} + +@end