Index: chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm |
diff --git a/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm b/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm |
index dd9fce5ee84234608c362d86616ec815db820393..e26dda09194d7e1f86f275de50cbcd1d19943fd6 100644 |
--- a/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm |
+++ b/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm |
@@ -12,9 +12,11 @@ |
#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h" |
#include "chrome/browser/ui/cocoa/spinner_view.h" |
#include "chrome/grit/generated_resources.h" |
+#include "grit/ui_resources.h" |
#import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTweaker.h" |
#import "ui/base/cocoa/controls/hyperlink_button_cell.h" |
#include "ui/base/l10n/l10n_util_mac.h" |
+#include "ui/base/resource/resource_bundle.h" |
namespace { |
@@ -24,6 +26,12 @@ const CGFloat kChooserWidth = 350.0f; |
// Chooser height. |
const CGFloat kChooserHeight = 300.0f; |
+// Signal strength level image size. |
+const CGFloat kSignalStrengthLevelImageSize = 20.0f; |
+ |
+// Table row view height. |
+const CGFloat kTableRowViewHeight = 23.0f; |
+ |
// Spinner size. |
const CGFloat kSpinnerSize = 24.0f; |
@@ -42,8 +50,86 @@ const CGFloat kSeparatorAlphaValue = 0.6f; |
// Separator height. |
const CGFloat kSeparatorHeight = 1.0f; |
+// The lookup table for signal strength level image. |
+const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, |
+ IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, |
+ IDR_SIGNAL_4_BAR}; |
+ |
} // namespace |
+// A table row view that contains one line of text, and optionally contains an |
+// image in front of the text. |
+@interface ChooserContentTableRowView : NSView { |
+ @private |
+ base::scoped_nsobject<NSImageView> image_; |
+ base::scoped_nsobject<NSTextField> text_; |
+} |
+ |
+// Designated initializer. |
+- (instancetype)initWithText:(NSString*)text |
+ signalStrengthLevel:(NSInteger)level; |
+ |
+// Gets the image in front of the text. |
+- (NSImageView*)image; |
+ |
+// Gets the text. |
+- (NSTextField*)text; |
+ |
+@end |
+ |
+@implementation ChooserContentTableRowView |
+ |
+- (instancetype)initWithText:(NSString*)text |
+ signalStrengthLevel:(NSInteger)level { |
+ if ((self = [super initWithFrame:NSZeroRect])) { |
+ if (level != -1) { |
+ DCHECK_GE(level, 0); |
+ DCHECK_LT(level, base::checked_cast<NSInteger>( |
+ arraysize(kSignalStrengthLevelImageIds))); |
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
+ NSImage* signalStrengthLevelImage = |
+ rb.GetNativeImageNamed(kSignalStrengthLevelImageIds[level]) |
+ .ToNSImage(); |
+ |
+ image_.reset([[NSImageView alloc] |
+ initWithFrame:NSMakeRect(0, (kTableRowViewHeight - |
+ kSignalStrengthLevelImageSize) / |
+ 2, |
+ kSignalStrengthLevelImageSize, |
+ kSignalStrengthLevelImageSize)]); |
+ [image_ setImage:signalStrengthLevelImage]; |
+ [self addSubview:image_]; |
+ } |
+ |
+ text_.reset([[NSTextField alloc] initWithFrame:NSZeroRect]); |
+ [text_ setDrawsBackground:NO]; |
+ [text_ setBezeled:NO]; |
+ [text_ setEditable:NO]; |
+ [text_ setSelectable:NO]; |
+ [text_ setStringValue:text]; |
+ [text_ setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; |
+ [text_ sizeToFit]; |
+ CGFloat textHeight = NSHeight([text_ frame]); |
+ [text_ setFrameOrigin:NSMakePoint( |
+ level == -1 ? 0 : kSignalStrengthLevelImageSize + |
+ kHorizontalPadding, |
+ (kTableRowViewHeight - textHeight) / 2)]; |
+ [self addSubview:text_]; |
+ } |
+ |
+ return self; |
+} |
+ |
+- (NSImageView*)image { |
+ return image_.get(); |
+} |
+ |
+- (NSTextField*)text { |
+ return text_.get(); |
+} |
+ |
+@end |
+ |
class ChooserContentViewController : public ChooserController::View { |
public: |
ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view, |
@@ -175,7 +261,15 @@ void ChooserContentViewController::OnRefreshStateChanged(bool refreshing) { |
void ChooserContentViewController::UpdateTableView() { |
[table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; |
+ // For NSView-based table views, calling reloadData will deselect the |
+ // currently selected row, so |selected_row| stores the currently selected |
+ // row in order to select it again. |
+ NSInteger selected_row = [table_view_ selectedRow]; |
[table_view_ reloadData]; |
+ if (selected_row != -1) { |
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row] |
+ byExtendingSelection:NO]; |
+ } |
} |
@implementation ChooserContentViewCocoa |
@@ -395,6 +489,27 @@ void ChooserContentViewController::UpdateTableView() { |
return titleView; |
} |
+- (base::scoped_nsobject<NSView>)createTableRowView:(NSInteger)rowIndex { |
+ NSInteger level = -1; |
+ size_t numOptions = chooserController_->NumOptions(); |
+ if (chooserController_->ShouldShowIconBeforeText() && numOptions > 0) { |
+ DCHECK_GE(rowIndex, 0); |
+ DCHECK_LT(rowIndex, base::checked_cast<NSInteger>(numOptions)); |
+ level = base::checked_cast<NSInteger>( |
+ chooserController_->GetSignalStrengthLevel( |
+ base::checked_cast<size_t>(rowIndex))); |
+ } |
+ |
+ base::scoped_nsobject<NSView> tableRowView([[ChooserContentTableRowView alloc] |
+ initWithText:[self optionAtIndex:rowIndex] |
+ signalStrengthLevel:level]); |
+ return tableRowView; |
+} |
+ |
+- (CGFloat)tableRowViewHeight:(NSInteger)row { |
+ return kTableRowViewHeight; |
+} |
+ |
- (base::scoped_nsobject<NSButton>)createButtonWithTitle:(NSString*)title { |
base::scoped_nsobject<NSButton> button( |
[[ConstrainedWindowButton alloc] initWithFrame:NSZeroRect]); |
@@ -536,6 +651,8 @@ void ChooserContentViewController::UpdateTableView() { |
static_cast<NSInteger>(1)); |
} |
+// When this function is called with numOptions == 0, it is to show the |
+// message saying there are no devices. |
- (NSString*)optionAtIndex:(NSInteger)index { |
NSInteger numOptions = |
static_cast<NSInteger>(chooserController_->NumOptions()); |
@@ -575,4 +692,16 @@ void ChooserContentViewController::UpdateTableView() { |
chooserController_->OpenHelpCenterUrl(); |
} |
+- (NSImageView*)tableRowViewImage:(NSInteger)row { |
+ ChooserContentTableRowView* tableRowView = |
+ [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES]; |
+ return [tableRowView image]; |
+} |
+ |
+- (NSTextField*)tableRowViewText:(NSInteger)row { |
+ ChooserContentTableRowView* tableRowView = |
+ [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES]; |
+ return [tableRowView text]; |
+} |
+ |
@end |