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 |