Chromium Code Reviews| Index: chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm |
| diff --git a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm |
| index d42ba95a4e611bbf2479c252834b6e32f1ba0f1f..772ec08d917df7d912e09f099bf84199b87802fa 100644 |
| --- a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm |
| +++ b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm |
| @@ -5,6 +5,7 @@ |
| #import "chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.h" |
| #include "base/i18n/rtl.h" |
| +#include "base/mac/mac_util.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/strings/sys_string_conversions.h" |
| #include "base/strings/utf_string_conversions.h" |
| @@ -43,11 +44,15 @@ |
| #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTweaker.h" |
| #import "ui/base/cocoa/controls/hyperlink_text_view.h" |
| #include "ui/base/l10n/l10n_util.h" |
| +#include "ui/gfx/image/image_skia_util_mac.h" |
| using content::BrowserThread; |
| using extensions::BundleInstaller; |
| using extensions::Extension; |
| +// Size of individual extension icons for bundle installs. |
| +const CGFloat kExtensionIconSize = 32; |
| + |
| class ExtensionInstalledBubbleBridge |
| : public ExtensionInstalledBubble::Delegate { |
| public: |
| @@ -337,12 +342,12 @@ bool ExtensionInstalledBubbleBridge::MaybeShowNow() { |
| if (type_ == extension_installed_bubble::kBundle) { |
| NSInteger installedListHeight = |
| [self addExtensionList:installedHeadingMsg_ |
| - itemsMsg:installedItemsMsg_ |
| + itemsView:installedItemsView_ |
| state:BundleInstaller::Item::STATE_INSTALLED]; |
| NSInteger failedListHeight = |
| [self addExtensionList:failedHeadingMsg_ |
| - itemsMsg:failedItemsMsg_ |
| + itemsView:failedItemsView_ |
| state:BundleInstaller::Item::STATE_FAILED]; |
| newWindowHeight += installedListHeight + failedListHeight; |
| @@ -462,41 +467,74 @@ bool ExtensionInstalledBubbleBridge::MaybeShowNow() { |
| } |
| - (NSInteger)addExtensionList:(NSTextField*)headingMsg |
| - itemsMsg:(NSTextField*)itemsMsg |
| + itemsView:(NSView*)itemsView |
| state:(BundleInstaller::Item::State)state { |
| base::string16 heading = bundle_->GetHeadingTextFor(state); |
| bool hidden = heading.empty(); |
| [headingMsg setHidden:hidden]; |
| - [itemsMsg setHidden:hidden]; |
| + [itemsView setHidden:hidden]; |
| if (hidden) |
| return 0; |
| [headingMsg setStringValue:base::SysUTF16ToNSString(heading)]; |
| [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:headingMsg]; |
| - NSMutableString* joinedItems = [NSMutableString string]; |
| + const CGFloat titleWidth = [itemsView frame].size.width - kExtensionIconSize; |
| + CGFloat offset = 0; |
| + // 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
|
| BundleInstaller::ItemList items = bundle_->GetItemsWithState(state); |
| - for (size_t i = 0; i < items.size(); ++i) { |
| - if (i > 0) |
| - [joinedItems appendString:@"\n"]; |
| - [joinedItems appendString:base::SysUTF16ToNSString( |
| - items[i].GetNameForDisplay())]; |
| + for (size_t i = items.size(); i > 0; --i) { |
| + const BundleInstaller::Item& item = items[i - 1]; |
| + |
| + NSString* title = base::SysUTF16ToNSString(item.GetNameForDisplay()); |
| + base::scoped_nsobject<NSTextField> titleView([[NSTextField alloc] |
| + initWithFrame:NSMakeRect(kExtensionIconSize, offset, titleWidth, 0)]); |
| + [titleView setBordered:NO]; |
| + [titleView setEditable:NO]; |
| + [titleView setStringValue:title]; |
| + [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:titleView]; |
| + |
| + NSRect titleFrame = [titleView frame]; |
| + NSRect iconFrame = |
| + NSMakeRect(0, offset, kExtensionIconSize, kExtensionIconSize); |
| + |
| + // Vertically center-align icon and title. |
| + CGFloat align = (iconFrame.size.height - titleFrame.size.height) / 2; |
| + if (align > 0) { |
| + titleFrame.origin.y += align; |
| + [titleView setFrame:titleFrame]; |
| + } else { |
| + iconFrame.origin.y -= align; |
| + } |
| + |
| + gfx::ImageSkia skiaImage = gfx::ImageSkia::CreateFrom1xBitmap(item.icon); |
| + NSImage* image = gfx::NSImageFromImageSkiaWithColorSpace( |
| + skiaImage, base::mac::GetSystemColorSpace()); |
| + base::scoped_nsobject<NSImageView> iconView( |
| + [[NSImageView alloc] initWithFrame:iconFrame]); |
| + [iconView setImage:image]; |
| + |
| + [itemsView addSubview:iconView]; |
| + [itemsView addSubview:titleView]; |
| + |
| + offset = NSMaxY(NSUnionRect(titleFrame, iconFrame)); |
| } |
| - [itemsMsg setStringValue:joinedItems]; |
| - [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:itemsMsg]; |
| + NSRect frame = [itemsView frame]; |
| + frame.size.height = offset; |
| + [itemsView setFrame:frame]; |
| return NSHeight([headingMsg frame]) + |
| extension_installed_bubble::kInnerVerticalMargin + |
| - NSHeight([itemsMsg frame]); |
| + NSHeight([itemsView frame]); |
| } |
| // Adjust y-position of messages to sit properly in new window height. |
| - (void)setMessageFrames:(int)newWindowHeight { |
| if (type_ == extension_installed_bubble::kBundle) { |
| // Layout the messages from the bottom up. |
| - NSTextField* msgs[] = { failedItemsMsg_, failedHeadingMsg_, |
| - installedItemsMsg_, installedHeadingMsg_ }; |
| + NSView* msgs[] = { failedItemsView_, failedHeadingMsg_, |
| + installedItemsView_, installedHeadingMsg_ }; |
| NSInteger offsetFromBottom = 0; |
| BOOL isFirstVisible = YES; |
| for (size_t i = 0; i < arraysize(msgs); ++i) { |