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 = 24.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::View { | 47 class ChooserContentViewController : public ChooserController::View { |
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::View: | 56 // ChooserController::View: |
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_view(this); | 91 chooser_controller_->set_view(this); |
71 } | 92 } |
72 | 93 |
73 TableViewController::~TableViewController() { | 94 ChooserContentViewController::~ChooserContentViewController() { |
74 chooser_controller_->set_view(nullptr); | 95 chooser_controller_->set_view(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) { |
| 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 // Bottom-align with the text on the buttons. |
| 279 CGFloat statusOriginY = kMarginY + messageHeight + 2 * kVerticalPadding + |
| 280 (connectButtonHeight - [NSFont systemFontSize]) / 2; |
| 281 [status_ setFrameOrigin:NSMakePoint(statusOriginX, statusOriginY)]; |
| 282 [self addSubview:status_]; |
| 283 [status_ setHidden:YES]; |
| 284 [rescanButton_ setFrameOrigin:NSMakePoint(statusOriginX, statusOriginY)]; |
| 285 [rescanButton_ setTarget:self]; |
| 286 [rescanButton_ setAction:@selector(onRescan:)]; |
| 287 [self addSubview:rescanButton_]; |
| 288 [rescanButton_ setHidden:YES]; |
199 | 289 |
200 // Connect button. | 290 // Connect button. |
201 CGFloat connectButtonOriginX = kChooserWidth - kMarginX - | 291 CGFloat connectButtonOriginX = kChooserWidth - kMarginX - |
202 kHorizontalPadding - connectButtonWidth - | 292 kHorizontalPadding - connectButtonWidth - |
203 cancelButtonWidth; | 293 cancelButtonWidth; |
204 CGFloat connectButtonOriginY = | 294 CGFloat connectButtonOriginY = |
205 kMarginY + messageHeight + 2 * kVerticalPadding; | 295 kMarginY + messageHeight + 2 * kVerticalPadding; |
206 [connectButton_ | 296 [connectButton_ |
207 setFrameOrigin:NSMakePoint(connectButtonOriginX, connectButtonOriginY)]; | 297 setFrameOrigin:NSMakePoint(connectButtonOriginX, connectButtonOriginY)]; |
208 [connectButton_ setEnabled:NO]; | 298 [connectButton_ setEnabled:NO]; |
(...skipping 21 matching lines...) Expand all Loading... |
230 // Help button. | 320 // Help button. |
231 CGFloat helpButtonOriginX = | 321 CGFloat helpButtonOriginX = |
232 kMarginX + messageWidth - kHorizontalPadding / 2; | 322 kMarginX + messageWidth - kHorizontalPadding / 2; |
233 CGFloat helpButtonOriginY = kMarginY; | 323 CGFloat helpButtonOriginY = kMarginY; |
234 [helpButton_ | 324 [helpButton_ |
235 setFrameOrigin:NSMakePoint(helpButtonOriginX, helpButtonOriginY)]; | 325 setFrameOrigin:NSMakePoint(helpButtonOriginX, helpButtonOriginY)]; |
236 [helpButton_ setTarget:self]; | 326 [helpButton_ setTarget:self]; |
237 [helpButton_ setAction:@selector(onHelpPressed:)]; | 327 [helpButton_ setAction:@selector(onHelpPressed:)]; |
238 [self addSubview:helpButton_]; | 328 [self addSubview:helpButton_]; |
239 | 329 |
240 tableViewController_.reset( | 330 chooserContentViewController_.reset(new ChooserContentViewController( |
241 new TableViewController(chooserController_.get(), tableView_.get())); | 331 chooserController_.get(), tableView_.get(), spinner_.get(), |
| 332 status_.get(), rescanButton_.get())); |
242 } | 333 } |
243 | 334 |
244 return self; | 335 return self; |
245 } | 336 } |
246 | 337 |
247 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { | 338 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { |
248 base::scoped_nsobject<NSTextField> titleView( | 339 base::scoped_nsobject<NSTextField> titleView( |
249 [[NSTextField alloc] initWithFrame:NSZeroRect]); | 340 [[NSTextField alloc] initWithFrame:NSZeroRect]); |
250 [titleView setDrawsBackground:NO]; | 341 [titleView setDrawsBackground:NO]; |
251 [titleView setBezeled:NO]; | 342 [titleView setBezeled:NO]; |
(...skipping 30 matching lines...) Expand all Loading... |
282 | 373 |
283 - (base::scoped_nsobject<NSBox>)createSeparator { | 374 - (base::scoped_nsobject<NSBox>)createSeparator { |
284 base::scoped_nsobject<NSBox> spacer([[NSBox alloc] initWithFrame:NSZeroRect]); | 375 base::scoped_nsobject<NSBox> spacer([[NSBox alloc] initWithFrame:NSZeroRect]); |
285 [spacer setBoxType:NSBoxSeparator]; | 376 [spacer setBoxType:NSBoxSeparator]; |
286 [spacer setBorderType:NSLineBorder]; | 377 [spacer setBorderType:NSLineBorder]; |
287 [spacer setAlphaValue:kSeparatorAlphaValue]; | 378 [spacer setAlphaValue:kSeparatorAlphaValue]; |
288 [spacer setFrameSize:NSMakeSize(kChooserWidth, kSeparatorHeight)]; | 379 [spacer setFrameSize:NSMakeSize(kChooserWidth, kSeparatorHeight)]; |
289 return spacer; | 380 return spacer; |
290 } | 381 } |
291 | 382 |
292 - (base::scoped_nsobject<NSTextField>)createMessage { | 383 - (base::scoped_nsobject<NSTextField>)createTextField:(NSString*)text { |
293 base::scoped_nsobject<NSTextField> messageView( | 384 base::scoped_nsobject<NSTextField> textField( |
294 [[NSTextField alloc] initWithFrame:NSZeroRect]); | 385 [[NSTextField alloc] initWithFrame:NSZeroRect]); |
295 [messageView setDrawsBackground:NO]; | 386 [textField setDrawsBackground:NO]; |
296 [messageView setBezeled:NO]; | 387 [textField setBezeled:NO]; |
297 [messageView setEditable:NO]; | 388 [textField setEditable:NO]; |
298 [messageView setSelectable:NO]; | 389 [textField setSelectable:NO]; |
299 [messageView | 390 [textField setStringValue:text]; |
300 setStringValue:l10n_util::GetNSStringF(IDS_DEVICE_CHOOSER_FOOTNOTE_TEXT, | 391 [textField setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; |
301 base::string16())]; | 392 [textField sizeToFit]; |
302 [messageView setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; | 393 return textField; |
303 [messageView sizeToFit]; | |
304 return messageView; | |
305 } | 394 } |
306 | 395 |
307 - (base::scoped_nsobject<NSButton>)createHelpButton { | 396 - (base::scoped_nsobject<NSButton>)createHyperlinkButtonWithText: |
| 397 (NSString*)text { |
308 base::scoped_nsobject<NSButton> button( | 398 base::scoped_nsobject<NSButton> button( |
309 [[NSButton alloc] initWithFrame:NSZeroRect]); | 399 [[NSButton alloc] initWithFrame:NSZeroRect]); |
310 base::scoped_nsobject<HyperlinkButtonCell> cell([[HyperlinkButtonCell alloc] | 400 base::scoped_nsobject<HyperlinkButtonCell> cell( |
311 initTextCell:l10n_util::GetNSString( | 401 [[HyperlinkButtonCell alloc] initTextCell:text]); |
312 IDS_DEVICE_CHOOSER_GET_HELP_LINK_TEXT)]); | |
313 [button setCell:cell.get()]; | 402 [button setCell:cell.get()]; |
314 [button sizeToFit]; | 403 [button sizeToFit]; |
315 return button; | 404 return button; |
316 } | 405 } |
317 | 406 |
318 - (NSTableView*)tableView { | 407 - (NSTableView*)tableView { |
319 return tableView_.get(); | 408 return tableView_.get(); |
320 } | 409 } |
321 | 410 |
322 - (NSButton*)connectButton { | 411 - (NSButton*)connectButton { |
(...skipping 13 matching lines...) Expand all Loading... |
336 // no devices, so the number of rows is always at least 1. | 425 // no devices, so the number of rows is always at least 1. |
337 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), | 426 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), |
338 static_cast<NSInteger>(1)); | 427 static_cast<NSInteger>(1)); |
339 } | 428 } |
340 | 429 |
341 - (NSString*)optionAtIndex:(NSInteger)index { | 430 - (NSString*)optionAtIndex:(NSInteger)index { |
342 NSInteger numOptions = | 431 NSInteger numOptions = |
343 static_cast<NSInteger>(chooserController_->NumOptions()); | 432 static_cast<NSInteger>(chooserController_->NumOptions()); |
344 if (numOptions == 0) { | 433 if (numOptions == 0) { |
345 DCHECK_EQ(0, index); | 434 DCHECK_EQ(0, index); |
346 return l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT); | 435 return base::SysUTF16ToNSString(chooserController_->GetNoOptionsText()); |
347 } | 436 } |
348 | 437 |
349 DCHECK_GE(index, 0); | 438 DCHECK_GE(index, 0); |
350 DCHECK_LT(index, numOptions); | 439 DCHECK_LT(index, numOptions); |
351 | 440 |
352 return base::SysUTF16ToNSString( | 441 return base::SysUTF16ToNSString( |
353 chooserController_->GetOption(static_cast<size_t>(index))); | 442 chooserController_->GetOption(static_cast<size_t>(index))); |
354 } | 443 } |
355 | 444 |
356 - (void)updateTableView { | 445 - (void)updateTableView { |
357 tableViewController_->UpdateTableView(); | 446 chooserContentViewController_->UpdateTableView(); |
358 } | 447 } |
359 | 448 |
360 - (void)accept { | 449 - (void)accept { |
361 chooserController_->Select([tableView_ selectedRow]); | 450 chooserController_->Select([tableView_ selectedRow]); |
362 } | 451 } |
363 | 452 |
364 - (void)cancel { | 453 - (void)cancel { |
365 chooserController_->Cancel(); | 454 chooserController_->Cancel(); |
366 } | 455 } |
367 | 456 |
368 - (void)close { | 457 - (void)close { |
369 chooserController_->Close(); | 458 chooserController_->Close(); |
370 } | 459 } |
371 | 460 |
| 461 - (void)onRescan:(id)sender { |
| 462 chooserController_->RefreshOptions(); |
| 463 } |
| 464 |
372 - (void)onHelpPressed:(id)sender { | 465 - (void)onHelpPressed:(id)sender { |
373 chooserController_->OpenHelpCenterUrl(); | 466 chooserController_->OpenHelpCenterUrl(); |
374 } | 467 } |
375 | 468 |
376 @end | 469 @end |
OLD | NEW |