diff options
author | dmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-12 20:12:49 +0000 |
---|---|---|
committer | dmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-12 20:12:49 +0000 |
commit | 0335b08e730b0ba14e2125da6bcdd8bc826b6853 (patch) | |
tree | 852bb43f445475b7beaef75ff7125138ba77af56 /chrome/browser/cocoa/tab_strip_controller.mm | |
parent | 5c71605ec69c83c5e9a54b3c0ba922ff4d15c957 (diff) | |
download | chromium_src-0335b08e730b0ba14e2125da6bcdd8bc826b6853.zip chromium_src-0335b08e730b0ba14e2125da6bcdd8bc826b6853.tar.gz chromium_src-0335b08e730b0ba14e2125da6bcdd8bc826b6853.tar.bz2 |
Add support for observing tracking areas so that when tabs are moved underneath
our cursor, we highlight them correctly.
BUG=27458, 13208, 21448
TEST=Create a pile of tabs.
Select a middle one.
Put your cursor in some other tab.
Hit cmd-w a couple of times
Watch to make sure highlights occur correctly in both the tabs and the
close buttons.
Review URL: http://codereview.chromium.org/386021
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31814 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/tab_strip_controller.mm')
-rw-r--r-- | chrome/browser/cocoa/tab_strip_controller.mm | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/chrome/browser/cocoa/tab_strip_controller.mm b/chrome/browser/cocoa/tab_strip_controller.mm index dfc70a7..48a7747 100644 --- a/chrome/browser/cocoa/tab_strip_controller.mm +++ b/chrome/browser/cocoa/tab_strip_controller.mm @@ -107,6 +107,7 @@ private: - (void)animationDidStopForController:(TabController*)controller finished:(BOOL)finished; - (NSInteger)indexFromModelIndex:(NSInteger)index; +- (void)mouseMoved:(NSEvent*)event; @end // A simple view class that prevents the Window Server from dragging the area @@ -892,8 +893,15 @@ private: // tell us what to swap in in its absence. [tabContentsArray_ removeObjectAtIndex:index]; - // Remove the view from the tab strip. NSView* tab = [controller view]; + + // Stop observing the tab's tracking areas. + NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter]; + [defaultCenter removeObserver:self + name:NSViewDidUpdateTrackingAreasNotification + object:tab]; + + // Remove the view from the tab strip. [tab removeFromSuperview]; // Clear the tab controller's target. @@ -1183,6 +1191,27 @@ private: [self layoutTabsWithAnimation:NO regenerateSubviews:NO]; } +// Called when the tracking areas for any given tab are updated. This allows +// the individual tabs to update their hover states correctly. +// Only generates the event if the cursor is in the tab strip. +- (void)tabUpdateTracking:(NSNotification*)notification { + DCHECK([[notification object] isKindOfClass:[TabView class]]); + NSWindow* window = [tabView_ window]; + NSPoint location = [window mouseLocationOutsideOfEventStream]; + if (NSPointInRect(location, [tabView_ frame])) { + NSEvent* mouseEvent = [NSEvent mouseEventWithType:NSMouseMoved + location:location + modifierFlags:0 + timestamp:0 + windowNumber:[window windowNumber] + context:nil + eventNumber:0 + clickCount:0 + pressure:0]; + [self mouseMoved:mouseEvent]; + } +} + - (BOOL)inRapidClosureMode { return availableResizeWidth_ != kUseFullAvailableWidth; } @@ -1252,6 +1281,15 @@ private: // should call |-addSubviewToPermanentList:| (or better yet, call that and then // |-regenerateSubviewList| to actually add it). - (void)regenerateSubviewList { + // Remove self as an observer from all the old tabs before a new set of + // potentially different tabs is put in place. + NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter]; + for (NSView* view in [tabView_ subviews]) { + [defaultCenter removeObserver:self + name:NSViewDidUpdateTrackingAreasNotification + object:view]; + } + // Subviews to put in (in bottom-to-top order), beginning with the permanent // ones. NSMutableArray* subviews = [NSMutableArray arrayWithArray:permanentSubviews_]; @@ -1259,11 +1297,19 @@ private: NSView* selectedTabView = nil; // Go through tabs in reverse order, since |subviews| is bottom-to-top. for (TabController* tab in [tabArray_.get() reverseObjectEnumerator]) { + NSView* tabView = [tab view]; + + // Set self up to observe tabs so hover states will be correct as tabs move. + [defaultCenter addObserver:self + selector:@selector(tabUpdateTracking:) + name:NSViewDidUpdateTrackingAreasNotification + object:tabView]; + if ([tab selected]) { DCHECK(!selectedTabView); - selectedTabView = [tab view]; + selectedTabView = tabView; } else { - [subviews addObject:[tab view]]; + [subviews addObject:tabView]; } } if (selectedTabView) |