| 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 |