#import "ITStatusItem.h"
-/*************************************************************************/
-#pragma mark -
-#pragma mark EVIL HACKERY
-/*************************************************************************/
+@interface ITStatusItemMenuProxy : NSProxy {
+ id <ITStatusItemMenuProvider> menuProvider;
+ ITStatusItem *statusItem;
+}
-// This stuff is actually implemented by the AppKit.
-// We declare it here to cancel out warnings.
+- (id)initWithMenuProvider:(id <ITStatusItemMenuProvider>)provider statusItem:(ITStatusItem *)item;
-@interface NSStatusBarButton : NSButton
@end
-@interface NSStatusItem (HACKHACKHACKHACK)
-- (id)_initInStatusBar:(NSStatusBar*)statusBar
- withLength:(float)length
- withPriority:(int)priority;
-- (NSStatusBarButton*)_button;
-@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];
+ return self;
+}
-/*************************************************************************/
-#pragma mark -
-#pragma mark PRIVATE METHOD DECLARATIONS
-/*************************************************************************/
+- (void)forwardInvocation:(NSInvocation *)anInvocation {
+ NSMenu *temporaryMenu = [[menuProvider menuForStatusItem:statusItem] retain];
+ [anInvocation setTarget:temporaryMenu];
+ [anInvocation invoke];
+ [temporaryMenu release];
+}
+
+- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
+ NSMenu *temporaryMenu = [[menuProvider menuForStatusItem:statusItem] retain];
+ NSMethodSignature *signature = [temporaryMenu methodSignatureForSelector:aSelector];
+ [temporaryMenu release];
+ return signature;
+}
+
+- (void)dealloc {
+ [statusItem release];
+ [menuProvider release];
+ [super dealloc];
+}
-@interface ITStatusItem (Private)
-- (void)setImage:(NSImage*)image;
-- (NSString*) title;
-- (void)setTitle:(NSString*)title;
-- (void)setSmallTitle:(NSString*)title;
@end
+@class NSStatusBarButton;
-@implementation ITStatusItem
+@interface NSStatusItem (ITStatusItemHacks)
+- (id)_initInStatusBar:(NSStatusBar *)statusBar withLength:(float)length withPriority:(int)priority;
+- (NSStatusBarButton *)_button;
+@end
-/*************************************************************************/
-#pragma mark -
-#pragma mark INITIALIZATION METHODS
-/*************************************************************************/
-
-- (id)initWithStatusBar:(NSStatusBar*)statusBar withLength:(float)length
-{
- if ( ( self = [super _initInStatusBar:statusBar
- withLength:length
- withPriority:1000] ) ) {
-
- //Eliminate the fucking shadow...
- [[[self _button] cell] setType:NSNullCellType];
-
- //Be something other than a dumbshit about highlighting...
- [self setHighlightMode:YES];
- }
- return self;
-}
+@protocol _ITStatusItemNSStatusItemPantherCompatability
+- (void)setAlternateImage:(NSImage *)image;
+- (NSImage *)alternateImage;
+@end
+@implementation ITStatusItem
-/*************************************************************************/
-#pragma mark -
-#pragma mark ACCESSOR METHODS
-/*************************************************************************/
+static BOOL _ITStatusItemShouldKillShadow = NO;
-- (NSImage*)alternateImage {
- return [[self _button] alternateImage];
++ (void)initialize {
+ if ((floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_1) && (floor(NSAppKitVersionNumber) <= 663.6)) {
+ _ITStatusItemShouldKillShadow = YES;
+ }
}
-- (void)setAlternateImage:(NSImage*)image {
- [[self _button] setAlternateImage:image];
+- (id)initWithStatusBar:(NSStatusBar *)statusBar withLength:(float)length {
+ return [self _initInStatusBar:statusBar withLength:length withPriority:1000];
}
-- (void)setImage:(NSImage*)image {
- [super setImage:image];
- if ( [self title] ) {
- [self setTitle:[self title]];
- }
+- (id)_initInStatusBar:(NSStatusBar *)statusBar withLength:(float)length withPriority:(int)priority {
+ if ((self = [super _initInStatusBar:statusBar withLength:length withPriority:priority])) {
+ if (_ITStatusItemShouldKillShadow) {
+ [[(NSButton *)[self _button] cell] setType:NSNullCellType];
+ }
+ [self setHighlightMode:YES];
+ }
+ return self;
}
-- (void)setTitle:(NSString*)title {
- if ( [self image] && (title != nil) ) {
- [self setSmallTitle:title];
- } else {
- [super setTitle:title];
- }
+- (NSImage *)alternateImage {
+ if ([super respondsToSelector:@selector(alternateImage)]) {
+ return [(id <_ITStatusItemNSStatusItemPantherCompatability>)super alternateImage];
+ }
+ return [(NSButton *)[self _button] alternateImage];
}
+- (void)setAlternateImage:(NSImage*)image {
+ if ([super respondsToSelector:@selector(setAlternateImage:)]) {
+ [(id <_ITStatusItemNSStatusItemPantherCompatability>)super setAlternateImage:image];
+ return;
+ }
+ [(NSButton *)[self _button] setAlternateImage:image];
+}
-/*************************************************************************/
-#pragma mark -
-#pragma mark PRIVATE METHODS
-/*************************************************************************/
-
-- (void)setSmallTitle:(NSString*)title {
- NSAttributedString *attrTitle = [[[NSAttributedString alloc] initWithString:title attributes:[NSDictionary dictionaryWithObject:[NSFont fontWithName:@"Lucida Grande" size:12.0] forKey:NSFontAttributeName]] autorelease];
- [self setAttributedTitle:attrTitle];
+- (id <ITStatusItemMenuProvider>)menuProvider {
+ return _menuProvider;
}
+- (void)setMenuProvider:(id <ITStatusItemMenuProvider>)provider {
+ [_menuProvider autorelease];
+ _menuProvider = [provider retain];
+ if (provider) {
+ [self setMenu:[[ITStatusItemMenuProxy alloc] initWithMenuProvider:_menuProvider statusItem:self]];
+ } else {
+ [self setMenu:nil];
+ }
+}
-@end
+@end
\ No newline at end of file