Chromium Code Reviews| 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 "grit/ui_resources.h" | |
| 15 #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" |
| 16 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" | 17 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" |
| 17 #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" | |
| 18 | 20 |
| 19 namespace { | 21 namespace { |
| 20 | 22 |
| 21 // Chooser width. | 23 // Chooser width. |
| 22 const CGFloat kChooserWidth = 350.0f; | 24 const CGFloat kChooserWidth = 350.0f; |
| 23 | 25 |
| 24 // Chooser height. | 26 // Chooser height. |
| 25 const CGFloat kChooserHeight = 300.0f; | 27 const CGFloat kChooserHeight = 300.0f; |
| 26 | 28 |
| 29 // Signal strength level image size. | |
| 30 const CGFloat kSignalStrengthLevelImageSize = 20.0f; | |
| 31 | |
| 32 // Table row view height. | |
| 33 const CGFloat kTableRowViewHeight = 23.0f; | |
| 34 | |
| 27 // Spinner size. | 35 // Spinner size. |
| 28 const CGFloat kSpinnerSize = 24.0f; | 36 const CGFloat kSpinnerSize = 24.0f; |
| 29 | 37 |
| 30 // Distance between the chooser border and the view that is closest to the | 38 // Distance between the chooser border and the view that is closest to the |
| 31 // border. | 39 // border. |
| 32 const CGFloat kMarginX = 20.0f; | 40 const CGFloat kMarginX = 20.0f; |
| 33 const CGFloat kMarginY = 20.0f; | 41 const CGFloat kMarginY = 20.0f; |
| 34 | 42 |
| 35 // Distance between two views inside the chooser. | 43 // Distance between two views inside the chooser. |
| 36 const CGFloat kHorizontalPadding = 10.0f; | 44 const CGFloat kHorizontalPadding = 10.0f; |
| 37 const CGFloat kVerticalPadding = 10.0f; | 45 const CGFloat kVerticalPadding = 10.0f; |
| 38 | 46 |
| 39 // Separator alpha value. | 47 // Separator alpha value. |
| 40 const CGFloat kSeparatorAlphaValue = 0.6f; | 48 const CGFloat kSeparatorAlphaValue = 0.6f; |
| 41 | 49 |
| 42 // Separator height. | 50 // Separator height. |
| 43 const CGFloat kSeparatorHeight = 1.0f; | 51 const CGFloat kSeparatorHeight = 1.0f; |
| 44 | 52 |
| 53 // The lookup table for signal strength level image. | |
| 54 const int signalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, | |
|
Jeffrey Yasskin
2016/08/19 18:30:05
Use kConstant naming: https://google.github.io/sty
juncai
2016/08/22 19:18:20
Done.
| |
| 55 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, | |
| 56 IDR_SIGNAL_4_BAR}; | |
| 57 | |
| 45 } // namespace | 58 } // namespace |
| 46 | 59 |
| 60 // A table row view that contains one line of text, and optionally contains an | |
| 61 // image in front of the text. | |
| 62 @interface TableRowView : NSView { | |
| 63 @private | |
| 64 base::scoped_nsobject<NSImageView> image_; | |
| 65 base::scoped_nsobject<NSTextField> text_; | |
| 66 } | |
| 67 | |
| 68 // Designated initializer. | |
| 69 - (instancetype)initWithText:(NSString*)text | |
| 70 signalStrengthLevel:(NSInteger)level; | |
| 71 | |
| 72 // Gets the image in front of the text. | |
| 73 - (NSImageView*)image; | |
| 74 | |
| 75 // Gets the text. | |
| 76 - (NSTextField*)text; | |
| 77 | |
| 78 @end | |
| 79 | |
| 80 @implementation TableRowView | |
| 81 | |
| 82 - (instancetype)initWithText:(NSString*)text | |
| 83 signalStrengthLevel:(NSInteger)level { | |
| 84 if ((self = [super initWithFrame:NSZeroRect])) { | |
| 85 if (level != -1) { | |
| 86 DCHECK_GE(level, 0); | |
| 87 DCHECK_LT(level, base::checked_cast<NSInteger>( | |
| 88 arraysize(signalStrengthLevelImageIds))); | |
| 89 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | |
| 90 NSImage* signalStrengthLevelImage = | |
| 91 rb.GetNativeImageNamed(signalStrengthLevelImageIds[level]) | |
| 92 .ToNSImage(); | |
| 93 | |
| 94 image_.reset([[NSImageView alloc] | |
| 95 initWithFrame:NSMakeRect(0, (kTableRowViewHeight - | |
| 96 kSignalStrengthLevelImageSize) / | |
| 97 2, | |
| 98 kSignalStrengthLevelImageSize, | |
| 99 kSignalStrengthLevelImageSize)]); | |
| 100 [image_ setImage:signalStrengthLevelImage]; | |
| 101 [self addSubview:image_]; | |
| 102 } | |
| 103 | |
| 104 text_.reset([[NSTextField alloc] initWithFrame:NSZeroRect]); | |
| 105 [text_ setDrawsBackground:NO]; | |
| 106 [text_ setBezeled:NO]; | |
| 107 [text_ setEditable:NO]; | |
| 108 [text_ setSelectable:NO]; | |
| 109 [text_ setStringValue:text]; | |
| 110 [text_ setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; | |
| 111 [text_ sizeToFit]; | |
| 112 CGFloat textHeight = NSHeight([text_ frame]); | |
| 113 [text_ setFrameOrigin:NSMakePoint( | |
| 114 level == -1 ? 0 : kSignalStrengthLevelImageSize + | |
| 115 kVerticalPadding, | |
|
Jeffrey Yasskin
2016/08/19 18:30:05
Shouldn't this be kHorizontalPadding?
juncai
2016/08/22 19:18:20
Done.
| |
| 116 (kTableRowViewHeight - textHeight) / 2)]; | |
| 117 [self addSubview:text_]; | |
| 118 } | |
| 119 | |
| 120 return self; | |
| 121 } | |
| 122 | |
| 123 - (NSImageView*)image { | |
| 124 return image_.get(); | |
| 125 } | |
| 126 | |
| 127 - (NSTextField*)text { | |
| 128 return text_.get(); | |
| 129 } | |
| 130 | |
| 131 @end | |
| 132 | |
| 47 class ChooserContentViewController : public ChooserController::View { | 133 class ChooserContentViewController : public ChooserController::View { |
| 48 public: | 134 public: |
| 49 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view, | 135 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view, |
| 50 ChooserController* chooser_controller, | 136 ChooserController* chooser_controller, |
| 51 NSTableView* table_view, | 137 NSTableView* table_view, |
| 52 SpinnerView* spinner, | 138 SpinnerView* spinner, |
| 53 NSTextField* status, | 139 NSTextField* status, |
| 54 NSButton* rescan_button); | 140 NSButton* rescan_button); |
| 55 ~ChooserContentViewController() override; | 141 ~ChooserContentViewController() override; |
| 56 | 142 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 // When refreshing, show |status_| and hide |rescan_button_|. | 254 // When refreshing, show |status_| and hide |rescan_button_|. |
| 169 // When complete, show |rescan_button_| and hide |status_|. | 255 // When complete, show |rescan_button_| and hide |status_|. |
| 170 [status_ setHidden:refreshing ? NO : YES]; | 256 [status_ setHidden:refreshing ? NO : YES]; |
| 171 [rescan_button_ setHidden:refreshing ? YES : NO]; | 257 [rescan_button_ setHidden:refreshing ? YES : NO]; |
| 172 | 258 |
| 173 [chooser_content_view_ updateView]; | 259 [chooser_content_view_ updateView]; |
| 174 } | 260 } |
| 175 | 261 |
| 176 void ChooserContentViewController::UpdateTableView() { | 262 void ChooserContentViewController::UpdateTableView() { |
| 177 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; | 263 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; |
| 264 // For NSView-based table views, calling reloadData will deselect the | |
| 265 // currently selected row, so |selected_row| stores the currently selected | |
| 266 // row in order to select it again. | |
| 267 NSInteger selected_row = [table_view_ selectedRow]; | |
| 178 [table_view_ reloadData]; | 268 [table_view_ reloadData]; |
| 269 if (selected_row != -1) { | |
| 270 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row] | |
| 271 byExtendingSelection:NO]; | |
| 272 } | |
| 179 } | 273 } |
| 180 | 274 |
| 181 @implementation ChooserContentViewCocoa | 275 @implementation ChooserContentViewCocoa |
| 182 | 276 |
| 183 // TODO(juncai): restructure this function to be some smaller methods to | 277 // TODO(juncai): restructure this function to be some smaller methods to |
| 184 // create the pieces for the view. By doing so, the methods that calculate | 278 // create the pieces for the view. By doing so, the methods that calculate |
| 185 // the frame and origins can be moved into those methods, rather than as | 279 // the frame and origins can be moved into those methods, rather than as |
| 186 // helper functions. | 280 // helper functions. |
| 187 - (instancetype)initWithChooserTitle:(NSString*)chooserTitle | 281 - (instancetype)initWithChooserTitle:(NSString*)chooserTitle |
| 188 chooserController: | 282 chooserController: |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 388 [titleView setEditable:NO]; | 482 [titleView setEditable:NO]; |
| 389 [titleView setSelectable:NO]; | 483 [titleView setSelectable:NO]; |
| 390 [titleView setStringValue:title]; | 484 [titleView setStringValue:title]; |
| 391 [titleView setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; | 485 [titleView setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; |
| 392 // The height is arbitrary as it will be adjusted later. | 486 // The height is arbitrary as it will be adjusted later. |
| 393 [titleView setFrameSize:NSMakeSize(kChooserWidth - 2 * kMarginX, 0.0f)]; | 487 [titleView setFrameSize:NSMakeSize(kChooserWidth - 2 * kMarginX, 0.0f)]; |
| 394 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:titleView]; | 488 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:titleView]; |
| 395 return titleView; | 489 return titleView; |
| 396 } | 490 } |
| 397 | 491 |
| 492 - (NSView*)createTableRowView:(NSInteger)rowIndex { | |
| 493 NSInteger level = -1; | |
| 494 size_t numOptions = chooserController_->NumOptions(); | |
| 495 if (chooserController_->ShouldShowIconBeforeText() && numOptions > 0) { | |
|
Jeffrey Yasskin
2016/08/19 18:30:05
Dumb question: why is createTableRowView called wi
juncai
2016/08/22 19:18:20
If numOptions == 0, the actual number rows is 1 si
Jeffrey Yasskin
2016/08/22 21:59:24
Ah, I see. Could you comment that here? Like "This
juncai
2016/08/23 00:30:40
Done.
| |
| 496 DCHECK_GE(rowIndex, 0); | |
| 497 DCHECK_LT(rowIndex, base::checked_cast<NSInteger>(numOptions)); | |
| 498 level = base::checked_cast<NSInteger>( | |
| 499 chooserController_->GetSignalStrengthLevel( | |
| 500 base::checked_cast<size_t>(rowIndex))); | |
| 501 } | |
| 502 | |
| 503 base::scoped_nsobject<TableRowView> tableRowView([[TableRowView alloc] | |
| 504 initWithText:[self optionAtIndex:rowIndex] | |
|
Jeffrey Yasskin
2016/08/19 18:30:05
This indentation looks kinda weird.
juncai
2016/08/22 19:18:20
I used "git cl format" to format it. I guess here
Jeffrey Yasskin
2016/08/22 21:59:24
If `git cl format` did it, it's fine with me. :)
juncai
2016/08/23 00:30:40
Acknowledged.
| |
| 505 signalStrengthLevel:level]); | |
| 506 return tableRowView.autorelease(); | |
| 507 } | |
| 508 | |
| 509 - (CGFloat)tableRowViewHeight:(NSInteger)row { | |
| 510 return kTableRowViewHeight; | |
| 511 } | |
| 512 | |
| 398 - (base::scoped_nsobject<NSButton>)createButtonWithTitle:(NSString*)title { | 513 - (base::scoped_nsobject<NSButton>)createButtonWithTitle:(NSString*)title { |
| 399 base::scoped_nsobject<NSButton> button( | 514 base::scoped_nsobject<NSButton> button( |
| 400 [[ConstrainedWindowButton alloc] initWithFrame:NSZeroRect]); | 515 [[ConstrainedWindowButton alloc] initWithFrame:NSZeroRect]); |
| 401 [button setButtonType:NSMomentaryPushInButton]; | 516 [button setButtonType:NSMomentaryPushInButton]; |
| 402 [button setTitle:title]; | 517 [button setTitle:title]; |
| 403 [button sizeToFit]; | 518 [button sizeToFit]; |
| 404 return button; | 519 return button; |
| 405 } | 520 } |
| 406 | 521 |
| 407 - (base::scoped_nsobject<NSButton>)createConnectButton { | 522 - (base::scoped_nsobject<NSButton>)createConnectButton { |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 568 } | 683 } |
| 569 | 684 |
| 570 - (void)onRescan:(id)sender { | 685 - (void)onRescan:(id)sender { |
| 571 chooserController_->RefreshOptions(); | 686 chooserController_->RefreshOptions(); |
| 572 } | 687 } |
| 573 | 688 |
| 574 - (void)onHelpPressed:(id)sender { | 689 - (void)onHelpPressed:(id)sender { |
| 575 chooserController_->OpenHelpCenterUrl(); | 690 chooserController_->OpenHelpCenterUrl(); |
| 576 } | 691 } |
| 577 | 692 |
| 693 - (NSImageView*)tableRowViewImage:(NSInteger)row { | |
| 694 TableRowView* tableRowView = | |
| 695 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES]; | |
| 696 return [tableRowView image]; | |
| 697 } | |
| 698 | |
| 699 - (NSTextField*)tableRowViewText:(NSInteger)row { | |
| 700 TableRowView* tableRowView = | |
| 701 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES]; | |
| 702 return [tableRowView text]; | |
| 703 } | |
| 704 | |
| 578 @end | 705 @end |
| OLD | NEW |