Chromium Code Reviews| Index: chrome/browser/ui/cocoa/autofill/autofill_tooltip_controller.mm |
| diff --git a/chrome/browser/ui/cocoa/autofill/autofill_tooltip_controller.mm b/chrome/browser/ui/cocoa/autofill/autofill_tooltip_controller.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..72cbe5cdbe88a4a8dfc3c2a0074c07e4d12b5ed5 |
| --- /dev/null |
| +++ b/chrome/browser/ui/cocoa/autofill/autofill_tooltip_controller.mm |
| @@ -0,0 +1,144 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#import "chrome/browser/ui/cocoa/autofill/autofill_tooltip_controller.h" |
| + |
| +#include "base/mac/foundation_util.h" |
| +#import "chrome/browser/ui/cocoa/autofill/autofill_bubble_controller.h" |
| +#import "ui/base/cocoa/hover_image_button.h" |
| + |
| +namespace { |
| + |
| +CGFloat kTooltipDelay = 0.1; // Delay time before tooltip shows/hides. |
|
Robert Sesek
2013/12/02 17:16:53
NSTimeInterval
groby-ooo-7-16
2013/12/02 20:41:57
Done.
|
| +CGFloat kTooltipInset = 10; // How far to inset tooltip contents. |
| + |
| +} |
|
Robert Sesek
2013/12/02 17:16:53
// namespace
groby-ooo-7-16
2013/12/02 20:41:57
Killed namespace entirely - turns out consts at fi
|
| + |
| +#pragma mark AutofillTooltip |
| + |
| +// The actual tooltip control - based on HoverButton, which comes with free |
| +// hover handling. |
| +@interface AutofillTooltip : HoverButton { |
| + @private |
| + id<AutofillTooltipDelegate> tooltipDelegate_; |
| +} |
| + |
| +@property(nonatomic, assign) id<AutofillTooltipDelegate> tooltipDelegate; |
|
Robert Sesek
2013/12/02 17:16:53
assign, nonatomic
groby-ooo-7-16
2013/12/02 20:41:57
Done.
|
| + |
| +@end |
| + |
| + |
| +@implementation AutofillTooltip |
| + |
| +@synthesize tooltipDelegate = tooltipDelegate_; |
| + |
| +- (void)drawRect:(NSRect)rect { |
| + [[self image] drawInRect:rect |
| + fromRect:NSZeroRect |
| + operation:NSCompositeSourceOver |
| + fraction:1.0 |
| + respectFlipped:YES |
| + hints:nil]; |
| +} |
| + |
| +- (void)setHoverState:(HoverState)state { |
| + HoverState oldHoverState = [self hoverState]; |
| + [super setHoverState:state]; |
| + if (state != oldHoverState) { |
| + switch (state) { |
| + case kHoverStateNone: |
| + [tooltipDelegate_ didEndHover]; |
| + break; |
| + case kHoverStateMouseOver: |
| + [tooltipDelegate_ didBeginHover]; |
| + break; |
| + case kHoverStateMouseDown: |
| + break; |
| + } |
| + } |
| +} |
| + |
| +@end |
| + |
| +#pragma mark AutofillTooltipController |
| + |
| +@implementation AutofillTooltipController |
| + |
| +@synthesize message = message_; |
| + |
| +- (id)init { |
| + if ((self = [super init])) { |
| + view_.reset([[AutofillTooltip alloc] init]); |
| + [self setView:view_]; |
| + [view_ setTooltipDelegate:self]; |
| + } |
| + return self; |
| +} |
| + |
| +- (void)dealloc { |
| + [[NSNotificationCenter defaultCenter] |
| + removeObserver:self |
| + name:NSWindowWillCloseNotification |
| + object:[bubbleController_ window]]; |
| + [super dealloc]; |
| +} |
| + |
| +- (void)setImage:(NSImage*)image { |
| + [view_ setImage:image]; |
| + [view_ setFrameSize:[image size]]; |
| +} |
| + |
| +- (void)didBeginHover { |
| + [NSObject cancelPreviousPerformRequestsWithTarget:self]; |
| + // Start a timer to display the tooltip, unless it's already displayed. |
| + if (!bubbleController_) { |
| + [self performSelector:@selector(displayHover) |
| + withObject:nil |
| + afterDelay:kTooltipDelay]; |
| + } |
| +} |
| + |
| +- (void)tooltipWindowWillClose:(NSNotification*)notification { |
| + bubbleController_ = nil; |
| +} |
| + |
| +- (void)displayHover { |
| + [bubbleController_ close]; |
| + bubbleController_ = |
| + [[AutofillBubbleController alloc] |
| + initWithParentWindow:[[self view] window] |
| + message:[self message] |
| + inset:NSMakeSize(kTooltipInset, kTooltipInset)]; |
| + |
| + // Handle bubble self-deleting. |
| + NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; |
| + [center addObserver:self |
| + selector:@selector(tooltipWindowWillClose:) |
| + name:NSWindowWillCloseNotification |
| + object:[bubbleController_ window]]; |
| + |
| + // Compute anchor point (in window coords - views might be flipped). |
| + NSRect viewRect = [view_ convertRect:[view_ bounds] toView:nil]; |
| + NSPoint anchorPoint = NSMakePoint(NSMidX(viewRect), NSMinY(viewRect)); |
| + [bubbleController_ setAnchorPoint: |
| + [[[self view] window] convertBaseToScreen:anchorPoint]]; |
| + [bubbleController_ showWindow:self]; |
| +} |
| + |
| +- (void)hideHover { |
| + [bubbleController_ close]; |
| +} |
| + |
| +- (void)didEndHover { |
| + [NSObject cancelPreviousPerformRequestsWithTarget:self]; |
| + // Start a timer to display the tooltip, unless it's already hidden. |
| + if (bubbleController_) { |
| + [self performSelector:@selector(hideHover) |
| + withObject:nil |
| + afterDelay:kTooltipDelay]; |
| + } |
| +} |
| + |
| +@end |
| + |
|
Robert Sesek
2013/12/02 17:16:53
nit: extra blank line
groby-ooo-7-16
2013/12/02 20:41:57
Done.
|