| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/ui/cocoa/extensions/media_galleries_scan_result_dialog_
cocoa.h" | |
| 6 | |
| 7 #include "base/mac/foundation_util.h" | |
| 8 #include "base/mac/scoped_nsobject.h" | |
| 9 #include "base/strings/sys_string_conversions.h" | |
| 10 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_alert.h" | |
| 11 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_control_u
tils.h" | |
| 12 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_sh
eet.h" | |
| 13 #import "chrome/browser/ui/cocoa/key_equivalent_constants.h" | |
| 14 #include "content/public/browser/web_contents.h" | |
| 15 #include "grit/generated_resources.h" | |
| 16 #import "ui/base/cocoa/flipped_view.h" | |
| 17 #import "ui/base/models/menu_model.h" | |
| 18 #include "ui/base/l10n/l10n_util.h" | |
| 19 | |
| 20 const CGFloat kCheckboxLeading = 10; | |
| 21 const CGFloat kCheckboxWidth = 440; | |
| 22 const CGFloat kScrollAreaHeight = 220; | |
| 23 | |
| 24 // Controller for UI events on items in the media galleries dialog. | |
| 25 @interface MediaGalleriesScanResultCocoaController : NSObject { | |
| 26 @private | |
| 27 MediaGalleriesScanResultDialogCocoa* dialog_; | |
| 28 } | |
| 29 | |
| 30 @property(assign, nonatomic) MediaGalleriesScanResultDialogCocoa* dialog; | |
| 31 | |
| 32 - (void)onAcceptButton:(id)sender; | |
| 33 - (void)onCancelButton:(id)sender; | |
| 34 | |
| 35 @end | |
| 36 | |
| 37 @implementation MediaGalleriesScanResultCocoaController | |
| 38 | |
| 39 @synthesize dialog = dialog_; | |
| 40 | |
| 41 - (void)onAcceptButton:(id)sender { | |
| 42 dialog_->OnAcceptClicked(); | |
| 43 } | |
| 44 | |
| 45 - (void)onCancelButton:(id)sender { | |
| 46 dialog_->OnCancelClicked(); | |
| 47 } | |
| 48 | |
| 49 @end | |
| 50 | |
| 51 | |
| 52 MediaGalleriesScanResultDialogCocoa::MediaGalleriesScanResultDialogCocoa( | |
| 53 MediaGalleriesScanResultDialogController* controller, | |
| 54 MediaGalleriesScanResultCocoaController* cocoa_controller) | |
| 55 : controller_(controller), | |
| 56 accepted_(false), | |
| 57 cocoa_controller_([cocoa_controller retain]) { | |
| 58 [cocoa_controller_ setDialog:this]; | |
| 59 | |
| 60 alert_.reset([[ConstrainedWindowAlert alloc] init]); | |
| 61 | |
| 62 [alert_ setMessageText:base::SysUTF16ToNSString(controller_->GetHeader())]; | |
| 63 [alert_ setInformativeText: | |
| 64 base::SysUTF16ToNSString(controller_->GetSubtext())]; | |
| 65 [alert_ addButtonWithTitle: | |
| 66 l10n_util::GetNSString(IDS_MEDIA_GALLERIES_SCAN_RESULT_DIALOG_CONFIRM) | |
| 67 keyEquivalent:kKeyEquivalentReturn | |
| 68 target:cocoa_controller_ | |
| 69 action:@selector(onAcceptButton:)]; | |
| 70 [alert_ addButtonWithTitle: | |
| 71 l10n_util::GetNSString(IDS_MEDIA_GALLERIES_DIALOG_CANCEL) | |
| 72 keyEquivalent:kKeyEquivalentEscape | |
| 73 target:cocoa_controller_ | |
| 74 action:@selector(onCancelButton:)]; | |
| 75 [[alert_ closeButton] setTarget:cocoa_controller_]; | |
| 76 [[alert_ closeButton] setAction:@selector(onCancelButton:)]; | |
| 77 | |
| 78 InitDialogControls(); | |
| 79 | |
| 80 // May be NULL during tests. | |
| 81 if (controller->web_contents()) { | |
| 82 base::scoped_nsobject<CustomConstrainedWindowSheet> sheet( | |
| 83 [[CustomConstrainedWindowSheet alloc] | |
| 84 initWithCustomWindow:[alert_ window]]); | |
| 85 window_.reset(new ConstrainedWindowMac( | |
| 86 this, controller->web_contents(), sheet)); | |
| 87 } | |
| 88 } | |
| 89 | |
| 90 MediaGalleriesScanResultDialogCocoa::~MediaGalleriesScanResultDialogCocoa() { | |
| 91 } | |
| 92 | |
| 93 void MediaGalleriesScanResultDialogCocoa::InitDialogControls() { | |
| 94 main_container_.reset([[NSBox alloc] init]); | |
| 95 [main_container_ setBoxType:NSBoxCustom]; | |
| 96 [main_container_ setBorderType:NSLineBorder]; | |
| 97 [main_container_ setBorderWidth:1]; | |
| 98 [main_container_ setCornerRadius:0]; | |
| 99 [main_container_ setContentViewMargins:NSZeroSize]; | |
| 100 [main_container_ setTitlePosition:NSNoTitle]; | |
| 101 [main_container_ setBorderColor:[NSColor disabledControlTextColor]]; | |
| 102 | |
| 103 base::scoped_nsobject<NSScrollView> scroll_view( | |
| 104 [[NSScrollView alloc] initWithFrame: | |
| 105 NSMakeRect(0, 0, kCheckboxWidth, kScrollAreaHeight)]); | |
| 106 [scroll_view setHasVerticalScroller:YES]; | |
| 107 [scroll_view setHasHorizontalScroller:NO]; | |
| 108 [scroll_view setBorderType:NSNoBorder]; | |
| 109 [scroll_view setAutohidesScrollers:YES]; | |
| 110 [[main_container_ contentView] addSubview:scroll_view]; | |
| 111 | |
| 112 // Add scan results checkboxes inside the scrolling view. | |
| 113 checkbox_container_.reset([[FlippedView alloc] initWithFrame:NSZeroRect]); | |
| 114 CGFloat height = CreateCheckboxes(); | |
| 115 // Give the container a reasonable initial size so that the scroll_view can | |
| 116 // figure out the content size. | |
| 117 [checkbox_container_ setFrameSize:NSMakeSize(kCheckboxWidth, height)]; | |
| 118 [scroll_view setDocumentView:checkbox_container_]; | |
| 119 [checkbox_container_ setFrameSize:NSMakeSize([scroll_view contentSize].width, | |
| 120 height)]; | |
| 121 | |
| 122 // Resize to pack the scroll view if possible. | |
| 123 NSRect scroll_frame = [scroll_view frame]; | |
| 124 if (NSHeight(scroll_frame) > NSHeight([checkbox_container_ frame])) { | |
| 125 scroll_frame.size.height = NSHeight([checkbox_container_ frame]); | |
| 126 [scroll_view setFrameSize:scroll_frame.size]; | |
| 127 } | |
| 128 | |
| 129 [main_container_ setFrameFromContentFrame:scroll_frame]; | |
| 130 [main_container_ setFrameOrigin:NSZeroPoint]; | |
| 131 [alert_ setAccessoryView:main_container_]; | |
| 132 [alert_ layout]; | |
| 133 } | |
| 134 | |
| 135 void MediaGalleriesScanResultDialogCocoa::AcceptDialogForTesting() { | |
| 136 OnAcceptClicked(); | |
| 137 } | |
| 138 | |
| 139 CGFloat MediaGalleriesScanResultDialogCocoa::CreateCheckboxes() { | |
| 140 CGFloat y_pos = 0; | |
| 141 MediaGalleriesScanResultDialogController::OrderedScanResults scan_results = | |
| 142 controller_->GetGalleryList(); | |
| 143 for (MediaGalleriesScanResultDialogController::OrderedScanResults:: | |
| 144 const_iterator iter = scan_results.begin(); | |
| 145 iter != scan_results.end(); iter++) { | |
| 146 const MediaGalleriesScanResultDialogController::ScanResult& scan_result = | |
| 147 *iter; | |
| 148 base::scoped_nsobject<MediaGalleryListEntry> checkbox_entry( | |
| 149 [[MediaGalleryListEntry alloc] | |
| 150 initWithFrame:NSZeroRect | |
| 151 controller:this | |
| 152 prefId:scan_result.pref_info.pref_id | |
| 153 galleryName:scan_result.pref_info.GetGalleryDisplayName() | |
| 154 subscript:scan_result.pref_info.GetGalleryAdditionalDetails() | |
| 155 tooltip:scan_result.pref_info.GetGalleryTooltip() | |
| 156 showFolderViewer:scan_result.pref_info.IsGalleryAvailable()]); | |
| 157 | |
| 158 [checkbox_entry setState:scan_result.selected]; | |
| 159 | |
| 160 [checkbox_entry setFrameOrigin:NSMakePoint(0, y_pos)]; | |
| 161 y_pos = NSMaxY([checkbox_entry frame]) + kCheckboxLeading; | |
| 162 | |
| 163 [checkbox_container_ addSubview:checkbox_entry]; | |
| 164 } | |
| 165 | |
| 166 return y_pos; | |
| 167 } | |
| 168 | |
| 169 void MediaGalleriesScanResultDialogCocoa::OnAcceptClicked() { | |
| 170 accepted_ = true; | |
| 171 | |
| 172 if (window_) | |
| 173 window_->CloseWebContentsModalDialog(); | |
| 174 } | |
| 175 | |
| 176 void MediaGalleriesScanResultDialogCocoa::OnCancelClicked() { | |
| 177 if (window_) | |
| 178 window_->CloseWebContentsModalDialog(); | |
| 179 } | |
| 180 | |
| 181 void MediaGalleriesScanResultDialogCocoa::UpdateResults() { | |
| 182 InitDialogControls(); | |
| 183 } | |
| 184 | |
| 185 void MediaGalleriesScanResultDialogCocoa::OnConstrainedWindowClosed( | |
| 186 ConstrainedWindowMac* window) { | |
| 187 controller_->DialogFinished(accepted_); | |
| 188 } | |
| 189 | |
| 190 void MediaGalleriesScanResultDialogCocoa::OnCheckboxToggled( | |
| 191 MediaGalleryPrefId prefId, bool checked) { | |
| 192 controller_->DidToggleGalleryId(prefId, checked); | |
| 193 } | |
| 194 | |
| 195 void MediaGalleriesScanResultDialogCocoa::OnFolderViewerClicked( | |
| 196 MediaGalleryPrefId prefId) { | |
| 197 controller_->DidClickOpenFolderViewer(prefId); | |
| 198 } | |
| 199 | |
| 200 ui::MenuModel* MediaGalleriesScanResultDialogCocoa::GetContextMenu( | |
| 201 MediaGalleryPrefId pref_id) { | |
| 202 return controller_->GetContextMenu(pref_id); | |
| 203 } | |
| 204 | |
| 205 // static | |
| 206 MediaGalleriesScanResultDialog* MediaGalleriesScanResultDialog::Create( | |
| 207 MediaGalleriesScanResultDialogController* controller) { | |
| 208 base::scoped_nsobject<MediaGalleriesScanResultCocoaController> | |
| 209 cocoa_controller([[MediaGalleriesScanResultCocoaController alloc] init]); | |
| 210 return new MediaGalleriesScanResultDialogCocoa(controller, cocoa_controller); | |
| 211 } | |
| OLD | NEW |