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

Side by Side Diff: chrome/browser/cocoa/extension_installed_bubble_controller.mm

Issue 4724005: Add a help bubble pointing to the omnibox when installing an extension with (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 10 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "extension_installed_bubble_controller.h" 5 #import "extension_installed_bubble_controller.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "base/mac_util.h" 8 #include "base/mac_util.h"
9 #include "base/sys_string_conversions.h" 9 #include "base/sys_string_conversions.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 if ((self = [super initWithWindowNibPath:nibPath owner:self])) { 83 if ((self = [super initWithWindowNibPath:nibPath owner:self])) {
84 DCHECK(parentWindow); 84 DCHECK(parentWindow);
85 parentWindow_ = parentWindow; 85 parentWindow_ = parentWindow;
86 DCHECK(extension); 86 DCHECK(extension);
87 extension_ = extension; 87 extension_ = extension;
88 DCHECK(browser); 88 DCHECK(browser);
89 browser_ = browser; 89 browser_ = browser;
90 icon_.reset([gfx::SkBitmapToNSImage(icon) retain]); 90 icon_.reset([gfx::SkBitmapToNSImage(icon) retain]);
91 pageActionRemoved_ = NO; 91 pageActionRemoved_ = NO;
92 92
93 if (extension->browser_action()) { 93 if (!extension->omnibox_keyword().empty()) {
94 type_ = extension_installed_bubble::kOmniboxKeyword;
95 } else if (extension->browser_action()) {
94 type_ = extension_installed_bubble::kBrowserAction; 96 type_ = extension_installed_bubble::kBrowserAction;
95 } else if (extension->page_action() && 97 } else if (extension->page_action() &&
96 !extension->page_action()->default_icon_path().empty()) { 98 !extension->page_action()->default_icon_path().empty()) {
97 type_ = extension_installed_bubble::kPageAction; 99 type_ = extension_installed_bubble::kPageAction;
98 } else { 100 } else {
99 NOTREACHED(); // kGeneric installs handled in the extension_install_ui. 101 NOTREACHED(); // kGeneric installs handled in the extension_install_ui.
100 } 102 }
101 103
102 // Start showing window only after extension has fully loaded. 104 // Start showing window only after extension has fully loaded.
103 extensionObserver_.reset(new ExtensionLoadedNotificationObserver( 105 extensionObserver_.reset(new ExtensionLoadedNotificationObserver(
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 // We need to calculate the location of these icons and the size of the 169 // We need to calculate the location of these icons and the size of the
168 // message itself (which varies with the title of the extension) in order 170 // message itself (which varies with the title of the extension) in order
169 // to figure out the origin point for the extension installed bubble. 171 // to figure out the origin point for the extension installed bubble.
170 // TODO(mirandac): add framework to easily test extension UI components! 172 // TODO(mirandac): add framework to easily test extension UI components!
171 - (NSPoint)calculateArrowPoint { 173 - (NSPoint)calculateArrowPoint {
172 BrowserWindowCocoa* window = 174 BrowserWindowCocoa* window =
173 static_cast<BrowserWindowCocoa*>(browser_->window()); 175 static_cast<BrowserWindowCocoa*>(browser_->window());
174 NSPoint arrowPoint = NSZeroPoint; 176 NSPoint arrowPoint = NSZeroPoint;
175 177
176 switch(type_) { 178 switch(type_) {
179 case extension_installed_bubble::kOmniboxKeyword: {
180 LocationBarViewMac* locationBarView =
181 [window->cocoa_controller() locationBarBridge];
182 arrowPoint = locationBarView->GetPageInfoBubblePoint();
183 break;
184 }
177 case extension_installed_bubble::kBrowserAction: { 185 case extension_installed_bubble::kBrowserAction: {
178 BrowserActionsController* controller = 186 BrowserActionsController* controller =
179 [[window->cocoa_controller() toolbarController] 187 [[window->cocoa_controller() toolbarController]
180 browserActionsController]; 188 browserActionsController];
181 arrowPoint = [controller popupPointForBrowserAction:extension_]; 189 arrowPoint = [controller popupPointForBrowserAction:extension_];
182 break; 190 break;
183 } 191 }
184 case extension_installed_bubble::kPageAction: { 192 case extension_installed_bubble::kPageAction: {
185 LocationBarViewMac* locationBarView = 193 LocationBarViewMac* locationBarView =
186 [window->cocoa_controller() locationBarBridge]; 194 [window->cocoa_controller() locationBarBridge];
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 236
229 // Now that we have resized the window, adjust y pos of the messages. 237 // Now that we have resized the window, adjust y pos of the messages.
230 [self setMessageFrames:newWindowHeight]; 238 [self setMessageFrames:newWindowHeight];
231 239
232 // Find window origin, taking into account bubble size and arrow location. 240 // Find window origin, taking into account bubble size and arrow location.
233 NSPoint origin = 241 NSPoint origin =
234 [parentWindow_ convertBaseToScreen:[self calculateArrowPoint]]; 242 [parentWindow_ convertBaseToScreen:[self calculateArrowPoint]];
235 NSSize offsets = NSMakeSize(info_bubble::kBubbleArrowXOffset + 243 NSSize offsets = NSMakeSize(info_bubble::kBubbleArrowXOffset +
236 info_bubble::kBubbleArrowWidth / 2.0, 0); 244 info_bubble::kBubbleArrowWidth / 2.0, 0);
237 offsets = [[window contentView] convertSize:offsets toView:nil]; 245 offsets = [[window contentView] convertSize:offsets toView:nil];
238 origin.x -= NSWidth([window frame]) - offsets.width; 246 if ([infoBubbleView_ arrowLocation] == info_bubble::kTopRight)
247 origin.x -= NSWidth([window frame]) - offsets.width;
239 origin.y -= NSHeight([window frame]); 248 origin.y -= NSHeight([window frame]);
240 [window setFrameOrigin:origin]; 249 [window setFrameOrigin:origin];
241 250
242 [parentWindow_ addChildWindow:window 251 [parentWindow_ addChildWindow:window
243 ordered:NSWindowAbove]; 252 ordered:NSWindowAbove];
244 [window makeKeyAndOrderFront:self]; 253 [window makeKeyAndOrderFront:self];
245 } 254 }
246 255
247 // Finish nib loading, set arrow location and load icon into window. This 256 // Finish nib loading, set arrow location and load icon into window. This
248 // function is exposed for unit testing. 257 // function is exposed for unit testing.
249 - (NSWindow*)initializeWindow { 258 - (NSWindow*)initializeWindow {
250 NSWindow* window = [self window]; // completes nib load 259 NSWindow* window = [self window]; // completes nib load
251 [infoBubbleView_ setArrowLocation:info_bubble::kTopRight]; 260
261 if (type_ == extension_installed_bubble::kOmniboxKeyword) {
262 [infoBubbleView_ setArrowLocation:info_bubble::kTopLeft];
Bons 2010/11/11 19:28:57 is there a default arrow position? I ask because i
Matt Perry 2010/11/12 07:20:25 There is, but it feels safer not relying on the de
263 } else {
264 [infoBubbleView_ setArrowLocation:info_bubble::kTopRight];
265 }
252 266
253 // Set appropriate icon, resizing if necessary. 267 // Set appropriate icon, resizing if necessary.
254 if ([icon_ size].width > extension_installed_bubble::kIconSize) { 268 if ([icon_ size].width > extension_installed_bubble::kIconSize) {
255 [icon_ setSize:NSMakeSize(extension_installed_bubble::kIconSize, 269 [icon_ setSize:NSMakeSize(extension_installed_bubble::kIconSize,
256 extension_installed_bubble::kIconSize)]; 270 extension_installed_bubble::kIconSize)];
257 } 271 }
258 [iconImage_ setImage:icon_]; 272 [iconImage_ setImage:icon_];
259 [iconImage_ setNeedsDisplay:YES]; 273 [iconImage_ setNeedsDisplay:YES];
260 return window; 274 return window;
261 } 275 }
262 276
263 // Calculate the height of each install message, resizing messages in their 277 // Calculate the height of each install message, resizing messages in their
264 // frames to fit window width. Return the new window height, based on the 278 // frames to fit window width. Return the new window height, based on the
265 // total of all message heights. 279 // total of all message heights.
266 - (int)calculateWindowHeight { 280 - (int)calculateWindowHeight {
267 // Adjust the window height to reflect the sum height of all messages 281 // Adjust the window height to reflect the sum height of all messages
268 // and vertical padding. 282 // and vertical padding.
269 int newWindowHeight = 2 * extension_installed_bubble::kOuterVerticalMargin; 283 int newWindowHeight = 2 * extension_installed_bubble::kOuterVerticalMargin;
270 284
271 // First part of extension installed message. 285 // First part of extension installed message.
272 [extensionInstalledMsg_ setStringValue:l10n_util::GetNSStringF( 286 [extensionInstalledMsg_ setStringValue:l10n_util::GetNSStringF(
273 IDS_EXTENSION_INSTALLED_HEADING, UTF8ToUTF16(extension_->name()))]; 287 IDS_EXTENSION_INSTALLED_HEADING, UTF8ToUTF16(extension_->name()))];
274 [GTMUILocalizerAndLayoutTweaker 288 [GTMUILocalizerAndLayoutTweaker
275 sizeToFitFixedWidthTextField:extensionInstalledMsg_]; 289 sizeToFitFixedWidthTextField:extensionInstalledMsg_];
276 newWindowHeight += [extensionInstalledMsg_ frame].size.height + 290 newWindowHeight += [extensionInstalledMsg_ frame].size.height +
277 extension_installed_bubble::kInnerVerticalMargin; 291 extension_installed_bubble::kInnerVerticalMargin;
278 292
279 // If type is page action, include a special message about page actions. 293 // If type is page action, include a special message about page actions.
280 if (type_ == extension_installed_bubble::kPageAction) { 294 if (type_ == extension_installed_bubble::kPageAction) {
281 [pageActionInfoMsg_ setHidden:NO]; 295 [extraInfoMsg_ setHidden:NO];
282 [[pageActionInfoMsg_ cell] 296 [[extraInfoMsg_ cell]
283 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; 297 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
284 [GTMUILocalizerAndLayoutTweaker 298 [GTMUILocalizerAndLayoutTweaker
285 sizeToFitFixedWidthTextField:pageActionInfoMsg_]; 299 sizeToFitFixedWidthTextField:extraInfoMsg_];
286 newWindowHeight += [pageActionInfoMsg_ frame].size.height + 300 newWindowHeight += [extraInfoMsg_ frame].size.height +
287 extension_installed_bubble::kInnerVerticalMargin; 301 extension_installed_bubble::kInnerVerticalMargin;
288 } 302 }
289 303
304 // If type is omnibox keyword, include a special message about the keyword.
305 if (type_ == extension_installed_bubble::kOmniboxKeyword) {
306 [extraInfoMsg_ setStringValue:l10n_util::GetNSStringF(
307 IDS_EXTENSION_INSTALLED_OMNIBOX_KEYWORD_INFO,
308 UTF8ToUTF16(extension_->omnibox_keyword()))];
309 [extraInfoMsg_ setHidden:NO];
310 [[extraInfoMsg_ cell]
311 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
312 [GTMUILocalizerAndLayoutTweaker
313 sizeToFitFixedWidthTextField:extraInfoMsg_];
314 newWindowHeight += [extraInfoMsg_ frame].size.height +
315 extension_installed_bubble::kInnerVerticalMargin;
316 }
317
290 // Second part of extension installed message. 318 // Second part of extension installed message.
291 [[extensionInstalledInfoMsg_ cell] 319 [[extensionInstalledInfoMsg_ cell]
292 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; 320 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
293 [GTMUILocalizerAndLayoutTweaker 321 [GTMUILocalizerAndLayoutTweaker
294 sizeToFitFixedWidthTextField:extensionInstalledInfoMsg_]; 322 sizeToFitFixedWidthTextField:extensionInstalledInfoMsg_];
295 newWindowHeight += [extensionInstalledInfoMsg_ frame].size.height; 323 newWindowHeight += [extensionInstalledInfoMsg_ frame].size.height;
296 324
297 return newWindowHeight; 325 return newWindowHeight;
298 } 326 }
299 327
300 // Adjust y-position of messages to sit properly in new window height. 328 // Adjust y-position of messages to sit properly in new window height.
301 - (void)setMessageFrames:(int)newWindowHeight { 329 - (void)setMessageFrames:(int)newWindowHeight {
302 // The extension messages will always be shown. 330 // The extension messages will always be shown.
303 NSRect extensionMessageFrame1 = [extensionInstalledMsg_ frame]; 331 NSRect extensionMessageFrame1 = [extensionInstalledMsg_ frame];
304 NSRect extensionMessageFrame2 = [extensionInstalledInfoMsg_ frame]; 332 NSRect extensionMessageFrame2 = [extensionInstalledInfoMsg_ frame];
305 333
306 extensionMessageFrame1.origin.y = newWindowHeight - ( 334 extensionMessageFrame1.origin.y = newWindowHeight - (
307 extensionMessageFrame1.size.height + 335 extensionMessageFrame1.size.height +
308 extension_installed_bubble::kOuterVerticalMargin); 336 extension_installed_bubble::kOuterVerticalMargin);
309 [extensionInstalledMsg_ setFrame:extensionMessageFrame1]; 337 [extensionInstalledMsg_ setFrame:extensionMessageFrame1];
310 if (type_ == extension_installed_bubble::kPageAction) { 338 if (type_ == extension_installed_bubble::kPageAction ||
311 // The page action message is only shown when appropriate. 339 type_ == extension_installed_bubble::kOmniboxKeyword) {
312 NSRect pageActionMessageFrame = [pageActionInfoMsg_ frame]; 340 // The extra message is only shown when appropriate.
313 pageActionMessageFrame.origin.y = extensionMessageFrame1.origin.y - ( 341 NSRect extraMessageFrame = [extraInfoMsg_ frame];
314 pageActionMessageFrame.size.height + 342 extraMessageFrame.origin.y = extensionMessageFrame1.origin.y - (
343 extraMessageFrame.size.height +
315 extension_installed_bubble::kInnerVerticalMargin); 344 extension_installed_bubble::kInnerVerticalMargin);
316 [pageActionInfoMsg_ setFrame:pageActionMessageFrame]; 345 [extraInfoMsg_ setFrame:extraMessageFrame];
317 extensionMessageFrame2.origin.y = pageActionMessageFrame.origin.y - ( 346 extensionMessageFrame2.origin.y = extraMessageFrame.origin.y - (
318 extensionMessageFrame2.size.height + 347 extensionMessageFrame2.size.height +
319 extension_installed_bubble::kInnerVerticalMargin); 348 extension_installed_bubble::kInnerVerticalMargin);
320 } else { 349 } else {
321 extensionMessageFrame2.origin.y = extensionMessageFrame1.origin.y - ( 350 extensionMessageFrame2.origin.y = extensionMessageFrame1.origin.y - (
322 extensionMessageFrame2.size.height + 351 extensionMessageFrame2.size.height +
323 extension_installed_bubble::kInnerVerticalMargin); 352 extension_installed_bubble::kInnerVerticalMargin);
324 } 353 }
325 [extensionInstalledInfoMsg_ setFrame:extensionMessageFrame2]; 354 [extensionInstalledInfoMsg_ setFrame:extensionMessageFrame2];
326 } 355 }
327 356
328 // Exposed for unit testing. 357 // Exposed for unit testing.
329 - (NSRect)getExtensionInstalledMsgFrame { 358 - (NSRect)getExtensionInstalledMsgFrame {
330 return [extensionInstalledMsg_ frame]; 359 return [extensionInstalledMsg_ frame];
331 } 360 }
332 361
333 - (NSRect)getPageActionInfoMsgFrame { 362 - (NSRect)getPageActionInfoMsgFrame {
Bons 2010/11/11 19:28:57 i guess this method should be renamed as well.
Matt Perry 2010/11/12 07:20:25 Done.
334 return [pageActionInfoMsg_ frame]; 363 return [extraInfoMsg_ frame];
335 } 364 }
336 365
337 - (NSRect)getExtensionInstalledInfoMsgFrame { 366 - (NSRect)getExtensionInstalledInfoMsgFrame {
338 return [extensionInstalledInfoMsg_ frame]; 367 return [extensionInstalledInfoMsg_ frame];
339 } 368 }
340 369
341 - (void)extensionUnloaded:(id)sender { 370 - (void)extensionUnloaded:(id)sender {
342 extension_ = NULL; 371 extension_ = NULL;
343 } 372 }
344 373
345 @end 374 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698