Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |