source: trunk/Sparkle/SUUpdateAlert.m @ 1046

Revision 630, 6.7 KB checked in by speck, 3 years ago (diff)

Sparkle update with latest bug fixes.

Line 
1//
2//  SUUpdateAlert.m
3//  Sparkle
4//
5//  Created by Andy Matuschak on 3/12/06.
6//  Copyright 2006 Andy Matuschak. All rights reserved.
7//
8
9#import "SUUpdateAlert.h"
10
11#import "SUHost.h"
12#import <WebKit/WebKit.h>
13
14@implementation SUUpdateAlert
15
16- (id)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)aHost
17{
18    self = [super initWithHost:host windowNibName:@"SUUpdateAlert"];
19    if (self)
20    {
21        host = [aHost retain];
22        updateItem = [item retain];
23        [self setShouldCascadeWindows:NO];
24    }
25    return self;
26}
27
28- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@>", [self class], [host bundlePath]]; }
29
30- (void)dealloc
31{
32    [updateItem release];
33    [host release];
34    [super dealloc];
35}
36
37- (void)endWithSelection:(SUUpdateAlertChoice)choice
38{
39    [releaseNotesView stopLoading:self];
40    [releaseNotesView setFrameLoadDelegate:nil];
41    [releaseNotesView setPolicyDelegate:nil];
42    [self close];
43    if ([delegate respondsToSelector:@selector(updateAlert:finishedWithChoice:)])
44        [delegate updateAlert:self finishedWithChoice:choice];
45}
46
47- (IBAction)installUpdate:sender
48{
49    [self endWithSelection:SUInstallUpdateChoice];
50}
51
52- (IBAction)skipThisVersion:sender
53{
54    [self endWithSelection:SUSkipThisVersionChoice];
55}
56
57- (IBAction)remindMeLater:sender
58{
59    [self endWithSelection:SURemindMeLaterChoice];
60}
61
62- (void)displayReleaseNotes
63{
64    // Set the default font
65    [releaseNotesView setPreferencesIdentifier:[SPARKLE_BUNDLE bundleIdentifier]];
66    [[releaseNotesView preferences] setStandardFontFamily:[[NSFont systemFontOfSize:8] familyName]];
67    [[releaseNotesView preferences] setDefaultFontSize:(int)[NSFont systemFontSizeForControlSize:NSSmallControlSize]];
68    [releaseNotesView setFrameLoadDelegate:self];
69    [releaseNotesView setPolicyDelegate:self];
70   
71    // Stick a nice big spinner in the middle of the web view until the page is loaded.
72    NSRect frame = [[releaseNotesView superview] frame];
73    releaseNotesSpinner = [[[NSProgressIndicator alloc] initWithFrame:NSMakeRect(NSMidX(frame)-16, NSMidY(frame)-16, 32, 32)] autorelease];
74    [releaseNotesSpinner setStyle:NSProgressIndicatorSpinningStyle];
75    [releaseNotesSpinner startAnimation:self];
76    webViewFinishedLoading = NO;
77    [[releaseNotesView superview] addSubview:releaseNotesSpinner];
78   
79    // If there's a release notes URL, load it; otherwise, just stick the contents of the description into the web view.
80    if ([updateItem releaseNotesURL])
81    {
82        if ([[updateItem releaseNotesURL] isFileURL])
83        {
84            [[releaseNotesView mainFrame] loadHTMLString:@"Release notes with file:// URLs are not supported for security reasons&mdash;Javascript would be able to read files on your file system." baseURL:nil];
85        }
86        else
87        {
88            [[releaseNotesView mainFrame] loadRequest:[NSURLRequest requestWithURL:[updateItem releaseNotesURL] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30]];
89        }
90    }
91    else
92    {
93        [[releaseNotesView mainFrame] loadHTMLString:[updateItem itemDescription] baseURL:nil];
94    }   
95}
96
97- (BOOL)showsReleaseNotes
98{
99    NSNumber *shouldShowReleaseNotes = [host objectForInfoDictionaryKey:SUShowReleaseNotesKey];
100    if (shouldShowReleaseNotes == nil)
101        return YES; // defaults to YES
102    else
103        return [shouldShowReleaseNotes boolValue];
104}
105
106- (BOOL)allowsAutomaticUpdates
107{
108    if (![host objectForInfoDictionaryKey:SUAllowsAutomaticUpdatesKey])
109        return YES; // defaults to YES
110    return [host boolForInfoDictionaryKey:SUAllowsAutomaticUpdatesKey];
111}
112
113- (void)awakeFromNib
114{   
115    [[self window] setLevel:NSFloatingWindowLevel];
116       
117    // We're gonna do some frame magic to match the window's size to the description field and the presence of the release notes view.
118    NSRect frame = [[self window] frame];
119   
120    if (![self showsReleaseNotes])
121    {
122        // Resize the window to be appropriate for not having a huge release notes view.
123        frame.size.height -= [releaseNotesView frame].size.height + 40; // Extra 40 is for the release notes label and margin.
124        [[self window] setShowsResizeIndicator:NO];
125    }
126   
127    if (![self allowsAutomaticUpdates])
128    {
129        NSRect boxFrame = [[[releaseNotesView superview] superview] frame];
130        boxFrame.origin.y -= 20;
131        boxFrame.size.height += 20;
132        [[[releaseNotesView superview] superview] setFrame:boxFrame];
133    }
134   
135    [[self window] setFrame:frame display:NO];
136    [[self window] center];
137   
138    if ([self showsReleaseNotes])
139    {
140        [self displayReleaseNotes];
141    }
142}
143
144- (BOOL)windowShouldClose:note
145{
146    [self endWithSelection:SURemindMeLaterChoice];
147    return YES;
148}
149
150- (NSImage *)applicationIcon
151{
152    return [host icon];
153}
154
155- (NSString *)titleText
156{
157    return [NSString stringWithFormat:SULocalizedString(@"A new version of %@ is available!", nil), [host name]];
158}
159
160- (NSString *)descriptionText
161{
162    NSString *updateItemVersion = [updateItem displayVersionString];
163    NSString *hostVersion = [host displayVersion];
164    // Display more info if the version strings are the same; useful for betas.
165    if ([updateItemVersion isEqualToString:hostVersion])
166    {
167        updateItemVersion = [updateItemVersion stringByAppendingFormat:@" (%@)", [updateItem versionString]];
168        hostVersion = [hostVersion stringByAppendingFormat:@" (%@)", [host version]];
169    }
170    return [NSString stringWithFormat:SULocalizedString(@"%@ %@ is now available--you have %@. Would you like to download it now?", nil), [host name], updateItemVersion, hostVersion];
171}
172
173- (void)webView:(WebView *)sender didFinishLoadForFrame:frame
174{
175    if ([frame parentFrame] == nil) {
176        webViewFinishedLoading = YES;
177        [releaseNotesSpinner setHidden:YES];
178        [sender display]; // necessary to prevent weird scroll bar artifacting
179    }
180}
181
182- (void)webView:sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:frame decisionListener:listener
183{
184    if (webViewFinishedLoading == YES) {
185        [[NSWorkspace sharedWorkspace] openURL:[request URL]];
186       
187        [listener ignore];
188    }   
189    else {
190        [listener use];
191    }
192}
193
194// Clean up the contextual menu.
195- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems
196{
197    NSMutableArray *webViewMenuItems = [[defaultMenuItems mutableCopy] autorelease];
198   
199    if (webViewMenuItems)
200    {
201        NSEnumerator *itemEnumerator = [defaultMenuItems objectEnumerator];
202        NSMenuItem *menuItem = nil;
203        while ((menuItem = [itemEnumerator nextObject]))
204        {
205            NSInteger tag = [menuItem tag];
206           
207            switch (tag)
208            {
209                case WebMenuItemTagOpenLinkInNewWindow:
210                case WebMenuItemTagDownloadLinkToDisk:
211                case WebMenuItemTagOpenImageInNewWindow:
212                case WebMenuItemTagDownloadImageToDisk:
213                case WebMenuItemTagOpenFrameInNewWindow:
214                case WebMenuItemTagGoBack:
215                case WebMenuItemTagGoForward:
216                case WebMenuItemTagStop:
217                case WebMenuItemTagReload:     
218                    [webViewMenuItems removeObjectIdenticalTo: menuItem];
219            }
220        }
221    }
222   
223    return webViewMenuItems;
224}
225
226- (void)setDelegate:del
227{
228    delegate = del;
229}
230
231@end
Note: See TracBrowser for help on using the repository browser.