"].location != NSNotFound) {
+ return NoResultsPage;
+ } else {
+ return ResultsPage;
+ }
+ }
+ if ([page rangeOfString:@"
"].location != NSNotFound) {
+ return LyricsPage;
+ }
+ return UnknownPage;
+}
+
+-(SearchResult*) searchResultFromLyricsPage: (NSString *) page atURL: (NSURL *) url{
+ int headingStart = NSMaxRange([page rangeOfString:@"
"]);
+ int headingEnd = [page rangeOfString:@"
"].location;
+ int artistStart = NSMaxRange([page rangeOfString:@">" options:NSCaseInsensitiveSearch range:NSMakeRange(headingStart, headingEnd-headingStart)]);
+ NSRange artistEndTag = [page rangeOfString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(artistStart, headingEnd-artistStart)];
+ int artistEnd = artistEndTag.location;
+ int songNameStart = NSMaxRange(artistEndTag);
+ int songNameEnd = headingEnd;
+ NSString *artist = [page substringWithRange:NSMakeRange(artistStart, artistEnd-artistStart)];
+ NSString *songName = [page substringWithRange:NSMakeRange(songNameStart, songNameEnd-songNameStart)];
+ //Remove the " Lyric" and the " – " from the Song name
+ songName = [[songName substringToIndex:[songName length]-[@" Lyric" length]] substringFromIndex:[@" – " length]];
+ NSString *preview = [self lyricsFromPage:page];
+ return [[SearchResult alloc]initWithName:songName fromArtist:artist preview:preview link:url];
+}
+
+-(NSArray*) searchResultsFromPage: (NSString *) page {
+ int resultsTableStart = NSMaxRange([page rangeOfString:@"
"]);
+ int resultsTableEnd = [page rangeOfString:@"
"].location;
+ NSArray *resultTags = [self resultTagsFromTable:[page substringWithRange:NSMakeRange(resultsTableStart, resultsTableEnd-resultsTableStart)]];
+ NSMutableArray *searchResults = [[NSMutableArray alloc] init];
+ for (NSString *tag in resultTags) {
+ [searchResults addObject:[self searchResultFromResultTag:tag]];
+ }
+ //Increase loadedResults by 10 which is a full results site
+ //Even if there are less than 10 results on a page (would not have any effect)
+ loadedResults += 10;
+ return searchResults;
+}
+
+-(NSArray*) resultTagsFromTable: (NSString *) table {
+ NSRange restRange = NSMakeRange(0, [table length]);
+ NSMutableArray *tags = [[NSMutableArray alloc] init];
+ NSUInteger currentIndex = [table rangeOfString:@"
"].location;
+ while (currentIndex != NSNotFound) {
+ int startIndex = currentIndex + [@" | " length];
+ int endIndex = [table rangeOfString:@" | " options:NSCaseInsensitiveSearch range:restRange].location;
+ NSRange tagRange = NSMakeRange(startIndex, endIndex-startIndex);
+ [tags addObject:[table substringWithRange:tagRange]];
+ restRange = [self restRangeFromString:table subtractingRange:tagRange];
+ restRange.length -= [@"" length];
+ restRange.location += [@"" length];
+ currentIndex = [table rangeOfString:@"
" options:NSCaseInsensitiveSearch range:restRange].location;
+ }
+ return tags;
+}
+
+-(SearchResult*) searchResultFromResultTag: (NSString *) tag {
+ NSRange artistStartRange = [tag rangeOfString:@">"];
+ int artistEndIndex = [tag rangeOfString:@"<" options:NSCaseInsensitiveSearch range:[self restRangeFromString:tag subtractingRange:artistStartRange]].location;
+ int artistStartIndex = NSMaxRange(artistStartRange);
+ NSString *artist = [tag substringWithRange:NSMakeRange(artistStartIndex, artistEndIndex-artistStartIndex)];
+
+ NSRange restRange = [self restRangeFromString:tag subtractingRange:NSMakeRange(artistEndIndex, [@"" length])];
+ NSRange songNameTagStartRange = [tag rangeOfString:@"" options:NSCaseInsensitiveSearch range:[self restRangeFromString:tag subtractingRange:songNameTagStartRange]]);
+ int songNameEnd = [tag rangeOfString:@"" options:NSCaseInsensitiveSearch range:[self restRangeFromString:tag subtractingRange:songNameTagStartRange]].location;
+ NSString *songName = [tag substringWithRange:NSMakeRange(songNameStart, songNameEnd-songNameStart)];
+ int previewStart = songNameEnd + [@"" length] + [@"\n " length];
+ NSRange previewRestRange = NSMakeRange(previewStart, [tag length]-previewStart);
+ int previewEnd = [tag rangeOfString:@" " options:NSCaseInsensitiveSearch range:previewRestRange].location;
+ NSString *preview = [self stringByRemovingHTMLTags:[tag substringWithRange:NSMakeRange(previewStart, previewEnd-previewStart)]];
+ return [[SearchResult alloc] initWithName:songName fromArtist:artist preview:preview link:link];
+}
+
+-(NSURL*) urlFromHref: (NSString *) link {
+ if ([link hasPrefix:@"/"]) {
+ return [NSURL URLWithString:[NSString stringWithFormat:@"http://www.Magistrix.de%@", link]];
+ } else {
+ return [NSURL URLWithString:link];
+ }
+}
+
+-(NSString*) stringByRemovingHTMLTags: (NSString *)string {
+ return [[[[[[[[[[string stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""] stringByReplacingOccurrencesOfString:@""" withString:@"\""];
+}
+
+-(NSRange) restRangeFromString: (NSString *) page subtractingRange: (NSRange) aRange {
+ int loc = NSMaxRange(aRange);
+ return NSMakeRange(loc, [page length]-loc);
+}
+
+-(void) shouldSetResultCountFromPage: (NSString *) page {
+ if (resultCount == 0) {
+ //Nothing loaded before
+ NSRange resultsLabelStartRange = [page rangeOfString:@"Ergebnisse 1 bis "];
+ int resultsLabelEnd = [page rangeOfString:@" " options:NSCaseInsensitiveSearch range:[self restRangeFromString:page subtractingRange:resultsLabelStartRange]].location;
+ NSString *resultsLabel = [page substringWithRange:NSMakeRange(NSMaxRange(resultsLabelStartRange), resultsLabelEnd-resultsLabelStartRange.location)];
+ if ([resultsLabel rangeOfString:@"ungefähr"].location != NSNotFound){
+ //Needs not more than 100 which means 10 sites (which is the maximum)
+ resultCount = 100;
+ } else {
+ int resultsStart = NSMaxRange([resultsLabel rangeOfString:@"von "]);
+ int resultsEnd = [resultsLabel rangeOfString:@"<"].location;
+ NSString *results = [resultsLabel substringWithRange:NSMakeRange(resultsStart, resultsEnd-resultsStart)];
+ resultCount = [results intValue];
+ }
+ if (resultCount > 100) {
+ resultCount = 100;
+ }
+ }
+}
+
+-(void) resetLoadedResults {
+ loadedResults = 0;
+}
+
+-(Lyrics*) lyricsBySearchResult: (SearchResult *) result {
+ NSError *error = nil;
+ NSString *page = [NSString stringWithContentsOfURL:[result link] encoding:NSUTF8StringEncoding error:&error];
+ if (error) {
+ return nil;
+ }
+ NSString *lyrics = [self lyricsFromPage:page];
+ return [[Lyrics alloc] initWithName:[result name] byArtist:[result artist] withLyrics:lyrics];
+}
+
+
+-(NSString *) lyricsFromPage: (NSString *)page {
+ int lyricsStart = NSMaxRange([page rangeOfString:@""]) + [@"\n" length];
+ NSRange restRange = NSMakeRange(lyricsStart, [page length]-lyricsStart);
+ int lyricsEnd = [page rangeOfString:@" " options:NSCaseInsensitiveSearch range:restRange].location;
+ NSString *lyrics = [self stringByRemovingHTMLTags:[page substringWithRange:NSMakeRange(lyricsStart, lyricsEnd-lyricsStart)]];
+ return lyrics;
+}
+@end
diff --git a/iLyrics/MainController.h b/iLyrics/MainController.h
new file mode 100644
index 0000000..fd34377
--- /dev/null
+++ b/iLyrics/MainController.h
@@ -0,0 +1,46 @@
+//
+// MainController.h
+// iLyrics
+//
+// Created by Kim Wittenburg on 10.06.12.
+// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import
+#import
+#import
+#import
+#import "iTunes.h"
+#import "Magistrix.h"
+#import "SearchResult.h"
+#import "Lyrics.h"
+#import
+
+@interface MainController : NSObject
+@property (weak) IBOutlet NSMenuItem *iLyricsMenuItem;
+@property (unsafe_unretained) IBOutlet NSWindow *window;
+@property (weak) IBOutlet NSSearchField *searchField;
+@property (weak) IBOutlet NSOutlineView *resultsOutline;
+@property (weak) IBOutlet NSButton *loadMoreResultsButton;
+@property (weak) IBOutlet NSButton *showPreviewCheckBox;
+@property (weak) IBOutlet NSPopover *previewPopover;
+@property (unsafe_unretained) IBOutlet NSTextView *previewTextArea;
+@property (weak) IBOutlet NSTextField *songLabel;
+@property (weak) IBOutlet NSTextField *artistLabel;
+@property (weak) IBOutlet NSButton *sendToiTunesButton;
+@property (weak) IBOutlet NSButton *downloadLyricsButton;
+@property (unsafe_unretained) IBOutlet NSTextView *lyricsArea;
+@property (readonly) Lyrics *currentLyrics;
+
+- (IBAction)getCurrentiTunesSong:(id)sender;
+- (IBAction)startNewSearch:(id)sender;
+- (IBAction)loadNextResults:(id)sender;
+- (IBAction)resetLoadedResults:(id)sender;
+- (IBAction)lyricsSelectionChanged:(NSOutlineView *)sender;
+- (IBAction)sendLyricsToiTunes:(id)sender;
+- (IBAction)downloadLyrics:(id)sender;
+- (IBAction)showiLyricsWindow:(id)sender;
+- (void)saveToDefalts: (NSUserDefaults *)defaults;
+- (void)loadFromDefaults: (NSUserDefaults *)defaults;
+
+@end
diff --git a/iLyrics/MainController.m b/iLyrics/MainController.m
new file mode 100644
index 0000000..cff1b22
--- /dev/null
+++ b/iLyrics/MainController.m
@@ -0,0 +1,283 @@
+//
+// MainController.m
+// iLyrics
+//
+// Created by Kim Wittenburg on 10.06.12.
+// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import "MainController.h"
+
+@implementation MainController {
+ NSMutableArray *data;
+ id currentHoster;
+ BOOL lyricsSelected;
+ NSInteger selectedSavePanelButton;
+ NSURL *saveFile;
+ iTunesApplication *iTunes;
+ Lyrics *currentLyrics;
+ int selectedRow;
+}
+@synthesize iLyricsMenuItem;
+@synthesize window;
+@synthesize searchField;
+@synthesize resultsOutline;
+@synthesize loadMoreResultsButton;
+@synthesize showPreviewCheckBox;
+@synthesize previewPopover;
+@synthesize previewTextArea;
+@synthesize songLabel;
+@synthesize artistLabel;
+@synthesize sendToiTunesButton;
+@synthesize downloadLyricsButton;
+@synthesize lyricsArea;
+
+
+-(id)init {
+ iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
+ data = [[NSMutableArray alloc] init];
+ currentHoster = [[Magistrix alloc] init];
+ return [super init];
+}
+
+#pragma mark -
+#pragma mark Outline view Data Source and Delegate
+-(NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
+ return item == nil ? [data count] : 0;
+}
+
+-(id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
+ return [data objectAtIndex:index];
+}
+
+-(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
+ return NO;
+}
+
+-(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
+ if ([[tableColumn identifier] isEqualToString:@"song"]) {
+ return [item name];
+ } else {
+ return [item artist];
+ }
+ return nil;
+}
+
+
+-(NSString *)outlineView:(NSOutlineView *)outlineView toolTipForCell:(NSCell *)cell rect:(NSRectPointer)rect tableColumn:(NSTableColumn *)tableColumn item:(id)item mouseLocation:(NSPoint)mouseLocation {
+ //item is an instance of SearchResult
+ [self shouldShowPreviewForCellRect:*rect searchResult:item];
+ return nil;
+}
+
+#pragma mark -
+#pragma mark Responding to Lyrics Search
+
+- (IBAction)getCurrentiTunesSong:(id)sender {
+ iTunesTrack *track = [iTunes currentTrack];
+ if (track == nil) {
+ NSBeginAlertSheet(NSLocalizedString(@"iTunes.messages.iTunesIdle.title", @""), NSLocalizedString(@"OK", @""), nil, nil, window, nil, nil, nil, nil, NSLocalizedString(@"iTunes.messages.iTunesIdle.detail", @""));
+ return;
+ }
+ NSString *name = [track name];
+ NSString *artist = [track artist];
+ if (name == nil) {
+ NSBeginAlertSheet(NSLocalizedString(@"iTunes.messages.noTrackPlaying.title", @""), NSLocalizedString(@"OK", @""), nil, nil, window, nil, nil, nil, nil, NSLocalizedString(@"iTunes.messages.noTrackPlaying.detail", @""));
+ return;
+ }
+ NSString *searchText = [NSString stringWithFormat:@"%@ - %@", name, artist];
+ [searchField setStringValue:searchText];
+ [searchField performClick:sender];
+}
+
+- (IBAction)startNewSearch:(id)sender {
+ [self resetLoadedResults:sender];
+ if ([[searchField stringValue] length] > 0) {
+ [currentHoster startNewSearchForQuery:[searchField stringValue]];
+ [self loadNextResults:sender];
+ }
+}
+
+- (IBAction)loadNextResults:(id)sender {
+ NSArray *nextResults = [currentHoster nextResults];
+ if (nextResults == nil) {
+ NSRunCriticalAlertPanel(NSLocalizedString(@"Hoster.messages.networkError.title", @""), NSLocalizedString(@"Hoster.messages.networkError.detail", @""), NSLocalizedString(@"OK", @""), nil, nil);
+ return;
+ }
+ if ([nextResults count] == 0) {
+ NSRunAlertPanel(NSLocalizedString(@"Hoster.messages.noResults.title", @""), NSLocalizedString(@"Hoster.messages.noResults.detail", @""), NSLocalizedString(@"OK", @""), nil, nil);
+ return;
+ }
+ [data addObjectsFromArray:nextResults];
+ [resultsOutline reloadData];
+ [loadMoreResultsButton setEnabled:[currentHoster hasMoreResults]];
+}
+
+-(IBAction)resetLoadedResults:(id)sender {
+ [currentHoster resetLoadedResults];
+ [data removeAllObjects];
+ [resultsOutline reloadData];
+ [loadMoreResultsButton setEnabled:[currentHoster hasMoreResults]];
+ [self lyricsSelectionChanged:resultsOutline];
+}
+
+- (IBAction)lyricsSelectionChanged:(NSOutlineView *)sender {
+ int index = [sender selectedRow];
+ if (index < 0) {
+ lyricsSelected = NO;
+ currentLyrics = nil;
+ NSString *noSelectionText = NSLocalizedString(@"iLyrics.text.noSelection", @"");
+ [songLabel setStringValue:noSelectionText];
+ [artistLabel setStringValue:noSelectionText];
+ [lyricsArea setString:noSelectionText];
+ [lyricsArea setEditable:NO];
+ } else {
+ if (selectedRow != index) {
+ lyricsSelected = YES;
+ SearchResult *result = [data objectAtIndex:index];
+ Lyrics *lyrics = [currentHoster lyricsBySearchResult:result];
+ currentLyrics = lyrics;
+ if (lyrics == nil) {
+ NSRunCriticalAlertPanel(NSLocalizedString(@"Hoster.messages.networkError.title", @""), NSLocalizedString(@"Hoster.messages.networkError.detail", @""), NSLocalizedString(@"OK", @""), nil, nil);
+ NSString *noNetwork = NSLocalizedString(@"Hoster.text.noNetwork", @"");
+ [songLabel setStringValue:noNetwork];
+ [artistLabel setStringValue:noNetwork];
+ [lyricsArea setString:noNetwork];
+ [lyricsArea setEditable:NO];
+ }
+ [songLabel setStringValue:[lyrics name]];
+ [artistLabel setStringValue:[lyrics artist]];
+ [lyricsArea setString:[lyrics lyrics]];
+ [lyricsArea setEditable:YES];
+ }
+ }
+ selectedRow = index;
+ [window update];
+}
+
+-(void) shouldShowPreviewForCellRect: (NSRect) rect searchResult: (SearchResult *) result {
+ if ([showPreviewCheckBox state] == NSOnState) {
+ NSString *lyrics = [result preview];
+ if (lyrics) {
+ rect.size.width = [resultsOutline frame].size.width;
+ [previewTextArea setString:lyrics];
+ [previewPopover showRelativeToRect:rect ofView:resultsOutline preferredEdge:NSMaxXEdge];
+ }
+ }
+}
+
+- (IBAction)sendLyricsToiTunes:(id)sender {
+ iTunesTrack *track = [iTunes currentTrack];
+ NSString *name = [track name];
+ if (name == nil) {
+ NSBeginAlertSheet(NSLocalizedString(@"iTunes.messages.noTrackPlaying.title", @""), NSLocalizedString(@"OK", @""), nil, nil, window, nil, nil, nil, nil, NSLocalizedString(@"iTunes.messages.noTrackPlaying.detail", @""));
+ return;
+ }
+ NSString *oldLyrics = [track lyrics];
+ if (oldLyrics != nil && [oldLyrics length] > 0) {
+ NSBeginAlertSheet(NSLocalizedString(@"iTunes.messages.replaceLyrics.title", @""), NSLocalizedString(@"Yes", @""), NSLocalizedString(@"No", @""), nil, window, self, @selector(replaceLyricsSheetDidEnd:returnCode:contextInfo:), nil, nil, NSLocalizedString(@"iTunes.messages.replaceLyrics.detail", @""));
+ } else {
+ [self replaceLyricsSheetDidEnd:nil returnCode:NSAlertDefaultReturn contextInfo:nil];
+ }
+}
+
+- (void)replaceLyricsSheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo {
+ if (returnCode == NSAlertDefaultReturn) {
+ [[iTunes currentTrack] setLyrics:[lyricsArea string]];
+ [GrowlApplicationBridge notifyWithTitle:NSLocalizedString(@"Growl.messages.lyricsSent.title", @"") description:NSLocalizedString(@"Growl.messages.lyricsSent.detail", @"") notificationName:@"Lyrics sent to iTunes" iconData:nil priority:0 isSticky:NO clickContext:nil];
+ }
+}
+
+- (IBAction)downloadLyrics:(id)sender {
+ NSSavePanel *savePanel = [NSSavePanel savePanel];
+ [savePanel setAllowedFileTypes:[NSArray arrayWithObject:@"txt"]];
+ [savePanel setAllowsOtherFileTypes:YES];
+ [savePanel setCanSelectHiddenExtension:YES];
+ [savePanel setExtensionHidden:YES];
+ [savePanel setNameFieldStringValue:[currentLyrics name]];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(savePanelDidClose:) name:NSWindowDidEndSheetNotification object:window];
+ void (^handler) (NSInteger) = ^(NSInteger result) {
+ selectedSavePanelButton = result;
+ saveFile = [savePanel URL];
+ };
+ [savePanel beginSheetModalForWindow:window completionHandler:handler];
+}
+
+-(void) savePanelDidClose: (NSNotification *) notification{
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidEndSheetNotification object:window];
+ if (selectedSavePanelButton == NSOKButton) {
+ BOOL success = [[[lyricsArea string] dataUsingEncoding:NSUTF8StringEncoding] writeToURL:saveFile atomically:NO];
+ if (!success) {
+ NSBeginAlertSheet(NSLocalizedString(@"messages.error.saveLyrics.title", @""), NSLocalizedString(@"OK", @""), nil, nil, window, nil, nil, nil, nil, NSLocalizedString(@"messages.error.saveLyrics.detail", @""));
+ } else {
+ [GrowlApplicationBridge notifyWithTitle:NSLocalizedString(@"Growl.messages.lyricsSaved.title", @"") description:[NSString stringWithFormat:NSLocalizedString(@"Growl.messages.lyricsSaved.detail", @""), [saveFile path]] notificationName:@"Lyrics saved to File" iconData:nil priority:0 isSticky:NO clickContext:nil];
+ }
+ }
+}
+
+-(Lyrics *)currentLyrics {
+ return currentLyrics;
+}
+
+#pragma mark -
+#pragma mark Show the window
+
+- (IBAction)showiLyricsWindow:(id)sender {
+ [window makeKeyAndOrderFront:sender];
+}
+
+#pragma mark window delegate
+
+-(BOOL)validateMenuItem:(NSMenuItem *)menuItem {
+ return [self validateUserInterfaceItem:menuItem];
+}
+
+-(BOOL)validateToolbarItem:(NSToolbarItem *)theItem {
+ return [self validateUserInterfaceItem:theItem];
+}
+
+-(BOOL)validateUserInterfaceItem:(id)item {
+ SEL action = [item action];
+ if (action == @selector(downloadLyrics:)) {
+ [downloadLyricsButton setEnabled:lyricsSelected];
+ return lyricsSelected;
+ }
+ if (action == @selector(sendLyricsToiTunes:)) {
+ BOOL enabled = lyricsSelected && [iTunes isRunning];
+ [sendToiTunesButton setEnabled:enabled];
+ return enabled;
+ }
+ if (action == @selector(getCurrentiTunesSong:)) {
+ return [iTunes isRunning];
+ }
+ if (action == @selector(showPreview:)) {
+ return [resultsOutline clickedRow] >= 0;
+ }
+ return [self respondsToSelector:[item action]];
+}
+
+-(void)windowDidBecomeMain:(NSNotification *)notification {
+ [iLyricsMenuItem setOffStateImage:nil];
+ [iLyricsMenuItem setState:NSOnState];
+}
+
+-(void)windowDidResignMain:(NSNotification *)notification {
+ [iLyricsMenuItem setOffStateImage:nil];
+ [iLyricsMenuItem setState:NSOffState];
+}
+
+-(void)windowDidMiniaturize:(NSNotification *)notification {
+ NSString *imgPath = [[NSBundle mainBundle] pathForImageResource:@"Diamond"];
+ NSImage *miniaturizedImage = [[NSImage alloc] initWithContentsOfFile:imgPath];
+ [iLyricsMenuItem setOffStateImage:miniaturizedImage];
+ [iLyricsMenuItem setState:NSOffState];
+}
+
+-(void)saveToDefalts:(NSUserDefaults *)defaults {
+ [defaults setBool:[showPreviewCheckBox state] == NSOnState forKey:@"Show preview"];
+}
+
+-(void)loadFromDefaults:(NSUserDefaults *)defaults {
+ [showPreviewCheckBox setState:[defaults boolForKey:@"Show preview"]?NSOnState:NSOffState];
+}
+@end
diff --git a/iLyrics/PreferencesController.h b/iLyrics/PreferencesController.h
new file mode 100644
index 0000000..b1ca4c7
--- /dev/null
+++ b/iLyrics/PreferencesController.h
@@ -0,0 +1,20 @@
+//
+// PreferencesController.h
+// iLyrics
+//
+// Created by Kim Wittenburg on 14.06.12.
+// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import
+#import "LyricsHoster.h"
+
+@interface PreferencesController : NSObject
+
+@property (weak) IBOutlet NSTableView *hosterTable;
+@property NSArray *hosters;
+
+-(void) addHoster: (id) hoster;
+-(void) removeHoster: (id) hoster;
+
+@end
diff --git a/iLyrics/PreferencesController.m b/iLyrics/PreferencesController.m
new file mode 100644
index 0000000..ec846e6
--- /dev/null
+++ b/iLyrics/PreferencesController.m
@@ -0,0 +1,64 @@
+//
+// PreferencesController.m
+// iLyrics
+//
+// Created by Kim Wittenburg on 14.06.12.
+// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import "PreferencesController.h"
+
+@implementation PreferencesController {
+ NSMutableArray *hosters;
+}
+@synthesize hosterTable;
+
+-(id)init {
+ hosters = [[NSMutableArray alloc] init];
+ return [super init];
+}
+
+#pragma mark -
+#pragma mark Properties
+
+-(NSArray *)hosters {
+ return hosters;
+}
+
+-(void)setHosters:(NSArray *)hstrs {
+ hosters = [NSMutableArray arrayWithArray:hstrs];
+ [hosterTable reloadData];
+}
+
+#pragma mark Modifying hosters
+
+-(void)addHoster:(id)hoster {
+ [hosters addObject:hoster];
+ [hosterTable reloadData];
+}
+
+-(void)removeHoster:(id)hoster {
+ [hosters removeObject:hoster];
+ [hosterTable reloadData];
+}
+
+#pragma mark -
+#pragma mark Table Data Source
+-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
+ return [hosters count];
+}
+
+-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
+ if ([[tableColumn identifier] isEqualToString:@"hoster"]) {
+ return [[hosters objectAtIndex:row] name];
+ } else {
+ NSDate *version = [[hosters objectAtIndex:row] hosterVersion];
+ NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
+ [dateFormatter setDateStyle:NSDateFormatterLongStyle];
+ [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
+ return [dateFormatter stringFromDate:version];
+ // return desc == nil ? NSLocalizedString(@"iLyrics.text.illegalDateFormat", @"") : desc;
+ }
+}
+
+@end
diff --git a/iLyrics/SearchResult.h b/iLyrics/SearchResult.h
new file mode 100644
index 0000000..266b85c
--- /dev/null
+++ b/iLyrics/SearchResult.h
@@ -0,0 +1,19 @@
+//
+// SearchResult.h
+// iLyrics
+//
+// Created by Kim Wittenburg on 10.06.12.
+// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import
+
+@interface SearchResult : NSObject
+@property NSString *name;
+@property NSString *artist;
+@property NSString *preview;
+@property id link;
+
+-(id)initWithName: (NSString*) name fromArtist: (NSString*) artist preview: (NSString*) preview link: (id) link;
+
+@end
diff --git a/iLyrics/SearchResult.m b/iLyrics/SearchResult.m
new file mode 100644
index 0000000..f6eb15b
--- /dev/null
+++ b/iLyrics/SearchResult.m
@@ -0,0 +1,25 @@
+//
+// SearchResult.m
+// iLyrics
+//
+// Created by Kim Wittenburg on 10.06.12.
+// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import "SearchResult.h"
+
+@implementation SearchResult
+@synthesize name;
+@synthesize artist;
+@synthesize preview;
+@synthesize link;
+
+-(id)initWithName:(NSString *)sng fromArtist:(NSString *)art preview:(NSString *)pre link:(id)l {
+ name = sng;
+ artist = art;
+ preview = pre;
+ link = l;
+ return self;
+}
+
+@end
diff --git a/iLyrics/de.lproj/Credits.rtf b/iLyrics/de.lproj/Credits.rtf
new file mode 100644
index 0000000..405b985
--- /dev/null
+++ b/iLyrics/de.lproj/Credits.rtf
@@ -0,0 +1,19 @@
+{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\paperw11900\paperh16840\vieww9600\viewh8400\viewkind0
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\b\fs24 \cf0 Entwickelt von:
+\b0 \
+ Kim Wittenburg\
+\
+
+\b Designed von:
+\b0 \
+ Kim Wittenburg\
+\
+
+\b Getestet von:
+\b0 \
+ Kim Wittenbug}
\ No newline at end of file
diff --git a/iLyrics/en.lproj/Credits.rtf b/iLyrics/en.lproj/Credits.rtf
index 46576ef..21fb96a 100644
--- a/iLyrics/en.lproj/Credits.rtf
+++ b/iLyrics/en.lproj/Credits.rtf
@@ -1,29 +1,19 @@
-{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
+{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\paperw9840\paperh8400
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+\paperw11900\paperh16840\vieww9600\viewh8400\viewkind0
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
\f0\b\fs24 \cf0 Engineering:
\b0 \
- Some people\
+ Kim Wittenburg\
\
\b Human Interface Design:
\b0 \
- Some other people\
+ Kim Wittenburg\
\
\b Testing:
\b0 \
- Hopefully not nobody\
-\
-
-\b Documentation:
-\b0 \
- Whoever\
-\
-
-\b With special thanks to:
-\b0 \
- Mom\
-}
+ Kim Wittenbug}
\ No newline at end of file
diff --git a/iLyrics/en.lproj/MainMenu.xib b/iLyrics/en.lproj/MainMenu.xib
index ce5b9af..f26ad82 100644
--- a/iLyrics/en.lproj/MainMenu.xib
+++ b/iLyrics/en.lproj/MainMenu.xib
@@ -2,20 +2,41 @@
1070
- 11C42
- 1938
- 1138.17
- 567.00
+ 11E53
+ 2182
+ 1138.47
+ 569.00
- NSWindowTemplate
- NSView
+ NSTableHeaderView
NSMenu
- NSMenuItem
+ NSToolbarItem
+ NSButton
+ NSToolbarFlexibleSpaceItem
NSCustomObject
+ NSSplitView
+ NSTableView
+ NSViewController
+ NSCustomView
+ NSSearchField
+ NSTextField
+ NSSearchFieldCell
+ NSWindowTemplate
+ NSTextFieldCell
+ NSButtonCell
+ NSTableColumn
+ NSToolbarSpaceItem
+ NSView
+ NSOutlineView
+ NSToolbar
+ NSScrollView
+ NSPopover
+ NSTextView
+ NSMenuItem
+ NSScroller
com.apple.InterfaceBuilder.CocoaPlugin
@@ -698,483 +719,6 @@
-
+
+
+
_NSWindowsMenu
@@ -1292,27 +940,1272 @@
+
+ 15
+ 2
+ {{163, 199}, {480, 270}}
+ 1685586944
+ iLyrics Preferences
+ NSWindow
+
+
+
256
- {480, 360}
+
+
+
+ 268
+ {{18, 234}, {233, 18}}
+
+
+ _NS:9
+ YES
+
+ -2080244224
+ 0
+ Quit when all windows are closed
+
+ _NS:9
+
+ 1211912703
+ 2
+
+
+
+
+ 200
+ 25
+
+
+
+
+ 268
+
+
+
+ 2304
+
+
+
+ 256
+ {438, 171}
+
+
+ _NS:13
+ YES
+
+
+
+ -2147483392
+ {{224, 0}, {16, 17}}
+
+ _NS:19
+
+
+
+ hoster
+ 272.64453125
+ 40
+ 1000
+
+
+ 337772097
+ 272631808
+ Text
+
+ _NS:9
+
+
+
+
+ 3
+ YES
+
+
+
+ version
+ 158.62890625
+ 10
+ 3.4028234663852886e+38
+
+
+ 337772097
+ 272631808
+ Text
+
+ _NS:9
+
+
+
+
+ 3
+ YES
+
+
+
+ 3
+ 2
+
+
+ 17
+ -692060160
+
+
+ 2
+ 15
+ 0
+ YES
+ 0
+ 1
+
+
+ {{1, 17}, {438, 171}}
+
+
+ _NS:11
+
+
+ 4
+
+
+
+ -2147483392
+ {{224, 17}, {15, 102}}
+
+
+ _NS:58
+
+ _doScroller:
+ 0.9941860465116279
+
+
+
+ -2147483392
+ {{1, 173}, {438, 15}}
+
+ _NS:60
+ 1
+
+ _doScroller:
+ 0.97986577181208057
+
+
+
+ 2304
+
+
+
+ {{1, 0}, {438, 17}}
+
+
+
+
+ 4
+
+
+ {{20, 14}, {440, 189}}
+
+
+ _NS:9
+ 133682
+
+
+
+
+ QSAAAEEgAABBmAAAQZgAAA
+
+
+
+ 268
+ {{17, 211}, {93, 17}}
+
+
+ _NS:1505
+ YES
+
+ 68288064
+ 272630784
+ Lyrics Hosters
+
+ _NS:1505
+
+
+
+
+
+
+ {480, 270}
+
+ _NS:20
- {{0, 0}, {1920, 1178}}
+ {{0, 0}, {1680, 1028}}
{10000000000000, 10000000000000}
YES
+
+
+
+ 268
+
+
+
+ 268
+ {{195, -1}, {108, 19}}
+
+ _NS:9
+ YES
+
+ -2080244224
+ 134217728
+ Done
+
+ LucidaGrande
+ 12
+ 16
+
+ _NS:9
+
+ -2038152961
+ 164
+
+
+ 400
+ 75
+
+
+
+
+ 256
+
+
+
+ 2304
+
+
+
+ 2322
+ {301, 14}
+
+
+ _NS:13
+
+
+
+
+
+
+
+
+
+
+
+ 134
+
+
+
+ 301
+ 1
+
+
+ 67112865
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+ 6
+ {463, 10000000}
+ {223, 0}
+
+
+
+ {{1, 1}, {301, 170}}
+
+
+ _NS:11
+
+
+
+ {4, 5}
+
+ 79691776
+
+
+
+
+
+ file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff
+
+
+
+
+
+
+ 4
+
+
+
+ 256
+ {{287, 1}, {15, 170}}
+
+
+ _NS:84
+
+ _doScroller:
+ 1
+ 0.85256409645080566
+
+
+
+ -2147483392
+ {{-100, -100}, {87, 18}}
+
+
+ _NS:33
+ 1
+
+ _doScroller:
+ 1
+ 0.94565218687057495
+
+
+ {{0, 20}, {303, 172}}
+
+
+ _NS:9
+ 133138
+
+
+
+
+
+ {303, 192}
+
+ _NS:9
+ NSView
+
+
+
+ 0
+ 1
+ 0.0
+ 0.0
+ YES
+
AppDelegate
NSFontManager
+
+ MainController
+
+
+ PreferencesController
+
@@ -1492,14 +2385,6 @@
240
-
-
- performFindPanelAction:
-
-
-
- 241
-
centerSelectionInVisibleArea:
@@ -1612,134 +2497,6 @@
374
-
-
- raiseBaseline:
-
-
-
- 426
-
-
-
- lowerBaseline:
-
-
-
- 427
-
-
-
- copyFont:
-
-
-
- 428
-
-
-
- subscript:
-
-
-
- 429
-
-
-
- superscript:
-
-
-
- 430
-
-
-
- tightenKerning:
-
-
-
- 431
-
-
-
- underline:
-
-
-
- 432
-
-
-
- orderFrontColorPanel:
-
-
-
- 433
-
-
-
- useAllLigatures:
-
-
-
- 434
-
-
-
- loosenKerning:
-
-
-
- 435
-
-
-
- pasteFont:
-
-
-
- 436
-
-
-
- unscript:
-
-
-
- 437
-
-
-
- useStandardKerning:
-
-
-
- 438
-
-
-
- useStandardLigatures:
-
-
-
- 439
-
-
-
- turnOffLigatures:
-
-
-
- 440
-
-
-
- turnOffKerning:
-
-
-
- 441
-
toggleAutomaticSpellingCorrection:
@@ -1836,110 +2593,6 @@
493
-
-
- alignCenter:
-
-
-
- 518
-
-
-
- pasteRuler:
-
-
-
- 519
-
-
-
- toggleRuler:
-
-
-
- 520
-
-
-
- alignRight:
-
-
-
- 521
-
-
-
- copyRuler:
-
-
-
- 522
-
-
-
- alignJustified:
-
-
-
- 523
-
-
-
- alignLeft:
-
-
-
- 524
-
-
-
- makeBaseWritingDirectionNatural:
-
-
-
- 525
-
-
-
- makeBaseWritingDirectionLeftToRight:
-
-
-
- 526
-
-
-
- makeBaseWritingDirectionRightToLeft:
-
-
-
- 527
-
-
-
- makeTextWritingDirectionNatural:
-
-
-
- 528
-
-
-
- makeTextWritingDirectionLeftToRight:
-
-
-
- 529
-
-
-
- makeTextWritingDirectionRightToLeft:
-
-
-
- 530
-
performFindPanelAction:
@@ -1950,43 +2603,19 @@
- addFontTrait:
-
-
+ performFindPanelAction:
+
+
- 421
+ 241
-
- addFontTrait:
-
-
+
+ delegate
+
+
- 422
-
-
-
- modifyFont:
-
-
-
- 423
-
-
-
- orderFrontFontPanel:
-
-
-
- 424
-
-
-
- modifyFont:
-
-
-
- 425
+ 609
@@ -1996,12 +2625,348 @@
532
+
+
+ playPauseiTunes:
+
+
+
+ 1223
+
+
+
+ previousTrack:
+
+
+
+ 1224
+
+
+
+ nextTrack:
+
+
+
+ 1225
+
+
+
+ quitiTunes:
+
+
+
+ 1229
+
+
+
+ runiTunes:
+
+
+
+ 1230
+
+
+
+ preferencesWindow
+
+
+
+ 1335
+
+
+
+ quitWhenAllWindowClosedCheckBox
+
+
+
+ 1842
+
+
+
+ preferencesController
+
+
+
+ 1900
+
+
+
+ mainController
+
+
+
+ 1909
+
+
+
+ iLyricsMenuItem
+
+
+
+ 607
+
+
+
+ window
+
+
+
+ 608
+
+
+
+ downloadLyrics:
+
+
+
+ 1201
+
+
+
+ searchField
+
+
+
+ 1236
+
+
+
+ startNewSearch:
+
+
+
+ 1237
+
+
+
+ sendLyricsToiTunes:
+
+
+
+ 1378
+
+
+
+ showiLyricsWindow:
+
+
+
+ 1560
+
+
+
+ getCurrentiTunesSong:
+
+
+
+ 1561
+
+
+
+ getCurrentiTunesSong:
+
+
+
+ 1562
+
+
+
+ previewPopover
+
+
+
+ 1579
+
+
+
+ previewTextArea
+
+
+
+ 1580
+
+
+
+ downloadLyricsButton
+
+
+
+ 1446
+
+
+
+ artistLabel
+
+
+
+ 751
+
+
+
+ downloadLyrics:
+
+
+
+ 1445
+
+
+
+ sendLyricsToiTunes:
+
+
+
+ 1379
+
+
+
+ songLabel
+
+
+
+ 750
+
+
+
+ sendToiTunesButton
+
+
+
+ 1233
+
+
+
+ lyricsArea
+
+
+
+ 1190
+
+
+
+ resultsOutline
+
+
+
+ 829
+
+
+
+ lyricsSelectionChanged:
+
+
+
+ 884
+
+
+
+ resetLoadedResults:
+
+
+
+ 1551
+
+
+
+ loadMoreResultsButton
+
+
+
+ 1905
+
+
+
+ loadNextResults:
+
+
+
+ 1552
+
+
+
+ showPreviewCheckBox
+
+
+
+ 1799
+
+
+
+ delegate
+
+
+
+ 1553
+
+
+
+ dataSource
+
+
+
+ 592
+
+
+
+ delegate
+
+
+
+ 828
+
+
+
+ makeKeyAndOrderFront:
+
+
+
+ 1899
+
+
+
+ view
+
+
+
+ 1578
+
+
+
+ contentViewController
+
+
+
+ 1565
+
+
+
+ performClose:
+
+
+
+ 1614
+
+
+
+ dataSource
+
+
+
+ 1898
+
+
+
+ hosterTable
+
+
+
+ 1901
+
0
-
+
@@ -2032,8 +2997,8 @@
-
+
@@ -2390,6 +3355,8 @@
+
+
@@ -2514,244 +3481,18 @@
+
372
+
+
+
-
- 375
-
-
-
-
-
-
-
- 376
-
-
-
-
-
-
-
-
- 377
-
-
-
-
-
-
-
- 388
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 389
-
-
-
-
- 390
-
-
-
-
- 391
-
-
-
-
- 392
-
-
-
-
- 393
-
-
-
-
- 394
-
-
-
-
- 395
-
-
-
-
- 396
-
-
-
-
- 397
-
-
-
-
-
-
-
- 398
-
-
-
-
-
-
-
- 399
-
-
-
-
-
-
-
- 400
-
-
-
-
- 401
-
-
-
-
- 402
-
-
-
-
- 403
-
-
-
-
- 404
-
-
-
-
- 405
-
-
-
-
-
-
-
-
-
-
-
- 406
-
-
-
-
- 407
-
-
-
-
- 408
-
-
-
-
- 409
-
-
-
-
- 410
-
-
-
-
- 411
-
-
-
-
-
-
-
-
-
- 412
-
-
-
-
- 413
-
-
-
-
- 414
-
-
-
-
- 415
-
-
-
-
-
-
-
-
-
-
- 416
-
-
-
-
- 417
-
-
-
-
- 418
-
-
-
-
- 419
-
-
-
420
@@ -2851,157 +3592,589 @@
-
- 496
-
-
-
-
-
-
-
- 497
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 498
-
-
-
-
- 499
-
-
-
-
- 500
-
-
-
-
- 501
-
-
-
-
- 502
-
-
-
-
- 503
-
-
-
-
-
-
-
- 504
-
-
-
-
- 505
-
-
-
-
- 506
-
-
-
-
- 507
-
-
-
-
- 508
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 509
-
-
-
-
- 510
-
-
-
-
- 511
-
-
-
-
- 512
-
-
-
-
- 513
-
-
-
-
- 514
-
-
-
-
- 515
-
-
-
-
- 516
-
-
-
-
- 517
-
-
-
534
+
+ 536
+
+
+
+
+ 593
+
+
+
+
+
+
+
+
+
+
+
+
+ 594
+
+
+
+
+ 597
+
+
+
+
+ 599
+
+
+
+
+ 600
+
+
+
+
+ 601
+
+
+
+
+ 604
+
+
+
+
+
+
+
+ 602
+
+
+
+
+
+
+
+ 603
+
+
+
+
+ 605
+
+
+
+
+ 606
+
+
+
+
+ 1205
+
+
+
+
+
+
+
+ 1206
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1207
+
+
+
+
+ 1208
+
+
+
+
+ 1210
+
+
+
+
+ 1212
+
+
+
+
+ 1213
+
+
+
+
+ 1215
+
+
+
+
+ 1216
+
+
+
+
+ 1219
+
+
+
+
+ 1238
+
+
+
+
+
+
+
+ 1239
+
+
+
+
+
+
+
+
+
+ 1563
+
+
+ Popover View Controller
+
+
+ 1564
+
+
+
+
+ 1566
+
+
+
+
+
+
+
+
+ 1567
+
+
+
+
+
+
+
+
+
+ 1568
+
+
+
+
+ 1569
+
+
+
+
+ 1570
+
+
+
+
+ 1586
+
+
+
+
+
+
+
+ 1587
+
+
+
+
+ 1838
+
+
+
+
+
+
+
+ 1839
+
+
+
+
+ 1843
+
+
+
+
+
+
+
+
+
+
+ 1844
+
+
+
+
+
+
+
+
+ 1845
+
+
+
+
+ 1847
+
+
+
+
+ 1848
+
+
+
+
+
+
+
+ 1856
+
+
+
+
+
+
+
+ 1857
+
+
+
+
+ 1879
+
+
+
+
+
+
+
+ 1895
+
+
+
+
+ 1896
+
+
+
+
+ 1897
+
+
+
+
+ 1904
+
+
+
+
+ 1910
+
+
+
+
+
+
+
+
+ 1911
+
+
+
+
+
+
+
+
+
+
+ 1912
+
+
+
+
+
+
+
+
+ 908
+
+
+
+
+
+
+
+
+
+
+
+
+ 1432
+
+
+
+
+
+
+
+ 659
+
+
+
+
+
+
+
+ 653
+
+
+
+
+
+
+
+ 615
+
+
+
+
+
+
+
+ 620
+
+
+
+
+
+
+
+ 832
+
+
+
+
+
+
+
+ 833
+
+
+
+
+ 621
+
+
+
+
+ 616
+
+
+
+
+ 654
+
+
+
+
+ 660
+
+
+
+
+ 1433
+
+
+
+
+ 1102
+
+
+
+
+
+
+
+
+
+ 1105
+
+
+
+
+ 1104
+
+
+
+
+ 1103
+
+
+
+
+ 548
+
+
+
+
+
+
+
+
+
+
+ 549
+
+
+
+
+
+
+
+
+ 553
+
+
+
+
+
+
+
+ 1191
+
+
+
+
+ 554
+
+
+
+
+
+
+
+ 1192
+
+
+
+
+ 550
+
+
+
+
+ 551
+
+
+
+
+ 552
+
+
+
+
+ 1473
+
+
+
+
+
+
+
+ 1474
+
+
+
+
+ 1477
+
+
+
+
+
+
+
+ 1478
+
+
+
+
+ 1615
+
+
+
+
+
+
+
+ 1616
+
+
+
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
+ 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
@@ -3011,11 +4184,46 @@
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
+ 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
+ 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
@@ -3058,45 +4266,12 @@
com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
+
+
com.apple.InterfaceBuilder.CocoaPlugin
{{380, 496}, {480, 360}}
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
- 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
com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
@@ -3114,33 +4289,38 @@
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
- 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
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
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
@@ -3151,1423 +4331,225 @@
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
- 535
+ 2512
-
- ABCardController
- NSObject
-
- id
- id
- id
- id
- id
- id
- id
-
-
-
- addCardViewField:
- id
-
-
- copy:
- id
-
-
- cut:
- id
-
-
- doDelete:
- id
-
-
- find:
- id
-
-
- paste:
- id
-
-
- saveChanges:
- id
-
-
-
- ABCardView
- NSButton
- NSManagedObjectContext
- NSSearchField
- NSTextField
- NSWindow
-
-
-
- mCardView
- ABCardView
-
-
- mEditButton
- NSButton
-
-
- mManagedObjectContext
- NSManagedObjectContext
-
-
- mSearchField
- NSSearchField
-
-
- mStatusTextField
- NSTextField
-
-
- mWindow
- NSWindow
-
-
-
- IBProjectSource
- ./Classes/ABCardController.h
-
-
-
- ABCardView
- NSView
-
- id
- id
-
-
-
- commitAndSave:
- id
-
-
- statusImageClicked:
- id
-
-
-
- NSImageView
- NSView
- ABNameFrameView
- NSView
- NSImage
- ABImageView
-
-
-
- mBuddyStatusImage
- NSImageView
-
-
- mHeaderView
- NSView
-
-
- mNameView
- ABNameFrameView
-
-
- mNextKeyView
- NSView
-
-
- mUserImage
- NSImage
-
-
- mUserImageView
- ABImageView
-
-
-
- IBProjectSource
- ./Classes/ABCardView.h
-
-
-
- ABImageView
- NSImageView
-
- id
- id
- id
- id
-
-
-
- copy:
- id
-
-
- cut:
- id
-
-
- delete:
- id
-
-
- paste:
- id
-
-
-
- IBProjectSource
- ./Classes/ABImageView.h
-
-
-
- DVTAutoLayoutView
- NSView
-
- IBProjectSource
- ./Classes/DVTAutoLayoutView.h
-
-
-
- DVTBorderedView
- DVTAutoLayoutView
-
- contentView
- NSView
-
-
- contentView
-
- contentView
- NSView
-
-
-
- IBProjectSource
- ./Classes/DVTBorderedView.h
-
-
-
- DVTDelayedMenuButton
- NSButton
-
- IBProjectSource
- ./Classes/DVTDelayedMenuButton.h
-
-
-
- DVTGradientImageButton
- NSButton
-
- IBProjectSource
- ./Classes/DVTGradientImageButton.h
-
-
-
- DVTImageAndTextCell
- NSTextFieldCell
-
- IBProjectSource
- ./Classes/DVTImageAndTextCell.h
-
-
-
- DVTImageAndTextColumn
- NSTableColumn
-
- IBProjectSource
- ./Classes/DVTImageAndTextColumn.h
-
-
-
- DVTOutlineView
- NSOutlineView
-
- IBProjectSource
- ./Classes/DVTOutlineView.h
-
-
-
- DVTSplitView
- NSSplitView
-
- IBProjectSource
- ./Classes/DVTSplitView.h
-
-
-
- DVTStackView
- DVTAutoLayoutView
-
- IBProjectSource
- ./Classes/DVTStackView.h
-
-
-
- DVTViewController
- NSViewController
-
- IBProjectSource
- ./Classes/DVTViewController.h
-
-
-
- HFController
- NSObject
-
- selectAll:
- id
-
-
- selectAll:
-
- selectAll:
- id
-
-
-
- IBProjectSource
- ./Classes/HFController.h
-
-
-
- HFRepresenterTextView
- NSView
-
- selectAll:
- id
-
-
- selectAll:
-
- selectAll:
- id
-
-
-
- IBProjectSource
- ./Classes/HFRepresenterTextView.h
-
-
-
- IBEditor
- NSObject
-
- id
- id
- id
-
-
-
- changeFont:
- id
-
-
- selectAll:
- id
-
-
- sizeSelectionToFit:
- id
-
-
-
- IBProjectSource
- ./Classes/IBEditor.h
-
-
-
- IDECapsuleListView
- DVTStackView
-
- dataSource
- id
-
-
- dataSource
-
- dataSource
- id
-
-
-
- IBProjectSource
- ./Classes/IDECapsuleListView.h
-
-
-
- IDEDMArrayController
- NSArrayController
-
- IBProjectSource
- ./Classes/IDEDMArrayController.h
-
-
-
- IDEDMEditor
- IDEEditor
-
- DVTBorderedView
- NSView
- IDEDMEditorSourceListController
- DVTSplitView
-
-
-
- bottomToolbarBorderView
- DVTBorderedView
-
-
- sourceListSplitViewPane
- NSView
-
-
- sourceListViewController
- IDEDMEditorSourceListController
-
-
- splitView
- DVTSplitView
-
-
-
- IBProjectSource
- ./Classes/IDEDMEditor.h
-
-
-
- IDEDMEditorController
- IDEViewController
-
- IBProjectSource
- ./Classes/IDEDMEditorController.h
-
-
-
- IDEDMEditorSourceListController
- IDEDMEditorController
-
- DVTBorderedView
- IDEDMEditor
- DVTImageAndTextColumn
- DVTOutlineView
- NSTreeController
-
-
-
- borderedView
- DVTBorderedView
-
-
- parentEditor
- IDEDMEditor
-
-
- primaryColumn
- DVTImageAndTextColumn
-
-
- sourceListOutlineView
- DVTOutlineView
-
-
- sourceListTreeController
- NSTreeController
-
-
-
- IBProjectSource
- ./Classes/IDEDMEditorSourceListController.h
-
-
-
- IDEDMHighlightImageAndTextCell
- DVTImageAndTextCell
-
- IBProjectSource
- ./Classes/IDEDMHighlightImageAndTextCell.h
-
-
-
- IDEDataModelBrowserEditor
- IDEDMEditorController
-
- IDEDataModelPropertiesTableController
- IDECapsuleListView
- NSArrayController
- IDEDataModelPropertiesTableController
- IDEDataModelEntityContentsEditor
- IDEDataModelPropertiesTableController
-
-
-
- attributesTableViewController
- IDEDataModelPropertiesTableController
-
-
- capsuleView
- IDECapsuleListView
-
-
- entityArrayController
- NSArrayController
-
-
- fetchedPropertiesTableViewController
- IDEDataModelPropertiesTableController
-
-
- parentEditor
- IDEDataModelEntityContentsEditor
-
-
- relationshipsTableViewController
- IDEDataModelPropertiesTableController
-
-
-
- IBProjectSource
- ./Classes/IDEDataModelBrowserEditor.h
-
-
-
- IDEDataModelConfigurationEditor
- IDEDMEditorController
-
- IDECapsuleListView
- IDEDataModelEditor
- IDEDataModelConfigurationTableController
-
-
-
- capsuleListView
- IDECapsuleListView
-
-
- parentEditor
- IDEDataModelEditor
-
-
- tableController
- IDEDataModelConfigurationTableController
-
-
-
- IBProjectSource
- ./Classes/IDEDataModelConfigurationEditor.h
-
-
-
- IDEDataModelConfigurationTableController
- IDEDMEditorController
-
- NSArrayController
- NSArrayController
- IDEDataModelConfigurationEditor
- XDTableView
-
-
-
- configurationsArrayController
- NSArrayController
-
-
- entitiesArrayController
- NSArrayController
-
-
- parentEditor
- IDEDataModelConfigurationEditor
-
-
- tableView
- XDTableView
-
-
-
- IBProjectSource
- ./Classes/IDEDataModelConfigurationTableController.h
-
-
-
- IDEDataModelDiagramEditor
- IDEDMEditorController
-
- XDDiagramView
- IDEDataModelEntityContentsEditor
-
-
-
- diagramView
- XDDiagramView
-
-
- parentEditor
- IDEDataModelEntityContentsEditor
-
-
-
- IBProjectSource
- ./Classes/IDEDataModelDiagramEditor.h
-
-
-
- IDEDataModelEditor
- IDEDMEditor
-
- DVTDelayedMenuButton
- DVTDelayedMenuButton
- NSSegmentedControl
- IDEDataModelConfigurationEditor
- IDEDataModelEntityContentsEditor
- IDEDataModelFetchRequestEditor
- NSSegmentedControl
- NSTabView
-
-
-
- addEntityButton
- DVTDelayedMenuButton
-
-
- addPropertyButton
- DVTDelayedMenuButton
-
-
- browserDiagramSegmentControl
- NSSegmentedControl
-
-
- configurationViewController
- IDEDataModelConfigurationEditor
-
-
- entityContentsViewController
- IDEDataModelEntityContentsEditor
-
-
- fetchRequestViewController
- IDEDataModelFetchRequestEditor
-
-
- hierarchySegmentControl
- NSSegmentedControl
-
-
- tabView
- NSTabView
-
-
-
- IBProjectSource
- ./Classes/IDEDataModelEditor.h
-
-
-
- IDEDataModelEntityContentsEditor
- IDEDMEditorController
-
- IDEDataModelBrowserEditor
- IDEDataModelDiagramEditor
- IDEDataModelEditor
- NSTabView
-
-
-
- browserViewController
- IDEDataModelBrowserEditor
-
-
- diagramViewController
- IDEDataModelDiagramEditor
-
-
- parentEditor
- IDEDataModelEditor
-
-
- tabView
- NSTabView
-
-
-
- IBProjectSource
- ./Classes/IDEDataModelEntityContentsEditor.h
-
-
-
- IDEDataModelFetchRequestEditor
- IDEDMEditorController
-
- NSArrayController
- IDEDataModelEditor
- IDECapsuleListView
-
-
-
- entityController
- NSArrayController
-
-
- parentEditor
- IDEDataModelEditor
-
-
- tableView
- IDECapsuleListView
-
-
-
- IBProjectSource
- ./Classes/IDEDataModelFetchRequestEditor.h
-
-
-
- IDEDataModelPropertiesTableController
- IDEDMEditorController
-
- IDEDMArrayController
- NSTableColumn
- NSArrayController
- IDEDataModelBrowserEditor
- IDEDMHighlightImageAndTextCell
- XDTableView
-
-
-
- arrayController
- IDEDMArrayController
-
-
- entitiesColumn
- NSTableColumn
-
-
- entityArrayController
- NSArrayController
-
-
- parentEditor
- IDEDataModelBrowserEditor
-
-
- propertyNameAndImageCell
- IDEDMHighlightImageAndTextCell
-
-
- tableView
- XDTableView
-
-
-
- IBProjectSource
- ./Classes/IDEDataModelPropertiesTableController.h
-
-
-
- IDEDocSetOutlineView
- NSOutlineView
-
- IBProjectSource
- ./Classes/IDEDocSetOutlineView.h
-
-
-
- IDEDocSetOutlineViewController
- NSObject
-
- id
- id
- id
- id
- id
-
-
-
- getDocSetAction:
- id
-
-
- showProblemInfoForUpdate:
- id
-
-
- subscribeToPublisherAction:
- id
-
-
- unsubscribeFromPublisher:
- id
-
-
- updateDocSetAction:
- id
-
-
-
- docSetOutlineView
- IDEDocSetOutlineView
-
-
- docSetOutlineView
-
- docSetOutlineView
- IDEDocSetOutlineView
-
-
-
- IBProjectSource
- ./Classes/IDEDocSetOutlineViewController.h
-
-
-
- IDEDocViewingPrefPaneController
- IDEViewController
-
- id
- id
- id
- id
- id
- id
- id
- id
- id
-
-
-
- addSubscription:
- id
-
-
- checkForAndInstallUpdatesNow:
- id
-
-
- minimumFontSizeComboBoxAction:
- id
-
-
- minimumFontSizeEnabledAction:
- id
-
-
- showHelp:
- id
-
-
- showSubscriptionSheet:
- id
-
-
- subscriptionCancelAction:
- id
-
-
- toggleAutoCheckForAndInstallUpdates:
- id
-
-
- toggleDocSetInfo:
- id
-
-
-
- DVTGradientImageButton
- DVTGradientImageButton
- DVTGradientImageButton
- NSSplitView
- NSView
- NSView
- DVTBorderedView
- DVTBorderedView
- NSButton
- NSTextView
- IDEDocSetOutlineViewController
- NSComboBox
- NSTextField
- NSButton
- NSTextField
- NSWindow
- NSButton
-
-
-
- _addButton
- DVTGradientImageButton
-
-
- _deleteButton
- DVTGradientImageButton
-
-
- _showInfoAreaButton
- DVTGradientImageButton
-
-
- _splitView
- NSSplitView
-
-
- _splitViewDocSetInfoSubview
- NSView
-
-
- _splitViewDocSetsListSubview
- NSView
-
-
- borderedViewAroundSplitView
- DVTBorderedView
-
-
- borderedViewBelowTable
- DVTBorderedView
-
-
- checkAndInstallNowButton
- NSButton
-
-
- docSetInfoTextView
- NSTextView
-
-
- docSetOutlineViewController
- IDEDocSetOutlineViewController
-
-
- minimumFontSizeControl
- NSComboBox
-
-
- noUpdatesAvailableMessage
- NSTextField
-
-
- showInfoButton
- NSButton
-
-
- subscriptionTextField
- NSTextField
-
-
- subscriptionWindow
- NSWindow
-
-
- validateAddSubscriptionButton
- NSButton
-
-
-
- IBProjectSource
- ./Classes/IDEDocViewingPrefPaneController.h
-
-
-
- IDEEditor
- IDEViewController
-
- IBProjectSource
- ./Classes/IDEEditor.h
-
-
-
- IDEViewController
- DVTViewController
-
- IBProjectSource
- ./Classes/IDEViewController.h
-
-
-
- IKImageView
-
- id
- id
- id
- id
-
-
-
- copy:
- id
-
-
- crop:
- id
-
-
- cut:
- id
-
-
- paste:
- id
-
-
-
- IBProjectSource
- ./Classes/IKImageView.h
-
-
-
- NSDocument
-
- id
- id
- id
- id
- id
- id
-
-
-
- printDocument:
- id
-
-
- revertDocumentToSaved:
- id
-
-
- runPageLayout:
- id
-
-
- saveDocument:
- id
-
-
- saveDocumentAs:
- id
-
-
- saveDocumentTo:
- id
-
-
-
- IBProjectSource
- ./Classes/NSDocument.h
-
-
-
- QLPreviewBubble
- NSObject
-
- id
- id
-
-
-
- hide:
- id
-
-
- show:
- id
-
-
-
- parentWindow
- NSWindow
-
-
- parentWindow
-
- parentWindow
- NSWindow
-
-
-
- IBProjectSource
- ./Classes/QLPreviewBubble.h
-
-
-
- QTMovieView
-
- id
- id
- id
- id
- id
-
-
-
- showAll:
- id
-
-
- showCustomButton:
- id
-
-
- toggleLoops:
- id
-
-
- zoomIn:
- id
-
-
- zoomOut:
- id
-
-
-
- IBProjectSource
- ./Classes/QTMovieView.h
-
-
-
- WebView
-
- id
- id
- id
- id
-
-
-
- reloadFromOrigin:
- id
-
-
- resetPageZoom:
- id
-
-
- zoomPageIn:
- id
-
-
- zoomPageOut:
- id
-
-
-
- IBProjectSource
- ./Classes/WebView.h
-
-
-
- XDDiagramView
- NSView
-
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
- id
-
-
-
- _graphLayouterMenuItemAction:
- id
-
-
- _zoomPopUpButtonAction:
- id
-
-
- alignBottomEdges:
- id
-
-
- alignCentersHorizontallyInContainer:
- id
-
-
- alignCentersVerticallyInContainer:
- id
-
-
- alignHorizontalCenters:
- id
-
-
- alignLeftEdges:
- id
-
-
- alignRightEdges:
- id
-
-
- alignTopEdges:
- id
-
-
- alignVerticalCenters:
- id
-
-
- bringToFront:
- id
-
-
- collapseAllCompartments:
- id
-
-
- copy:
- id
-
-
- cut:
- id
-
-
- delete:
- id
-
-
- deleteBackward:
- id
-
-
- deleteForward:
- id
-
-
- deselectAll:
- id
-
-
- diagramZoomIn:
- id
-
-
- diagramZoomOut:
- id
-
-
- expandAllCompartments:
- id
-
-
- flipHorizontally:
- id
-
-
- flipVertically:
- id
-
-
- layoutGraphicsConcentrically:
- id
-
-
- layoutGraphicsHierarchically:
- id
-
-
- lock:
- id
-
-
- makeSameHeight:
- id
-
-
- makeSameWidth:
- id
-
-
- moveDown:
- id
-
-
- moveDownAndModifySelection:
- id
-
-
- moveLeft:
- id
-
-
- moveLeftAndModifySelection:
- id
-
-
- moveRight:
- id
-
-
- moveRightAndModifySelection:
- id
-
-
- moveUp:
- id
-
-
- moveUpAndModifySelection:
- id
-
-
- paste:
- id
-
-
- rollDownAllCompartments:
- id
-
-
- rollUpAllCompartments:
- id
-
-
- selectAll:
- id
-
-
- sendToBack:
- id
-
-
- sizeToFit:
- id
-
-
- toggleGridShown:
- id
-
-
- toggleHiddenGraphicsShown:
- id
-
-
- togglePageBreaksShown:
- id
-
-
- toggleRuler:
- id
-
-
- toggleSnapsToGrid:
- id
-
-
- unlock:
- id
-
-
-
- _diagramController
- IDEDataModelDiagramEditor
-
-
- _diagramController
-
- _diagramController
- IDEDataModelDiagramEditor
-
-
-
- IBProjectSource
- ./Classes/XDDiagramView.h
-
-
-
- XDTableView
- NSTableView
-
- showAllTableColumns:
- id
-
-
- showAllTableColumns:
-
- showAllTableColumns:
- id
-
-
-
- IBProjectSource
- ./Classes/XDTableView.h
-
-
AppDelegate
NSObject
- id
- id
+ id
+ id
+ id
+ id
+ id
-
- applicationShouldTerminate:
+
+ nextTrack:
id
-
- applicationWillFinishLaunching:
+
+ playPauseiTunes:
id
+
+ previousTrack:
+ id
+
+
+ quitiTunes:
+ id
+
+
+ runiTunes:
+ id
+
+
+
+ MainController
+ PreferencesController
+ NSWindow
+ NSButton
+ NSWindow
+
+
+
+ mainController
+ MainController
+
+
+ preferencesController
+ PreferencesController
+
+
+ preferencesWindow
+ NSWindow
+
+
+ quitWhenAllWindowClosedCheckBox
+ NSButton
+
+
+ window
+ NSWindow
+
IBProjectSource
./Classes/AppDelegate.h
+
+ MainController
+ NSObject
+
+ id
+ id
+ id
+ NSOutlineView
+ id
+ id
+ id
+ id
+
+
+
+ downloadLyrics:
+ id
+
+
+ getCurrentiTunesSong:
+ id
+
+
+ loadNextResults:
+ id
+
+
+ lyricsSelectionChanged:
+ NSOutlineView
+
+
+ resetLoadedResults:
+ id
+
+
+ sendLyricsToiTunes:
+ id
+
+
+ showiLyricsWindow:
+ id
+
+
+ startNewSearch:
+ id
+
+
+
+ NSTextField
+ NSButton
+ NSMenuItem
+ NSButton
+ NSTextView
+ NSPopover
+ NSTextView
+ NSOutlineView
+ NSSearchField
+ NSButton
+ NSButton
+ NSTextField
+ NSWindow
+
+
+
+ artistLabel
+ NSTextField
+
+
+ downloadLyricsButton
+ NSButton
+
+
+ iLyricsMenuItem
+ NSMenuItem
+
+
+ loadMoreResultsButton
+ NSButton
+
+
+ lyricsArea
+ NSTextView
+
+
+ previewPopover
+ NSPopover
+
+
+ previewTextArea
+ NSTextView
+
+
+ resultsOutline
+ NSOutlineView
+
+
+ searchField
+ NSSearchField
+
+
+ sendToiTunesButton
+ NSButton
+
+
+ showPreviewCheckBox
+ NSButton
+
+
+ songLabel
+ NSTextField
+
+
+ window
+ NSWindow
+
+
+
+ IBProjectSource
+ ./Classes/MainController.h
+
+
+
+ PreferencesController
+ NSObject
+
+ hosterTable
+ NSTableView
+
+
+ hosterTable
+
+ hosterTable
+ NSTableView
+
+
+
+ IBProjectSource
+ ./Classes/PreferencesController.h
+
+
0
@@ -4579,9 +4561,11 @@
YES
3
- {9, 8}
- {7, 2}
+ {256, 256}
+ {11, 11}
+ {10, 3}
+ {15, 15}
+ {512, 512}
- YES
diff --git a/iLyrics/iLyrics-Info.plist b/iLyrics/iLyrics-Info.plist
index a4be5b4..8a0ac83 100644
--- a/iLyrics/iLyrics-Info.plist
+++ b/iLyrics/iLyrics-Info.plist
@@ -7,7 +7,7 @@
CFBundleExecutable
${EXECUTABLE_NAME}
CFBundleIconFile
-
+ iLyrics.icns
CFBundleIdentifier
wittenburg.kim.${PRODUCT_NAME:rfc1034identifier}
CFBundleInfoDictionaryVersion
diff --git a/iLyrics/iTunes.h b/iLyrics/iTunes.h
new file mode 100644
index 0000000..5da6f8d
--- /dev/null
+++ b/iLyrics/iTunes.h
@@ -0,0 +1,506 @@
+/*
+ * iTunes.h
+ */
+
+#import
+#import
+
+
+@class iTunesPrintSettings, iTunesApplication, iTunesItem, iTunesArtwork, iTunesEncoder, iTunesEQPreset, iTunesPlaylist, iTunesAudioCDPlaylist, iTunesDevicePlaylist, iTunesLibraryPlaylist, iTunesRadioTunerPlaylist, iTunesSource, iTunesTrack, iTunesAudioCDTrack, iTunesDeviceTrack, iTunesFileTrack, iTunesSharedTrack, iTunesURLTrack, iTunesUserPlaylist, iTunesFolderPlaylist, iTunesVisual, iTunesWindow, iTunesBrowserWindow, iTunesEQWindow, iTunesPlaylistWindow;
+
+enum iTunesEKnd {
+ iTunesEKndTrackListing = 'kTrk' /* a basic listing of tracks within a playlist */,
+ iTunesEKndAlbumListing = 'kAlb' /* a listing of a playlist grouped by album */,
+ iTunesEKndCdInsert = 'kCDi' /* a printout of the playlist for jewel case inserts */
+};
+typedef enum iTunesEKnd iTunesEKnd;
+
+enum iTunesEnum {
+ iTunesEnumStandard = 'lwst' /* Standard PostScript error handling */,
+ iTunesEnumDetailed = 'lwdt' /* print a detailed report of PostScript errors */
+};
+typedef enum iTunesEnum iTunesEnum;
+
+enum iTunesEPlS {
+ iTunesEPlSStopped = 'kPSS',
+ iTunesEPlSPlaying = 'kPSP',
+ iTunesEPlSPaused = 'kPSp',
+ iTunesEPlSFastForwarding = 'kPSF',
+ iTunesEPlSRewinding = 'kPSR'
+};
+typedef enum iTunesEPlS iTunesEPlS;
+
+enum iTunesERpt {
+ iTunesERptOff = 'kRpO',
+ iTunesERptOne = 'kRp1',
+ iTunesERptAll = 'kAll'
+};
+typedef enum iTunesERpt iTunesERpt;
+
+enum iTunesEVSz {
+ iTunesEVSzSmall = 'kVSS',
+ iTunesEVSzMedium = 'kVSM',
+ iTunesEVSzLarge = 'kVSL'
+};
+typedef enum iTunesEVSz iTunesEVSz;
+
+enum iTunesESrc {
+ iTunesESrcLibrary = 'kLib',
+ iTunesESrcIPod = 'kPod',
+ iTunesESrcAudioCD = 'kACD',
+ iTunesESrcMP3CD = 'kMCD',
+ iTunesESrcDevice = 'kDev',
+ iTunesESrcRadioTuner = 'kTun',
+ iTunesESrcSharedLibrary = 'kShd',
+ iTunesESrcUnknown = 'kUnk'
+};
+typedef enum iTunesESrc iTunesESrc;
+
+enum iTunesESrA {
+ iTunesESrAAlbums = 'kSrL' /* albums only */,
+ iTunesESrAAll = 'kAll' /* all text fields */,
+ iTunesESrAArtists = 'kSrR' /* artists only */,
+ iTunesESrAComposers = 'kSrC' /* composers only */,
+ iTunesESrADisplayed = 'kSrV' /* visible text fields */,
+ iTunesESrASongs = 'kSrS' /* song names only */
+};
+typedef enum iTunesESrA iTunesESrA;
+
+enum iTunesESpK {
+ iTunesESpKNone = 'kNon',
+ iTunesESpKBooks = 'kSpA',
+ iTunesESpKFolder = 'kSpF',
+ iTunesESpKGenius = 'kSpG',
+ iTunesESpKITunesU = 'kSpU',
+ iTunesESpKLibrary = 'kSpL',
+ iTunesESpKMovies = 'kSpI',
+ iTunesESpKMusic = 'kSpZ',
+ iTunesESpKPartyShuffle = 'kSpS',
+ iTunesESpKPodcasts = 'kSpP',
+ iTunesESpKPurchasedMusic = 'kSpM',
+ iTunesESpKTVShows = 'kSpT'
+};
+typedef enum iTunesESpK iTunesESpK;
+
+enum iTunesEVdK {
+ iTunesEVdKNone = 'kNon' /* not a video or unknown video kind */,
+ iTunesEVdKMovie = 'kVdM' /* movie track */,
+ iTunesEVdKMusicVideo = 'kVdV' /* music video track */,
+ iTunesEVdKTVShow = 'kVdT' /* TV show track */
+};
+typedef enum iTunesEVdK iTunesEVdK;
+
+enum iTunesERtK {
+ iTunesERtKUser = 'kRtU' /* user-specified rating */,
+ iTunesERtKComputed = 'kRtC' /* iTunes-computed rating */
+};
+typedef enum iTunesERtK iTunesERtK;
+
+
+
+/*
+ * Standard Suite
+ */
+
+@interface iTunesPrintSettings : SBObject
+
+@property (readonly) NSInteger copies; // the number of copies of a document to be printed
+@property (readonly) BOOL collating; // Should printed copies be collated?
+@property (readonly) NSInteger startingPage; // the first page of the document to be printed
+@property (readonly) NSInteger endingPage; // the last page of the document to be printed
+@property (readonly) NSInteger pagesAcross; // number of logical pages laid across a physical page
+@property (readonly) NSInteger pagesDown; // number of logical pages laid out down a physical page
+@property (readonly) iTunesEnum errorHandling; // how errors are handled
+@property (copy, readonly) NSDate *requestedPrintTime; // the time at which the desktop printer should print the document
+@property (copy, readonly) NSArray *printerFeatures; // printer specific options
+@property (copy, readonly) NSString *faxNumber; // for fax number
+@property (copy, readonly) NSString *targetPrinter; // for target printer
+
+- (void) printPrintDialog:(BOOL)printDialog withProperties:(iTunesPrintSettings *)withProperties kind:(iTunesEKnd)kind theme:(NSString *)theme; // Print the specified object(s)
+- (void) close; // Close an object
+- (void) delete; // Delete an element from an object
+- (SBObject *) duplicateTo:(SBObject *)to; // Duplicate one or more object(s)
+- (BOOL) exists; // Verify if an object exists
+- (void) open; // open the specified object(s)
+- (void) playOnce:(BOOL)once; // play the current track or the specified track or file.
+
+@end
+
+
+
+/*
+ * iTunes Suite
+ */
+
+// The application program
+@interface iTunesApplication : SBApplication
+
+- (SBElementArray *) browserWindows;
+- (SBElementArray *) encoders;
+- (SBElementArray *) EQPresets;
+- (SBElementArray *) EQWindows;
+- (SBElementArray *) playlistWindows;
+- (SBElementArray *) sources;
+- (SBElementArray *) visuals;
+- (SBElementArray *) windows;
+
+@property (copy) iTunesEncoder *currentEncoder; // the currently selected encoder (MP3, AIFF, WAV, etc.)
+@property (copy) iTunesEQPreset *currentEQPreset; // the currently selected equalizer preset
+@property (copy, readonly) iTunesPlaylist *currentPlaylist; // the playlist containing the currently targeted track
+@property (copy, readonly) NSString *currentStreamTitle; // the name of the current song in the playing stream (provided by streaming server)
+@property (copy, readonly) NSString *currentStreamURL; // the URL of the playing stream or streaming web site (provided by streaming server)
+@property (copy, readonly) iTunesTrack *currentTrack; // the current targeted track
+@property (copy) iTunesVisual *currentVisual; // the currently selected visual plug-in
+@property BOOL EQEnabled; // is the equalizer enabled?
+@property BOOL fixedIndexing; // true if all AppleScript track indices should be independent of the play order of the owning playlist.
+@property BOOL frontmost; // is iTunes the frontmost application?
+@property BOOL fullScreen; // are visuals displayed using the entire screen?
+@property (copy, readonly) NSString *name; // the name of the application
+@property BOOL mute; // has the sound output been muted?
+@property NSInteger playerPosition; // the player’s position within the currently playing track in seconds.
+@property (readonly) iTunesEPlS playerState; // is iTunes stopped, paused, or playing?
+@property (copy, readonly) SBObject *selection; // the selection visible to the user
+@property NSInteger soundVolume; // the sound output volume (0 = minimum, 100 = maximum)
+@property (copy, readonly) NSString *version; // the version of iTunes
+@property BOOL visualsEnabled; // are visuals currently being displayed?
+@property iTunesEVSz visualSize; // the size of the displayed visual
+
+- (void) printPrintDialog:(BOOL)printDialog withProperties:(iTunesPrintSettings *)withProperties kind:(iTunesEKnd)kind theme:(NSString *)theme; // Print the specified object(s)
+- (void) run; // run iTunes
+- (void) quit; // quit iTunes
+- (iTunesTrack *) add:(NSArray *)x to:(SBObject *)to; // add one or more files to a playlist
+- (void) backTrack; // reposition to beginning of current track or go to previous track if already at start of current track
+- (iTunesTrack *) convert:(NSArray *)x; // convert one or more files or tracks
+- (void) fastForward; // skip forward in a playing track
+- (void) nextTrack; // advance to the next track in the current playlist
+- (void) pause; // pause playback
+- (void) playOnce:(BOOL)once; // play the current track or the specified track or file.
+- (void) playpause; // toggle the playing/paused state of the current track
+- (void) previousTrack; // return to the previous track in the current playlist
+- (void) resume; // disable fast forward/rewind and resume playback, if playing.
+- (void) rewind; // skip backwards in a playing track
+- (void) stop; // stop playback
+- (void) update; // update the specified iPod
+- (void) eject; // eject the specified iPod
+- (void) subscribe:(NSString *)x; // subscribe to a podcast feed
+- (void) updateAllPodcasts; // update all subscribed podcast feeds
+- (void) updatePodcast; // update podcast feed
+- (void) openLocation:(NSString *)x; // Opens a Music Store or audio stream URL
+
+@end
+
+// an item
+@interface iTunesItem : SBObject
+
+@property (copy, readonly) SBObject *container; // the container of the item
+- (NSInteger) id; // the id of the item
+@property (readonly) NSInteger index; // The index of the item in internal application order.
+@property (copy) NSString *name; // the name of the item
+@property (copy, readonly) NSString *persistentID; // the id of the item as a hexidecimal string. This id does not change over time.
+
+- (void) printPrintDialog:(BOOL)printDialog withProperties:(iTunesPrintSettings *)withProperties kind:(iTunesEKnd)kind theme:(NSString *)theme; // Print the specified object(s)
+- (void) close; // Close an object
+- (void) delete; // Delete an element from an object
+- (SBObject *) duplicateTo:(SBObject *)to; // Duplicate one or more object(s)
+- (BOOL) exists; // Verify if an object exists
+- (void) open; // open the specified object(s)
+- (void) playOnce:(BOOL)once; // play the current track or the specified track or file.
+- (void) reveal; // reveal and select a track or playlist
+
+@end
+
+// a piece of art within a track
+@interface iTunesArtwork : iTunesItem
+
+@property (copy) NSImage *data; // data for this artwork, in the form of a picture
+@property (copy) NSString *objectDescription; // description of artwork as a string
+@property (readonly) BOOL downloaded; // was this artwork downloaded by iTunes?
+@property (copy, readonly) NSNumber *format; // the data format for this piece of artwork
+@property NSInteger kind; // kind or purpose of this piece of artwork
+@property (copy) NSData *rawData; // data for this artwork, in original format
+
+
+@end
+
+// converts a track to a specific file format
+@interface iTunesEncoder : iTunesItem
+
+@property (copy, readonly) NSString *format; // the data format created by the encoder
+
+
+@end
+
+// equalizer preset configuration
+@interface iTunesEQPreset : iTunesItem
+
+@property double band1; // the equalizer 32 Hz band level (-12.0 dB to +12.0 dB)
+@property double band2; // the equalizer 64 Hz band level (-12.0 dB to +12.0 dB)
+@property double band3; // the equalizer 125 Hz band level (-12.0 dB to +12.0 dB)
+@property double band4; // the equalizer 250 Hz band level (-12.0 dB to +12.0 dB)
+@property double band5; // the equalizer 500 Hz band level (-12.0 dB to +12.0 dB)
+@property double band6; // the equalizer 1 kHz band level (-12.0 dB to +12.0 dB)
+@property double band7; // the equalizer 2 kHz band level (-12.0 dB to +12.0 dB)
+@property double band8; // the equalizer 4 kHz band level (-12.0 dB to +12.0 dB)
+@property double band9; // the equalizer 8 kHz band level (-12.0 dB to +12.0 dB)
+@property double band10; // the equalizer 16 kHz band level (-12.0 dB to +12.0 dB)
+@property (readonly) BOOL modifiable; // can this preset be modified?
+@property double preamp; // the equalizer preamp level (-12.0 dB to +12.0 dB)
+@property BOOL updateTracks; // should tracks which refer to this preset be updated when the preset is renamed or deleted?
+
+
+@end
+
+// a list of songs/streams
+@interface iTunesPlaylist : iTunesItem
+
+- (SBElementArray *) tracks;
+
+@property (readonly) NSInteger duration; // the total length of all songs (in seconds)
+@property (copy) NSString *name; // the name of the playlist
+@property (copy, readonly) iTunesPlaylist *parent; // folder which contains this playlist (if any)
+@property BOOL shuffle; // play the songs in this playlist in random order?
+@property (readonly) long long size; // the total size of all songs (in bytes)
+@property iTunesERpt songRepeat; // playback repeat mode
+@property (readonly) iTunesESpK specialKind; // special playlist kind
+@property (copy, readonly) NSString *time; // the length of all songs in MM:SS format
+@property (readonly) BOOL visible; // is this playlist visible in the Source list?
+
+- (void) moveTo:(SBObject *)to; // Move playlist(s) to a new location
+- (iTunesTrack *) searchFor:(NSString *)for_ only:(iTunesESrA)only; // search a playlist for tracks matching the search string. Identical to entering search text in the Search field in iTunes.
+
+@end
+
+// a playlist representing an audio CD
+@interface iTunesAudioCDPlaylist : iTunesPlaylist
+
+- (SBElementArray *) audioCDTracks;
+
+@property (copy) NSString *artist; // the artist of the CD
+@property BOOL compilation; // is this CD a compilation album?
+@property (copy) NSString *composer; // the composer of the CD
+@property NSInteger discCount; // the total number of discs in this CD’s album
+@property NSInteger discNumber; // the index of this CD disc in the source album
+@property (copy) NSString *genre; // the genre of the CD
+@property NSInteger year; // the year the album was recorded/released
+
+
+@end
+
+// a playlist representing the contents of a portable device
+@interface iTunesDevicePlaylist : iTunesPlaylist
+
+- (SBElementArray *) deviceTracks;
+
+
+@end
+
+// the master music library playlist
+@interface iTunesLibraryPlaylist : iTunesPlaylist
+
+- (SBElementArray *) fileTracks;
+- (SBElementArray *) URLTracks;
+- (SBElementArray *) sharedTracks;
+
+
+@end
+
+// the radio tuner playlist
+@interface iTunesRadioTunerPlaylist : iTunesPlaylist
+
+- (SBElementArray *) URLTracks;
+
+
+@end
+
+// a music source (music library, CD, device, etc.)
+@interface iTunesSource : iTunesItem
+
+- (SBElementArray *) audioCDPlaylists;
+- (SBElementArray *) devicePlaylists;
+- (SBElementArray *) libraryPlaylists;
+- (SBElementArray *) playlists;
+- (SBElementArray *) radioTunerPlaylists;
+- (SBElementArray *) userPlaylists;
+
+@property (readonly) long long capacity; // the total size of the source if it has a fixed size
+@property (readonly) long long freeSpace; // the free space on the source if it has a fixed size
+@property (readonly) iTunesESrc kind;
+
+- (void) update; // update the specified iPod
+- (void) eject; // eject the specified iPod
+
+@end
+
+// playable audio source
+@interface iTunesTrack : iTunesItem
+
+- (SBElementArray *) artworks;
+
+@property (copy) NSString *album; // the album name of the track
+@property (copy) NSString *albumArtist; // the album artist of the track
+@property NSInteger albumRating; // the rating of the album for this track (0 to 100)
+@property (readonly) iTunesERtK albumRatingKind; // the rating kind of the album rating for this track
+@property (copy) NSString *artist; // the artist/source of the track
+@property (readonly) NSInteger bitRate; // the bit rate of the track (in kbps)
+@property double bookmark; // the bookmark time of the track in seconds
+@property BOOL bookmarkable; // is the playback position for this track remembered?
+@property NSInteger bpm; // the tempo of this track in beats per minute
+@property (copy) NSString *category; // the category of the track
+@property (copy) NSString *comment; // freeform notes about the track
+@property BOOL compilation; // is this track from a compilation album?
+@property (copy) NSString *composer; // the composer of the track
+@property (readonly) NSInteger databaseID; // the common, unique ID for this track. If two tracks in different playlists have the same database ID, they are sharing the same data.
+@property (copy, readonly) NSDate *dateAdded; // the date the track was added to the playlist
+@property (copy) NSString *objectDescription; // the description of the track
+@property NSInteger discCount; // the total number of discs in the source album
+@property NSInteger discNumber; // the index of the disc containing this track on the source album
+@property (readonly) double duration; // the length of the track in seconds
+@property BOOL enabled; // is this track checked for playback?
+@property (copy) NSString *episodeID; // the episode ID of the track
+@property NSInteger episodeNumber; // the episode number of the track
+@property (copy) NSString *EQ; // the name of the EQ preset of the track
+@property double finish; // the stop time of the track in seconds
+@property BOOL gapless; // is this track from a gapless album?
+@property (copy) NSString *genre; // the music/audio genre (category) of the track
+@property (copy) NSString *grouping; // the grouping (piece) of the track. Generally used to denote movements within a classical work.
+@property (copy, readonly) NSString *kind; // a text description of the track
+@property (copy) NSString *longDescription;
+@property (copy) NSString *lyrics; // the lyrics of the track
+@property (copy, readonly) NSDate *modificationDate; // the modification date of the content of this track
+@property NSInteger playedCount; // number of times this track has been played
+@property (copy) NSDate *playedDate; // the date and time this track was last played
+@property (readonly) BOOL podcast; // is this track a podcast episode?
+@property NSInteger rating; // the rating of this track (0 to 100)
+@property (readonly) iTunesERtK ratingKind; // the rating kind of this track
+@property (copy, readonly) NSDate *releaseDate; // the release date of this track
+@property (readonly) NSInteger sampleRate; // the sample rate of the track (in Hz)
+@property NSInteger seasonNumber; // the season number of the track
+@property BOOL shufflable; // is this track included when shuffling?
+@property NSInteger skippedCount; // number of times this track has been skipped
+@property (copy) NSDate *skippedDate; // the date and time this track was last skipped
+@property (copy) NSString *show; // the show name of the track
+@property (copy) NSString *sortAlbum; // override string to use for the track when sorting by album
+@property (copy) NSString *sortArtist; // override string to use for the track when sorting by artist
+@property (copy) NSString *sortAlbumArtist; // override string to use for the track when sorting by album artist
+@property (copy) NSString *sortName; // override string to use for the track when sorting by name
+@property (copy) NSString *sortComposer; // override string to use for the track when sorting by composer
+@property (copy) NSString *sortShow; // override string to use for the track when sorting by show name
+@property (readonly) NSInteger size; // the size of the track (in bytes)
+@property double start; // the start time of the track in seconds
+@property (copy, readonly) NSString *time; // the length of the track in MM:SS format
+@property NSInteger trackCount; // the total number of tracks on the source album
+@property NSInteger trackNumber; // the index of the track on the source album
+@property BOOL unplayed; // is this track unplayed?
+@property iTunesEVdK videoKind; // kind of video track
+@property NSInteger volumeAdjustment; // relative volume adjustment of the track (-100% to 100%)
+@property NSInteger year; // the year the track was recorded/released
+
+
+@end
+
+// a track on an audio CD
+@interface iTunesAudioCDTrack : iTunesTrack
+
+@property (copy, readonly) NSURL *location; // the location of the file represented by this track
+
+
+@end
+
+// a track residing on a portable music player
+@interface iTunesDeviceTrack : iTunesTrack
+
+
+@end
+
+// a track representing an audio file (MP3, AIFF, etc.)
+@interface iTunesFileTrack : iTunesTrack
+
+@property (copy) NSURL *location; // the location of the file represented by this track
+
+- (void) refresh; // update file track information from the current information in the track’s file
+
+@end
+
+// a track residing in a shared library
+@interface iTunesSharedTrack : iTunesTrack
+
+
+@end
+
+// a track representing a network stream
+@interface iTunesURLTrack : iTunesTrack
+
+@property (copy) NSString *address; // the URL for this track
+
+- (void) download; // download podcast episode
+
+@end
+
+// custom playlists created by the user
+@interface iTunesUserPlaylist : iTunesPlaylist
+
+- (SBElementArray *) fileTracks;
+- (SBElementArray *) URLTracks;
+- (SBElementArray *) sharedTracks;
+
+@property BOOL shared; // is this playlist shared?
+@property (readonly) BOOL smart; // is this a Smart Playlist?
+
+
+@end
+
+// a folder that contains other playlists
+@interface iTunesFolderPlaylist : iTunesUserPlaylist
+
+
+@end
+
+// a visual plug-in
+@interface iTunesVisual : iTunesItem
+
+
+@end
+
+// any window
+@interface iTunesWindow : iTunesItem
+
+@property NSRect bounds; // the boundary rectangle for the window
+@property (readonly) BOOL closeable; // does the window have a close box?
+@property (readonly) BOOL collapseable; // does the window have a collapse (windowshade) box?
+@property BOOL collapsed; // is the window collapsed?
+@property NSPoint position; // the upper left position of the window
+@property (readonly) BOOL resizable; // is the window resizable?
+@property BOOL visible; // is the window visible?
+@property (readonly) BOOL zoomable; // is the window zoomable?
+@property BOOL zoomed; // is the window zoomed?
+
+
+@end
+
+// the main iTunes window
+@interface iTunesBrowserWindow : iTunesWindow
+
+@property BOOL minimized; // is the small player visible?
+@property (copy, readonly) SBObject *selection; // the selected songs
+@property (copy) iTunesPlaylist *view; // the playlist currently displayed in the window
+
+
+@end
+
+// the iTunes equalizer window
+@interface iTunesEQWindow : iTunesWindow
+
+@property BOOL minimized; // is the small EQ window visible?
+
+
+@end
+
+// a sub-window showing a single playlist
+@interface iTunesPlaylistWindow : iTunesWindow
+
+@property (copy, readonly) SBObject *selection; // the selected songs
+@property (copy, readonly) iTunesPlaylist *view; // the playlist displayed in the window
+
+
+@end
+
diff --git a/iTunes-icon.icns b/iTunes-icon.icns
new file mode 100644
index 0000000..7e92888
Binary files /dev/null and b/iTunes-icon.icns differ
|