Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8576)

Unified Diff: chrome/browser/ui/cocoa/autofill/autofill_tooltip_controller.mm

Issue 84343002: [rAC, OSX] Use a bubble for tooltips. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review fixes. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698