Index: ui/views/controls/menu/menu_item_view.cc |
diff --git a/ui/views/controls/menu/menu_item_view.cc b/ui/views/controls/menu/menu_item_view.cc |
index 574d04c3b8b9cef287e154eeb32837688f969fe5..8cd22c0cdbb1720171bcf5d857c842553af4aee8 100644 |
--- a/ui/views/controls/menu/menu_item_view.cc |
+++ b/ui/views/controls/menu/menu_item_view.cc |
@@ -96,7 +96,8 @@ MenuItemView::MenuItemView(MenuDelegate* delegate) |
bottom_margin_(-1), |
requested_menu_position_(POSITION_BEST_FIT), |
actual_menu_position_(requested_menu_position_), |
- use_right_margin_(true) { |
+ use_right_margin_(true), |
+ menu_config_(NULL) { |
// NOTE: don't check the delegate for NULL, UpdateMenuPartSizes supplies a |
// NULL delegate. |
Init(NULL, 0, SUBMENU, delegate); |
@@ -219,7 +220,7 @@ MenuItemView* MenuItemView::AddMenuItemAt( |
CreateSubmenu(); |
DCHECK_GE(submenu_->child_count(), index); |
if (type == SEPARATOR) { |
- submenu_->AddChildViewAt(new MenuSeparator(separator_style), index); |
+ submenu_->AddChildViewAt(new MenuSeparator(this, separator_style), index); |
return NULL; |
} |
MenuItemView* item = new MenuItemView(this, item_id, type); |
@@ -530,7 +531,7 @@ void MenuItemView::Layout() { |
x -= width - kChildXPadding; |
} |
// Position |icon_view|. |
- const MenuConfig& config = MenuConfig::instance(); |
+ const MenuConfig& config = GetMenuConfig(); |
if (icon_view_) { |
icon_view_->SizeToPreferredSize(); |
gfx::Size size = icon_view_->GetPreferredSize(); |
@@ -550,6 +551,14 @@ void MenuItemView::SetMargins(int top_margin, int bottom_margin) { |
pref_size_.SetSize(0,0); |
} |
+const MenuConfig& MenuItemView::GetMenuConfig() const { |
+ const MenuItemView* root_menu_item = GetRootMenuItem(); |
+ if (root_menu_item->menu_config_) |
+ return *(root_menu_item->menu_config_); |
+ |
+ return MenuConfig::instance(); |
+} |
+ |
MenuItemView::MenuItemView(MenuItemView* parent, |
int command, |
MenuItemView::Type type) |
@@ -568,7 +577,8 @@ MenuItemView::MenuItemView(MenuItemView* parent, |
top_margin_(-1), |
bottom_margin_(-1), |
requested_menu_position_(POSITION_BEST_FIT), |
- actual_menu_position_(requested_menu_position_) { |
+ actual_menu_position_(requested_menu_position_), |
+ menu_config_(NULL) { |
Init(parent, command, type, NULL); |
} |
@@ -586,7 +596,7 @@ std::string MenuItemView::GetClassName() const { |
// This is invoked prior to Running a menu. |
void MenuItemView::UpdateMenuPartSizes() { |
MenuConfig::Reset(); |
- const MenuConfig& config = MenuConfig::instance(); |
+ const MenuConfig& config = GetMenuConfig(); |
item_right_margin_ = config.label_to_arrow_padding + config.arrow_width + |
config.arrow_to_edge_padding; |
@@ -606,9 +616,10 @@ void MenuItemView::UpdateMenuPartSizes() { |
if (config.render_gutter) |
label_start_ += config.gutter_width + config.gutter_to_label; |
- MenuItemView menu_item(NULL); |
- menu_item.SetTitle(ASCIIToUTF16("blah")); // Text doesn't matter here. |
- pref_menu_height_ = menu_item.GetPreferredSize().height(); |
+ string16 original_title = title(); |
+ SetTitle(ASCIIToUTF16("blah")); // Text doesn't matter here. |
sky
2012/10/05 21:33:40
I don't like doing this, it may have side effects.
yefimt
2012/10/08 20:02:47
OK, I think this should be better
On 2012/10/05 2
|
+ pref_menu_height_ = GetPreferredSize().height(); |
+ SetTitle(original_title); |
} |
void MenuItemView::Init(MenuItemView* parent, |
@@ -664,8 +675,7 @@ int MenuItemView::GetDrawStringFlags() { |
flags |= gfx::Canvas::TEXT_ALIGN_LEFT; |
if (has_mnemonics_) { |
- if (MenuConfig::instance().show_mnemonics || |
- GetRootMenuItem()->show_mnemonics_) { |
+ if (GetMenuConfig().show_mnemonics || GetRootMenuItem()->show_mnemonics_) { |
flags |= gfx::Canvas::SHOW_PREFIX; |
} else { |
flags |= gfx::Canvas::HIDE_PREFIX; |
@@ -678,7 +688,7 @@ const gfx::Font& MenuItemView::GetFont() { |
// Check for item-specific font. |
const MenuDelegate* delegate = GetDelegate(); |
return delegate ? |
- delegate->GetLabelFont(GetCommand()) : MenuConfig::instance().font; |
+ delegate->GetLabelFont(GetCommand()) : GetMenuConfig().font; |
} |
void MenuItemView::AddEmptyMenus() { |
@@ -726,7 +736,7 @@ void MenuItemView::PaintAccelerator(gfx::Canvas* canvas) { |
int available_height = height() - GetTopMargin() - GetBottomMargin(); |
int max_accel_width = |
parent_menu_item_->GetSubmenu()->max_accelerator_width(); |
- const MenuConfig& config = MenuConfig::instance(); |
+ const MenuConfig& config = GetMenuConfig(); |
int accel_right_margin = config.align_arrow_and_shortcut ? |
config.arrow_to_edge_padding : item_right_margin_; |
gfx::Rect accel_bounds(width() - accel_right_margin - max_accel_width, |
@@ -763,8 +773,8 @@ int MenuItemView::GetTopMargin() { |
MenuItemView* root = GetRootMenuItem(); |
return root && root->has_icons_ |
- ? MenuConfig::instance().item_top_margin : |
- MenuConfig::instance().item_no_icon_top_margin; |
+ ? GetMenuConfig().item_top_margin : |
+ GetMenuConfig().item_no_icon_top_margin; |
} |
int MenuItemView::GetBottomMargin() { |
@@ -773,8 +783,8 @@ int MenuItemView::GetBottomMargin() { |
MenuItemView* root = GetRootMenuItem(); |
return root && root->has_icons_ |
- ? MenuConfig::instance().item_bottom_margin : |
- MenuConfig::instance().item_no_icon_bottom_margin; |
+ ? GetMenuConfig().item_bottom_margin : |
+ GetMenuConfig().item_no_icon_bottom_margin; |
} |
gfx::Size MenuItemView::GetChildPreferredSize() { |
@@ -829,7 +839,7 @@ MenuItemView::MenuItemDimensions MenuItemView::GetPreferredDimensions() { |
dimensions.height = std::max(dimensions.height, |
font.GetHeight() + GetBottomMargin() + GetTopMargin()); |
dimensions.height = std::max(dimensions.height, |
- MenuConfig::instance().item_min_height); |
+ GetMenuConfig().item_min_height); |
return dimensions; |
} |
@@ -845,7 +855,7 @@ string16 MenuItemView::GetAcceleratorText() { |
return string16(); |
} |
- if(!MenuConfig::instance().show_accelerators) |
+ if(!GetMenuConfig().show_accelerators) |
return string16(); |
ui::Accelerator accelerator; |