Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(462)

Unified Diff: chrome/browser/ui/cocoa/extensions/media_galleries_scan_result_dialog_cocoa.mm

Issue 231873003: Refactor media galleries dialogs on cocoa to extract common code (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
+ // 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

Powered by Google App Engine
This is Rietveld 408576698