// // NSWorkspace+Additions.m // Perforce // // Created by Adam Czubernat on 19/11/14. // Copyright (c) 2014 Perforce Software, Inc. All rights reserved. // #import "NSWorkspace+Additions.h" @implementation NSWorkspace (Additions) static CF_RETURNS_RETAINED LSSharedFileListItemRef LSSharedFileListItemForURL(LSSharedFileListRef listRef, NSURL *url) { NSArray *items = CFBridgingRelease(LSSharedFileListCopySnapshot(listRef, &(UInt32){ 0 })); for (id item in items) { LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item; CFURLRef urlRef = NULL; LSSharedFileListItemResolve(itemRef, kLSSharedFileListNoUserInteraction, &urlRef, NULL); NSURL *itemUrl = CFBridgingRelease(urlRef); if (itemUrl && [url isEqual:itemUrl]) return (LSSharedFileListItemRef)CFRetain(itemRef); } return NULL; } - (NSArray *)finderSidebarItems { NSMutableArray *urls = [NSMutableArray array]; LSSharedFileListRef listRef = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL); NSArray *items = CFBridgingRelease(LSSharedFileListCopySnapshot(listRef, &(UInt32){ 0 })); for (id item in items) { LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item; CFURLRef urlRef = NULL; LSSharedFileListItemResolve(itemRef, kLSSharedFileListNoUserInteraction, &urlRef, NULL); NSURL *itemUrl = CFBridgingRelease(urlRef); if (itemUrl) [urls addObject:itemUrl]; } CFRelease(listRef); return urls; } - (void)insertFinderSidebarItem:(NSURL *)itemUrl afterItem:(NSURL *)afterItemUrl { LSSharedFileListRef listRef = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL); LSSharedFileListItemRef itemRef, afterItemRef = LSSharedFileListItemForURL(listRef, afterItemUrl); itemRef = LSSharedFileListInsertItemURL(listRef, afterItemRef ?: kLSSharedFileListItemLast, NULL, NULL, (__bridge CFURLRef)itemUrl, NULL, NULL); if (itemRef) CFRelease(itemRef); if (afterItemRef) CFRelease(afterItemRef); CFRelease(listRef); } - (void)removeFinderSidebarItem:(NSURL *)itemUrl { LSSharedFileListRef listRef = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL); LSSharedFileListItemRef itemRef = LSSharedFileListItemForURL(listRef, itemUrl); if (itemRef) { LSSharedFileListItemRemove(listRef, itemRef); CFRelease(itemRef); } CFRelease(listRef); } //// Explicit implementation // //- (NSArray *)finderSidebarItems { // NSMutableArray *urls = [NSMutableArray array]; // LSSharedFileListRef listRef = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL); // UInt32 seed; // CFArrayRef itemsRef = LSSharedFileListCopySnapshot(listRef, &seed); // for (CFIndex i = 0; i < CFArrayGetCount(itemsRef); i++) { // LSSharedFileListItemRef item = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(itemsRef, i); // if (!item) // continue; // CFURLRef urlRef = NULL; // LSSharedFileListItemResolve(item, kLSSharedFileListNoUserInteraction, &urlRef, NULL); // if (!urlRef) // continue; // [urls addObject:(__bridge NSURL *)urlRef]; // CFRelease(urlRef); // } // CFRelease(itemsRef); // CFRelease(listRef); // return urls; //} @end