diff --git a/macosx/InfoWindowController.h b/macosx/InfoWindowController.h index 0f12ee2da..10a142693 100644 --- a/macosx/InfoWindowController.h +++ b/macosx/InfoWindowController.h @@ -53,6 +53,7 @@ IBOutlet NSTextView * fCommentView; IBOutlet NSButton * fRevealDataButton; + NSArray * fTrackers; IBOutlet TrackerTableView * fTrackerTable; TrackerCell * fTrackerCell; IBOutlet NSSegmentedControl * fTrackerAddRemoveControl; @@ -76,11 +77,6 @@ * fUploadLimitLabel, * fDownloadLimitLabel, * fPeersConnectLabel, * fPeersConnectField; - NSArray * fTrackers; - NSCache * fTrackerIconCache; - NSMutableDictionary * fTrackerIconCacheLeopard; - NSMutableSet * fTrackerIconLoading; - NSString * fInitialString; QLPreviewPanel * fPreviewPanel; diff --git a/macosx/InfoWindowController.m b/macosx/InfoWindowController.m index 1f6f76afb..3f2c4ebe0 100644 --- a/macosx/InfoWindowController.m +++ b/macosx/InfoWindowController.m @@ -90,6 +90,7 @@ typedef enum - (BOOL) canQuickLook; - (BOOL) canQuickLookFile: (FileListNode *) item; +#warning lookie /*- (void) addTrackers; - (void) removeTrackers;*/ @@ -201,12 +202,6 @@ typedef enum [self setWebSeedTableHidden: YES animate: NO]; - if ([NSApp isOnSnowLeopardOrBetter]) - fTrackerIconCache = [[NSCache alloc] init]; - else - fTrackerIconCacheLeopard = [[NSMutableDictionary alloc] init]; - fTrackerIconLoading = [[NSMutableSet alloc] init]; - //set blank inspector [self setInfoForTorrents: [NSArray array]]; @@ -246,10 +241,6 @@ typedef enum [fTrackerCell release]; - [fTrackerIconCache release]; - [fTrackerIconCacheLeopard release]; - [fTrackerIconLoading release]; - [fPreviewPanel release]; [super dealloc]; @@ -900,73 +891,16 @@ typedef enum } else if (tableView == fTrackerTable) { - //NSString * ident = [column identifier]; id item = [fTrackers objectAtIndex: row]; - #warning isn't used - /*if ([ident isEqualToString: @"Icon"]) - { - NSAssert([item isKindOfClass: [TrackerNode class]], @"Value passed to tracker table's icon row is not a TrackerNode!"); - - NSURL * address = [NSURL URLWithString: [(TrackerNode *)item host]]; - NSArray * hostComponents = [[address host] componentsSeparatedByString: @"."]; - - //let's try getting the tracker address without using any subdomains - NSString * baseAddress; - if ([hostComponents count] > 1) - baseAddress = [NSString stringWithFormat: @"http://%@.%@", - [hostComponents objectAtIndex: [hostComponents count] - 2], [hostComponents lastObject]]; - else - baseAddress = [NSString stringWithFormat: @"http://%@", [hostComponents lastObject]]; - - id icon = [NSApp isOnSnowLeopardOrBetter] ? [fTrackerIconCache objectForKey: baseAddress] - : [fTrackerIconCacheLeopard objectForKey: baseAddress]; - if (!icon && ![fTrackerIconLoading containsObject: baseAddress]) - { - [fTrackerIconLoading addObject: baseAddress]; - [NSThread detachNewThreadSelector: @selector(loadTrackerIcon:) toTarget: self withObject: baseAddress]; - } - - return (icon && icon != [NSNull null]) ? icon : [NSImage imageNamed: @"FavIcon.png"]; - }*/ - if ([item isKindOfClass: [NSNumber class]]) return [NSString stringWithFormat: NSLocalizedString(@"Tier %d", "Inspector -> tracker table"), [item integerValue]]; else return item; - } return nil; } -- (void) loadTrackerIcon: (NSString *) baseAddress -{ - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - - NSURL * favIconUrl = [NSURL URLWithString: [baseAddress stringByAppendingPathComponent: @"favicon.ico"]]; - - NSURLRequest * request = [NSURLRequest requestWithURL: favIconUrl cachePolicy: NSURLRequestUseProtocolCachePolicy - timeoutInterval: 30.0]; - NSData * iconData = [NSURLConnection sendSynchronousRequest: request returningResponse: NULL error: NULL]; - NSImage * icon = [[NSImage alloc] initWithData: iconData]; - - if (icon) - { - [fTrackerIconCache setObject: icon forKey: baseAddress]; - [fTrackerIconCacheLeopard setObject: icon forKey: baseAddress]; - [icon release]; - } - else - { - [fTrackerIconCache setObject: [NSNull null] forKey: baseAddress]; - [fTrackerIconCacheLeopard setObject: [NSNull null] forKey: baseAddress]; - } - - [fTrackerIconLoading removeObject: baseAddress]; - - [pool drain]; -} - - (NSCell *) tableView: (NSTableView *) tableView dataCellForTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { if (tableView == fTrackerTable) diff --git a/macosx/TrackerCell.m b/macosx/TrackerCell.m index 743685d9c..2f61bb53e 100644 --- a/macosx/TrackerCell.m +++ b/macosx/TrackerCell.m @@ -23,18 +23,21 @@ *****************************************************************************/ #import "TrackerCell.h" +#import "NSApplicationAdditions.h" #import "TrackerNode.h" -#define PADDING_HORIZONAL 2.0 -#define PADDING_STATUS_HORIZONAL 4.0 +#define PADDING_HORIZONAL 3.0 +#define PADDING_STATUS_HORIZONAL 3.0 #define ICON_SIZE 14.0 -#define PADDING_BETWEEN_IMAGE_AND_NAME 4.0 +#define PADDING_BETWEEN_ICON_AND_NAME 4.0 +#define PADDING_ABOVE_ICON 1.0 #define PADDING_ABOVE_NAME 2.0 #define PADDING_BETWEEN_LINES 1.0 @interface TrackerCell (Private) - (NSImage *) favIcon; +- (void) loadTrackerIcon: (NSString *) baseAddress; - (NSRect) imageRectForBounds: (NSRect) bounds; - (NSRect) rectForNameWithString: (NSAttributedString *) string inBounds: (NSRect) bounds; @@ -47,6 +50,20 @@ @implementation TrackerCell +//make the favicons accessible to all tracker cells +NSCache * fTrackerIconCache; +NSMutableDictionary * fTrackerIconCacheLeopard; +NSMutableSet * fTrackerIconLoading; + ++ (void) initialize +{ + if ([NSApp isOnSnowLeopardOrBetter]) + fTrackerIconCache = [[NSCache alloc] init]; + else + fTrackerIconCacheLeopard = [[NSMutableDictionary alloc] init]; + fTrackerIconLoading = [[NSMutableSet alloc] init]; +} + - (id) init { if ((self = [super init])) @@ -88,8 +105,16 @@ - (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView { //icon - [[self favIcon] drawInRect: [self imageRectForBounds: cellFrame] fromRect: NSZeroRect operation: NSCompositeSourceOver - fraction: 1.0]; + if ([NSApp isOnSnowLeopardOrBetter]) + [[self favIcon] drawInRect: [self imageRectForBounds: cellFrame] fromRect: NSZeroRect operation: NSCompositeSourceOver + fraction: 1.0 respectFlipped: YES hints: nil]; + else + { + NSImage * icon = [self favIcon]; + [icon setFlipped: YES]; + [icon drawInRect: [self imageRectForBounds: cellFrame] fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0]; + } + NSColor * nameColor, * statusColor; if ([self backgroundStyle] == NSBackgroundStyleDark) @@ -125,20 +150,65 @@ @end - @implementation TrackerCell (Private) -#warning needed? - (NSImage *) favIcon { - return [NSImage imageNamed: @"FavIcon.png"]; + NSURL * address = [NSURL URLWithString: [(TrackerNode *)[self objectValue] host]]; + NSArray * hostComponents = [[address host] componentsSeparatedByString: @"."]; + + //let's try getting the tracker address without using any subdomains + NSString * baseAddress; + if ([hostComponents count] > 1) + baseAddress = [NSString stringWithFormat: @"http://%@.%@", + [hostComponents objectAtIndex: [hostComponents count] - 2], [hostComponents lastObject]]; + else + baseAddress = [NSString stringWithFormat: @"http://%@", [hostComponents lastObject]]; + + id icon = [NSApp isOnSnowLeopardOrBetter] ? [fTrackerIconCache objectForKey: baseAddress] + : [fTrackerIconCacheLeopard objectForKey: baseAddress]; + if (!icon && ![fTrackerIconLoading containsObject: baseAddress]) + { + [fTrackerIconLoading addObject: baseAddress]; + [NSThread detachNewThreadSelector: @selector(loadTrackerIcon:) toTarget: self withObject: baseAddress]; + } + + return (icon && icon != [NSNull null]) ? icon : [NSImage imageNamed: @"FavIcon.png"]; +} + +- (void) loadTrackerIcon: (NSString *) baseAddress +{ + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + + NSURL * favIconUrl = [NSURL URLWithString: [baseAddress stringByAppendingPathComponent: @"favicon.ico"]]; + + NSURLRequest * request = [NSURLRequest requestWithURL: favIconUrl cachePolicy: NSURLRequestUseProtocolCachePolicy + timeoutInterval: 30.0]; + NSData * iconData = [NSURLConnection sendSynchronousRequest: request returningResponse: NULL error: NULL]; + NSImage * icon = [[NSImage alloc] initWithData: iconData]; + + if (icon) + { + [fTrackerIconCache setObject: icon forKey: baseAddress]; + [fTrackerIconCacheLeopard setObject: icon forKey: baseAddress]; + [icon release]; + } + else + { + [fTrackerIconCache setObject: [NSNull null] forKey: baseAddress]; + [fTrackerIconCacheLeopard setObject: [NSNull null] forKey: baseAddress]; + } + + [fTrackerIconLoading removeObject: baseAddress]; + + [pool drain]; } - (NSRect) imageRectForBounds: (NSRect) bounds { NSRect result = bounds; result.origin.x += PADDING_HORIZONAL; - result.origin.y += PADDING_ABOVE_NAME; + result.origin.y += PADDING_ABOVE_ICON; result.size = NSMakeSize(ICON_SIZE, ICON_SIZE); return result; @@ -149,7 +219,7 @@ const NSSize nameSize = [string size]; NSRect result = bounds; - result.origin.x += PADDING_HORIZONAL + ICON_SIZE + PADDING_BETWEEN_IMAGE_AND_NAME; + result.origin.x += PADDING_HORIZONAL + ICON_SIZE + PADDING_BETWEEN_ICON_AND_NAME; result.origin.y += PADDING_ABOVE_NAME; result.size = nameSize; diff --git a/macosx/TrackerNode.h b/macosx/TrackerNode.h index 00c0eff48..3cb116693 100644 --- a/macosx/TrackerNode.h +++ b/macosx/TrackerNode.h @@ -39,38 +39,4 @@ - (NSString *) nextAnnounceStatusString; - (NSString *) lastScrapeStatusString; -#if 0 - -- (BOOL) isActive; -- (int) tier; - -- (BOOL) isAnnouncing; -- (BOOL) hasAnnounced; -- (BOOL) willAnnounce; -- (NSDate *) nextAnnounceDate; - -- (BOOL) isScraping; -- (BOOL) hasScraped; -- (BOOL) willScrape; -- (NSDate *) nextScrapeDate; - -- (int) lastAnnouncePeerCount; -- (NSString *) lastAnnounceResult; -- (NSDate *) lastAnnounceDate; -- (NSDate *) lastAnnounceStartDate; -- (BOOL) lastAnnounceSucceeded; -- (NSDate *) lastAnnounceDate; - -- (NSString *) lastScrapeResult; -- (NSDate *) lastScrapeDate; -- (NSDate *) lastScrapeStartDate; -- (BOOL) lastScrapeSucceeded; -- (NSDate *) lastScrapeDate; - -- (int) seederCount; -- (int) leecherCount; -- (int) downloadCount; - -#endif - @end diff --git a/macosx/TrackerNode.m b/macosx/TrackerNode.m index 5aa7bd386..9679db927 100644 --- a/macosx/TrackerNode.m +++ b/macosx/TrackerNode.m @@ -90,7 +90,6 @@ return dateString; } -#warning consider "isActive" - (NSString *) nextAnnounceStatusString { if (fStat.isAnnouncing)