summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/website_settings/permission_selector_button.mm
blob: 6cc2466abe1c78cb8ee47f0eac7ffed6b9b49306 (plain)
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