Index: chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.mm |
diff --git a/chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.mm b/chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..19f393f5d3509faf8e2cfb1f19ce00baaf953c5c |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.mm |
@@ -0,0 +1,216 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.h" |
+ |
+#include "base/sys_string_conversions.h" |
+#include "grit/generated_resources.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+const CGFloat kCheckboxMargin = 5; |
+const CGFloat kCheckboxMaxWidth = 350; |
+ |
+@interface MediaGalleriesCocoaController : NSObject { |
+ @private |
+ chrome::MediaGalleriesDialogCocoa* dialog_; |
+} |
+ |
+@property(nonatomic, assign) chrome::MediaGalleriesDialogCocoa* dialog; |
+ |
+@end |
+ |
+@implementation MediaGalleriesCocoaController |
+ |
+@synthesize dialog = dialog_; |
+ |
+- (void)onAddFolderClicked:(id)sender { |
+ DCHECK(dialog_); |
+ dialog_->OnAddFolderClicked(); |
+} |
+ |
+- (void)onCheckboxToggled:(id)sender { |
+ DCHECK(dialog_); |
+ dialog_->OnCheckboxToggled(sender); |
+} |
+ |
+- (void)sheetDidEnd:(NSWindow*)parent |
+ returnCode:(NSInteger)returnCode |
+ context:(void*)context { |
+ DCHECK(dialog_); |
+ dialog_->SheetDidEnd(returnCode); |
+} |
+ |
+@end |
+ |
+namespace chrome { |
+ |
+MediaGalleriesDialogCocoa::MediaGalleriesDialogCocoa( |
+ MediaGalleriesDialogController* controller, |
+ MediaGalleriesCocoaController* cocoa_controller) |
+ : ConstrainedWindowMacDelegateSystemSheet( |
+ cocoa_controller, @selector(sheetDidEnd:returnCode:context:)), |
+ controller_(controller), |
+ window_(NULL), |
+ accepted_(false), |
+ cocoa_controller_([cocoa_controller retain]) { |
+ [cocoa_controller_ setDialog:this]; |
+ |
+ alert_.reset([[NSAlert alloc] init]); |
+ [alert_ setMessageText:base::SysUTF16ToNSString(controller_->GetHeader())]; |
+ [alert_ setInformativeText:SysUTF16ToNSString(controller_->GetSubtext())]; |
+ [alert_ addButtonWithTitle:l10n_util::GetNSString( |
+ IDS_MEDIA_GALLERIES_DIALOG_CONFIRM)]; |
+ [alert_ addButtonWithTitle:l10n_util::GetNSString( |
+ IDS_MEDIA_GALLERIES_DIALOG_CANCEL)]; |
+ [alert_ addButtonWithTitle:l10n_util::GetNSString( |
+ IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY)]; |
+ |
+ // Override the add button click handler to prevent the alert from closing. |
+ NSButton* add_button = [[alert_ buttons] objectAtIndex:2]; |
+ [add_button setTarget:cocoa_controller_]; |
+ [add_button setAction:@selector(onAddFolderClicked:)]; |
+ |
+ // Add gallery permission checkboxes inside an accessory view. |
+ checkbox_container_.reset([[NSView alloc] initWithFrame:NSZeroRect]); |
+ checkboxes_.reset([[NSMutableArray alloc] init]); |
+ const MediaGalleriesDialogController::KnownGalleryPermissions& permissions = |
+ controller_->permissions(); |
+ for (MediaGalleriesDialogController::KnownGalleryPermissions:: |
+ const_reverse_iterator iter = permissions.rbegin(); |
+ iter != permissions.rend(); iter++) { |
+ const MediaGalleriesDialogController::GalleryPermission& permission = |
+ iter->second; |
+ UpdateGalleryCheckbox(nil, &permission.pref_info, permission.allowed); |
+ } |
+ UpdateCheckboxContainerFrame(); |
+ [alert_ setAccessoryView:checkbox_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 |
+ // until the user toggles something. |
+ [[[alert_ buttons] objectAtIndex:0] setEnabled: |
+ controller_->HasPermittedGalleries()]; |
+ |
+ set_sheet(alert_); |
+ window_ = new ConstrainedWindowMac(controller->tab_contents(), this); |
+} |
+ |
+MediaGalleriesDialogCocoa::~MediaGalleriesDialogCocoa() { |
+} |
+ |
+void MediaGalleriesDialogCocoa::OnAddFolderClicked() { |
+ controller_->OnAddFolderClicked(); |
+} |
+ |
+void MediaGalleriesDialogCocoa::OnCheckboxToggled(NSButton* checkbox) { |
+ const MediaGalleriesDialogController::KnownGalleryPermissions& permissions = |
+ controller_->permissions(); |
+ [[[alert_ buttons] objectAtIndex:0] setEnabled:YES]; |
+ |
+ for (MediaGalleriesDialogController::KnownGalleryPermissions:: |
+ const_reverse_iterator iter = permissions.rbegin(); |
+ iter != permissions.rend(); iter++) { |
+ const MediaGalleryPrefInfo* gallery = &iter->second.pref_info; |
+ NSString* device_id = base::SysUTF8ToNSString(gallery->device_id); |
+ if ([[[checkbox cell] representedObject] isEqual:device_id]) { |
+ controller_->DidToggleGallery(gallery, [checkbox state] == NSOnState); |
+ break; |
+ } |
+ } |
+} |
+ |
+void MediaGalleriesDialogCocoa::SheetDidEnd(NSInteger result) { |
+ switch (result) { |
+ case NSAlertFirstButtonReturn: |
+ accepted_ = true; |
+ window_->CloseConstrainedWindow(); |
+ break; |
+ case NSAlertSecondButtonReturn: |
+ window_->CloseConstrainedWindow(); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+} |
+ |
+void MediaGalleriesDialogCocoa::UpdateGalleryCheckbox( |
+ NSButton* checkbox, |
+ const MediaGalleryPrefInfo* gallery, |
+ bool permitted) { |
+ CGFloat y_pos = 0; |
+ if (checkbox) { |
+ y_pos = NSMinY([checkbox frame]); |
+ } else { |
+ if ([checkboxes_ count] > 0) |
+ y_pos = NSMaxY([[checkboxes_ lastObject] frame]) + kCheckboxMargin; |
+ |
+ scoped_nsobject<NSButton> new_checkbox( |
+ [[NSButton alloc] initWithFrame:NSZeroRect]); |
+ NSString* device_id = base::SysUTF8ToNSString(gallery->device_id); |
+ [[new_checkbox cell] setRepresentedObject:device_id]; |
+ [[new_checkbox cell] setLineBreakMode:NSLineBreakByTruncatingMiddle]; |
+ [new_checkbox setButtonType:NSSwitchButton]; |
+ [new_checkbox setTarget:cocoa_controller_]; |
+ [new_checkbox setAction:@selector(onCheckboxToggled:)]; |
+ |
+ [checkbox_container_ addSubview:new_checkbox]; |
+ [checkboxes_ addObject:new_checkbox]; |
+ checkbox = new_checkbox.get(); |
+ } |
+ |
+ [checkbox setTitle:base::SysUTF16ToNSString(gallery->display_name)]; |
+ [checkbox setToolTip: |
+ base::SysUTF16ToNSString(gallery->path.LossyDisplayName())]; |
+ [checkbox setState:permitted ? NSOnState : NSOffState]; |
+ |
+ [checkbox sizeToFit]; |
+ NSRect rect = [checkbox bounds]; |
+ rect.origin.y = y_pos; |
+ rect.size.width = std::min(NSWidth(rect), kCheckboxMaxWidth); |
+ [checkbox setFrame:rect]; |
+} |
+ |
+void MediaGalleriesDialogCocoa::UpdateCheckboxContainerFrame() { |
+ NSRect rect = NSMakeRect( |
+ 0, 0, kCheckboxMaxWidth, NSMaxY([[checkboxes_ lastObject] frame])); |
+ [checkbox_container_ setFrame:rect]; |
+} |
+ |
+void MediaGalleriesDialogCocoa::UpdateGallery( |
+ const MediaGalleryPrefInfo* gallery, |
+ bool permitted) { |
+ NSButton* checkbox = nil; |
+ NSString* device_id = base::SysUTF8ToNSString(gallery->device_id); |
+ |
+ for (NSButton* button in checkboxes_.get()) { |
+ if ([[[button cell] representedObject] isEqual:device_id]) { |
+ checkbox = button; |
+ break; |
+ } |
+ } |
+ |
+ UpdateGalleryCheckbox(checkbox, gallery, permitted); |
+ UpdateCheckboxContainerFrame(); |
+ [alert_ layout]; |
+} |
+ |
+void MediaGalleriesDialogCocoa::DeleteDelegate() { |
+ // As required by ConstrainedWindowMacDelegate, close the sheet if |
+ // it's still open. |
+ if (is_sheet_open()) |
+ [NSApp endSheet:sheet()]; |
+ |
+ controller_->DialogFinished(accepted_); |
+} |
+ |
+// static |
+MediaGalleriesDialog* MediaGalleriesDialog::Create( |
+ MediaGalleriesDialogController* controller) { |
+ scoped_nsobject<MediaGalleriesCocoaController> cocoa_controller( |
+ [[MediaGalleriesCocoaController alloc] init]); |
+ return new MediaGalleriesDialogCocoa(controller, cocoa_controller); |
+} |
+ |
+} // namespace chrome |