Chromium Code Reviews| Index: chrome/browser/ui/cocoa/extensions/media_galleries_scan_result_dialog_cocoa.mm |
| diff --git a/chrome/browser/ui/cocoa/extensions/media_galleries_scan_result_dialog_cocoa.mm b/chrome/browser/ui/cocoa/extensions/media_galleries_scan_result_dialog_cocoa.mm |
| index f87d0dee12b39cb8de8358f885def000b664a5a7..6a1e6769e1c3fd30397fb46097653b81f92f2a07 100644 |
| --- a/chrome/browser/ui/cocoa/extensions/media_galleries_scan_result_dialog_cocoa.mm |
| +++ b/chrome/browser/ui/cocoa/extensions/media_galleries_scan_result_dialog_cocoa.mm |
| @@ -7,20 +7,19 @@ |
| #include "base/mac/foundation_util.h" |
| #include "base/mac/scoped_nsobject.h" |
| #include "base/strings/sys_string_conversions.h" |
| -#include "chrome/browser/ui/chrome_style.h" |
| #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_alert.h" |
| #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_control_utils.h" |
| #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_sheet.h" |
| #import "chrome/browser/ui/cocoa/key_equivalent_constants.h" |
| #include "content/public/browser/web_contents.h" |
| #include "grit/generated_resources.h" |
| -#include "grit/theme_resources.h" |
| #import "ui/base/cocoa/flipped_view.h" |
| -#import "ui/base/cocoa/menu_controller.h" |
| #import "ui/base/models/menu_model.h" |
| #include "ui/base/l10n/l10n_util.h" |
| -const CGFloat kDetailGray = 0.625; |
| +const CGFloat kCheckboxLeading = 10; |
| +const CGFloat kCheckboxWidth = 440; |
| +const CGFloat kScrollAreaHeight = 220; |
| // Controller for UI events on items in the media galleries dialog. |
| @interface MediaGalleriesScanResultCocoaController : NSObject { |
| @@ -30,6 +29,9 @@ const CGFloat kDetailGray = 0.625; |
| @property(assign, nonatomic) MediaGalleriesScanResultDialogCocoa* dialog; |
| +- (void)onAcceptButton:(id)sender; |
| +- (void)onCancelButton:(id)sender; |
| + |
| @end |
| @implementation MediaGalleriesScanResultCocoaController |
| @@ -44,65 +46,8 @@ const CGFloat kDetailGray = 0.625; |
| dialog_->OnCancelClicked(); |
| } |
| -- (void)onCheckboxToggled:(id)sender { |
| - DCHECK(dialog_); |
| - dialog_->OnCheckboxToggled(sender); |
| -} |
| - |
| -- (void)onFolderViewClicked:(id)sender { |
| - DCHECK(dialog_); |
| - dialog_->OnFolderViewClicked(sender); |
| -} |
| - |
| -@end |
| - |
| - |
| -@interface MediaGalleriesScanResultButton : NSButton { |
| - @private |
| - MediaGalleriesScanResultDialogCocoa* dialog_; // |dialog_| owns |this|. |
| - MediaGalleryPrefId prefId_; |
| - base::scoped_nsobject<MenuController> menuController_; |
| -} |
| - |
| -@property(readonly, nonatomic) MediaGalleryPrefId prefId; |
| - |
| -- (id)initWithFrame:(NSRect)frameRect |
| - dialog:(MediaGalleriesScanResultDialogCocoa*)dialog |
| - prefId:(MediaGalleryPrefId)prefId; |
| -- (NSMenu*)menuForEvent:(NSEvent*)theEvent; |
| - |
| @end |
| -@implementation MediaGalleriesScanResultButton |
| - |
| -@synthesize prefId = prefId_; |
| - |
| -- (id)initWithFrame:(NSRect)frameRect |
| - dialog:(MediaGalleriesScanResultDialogCocoa*)dialog |
| - prefId:(MediaGalleryPrefId)prefId { |
| - if ((self = [super initWithFrame:frameRect])) { |
| - dialog_ = dialog; |
| - prefId_ = prefId; |
| - } |
| - return self; |
| -} |
| - |
| -- (NSMenu*)menuForEvent:(NSEvent*)theEvent { |
| - menuController_.reset( |
| - [[MenuController alloc] initWithModel:dialog_->GetContextMenu(prefId_) |
| - useWithPopUpButtonCell:NO]); |
| - return [menuController_ menu]; |
| -} |
| - |
| -@end |
| - |
| -namespace { |
| - |
| -const CGFloat kCheckboxMargin = 10; |
| -const CGFloat kCheckboxMaxWidth = 440; |
| -const CGFloat kScrollAreaHeight = 220; |
| - |
| -} // namespace |
| MediaGalleriesScanResultDialogCocoa::MediaGalleriesScanResultDialogCocoa( |
| MediaGalleriesScanResultDialogController* controller, |
| @@ -153,14 +98,11 @@ void MediaGalleriesScanResultDialogCocoa::InitDialogControls() { |
| [main_container_ setCornerRadius:0]; |
| [main_container_ setContentViewMargins:NSZeroSize]; |
| [main_container_ setTitlePosition:NSNoTitle]; |
| - [main_container_ setBorderColor:[NSColor colorWithCalibratedRed:kDetailGray |
| - green:kDetailGray |
| - blue:kDetailGray |
| - alpha:1.0]]; |
| + [main_container_ setBorderColor:[NSColor disabledControlTextColor]]; |
| base::scoped_nsobject<NSScrollView> scroll_view( |
| [[NSScrollView alloc] initWithFrame: |
| - NSMakeRect(0, 0, kCheckboxMaxWidth, kScrollAreaHeight)]); |
| + NSMakeRect(0, 0, kCheckboxWidth, kScrollAreaHeight)]); |
| [scroll_view setHasVerticalScroller:YES]; |
| [scroll_view setHasHorizontalScroller:NO]; |
| [scroll_view setBorderType:NSNoBorder]; |
| @@ -169,25 +111,24 @@ void MediaGalleriesScanResultDialogCocoa::InitDialogControls() { |
| // Add scan results checkboxes inside the scrolling view. |
| checkbox_container_.reset([[FlippedView alloc] initWithFrame:NSZeroRect]); |
| - checkboxes_.reset([[NSMutableArray alloc] init]); |
| + CGFloat height = CreateCheckboxes(); |
|
groby-ooo-7-16
2014/04/28 22:17:12
Not suggesting you change this, just as an FYI: In
|
| + // Give the container a reasonable initial size so that the scroll_view can |
| + // figure out the content size. |
| + [checkbox_container_ setFrameSize:NSMakeSize(kCheckboxWidth, height)]; |
| [scroll_view setDocumentView:checkbox_container_]; |
| - |
| - CGFloat y_pos = 0; |
| - |
| - y_pos = CreateCheckboxes(y_pos, controller_->GetGalleryList()); |
| - |
| - [checkbox_container_ setFrame:NSMakeRect(0, 0, kCheckboxMaxWidth, y_pos + 2)]; |
| + [checkbox_container_ setFrameSize:NSMakeSize([scroll_view contentSize].width, |
| + height)]; |
| // Resize to pack the scroll view if possible. |
| NSRect scroll_frame = [scroll_view frame]; |
| if (NSHeight(scroll_frame) > NSHeight([checkbox_container_ frame])) { |
| scroll_frame.size.height = NSHeight([checkbox_container_ frame]); |
| - [scroll_view setFrame:scroll_frame]; |
| + [scroll_view setFrameSize:scroll_frame.size]; |
| } |
| [main_container_ setFrameFromContentFrame:scroll_frame]; |
| + [main_container_ setFrameOrigin:NSZeroPoint]; |
| [alert_ setAccessoryView:main_container_]; |
| - |
| [alert_ layout]; |
| } |
| @@ -195,20 +136,31 @@ void MediaGalleriesScanResultDialogCocoa::AcceptDialogForTesting() { |
| OnAcceptClicked(); |
| } |
| -CGFloat MediaGalleriesScanResultDialogCocoa::CreateCheckboxes( |
| - CGFloat y_pos, |
| - const MediaGalleriesScanResultDialogController::OrderedScanResults& |
| - scan_results) { |
| - y_pos += kCheckboxMargin; |
| - |
| +CGFloat MediaGalleriesScanResultDialogCocoa::CreateCheckboxes() { |
| + CGFloat y_pos = 0; |
| + MediaGalleriesScanResultDialogController::OrderedScanResults scan_results = |
| + controller_->GetGalleryList(); |
| for (MediaGalleriesScanResultDialogController::OrderedScanResults:: |
| const_iterator iter = scan_results.begin(); |
| iter != scan_results.end(); iter++) { |
| const MediaGalleriesScanResultDialogController::ScanResult& scan_result = |
| *iter; |
| - UpdateScanResultCheckbox(scan_result.pref_info, scan_result.selected, |
| - y_pos); |
| - y_pos = NSMaxY([[checkboxes_ lastObject] frame]) + kCheckboxMargin; |
| + base::scoped_nsobject<MediaGalleryListEntry> checkbox_entry( |
| + [[MediaGalleryListEntry alloc] |
| + initWithFrame:NSZeroRect |
| + controller:this |
| + prefId:scan_result.pref_info.pref_id |
| + galleryName:scan_result.pref_info.GetGalleryDisplayName() |
| + subscript:scan_result.pref_info.GetGalleryAdditionalDetails() |
| + tooltip:scan_result.pref_info.GetGalleryTooltip() |
| + showFolderViewer:scan_result.pref_info.IsGalleryAvailable()]); |
| + |
| + [checkbox_entry setState:scan_result.selected]; |
| + |
| + [checkbox_entry setFrameOrigin:NSMakePoint(0, y_pos)]; |
| + y_pos = NSMaxY([checkbox_entry frame]) + kCheckboxLeading; |
| + |
| + [checkbox_container_ addSubview:checkbox_entry]; |
| } |
| return y_pos; |
| @@ -226,125 +178,6 @@ void MediaGalleriesScanResultDialogCocoa::OnCancelClicked() { |
| window_->CloseWebContentsModalDialog(); |
| } |
| -void MediaGalleriesScanResultDialogCocoa::OnCheckboxToggled( |
| - NSButton* button) { |
| - [[[alert_ buttons] objectAtIndex:0] setEnabled:YES]; |
| - |
| - MediaGalleriesScanResultButton* checkbox = |
| - (MediaGalleriesScanResultButton*) button; |
| - controller_->DidToggleGalleryId([checkbox prefId], |
| - [checkbox state] == NSOnState); |
| -} |
| - |
| -void MediaGalleriesScanResultDialogCocoa::OnFolderViewClicked( |
| - NSButton* button) { |
| - MediaGalleriesScanResultButton* checkbox = |
| - base::mac::ObjCCastStrict<MediaGalleriesScanResultButton>(button); |
| - controller_->DidClickOpenFolderViewer([checkbox prefId]); |
| -} |
| - |
| -void MediaGalleriesScanResultDialogCocoa::UpdateScanResultCheckbox( |
| - const MediaGalleryPrefInfo& gallery, |
| - bool selected, |
| - CGFloat y_pos) { |
| - // Checkbox. |
| - base::scoped_nsobject<MediaGalleriesScanResultButton> checkbox( |
| - [[MediaGalleriesScanResultButton alloc] initWithFrame:NSZeroRect |
| - dialog:this |
| - prefId:gallery.pref_id]); |
| - [[checkbox cell] setLineBreakMode:NSLineBreakByTruncatingMiddle]; |
| - [checkbox setButtonType:NSSwitchButton]; |
| - [checkbox setTarget:cocoa_controller_]; |
| - [checkbox setAction:@selector(onCheckboxToggled:)]; |
| - [checkboxes_ addObject:checkbox]; |
| - |
| - [checkbox setTitle:base::SysUTF16ToNSString( |
| - gallery.GetGalleryDisplayName())]; |
| - [checkbox setToolTip:base::SysUTF16ToNSString(gallery.GetGalleryTooltip())]; |
| - [checkbox setState:selected ? NSOnState : NSOffState]; |
| - [checkbox sizeToFit]; |
| - NSRect checkbox_rect = [checkbox bounds]; |
| - |
| - // Folder viewer button. |
| - NSRect folder_viewer_rect = NSZeroRect; |
| - base::scoped_nsobject<MediaGalleriesScanResultButton> folder_viewer; |
| - if (gallery.IsGalleryAvailable()) { |
| - folder_viewer.reset( |
| - [[MediaGalleriesScanResultButton alloc] initWithFrame:NSZeroRect |
| - dialog:this |
| - prefId:gallery.pref_id]); |
| - [folder_viewer setButtonType:NSMomentaryChangeButton]; |
| - [folder_viewer setTarget:cocoa_controller_]; |
| - [folder_viewer setAction:@selector(onFolderViewClicked:)]; |
| - |
| - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| - [folder_viewer setImage:rb.GetNativeImageNamed( |
| - IDR_FILE_FOLDER).ToNSImage()]; |
| - [folder_viewer setTitle:nil]; |
| - [folder_viewer setBordered:false]; |
| - [folder_viewer setToolTip: |
| - base::SysUTF16ToNSString(gallery.GetGalleryTooltip())]; |
| - [folder_viewer sizeToFit]; |
| - folder_viewer_rect = [folder_viewer bounds]; |
| - } else { |
| - folder_viewer_rect.size.width = -kCheckboxMargin; |
| - } |
| - |
| - // Additional details text. |
| - base::scoped_nsobject<NSTextField> details( |
| - [[NSTextField alloc] initWithFrame:NSZeroRect]); |
| - [[details cell] setLineBreakMode:NSLineBreakByTruncatingHead]; |
| - [details setEditable:NO]; |
| - [details setSelectable:NO]; |
| - [details setBezeled:NO]; |
| - [details setAttributedStringValue: |
| - constrained_window::GetAttributedLabelString( |
| - base::SysUTF16ToNSString(gallery.GetGalleryAdditionalDetails()), |
| - chrome_style::kTextFontStyle, |
| - NSNaturalTextAlignment, |
| - NSLineBreakByClipping |
| - )]; |
| - [details setTextColor:[NSColor colorWithCalibratedRed:kDetailGray |
| - green:kDetailGray |
| - blue:kDetailGray |
| - alpha:1.0]]; |
| - [details sizeToFit]; |
| - NSRect details_rect = [details bounds]; |
| - |
| - // Size the views. If all the elements don't naturally fit, the checkbox |
| - // should get squished and will elide in the middle. However, it shouldn't |
| - // squish too much so it gets at least half of the max width and the details |
| - // text should elide as well in that case. |
| - int natural_width = NSWidth(checkbox_rect) + NSWidth(folder_viewer_rect) + |
| - NSWidth(details_rect) + 5 * kCheckboxMargin; |
| - if (natural_width > kCheckboxMaxWidth) { |
| - int max_content = kCheckboxMaxWidth - 5 * kCheckboxMargin; |
| - if (NSWidth(folder_viewer_rect) + NSWidth(details_rect) > max_content / 2) { |
| - details_rect.size.width = std::max( |
| - max_content / 2 - NSWidth(folder_viewer_rect), |
| - max_content - NSWidth(checkbox_rect) - NSWidth(folder_viewer_rect)); |
| - } |
| - checkbox_rect.size.width = |
| - max_content - NSWidth(folder_viewer_rect) - NSWidth(details_rect); |
| - } |
| - |
| - checkbox_rect.origin = NSMakePoint(kCheckboxMargin, y_pos); |
| - [checkbox setFrame:checkbox_rect]; |
| - [checkbox_container_ addSubview:checkbox]; |
| - |
| - folder_viewer_rect.origin = |
| - NSMakePoint(NSMaxX(checkbox_rect) + kCheckboxMargin, y_pos); |
| - if (gallery.IsGalleryAvailable()) { |
| - [folder_viewer setFrame:folder_viewer_rect]; |
| - [checkbox_container_ addSubview:folder_viewer]; |
| - } |
| - |
| - details_rect.origin = |
| - NSMakePoint(NSMaxX(folder_viewer_rect) + kCheckboxMargin, y_pos - 1); |
| - [details setFrame:details_rect]; |
| - [checkbox_container_ addSubview:details]; |
| -} |
| - |
| void MediaGalleriesScanResultDialogCocoa::UpdateResults() { |
| InitDialogControls(); |
| } |
| @@ -354,9 +187,19 @@ void MediaGalleriesScanResultDialogCocoa::OnConstrainedWindowClosed( |
| controller_->DialogFinished(accepted_); |
| } |
| +void MediaGalleriesScanResultDialogCocoa::OnCheckboxToggled( |
| + MediaGalleryPrefId prefId, bool checked) { |
| + controller_->DidToggleGalleryId(prefId, checked); |
| +} |
| + |
| +void MediaGalleriesScanResultDialogCocoa::OnFolderViewerClicked( |
| + MediaGalleryPrefId prefId) { |
| + controller_->DidClickOpenFolderViewer(prefId); |
| +} |
| + |
| ui::MenuModel* MediaGalleriesScanResultDialogCocoa::GetContextMenu( |
| - MediaGalleryPrefId prefid) { |
| - return controller_->GetContextMenu(prefid); |
| + MediaGalleryPrefId pref_id) { |
| + return controller_->GetContextMenu(pref_id); |
| } |
| // static |