| 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..c1de9c0e6f79dac75a2db85e77113b9dac06bd50
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/cocoa/autofill/autofill_tooltip_controller.mm
|
| @@ -0,0 +1,142 @@
|
| +// 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"
|
| +
|
| +// Delay time before tooltip shows/hides.
|
| +const NSTimeInterval kTooltipDelay = 0.1;
|
| +
|
| +// How far to inset tooltip contents.
|
| +CGFloat kTooltipInset = 10;
|
| +
|
| +#pragma mark AutofillTooltip
|
| +
|
| +// The actual tooltip control - based on HoverButton, which comes with free
|
| +// hover handling.
|
| +@interface AutofillTooltip : HoverButton {
|
| + @private
|
| + id<AutofillTooltipDelegate> tooltipDelegate_;
|
| +}
|
| +
|
| +@property(assign, nonatomic) id<AutofillTooltipDelegate> tooltipDelegate;
|
| +
|
| +@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
|
|
|