diff options
Diffstat (limited to 'frontends/cocoa/PSMTabBarControl/PSMRolloverButton.m')
-rw-r--r-- | frontends/cocoa/PSMTabBarControl/PSMRolloverButton.m | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/frontends/cocoa/PSMTabBarControl/PSMRolloverButton.m b/frontends/cocoa/PSMTabBarControl/PSMRolloverButton.m new file mode 100644 index 000000000..65df6aa0f --- /dev/null +++ b/frontends/cocoa/PSMTabBarControl/PSMRolloverButton.m @@ -0,0 +1,180 @@ +// +// PSMOverflowPopUpButton.m +// NetScrape +// +// Created by John Pannell on 8/4/04. +// Copyright 2004 Positive Spin Media. All rights reserved. +// + +#import "PSMRolloverButton.h" + +@implementation PSMRolloverButton + +- (void)awakeFromNib +{ + if ([[self superclass] instancesRespondToSelector:@selector(awakeFromNib)]) { + [super awakeFromNib]; + } + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(rolloverFrameDidChange:) + name:NSViewFrameDidChangeNotification + object:self]; + [self setPostsFrameChangedNotifications:YES]; + [self resetCursorRects]; + + _myTrackingRectTag = -1; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [self removeTrackingRect]; +} + +// the regular image +- (void)setUsualImage:(NSImage *)newImage +{ + _usualImage = newImage; + + [self setImage:_usualImage]; +} + +- (NSImage *)usualImage +{ + return _usualImage; +} + +- (void)setRolloverImage:(NSImage *)newImage +{ + _rolloverImage = newImage; +} + +- (NSImage *)rolloverImage +{ + return _rolloverImage; +} + +//Remove old tracking rects when we change superviews +- (void)viewWillMoveToSuperview:(NSView *)newSuperview +{ + [self removeTrackingRect]; + + [super viewWillMoveToSuperview:newSuperview]; +} + +- (void)viewDidMoveToSuperview +{ + [super viewDidMoveToSuperview]; + + [self resetCursorRects]; +} + +- (void)viewWillMoveToWindow:(NSWindow *)newWindow +{ + [self removeTrackingRect]; + + [super viewWillMoveToWindow:newWindow]; +} + +- (void)viewDidMoveToWindow +{ + [super viewDidMoveToWindow]; + + [self resetCursorRects]; +} + +- (void)rolloverFrameDidChange:(NSNotification *)inNotification +{ + [self resetCursorRects]; +} + +- (void)addTrackingRect +{ + // assign a tracking rect to watch for mouse enter/exit + NSRect trackRect = [self bounds]; + NSPoint localPoint = [self convertPoint:NSPointFromCGPoint([self.window convertRectFromScreen:(NSRect){.origin = NSEvent.mouseLocation, .size = CGSizeMake(1, 1) }].origin) fromView:nil]; + BOOL mouseInside = NSPointInRect(localPoint, trackRect); + + _myTrackingRectTag = [self addTrackingRect:trackRect owner:self userData:nil assumeInside:mouseInside]; + if (mouseInside) { + //[self mouseEntered:nil]; + [self setImage:_rolloverImage]; + } else { + //[self mouseExited:nil]; + [self setImage:_usualImage]; + } +} + +- (void)removeTrackingRect +{ + if (_myTrackingRectTag != -1) { + [self removeTrackingRect:_myTrackingRectTag]; + } + _myTrackingRectTag = -1; +} + +// override for rollover effect +- (void)mouseEntered:(NSEvent *)theEvent +{ + // set rollover image + [self setImage:_rolloverImage]; + + [super mouseEntered:theEvent]; +} + +- (void)mouseExited:(NSEvent *)theEvent +{ + // restore usual image + [self setImage:_usualImage]; + + [super mouseExited:theEvent]; +} + +- (void)resetCursorRects +{ + // called when the button rect has been changed + [self removeTrackingRect]; + [self addTrackingRect]; +} + +- (void)setFrame:(NSRect)rect +{ + [super setFrame:rect]; + [self resetCursorRects]; +} + +- (void)setBounds:(NSRect)rect +{ + [super setBounds:rect]; + [self resetCursorRects]; +} + +#pragma mark - +#pragma mark Archiving + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [super encodeWithCoder:aCoder]; + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeObject:_rolloverImage forKey:@"rolloverImage"]; + [aCoder encodeObject:_usualImage forKey:@"usualImage"]; + [aCoder encodeInt64:_myTrackingRectTag forKey:@"myTrackingRectTag"]; + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + if ([aDecoder allowsKeyedCoding]) { + _rolloverImage = [aDecoder decodeObjectForKey:@"rolloverImage"]; + _usualImage = [aDecoder decodeObjectForKey:@"usualImage"]; + _myTrackingRectTag = [aDecoder decodeInt64ForKey:@"myTrackingRectTag"]; + } + } + return self; +} + +@end |