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 |