Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Side by Side Diff: chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm

Issue 2468403002: Make WebBluetooth chooser consistent on Android and desktops (desktop part) (Closed)
Patch Set: address comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698