From: <ho...@us...> - 2010-10-23 18:12:42
|
Revision: 17331 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=17331&view=rev Author: hofman Date: 2010-10-23 18:12:35 +0000 (Sat, 23 Oct 2010) Log Message: ----------- let webkit download links, set the shared download manager as download delegate so we can still manage the downloads and provide a destination Modified Paths: -------------- trunk/bibdesk/BDSKDownloadManager.h trunk/bibdesk/BDSKDownloadManager.m trunk/bibdesk/BDSKWebGroup.m Modified: trunk/bibdesk/BDSKDownloadManager.h =================================================================== --- trunk/bibdesk/BDSKDownloadManager.h 2010-10-23 11:46:56 UTC (rev 17330) +++ trunk/bibdesk/BDSKDownloadManager.h 2010-10-23 18:12:35 UTC (rev 17331) @@ -51,8 +51,6 @@ + (id)sharedManager; -- (void)addDownloadForURL:(NSURL *)aURL; - - (NSArray *)downloads; - (BOOL)removeFinishedDownloads; @@ -70,20 +68,24 @@ @interface BDSKDownload : NSObject { NSUInteger uniqueID; - NSURL *URL; NSURL *fileURL; NSInteger status; - NSURLDownload *download; + NSURLDownload *URLDownload; } -- (id)initWithURL:(NSURL *)aURL; +- (id)initWithURLDownload:(NSURLDownload *)aDownload; +- (NSURLDownload *)URLDownload; + - (NSUInteger)uniqueID; - (NSURL *)URL; - (NSURL *)fileURL; +- (void)setFileURL:(NSURL *)newFileURL; - (NSString *)fileName; - (BDSKDownloadStatus)status; -- (void)cancel:(id)sender; +- (void)cancel; +- (void)finish; +- (void)fail; @end Modified: trunk/bibdesk/BDSKDownloadManager.m =================================================================== --- trunk/bibdesk/BDSKDownloadManager.m 2010-10-23 11:46:56 UTC (rev 17330) +++ trunk/bibdesk/BDSKDownloadManager.m 2010-10-23 18:12:35 UTC (rev 17331) @@ -60,21 +60,6 @@ return self; } -- (void)addDownloadForURL:(NSURL *)aURL { - NSURLDownload *download = [[BDSKDownload alloc] initWithURL:aURL]; - if (download) { - [downloads addObject:download]; - [download release]; - } -} - -- (void)removeDownload:(BDSKDownload *)download { - if (download) { - [download cancel:nil]; - [downloads removeObject:download]; - } -} - - (NSArray *)downloads { return downloads; } @@ -95,6 +80,14 @@ [[NSUserDefaults standardUserDefaults] setBool:flag forKey:BDSKRemoveFailedDownloadsKey]; } +- (BDSKDownload *)downloadForURLDownload:(NSURLDownload *)URLDownload { + for (BDSKDownload *download in downloads) { + if ([download URLDownload] == URLDownload) + return download; + } + return nil; +} + - (BDSKDownload *)downloadWithUniqueID:(NSUInteger)uniqueID { for (BDSKDownload *download in downloads) { if ([download uniqueID] == uniqueID) @@ -112,11 +105,13 @@ } - (void)cancel:(NSUInteger)uniqueID { - [[self downloadWithUniqueID:uniqueID] cancel:nil]; + [[self downloadWithUniqueID:uniqueID] cancel]; } - (void)remove:(NSUInteger)uniqueID { - [self removeDownload:[self downloadWithUniqueID:uniqueID]]; + BDSKDownload *download = [self downloadWithUniqueID:uniqueID]; + if (download) + [downloads removeObject:download]; } + (NSString *)webScriptNameForSelector:(SEL)aSelector { @@ -141,6 +136,61 @@ return [NSArray arrayWithObjects:@"removeFinishedDownloads", @"removeFailedDownloads", nil]; } +#pragma mark NSURLDownload delegate protocol + +- (void)downloadDidBegin:(NSURLDownload *)URLDownload { + [downloads addObject:[[[BDSKDownload alloc] initWithURLDownload:URLDownload] autorelease]]; +} + +- (void)downloadDidFinish:(NSURLDownload *)URLDownload { + BDSKDownload *download = [self downloadForURLDownload:URLDownload]; + [download finish]; + + if ([[NSUserDefaults standardUserDefaults] boolForKey:BDSKRemoveFinishedDownloadsKey] && download) + [downloads removeObject:download]; +} + +- (void)download:(NSURLDownload *)URLDownload didFailWithError:(NSError *)error { + BDSKDownload *download = [self downloadForURLDownload:URLDownload]; + [download fail]; + + if ([[NSUserDefaults standardUserDefaults] boolForKey:BDSKRemoveFailedDownloadsKey] && download) + [downloads removeObject:download]; + + NSString *errorDescription = [error localizedDescription] ?: NSLocalizedString(@"An error occured during download.", @"Informative text in alert dialog"); + NSAlert *alert = [NSAlert alertWithMessageText:NSLocalizedString(@"Download Failed", @"Message in alert dialog when download failed") + defaultButton:nil + alternateButton:nil + otherButton:nil + informativeTextWithFormat:errorDescription]; + [alert runModal]; +} + +- (void)download:(NSURLDownload *)URLDownload decideDestinationWithSuggestedFilename:(NSString *)filename { + NSString *extension = [filename pathExtension]; + + NSSavePanel *sPanel = [NSSavePanel savePanel]; + if (NO == [extension isEqualToString:@""]) + [sPanel setRequiredFileType:extension]; + [sPanel setAllowsOtherFileTypes:YES]; + [sPanel setCanSelectHiddenExtension:YES]; + + // we need to do this modally, not using a sheet, as the download may otherwise finish on Leopard before the sheet is done + NSInteger returnCode = [sPanel runModalForDirectory:nil file:filename]; + if (returnCode == NSOKButton) + [URLDownload setDestination:[sPanel filename] allowOverwrite:YES]; + else + [URLDownload cancel]; +} + +- (void)download:(NSURLDownload *)URLDownload didCreateDestination:(NSString *)path { + [[self downloadForURLDownload:URLDownload] setFileURL:[NSURL fileURLWithPath:path]]; +} + +- (BOOL)download:(NSURLDownload *)URLDownload shouldDecodeSourceDataOfMIMEType:(NSString *)encodingType { + return YES; +} + @end #pragma mark - @@ -149,45 +199,49 @@ static NSUInteger currentUniqueID = 0; -- (id)initWithURL:(NSURL *)aURL { +- (id)initWithURLDownload:(NSURLDownload *)aURLDownload { if (self = [super init]) { uniqueID = ++currentUniqueID; - URL = [aURL retain]; fileURL = nil; status = BDSKDownloadStatusDownloading; - download = [[WebDownload alloc] initWithRequest:[NSURLRequest requestWithURL:URL] delegate:self]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(cancel:) - name:NSApplicationWillTerminateNotification - object:NSApp]; + URLDownload = [aURLDownload retain]; } return self; } - (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [download cancel]; - BDSKDESTROY(URL); BDSKDESTROY(fileURL); - BDSKDESTROY(download); + BDSKDESTROY(URLDownload); [super dealloc]; } +- (NSURLDownload *)URLDownload { + return URLDownload; +} + - (NSUInteger)uniqueID { return uniqueID; } - (NSURL *)URL { - return URL; + return [[URLDownload request] URL]; } - (NSURL *)fileURL { return fileURL; } +- (void)setFileURL:(NSURL *)newFileURL { + if (fileURL != newFileURL) { + [fileURL release]; + fileURL = [newFileURL retain]; + } +} + - (NSString *)fileName { NSString *fileName = [fileURL lastPathComponent]; if (fileName == nil) { + NSURL *URL = [self URL]; if ([[URL path] length] > 1) { fileName = [URL lastPathComponent]; } else { @@ -203,64 +257,19 @@ return status; } -- (void)cancel:(id)sender { - [download cancel]; +- (void)cancel { + [URLDownload cancel]; } -#pragma mark NSURLDownloadDelegate protocol - -- (void)download:(NSURLDownload *)aDownload decideDestinationWithSuggestedFilename:(NSString *)filename { - NSString *extension = [filename pathExtension]; - - NSSavePanel *sPanel = [NSSavePanel savePanel]; - if (NO == [extension isEqualToString:@""]) - [sPanel setRequiredFileType:extension]; - [sPanel setAllowsOtherFileTypes:YES]; - [sPanel setCanSelectHiddenExtension:YES]; - - // we need to do this modally, not using a sheet, as the download may otherwise finish on Leopard before the sheet is done - NSInteger returnCode = [sPanel runModalForDirectory:nil file:filename]; - if (returnCode == NSOKButton) { - [download setDestination:[sPanel filename] allowOverwrite:YES]; - } else { - [download cancel]; - } -} - -- (void)download:(NSURLDownload *)download didCreateDestination:(NSString *)path { - [fileURL release]; - fileURL = path ? [[NSURL alloc] initFileURLWithPath:path] : nil; -} - -- (BOOL)download:(NSURLDownload *)aDownload shouldDecodeSourceDataOfMIMEType:(NSString *)encodingType { - return YES; -} - -- (void)downloadDidFinish:(NSURLDownload *)aDownload { - BDSKDESTROY(download); +- (void)finish { status = BDSKDownloadStatusFinished; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - if ([[NSUserDefaults standardUserDefaults] boolForKey:BDSKRemoveFinishedDownloadsKey]) - [[BDSKDownloadManager sharedManager] removeDownload:self]; + BDSKDESTROY(URLDownload); } -- (void)download:(NSURLDownload *)aDownload didFailWithError:(NSError *)error { - BDSKDESTROY(download); - BDSKDESTROY(fileURL); +- (void)fail { status = BDSKDownloadStatusFailed; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - if ([[NSUserDefaults standardUserDefaults] boolForKey:BDSKRemoveFailedDownloadsKey]) - [[BDSKDownloadManager sharedManager] removeDownload:self]; - - NSString *errorDescription = [error localizedDescription] ?: NSLocalizedString(@"An error occured during download.", @"Informative text in alert dialog"); - NSAlert *alert = [NSAlert alertWithMessageText:NSLocalizedString(@"Download Failed", @"Message in alert dialog when download failed") - defaultButton:nil - alternateButton:nil - otherButton:nil - informativeTextWithFormat:errorDescription]; - [alert runModal]; + [self setFileURL:nil]; + BDSKDESTROY(URLDownload); } @end Modified: trunk/bibdesk/BDSKWebGroup.m =================================================================== --- trunk/bibdesk/BDSKWebGroup.m 2010-10-23 11:46:56 UTC (rev 17330) +++ trunk/bibdesk/BDSKWebGroup.m 2010-10-23 18:12:35 UTC (rev 17331) @@ -110,6 +110,7 @@ [webView setFrameLoadDelegate:nil]; [webView setUIDelegate:nil]; [webView setEditingDelegate:nil]; + [webView setDownloadDelegate:nil]; delegate = nil; BDSKDESTROY(label); BDSKDESTROY(webView); @@ -131,6 +132,7 @@ [webView setFrameLoadDelegate:self]; [webView setUIDelegate:self]; [webView setEditingDelegate:self]; + [webView setDownloadDelegate:[BDSKDownloadManager sharedManager]]; [webView setHostWindow:[[[document windowControllers] objectAtIndex:0] window]]; } @@ -219,14 +221,6 @@ [[BDSKBookmarkController sharedBookmarkController] addBookmarkWithUrlString:URLString proposedName:title modalForWindow:[webView window]]; } -- (void)downloadLink:(id)sender { - NSURL *linkURL = (NSURL *)[[sender representedObject] objectForKey:WebElementLinkURLKey]; - if (linkURL) - [[BDSKDownloadManager sharedManager] addDownloadForURL:linkURL]; - else - NSBeep(); -} - - (void)revealLink:(id)sender { NSURL *linkURL = (NSURL *)[[sender representedObject] objectForKey:WebElementLinkURLKey]; if ([linkURL isFileURL]) @@ -301,7 +295,7 @@ else if (type != BDSKUnknownStringType) newPubs = [BDSKStringParser itemsFromString:string ofType:type error:&error]; } - else if (nil == newPubs && [WebView canShowMIMETypeAsHTML:MIMEType]) { + else if (nil == newPubs && [MIMEType hasPrefix:@"text/"]) { // !!! logs are here to help diagnose problems that users are reporting // but unsupported web pages are far too common, we don't want to flood the console if ([[error domain] isEqualToString:[NSError localErrorDomain]] == NO || [error code] != kBDSKWebParserUnsupported) @@ -387,7 +381,7 @@ NSMenuItem *item; // @@ we may want to add support for some of these (downloading), but it's confusing to have them in the menu for now - NSArray *itemsToRemove = [NSArray arrayWithObjects:[NSNumber numberWithInteger:WebMenuItemTagOpenLinkInNewWindow], [NSNumber numberWithInteger:WebMenuItemTagDownloadLinkToDisk], [NSNumber numberWithInteger:WebMenuItemTagOpenImageInNewWindow], [NSNumber numberWithInteger:WebMenuItemTagDownloadImageToDisk], [NSNumber numberWithInteger:WebMenuItemTagOpenFrameInNewWindow], nil]; + NSArray *itemsToRemove = [NSArray arrayWithObjects:[NSNumber numberWithInteger:WebMenuItemTagOpenLinkInNewWindow], [NSNumber numberWithInteger:WebMenuItemTagOpenImageInNewWindow], [NSNumber numberWithInteger:WebMenuItemTagDownloadImageToDisk], [NSNumber numberWithInteger:WebMenuItemTagOpenFrameInNewWindow], nil]; for (NSNumber *n in itemsToRemove) { NSUInteger toRemove = [[menuItems valueForKey:@"tag"] indexOfObject:n]; if (toRemove != NSNotFound) @@ -412,13 +406,6 @@ [item setRepresentedObject:element]; [menuItems insertObject:[item autorelease] atIndex:++i]; - item = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:[NSLocalizedString(@"Save Link As", @"Menu item title") stringByAppendingEllipsis] - action:@selector(downloadLink:) - keyEquivalent:@""]; - [item setTarget:self]; - [item setRepresentedObject:element]; - [menuItems insertObject:[item autorelease] atIndex:++i]; - if ([[element objectForKey:WebElementLinkURLKey] isFileURL]) { item = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:[NSLocalizedString(@"Reveal Link", @"Menu item title") stringByAppendingEllipsis] action:@selector(revealLink:) @@ -558,6 +545,7 @@ webView = [[WebView alloc] init]; [webView setUIDelegate:self]; [webView setFrameLoadDelegate:self]; + [webView setDownloadDelegate:[BDSKDownloadManager sharedManager]]; [window setContentView:webView]; } return self; @@ -566,6 +554,7 @@ - (void)dealloc { [webView setUIDelegate:nil]; [webView setFrameLoadDelegate:nil]; + [webView setDownloadDelegate:nil]; BDSKDESTROY(webView); [super dealloc]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |