さて利用可能なアプリケーションの一覧を取得する方法がわかったので今度はこれを NSPopUpButtonで表示してみる。
Cocoa Bindings を使いたいところだが、今回はアイコン画像を表示したいので普通にコーディングすることにした(*)。
サンプル:FindingAllApps-2.zip
バンドル内に用意した dummy.jpg を扱えるアプリの一覧がアイコン付きで表示される。
コードはこんな感じ。主要な検証は前回までで済んでいるので、NSPopUpButtonとNSMenuのセットアップが中心。
- (NSArray*)menuItems
{
NSString* path = [[NSBundle mainBundle] pathForImageResource:@"dummy.jpg"];
NSURL* target_url = [NSURL fileURLWithPath:path];
NSArray* app_list = [(NSArray*)LSCopyApplicationURLsForURL((CFURLRef)target_url, kLSRolesAll) autorelease];
NSMutableArray* item_list = [NSMutableArray array];
NSString* display_name;
NSImage * image;
for (NSURL* url in app_list) {
LSCopyDisplayNameForURL((CFURLRef)url, (CFStringRef *)&display_name);
image = [[NSWorkspace sharedWorkspace] iconForFile:[url path]];
[image setSize:NSMakeSize(16, 16)];
NSMenuItem* item = [[[NSMenuItem alloc] init] autorelease];
[item setTitle:display_name];
[item setImage:image];
[item setTarget:self];
[item setAction:@selector(selectApplication:)];
[item setRepresentedObject:
[NSDictionary dictionaryWithObjectsAndKeys:url, @"url", nil]];
[item_list addObject:item];
[display_name release];
}
return item_list;
}
(*) NSPopUpButton+CocoaBindings で画像を表示する。
CocoaBindingsで画像が扱えないことに不満を持った人が他にも居たみたいで、poseAsClass で無理くり?対応させた強者がいた。
Cocoatech: Bindings and NSPopUpButton hack
なるほど。面白い(まねしないけど)。
掲載された画像を見るとどうも同じこと(あるファイルを扱うことのできるアプリ一覧)をやっているようだ。
(ああ PathFinderの作者のページか!)