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

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

Issue 54303007: [rAc OSX] Add support for tooltips in notifications. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 1 month 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_notification_controller.mm
diff --git a/chrome/browser/ui/cocoa/autofill/autofill_notification_controller.mm b/chrome/browser/ui/cocoa/autofill/autofill_notification_controller.mm
index 7d3885c21990586539cd3c0f054456dbcc19fdb1..9252d640394a38785f19c142933f518e05bb1515 100644
--- a/chrome/browser/ui/cocoa/autofill/autofill_notification_controller.mm
+++ b/chrome/browser/ui/cocoa/autofill/autofill_notification_controller.mm
@@ -9,8 +9,12 @@
#include "base/logging.h"
#include "base/mac/foundation_util.h"
#include "base/mac/scoped_nsobject.h"
+#include "base/strings/sys_string_conversions.h"
+#include "chrome/browser/ui/autofill/autofill_dialog_types.h"
#include "chrome/browser/ui/chrome_style.h"
#include "chrome/browser/ui/cocoa/autofill/autofill_dialog_constants.h"
+#include "grit/theme_resources.h"
+#include "skia/ext/skia_utils_mac.h"
@interface AutofillNotificationView : NSView {
@private
@@ -68,21 +72,45 @@
@implementation AutofillNotificationController
-- (id)init {
+- (id)initWithNotification:(const autofill::DialogNotification*)notification {
if (self = [super init]) {
base::scoped_nsobject<AutofillNotificationView> view(
[[AutofillNotificationView alloc] initWithFrame:NSZeroRect]);
+ [view setBackgroundColor:
+ gfx::SkColorToCalibratedNSColor(notification->GetBackgroundColor())];
[self setView:view];
textfield_.reset([[NSTextField alloc] initWithFrame:NSZeroRect]);
[textfield_ setEditable:NO];
[textfield_ setBordered:NO];
[textfield_ setDrawsBackground:NO];
+ [textfield_ setTextColor:
+ gfx::SkColorToCalibratedNSColor(notification->GetTextColor())];
+ [textfield_ setStringValue:
+ base::SysUTF16ToNSString(notification->display_text())];
+ [textfield_ setHidden:notification->HasCheckbox()];
checkbox_.reset([[NSButton alloc] initWithFrame:NSZeroRect]);
[checkbox_ setButtonType:NSSwitchButton];
- [checkbox_ setHidden:YES];
- [view setSubviews:@[textfield_, checkbox_]];
+ [checkbox_ setHidden:!notification->HasCheckbox()];
+ [checkbox_ setState:(notification->checked() ? NSOnState : NSOffState)];
+ [checkbox_ setAttributedTitle:[textfield_ attributedStringValue]];
+ // Update the size that preferredSizeForWidth will use. Do this here because
+ // (1) preferredSizeForWidth is logically const, and so shouldn't have a
+ // side-effect of updating the checkbox's frame, and
+ // (2) this way, the sizing computation can be cached.
+ [checkbox_ sizeToFit];
+
+ tooltipIcon_.reset([[NSImageView alloc] initWithFrame:NSZeroRect]);
+ [tooltipIcon_ setImage:
+ ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
+ IDR_AUTOFILL_TOOLTIP_ICON).ToNSImage()];
+ [tooltipIcon_ setFrameSize:[[tooltipIcon_ image] size]];
+ [tooltipIcon_ setToolTip:
+ base::SysUTF16ToNSString(notification->tooltip_text())];
+ [tooltipIcon_ setHidden:[[tooltipIcon_ toolTip] length] == 0];
+
+ [view setSubviews:@[textfield_, checkbox_, tooltipIcon_]];
}
return self;
}
@@ -100,26 +128,6 @@
return [[self notificationView] hasArrow];
}
-- (void)setHasCheckbox:(BOOL)hasCheckbox {
- [checkbox_ setHidden:!hasCheckbox];
- [textfield_ setHidden:hasCheckbox];
-}
-
-- (NSString*)text {
- return [textfield_ stringValue];
-}
-
-- (void)setText:(NSString*)string {
- [textfield_ setStringValue:string];
- [checkbox_ setAttributedTitle:[textfield_ attributedStringValue]];
-
- // Update the size that preferredSizeForWidth will use. Do this here because
- // (1) preferredSizeForWidth is logically const, and so shouldn't have a
- // side-effect of updating the checkbox's frame, and
- // (2) this way, the sizing computation can be cached.
- [checkbox_ sizeToFit];
-}
-
- (NSTextField*)textfield {
return textfield_;
}
@@ -128,23 +136,18 @@
return checkbox_;
}
-- (NSColor*)backgroundColor {
- return [[self notificationView] backgroundColor];
-}
-
-- (void)setBackgroundColor:(NSColor*)backgroundColor {
- [[self notificationView] setBackgroundColor:backgroundColor];
-}
-
-- (NSColor*)textColor {
- return [textfield_ textColor];
-}
-
-- (void)setTextColor:(NSColor*)textColor {
- [textfield_ setTextColor:textColor];
+- (NSImageView*)tooltipIcon {
+ return tooltipIcon_;
}
- (NSSize)preferredSizeForWidth:(CGFloat)width {
+ width -= 2 * chrome_style::kHorizontalPadding;
+ if (![tooltipIcon_ isHidden])
+ width -= [tooltipIcon_ frame].size.width + chrome_style::kHorizontalPadding;
+ // TODO(isherman): Restore the DCHECK below once I figure out why it causes
+ // unit tests to fail.
+ //DCHECK_GT(width, 0);
+
NSSize preferredSize;
if (![textfield_ isHidden]) {
NSRect bounds = NSMakeRect(0, 0, width, CGFLOAT_MAX);
@@ -176,12 +179,26 @@
if ([[self notificationView] hasArrow])
bounds.size.height -= autofill::kArrowHeight;
- NSRect textFrame = NSInsetRect(bounds,
+ // Calculate the frame size, leaving room for padding around the notification,
+ // as well as for the tooltip if it is visible.
+ NSRect labelFrame = NSInsetRect(bounds,
chrome_style::kHorizontalPadding,
autofill::kNotificationPadding);
- NSControl* control =
- [checkbox_ isHidden] ? textfield_.get() : checkbox_.get();
- [control setFrame:textFrame];
+ if (![tooltipIcon_ isHidden]) {
+ labelFrame.size.width -=
+ [tooltipIcon_ frame].size.width + chrome_style::kHorizontalPadding;
+ }
+
+ NSView* label = [checkbox_ isHidden] ? textfield_.get() : checkbox_.get();
+ [label setFrame:labelFrame];
+
+ if (![tooltipIcon_ isHidden]) {
+ NSPoint tooltipOrigin =
+ NSMakePoint(
+ NSMaxX(labelFrame) + chrome_style::kHorizontalPadding,
+ NSMidY(labelFrame) - (NSHeight([tooltipIcon_ frame]) / 2.0));
+ [tooltipIcon_ setFrameOrigin:tooltipOrigin];
+ }
}
@end

Powered by Google App Engine
This is Rietveld 408576698