OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" | 5 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/strings/sys_string_conversions.h" | 10 #include "base/strings/sys_string_conversions.h" |
11 #include "chrome/browser/chooser_controller/chooser_controller.h" | 11 #include "chrome/browser/chooser_controller/chooser_controller.h" |
12 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h" | 12 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h" |
13 #include "chrome/browser/ui/cocoa/spinner_view.h" | |
13 #include "chrome/grit/generated_resources.h" | 14 #include "chrome/grit/generated_resources.h" |
14 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw eaker.h" | 15 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw eaker.h" |
15 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" | 16 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" |
16 #include "ui/base/l10n/l10n_util_mac.h" | 17 #include "ui/base/l10n/l10n_util_mac.h" |
17 | 18 |
18 namespace { | 19 namespace { |
19 | 20 |
20 // Chooser width. | 21 // Chooser width. |
21 const CGFloat kChooserWidth = 320.0f; | 22 const CGFloat kChooserWidth = 350.0f; |
22 | 23 |
23 // Chooser height. | 24 // Chooser height. |
24 const CGFloat kChooserHeight = 280.0f; | 25 const CGFloat kChooserHeight = 300.0f; |
26 | |
27 // Spinner size. | |
28 const CGFloat kSpinnerSize = 50.0f; | |
25 | 29 |
26 // Distance between the chooser border and the view that is closest to the | 30 // Distance between the chooser border and the view that is closest to the |
27 // border. | 31 // border. |
28 const CGFloat kMarginX = 20.0f; | 32 const CGFloat kMarginX = 20.0f; |
29 const CGFloat kMarginY = 20.0f; | 33 const CGFloat kMarginY = 20.0f; |
30 | 34 |
31 // Distance between two views inside the chooser. | 35 // Distance between two views inside the chooser. |
32 const CGFloat kHorizontalPadding = 10.0f; | 36 const CGFloat kHorizontalPadding = 10.0f; |
33 const CGFloat kVerticalPadding = 10.0f; | 37 const CGFloat kVerticalPadding = 10.0f; |
34 | 38 |
35 // Separator alpha value. | 39 // Separator alpha value. |
36 const CGFloat kSeparatorAlphaValue = 0.6f; | 40 const CGFloat kSeparatorAlphaValue = 0.6f; |
37 | 41 |
38 // Separator height. | 42 // Separator height. |
39 const CGFloat kSeparatorHeight = 1.0f; | 43 const CGFloat kSeparatorHeight = 1.0f; |
40 | 44 |
41 } // namespace | 45 } // namespace |
42 | 46 |
43 class TableViewController : public ChooserController::Observer { | 47 class ChooserContentViewController : public ChooserController::Observer { |
44 public: | 48 public: |
45 TableViewController(ChooserController* chooser_controller, | 49 ChooserContentViewController(ChooserController* chooser_controller, |
46 NSTableView* table_view); | 50 NSTableView* table_view, |
47 ~TableViewController() override; | 51 SpinnerView* spinner, |
52 NSTextField* status, | |
53 NSButton* rescan_button); | |
54 ~ChooserContentViewController() override; | |
48 | 55 |
49 // ChooserController::Observer: | 56 // ChooserController::Observer: |
50 void OnOptionsInitialized() override; | 57 void OnOptionsInitialized() override; |
51 void OnOptionAdded(size_t index) override; | 58 void OnOptionAdded(size_t index) override; |
52 void OnOptionRemoved(size_t index) override; | 59 void OnOptionRemoved(size_t index) override; |
53 void OnAdapterEnabledChanged(bool enabled) override; | 60 void OnAdapterEnabledChanged(bool enabled) override; |
54 void OnRefreshStateChanged(bool refreshing) override; | 61 void OnRefreshStateChanged(bool refreshing) override; |
55 | 62 |
56 void UpdateTableView(); | 63 void UpdateTableView(); |
57 | 64 |
58 private: | 65 private: |
59 ChooserController* chooser_controller_; | 66 ChooserController* chooser_controller_; |
60 NSTableView* table_view_; | 67 NSTableView* table_view_; |
68 SpinnerView* spinner_; | |
69 NSTextField* status_; | |
70 NSButton* rescan_button_; | |
61 | 71 |
62 DISALLOW_COPY_AND_ASSIGN(TableViewController); | 72 DISALLOW_COPY_AND_ASSIGN(ChooserContentViewController); |
63 }; | 73 }; |
64 | 74 |
65 TableViewController::TableViewController(ChooserController* chooser_controller, | 75 ChooserContentViewController::ChooserContentViewController( |
66 NSTableView* table_view) | 76 ChooserController* chooser_controller, |
67 : chooser_controller_(chooser_controller), table_view_(table_view) { | 77 NSTableView* table_view, |
78 SpinnerView* spinner, | |
79 NSTextField* status, | |
80 NSButton* rescan_button) | |
81 : chooser_controller_(chooser_controller), | |
82 table_view_(table_view), | |
83 spinner_(spinner), | |
84 status_(status), | |
85 rescan_button_(rescan_button) { | |
68 DCHECK(chooser_controller_); | 86 DCHECK(chooser_controller_); |
69 DCHECK(table_view_); | 87 DCHECK(table_view_); |
88 DCHECK(spinner_); | |
89 DCHECK(status_); | |
90 DCHECK(rescan_button_); | |
70 chooser_controller_->set_observer(this); | 91 chooser_controller_->set_observer(this); |
71 } | 92 } |
72 | 93 |
73 TableViewController::~TableViewController() { | 94 ChooserContentViewController::~ChooserContentViewController() { |
74 chooser_controller_->set_observer(nullptr); | 95 chooser_controller_->set_observer(nullptr); |
75 } | 96 } |
76 | 97 |
77 void TableViewController::OnOptionsInitialized() { | 98 void ChooserContentViewController::OnOptionsInitialized() { |
78 UpdateTableView(); | 99 UpdateTableView(); |
79 } | 100 } |
80 | 101 |
81 void TableViewController::OnOptionAdded(size_t index) { | 102 void ChooserContentViewController::OnOptionAdded(size_t index) { |
82 UpdateTableView(); | 103 UpdateTableView(); |
83 } | 104 } |
84 | 105 |
85 void TableViewController::OnOptionRemoved(size_t index) { | 106 void ChooserContentViewController::OnOptionRemoved(size_t index) { |
86 // |table_view_| will automatically select the removed item's next item. | 107 // |table_view_| will automatically select the removed item's next item. |
87 // So here it tracks if the removed item is the item that was currently | 108 // So here it tracks if the removed item is the item that was currently |
88 // selected, if so, deselect it. Also if the removed item is before the | 109 // selected, if so, deselect it. Also if the removed item is before the |
89 // currently selected item, the currently selected item's index needs to | 110 // currently selected item, the currently selected item's index needs to |
90 // be adjusted by one. | 111 // be adjusted by one. |
91 NSInteger idx = static_cast<NSInteger>(index); | 112 NSInteger idx = static_cast<NSInteger>(index); |
92 NSInteger selected_row = [table_view_ selectedRow]; | 113 NSInteger selected_row = [table_view_ selectedRow]; |
93 if (selected_row == idx) | 114 if (selected_row == idx) |
94 [table_view_ deselectRow:idx]; | 115 [table_view_ deselectRow:idx]; |
95 else if (selected_row > idx) | 116 else if (selected_row > idx) |
96 [table_view_ | 117 [table_view_ |
97 selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row - 1] | 118 selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row - 1] |
98 byExtendingSelection:NO]; | 119 byExtendingSelection:NO]; |
99 | 120 |
100 UpdateTableView(); | 121 UpdateTableView(); |
101 } | 122 } |
102 | 123 |
103 void TableViewController::OnAdapterEnabledChanged(bool enabled) {} | 124 void ChooserContentViewController::OnAdapterEnabledChanged(bool enabled) { |
125 // No row is selected since the adapter status has changed. | |
126 // This will also disable the OK button if it was enabled because | |
127 // of a previously selected row. | |
128 [table_view_ deselectAll:nil]; | |
129 UpdateTableView(); | |
130 [table_view_ setHidden:NO]; | |
104 | 131 |
105 void TableViewController::OnRefreshStateChanged(bool refreshing) {} | 132 [spinner_ setHidden:YES]; |
106 | 133 |
107 void TableViewController::UpdateTableView() { | 134 [status_ setHidden:YES]; |
135 // When adapter is enabled, show |rescan_button_|; otherwise hide it. | |
136 [rescan_button_ setHidden:enabled ? NO : YES]; | |
137 } | |
138 | |
139 void ChooserContentViewController::OnRefreshStateChanged(bool refreshing) { | |
Robert Sesek
2016/07/21 14:56:32
Should there be unit tests for these methods?
juncai
2016/07/21 22:08:14
Yes. It needs to modify MockChooserController, I a
| |
140 // No row is selected since the chooser is refreshing or just refreshed. | |
141 // This will also disable the OK button if it was enabled because | |
142 // of a previously selected row. | |
143 [table_view_ deselectAll:nil]; | |
144 UpdateTableView(); | |
145 // When refreshing, hide |table_view_|. When complete, show |table_view_|. | |
146 [table_view_ setHidden:refreshing ? YES : NO]; | |
147 | |
148 // When refreshing, show |spinner_|. When complete, hide |spinner_|. | |
149 [spinner_ setHidden:refreshing ? NO : YES]; | |
150 | |
151 // When refreshing, show |status_| and hide |rescan_button_|. | |
152 // When complete, show |rescan_button_| and hide |status_|. | |
153 [status_ setHidden:refreshing ? NO : YES]; | |
154 [rescan_button_ setHidden:refreshing ? YES : NO]; | |
155 } | |
156 | |
157 void ChooserContentViewController::UpdateTableView() { | |
108 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; | 158 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; |
109 [table_view_ reloadData]; | 159 [table_view_ reloadData]; |
110 } | 160 } |
111 | 161 |
112 @implementation ChooserContentViewCocoa | 162 @implementation ChooserContentViewCocoa |
113 | 163 |
114 - (instancetype)initWithChooserTitle:(NSString*)chooserTitle | 164 - (instancetype)initWithChooserTitle:(NSString*)chooserTitle |
115 chooserController: | 165 chooserController: |
116 (std::unique_ptr<ChooserController>)chooserController { | 166 (std::unique_ptr<ChooserController>)chooserController { |
117 // ------------------------------------ | 167 // ------------------------------------ |
(...skipping 17 matching lines...) Expand all Loading... | |
135 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight); | 185 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight); |
136 | 186 |
137 if ((self = [super initWithFrame:chooserFrame])) { | 187 if ((self = [super initWithFrame:chooserFrame])) { |
138 chooserController_ = std::move(chooserController); | 188 chooserController_ = std::move(chooserController); |
139 | 189 |
140 // Create the views. | 190 // Create the views. |
141 // Title. | 191 // Title. |
142 titleView_ = [self createChooserTitle:chooserTitle]; | 192 titleView_ = [self createChooserTitle:chooserTitle]; |
143 CGFloat titleHeight = NSHeight([titleView_ frame]); | 193 CGFloat titleHeight = NSHeight([titleView_ frame]); |
144 | 194 |
195 // Status. | |
196 status_ = [self createTextField:l10n_util::GetNSString( | |
197 IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING)]; | |
198 | |
199 // Re-scan button. | |
200 rescanButton_ = | |
201 [self createHyperlinkButtonWithText: | |
202 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN)]; | |
203 | |
145 // Connect button. | 204 // Connect button. |
146 connectButton_ = [self createConnectButton]; | 205 connectButton_ = [self createConnectButton]; |
147 CGFloat connectButtonWidth = NSWidth([connectButton_ frame]); | 206 CGFloat connectButtonWidth = NSWidth([connectButton_ frame]); |
148 CGFloat connectButtonHeight = NSHeight([connectButton_ frame]); | 207 CGFloat connectButtonHeight = NSHeight([connectButton_ frame]); |
149 | 208 |
150 // Cancel button. | 209 // Cancel button. |
151 cancelButton_ = [self createCancelButton]; | 210 cancelButton_ = [self createCancelButton]; |
152 CGFloat cancelButtonWidth = NSWidth([cancelButton_ frame]); | 211 CGFloat cancelButtonWidth = NSWidth([cancelButton_ frame]); |
153 | 212 |
154 // Separator. | 213 // Separator. |
155 separator_ = [self createSeparator]; | 214 separator_ = [self createSeparator]; |
156 | 215 |
157 // Message. | 216 // Message. |
158 message_ = [self createMessage]; | 217 message_ = [self createTextField:l10n_util::GetNSStringF( |
218 IDS_DEVICE_CHOOSER_FOOTNOTE_TEXT, | |
219 base::string16())]; | |
159 CGFloat messageWidth = NSWidth([message_ frame]); | 220 CGFloat messageWidth = NSWidth([message_ frame]); |
160 CGFloat messageHeight = NSHeight([message_ frame]); | 221 CGFloat messageHeight = NSHeight([message_ frame]); |
161 | 222 |
162 // Help button. | 223 // Help button. |
163 helpButton_ = [self createHelpButton]; | 224 helpButton_ = [self |
225 createHyperlinkButtonWithText: | |
226 l10n_util::GetNSString(IDS_DEVICE_CHOOSER_GET_HELP_LINK_TEXT)]; | |
164 | 227 |
165 // ScollView embedding with TableView. | 228 // ScollView embedding with TableView. |
166 CGFloat scrollViewWidth = kChooserWidth - 2 * kMarginX; | 229 CGFloat scrollViewWidth = kChooserWidth - 2 * kMarginX; |
167 CGFloat scrollViewHeight = kChooserHeight - 2 * kMarginY - | 230 CGFloat scrollViewHeight = kChooserHeight - 2 * kMarginY - |
168 4 * kVerticalPadding - titleHeight - | 231 4 * kVerticalPadding - titleHeight - |
169 connectButtonHeight - messageHeight; | 232 connectButtonHeight - messageHeight; |
170 NSRect scrollFrame = NSMakeRect( | 233 CGFloat scrollViewOriginX = kMarginX; |
171 kMarginX, | 234 CGFloat scrollViewOriginY = |
172 kMarginY + messageHeight + 3 * kVerticalPadding + connectButtonHeight, | 235 kMarginY + messageHeight + 3 * kVerticalPadding + connectButtonHeight; |
173 scrollViewWidth, scrollViewHeight); | 236 NSRect scrollFrame = NSMakeRect(scrollViewOriginX, scrollViewOriginY, |
237 scrollViewWidth, scrollViewHeight); | |
174 scrollView_.reset([[NSScrollView alloc] initWithFrame:scrollFrame]); | 238 scrollView_.reset([[NSScrollView alloc] initWithFrame:scrollFrame]); |
175 [scrollView_ setBorderType:NSBezelBorder]; | 239 [scrollView_ setBorderType:NSBezelBorder]; |
176 [scrollView_ setHasVerticalScroller:YES]; | 240 [scrollView_ setHasVerticalScroller:YES]; |
177 [scrollView_ setHasHorizontalScroller:YES]; | 241 [scrollView_ setHasHorizontalScroller:YES]; |
178 [scrollView_ setAutohidesScrollers:YES]; | 242 [scrollView_ setAutohidesScrollers:YES]; |
179 | 243 |
180 // TableView. | 244 // TableView. |
181 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]); | 245 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]); |
182 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]); | 246 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]); |
183 [tableColumn_ setWidth:(scrollViewWidth - kMarginX)]; | 247 [tableColumn_ setWidth:(scrollViewWidth - kMarginX)]; |
184 [tableView_ addTableColumn:tableColumn_]; | 248 [tableView_ addTableColumn:tableColumn_]; |
185 // Make the column title invisible. | 249 // Make the column title invisible. |
186 [tableView_ setHeaderView:nil]; | 250 [tableView_ setHeaderView:nil]; |
187 [tableView_ setFocusRingType:NSFocusRingTypeNone]; | 251 [tableView_ setFocusRingType:NSFocusRingTypeNone]; |
188 | 252 |
253 // Spinner. | |
254 // Set the spinner in the center of the scroll view. | |
255 CGFloat spinnerOriginX = | |
256 scrollViewOriginX + (scrollViewWidth - kSpinnerSize) / 2; | |
257 CGFloat spinnerOriginY = | |
258 scrollViewOriginY + (scrollViewHeight - kSpinnerSize) / 2; | |
259 spinner_.reset([[SpinnerView alloc] | |
260 initWithFrame:NSMakeRect(spinnerOriginX, spinnerOriginY, kSpinnerSize, | |
261 kSpinnerSize)]); | |
262 | |
189 // Lay out the views. | 263 // Lay out the views. |
190 // Title. | 264 // Title. |
191 CGFloat titleOriginX = kMarginX; | 265 CGFloat titleOriginX = kMarginX; |
192 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight; | 266 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight; |
193 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; | 267 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; |
194 [self addSubview:titleView_]; | 268 [self addSubview:titleView_]; |
195 | 269 |
196 // ScollView. | 270 // ScollView and Spinner. Only one of them is shown. |
197 [scrollView_ setDocumentView:tableView_]; | 271 [scrollView_ setDocumentView:tableView_]; |
198 [self addSubview:scrollView_]; | 272 [self addSubview:scrollView_]; |
273 [spinner_ setHidden:YES]; | |
274 [self addSubview:spinner_]; | |
275 | |
276 // Status text field and Re-scan button. Only one of them is shown. | |
277 CGFloat statusOriginX = kMarginX; | |
278 CGFloat statusOriginY = kMarginY + messageHeight + 2 * kVerticalPadding; | |
279 [status_ setFrameOrigin:NSMakePoint(statusOriginX, statusOriginY)]; | |
280 [self addSubview:status_]; | |
281 [status_ setHidden:YES]; | |
282 [rescanButton_ setFrameOrigin:NSMakePoint(statusOriginX, statusOriginY)]; | |
283 [rescanButton_ setTarget:self]; | |
284 [rescanButton_ setAction:@selector(onRescan:)]; | |
285 [self addSubview:rescanButton_]; | |
286 [rescanButton_ setHidden:YES]; | |
199 | 287 |
200 // Connect button. | 288 // Connect button. |
201 CGFloat connectButtonOriginX = kChooserWidth - kMarginX - | 289 CGFloat connectButtonOriginX = kChooserWidth - kMarginX - |
202 kHorizontalPadding - connectButtonWidth - | 290 kHorizontalPadding - connectButtonWidth - |
203 cancelButtonWidth; | 291 cancelButtonWidth; |
204 CGFloat connectButtonOriginY = | 292 CGFloat connectButtonOriginY = statusOriginY; |
205 kMarginY + messageHeight + 2 * kVerticalPadding; | |
206 [connectButton_ | 293 [connectButton_ |
207 setFrameOrigin:NSMakePoint(connectButtonOriginX, connectButtonOriginY)]; | 294 setFrameOrigin:NSMakePoint(connectButtonOriginX, connectButtonOriginY)]; |
208 [connectButton_ setEnabled:NO]; | 295 [connectButton_ setEnabled:NO]; |
209 [self addSubview:connectButton_]; | 296 [self addSubview:connectButton_]; |
210 | 297 |
211 // Cancel button. | 298 // Cancel button. |
212 CGFloat cancelButtonOriginX = kChooserWidth - kMarginX - cancelButtonWidth; | 299 CGFloat cancelButtonOriginX = kChooserWidth - kMarginX - cancelButtonWidth; |
213 CGFloat cancelButtonOriginY = connectButtonOriginY; | 300 CGFloat cancelButtonOriginY = connectButtonOriginY; |
214 [cancelButton_ | 301 [cancelButton_ |
215 setFrameOrigin:NSMakePoint(cancelButtonOriginX, cancelButtonOriginY)]; | 302 setFrameOrigin:NSMakePoint(cancelButtonOriginX, cancelButtonOriginY)]; |
(...skipping 14 matching lines...) Expand all Loading... | |
230 // Help button. | 317 // Help button. |
231 CGFloat helpButtonOriginX = | 318 CGFloat helpButtonOriginX = |
232 kMarginX + messageWidth - kHorizontalPadding / 2; | 319 kMarginX + messageWidth - kHorizontalPadding / 2; |
233 CGFloat helpButtonOriginY = kMarginY; | 320 CGFloat helpButtonOriginY = kMarginY; |
234 [helpButton_ | 321 [helpButton_ |
235 setFrameOrigin:NSMakePoint(helpButtonOriginX, helpButtonOriginY)]; | 322 setFrameOrigin:NSMakePoint(helpButtonOriginX, helpButtonOriginY)]; |
236 [helpButton_ setTarget:self]; | 323 [helpButton_ setTarget:self]; |
237 [helpButton_ setAction:@selector(onHelpPressed:)]; | 324 [helpButton_ setAction:@selector(onHelpPressed:)]; |
238 [self addSubview:helpButton_]; | 325 [self addSubview:helpButton_]; |
239 | 326 |
240 tableViewController_.reset( | 327 chooserContentViewController_.reset(new ChooserContentViewController( |
241 new TableViewController(chooserController_.get(), tableView_.get())); | 328 chooserController_.get(), tableView_.get(), spinner_.get(), |
329 status_.get(), rescanButton_.get())); | |
242 } | 330 } |
243 | 331 |
244 return self; | 332 return self; |
245 } | 333 } |
246 | 334 |
247 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { | 335 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { |
248 base::scoped_nsobject<NSTextField> titleView( | 336 base::scoped_nsobject<NSTextField> titleView( |
249 [[NSTextField alloc] initWithFrame:NSZeroRect]); | 337 [[NSTextField alloc] initWithFrame:NSZeroRect]); |
250 [titleView setDrawsBackground:NO]; | 338 [titleView setDrawsBackground:NO]; |
251 [titleView setBezeled:NO]; | 339 [titleView setBezeled:NO]; |
(...skipping 30 matching lines...) Expand all Loading... | |
282 | 370 |
283 - (base::scoped_nsobject<NSBox>)createSeparator { | 371 - (base::scoped_nsobject<NSBox>)createSeparator { |
284 base::scoped_nsobject<NSBox> spacer([[NSBox alloc] initWithFrame:NSZeroRect]); | 372 base::scoped_nsobject<NSBox> spacer([[NSBox alloc] initWithFrame:NSZeroRect]); |
285 [spacer setBoxType:NSBoxSeparator]; | 373 [spacer setBoxType:NSBoxSeparator]; |
286 [spacer setBorderType:NSLineBorder]; | 374 [spacer setBorderType:NSLineBorder]; |
287 [spacer setAlphaValue:kSeparatorAlphaValue]; | 375 [spacer setAlphaValue:kSeparatorAlphaValue]; |
288 [spacer setFrameSize:NSMakeSize(kChooserWidth, kSeparatorHeight)]; | 376 [spacer setFrameSize:NSMakeSize(kChooserWidth, kSeparatorHeight)]; |
289 return spacer; | 377 return spacer; |
290 } | 378 } |
291 | 379 |
292 - (base::scoped_nsobject<NSTextField>)createMessage { | 380 - (base::scoped_nsobject<NSTextField>)createTextField:(NSString*)text { |
293 base::scoped_nsobject<NSTextField> messageView( | 381 base::scoped_nsobject<NSTextField> textField( |
294 [[NSTextField alloc] initWithFrame:NSZeroRect]); | 382 [[NSTextField alloc] initWithFrame:NSZeroRect]); |
295 [messageView setDrawsBackground:NO]; | 383 [textField setDrawsBackground:NO]; |
296 [messageView setBezeled:NO]; | 384 [textField setBezeled:NO]; |
297 [messageView setEditable:NO]; | 385 [textField setEditable:NO]; |
298 [messageView setSelectable:NO]; | 386 [textField setSelectable:NO]; |
299 [messageView | 387 [textField setStringValue:text]; |
300 setStringValue:l10n_util::GetNSStringF(IDS_DEVICE_CHOOSER_FOOTNOTE_TEXT, | 388 [textField setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; |
301 base::string16())]; | 389 [textField sizeToFit]; |
302 [messageView setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; | 390 return textField; |
303 [messageView sizeToFit]; | |
304 return messageView; | |
305 } | 391 } |
306 | 392 |
307 - (base::scoped_nsobject<NSButton>)createHelpButton { | 393 - (base::scoped_nsobject<NSButton>)createHyperlinkButtonWithText: |
394 (NSString*)text { | |
308 base::scoped_nsobject<NSButton> button( | 395 base::scoped_nsobject<NSButton> button( |
309 [[NSButton alloc] initWithFrame:NSZeroRect]); | 396 [[NSButton alloc] initWithFrame:NSZeroRect]); |
310 base::scoped_nsobject<HyperlinkButtonCell> cell([[HyperlinkButtonCell alloc] | 397 base::scoped_nsobject<HyperlinkButtonCell> cell( |
311 initTextCell:l10n_util::GetNSString( | 398 [[HyperlinkButtonCell alloc] initTextCell:text]); |
312 IDS_DEVICE_CHOOSER_GET_HELP_LINK_TEXT)]); | |
313 [button setCell:cell.get()]; | 399 [button setCell:cell.get()]; |
314 [button sizeToFit]; | 400 [button sizeToFit]; |
315 return button; | 401 return button; |
316 } | 402 } |
317 | 403 |
318 - (NSTableView*)tableView { | 404 - (NSTableView*)tableView { |
319 return tableView_.get(); | 405 return tableView_.get(); |
320 } | 406 } |
321 | 407 |
322 - (NSButton*)connectButton { | 408 - (NSButton*)connectButton { |
(...skipping 13 matching lines...) Expand all Loading... | |
336 // no devices, so the number of rows is always at least 1. | 422 // no devices, so the number of rows is always at least 1. |
337 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), | 423 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), |
338 static_cast<NSInteger>(1)); | 424 static_cast<NSInteger>(1)); |
339 } | 425 } |
340 | 426 |
341 - (NSString*)optionAtIndex:(NSInteger)index { | 427 - (NSString*)optionAtIndex:(NSInteger)index { |
342 NSInteger numOptions = | 428 NSInteger numOptions = |
343 static_cast<NSInteger>(chooserController_->NumOptions()); | 429 static_cast<NSInteger>(chooserController_->NumOptions()); |
344 if (numOptions == 0) { | 430 if (numOptions == 0) { |
345 DCHECK_EQ(0, index); | 431 DCHECK_EQ(0, index); |
346 return l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT); | 432 return base::SysUTF16ToNSString(chooserController_->GetNoOptionsText()); |
347 } | 433 } |
348 | 434 |
349 DCHECK_GE(index, 0); | 435 DCHECK_GE(index, 0); |
350 DCHECK_LT(index, numOptions); | 436 DCHECK_LT(index, numOptions); |
351 | 437 |
352 return base::SysUTF16ToNSString( | 438 return base::SysUTF16ToNSString( |
353 chooserController_->GetOption(static_cast<size_t>(index))); | 439 chooserController_->GetOption(static_cast<size_t>(index))); |
354 } | 440 } |
355 | 441 |
356 - (void)updateTableView { | 442 - (void)updateTableView { |
357 tableViewController_->UpdateTableView(); | 443 chooserContentViewController_->UpdateTableView(); |
358 } | 444 } |
359 | 445 |
360 - (void)accept { | 446 - (void)accept { |
361 chooserController_->Select([tableView_ selectedRow]); | 447 chooserController_->Select([tableView_ selectedRow]); |
362 } | 448 } |
363 | 449 |
364 - (void)cancel { | 450 - (void)cancel { |
365 chooserController_->Cancel(); | 451 chooserController_->Cancel(); |
366 } | 452 } |
367 | 453 |
368 - (void)close { | 454 - (void)close { |
369 chooserController_->Close(); | 455 chooserController_->Close(); |
370 } | 456 } |
371 | 457 |
458 - (void)onRescan:(id)sender { | |
459 chooserController_->RefreshOptions(); | |
460 } | |
461 | |
372 - (void)onHelpPressed:(id)sender { | 462 - (void)onHelpPressed:(id)sender { |
373 chooserController_->OpenHelpCenterUrl(); | 463 chooserController_->OpenHelpCenterUrl(); |
374 } | 464 } |
375 | 465 |
376 @end | 466 @end |
OLD | NEW |