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

Side by Side Diff: chrome/browser/ui/cocoa/autofill/autofill_notification_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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "chrome/browser/ui/cocoa/autofill/autofill_notification_controller.h" 5 #import "chrome/browser/ui/cocoa/autofill/autofill_notification_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/mac/foundation_util.h" 10 #include "base/mac/foundation_util.h"
11 #include "base/mac/scoped_nsobject.h" 11 #include "base/mac/scoped_nsobject.h"
12 #include "base/strings/sys_string_conversions.h" 12 #include "base/strings/sys_string_conversions.h"
13 #include "chrome/browser/ui/autofill/autofill_dialog_types.h" 13 #include "chrome/browser/ui/autofill/autofill_dialog_types.h"
14 #include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h" 14 #include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h"
15 #include "chrome/browser/ui/chrome_style.h" 15 #include "chrome/browser/ui/chrome_style.h"
16 #include "chrome/browser/ui/cocoa/autofill/autofill_dialog_constants.h" 16 #include "chrome/browser/ui/cocoa/autofill/autofill_dialog_constants.h"
17 #import "chrome/browser/ui/cocoa/autofill/autofill_tooltip_controller.h"
17 #import "chrome/browser/ui/cocoa/hyperlink_text_view.h" 18 #import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
18 #include "grit/theme_resources.h" 19 #include "grit/theme_resources.h"
19 #include "skia/ext/skia_utils_mac.h" 20 #include "skia/ext/skia_utils_mac.h"
20 21
21 @interface AutofillNotificationView : NSView { 22 @interface AutofillNotificationView : NSView {
22 @private 23 @private
23 // Weak, determines anchor point for arrow. 24 // Weak, determines anchor point for arrow.
24 NSView* arrowAnchorView_; 25 NSView* arrowAnchorView_;
25 BOOL hasArrow_; 26 BOOL hasArrow_;
26 base::scoped_nsobject<NSColor> backgroundColor_; 27 base::scoped_nsobject<NSColor> backgroundColor_;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 [checkbox_ setState:(notification->checked() ? NSOnState : NSOffState)]; 135 [checkbox_ setState:(notification->checked() ? NSOnState : NSOffState)];
135 [checkbox_ setAttributedTitle:[textview_ textStorage]]; 136 [checkbox_ setAttributedTitle:[textview_ textStorage]];
136 [checkbox_ setTarget:self]; 137 [checkbox_ setTarget:self];
137 [checkbox_ setAction:@selector(checkboxClicked:)]; 138 [checkbox_ setAction:@selector(checkboxClicked:)];
138 // Set the size that preferredSizeForWidth will use. Do this here because 139 // Set the size that preferredSizeForWidth will use. Do this here because
139 // (1) preferredSizeForWidth is logically const, and so shouldn't have a 140 // (1) preferredSizeForWidth is logically const, and so shouldn't have a
140 // side-effect of updating the checkbox's frame, and 141 // side-effect of updating the checkbox's frame, and
141 // (2) this way, the sizing computation can be cached. 142 // (2) this way, the sizing computation can be cached.
142 [checkbox_ sizeToFit]; 143 [checkbox_ sizeToFit];
143 144
144 tooltipIcon_.reset([[NSImageView alloc] initWithFrame:NSZeroRect]); 145 tooltipController_.reset([[AutofillTooltipController alloc] init]);
145 [tooltipIcon_ setImage: 146 [tooltipController_ setImage:
146 ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( 147 ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
147 IDR_AUTOFILL_TOOLTIP_ICON).ToNSImage()]; 148 IDR_AUTOFILL_TOOLTIP_ICON).ToNSImage()];
148 [tooltipIcon_ setFrameSize:[[tooltipIcon_ image] size]]; 149 [tooltipController_ setMessage:
149 [tooltipIcon_ setToolTip:
150 base::SysUTF16ToNSString(notification->tooltip_text())]; 150 base::SysUTF16ToNSString(notification->tooltip_text())];
151 [tooltipIcon_ setHidden:[[tooltipIcon_ toolTip] length] == 0]; 151 [[tooltipController_ view] setHidden:
152 [[tooltipController_ message] length] == 0];
152 153
153 [view setSubviews:@[textview_, checkbox_, tooltipIcon_]]; 154 [view setSubviews:@[ textview_, checkbox_, [tooltipController_ view] ]];
154 } 155 }
155 return self; 156 return self;
156 } 157 }
157 158
158 - (AutofillNotificationView*)notificationView { 159 - (AutofillNotificationView*)notificationView {
159 return base::mac::ObjCCastStrict<AutofillNotificationView>([self view]); 160 return base::mac::ObjCCastStrict<AutofillNotificationView>([self view]);
160 } 161 }
161 162
162 - (void)setHasArrow:(BOOL)hasArrow withAnchorView:(NSView*)anchorView { 163 - (void)setHasArrow:(BOOL)hasArrow withAnchorView:(NSView*)anchorView {
163 [[self notificationView] setAnchorView:anchorView]; 164 [[self notificationView] setAnchorView:anchorView];
164 [[self notificationView] setHasArrow:hasArrow]; 165 [[self notificationView] setHasArrow:hasArrow];
165 } 166 }
166 167
167 - (BOOL)hasArrow { 168 - (BOOL)hasArrow {
168 return [[self notificationView] hasArrow]; 169 return [[self notificationView] hasArrow];
169 } 170 }
170 171
171 - (NSTextView*)textview { 172 - (NSTextView*)textview {
172 return textview_; 173 return textview_;
173 } 174 }
174 175
175 - (NSButton*)checkbox { 176 - (NSButton*)checkbox {
176 return checkbox_; 177 return checkbox_;
177 } 178 }
178 179
179 - (NSImageView*)tooltipIcon { 180 - (NSView*)tooltipView {
180 return tooltipIcon_; 181 return [tooltipController_ view];
181 } 182 }
182 183
183 - (NSSize)preferredSizeForWidth:(CGFloat)width { 184 - (NSSize)preferredSizeForWidth:(CGFloat)width {
184 width -= 2 * chrome_style::kHorizontalPadding; 185 width -= 2 * chrome_style::kHorizontalPadding;
185 if (![tooltipIcon_ isHidden]) 186 if (![[tooltipController_ view] isHidden]) {
186 width -= [tooltipIcon_ frame].size.width + chrome_style::kHorizontalPadding; 187 width -= NSWidth([[tooltipController_ view] frame]) +
188 chrome_style::kHorizontalPadding;
189 }
187 // TODO(isherman): Restore the DCHECK below once I figure out why it causes 190 // TODO(isherman): Restore the DCHECK below once I figure out why it causes
188 // unit tests to fail. 191 // unit tests to fail.
189 //DCHECK_GT(width, 0); 192 //DCHECK_GT(width, 0);
190 193
191 NSSize preferredSize; 194 NSSize preferredSize;
192 if (![textview_ isHidden]) { 195 if (![textview_ isHidden]) {
193 // This method is logically const. Hence, cache the original frame so that 196 // This method is logically const. Hence, cache the original frame so that
194 // it can be restored once the preferred size has been computed. 197 // it can be restored once the preferred size has been computed.
195 NSRect frame = [textview_ frame]; 198 NSRect frame = [textview_ frame];
196 199
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 - (void)performLayout { 231 - (void)performLayout {
229 NSRect bounds = [[self view] bounds]; 232 NSRect bounds = [[self view] bounds];
230 if ([[self notificationView] hasArrow]) 233 if ([[self notificationView] hasArrow])
231 bounds.size.height -= autofill::kArrowHeight; 234 bounds.size.height -= autofill::kArrowHeight;
232 235
233 // Calculate the frame size, leaving room for padding around the notification, 236 // Calculate the frame size, leaving room for padding around the notification,
234 // as well as for the tooltip if it is visible. 237 // as well as for the tooltip if it is visible.
235 NSRect labelFrame = NSInsetRect(bounds, 238 NSRect labelFrame = NSInsetRect(bounds,
236 chrome_style::kHorizontalPadding, 239 chrome_style::kHorizontalPadding,
237 autofill::kNotificationPadding); 240 autofill::kNotificationPadding);
238 if (![tooltipIcon_ isHidden]) { 241 NSView* tooltipView = [tooltipController_ view];
242 if (![tooltipView isHidden]) {
239 labelFrame.size.width -= 243 labelFrame.size.width -=
240 [tooltipIcon_ frame].size.width + chrome_style::kHorizontalPadding; 244 NSWidth([tooltipView frame]) + chrome_style::kHorizontalPadding;
241 } 245 }
242 246
243 NSView* label = [checkbox_ isHidden] ? textview_.get() : checkbox_.get(); 247 NSView* label = [checkbox_ isHidden] ? textview_.get() : checkbox_.get();
244 [label setFrame:labelFrame]; 248 [label setFrame:labelFrame];
245 249
246 if (![tooltipIcon_ isHidden]) { 250 if (![tooltipView isHidden]) {
247 NSPoint tooltipOrigin = 251 NSPoint tooltipOrigin =
248 NSMakePoint( 252 NSMakePoint(
249 NSMaxX(labelFrame) + chrome_style::kHorizontalPadding, 253 NSMaxX(labelFrame) + chrome_style::kHorizontalPadding,
250 NSMidY(labelFrame) - (NSHeight([tooltipIcon_ frame]) / 2.0)); 254 NSMidY(labelFrame) - (NSHeight([tooltipView frame]) / 2.0));
251 [tooltipIcon_ setFrameOrigin:tooltipOrigin]; 255 [tooltipView setFrameOrigin:tooltipOrigin];
252 } 256 }
253 } 257 }
254 258
255 - (IBAction)checkboxClicked:(id)sender { 259 - (IBAction)checkboxClicked:(id)sender {
256 DCHECK(sender == checkbox_.get()); 260 DCHECK(sender == checkbox_.get());
257 BOOL isChecked = ([checkbox_ state] == NSOnState); 261 BOOL isChecked = ([checkbox_ state] == NSOnState);
258 delegate_->NotificationCheckboxStateChanged(notificationType_, isChecked); 262 delegate_->NotificationCheckboxStateChanged(notificationType_, isChecked);
259 } 263 }
260 264
261 - (BOOL)textView:(NSTextView *)textView 265 - (BOOL)textView:(NSTextView *)textView
262 clickedOnLink:(id)link 266 clickedOnLink:(id)link
263 atIndex:(NSUInteger)charIndex { 267 atIndex:(NSUInteger)charIndex {
264 delegate_->LinkClicked(linkURL_); 268 delegate_->LinkClicked(linkURL_);
265 return YES; 269 return YES;
266 } 270 }
267 271
268 @end 272 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698