From f85335a7f9fdbff012409bb2af8fecc81740eab0 Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Wed, 19 Jan 2011 20:19:43 +0000 Subject: Implementing tabs and fixing scrolling. svn path=/trunk/netsurf/; revision=11396 --- cocoa/PSMTabBarControl/PSMRolloverButton.m | 183 +++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 cocoa/PSMTabBarControl/PSMRolloverButton.m (limited to 'cocoa/PSMTabBarControl/PSMRolloverButton.m') diff --git a/cocoa/PSMTabBarControl/PSMRolloverButton.m b/cocoa/PSMTabBarControl/PSMRolloverButton.m new file mode 100644 index 000000000..988abbb2a --- /dev/null +++ b/cocoa/PSMTabBarControl/PSMRolloverButton.m @@ -0,0 +1,183 @@ +// +// 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]; + + [super dealloc]; +} + +// the regular image +- (void)setUsualImage:(NSImage *)newImage +{ + [newImage retain]; + [_usualImage release]; + _usualImage = newImage; + + [self setImage:_usualImage]; +} + +- (NSImage *)usualImage +{ + return _usualImage; +} + +- (void)setRolloverImage:(NSImage *)newImage +{ + [newImage retain]; + [_rolloverImage release]; + _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:[[self window] convertScreenToBase:[NSEvent mouseLocation]] + fromView:nil]; + BOOL mouseInside = NSPointInRect(localPoint, trackRect); + + _myTrackingRectTag = [self addTrackingRect:trackRect owner:self userData:nil assumeInside:mouseInside]; + if (mouseInside) + [self mouseEntered:nil]; + else + [self mouseExited:nil]; +} + +- (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 encodeInteger:_myTrackingRectTag forKey:@"myTrackingRectTag"]; + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + if ([aDecoder allowsKeyedCoding]) { + _rolloverImage = [[aDecoder decodeObjectForKey:@"rolloverImage"] retain]; + _usualImage = [[aDecoder decodeObjectForKey:@"usualImage"] retain]; + _myTrackingRectTag = [aDecoder decodeIntegerForKey:@"myTrackingRectTag"]; + } + } + return self; +} + + +@end -- cgit v1.2.3