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

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

Issue 816223008: Update UI for WebStore bundle installs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bundles_api
Patch Set: finnur review Created 5 years, 8 months 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/extensions/extension_installed_bubble_controlle r.h" 5 #import "chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controlle r.h"
6 6
7 #include "base/i18n/rtl.h" 7 #include "base/i18n/rtl.h"
8 #include "base/mac/mac_util.h"
8 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/sys_string_conversions.h" 10 #include "base/strings/sys_string_conversions.h"
10 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/browser/extensions/bundle_installer.h" 12 #include "chrome/browser/extensions/bundle_installer.h"
12 #include "chrome/browser/extensions/extension_action.h" 13 #include "chrome/browser/extensions/extension_action.h"
13 #include "chrome/browser/extensions/extension_action_manager.h" 14 #include "chrome/browser/extensions/extension_action_manager.h"
14 #include "chrome/browser/ui/browser.h" 15 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/browser_navigator.h" 16 #include "chrome/browser/ui/browser_navigator.h"
16 #include "chrome/browser/ui/browser_window.h" 17 #include "chrome/browser/ui/browser_window.h"
17 #include "chrome/browser/ui/chrome_pages.h" 18 #include "chrome/browser/ui/chrome_pages.h"
(...skipping 18 matching lines...) Expand all
36 #include "chrome/grit/chromium_strings.h" 37 #include "chrome/grit/chromium_strings.h"
37 #include "chrome/grit/generated_resources.h" 38 #include "chrome/grit/generated_resources.h"
38 #include "components/signin/core/browser/signin_metrics.h" 39 #include "components/signin/core/browser/signin_metrics.h"
39 #include "extensions/browser/install/extension_install_ui.h" 40 #include "extensions/browser/install/extension_install_ui.h"
40 #include "extensions/common/extension.h" 41 #include "extensions/common/extension.h"
41 #include "extensions/common/feature_switch.h" 42 #include "extensions/common/feature_switch.h"
42 #import "skia/ext/skia_utils_mac.h" 43 #import "skia/ext/skia_utils_mac.h"
43 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw eaker.h" 44 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw eaker.h"
44 #import "ui/base/cocoa/controls/hyperlink_text_view.h" 45 #import "ui/base/cocoa/controls/hyperlink_text_view.h"
45 #include "ui/base/l10n/l10n_util.h" 46 #include "ui/base/l10n/l10n_util.h"
47 #include "ui/gfx/image/image_skia_util_mac.h"
46 48
47 using content::BrowserThread; 49 using content::BrowserThread;
48 using extensions::BundleInstaller; 50 using extensions::BundleInstaller;
49 using extensions::Extension; 51 using extensions::Extension;
50 52
53 // Size of individual extension icons for bundle installs.
54 const CGFloat kExtensionIconSize = 32;
55
51 class ExtensionInstalledBubbleBridge 56 class ExtensionInstalledBubbleBridge
52 : public ExtensionInstalledBubble::Delegate { 57 : public ExtensionInstalledBubble::Delegate {
53 public: 58 public:
54 explicit ExtensionInstalledBubbleBridge( 59 explicit ExtensionInstalledBubbleBridge(
55 ExtensionInstalledBubbleController* controller); 60 ExtensionInstalledBubbleController* controller);
56 ~ExtensionInstalledBubbleBridge() override; 61 ~ExtensionInstalledBubbleBridge() override;
57 62
58 private: 63 private:
59 // ExtensionInstalledBubble::Delegate: 64 // ExtensionInstalledBubble::Delegate:
60 bool MaybeShowNow() override; 65 bool MaybeShowNow() override;
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 - (int)calculateWindowHeight { 335 - (int)calculateWindowHeight {
331 // Adjust the window height to reflect the sum height of all messages 336 // Adjust the window height to reflect the sum height of all messages
332 // and vertical padding. 337 // and vertical padding.
333 int newWindowHeight = 2 * extension_installed_bubble::kOuterVerticalMargin; 338 int newWindowHeight = 2 * extension_installed_bubble::kOuterVerticalMargin;
334 339
335 // If type is bundle, list the extensions that were installed and those that 340 // If type is bundle, list the extensions that were installed and those that
336 // failed. 341 // failed.
337 if (type_ == extension_installed_bubble::kBundle) { 342 if (type_ == extension_installed_bubble::kBundle) {
338 NSInteger installedListHeight = 343 NSInteger installedListHeight =
339 [self addExtensionList:installedHeadingMsg_ 344 [self addExtensionList:installedHeadingMsg_
340 itemsMsg:installedItemsMsg_ 345 itemsView:installedItemsView_
341 state:BundleInstaller::Item::STATE_INSTALLED]; 346 state:BundleInstaller::Item::STATE_INSTALLED];
342 347
343 NSInteger failedListHeight = 348 NSInteger failedListHeight =
344 [self addExtensionList:failedHeadingMsg_ 349 [self addExtensionList:failedHeadingMsg_
345 itemsMsg:failedItemsMsg_ 350 itemsView:failedItemsView_
346 state:BundleInstaller::Item::STATE_FAILED]; 351 state:BundleInstaller::Item::STATE_FAILED];
347 352
348 newWindowHeight += installedListHeight + failedListHeight; 353 newWindowHeight += installedListHeight + failedListHeight;
349 354
350 // Put some space between the lists if both are present. 355 // Put some space between the lists if both are present.
351 if (installedListHeight > 0 && failedListHeight > 0) 356 if (installedListHeight > 0 && failedListHeight > 0)
352 newWindowHeight += extension_installed_bubble::kInnerVerticalMargin; 357 newWindowHeight += extension_installed_bubble::kInnerVerticalMargin;
353 358
354 return newWindowHeight; 359 return newWindowHeight;
355 } 360 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 chrome_style::GetLinkColor())]; 460 chrome_style::GetLinkColor())];
456 [GTMUILocalizerAndLayoutTweaker sizeToFitView:manageShortcutLink_]; 461 [GTMUILocalizerAndLayoutTweaker sizeToFitView:manageShortcutLink_];
457 newWindowHeight += extension_installed_bubble::kInnerVerticalMargin; 462 newWindowHeight += extension_installed_bubble::kInnerVerticalMargin;
458 newWindowHeight += NSHeight([manageShortcutLink_ frame]); 463 newWindowHeight += NSHeight([manageShortcutLink_ frame]);
459 } 464 }
460 465
461 return newWindowHeight; 466 return newWindowHeight;
462 } 467 }
463 468
464 - (NSInteger)addExtensionList:(NSTextField*)headingMsg 469 - (NSInteger)addExtensionList:(NSTextField*)headingMsg
465 itemsMsg:(NSTextField*)itemsMsg 470 itemsView:(NSView*)itemsView
466 state:(BundleInstaller::Item::State)state { 471 state:(BundleInstaller::Item::State)state {
467 base::string16 heading = bundle_->GetHeadingTextFor(state); 472 base::string16 heading = bundle_->GetHeadingTextFor(state);
468 bool hidden = heading.empty(); 473 bool hidden = heading.empty();
469 [headingMsg setHidden:hidden]; 474 [headingMsg setHidden:hidden];
470 [itemsMsg setHidden:hidden]; 475 [itemsView setHidden:hidden];
471 if (hidden) 476 if (hidden)
472 return 0; 477 return 0;
473 478
474 [headingMsg setStringValue:base::SysUTF16ToNSString(heading)]; 479 [headingMsg setStringValue:base::SysUTF16ToNSString(heading)];
475 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:headingMsg]; 480 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:headingMsg];
476 481
477 NSMutableString* joinedItems = [NSMutableString string]; 482 const CGFloat titleWidth = [itemsView frame].size.width - kExtensionIconSize;
483 CGFloat offset = 0;
484 // Go over the items backwards, since Cocoa coords go from the bottom up.
Alexei Svitkine (slow) 2015/04/21 16:40:52 This code appears to be the same as in extension_i
Marc Treib 2015/04/22 08:09:16 Done. (Added new bundle_util.h/mm since there didn
478 BundleInstaller::ItemList items = bundle_->GetItemsWithState(state); 485 BundleInstaller::ItemList items = bundle_->GetItemsWithState(state);
479 for (size_t i = 0; i < items.size(); ++i) { 486 for (size_t i = items.size(); i > 0; --i) {
480 if (i > 0) 487 const BundleInstaller::Item& item = items[i - 1];
481 [joinedItems appendString:@"\n"]; 488
482 [joinedItems appendString:base::SysUTF16ToNSString( 489 NSString* title = base::SysUTF16ToNSString(item.GetNameForDisplay());
483 items[i].GetNameForDisplay())]; 490 base::scoped_nsobject<NSTextField> titleView([[NSTextField alloc]
491 initWithFrame:NSMakeRect(kExtensionIconSize, offset, titleWidth, 0)]);
492 [titleView setBordered:NO];
493 [titleView setEditable:NO];
494 [titleView setStringValue:title];
495 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:titleView];
496
497 NSRect titleFrame = [titleView frame];
498 NSRect iconFrame =
499 NSMakeRect(0, offset, kExtensionIconSize, kExtensionIconSize);
500
501 // Vertically center-align icon and title.
502 CGFloat align = (iconFrame.size.height - titleFrame.size.height) / 2;
503 if (align > 0) {
504 titleFrame.origin.y += align;
505 [titleView setFrame:titleFrame];
506 } else {
507 iconFrame.origin.y -= align;
508 }
509
510 gfx::ImageSkia skiaImage = gfx::ImageSkia::CreateFrom1xBitmap(item.icon);
511 NSImage* image = gfx::NSImageFromImageSkiaWithColorSpace(
512 skiaImage, base::mac::GetSystemColorSpace());
513 base::scoped_nsobject<NSImageView> iconView(
514 [[NSImageView alloc] initWithFrame:iconFrame]);
515 [iconView setImage:image];
516
517 [itemsView addSubview:iconView];
518 [itemsView addSubview:titleView];
519
520 offset = NSMaxY(NSUnionRect(titleFrame, iconFrame));
484 } 521 }
485 522
486 [itemsMsg setStringValue:joinedItems]; 523 NSRect frame = [itemsView frame];
487 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:itemsMsg]; 524 frame.size.height = offset;
525 [itemsView setFrame:frame];
488 526
489 return NSHeight([headingMsg frame]) + 527 return NSHeight([headingMsg frame]) +
490 extension_installed_bubble::kInnerVerticalMargin + 528 extension_installed_bubble::kInnerVerticalMargin +
491 NSHeight([itemsMsg frame]); 529 NSHeight([itemsView frame]);
492 } 530 }
493 531
494 // Adjust y-position of messages to sit properly in new window height. 532 // Adjust y-position of messages to sit properly in new window height.
495 - (void)setMessageFrames:(int)newWindowHeight { 533 - (void)setMessageFrames:(int)newWindowHeight {
496 if (type_ == extension_installed_bubble::kBundle) { 534 if (type_ == extension_installed_bubble::kBundle) {
497 // Layout the messages from the bottom up. 535 // Layout the messages from the bottom up.
498 NSTextField* msgs[] = { failedItemsMsg_, failedHeadingMsg_, 536 NSView* msgs[] = { failedItemsView_, failedHeadingMsg_,
499 installedItemsMsg_, installedHeadingMsg_ }; 537 installedItemsView_, installedHeadingMsg_ };
500 NSInteger offsetFromBottom = 0; 538 NSInteger offsetFromBottom = 0;
501 BOOL isFirstVisible = YES; 539 BOOL isFirstVisible = YES;
502 for (size_t i = 0; i < arraysize(msgs); ++i) { 540 for (size_t i = 0; i < arraysize(msgs); ++i) {
503 if ([msgs[i] isHidden]) 541 if ([msgs[i] isHidden])
504 continue; 542 continue;
505 543
506 NSRect frame = [msgs[i] frame]; 544 NSRect frame = [msgs[i] frame];
507 NSInteger margin = isFirstVisible ? 545 NSInteger margin = isFirstVisible ?
508 extension_installed_bubble::kOuterVerticalMargin : 546 extension_installed_bubble::kOuterVerticalMargin :
509 extension_installed_bubble::kInnerVerticalMargin; 547 extension_installed_bubble::kInnerVerticalMargin;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 install_ui->OpenAppInstalledUI([self extension]->id()); 647 install_ui->OpenAppInstalledUI([self extension]->id());
610 } 648 }
611 649
612 - (void)awakeFromNib { 650 - (void)awakeFromNib {
613 if (bundle_) 651 if (bundle_)
614 return; 652 return;
615 [self initializeLabel]; 653 [self initializeLabel];
616 } 654 }
617 655
618 @end 656 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698