| 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/browser/ui/cocoa/spinner_view.h" |
| 14 #include "chrome/grit/generated_resources.h" | 14 #include "chrome/grit/generated_resources.h" |
| 15 #include "skia/ext/skia_utils_mac.h" | 15 #include "skia/ext/skia_utils_mac.h" |
| 16 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw
eaker.h" | 16 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw
eaker.h" |
| 17 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" | 17 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" |
| 18 #include "ui/base/l10n/l10n_util_mac.h" | 18 #include "ui/base/l10n/l10n_util_mac.h" |
| 19 #include "ui/base/resource/resource_bundle.h" | 19 #include "ui/base/resource/resource_bundle.h" |
| 20 #include "ui/gfx/color_palette.h" | 20 #include "ui/gfx/color_palette.h" |
| 21 #include "ui/gfx/image/image_skia_util_mac.h" | 21 #include "ui/gfx/image/image_skia_util_mac.h" |
| 22 #include "ui/gfx/paint_vector_icon.h" | 22 #include "ui/gfx/paint_vector_icon.h" |
| 23 #include "ui/gfx/vector_icons_public.h" | 23 #include "ui/gfx/vector_icons_public.h" |
| 24 #include "ui/resources/grit/ui_resources.h" | 24 #include "ui/resources/grit/ui_resources.h" |
| 25 | 25 |
| 26 namespace { | 26 namespace { |
| 27 | 27 |
| 28 // Chooser width. | 28 // Chooser width. |
| 29 const CGFloat kChooserWidth = 350.0f; | 29 const CGFloat kChooserWidth = 390.0f; |
| 30 | 30 |
| 31 // Chooser height. | 31 // Chooser height. |
| 32 const CGFloat kChooserHeight = 300.0f; | 32 const CGFloat kChooserHeight = 330.0f; |
| 33 | 33 |
| 34 // Row view image size. | 34 // Row view image size. |
| 35 const CGFloat kRowViewImageSize = 20.0f; | 35 const CGFloat kRowViewImageSize = 20.0f; |
| 36 | 36 |
| 37 // Table row view height. | 37 // Table row view height. |
| 38 const CGFloat kTableRowViewOneLineHeight = 23.0f; | 38 const CGFloat kTableRowViewOneLineHeight = 23.0f; |
| 39 const CGFloat kTableRowViewTwoLinesHeight = 39.0f; | 39 const CGFloat kTableRowViewTwoLinesHeight = 39.0f; |
| 40 | 40 |
| 41 // Spinner size. | 41 // Spinner size. |
| 42 const CGFloat kSpinnerSize = 24.0f; | 42 const CGFloat kSpinnerSize = 24.0f; |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 } | 227 } |
| 228 | 228 |
| 229 - (NSTextField*)pairedStatus { | 229 - (NSTextField*)pairedStatus { |
| 230 return pairedStatus_.get(); | 230 return pairedStatus_.get(); |
| 231 } | 231 } |
| 232 | 232 |
| 233 @end | 233 @end |
| 234 | 234 |
| 235 class ChooserContentViewController : public ChooserController::View { | 235 class ChooserContentViewController : public ChooserController::View { |
| 236 public: | 236 public: |
| 237 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view, | 237 ChooserContentViewController(ChooserController* chooser_controller, |
| 238 ChooserController* chooser_controller, | |
| 239 NSButton* adapter_off_help_button, | 238 NSButton* adapter_off_help_button, |
| 240 NSTextField* adapter_off_message, | 239 NSTextField* adapter_off_message, |
| 241 NSTableView* table_view, | 240 NSTableView* table_view, |
| 242 SpinnerView* spinner, | 241 SpinnerView* spinner, |
| 243 NSTextField* status, | 242 NSTextField* scanning_message, |
| 243 NSTextField* word_connector, |
| 244 NSButton* rescan_button); | 244 NSButton* rescan_button); |
| 245 ~ChooserContentViewController() override; | 245 ~ChooserContentViewController() override; |
| 246 | 246 |
| 247 // ChooserController::View: | 247 // ChooserController::View: |
| 248 void OnOptionsInitialized() override; | 248 void OnOptionsInitialized() override; |
| 249 void OnOptionAdded(size_t index) override; | 249 void OnOptionAdded(size_t index) override; |
| 250 void OnOptionRemoved(size_t index) override; | 250 void OnOptionRemoved(size_t index) override; |
| 251 void OnOptionUpdated(size_t index) override; | 251 void OnOptionUpdated(size_t index) override; |
| 252 void OnAdapterEnabledChanged(bool enabled) override; | 252 void OnAdapterEnabledChanged(bool enabled) override; |
| 253 void OnRefreshStateChanged(bool refreshing) override; | 253 void OnRefreshStateChanged(bool refreshing) override; |
| 254 | 254 |
| 255 void UpdateTableView(); | 255 void UpdateTableView(); |
| 256 | 256 |
| 257 private: | 257 private: |
| 258 ChooserContentViewCocoa* chooser_content_view_; | |
| 259 ChooserController* chooser_controller_; | 258 ChooserController* chooser_controller_; |
| 260 NSButton* adapter_off_help_button_; | 259 NSButton* adapter_off_help_button_; |
| 261 NSTextField* adapter_off_message_; | 260 NSTextField* adapter_off_message_; |
| 262 NSTableView* table_view_; | 261 NSTableView* table_view_; |
| 263 SpinnerView* spinner_; | 262 SpinnerView* spinner_; |
| 264 NSTextField* status_; | 263 NSTextField* scanning_message_; |
| 264 NSTextField* word_connector_; |
| 265 NSButton* rescan_button_; | 265 NSButton* rescan_button_; |
| 266 | 266 |
| 267 DISALLOW_COPY_AND_ASSIGN(ChooserContentViewController); | 267 DISALLOW_COPY_AND_ASSIGN(ChooserContentViewController); |
| 268 }; | 268 }; |
| 269 | 269 |
| 270 ChooserContentViewController::ChooserContentViewController( | 270 ChooserContentViewController::ChooserContentViewController( |
| 271 ChooserContentViewCocoa* chooser_content_view, | |
| 272 ChooserController* chooser_controller, | 271 ChooserController* chooser_controller, |
| 273 NSButton* adapter_off_help_button, | 272 NSButton* adapter_off_help_button, |
| 274 NSTextField* adapter_off_message, | 273 NSTextField* adapter_off_message, |
| 275 NSTableView* table_view, | 274 NSTableView* table_view, |
| 276 SpinnerView* spinner, | 275 SpinnerView* spinner, |
| 277 NSTextField* status, | 276 NSTextField* scanning_message, |
| 277 NSTextField* word_connector, |
| 278 NSButton* rescan_button) | 278 NSButton* rescan_button) |
| 279 : chooser_content_view_(chooser_content_view), | 279 : chooser_controller_(chooser_controller), |
| 280 chooser_controller_(chooser_controller), | |
| 281 adapter_off_help_button_(adapter_off_help_button), | 280 adapter_off_help_button_(adapter_off_help_button), |
| 282 adapter_off_message_(adapter_off_message), | 281 adapter_off_message_(adapter_off_message), |
| 283 table_view_(table_view), | 282 table_view_(table_view), |
| 284 spinner_(spinner), | 283 spinner_(spinner), |
| 285 status_(status), | 284 scanning_message_(scanning_message), |
| 285 word_connector_(word_connector), |
| 286 rescan_button_(rescan_button) { | 286 rescan_button_(rescan_button) { |
| 287 DCHECK(chooser_controller_); | 287 DCHECK(chooser_controller_); |
| 288 DCHECK(adapter_off_help_button_); | 288 DCHECK(adapter_off_help_button_); |
| 289 DCHECK(adapter_off_message_); | 289 DCHECK(adapter_off_message_); |
| 290 DCHECK(table_view_); | 290 DCHECK(table_view_); |
| 291 DCHECK(spinner_); | 291 DCHECK(spinner_); |
| 292 DCHECK(status_); | 292 DCHECK(scanning_message_); |
| 293 DCHECK(word_connector_); |
| 293 DCHECK(rescan_button_); | 294 DCHECK(rescan_button_); |
| 294 chooser_controller_->set_view(this); | 295 chooser_controller_->set_view(this); |
| 295 } | 296 } |
| 296 | 297 |
| 297 ChooserContentViewController::~ChooserContentViewController() { | 298 ChooserContentViewController::~ChooserContentViewController() { |
| 298 chooser_controller_->set_view(nullptr); | 299 chooser_controller_->set_view(nullptr); |
| 299 } | 300 } |
| 300 | 301 |
| 301 void ChooserContentViewController::OnOptionsInitialized() { | 302 void ChooserContentViewController::OnOptionsInitialized() { |
| 302 UpdateTableView(); | 303 UpdateTableView(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 // This will also disable the OK button if it was enabled because | 337 // This will also disable the OK button if it was enabled because |
| 337 // of a previously selected row. | 338 // of a previously selected row. |
| 338 [table_view_ deselectAll:nil]; | 339 [table_view_ deselectAll:nil]; |
| 339 UpdateTableView(); | 340 UpdateTableView(); |
| 340 [table_view_ setHidden:enabled ? NO : YES]; | 341 [table_view_ setHidden:enabled ? NO : YES]; |
| 341 [adapter_off_help_button_ setHidden:enabled ? YES : NO]; | 342 [adapter_off_help_button_ setHidden:enabled ? YES : NO]; |
| 342 [adapter_off_message_ setHidden:enabled ? YES : NO]; | 343 [adapter_off_message_ setHidden:enabled ? YES : NO]; |
| 343 | 344 |
| 344 [spinner_ setHidden:YES]; | 345 [spinner_ setHidden:YES]; |
| 345 | 346 |
| 346 [status_ setHidden:YES]; | 347 [scanning_message_ setHidden:YES]; |
| 347 // When adapter is enabled, show |rescan_button_|; otherwise hide it. | 348 // When adapter is enabled, show |word_connector_| and |rescan_button_|; |
| 349 // otherwise hide them. |
| 350 [word_connector_ setHidden:enabled ? NO : YES]; |
| 348 [rescan_button_ setHidden:enabled ? NO : YES]; | 351 [rescan_button_ setHidden:enabled ? NO : YES]; |
| 349 | |
| 350 [chooser_content_view_ updateView]; | |
| 351 } | 352 } |
| 352 | 353 |
| 353 void ChooserContentViewController::OnRefreshStateChanged(bool refreshing) { | 354 void ChooserContentViewController::OnRefreshStateChanged(bool refreshing) { |
| 354 if (refreshing) { | 355 if (refreshing) { |
| 355 // No row is selected since the chooser is refreshing. | 356 // No row is selected since the chooser is refreshing. |
| 356 // This will also disable the OK button if it was enabled because | 357 // This will also disable the OK button if it was enabled because |
| 357 // of a previously selected row. | 358 // of a previously selected row. |
| 358 [table_view_ deselectAll:nil]; | 359 [table_view_ deselectAll:nil]; |
| 359 UpdateTableView(); | 360 UpdateTableView(); |
| 360 } | 361 } |
| 361 | 362 |
| 362 // When refreshing and no option available yet, hide |table_view_| and show | 363 // When refreshing and no option available yet, hide |table_view_| and show |
| 363 // |spinner_|. Otherwise show |table_view_| and hide |spinner_|. | 364 // |spinner_|. Otherwise show |table_view_| and hide |spinner_|. |
| 364 bool table_view_hidden = | 365 bool table_view_hidden = |
| 365 refreshing && (chooser_controller_->NumOptions() == 0); | 366 refreshing && (chooser_controller_->NumOptions() == 0); |
| 366 [table_view_ setHidden:table_view_hidden ? YES : NO]; | 367 [table_view_ setHidden:table_view_hidden ? YES : NO]; |
| 367 [spinner_ setHidden:table_view_hidden ? NO : YES]; | 368 [spinner_ setHidden:table_view_hidden ? NO : YES]; |
| 368 | 369 |
| 369 // When refreshing, show |status_| and hide |rescan_button_|. | 370 // When refreshing, show |scanning_message_| and hide |word_connector_| and |
| 370 // When complete, show |rescan_button_| and hide |status_|. | 371 // |rescan_button_|. |
| 371 [status_ setHidden:refreshing ? NO : YES]; | 372 // When complete, show |word_connector_| and |rescan_button_| and hide |
| 373 // |scanning_message_|. |
| 374 [scanning_message_ setHidden:refreshing ? NO : YES]; |
| 375 [word_connector_ setHidden:refreshing ? YES : NO]; |
| 372 [rescan_button_ setHidden:refreshing ? YES : NO]; | 376 [rescan_button_ setHidden:refreshing ? YES : NO]; |
| 373 | |
| 374 [chooser_content_view_ updateView]; | |
| 375 } | 377 } |
| 376 | 378 |
| 377 void ChooserContentViewController::UpdateTableView() { | 379 void ChooserContentViewController::UpdateTableView() { |
| 378 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; | 380 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; |
| 379 // For NSView-based table views, calling reloadData will deselect the | 381 // For NSView-based table views, calling reloadData will deselect the |
| 380 // currently selected row, so |selected_row| stores the currently selected | 382 // currently selected row, so |selected_row| stores the currently selected |
| 381 // row in order to select it again. | 383 // row in order to select it again. |
| 382 NSInteger selected_row = [table_view_ selectedRow]; | 384 NSInteger selected_row = [table_view_ selectedRow]; |
| 383 [table_view_ reloadData]; | 385 [table_view_ reloadData]; |
| 384 if (selected_row != -1) { | 386 if (selected_row != -1) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 401 // | -------------------------------- | | 403 // | -------------------------------- | |
| 402 // | | option 0 | | | 404 // | | option 0 | | |
| 403 // | | option 1 | | | 405 // | | option 1 | | |
| 404 // | | option 2 | | | 406 // | | option 2 | | |
| 405 // | | | | | 407 // | | | | |
| 406 // | | | | | 408 // | | | | |
| 407 // | | | | | 409 // | | | | |
| 408 // | -------------------------------- | | 410 // | -------------------------------- | |
| 409 // | [ Connect ] [ Cancel ] | | 411 // | [ Connect ] [ Cancel ] | |
| 410 // |----------------------------------| | 412 // |----------------------------------| |
| 411 // | Not seeing your device? Get help | | 413 // | Get help | |
| 412 // ------------------------------------ | 414 // ------------------------------------ |
| 413 | 415 |
| 414 // Determine the dimensions of the chooser. | 416 // Determine the dimensions of the chooser. |
| 415 // Once the height and width are set, the buttons and permission menus can | 417 // Once the height and width are set, the buttons and permission menus can |
| 416 // be laid out correctly. | 418 // be laid out correctly. |
| 417 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight); | 419 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight); |
| 418 | 420 |
| 419 if ((self = [super initWithFrame:chooserFrame])) { | 421 if ((self = [super initWithFrame:chooserFrame])) { |
| 420 chooserController_ = std::move(chooserController); | 422 chooserController_ = std::move(chooserController); |
| 421 | 423 |
| 422 // Create the views. | 424 // Create the views. |
| 423 // Title. | 425 // Title. |
| 424 titleView_ = [self createChooserTitle:chooserTitle]; | 426 titleView_ = [self createChooserTitle:chooserTitle]; |
| 425 titleHeight_ = NSHeight([titleView_ frame]); | 427 CGFloat titleHeight = NSHeight([titleView_ frame]); |
| 426 | 428 |
| 427 // Adapter turned off help button. | 429 // Adapter turned off help button. |
| 428 adapterOffHelpButton_ = [self | 430 adapterOffHelpButton_ = [self |
| 429 createHyperlinkButtonWithText: | 431 createHyperlinkButtonWithText: |
| 430 l10n_util::GetNSString( | 432 l10n_util::GetNSString( |
| 431 IDS_BLUETOOTH_DEVICE_CHOOSER_TURN_ON_BLUETOOTH_LINK_TEXT)]; | 433 IDS_BLUETOOTH_DEVICE_CHOOSER_TURN_ON_BLUETOOTH_LINK_TEXT)]; |
| 432 CGFloat adapterOffHelpButtonWidth = NSWidth([adapterOffHelpButton_ frame]); | 434 CGFloat adapterOffHelpButtonWidth = NSWidth([adapterOffHelpButton_ frame]); |
| 433 CGFloat adapterOffHelpButtonHeight = | 435 CGFloat adapterOffHelpButtonHeight = |
| 434 NSHeight([adapterOffHelpButton_ frame]); | 436 NSHeight([adapterOffHelpButton_ frame]); |
| 435 | 437 |
| 436 // Adapter turned off message. | 438 // Adapter turned off message. |
| 437 adapterOffMessage_ = CreateLabel(l10n_util::GetNSStringF( | 439 adapterOffMessage_ = CreateLabel(l10n_util::GetNSStringF( |
| 438 IDS_BLUETOOTH_DEVICE_CHOOSER_TURN_ADAPTER_OFF, base::string16())); | 440 IDS_BLUETOOTH_DEVICE_CHOOSER_TURN_ADAPTER_OFF, base::string16())); |
| 439 | 441 |
| 440 // Status. | 442 // Connect button. |
| 441 status_ = CreateLabel( | 443 connectButton_ = [self createConnectButton]; |
| 444 CGFloat connectButtonWidth = NSWidth([connectButton_ frame]); |
| 445 CGFloat connectButtonHeight = NSHeight([connectButton_ frame]); |
| 446 |
| 447 // Cancel button. |
| 448 cancelButton_ = [self createCancelButton]; |
| 449 CGFloat cancelButtonWidth = NSWidth([cancelButton_ frame]); |
| 450 |
| 451 // Separator. |
| 452 separator_ = [self createSeparator]; |
| 453 |
| 454 // Help button. |
| 455 helpButton_ = |
| 456 [self createHyperlinkButtonWithText: |
| 457 l10n_util::GetNSStringF( |
| 458 IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_SCANNING_STATUS, |
| 459 base::string16())]; |
| 460 CGFloat helpButtonWidth = NSWidth([helpButton_ frame]); |
| 461 CGFloat helpButtonHeight = NSHeight([helpButton_ frame]); |
| 462 |
| 463 // Scanning message. |
| 464 scanningMessage_ = CreateLabel( |
| 442 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING)); | 465 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING)); |
| 443 CGFloat statusWidth = kChooserWidth / 2 - kMarginX; | 466 |
| 444 // The height is arbitrary as it will be adjusted later. | 467 // Word connector. |
| 445 [status_ setFrameSize:NSMakeSize(statusWidth, 0.0f)]; | 468 wordConnector_ = CreateLabel(l10n_util::GetNSStringF( |
| 446 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:status_]; | 469 IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_RE_SCAN_LINK, base::string16(), |
| 447 statusHeight_ = NSHeight([status_ frame]); | 470 base::string16())); |
| 471 CGFloat wordConnectorWidth = NSWidth([wordConnector_ frame]); |
| 448 | 472 |
| 449 // Re-scan button. | 473 // Re-scan button. |
| 450 rescanButton_ = | 474 rescanButton_ = |
| 451 [self createHyperlinkButtonWithText: | 475 [self createHyperlinkButtonWithText: |
| 452 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN)]; | 476 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN)]; |
| 453 rescanButtonHeight_ = NSHeight([rescanButton_ frame]); | |
| 454 | |
| 455 // Connect button. | |
| 456 connectButton_ = [self createConnectButton]; | |
| 457 connectButtonWidth_ = NSWidth([connectButton_ frame]); | |
| 458 connectButtonHeight_ = NSHeight([connectButton_ frame]); | |
| 459 | |
| 460 // Cancel button. | |
| 461 cancelButton_ = [self createCancelButton]; | |
| 462 cancelButtonWidth_ = NSWidth([cancelButton_ frame]); | |
| 463 cancelButtonHeight_ = NSHeight([cancelButton_ frame]); | |
| 464 | |
| 465 CGFloat buttonRowHeight = | |
| 466 std::max(connectButtonHeight_, cancelButtonHeight_); | |
| 467 | |
| 468 // Separator. | |
| 469 separator_ = [self createSeparator]; | |
| 470 | |
| 471 // Message. | |
| 472 message_ = CreateLabel(l10n_util::GetNSStringF( | |
| 473 IDS_DEVICE_CHOOSER_FOOTNOTE_TEXT, base::string16())); | |
| 474 CGFloat messageWidth = NSWidth([message_ frame]); | |
| 475 messageHeight_ = NSHeight([message_ frame]); | |
| 476 | |
| 477 // Help button. | |
| 478 helpButton_ = [self | |
| 479 createHyperlinkButtonWithText: | |
| 480 l10n_util::GetNSString(IDS_DEVICE_CHOOSER_GET_HELP_LINK_TEXT)]; | |
| 481 | 477 |
| 482 // ScollView embedding with TableView. | 478 // ScollView embedding with TableView. |
| 483 noStatusOrRescanButtonShown_.scroll_view_frame = | 479 CGFloat scrollViewWidth = kChooserWidth - 2 * kMarginX; |
| 484 [self calculateScrollViewFrame:buttonRowHeight]; | 480 CGFloat scrollViewHeight = kChooserHeight - 2 * kMarginY - |
| 485 scrollView_.reset([[NSScrollView alloc] | 481 4 * kVerticalPadding - titleHeight - |
| 486 initWithFrame:noStatusOrRescanButtonShown_.scroll_view_frame]); | 482 connectButtonHeight - helpButtonHeight; |
| 483 CGFloat scrollViewOriginX = kMarginX; |
| 484 CGFloat scrollViewOriginY = kMarginY + helpButtonHeight + |
| 485 3 * kVerticalPadding + connectButtonHeight; |
| 486 NSRect scrollFrame = NSMakeRect(scrollViewOriginX, scrollViewOriginY, |
| 487 scrollViewWidth, scrollViewHeight); |
| 488 scrollView_.reset([[NSScrollView alloc] initWithFrame:scrollFrame]); |
| 487 [scrollView_ setBorderType:NSBezelBorder]; | 489 [scrollView_ setBorderType:NSBezelBorder]; |
| 488 [scrollView_ setHasVerticalScroller:YES]; | 490 [scrollView_ setHasVerticalScroller:YES]; |
| 489 [scrollView_ setHasHorizontalScroller:YES]; | 491 [scrollView_ setHasHorizontalScroller:YES]; |
| 490 [scrollView_ setAutohidesScrollers:YES]; | 492 [scrollView_ setAutohidesScrollers:YES]; |
| 491 [scrollView_ setDrawsBackground:NO]; | 493 [scrollView_ setDrawsBackground:NO]; |
| 492 | 494 |
| 493 // TableView. | 495 // TableView. |
| 494 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]); | 496 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]); |
| 495 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]); | 497 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]); |
| 496 [tableColumn_ | 498 [tableColumn_ setWidth:(scrollViewWidth - kMarginX)]; |
| 497 setWidth:(noStatusOrRescanButtonShown_.scroll_view_frame.size.width - | |
| 498 kMarginX)]; | |
| 499 [tableView_ addTableColumn:tableColumn_]; | 499 [tableView_ addTableColumn:tableColumn_]; |
| 500 // Make the column title invisible. | 500 // Make the column title invisible. |
| 501 [tableView_ setHeaderView:nil]; | 501 [tableView_ setHeaderView:nil]; |
| 502 [tableView_ setFocusRingType:NSFocusRingTypeNone]; | 502 [tableView_ setFocusRingType:NSFocusRingTypeNone]; |
| 503 | 503 |
| 504 // Spinner. | 504 // Spinner. |
| 505 // Set the spinner in the center of the scroll view. | 505 // Set the spinner in the center of the scroll view. |
| 506 // When |status_| is shown, it may affect the frame origin and size of the | |
| 507 // |scrollView_|, and since the |spinner_| is shown with the |status_|, | |
| 508 // its frame origin needs to be calculated according to the frame origin | |
| 509 // of |scrollView_| with |status_| shown. | |
| 510 NSRect scrollViewFrameWithStatusText = [self | |
| 511 calculateScrollViewFrame:std::max(statusHeight_, buttonRowHeight)]; | |
| 512 CGFloat spinnerOriginX = | 506 CGFloat spinnerOriginX = |
| 513 scrollViewFrameWithStatusText.origin.x + | 507 scrollViewOriginX + (scrollViewWidth - kSpinnerSize) / 2; |
| 514 (scrollViewFrameWithStatusText.size.width - kSpinnerSize) / 2; | |
| 515 CGFloat spinnerOriginY = | 508 CGFloat spinnerOriginY = |
| 516 scrollViewFrameWithStatusText.origin.y + | 509 scrollViewOriginY + (scrollViewHeight - kSpinnerSize) / 2; |
| 517 (scrollViewFrameWithStatusText.size.height - kSpinnerSize) / 2; | |
| 518 spinner_.reset([[SpinnerView alloc] | 510 spinner_.reset([[SpinnerView alloc] |
| 519 initWithFrame:NSMakeRect(spinnerOriginX, spinnerOriginY, kSpinnerSize, | 511 initWithFrame:NSMakeRect(spinnerOriginX, spinnerOriginY, kSpinnerSize, |
| 520 kSpinnerSize)]); | 512 kSpinnerSize)]); |
| 521 | 513 |
| 522 // Lay out the views. | 514 // Lay out the views. |
| 523 // Title. | 515 // Title. |
| 524 CGFloat titleOriginX = kMarginX; | 516 CGFloat titleOriginX = kMarginX; |
| 525 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight_; | 517 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight; |
| 526 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; | 518 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; |
| 527 [self addSubview:titleView_]; | 519 [self addSubview:titleView_]; |
| 528 | 520 |
| 529 // Adapter turned off help button. | 521 // Adapter turned off help button. |
| 530 CGFloat adapterOffHelpButtonOriginX = kMarginX + kAdapterOffHelpLinkPadding; | 522 CGFloat adapterOffHelpButtonOriginX = kMarginX + kAdapterOffHelpLinkPadding; |
| 531 CGFloat adapterOffHelpButtonOriginY = titleOriginY - kVerticalPadding - | 523 CGFloat adapterOffHelpButtonOriginY = titleOriginY - kVerticalPadding - |
| 532 adapterOffHelpButtonHeight - | 524 adapterOffHelpButtonHeight - |
| 533 kAdapterOffHelpLinkPadding; | 525 kAdapterOffHelpLinkPadding; |
| 534 [adapterOffHelpButton_ | 526 [adapterOffHelpButton_ |
| 535 setFrameOrigin:NSMakePoint(adapterOffHelpButtonOriginX, | 527 setFrameOrigin:NSMakePoint(adapterOffHelpButtonOriginX, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 548 adapterOffMessageOriginY)]; | 540 adapterOffMessageOriginY)]; |
| 549 [adapterOffMessage_ setHidden:YES]; | 541 [adapterOffMessage_ setHidden:YES]; |
| 550 [self addSubview:adapterOffMessage_]; | 542 [self addSubview:adapterOffMessage_]; |
| 551 | 543 |
| 552 // ScollView and Spinner. Only one of them is shown. | 544 // ScollView and Spinner. Only one of them is shown. |
| 553 [scrollView_ setDocumentView:tableView_]; | 545 [scrollView_ setDocumentView:tableView_]; |
| 554 [self addSubview:scrollView_]; | 546 [self addSubview:scrollView_]; |
| 555 [spinner_ setHidden:YES]; | 547 [spinner_ setHidden:YES]; |
| 556 [self addSubview:spinner_]; | 548 [self addSubview:spinner_]; |
| 557 | 549 |
| 558 // Status text field and Re-scan button. At most one of them is shown. | |
| 559 [self addSubview:status_]; | |
| 560 [status_ setHidden:YES]; | |
| 561 | |
| 562 [rescanButton_ setTarget:self]; | |
| 563 [rescanButton_ setAction:@selector(onRescan:)]; | |
| 564 [self addSubview:rescanButton_]; | |
| 565 [rescanButton_ setHidden:YES]; | |
| 566 | |
| 567 // Connect button. | 550 // Connect button. |
| 568 noStatusOrRescanButtonShown_.connect_button_origin = | 551 CGFloat connectButtonOriginX = kChooserWidth - kMarginX - |
| 569 [self calculateConnectButtonOrigin:buttonRowHeight]; | 552 kHorizontalPadding - connectButtonWidth - |
| 553 cancelButtonWidth; |
| 554 CGFloat connectButtonOriginY = |
| 555 kMarginY + helpButtonHeight + 2 * kVerticalPadding; |
| 570 [connectButton_ | 556 [connectButton_ |
| 571 setFrameOrigin:noStatusOrRescanButtonShown_.connect_button_origin]; | 557 setFrameOrigin:NSMakePoint(connectButtonOriginX, connectButtonOriginY)]; |
| 572 [connectButton_ setEnabled:NO]; | 558 [connectButton_ setEnabled:NO]; |
| 573 [self addSubview:connectButton_]; | 559 [self addSubview:connectButton_]; |
| 574 | 560 |
| 575 // Cancel button. | 561 // Cancel button. |
| 576 noStatusOrRescanButtonShown_.cancel_button_origin = | 562 CGFloat cancelButtonOriginX = kChooserWidth - kMarginX - cancelButtonWidth; |
| 577 [self calculateCancelButtonOrigin:buttonRowHeight]; | 563 CGFloat cancelButtonOriginY = connectButtonOriginY; |
| 578 [cancelButton_ | 564 [cancelButton_ |
| 579 setFrameOrigin:noStatusOrRescanButtonShown_.cancel_button_origin]; | 565 setFrameOrigin:NSMakePoint(cancelButtonOriginX, cancelButtonOriginY)]; |
| 580 [self addSubview:cancelButton_]; | 566 [self addSubview:cancelButton_]; |
| 581 | 567 |
| 582 // Separator. | 568 // Separator. |
| 583 CGFloat separatorOriginX = 0.0f; | 569 CGFloat separatorOriginX = 0.0f; |
| 584 CGFloat separatorOriginY = kMarginY + messageHeight_ + kVerticalPadding; | 570 CGFloat separatorOriginY = kMarginY + helpButtonHeight + kVerticalPadding; |
| 585 [separator_ setFrameOrigin:NSMakePoint(separatorOriginX, separatorOriginY)]; | 571 [separator_ setFrameOrigin:NSMakePoint(separatorOriginX, separatorOriginY)]; |
| 586 [self addSubview:separator_]; | 572 [self addSubview:separator_]; |
| 587 | 573 |
| 588 // Message. | |
| 589 CGFloat messageOriginX = kMarginX; | |
| 590 CGFloat messageOriginY = kMarginY; | |
| 591 [message_ setFrameOrigin:NSMakePoint(messageOriginX, messageOriginY)]; | |
| 592 [self addSubview:message_]; | |
| 593 | |
| 594 // Help button. | 574 // Help button. |
| 595 CGFloat helpButtonOriginX = | 575 CGFloat helpButtonOriginX = kMarginX; |
| 596 kMarginX + messageWidth - kHorizontalPadding / 2; | 576 CGFloat helpButtonOriginY = (kVerticalPadding + kMarginY) / 2; |
| 597 CGFloat helpButtonOriginY = kMarginY; | |
| 598 [helpButton_ | 577 [helpButton_ |
| 599 setFrameOrigin:NSMakePoint(helpButtonOriginX, helpButtonOriginY)]; | 578 setFrameOrigin:NSMakePoint(helpButtonOriginX, helpButtonOriginY)]; |
| 600 [helpButton_ setTarget:self]; | 579 [helpButton_ setTarget:self]; |
| 601 [helpButton_ setAction:@selector(onHelpPressed:)]; | 580 [helpButton_ setAction:@selector(onHelpPressed:)]; |
| 602 [self addSubview:helpButton_]; | 581 [self addSubview:helpButton_]; |
| 603 | 582 |
| 604 // Calculate and cache the frame and origins values. | 583 // Scanning message. |
| 605 buttonRowHeight = std::max( | 584 CGFloat scanningMessageOriginX = |
| 606 statusHeight_, std::max(connectButtonHeight_, cancelButtonHeight_)); | 585 kMarginX + helpButtonWidth - kHorizontalPadding / 2; |
| 607 statusShown_ = {[self calculateScrollViewFrame:buttonRowHeight], | 586 CGFloat scanningMessageOriginY = helpButtonOriginY; |
| 608 [self calculateConnectButtonOrigin:buttonRowHeight], | 587 [scanningMessage_ setFrameOrigin:NSMakePoint(scanningMessageOriginX, |
| 609 [self calculateCancelButtonOrigin:buttonRowHeight]}; | 588 scanningMessageOriginY)]; |
| 610 statusOrigin_ = [self calculateStatusOrigin:buttonRowHeight]; | 589 [self addSubview:scanningMessage_]; |
| 590 [scanningMessage_ setHidden:YES]; |
| 611 | 591 |
| 612 buttonRowHeight = | 592 // Word connector. |
| 613 std::max(rescanButtonHeight_, | 593 CGFloat wordConnectorOriginX = |
| 614 std::max(connectButtonHeight_, cancelButtonHeight_)); | 594 kMarginX + helpButtonWidth - kHorizontalPadding / 2; |
| 615 rescanButtonShown_ = {[self calculateScrollViewFrame:buttonRowHeight], | 595 CGFloat wordConnectorOriginY = helpButtonOriginY; |
| 616 [self calculateConnectButtonOrigin:buttonRowHeight], | 596 [wordConnector_ |
| 617 [self calculateCancelButtonOrigin:buttonRowHeight]}; | 597 setFrameOrigin:NSMakePoint(wordConnectorOriginX, wordConnectorOriginY)]; |
| 618 rescanButtonOrigin_ = [self calculateRescanButtonOrigin:buttonRowHeight]; | 598 [self addSubview:wordConnector_]; |
| 599 [wordConnector_ setHidden:YES]; |
| 600 |
| 601 // Re-scan button. |
| 602 CGFloat reScanButtonOriginX = |
| 603 kMarginX + helpButtonWidth + wordConnectorWidth - kHorizontalPadding; |
| 604 CGFloat reScanButtonOriginY = helpButtonOriginY; |
| 605 [rescanButton_ |
| 606 setFrameOrigin:NSMakePoint(reScanButtonOriginX, reScanButtonOriginY)]; |
| 607 [rescanButton_ setTarget:self]; |
| 608 [rescanButton_ setAction:@selector(onRescan:)]; |
| 609 [self addSubview:rescanButton_]; |
| 610 [rescanButton_ setHidden:YES]; |
| 619 | 611 |
| 620 chooserContentViewController_.reset(new ChooserContentViewController( | 612 chooserContentViewController_.reset(new ChooserContentViewController( |
| 621 self, chooserController_.get(), adapterOffHelpButton_.get(), | 613 chooserController_.get(), adapterOffHelpButton_.get(), |
| 622 adapterOffMessage_.get(), tableView_.get(), spinner_.get(), | 614 adapterOffMessage_.get(), tableView_.get(), spinner_.get(), |
| 623 status_.get(), rescanButton_.get())); | 615 scanningMessage_.get(), wordConnector_.get(), rescanButton_.get())); |
| 624 } | 616 } |
| 625 | 617 |
| 626 return self; | 618 return self; |
| 627 } | 619 } |
| 628 | 620 |
| 629 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { | 621 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { |
| 630 base::scoped_nsobject<NSTextField> titleView( | 622 base::scoped_nsobject<NSTextField> titleView( |
| 631 [[NSTextField alloc] initWithFrame:NSZeroRect]); | 623 [[NSTextField alloc] initWithFrame:NSZeroRect]); |
| 632 [titleView setDrawsBackground:NO]; | 624 [titleView setDrawsBackground:NO]; |
| 633 [titleView setBezeled:NO]; | 625 [titleView setBezeled:NO]; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 (NSString*)text { | 721 (NSString*)text { |
| 730 base::scoped_nsobject<NSButton> button( | 722 base::scoped_nsobject<NSButton> button( |
| 731 [[NSButton alloc] initWithFrame:NSZeroRect]); | 723 [[NSButton alloc] initWithFrame:NSZeroRect]); |
| 732 base::scoped_nsobject<HyperlinkButtonCell> cell( | 724 base::scoped_nsobject<HyperlinkButtonCell> cell( |
| 733 [[HyperlinkButtonCell alloc] initTextCell:text]); | 725 [[HyperlinkButtonCell alloc] initTextCell:text]); |
| 734 [button setCell:cell.get()]; | 726 [button setCell:cell.get()]; |
| 735 [button sizeToFit]; | 727 [button sizeToFit]; |
| 736 return button; | 728 return button; |
| 737 } | 729 } |
| 738 | 730 |
| 739 - (NSRect)calculateScrollViewFrame:(CGFloat)buttonRowHeight { | |
| 740 CGFloat originX = kMarginX; | |
| 741 CGFloat originY = | |
| 742 kMarginY + messageHeight_ + 3 * kVerticalPadding + buttonRowHeight; | |
| 743 CGFloat width = kChooserWidth - 2 * kMarginX; | |
| 744 CGFloat height = kChooserHeight - 2 * kMarginY - 4 * kVerticalPadding - | |
| 745 titleHeight_ - buttonRowHeight - messageHeight_; | |
| 746 return NSMakeRect(originX, originY, width, height); | |
| 747 } | |
| 748 | |
| 749 - (NSPoint)calculateStatusOrigin:(CGFloat)buttonRowHeight { | |
| 750 return NSMakePoint(kMarginX, kMarginY + messageHeight_ + | |
| 751 2 * kVerticalPadding + | |
| 752 (buttonRowHeight - statusHeight_) / 2); | |
| 753 } | |
| 754 | |
| 755 - (NSPoint)calculateRescanButtonOrigin:(CGFloat)buttonRowHeight { | |
| 756 return NSMakePoint(kMarginX, kMarginY + messageHeight_ + | |
| 757 2 * kVerticalPadding + | |
| 758 (buttonRowHeight - rescanButtonHeight_) / 2); | |
| 759 } | |
| 760 | |
| 761 - (NSPoint)calculateConnectButtonOrigin:(CGFloat)buttonRowHeight { | |
| 762 return NSMakePoint(kChooserWidth - kMarginX - kHorizontalPadding - | |
| 763 connectButtonWidth_ - cancelButtonWidth_, | |
| 764 kMarginY + messageHeight_ + 2 * kVerticalPadding + | |
| 765 (buttonRowHeight - connectButtonHeight_) / 2); | |
| 766 } | |
| 767 | |
| 768 - (NSPoint)calculateCancelButtonOrigin:(CGFloat)buttonRowHeight { | |
| 769 return NSMakePoint(kChooserWidth - kMarginX - cancelButtonWidth_, | |
| 770 kMarginY + messageHeight_ + 2 * kVerticalPadding + | |
| 771 (buttonRowHeight - cancelButtonHeight_) / 2); | |
| 772 } | |
| 773 | |
| 774 - (void)updateView { | |
| 775 FrameAndOrigin frameAndOrigin; | |
| 776 if (![status_ isHidden]) { | |
| 777 [status_ setFrameOrigin:statusOrigin_]; | |
| 778 frameAndOrigin = statusShown_; | |
| 779 } else if (![rescanButton_ isHidden]) { | |
| 780 [rescanButton_ setFrameOrigin:rescanButtonOrigin_]; | |
| 781 frameAndOrigin = rescanButtonShown_; | |
| 782 } else { | |
| 783 frameAndOrigin = noStatusOrRescanButtonShown_; | |
| 784 } | |
| 785 | |
| 786 [scrollView_ setFrame:frameAndOrigin.scroll_view_frame]; | |
| 787 [connectButton_ setFrameOrigin:frameAndOrigin.connect_button_origin]; | |
| 788 [cancelButton_ setFrameOrigin:frameAndOrigin.cancel_button_origin]; | |
| 789 } | |
| 790 | |
| 791 - (NSButton*)adapterOffHelpButton { | 731 - (NSButton*)adapterOffHelpButton { |
| 792 return adapterOffHelpButton_.get(); | 732 return adapterOffHelpButton_.get(); |
| 793 } | 733 } |
| 794 | 734 |
| 795 - (NSTableView*)tableView { | 735 - (NSTableView*)tableView { |
| 796 return tableView_.get(); | 736 return tableView_.get(); |
| 797 } | 737 } |
| 798 | 738 |
| 799 - (SpinnerView*)spinner { | 739 - (SpinnerView*)spinner { |
| 800 return spinner_.get(); | 740 return spinner_.get(); |
| 801 } | 741 } |
| 802 | 742 |
| 803 - (NSTextField*)status { | |
| 804 return status_.get(); | |
| 805 } | |
| 806 | |
| 807 - (NSButton*)rescanButton { | |
| 808 return rescanButton_.get(); | |
| 809 } | |
| 810 | |
| 811 - (NSButton*)connectButton { | 743 - (NSButton*)connectButton { |
| 812 return connectButton_.get(); | 744 return connectButton_.get(); |
| 813 } | 745 } |
| 814 | 746 |
| 815 - (NSButton*)cancelButton { | 747 - (NSButton*)cancelButton { |
| 816 return cancelButton_.get(); | 748 return cancelButton_.get(); |
| 817 } | 749 } |
| 818 | 750 |
| 819 - (NSButton*)helpButton { | 751 - (NSButton*)helpButton { |
| 820 return helpButton_.get(); | 752 return helpButton_.get(); |
| 821 } | 753 } |
| 822 | 754 |
| 755 - (NSTextField*)scanningMessage { |
| 756 return scanningMessage_.get(); |
| 757 } |
| 758 |
| 759 - (NSTextField*)wordConnector { |
| 760 return wordConnector_.get(); |
| 761 } |
| 762 |
| 763 - (NSButton*)rescanButton { |
| 764 return rescanButton_.get(); |
| 765 } |
| 766 |
| 823 - (NSInteger)numberOfOptions { | 767 - (NSInteger)numberOfOptions { |
| 824 // When there are no devices, the table contains a message saying there are | 768 // When there are no devices, the table contains a message saying there are |
| 825 // no devices, so the number of rows is always at least 1. | 769 // no devices, so the number of rows is always at least 1. |
| 826 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), | 770 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), |
| 827 static_cast<NSInteger>(1)); | 771 static_cast<NSInteger>(1)); |
| 828 } | 772 } |
| 829 | 773 |
| 830 // When this function is called with numOptions == 0, it is to show the | 774 // When this function is called with numOptions == 0, it is to show the |
| 831 // message saying there are no devices. | 775 // message saying there are no devices. |
| 832 - (NSString*)optionAtIndex:(NSInteger)index { | 776 - (NSString*)optionAtIndex:(NSInteger)index { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 928 return [tableRowView text]; | 872 return [tableRowView text]; |
| 929 } | 873 } |
| 930 | 874 |
| 931 - (NSTextField*)tableRowViewPairedStatus:(NSInteger)row { | 875 - (NSTextField*)tableRowViewPairedStatus:(NSInteger)row { |
| 932 ChooserContentTableRowView* tableRowView = | 876 ChooserContentTableRowView* tableRowView = |
| 933 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES]; | 877 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES]; |
| 934 return [tableRowView pairedStatus]; | 878 return [tableRowView pairedStatus]; |
| 935 } | 879 } |
| 936 | 880 |
| 937 @end | 881 @end |
| OLD | NEW |