permission_selector_button.mm revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#import "chrome/browser/ui/cocoa/website_settings/permission_selector_button.h" 6 7#include "base/strings/sys_string_conversions.h" 8#include "chrome/browser/ui/cocoa/website_settings/website_settings_utils_cocoa.h" 9#include "chrome/browser/ui/website_settings/website_settings_ui.h" 10#include "chrome/browser/ui/website_settings/website_settings_utils.h" 11#import "ui/base/cocoa/menu_controller.h" 12 13@implementation PermissionSelectorButton 14 15- (id)initWithPermissionInfo: 16 (const WebsiteSettingsUI::PermissionInfo&)permissionInfo 17 forURL:(const GURL&)url 18 withCallback:(PermissionMenuModel::ChangeCallback)callback { 19 if (self = [super initWithFrame:NSMakeRect(0, 0, 1, 1) pullsDown:NO]) { 20 [self setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; 21 [self setBordered:NO]; 22 [[self cell] setControlSize:NSSmallControlSize]; 23 24 menuModel_.reset(new PermissionMenuModel(url, permissionInfo, callback)); 25 26 menuController_.reset([[MenuController alloc] initWithModel:menuModel_.get() 27 useWithPopUpButtonCell:NO]); 28 [self setMenu:[menuController_ menu]]; 29 [self selectItemWithTag:permissionInfo.setting]; 30 31 // Set the button title. 32 base::scoped_nsobject<NSMenuItem> titleItem([[NSMenuItem alloc] init]); 33 base::string16 buttonTitle = WebsiteSettingsUI::PermissionActionToUIString( 34 permissionInfo.setting, 35 permissionInfo.default_setting, 36 permissionInfo.source); 37 [titleItem setTitle:base::SysUTF16ToNSString(buttonTitle)]; 38 [[self cell] setUsesItemFromMenu:NO]; 39 [[self cell] setMenuItem:titleItem.get()]; 40 // Although the frame is reset, below, this sizes the cell properly. 41 [self sizeToFit]; 42 43 // Size the button to just fit the visible title - not all of its items. 44 [self setFrameSize:SizeForWebsiteSettingsButtonTitle(self, [self title])]; 45 } 46 return self; 47} 48 49- (CGFloat)maxTitleWidthWithDefaultSetting:(ContentSetting)defaultSetting { 50 // Determine the largest possible size for this button. 51 CGFloat maxTitleWidth = 0; 52 for (NSMenuItem* item in [self itemArray]) { 53 NSString* title = 54 base::SysUTF16ToNSString(WebsiteSettingsUI::PermissionActionToUIString( 55 static_cast<ContentSetting>([item tag]), 56 defaultSetting, 57 content_settings::SETTING_SOURCE_USER)); 58 NSSize size = SizeForWebsiteSettingsButtonTitle(self, title); 59 maxTitleWidth = std::max(maxTitleWidth, size.width); 60 } 61 return maxTitleWidth; 62} 63 64// Accessor function for testing only. 65- (NSMenu*)permissionMenu { 66 return [menuController_ menu]; 67} 68 69@end 70