| Index: chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
|
| diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
|
| index 835ba3c004dfc3cca482e2ac7f9f142dc79e1ed1..6b5871d79baf891b76e15cb7cf242040f613598d 100644
|
| --- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
|
| +++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
|
| @@ -92,6 +92,9 @@ const CGFloat kWarningsSeparatorPadding = 14;
|
| // The left padding for the link cell.
|
| const CGFloat kLinkCellPaddingLeft = 3;
|
|
|
| +// Size of individual extension icons for bundle installs.
|
| +const CGFloat kExtensionIconSize = 32;
|
| +
|
| // Maximum height we will adjust controls to when trying to accomodate their
|
| // contents.
|
| const CGFloat kMaxControlHeight = 250;
|
| @@ -102,6 +105,12 @@ NSString* const kCellAttributesKey = @"cellAttributes";
|
| NSString* const kPermissionsDetailIndex = @"permissionsDetailIndex";
|
| NSString* const kPermissionsDetailType = @"permissionsDetailType";
|
|
|
| +CGFloat ComputeDesiredControlHeight(NSControl* control) {
|
| + NSRect rect = [control frame];
|
| + rect.size.height = kMaxControlHeight;
|
| + return [[control cell] cellSizeForBounds:rect].height;
|
| +}
|
| +
|
| // Adjust the |control|'s height so that its content is not clipped.
|
| // This also adds the change in height to the |totalOffset| and shifts the
|
| // control down by that amount.
|
| @@ -109,9 +118,7 @@ void OffsetControlVerticallyToFitContent(NSControl* control,
|
| CGFloat* totalOffset) {
|
| // Adjust the control's height so that its content is not clipped.
|
| NSRect currentRect = [control frame];
|
| - NSRect fitRect = currentRect;
|
| - fitRect.size.height = kMaxControlHeight;
|
| - CGFloat desiredHeight = [[control cell] cellSizeForBounds:fitRect].height;
|
| + CGFloat desiredHeight = ComputeDesiredControlHeight(control);
|
| CGFloat offset = desiredHeight - NSHeight(currentRect);
|
|
|
| [control setFrameSize:NSMakeSize(NSWidth(currentRect),
|
| @@ -125,6 +132,32 @@ void OffsetControlVerticallyToFitContent(NSControl* control,
|
| [control setFrameOrigin:origin];
|
| }
|
|
|
| +// Adjust the |view|'s height so that its subviews are not clipped.
|
| +// This also adds the change in height to the |totalOffset| and shifts the
|
| +// control down by that amount.
|
| +void OffsetViewVerticallyToFitContent(NSView* view, CGFloat* totalOffset) {
|
| + // Adjust the view's height so that its subviews are not clipped.
|
| + CGFloat desiredHeight = 0;
|
| + for (NSView* subview in [view subviews]) {
|
| + int requiredHeight = NSMaxY([subview frame]);
|
| + if (requiredHeight > desiredHeight) {
|
| + desiredHeight = requiredHeight;
|
| + }
|
| + }
|
| + NSRect currentRect = [view frame];
|
| + CGFloat offset = desiredHeight - NSHeight(currentRect);
|
| +
|
| + [view setFrameSize:NSMakeSize(NSWidth(currentRect),
|
| + NSHeight(currentRect) + offset)];
|
| +
|
| + *totalOffset += offset;
|
| +
|
| + // Move the view vertically by the new total offset.
|
| + NSPoint origin = [view frame].origin;
|
| + origin.y -= *totalOffset;
|
| + [view setFrameOrigin:origin];
|
| +}
|
| +
|
| // Gets the desired height of |outlineView|. Simply using the view's frame
|
| // doesn't work if an animation is pending.
|
| CGFloat GetDesiredOutlineViewHeight(NSOutlineView* outlineView) {
|
| @@ -270,9 +303,7 @@ bool HasAttribute(id item, CellAttributesMask attributeMask) {
|
| gfx::SkColorToCalibratedNSColor(chrome_style::GetLinkColor())];
|
| }
|
|
|
| - // The bundle install dialog has no icon.
|
| - if (![self isBundleInstall])
|
| - [iconView_ setImage:prompt_->icon().ToNSImage()];
|
| + [iconView_ setImage:prompt_->icon().ToNSImage()];
|
|
|
| // The dialog is laid out in the NIB exactly how we want it assuming that
|
| // each label fits on one line. However, for each label, we want to allow
|
| @@ -309,22 +340,53 @@ bool HasAttribute(id item, CellAttributesMask attributeMask) {
|
| }
|
|
|
| if ([self isBundleInstall]) {
|
| - // We display the list of extension names as a simple text string, seperated
|
| - // by newlines.
|
| BundleInstaller::ItemList items = prompt_->bundle()->GetItemsWithState(
|
| BundleInstaller::Item::STATE_PENDING);
|
|
|
| - NSMutableString* joinedItems = [NSMutableString string];
|
| - for (size_t i = 0; i < items.size(); ++i) {
|
| - if (i > 0)
|
| - [joinedItems appendString:@"\n"];
|
| - [joinedItems appendString:base::SysUTF16ToNSString(
|
| - items[i].GetNameForDisplay())];
|
| + const CGFloat titleWidth =
|
| + [itemsField_ frame].size.width - kExtensionIconSize;
|
| + CGFloat offset = 0;
|
| + // Go over the items backwards, since Cocoa coords go from the bottom up.
|
| + for (size_t i = items.size(); i > 0; --i) {
|
| + const BundleInstaller::Item& item = items[i - 1];
|
| +
|
| + NSString* title = base::SysUTF16ToNSString(item.GetNameForDisplay());
|
| + NSRect titleFrame = NSMakeRect(kExtensionIconSize, offset, titleWidth, 0);
|
| + base::scoped_nsobject<NSTextField> titleView(
|
| + [[NSTextField alloc] initWithFrame:titleFrame]);
|
| + [titleView setBordered:NO];
|
| + [titleView setEditable:NO];
|
| + [titleView setStringValue:title];
|
| +
|
| + titleFrame.size.height = ComputeDesiredControlHeight(titleView);
|
| +
|
| + 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;
|
| + else
|
| + iconFrame.origin.y -= align;
|
| +
|
| + [titleView setFrame:titleFrame];
|
| +
|
| + 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];
|
| +
|
| + [itemsField_ addSubview:iconView];
|
| + [itemsField_ addSubview:titleView];
|
| +
|
| + offset = NSMaxY(NSUnionRect(titleFrame, iconFrame));
|
| }
|
| - [itemsField_ setStringValue:joinedItems];
|
|
|
| - // Adjust the controls to fit the list of extensions.
|
| - OffsetControlVerticallyToFitContent(itemsField_, &totalOffset);
|
| + // Adjust the view to fit the list of extensions.
|
| + OffsetViewVerticallyToFitContent(itemsField_, &totalOffset);
|
| }
|
|
|
| // If there are any warnings, retained devices or retained files, then we
|
|
|