-
Notifications
You must be signed in to change notification settings - Fork 2
/
GrowlVersionDetective.m
100 lines (82 loc) · 2.84 KB
/
GrowlVersionDetective.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//
// GrowlVersionDetective.m
// Growl Version Detective
//
// Created by Peter Hosey on 2008-05-26.
// Copyright 2008 the Growl Project. All rights reserved.
//
#import "GrowlVersionDetective.h"
#import "GVDFoundApp.h"
#import "GVDFileFinder.h"
#import "GrowlFrameworkFinder.h"
#import "GrowlPrefPaneFinder.h"
#import "GrowlPathUtilities.h"
@implementation GrowlVersionDetective
- init {
if((self = [super init])) {
fileFinders = [[NSMutableArray alloc] init];
}
return self;
}
- (void) dealloc {
[fileFinders release];
[super dealloc];
}
- (void) awakeFromNib {
static BOOL nibIsLoaded = NO;
if (!nibIsLoaded) {
nibIsLoaded = YES;
[NSBundle loadNibNamed:@"GrowlVersionDetective" owner:self];
} else {
[self addFileFinder:[[[GrowlPrefPaneFinder alloc] init] autorelease]];
[self addFileFinder:[[[GrowlFrameworkFinder alloc] init] autorelease]];
//Force-load the first view.
//[[tabView tabViewItemAtIndex:0U] setView:[[fileFinders objectAtIndex:0U] view]];
[tabView selectTabViewItemAtIndex:0];
}
}
- (void) addFileFinder:(GVDFileFinder *)finder {
if ([finder localizedTabTitle]) {
NSUInteger idx = [fileFinders indexOfObjectIdenticalTo:finder];
if (idx == NSNotFound) {
[fileFinders addObject:finder];
NSTabViewItem *item = [[[NSTabViewItem alloc] initWithIdentifier:[finder description]] autorelease];
[item setLabel:[finder localizedTabTitle]];
[tabView addTabViewItem:item];
}
}
}
- (void) removeFileFinder:(GVDFileFinder *)finder {
unsigned idx = [fileFinders indexOfObjectIdenticalTo:finder];
if (idx != NSNotFound) {
[fileFinders removeObjectAtIndex:idx];
[tabView removeTabViewItem:[tabView tabViewItemAtIndex:idx]];
}
}
#pragma mark NSApplication delegate conformance
- (BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app {
return YES;
}
- (void) applicationWillTerminate:(NSNotification *)notification {
//Loop through views, unloading them all
unsigned i = [tabView numberOfTabViewItems] - 1U;
NSEnumerator *fileFindersEnum = [fileFinders reverseObjectEnumerator];
GVDFileFinder *finder;
while ((finder = [fileFindersEnum nextObject])) {
NSTabViewItem *item = [tabView tabViewItemAtIndex:i--];
[finder viewWillUnload];
[tabView removeTabViewItem:item];
[finder viewDidUnload];
}
[mainWindow close];
[mainWindow release];
mainWindow = nil;
}
#pragma mark NSApplication delegate conformance
- (void)tabView:(NSTabView *)thisTabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem {
GVDFileFinder *finder = [fileFinders objectAtIndex:[tabView indexOfTabViewItem:tabViewItem]];
//NSTabViewItem will make up an NSView for us, so we can't test whether the tab view item's view is nil.
//Therefore, we just blindly set the view every time. Since GVDFileFinder keeps the view in an ivar, this should not be noticeably inefficient.
[tabViewItem setView:[finder view]];
}
@end