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