-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathITStatusItem.m
137 lines (110 loc) · 3.44 KB
/
ITStatusItem.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#import "ITStatusItem.h"
#import <CoreServices/CoreServices.h>
@interface ITStatusItemMenuProxy : NSProxy {
id <ITStatusItemMenuProvider> menuProvider;
ITStatusItem *statusItem;
AbsoluteTime cachedTime;
NSMenu *menu;
}
- (id)initWithMenuProvider:(id <ITStatusItemMenuProvider>)provider statusItem:(ITStatusItem *)item;
@end
@implementation ITStatusItemMenuProxy
+ (BOOL)respondsToSelector:(SEL)aSelector {
if (![super respondsToSelector:aSelector]) {
return [NSMenu respondsToSelector:aSelector];
}
return YES;
}
- (id)initWithMenuProvider:(id <ITStatusItemMenuProvider>)provider statusItem:(ITStatusItem *)item {
menuProvider = [provider retain];
statusItem = [item retain];
cachedTime = UpTime();
menu = nil;
return self;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
AbsoluteTime diff = SubAbsoluteFromAbsolute(UpTime(),cachedTime);
if (!menu || diff.lo > 1000000) {
[menu release];
menu = [[menuProvider menuForStatusItem:statusItem] retain];
cachedTime = UpTime();
}
[anInvocation setTarget:menu];
[anInvocation invoke];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
return [NSMenu instanceMethodSignatureForSelector:aSelector];
}
- (void)dealloc {
[menu release];
[statusItem release];
[menuProvider release];
[super dealloc];
}
@end
@class NSStatusBarButton;
@interface NSStatusItem (ITStatusItemHacks)
- (id)_initInStatusBar:(NSStatusBar *)statusBar withLength:(float)length withPriority:(int)priority;
- (NSStatusBarButton *)_button;
@end
@protocol _ITStatusItemNSStatusBarButtonMethods
- (NSMenu *)statusMenu;
- (void)setStatusMenu:(NSMenu *)menu;
@end
@protocol _ITStatusItemNSStatusItemPantherCompatability
- (void)setAlternateImage:(NSImage *)image;
- (NSImage *)alternateImage;
@end
@implementation ITStatusItem
static BOOL _ITStatusItemShouldKillShadow = NO;
+ (void)initialize {
if ((floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_1) && (floor(NSAppKitVersionNumber) <= 663.6)) {
_ITStatusItemShouldKillShadow = YES;
}
}
- (id)initWithStatusBar:(NSStatusBar *)statusBar withLength:(float)length {
return [self _initInStatusBar:statusBar withLength:length withPriority:1000];
}
- (id)_initInStatusBar:(NSStatusBar *)statusBar withLength:(float)length withPriority:(int)priority {
if ((self = [super _initInStatusBar:statusBar withLength:length withPriority:priority])) {
_menuProvider = nil;
_menuProxy = nil;
if (_ITStatusItemShouldKillShadow) {
[[(NSButton *)[self _button] cell] setType:NSNullCellType];
}
[self setHighlightMode:YES];
}
return self;
}
- (NSImage *)alternateImage {
if ([super respondsToSelector:@selector(alternateImage)]) {
return [super alternateImage];
}
return [(NSButton *)[self _button] alternateImage];
}
- (void)setAlternateImage:(NSImage*)image {
if ([super respondsToSelector:@selector(setAlternateImage:)]) {
[super setAlternateImage:image];
return;
}
[(NSButton *)[self _button] setAlternateImage:image];
}
- (id <ITStatusItemMenuProvider>)menuProvider {
return _menuProvider;
}
- (void)setMenuProvider:(id <ITStatusItemMenuProvider>)provider {
[_menuProxy autorelease];
_menuProxy = nil;
_menuProvider = provider;
if (_menuProvider) {
_menuProxy = [[ITStatusItemMenuProxy alloc] initWithMenuProvider:_menuProvider statusItem:self];
[(id <_ITStatusItemNSStatusBarButtonMethods>)[self _button] setStatusMenu:_menuProxy];
} else {
[self setMenu:[self menu]];
}
}
- (void)dealloc {
[_menuProxy release];
[super dealloc];
}
@end