| 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" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 // Separator alpha value. | 53 // Separator alpha value. |
| 54 const CGFloat kSeparatorAlphaValue = 0.6f; | 54 const CGFloat kSeparatorAlphaValue = 0.6f; |
| 55 | 55 |
| 56 // Separator height. | 56 // Separator height. |
| 57 const CGFloat kSeparatorHeight = 1.0f; | 57 const CGFloat kSeparatorHeight = 1.0f; |
| 58 | 58 |
| 59 // Distance between two views inside the table row view. | 59 // Distance between two views inside the table row view. |
| 60 const CGFloat kTableRowViewHorizontalPadding = 5.0f; | 60 const CGFloat kTableRowViewHorizontalPadding = 5.0f; |
| 61 const CGFloat kTableRowViewVerticalPadding = 1.0f; | 61 const CGFloat kTableRowViewVerticalPadding = 1.0f; |
| 62 | 62 |
| 63 // Distance between the adapter off help link and the scroll view boundaries. |
| 64 const CGFloat kAdapterOffHelpLinkPadding = 5.0f; |
| 65 |
| 63 // The lookup table for signal strength level image. | 66 // The lookup table for signal strength level image. |
| 64 const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, | 67 const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, |
| 65 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, | 68 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, |
| 66 IDR_SIGNAL_4_BAR}; | 69 IDR_SIGNAL_4_BAR}; |
| 67 const int kSignalStrengthLevelImageSelectedIds[5] = { | 70 const int kSignalStrengthLevelImageSelectedIds[5] = { |
| 68 IDR_SIGNAL_0_BAR_SELECTED, IDR_SIGNAL_1_BAR_SELECTED, | 71 IDR_SIGNAL_0_BAR_SELECTED, IDR_SIGNAL_1_BAR_SELECTED, |
| 69 IDR_SIGNAL_2_BAR_SELECTED, IDR_SIGNAL_3_BAR_SELECTED, | 72 IDR_SIGNAL_2_BAR_SELECTED, IDR_SIGNAL_3_BAR_SELECTED, |
| 70 IDR_SIGNAL_4_BAR_SELECTED}; | 73 IDR_SIGNAL_4_BAR_SELECTED}; |
| 71 | 74 |
| 72 // Creates a label with |text|. | 75 // Creates a label with |text|. |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 - (NSTextField*)pairedStatus { | 229 - (NSTextField*)pairedStatus { |
| 227 return pairedStatus_.get(); | 230 return pairedStatus_.get(); |
| 228 } | 231 } |
| 229 | 232 |
| 230 @end | 233 @end |
| 231 | 234 |
| 232 class ChooserContentViewController : public ChooserController::View { | 235 class ChooserContentViewController : public ChooserController::View { |
| 233 public: | 236 public: |
| 234 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view, | 237 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view, |
| 235 ChooserController* chooser_controller, | 238 ChooserController* chooser_controller, |
| 239 NSButton* adapter_off_help_button, |
| 236 NSTableView* table_view, | 240 NSTableView* table_view, |
| 237 SpinnerView* spinner, | 241 SpinnerView* spinner, |
| 238 NSTextField* status, | 242 NSTextField* status, |
| 239 NSButton* rescan_button); | 243 NSButton* rescan_button); |
| 240 ~ChooserContentViewController() override; | 244 ~ChooserContentViewController() override; |
| 241 | 245 |
| 242 // ChooserController::View: | 246 // ChooserController::View: |
| 243 void OnOptionsInitialized() override; | 247 void OnOptionsInitialized() override; |
| 244 void OnOptionAdded(size_t index) override; | 248 void OnOptionAdded(size_t index) override; |
| 245 void OnOptionRemoved(size_t index) override; | 249 void OnOptionRemoved(size_t index) override; |
| 246 void OnOptionUpdated(size_t index) override; | 250 void OnOptionUpdated(size_t index) override; |
| 247 void OnAdapterEnabledChanged(bool enabled) override; | 251 void OnAdapterEnabledChanged(bool enabled) override; |
| 248 void OnRefreshStateChanged(bool refreshing) override; | 252 void OnRefreshStateChanged(bool refreshing) override; |
| 249 | 253 |
| 250 void UpdateTableView(); | 254 void UpdateTableView(); |
| 251 | 255 |
| 252 private: | 256 private: |
| 253 ChooserContentViewCocoa* chooser_content_view_; | 257 ChooserContentViewCocoa* chooser_content_view_; |
| 254 ChooserController* chooser_controller_; | 258 ChooserController* chooser_controller_; |
| 259 NSButton* adapter_off_help_button_; |
| 255 NSTableView* table_view_; | 260 NSTableView* table_view_; |
| 256 SpinnerView* spinner_; | 261 SpinnerView* spinner_; |
| 257 NSTextField* status_; | 262 NSTextField* status_; |
| 258 NSButton* rescan_button_; | 263 NSButton* rescan_button_; |
| 259 | 264 |
| 260 DISALLOW_COPY_AND_ASSIGN(ChooserContentViewController); | 265 DISALLOW_COPY_AND_ASSIGN(ChooserContentViewController); |
| 261 }; | 266 }; |
| 262 | 267 |
| 263 ChooserContentViewController::ChooserContentViewController( | 268 ChooserContentViewController::ChooserContentViewController( |
| 264 ChooserContentViewCocoa* chooser_content_view, | 269 ChooserContentViewCocoa* chooser_content_view, |
| 265 ChooserController* chooser_controller, | 270 ChooserController* chooser_controller, |
| 271 NSButton* adapter_off_help_button, |
| 266 NSTableView* table_view, | 272 NSTableView* table_view, |
| 267 SpinnerView* spinner, | 273 SpinnerView* spinner, |
| 268 NSTextField* status, | 274 NSTextField* status, |
| 269 NSButton* rescan_button) | 275 NSButton* rescan_button) |
| 270 : chooser_content_view_(chooser_content_view), | 276 : chooser_content_view_(chooser_content_view), |
| 271 chooser_controller_(chooser_controller), | 277 chooser_controller_(chooser_controller), |
| 278 adapter_off_help_button_(adapter_off_help_button), |
| 272 table_view_(table_view), | 279 table_view_(table_view), |
| 273 spinner_(spinner), | 280 spinner_(spinner), |
| 274 status_(status), | 281 status_(status), |
| 275 rescan_button_(rescan_button) { | 282 rescan_button_(rescan_button) { |
| 276 DCHECK(chooser_controller_); | 283 DCHECK(chooser_controller_); |
| 284 DCHECK(adapter_off_help_button_); |
| 277 DCHECK(table_view_); | 285 DCHECK(table_view_); |
| 278 DCHECK(spinner_); | 286 DCHECK(spinner_); |
| 279 DCHECK(status_); | 287 DCHECK(status_); |
| 280 DCHECK(rescan_button_); | 288 DCHECK(rescan_button_); |
| 281 chooser_controller_->set_view(this); | 289 chooser_controller_->set_view(this); |
| 282 } | 290 } |
| 283 | 291 |
| 284 ChooserContentViewController::~ChooserContentViewController() { | 292 ChooserContentViewController::~ChooserContentViewController() { |
| 285 chooser_controller_->set_view(nullptr); | 293 chooser_controller_->set_view(nullptr); |
| 286 } | 294 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 317 void ChooserContentViewController::OnOptionUpdated(size_t index) { | 325 void ChooserContentViewController::OnOptionUpdated(size_t index) { |
| 318 UpdateTableView(); | 326 UpdateTableView(); |
| 319 } | 327 } |
| 320 | 328 |
| 321 void ChooserContentViewController::OnAdapterEnabledChanged(bool enabled) { | 329 void ChooserContentViewController::OnAdapterEnabledChanged(bool enabled) { |
| 322 // No row is selected since the adapter status has changed. | 330 // No row is selected since the adapter status has changed. |
| 323 // This will also disable the OK button if it was enabled because | 331 // This will also disable the OK button if it was enabled because |
| 324 // of a previously selected row. | 332 // of a previously selected row. |
| 325 [table_view_ deselectAll:nil]; | 333 [table_view_ deselectAll:nil]; |
| 326 UpdateTableView(); | 334 UpdateTableView(); |
| 327 [table_view_ setHidden:NO]; | 335 [table_view_ setHidden:enabled ? NO : YES]; |
| 336 [adapter_off_help_button_ setHidden:enabled ? YES : NO]; |
| 328 | 337 |
| 329 [spinner_ setHidden:YES]; | 338 [spinner_ setHidden:YES]; |
| 330 | 339 |
| 331 [status_ setHidden:YES]; | 340 [status_ setHidden:YES]; |
| 332 // When adapter is enabled, show |rescan_button_|; otherwise hide it. | 341 // When adapter is enabled, show |rescan_button_|; otherwise hide it. |
| 333 [rescan_button_ setHidden:enabled ? NO : YES]; | 342 [rescan_button_ setHidden:enabled ? NO : YES]; |
| 334 | 343 |
| 335 [chooser_content_view_ updateView]; | 344 [chooser_content_view_ updateView]; |
| 336 } | 345 } |
| 337 | 346 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight); | 411 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight); |
| 403 | 412 |
| 404 if ((self = [super initWithFrame:chooserFrame])) { | 413 if ((self = [super initWithFrame:chooserFrame])) { |
| 405 chooserController_ = std::move(chooserController); | 414 chooserController_ = std::move(chooserController); |
| 406 | 415 |
| 407 // Create the views. | 416 // Create the views. |
| 408 // Title. | 417 // Title. |
| 409 titleView_ = [self createChooserTitle:chooserTitle]; | 418 titleView_ = [self createChooserTitle:chooserTitle]; |
| 410 titleHeight_ = NSHeight([titleView_ frame]); | 419 titleHeight_ = NSHeight([titleView_ frame]); |
| 411 | 420 |
| 421 // Adapter turned off help button. |
| 422 adapterOffHelpButton_ = |
| 423 [self createHyperlinkButtonWithText: |
| 424 l10n_util::GetNSString( |
| 425 IDS_BLUETOOTH_DEVICE_CHOOSER_TURN_ADAPTER_OFF)]; |
| 426 CGFloat adapterOffHelpButtonHeight = |
| 427 NSHeight([adapterOffHelpButton_ frame]); |
| 428 |
| 412 // Status. | 429 // Status. |
| 413 status_ = CreateLabel( | 430 status_ = CreateLabel( |
| 414 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING)); | 431 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING)); |
| 415 CGFloat statusWidth = kChooserWidth / 2 - kMarginX; | 432 CGFloat statusWidth = kChooserWidth / 2 - kMarginX; |
| 416 // The height is arbitrary as it will be adjusted later. | 433 // The height is arbitrary as it will be adjusted later. |
| 417 [status_ setFrameSize:NSMakeSize(statusWidth, 0.0f)]; | 434 [status_ setFrameSize:NSMakeSize(statusWidth, 0.0f)]; |
| 418 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:status_]; | 435 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:status_]; |
| 419 statusHeight_ = NSHeight([status_ frame]); | 436 statusHeight_ = NSHeight([status_ frame]); |
| 420 | 437 |
| 421 // Re-scan button. | 438 // Re-scan button. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 | 470 |
| 454 // ScollView embedding with TableView. | 471 // ScollView embedding with TableView. |
| 455 noStatusOrRescanButtonShown_.scroll_view_frame = | 472 noStatusOrRescanButtonShown_.scroll_view_frame = |
| 456 [self calculateScrollViewFrame:buttonRowHeight]; | 473 [self calculateScrollViewFrame:buttonRowHeight]; |
| 457 scrollView_.reset([[NSScrollView alloc] | 474 scrollView_.reset([[NSScrollView alloc] |
| 458 initWithFrame:noStatusOrRescanButtonShown_.scroll_view_frame]); | 475 initWithFrame:noStatusOrRescanButtonShown_.scroll_view_frame]); |
| 459 [scrollView_ setBorderType:NSBezelBorder]; | 476 [scrollView_ setBorderType:NSBezelBorder]; |
| 460 [scrollView_ setHasVerticalScroller:YES]; | 477 [scrollView_ setHasVerticalScroller:YES]; |
| 461 [scrollView_ setHasHorizontalScroller:YES]; | 478 [scrollView_ setHasHorizontalScroller:YES]; |
| 462 [scrollView_ setAutohidesScrollers:YES]; | 479 [scrollView_ setAutohidesScrollers:YES]; |
| 480 [scrollView_ setDrawsBackground:NO]; |
| 463 | 481 |
| 464 // TableView. | 482 // TableView. |
| 465 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]); | 483 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]); |
| 466 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]); | 484 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]); |
| 467 [tableColumn_ | 485 [tableColumn_ |
| 468 setWidth:(noStatusOrRescanButtonShown_.scroll_view_frame.size.width - | 486 setWidth:(noStatusOrRescanButtonShown_.scroll_view_frame.size.width - |
| 469 kMarginX)]; | 487 kMarginX)]; |
| 470 [tableView_ addTableColumn:tableColumn_]; | 488 [tableView_ addTableColumn:tableColumn_]; |
| 471 // Make the column title invisible. | 489 // Make the column title invisible. |
| 472 [tableView_ setHeaderView:nil]; | 490 [tableView_ setHeaderView:nil]; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 490 initWithFrame:NSMakeRect(spinnerOriginX, spinnerOriginY, kSpinnerSize, | 508 initWithFrame:NSMakeRect(spinnerOriginX, spinnerOriginY, kSpinnerSize, |
| 491 kSpinnerSize)]); | 509 kSpinnerSize)]); |
| 492 | 510 |
| 493 // Lay out the views. | 511 // Lay out the views. |
| 494 // Title. | 512 // Title. |
| 495 CGFloat titleOriginX = kMarginX; | 513 CGFloat titleOriginX = kMarginX; |
| 496 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight_; | 514 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight_; |
| 497 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; | 515 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; |
| 498 [self addSubview:titleView_]; | 516 [self addSubview:titleView_]; |
| 499 | 517 |
| 518 // Adapter turned off help button. |
| 519 CGFloat adapterOffHelpButtonOriginX = kMarginX + kAdapterOffHelpLinkPadding; |
| 520 CGFloat adapterOffHelpButtonOriginY = titleOriginY - kVerticalPadding - |
| 521 adapterOffHelpButtonHeight - |
| 522 kAdapterOffHelpLinkPadding; |
| 523 [adapterOffHelpButton_ |
| 524 setFrameOrigin:NSMakePoint(adapterOffHelpButtonOriginX, |
| 525 adapterOffHelpButtonOriginY)]; |
| 526 [adapterOffHelpButton_ setTarget:self]; |
| 527 [adapterOffHelpButton_ setAction:@selector(onAdapterOffHelp:)]; |
| 528 [adapterOffHelpButton_ setHidden:YES]; |
| 529 [self addSubview:adapterOffHelpButton_]; |
| 530 |
| 500 // ScollView and Spinner. Only one of them is shown. | 531 // ScollView and Spinner. Only one of them is shown. |
| 501 [scrollView_ setDocumentView:tableView_]; | 532 [scrollView_ setDocumentView:tableView_]; |
| 502 [self addSubview:scrollView_]; | 533 [self addSubview:scrollView_]; |
| 503 [spinner_ setHidden:YES]; | 534 [spinner_ setHidden:YES]; |
| 504 [self addSubview:spinner_]; | 535 [self addSubview:spinner_]; |
| 505 | 536 |
| 506 // Status text field and Re-scan button. At most one of them is shown. | 537 // Status text field and Re-scan button. At most one of them is shown. |
| 507 [self addSubview:status_]; | 538 [self addSubview:status_]; |
| 508 [status_ setHidden:YES]; | 539 [status_ setHidden:YES]; |
| 509 | 540 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 | 590 |
| 560 buttonRowHeight = | 591 buttonRowHeight = |
| 561 std::max(rescanButtonHeight_, | 592 std::max(rescanButtonHeight_, |
| 562 std::max(connectButtonHeight_, cancelButtonHeight_)); | 593 std::max(connectButtonHeight_, cancelButtonHeight_)); |
| 563 rescanButtonShown_ = {[self calculateScrollViewFrame:buttonRowHeight], | 594 rescanButtonShown_ = {[self calculateScrollViewFrame:buttonRowHeight], |
| 564 [self calculateConnectButtonOrigin:buttonRowHeight], | 595 [self calculateConnectButtonOrigin:buttonRowHeight], |
| 565 [self calculateCancelButtonOrigin:buttonRowHeight]}; | 596 [self calculateCancelButtonOrigin:buttonRowHeight]}; |
| 566 rescanButtonOrigin_ = [self calculateRescanButtonOrigin:buttonRowHeight]; | 597 rescanButtonOrigin_ = [self calculateRescanButtonOrigin:buttonRowHeight]; |
| 567 | 598 |
| 568 chooserContentViewController_.reset(new ChooserContentViewController( | 599 chooserContentViewController_.reset(new ChooserContentViewController( |
| 569 self, chooserController_.get(), tableView_.get(), spinner_.get(), | 600 self, chooserController_.get(), adapterOffHelpButton_.get(), |
| 570 status_.get(), rescanButton_.get())); | 601 tableView_.get(), spinner_.get(), status_.get(), rescanButton_.get())); |
| 571 } | 602 } |
| 572 | 603 |
| 573 return self; | 604 return self; |
| 574 } | 605 } |
| 575 | 606 |
| 576 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { | 607 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { |
| 577 base::scoped_nsobject<NSTextField> titleView( | 608 base::scoped_nsobject<NSTextField> titleView( |
| 578 [[NSTextField alloc] initWithFrame:NSZeroRect]); | 609 [[NSTextField alloc] initWithFrame:NSZeroRect]); |
| 579 [titleView setDrawsBackground:NO]; | 610 [titleView setDrawsBackground:NO]; |
| 580 [titleView setBezeled:NO]; | 611 [titleView setBezeled:NO]; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 frameAndOrigin = rescanButtonShown_; | 759 frameAndOrigin = rescanButtonShown_; |
| 729 } else { | 760 } else { |
| 730 frameAndOrigin = noStatusOrRescanButtonShown_; | 761 frameAndOrigin = noStatusOrRescanButtonShown_; |
| 731 } | 762 } |
| 732 | 763 |
| 733 [scrollView_ setFrame:frameAndOrigin.scroll_view_frame]; | 764 [scrollView_ setFrame:frameAndOrigin.scroll_view_frame]; |
| 734 [connectButton_ setFrameOrigin:frameAndOrigin.connect_button_origin]; | 765 [connectButton_ setFrameOrigin:frameAndOrigin.connect_button_origin]; |
| 735 [cancelButton_ setFrameOrigin:frameAndOrigin.cancel_button_origin]; | 766 [cancelButton_ setFrameOrigin:frameAndOrigin.cancel_button_origin]; |
| 736 } | 767 } |
| 737 | 768 |
| 769 - (NSButton*)adapterOffHelpButton { |
| 770 return adapterOffHelpButton_.get(); |
| 771 } |
| 772 |
| 738 - (NSTableView*)tableView { | 773 - (NSTableView*)tableView { |
| 739 return tableView_.get(); | 774 return tableView_.get(); |
| 740 } | 775 } |
| 741 | 776 |
| 742 - (SpinnerView*)spinner { | 777 - (SpinnerView*)spinner { |
| 743 return spinner_.get(); | 778 return spinner_.get(); |
| 744 } | 779 } |
| 745 | 780 |
| 746 - (NSTextField*)status { | 781 - (NSTextField*)status { |
| 747 return status_.get(); | 782 return status_.get(); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 796 } | 831 } |
| 797 | 832 |
| 798 - (void)cancel { | 833 - (void)cancel { |
| 799 chooserController_->Cancel(); | 834 chooserController_->Cancel(); |
| 800 } | 835 } |
| 801 | 836 |
| 802 - (void)close { | 837 - (void)close { |
| 803 chooserController_->Close(); | 838 chooserController_->Close(); |
| 804 } | 839 } |
| 805 | 840 |
| 841 - (void)onAdapterOffHelp:(id)sender { |
| 842 chooserController_->OpenAdapterOffHelpUrl(); |
| 843 } |
| 844 |
| 806 - (void)onRescan:(id)sender { | 845 - (void)onRescan:(id)sender { |
| 807 chooserController_->RefreshOptions(); | 846 chooserController_->RefreshOptions(); |
| 808 } | 847 } |
| 809 | 848 |
| 810 - (void)onHelpPressed:(id)sender { | 849 - (void)onHelpPressed:(id)sender { |
| 811 chooserController_->OpenHelpCenterUrl(); | 850 chooserController_->OpenHelpCenterUrl(); |
| 812 } | 851 } |
| 813 | 852 |
| 814 - (void)updateContentRowColor { | 853 - (void)updateContentRowColor { |
| 815 NSInteger selectedRow = [tableView_ selectedRow]; | 854 NSInteger selectedRow = [tableView_ selectedRow]; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 return [tableRowView text]; | 906 return [tableRowView text]; |
| 868 } | 907 } |
| 869 | 908 |
| 870 - (NSTextField*)tableRowViewPairedStatus:(NSInteger)row { | 909 - (NSTextField*)tableRowViewPairedStatus:(NSInteger)row { |
| 871 ChooserContentTableRowView* tableRowView = | 910 ChooserContentTableRowView* tableRowView = |
| 872 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES]; | 911 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES]; |
| 873 return [tableRowView pairedStatus]; | 912 return [tableRowView pairedStatus]; |
| 874 } | 913 } |
| 875 | 914 |
| 876 @end | 915 @end |
| OLD | NEW |