#include "chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.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"
#include "content/public/browser/web_contents.h"
#include "grit/generated_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"
#include "ui/base/resource/resource_bundle.h"
+// Controller for UI events on items in the media galleries dialog.
@interface MediaGalleriesCocoaController : NSObject {
@private
MediaGalleriesDialogCocoa* dialog_;
}
-@property(nonatomic, assign) MediaGalleriesDialogCocoa* dialog;
+@property(assign, nonatomic) MediaGalleriesDialogCocoa* dialog;
@end
@end
+
+@interface MediaGalleriesCheckbox : NSButton {
+ @private
+ MediaGalleriesDialogCocoa* dialog_; // |dialog_| owns |this|.
+ MediaGalleryPrefId prefId_;
+ base::scoped_nsobject<MenuController> menuController_;
+}
+
+- (id)initWithFrame:(NSRect)frameRect
+ dialog:(MediaGalleriesDialogCocoa*)dialog
+ prefId:(MediaGalleryPrefId)prefId;
+- (NSMenu*)menuForEvent:(NSEvent*)theEvent;
+
+@end
+
+@implementation MediaGalleriesCheckbox
+
+- (id)initWithFrame:(NSRect)frameRect
+ dialog:(MediaGalleriesDialogCocoa*)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;
alert_.reset([[ConstrainedWindowAlert alloc] init]);
[alert_ setMessageText:base::SysUTF16ToNSString(controller_->GetHeader())];
- [alert_ setInformativeText:SysUTF16ToNSString(controller_->GetSubtext())];
+ [alert_ setInformativeText:
+ base::SysUTF16ToNSString(controller_->GetSubtext())];
[alert_ addButtonWithTitle:
l10n_util::GetNSString(IDS_MEDIA_GALLERIES_DIALOG_CONFIRM)
keyEquivalent:kKeyEquivalentReturn
}
void MediaGalleriesDialogCocoa::InitDialogControls() {
- accessory_.reset([[NSBox alloc] init]);
- [accessory_ setBoxType:NSBoxCustom];
- [accessory_ setBorderType:NSLineBorder];
- [accessory_ setBorderWidth:1];
- [accessory_ setCornerRadius:0];
- [accessory_ setTitlePosition:NSNoTitle];
- [accessory_ setBorderColor:[NSColor colorWithCalibratedRed:0.625
- green:0.625
- blue:0.625
- alpha:1.0]];
-
- base::scoped_nsobject<NSScrollView> scroll_view([[NSScrollView alloc]
- initWithFrame:NSMakeRect(0, 0, kCheckboxMaxWidth, kScrollAreaHeight)]);
+ main_container_.reset([[NSBox alloc] init]);
+ [main_container_ setBoxType:NSBoxCustom];
+ [main_container_ setBorderType:NSLineBorder];
+ [main_container_ setBorderWidth:1];
+ [main_container_ setCornerRadius:0];
+ [main_container_ setContentViewMargins:NSZeroSize];
+ [main_container_ setTitlePosition:NSNoTitle];
+ [main_container_ setBorderColor:[NSColor colorWithCalibratedRed:0.625
+ green:0.625
+ blue:0.625
+ alpha:1.0]];
+
+ base::scoped_nsobject<NSScrollView> scroll_view(
+ [[NSScrollView alloc] initWithFrame:
+ NSMakeRect(0, 0, kCheckboxMaxWidth, kScrollAreaHeight)]);
[scroll_view setHasVerticalScroller:YES];
[scroll_view setHasHorizontalScroller:NO];
[scroll_view setBorderType:NSNoBorder];
[scroll_view setAutohidesScrollers:YES];
- [[accessory_ contentView] addSubview:scroll_view];
+ [[main_container_ contentView] addSubview:scroll_view];
// Add gallery permission checkboxes inside the scrolling view.
checkbox_container_.reset([[FlippedView alloc] initWithFrame:NSZeroRect]);
checkboxes_.reset([[NSMutableArray alloc] init]);
[scroll_view setDocumentView:checkbox_container_];
- CGFloat y_pos = kCheckboxMargin;
+ CGFloat y_pos = 0;
y_pos = CreateAttachedCheckboxes(y_pos, controller_->AttachedPermissions());
[scroll_view setFrame:scroll_frame];
}
- [accessory_ setFrame:NSMakeRect(
- 0, 0, kCheckboxMaxWidth, NSHeight(scroll_frame))];
- [alert_ setAccessoryView:accessory_];
+ [main_container_ setFrameFromContentFrame:scroll_frame];
+ [alert_ setAccessoryView:main_container_];
// As a safeguard against the user skipping reading over the dialog and just
// confirming, the button will be unavailable for dialogs without any checks
const MediaGalleryPrefInfo& gallery,
bool permitted,
CGFloat y_pos) {
- base::scoped_nsobject<NSButton> checkbox(
- [[NSButton alloc] initWithFrame:NSZeroRect]);
+ // Checkbox.
+ base::scoped_nsobject<MediaGalleriesCheckbox> checkbox(
+ [[MediaGalleriesCheckbox alloc] initWithFrame:NSZeroRect
+ dialog:this
+ prefId:gallery.pref_id]);
NSString* unique_id = GetUniqueIDForGallery(gallery);
[[checkbox cell] setRepresentedObject:unique_id];
[[checkbox cell] setLineBreakMode:NSLineBreakByTruncatingMiddle];
[checkbox setAction:@selector(onCheckboxToggled:)];
[checkboxes_ addObject:checkbox];
- // TODO(gbillock): Would be nice to add middle text elide behavior here.
[checkbox setTitle:base::SysUTF16ToNSString(
gallery.GetGalleryDisplayName())];
[checkbox setToolTip:base::SysUTF16ToNSString(gallery.GetGalleryTooltip())];
[checkbox sizeToFit];
NSRect rect = [checkbox bounds];
- rect.origin.y = y_pos;
- rect.origin.x = kCheckboxMargin;
- rect.size.width = std::min(NSWidth(rect), kCheckboxMaxWidth);
- [checkbox setFrame:rect];
- [checkbox_container_ addSubview:checkbox];
+ // Detail text.
base::scoped_nsobject<NSTextField> details(
[[NSTextField alloc] initWithFrame:NSZeroRect]);
[details setEditable:NO];
alpha:1.0]];
[details sizeToFit];
NSRect details_rect = [details bounds];
- details_rect.origin.y = y_pos - 1;
- details_rect.origin.x = kCheckboxMargin + rect.size.width + kCheckboxMargin;
- details_rect.size.width = kCheckboxMaxWidth - details_rect.origin.x;
+
+ // The checkbox will elide so reduce its size so it will all fit.
+ rect.size.width =
+ std::min(NSWidth(rect),
+ kCheckboxMaxWidth - 3 * kCheckboxMargin - NSWidth(details_rect));
+ rect.origin = NSMakePoint(kCheckboxMargin, y_pos);
+ [checkbox setFrame:rect];
+ [checkbox_container_ addSubview:checkbox];
+
+ details_rect.origin = NSMakePoint(NSMaxX(rect) + kCheckboxMargin, y_pos - 1);
[details setFrame:details_rect];
[checkbox_container_ addSubview:details];
controller_->DialogFinished(accepted_);
}
+ui::MenuModel* MediaGalleriesDialogCocoa::GetContextMenu(
+ MediaGalleryPrefId prefid) {
+ return controller_->GetContextMenu(prefid);
+}
+
// static
MediaGalleriesDialog* MediaGalleriesDialog::Create(
MediaGalleriesDialogController* controller) {