diff --git a/AppKit/CPCursor.j b/AppKit/CPCursor.j index 80d73989a..57f3039c6 100755 --- a/AppKit/CPCursor.j +++ b/AppKit/CPCursor.j @@ -123,7 +123,7 @@ var currentCursor = nil, - (void)set { - if (currentCursor == self) + if (currentCursor === self) return; currentCursor = self; diff --git a/AppKit/CPEvent.j b/AppKit/CPEvent.j index 5d633ad9a..66837649d 100644 --- a/AppKit/CPEvent.j +++ b/AppKit/CPEvent.j @@ -631,8 +631,8 @@ var _CPEventPeriodicEventPeriod = 0, - (CPTrackingArea)trackingArea { - if ((_type != CPMouseEntered) && (_type != CPMouseExited) && (_type != CPCursorUpdate)) - [CPException raise:CPInternalInconsistencyException reason:"You can't call trackingArea for this event type"]; + if ((_type !== CPMouseEntered) && (_type !== CPMouseExited) && (_type !== CPCursorUpdate)) + [CPException raise:CPInternalInconsistencyException format:@"You can't call trackingArea for events of type %#x", _type] return _trackingArea; } diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j index 86f128471..6213b6c2c 100644 --- a/AppKit/CPTableHeaderView.j +++ b/AppKit/CPTableHeaderView.j @@ -285,7 +285,7 @@ var CPTableHeaderViewResizeZone = 3.0, - (void)awakeFromCib { [self addTrackingArea:[[CPTrackingArea alloc] initWithRect:CGRectMakeZero() - options:CPTrackingMouseEnteredAndExited | CPTrackingMouseMoved | CPTrackingMouseMoved | CPTrackingActiveInKeyWindow | CPTrackingInVisibleRect + options:CPTrackingMouseEnteredAndExited | CPTrackingMouseMoved | CPTrackingActiveInKeyWindow | CPTrackingInVisibleRect owner:self userInfo:nil]]; } @@ -317,7 +317,7 @@ var CPTableHeaderViewResizeZone = 3.0, { [self _init]; [self addTrackingArea:[[CPTrackingArea alloc] initWithRect:CGRectMakeZero() - options:CPTrackingMouseEnteredAndExited | CPTrackingMouseMoved | CPTrackingMouseMoved | CPTrackingActiveInKeyWindow | CPTrackingInVisibleRect + options:CPTrackingMouseEnteredAndExited | CPTrackingMouseMoved | CPTrackingActiveInKeyWindow | CPTrackingInVisibleRect owner:self userInfo:nil]]; } diff --git a/AppKit/CPTrackingArea.j b/AppKit/CPTrackingArea.j index 348e3dc28..a7174f624 100644 --- a/AppKit/CPTrackingArea.j +++ b/AppKit/CPTrackingArea.j @@ -29,11 +29,11 @@ CPTrackingMouseMoved = 1 << 2, CPTrackingCursorUpdate = 1 << 3, CPTrackingActiveWhenFirstResponder = 1 << 4, CPTrackingActiveInKeyWindow = 1 << 5, -CPTrackingActiveInActiveApp = 1 << 6, // both mean the same in cappuccino context -CPTrackingActiveAlways = 1 << 6, -CPTrackingAssumeInside = 1 << 7, -CPTrackingInVisibleRect = 1 << 8, -CPTrackingEnabledDuringMouseDrag = 1 << 9; +CPTrackingActiveInActiveApp = 1 << 6, +CPTrackingActiveAlways = 1 << 7, +CPTrackingAssumeInside = 1 << 8, +CPTrackingInVisibleRect = 1 << 9, +CPTrackingEnabledDuringMouseDrag = 1 << 10; var CPTrackingAreaRectKey = @"CPTrackinkAreaRectKey", CPTrackingAreaOptionsKey = @"CPTrackingAreaOptionsKey", @@ -50,12 +50,12 @@ var CPTrackingAreaRectKey = @"CPTrackinkAreaRectKey", */ @implementation CPTrackingArea : CPObject { - CGRect _rect @accessors(getter=rect); - CPTrackingAreaOptions _options @accessors(getter=options); - id _owner @accessors(getter=owner); - CPDictionary _userInfo @accessors(getter=userInfo); + CGRect _rect @accessors(getter=rect); + CPTrackingAreaOptions _options @accessors(getter=options); + id _owner @accessors(getter=owner); + CPDictionary _userInfo @accessors(getter=userInfo); - CPView _referencingView; + CPView _referencingView @accessors; } @@ -68,26 +68,24 @@ var CPTrackingAreaRectKey = @"CPTrackinkAreaRectKey", { if (self = [super init]) { - if (!(options > 0)) + if (options === 0) [CPException raise:CPInternalInconsistencyException reason:"Invalid CPTrackingArea options"]; // Check options: - // - at least one in CPTrackingMouseEnteredAndExited, CPTrackingMouseMoved, CPTrackingCursorUpdate - // - exactly one in CPTrackingActiveWhenFirstResponder, CPTrackingActiveInKeyWindow, CPTrackingActiveAlways + // - at least one of CPTrackingMouseEnteredAndExited, CPTrackingMouseMoved, CPTrackingCursorUpdate + // - exactly one of CPTrackingActiveWhenFirstResponder, CPTrackingActiveInKeyWindow, CPTrackingActiveInActiveApp, CPTrackingActiveAlways // - no check on CPTrackingAssumeInside, CPTrackingInVisibleRect, CPTrackingEnableDuringMouseDrag if (!((options & CPTrackingMouseEnteredAndExited) || (options & CPTrackingMouseMoved) || (options & CPTrackingCursorUpdate))) - [CPException raise:CPInternalInconsistencyException reason:"You must at least select a type of event message"]; + [CPException raise:CPInternalInconsistencyException reason:"Invalid CPTrackingAreaOptions: must use at least one of [CPTrackingMouseEnteredAndExited | CPTrackingMouseMoved | CPTrackingCursorUpdate]"]; - if ((((options & CPTrackingActiveWhenFirstResponder) > 0) + ((options & CPTrackingActiveInKeyWindow) > 0) + ((options & CPTrackingActiveAlways) > 0)) != 1) - [CPException raise:CPInternalInconsistencyException reason:"You must select one and only one scope of tracking"]; + if ((((options & CPTrackingActiveWhenFirstResponder) > 0) + ((options & CPTrackingActiveInKeyWindow) > 0) + ((options & CPTrackingActiveInActiveApp) > 0) + ((options & CPTrackingActiveAlways) > 0)) !== 1) + [CPException raise:CPInternalInconsistencyException reason:"Tracking area options may only specify one of [CPTrackingActiveWhenFirstResponder | CPTrackingActiveInKeyWindow | CPTrackingActiveInActiveApp | CPTrackingActiveAlways]."]; _rect = aRect; _options = options; _owner = owner; _userInfo = userInfo; - - _referencingView = nil; } return self; @@ -97,24 +95,18 @@ var CPTrackingAreaRectKey = @"CPTrackinkAreaRectKey", #pragma mark - #pragma mark Implementation -- (void)_setReferencingView:(CPView)aView -{ - _referencingView = aView; -} - -- (CPView)_referencingView -{ - return _referencingView; -} - - (BOOL)_isReferenced { - return (!!_referencingView); + return !!_referencingView; } +@end + #pragma mark - #pragma mark CPCoding +@implementation CPTrackingArea (CPCoding) + - (id)initWithCoder:(CPCoder)aCoder { if (self = [super init]) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 3ae5a7710..ac5ca749d 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -241,7 +241,7 @@ var CPViewHighDPIDrawingEnabled = YES; CPAppearance _appearance @accessors(getter=appearance); CPAppearance _effectiveAppearance; - CPMutableArray _trackingAreas @accessors(getter=trackingAreas); + CPMutableArray _trackingAreas @accessors(getter=trackingAreas, copy); } /* @@ -807,13 +807,13 @@ var CPViewHighDPIDrawingEnabled = YES; // View must be removed from the current window viewsWithTrackingAreas if (_window && ([_trackingAreas count] > 0)) - [_window _removeFromViewsWithTrackingAreas:self]; + [_window _removeTrackingAreaView:self]; _window = aWindow; // View must be added to the new window viewsWithTrackingAreas if (_window && ([_trackingAreas count] > 0)) - [_window _addToViewsWithTrackingAreas:self]; + [_window _addTrackingAreaView:self]; var count = [_subviews count]; @@ -3414,18 +3414,13 @@ setBoundsOrigin: return; if ([trackingArea _isReferenced]) - [CPException raise:CPInternalInconsistencyException reason:"TrackingArea is already associated with another view"]; + [CPException raise:CPInternalInconsistencyException reason:"Tracking area has already been added to another view."]; [_trackingAreas addObject:trackingArea]; [trackingArea _setReferencingView:self]; if (_window) - { - if ([_trackingAreas count] == 1) - [_window _addToViewsWithTrackingAreas:self]; - else - [_window _addTrackingArea:trackingArea]; - } + [_window _addTrackingArea:trackingArea]; } - (void)removeTrackingArea:(CPTrackingArea)trackingArea @@ -3438,13 +3433,8 @@ setBoundsOrigin: [CPException raise:CPInternalInconsistencyException reason:"Trying to remove unreferenced trackingArea"]; if (_window) - { - if ([_trackingAreas count] == 1) - [_window _removeFromViewsWithTrackingAreas:self]; - else - [_window _removeTrackingArea:trackingArea]; - } - + [_window _removeTrackingArea:trackingArea]; + [trackingArea _setReferencingView:nil]; [_trackingAreas removeObject:trackingArea]; } @@ -3581,6 +3571,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", [self setAppearance:[aCoder decodeObjectForKey:CPViewAppearanceKey]]; _trackingAreas = [aCoder decodeObjectForKey:CPViewTrackingAreasKey]; + if (!_trackingAreas) _trackingAreas = []; diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index d08c30364..58765be9b 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -200,7 +200,7 @@ var CPWindowActionMessageKeys = [ CPArray _mouseEnteredStack; CPArray _cursorUpdateStack; - CPArray _viewsWithTrackingAreas; + CPArray _trackingAreaViews; id _activeCursorTrackingArea; CPView _leftMouseDownView; CPView _rightMouseDownView; @@ -391,7 +391,7 @@ CPTexturedBackgroundWindowMask name:CPWindowResizeStyleGlobalChangeNotification object:nil]; - _viewsWithTrackingAreas = []; + _trackingAreaViews = []; _mouseEnteredStack = []; _cursorUpdateStack = []; _activeCursorTrackingArea = nil; @@ -1971,24 +1971,25 @@ CPTexturedBackgroundWindowMask // At the same time, we update the entered stack. var mouseEnteredStack = []; - for (var i = 0, nb = [_viewsWithTrackingAreas count]; i < nb; i++) + for (var i = 0; i < _trackingAreaViews.length; i++) { - var aView = [_viewsWithTrackingAreas objectAtIndex:i], + var aView = [_trackingAreaViews objectAtIndex:i], trackingAreas = [aView trackingAreas], convertedPoint = [aView convertPoint:point fromView:_windowView]; if (![aView isHidden]) - for (var j = 0, nbTA = [trackingAreas count]; j < nbTA; j++) + for (var j = 0; j < trackingAreas.length; j++) { var aTrackingArea = [trackingAreas objectAtIndex:j], - trackingOptions = [aTrackingArea options]; + trackingOptions = [aTrackingArea options]; if (trackingOptions & CPTrackingEnabledDuringMouseDrag) if ((trackingOptions & CPTrackingActiveAlways) || + (trackingOptions & CPTrackingActiveInActiveApp) || ((trackingOptions & CPTrackingActiveInKeyWindow) && ([self isKeyWindow])) || - ((trackingOptions & CPTrackingActiveWhenFirstResponder) && ([self isKeyWindow]) && (_firstResponder == aView))) + ((trackingOptions & CPTrackingActiveWhenFirstResponder) && ([self isKeyWindow]) && (_firstResponder === aView))) if (CGRectContainsPoint(((trackingOptions & CPTrackingInVisibleRect) ? [aView visibleRect] : [aTrackingArea rect]), convertedPoint)) { @@ -2014,7 +2015,7 @@ CPTexturedBackgroundWindowMask // Search now for exited views (were in _mouseEnteredStack but no more in mouseEnteredStack) - for (var i = 0, nb = [_mouseEnteredStack count]; i < nb; i++) + for (var i = 0; i < _mouseEnteredStack.length; i++) { var aTrackingArea = [_mouseEnteredStack objectAtIndex:i], trackingOptions = [aTrackingArea options]; @@ -2066,22 +2067,23 @@ CPTexturedBackgroundWindowMask var mouseEnteredStack = [], cursorUpdateStack = []; - for (var i = 0, nb = [_viewsWithTrackingAreas count]; i < nb; i++) + for (var i = 0; i < _trackingAreaViews.length; i++) { - var aView = [_viewsWithTrackingAreas objectAtIndex:i], + var aView = [_trackingAreaViews objectAtIndex:i], trackingAreas = [aView trackingAreas], convertedPoint = [aView convertPoint:point fromView:_windowView]; if (![aView isHidden]) - for (var j = 0, nbTA = [trackingAreas count]; j < nbTA; j++) + for (var j = 0; j < trackingAreas.length; j++) { var aTrackingArea = [trackingAreas objectAtIndex:j], - trackingOptions = [aTrackingArea options]; + trackingOptions = [aTrackingArea options]; if ((trackingOptions & CPTrackingActiveAlways) || + (trackingOptions & CPTrackingActiveInActiveApp) || ((trackingOptions & CPTrackingActiveInKeyWindow) && ([self isKeyWindow])) || - ((trackingOptions & CPTrackingActiveWhenFirstResponder) && ([self isKeyWindow]) && (_firstResponder == aView))) + ((trackingOptions & CPTrackingActiveWhenFirstResponder) && ([self isKeyWindow]) && (_firstResponder === aView))) if (CGRectContainsPoint(((trackingOptions & CPTrackingInVisibleRect) ? [aView visibleRect] : [aTrackingArea rect]), convertedPoint)) { @@ -2116,7 +2118,7 @@ CPTexturedBackgroundWindowMask // Search now for exited views (were in _mouseEnteredStack but no more in mouseEnteredStack) - for (var i = 0, nb = [_mouseEnteredStack count]; i < nb; i++) + for (var i = 0; i < _mouseEnteredStack.length; i++) { var aTrackingArea = [_mouseEnteredStack objectAtIndex:i]; @@ -2136,7 +2138,7 @@ CPTexturedBackgroundWindowMask // If this is the active cursor area, we reset _cursorUpdateStack so a new active area will be computed - if (aTrackingArea == _activeCursorTrackingArea) + if (aTrackingArea === _activeCursorTrackingArea) { _cursorUpdateStack = []; _activeCursorTrackingArea = nil; @@ -2150,7 +2152,7 @@ CPTexturedBackgroundWindowMask // If no frontmost view is found, we set standard cursor var nbCursorUpdates = [cursorUpdateStack count], - overlappingTA = []; + overlappingTrackingAreas = []; if (nbCursorUpdates > 0) { @@ -2158,21 +2160,21 @@ CPTexturedBackgroundWindowMask { var aTA = [cursorUpdateStack objectAtIndex:i]; - if ((![_cursorUpdateStack containsObject:aTA]) || (aTA == _activeCursorTrackingArea)) + if ((![_cursorUpdateStack containsObject:aTA]) || (aTA === _activeCursorTrackingArea)) - [overlappingTA addObject:aTA]; + [overlappingTrackingAreas addObject:aTA]; } - var nbOverlappingTA = [overlappingTA count]; + var nbOverlappingTrackingAreas = [overlappingTrackingAreas count]; - if (nbOverlappingTA > 0) + if (nbOverlappingTrackingAreas > 0) { - var frontmostTrackingArea = [overlappingTA firstObject], + var frontmostTrackingArea = [overlappingTrackingAreas firstObject], frontmostView = [frontmostTrackingArea _referencingView]; - for (var i = 1; i < nbOverlappingTA; i++) + for (var i = 1; i < nbOverlappingTrackingAreas; i++) { - var aTrackingArea = [overlappingTA objectAtIndex:i], + var aTrackingArea = [overlappingTrackingAreas objectAtIndex:i], aView = [aTrackingArea _referencingView]; // First verify if aView is a subview of frontmostView @@ -2209,7 +2211,7 @@ CPTexturedBackgroundWindowMask secondSuperview = [secondView superview]; } - if (firstSuperview == secondSuperview) + if (firstSuperview === secondSuperview) break; firstView = firstSuperview; @@ -4071,28 +4073,29 @@ var interpolate = function(fromValue, toValue, progress) @implementation CPWindow (TrackingArea) -- (void)_addToViewsWithTrackingAreas:(CPView)aView +- (void)_addTrackingAreaView:(CPView)aView { - [_viewsWithTrackingAreas addObject:aView]; + var trackingAreas = [aView trackingAreas]; - var tas = [aView trackingAreas]; - - for (var i = 0, nb = [tas count]; i < nb; i++) - [self _addTrackingArea:[tas objectAtIndex:i]]; + for (var i = 0; i < trackingAreas.length; i++) + [self _addTrackingArea:[trackingAreas objectAtIndex:i]]; } -- (void)_removeFromViewsWithTrackingAreas:(CPView)aView +- (void)_removeTrackingAreaView:(CPView)aView { - var tas = [aView trackingAreas]; + var trackingAreas = [aView trackingAreas]; - for (var i = 0, nb = [tas count]; i < nb; i++) - [self _removeTrackingArea:[tas objectAtIndex:i]]; - - [_viewsWithTrackingAreas removeObject:aView]; + for (var i = 0; i < trackingAreas.length; i++) + [self _removeTrackingArea:[trackingAreas objectAtIndex:i]]; } - (void)_addTrackingArea:(CPTrackingArea)trackingArea { + var trackingAreaView = [trackingArea _referencingView]; + + if (![_trackingAreaViews containsObject:trackingAreaView]) + [_trackingAreaViews addObject:trackingAreaView]; + // If CPTrackingAssumeInside option is set, put the tracking area in the _mouseEnteredStack if ([trackingArea options] & CPTrackingAssumeInside) @@ -4105,6 +4108,11 @@ var interpolate = function(fromValue, toValue, progress) if ([_mouseEnteredStack containsObject:trackingArea]) [_mouseEnteredStack removeObject:trackingArea]; + + var trackingAreaView = [trackingArea _referencingView]; + + if ([_trackingAreaViews containsObject:trackingAreaView]) + [_trackingAreaViews removeObject:trackingAreaView]; } @end