summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm2
-rw-r--r--chrome/browser/ui/gtk/browser_toolbar_gtk.cc4
-rw-r--r--chrome/browser/ui/toolbar/wrench_menu_model.cc19
-rw-r--r--chrome/browser/ui/toolbar/wrench_menu_model.h8
-rw-r--r--chrome/browser/ui/toolbar/wrench_menu_model_unittest.cc4
-rw-r--r--chrome/browser/ui/views/toolbar_view.cc19
-rw-r--r--chrome/browser/ui/views/wrench_menu.cc98
-rw-r--r--chrome/browser/ui/views/wrench_menu.h15
-rw-r--r--ui/base/models/menu_separator_types.h3
-rw-r--r--ui/views/controls/menu/menu_config.cc4
-rw-r--r--ui/views/controls/menu/menu_config.h5
-rw-r--r--ui/views/controls/menu/menu_config_views.cc2
-rw-r--r--ui/views/controls/menu/menu_config_win.cc5
-rw-r--r--ui/views/controls/menu/menu_item_view.h7
-rw-r--r--ui/views/controls/menu/menu_item_view_views.cc6
-rw-r--r--ui/views/controls/menu/menu_item_view_win.cc25
-rw-r--r--ui/views/controls/menu/menu_scroll_view_container.cc14
-rw-r--r--ui/views/controls/menu/menu_separator.h9
-rw-r--r--ui/views/controls/menu/menu_separator_views.cc12
-rw-r--r--ui/views/controls/menu/menu_separator_win.cc32
-rw-r--r--ui/views/views.gyp2
21 files changed, 191 insertions, 104 deletions
diff --git a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm b/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm
index 8ad158f..8225439 100644
--- a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm
+++ b/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm
@@ -242,7 +242,7 @@ class ZoomLevelObserver : public content::NotificationObserver {
- (void)createModel {
wrenchMenuModel_.reset(
- new WrenchMenuModel(acceleratorDelegate_.get(), browser_));
+ new WrenchMenuModel(acceleratorDelegate_.get(), browser_, false, false));
[self setModel:wrenchMenuModel_.get()];
buttonViewController_.reset(
diff --git a/chrome/browser/ui/gtk/browser_toolbar_gtk.cc b/chrome/browser/ui/gtk/browser_toolbar_gtk.cc
index 6919a515..a85c95c 100644
--- a/chrome/browser/ui/gtk/browser_toolbar_gtk.cc
+++ b/chrome/browser/ui/gtk/browser_toolbar_gtk.cc
@@ -101,7 +101,7 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window)
is_wrench_menu_model_valid_(true),
browser_(browser),
window_(window) {
- wrench_menu_model_.reset(new WrenchMenuModel(this, browser_));
+ wrench_menu_model_.reset(new WrenchMenuModel(this, browser_, false, false));
chrome::AddCommandObserver(browser_, IDC_BACK, this);
chrome::AddCommandObserver(browser_, IDC_FORWARD, this);
@@ -673,7 +673,7 @@ bool BrowserToolbarGtk::ShouldOnlyShowLocation() const {
}
void BrowserToolbarGtk::RebuildWrenchMenu() {
- wrench_menu_model_.reset(new WrenchMenuModel(this, browser_));
+ wrench_menu_model_.reset(new WrenchMenuModel(this, browser_, false, false));
wrench_menu_.reset(new MenuGtk(this, wrench_menu_model_.get()));
// The bookmark menu model needs to be able to force the wrench menu to close.
wrench_menu_model_->bookmark_sub_menu_model()->SetMenuGtk(wrench_menu_.get());
diff --git a/chrome/browser/ui/toolbar/wrench_menu_model.cc b/chrome/browser/ui/toolbar/wrench_menu_model.cc
index 9163f8f..bc13616 100644
--- a/chrome/browser/ui/toolbar/wrench_menu_model.cc
+++ b/chrome/browser/ui/toolbar/wrench_menu_model.cc
@@ -213,12 +213,14 @@ void ToolsMenuModel::Build(Browser* browser) {
// WrenchMenuModel
WrenchMenuModel::WrenchMenuModel(ui::AcceleratorProvider* provider,
- Browser* browser)
+ Browser* browser,
+ bool is_new_menu,
+ bool supports_new_separators)
: ALLOW_THIS_IN_INITIALIZER_LIST(ui::SimpleMenuModel(this)),
provider_(provider),
browser_(browser),
tab_strip_model_(browser_->tab_strip_model()) {
- Build();
+ Build(is_new_menu, supports_new_separators);
UpdateZoomControls();
tab_strip_model_->AddObserver(this);
@@ -461,14 +463,7 @@ WrenchMenuModel::WrenchMenuModel()
tab_strip_model_(NULL) {
}
-void WrenchMenuModel::Build() {
- // TODO(skuhne): Remove special casing when only the new menu style is left.
-#if defined(USE_AURA)
- bool is_new_menu = true;
-#else
- bool is_new_menu = ui::GetDisplayLayout() == ui::LAYOUT_TOUCH;
-#endif
-
+void WrenchMenuModel::Build(bool is_new_menu, bool supports_new_separators) {
#if defined(USE_AURA)
if (is_new_menu)
AddSeparator(ui::SPACING_SEPARATOR);
@@ -623,10 +618,8 @@ void WrenchMenuModel::Build() {
AddItemWithStringId(IDC_EXIT, IDS_EXIT);
}
-#if defined(USE_AURA)
- if (is_new_menu)
+ if (is_new_menu && supports_new_separators)
AddSeparator(ui::SPACING_SEPARATOR);
-#endif
}
void WrenchMenuModel::AddGlobalErrorMenuItems() {
diff --git a/chrome/browser/ui/toolbar/wrench_menu_model.h b/chrome/browser/ui/toolbar/wrench_menu_model.h
index 8f8d5a8..5861d7f 100644
--- a/chrome/browser/ui/toolbar/wrench_menu_model.h
+++ b/chrome/browser/ui/toolbar/wrench_menu_model.h
@@ -77,7 +77,11 @@ class WrenchMenuModel : public ui::SimpleMenuModel,
public TabStripModelObserver,
public content::NotificationObserver {
public:
- WrenchMenuModel(ui::AcceleratorProvider* provider, Browser* browser);
+ // TODO: remove |is_new_menu| and |supports_new_separators|.
+ WrenchMenuModel(ui::AcceleratorProvider* provider,
+ Browser* browser,
+ bool is_new_menu,
+ bool supports_new_separators);
virtual ~WrenchMenuModel();
// Overridden for ButtonMenuItemModel::Delegate:
@@ -127,7 +131,7 @@ class WrenchMenuModel : public ui::SimpleMenuModel,
friend class ::MockWrenchMenuModel;
WrenchMenuModel();
- void Build();
+ void Build(bool is_new_menu, bool supports_new_separators);
void AddGlobalErrorMenuItems();
diff --git a/chrome/browser/ui/toolbar/wrench_menu_model_unittest.cc b/chrome/browser/ui/toolbar/wrench_menu_model_unittest.cc
index 30e3821..bbd9585 100644
--- a/chrome/browser/ui/toolbar/wrench_menu_model_unittest.cc
+++ b/chrome/browser/ui/toolbar/wrench_menu_model_unittest.cc
@@ -95,7 +95,7 @@ class TestWrenchMenuModel : public WrenchMenuModel {
public:
TestWrenchMenuModel(ui::AcceleratorProvider* provider,
Browser* browser)
- : WrenchMenuModel(provider, browser),
+ : WrenchMenuModel(provider, browser, false, false),
execute_count_(0),
checked_count_(0),
enable_count_(0) {
@@ -178,7 +178,7 @@ TEST_F(WrenchMenuModelTest, GlobalError) {
MenuError* error2 = new MenuError(command2);
service->AddGlobalError(error2);
- WrenchMenuModel model(this, browser());
+ WrenchMenuModel model(this, browser(), false, false);
int index1 = model.GetIndexOfCommandId(command1);
EXPECT_GT(index1, -1);
int index2 = model.GetIndexOfCommandId(command2);
diff --git a/chrome/browser/ui/views/toolbar_view.cc b/chrome/browser/ui/views/toolbar_view.cc
index 7f91d3f..396d661 100644
--- a/chrome/browser/ui/views/toolbar_view.cc
+++ b/chrome/browser/ui/views/toolbar_view.cc
@@ -68,6 +68,7 @@
#if defined(USE_AURA)
#include "ui/aura/window.h"
+#include "ui/base/native_theme/native_theme_aura.h"
#include "ui/compositor/layer.h"
#endif
@@ -422,8 +423,22 @@ void ToolbarView::OnMenuButtonClicked(views::View* source,
const gfx::Point& point) {
DCHECK_EQ(VIEW_ID_APP_MENU, source->id());
- wrench_menu_.reset(new WrenchMenu(browser_));
- wrench_menu_model_.reset(new WrenchMenuModel(this, browser_));
+ bool use_new_menu = false;
+ bool supports_new_separators = false;
+ // TODO: remove this.
+#if defined(USE_AURA)
+ supports_new_separators =
+ GetNativeTheme() == ui::NativeThemeAura::instance();
+ use_new_menu = supports_new_separators;
+#endif
+#if defined(OS_WIN)
+ use_new_menu = use_new_menu || ui::GetDisplayLayout() == ui::LAYOUT_TOUCH;
+#endif
+
+ wrench_menu_.reset(new WrenchMenu(browser_, use_new_menu,
+ supports_new_separators));
+ wrench_menu_model_.reset(new WrenchMenuModel(this, browser_, use_new_menu,
+ supports_new_separators));
wrench_menu_->Init(wrench_menu_model_.get());
FOR_EACH_OBSERVER(views::MenuListener, menu_listeners_, OnMenuOpened());
diff --git a/chrome/browser/ui/views/wrench_menu.cc b/chrome/browser/ui/views/wrench_menu.cc
index 1a78356..0bb1c52 100644
--- a/chrome/browser/ui/views/wrench_menu.cc
+++ b/chrome/browser/ui/views/wrench_menu.cc
@@ -52,6 +52,10 @@
#include "ui/views/controls/menu/submenu_view.h"
#include "ui/views/widget/widget.h"
+#if defined(USE_AURA)
+#include "ui/base/native_theme/native_theme_aura.h"
+#endif
+
using content::HostZoomMap;
using content::UserMetricsAction;
using content::WebContents;
@@ -87,16 +91,6 @@ const int kHorizontalTouchPadding = 15;
// Menu items which have embedded buttons should have this height in pixel.
const int kMenuItemContainingButtonsHeight = 43;
-// Returns true when the new menu style is used.
-// TODO(skuhne): Remove when only the new menu style is left.
-bool IsNewMenu() {
-#if defined(USE_AURA)
- return true;
-#else
- return ui::GetDisplayLayout() == ui::LAYOUT_TOUCH;
-#endif
-}
-
// Subclass of ImageButton whose preferred size includes the size of the border.
class FullscreenButton : public ImageButton {
public:
@@ -121,8 +115,8 @@ class FullscreenButton : public ImageButton {
// insets, the actual painting is done in MenuButtonBackground.
class MenuButtonBorder : public views::Border {
public:
- explicit MenuButtonBorder(const MenuConfig& config)
- : horizontal_padding_(IsNewMenu() ?
+ MenuButtonBorder(const MenuConfig& config, bool use_new_menu)
+ : horizontal_padding_(use_new_menu ?
kHorizontalTouchPadding : kHorizontalPadding),
insets_(config.item_top_margin, horizontal_padding_,
config.item_bottom_margin, horizontal_padding_) {
@@ -158,8 +152,9 @@ class MenuButtonBackground : public views::Background {
SINGLE_BUTTON,
};
- explicit MenuButtonBackground(ButtonType type)
+ MenuButtonBackground(ButtonType type, bool use_new_menu)
: type_(type),
+ use_new_menu_(use_new_menu),
left_button_(NULL),
right_button_(NULL) {}
@@ -182,10 +177,9 @@ class MenuButtonBackground : public views::Background {
CustomButton::BS_NORMAL : static_cast<CustomButton*>(view)->state();
int w = view->width();
int h = view->height();
- // Windows is drawing its own separators and we cannot use the touch button
- // for that.
-#if !defined(OS_WIN)
- if (IsNewMenu()) {
+#if defined(USE_AURA)
+ if (use_new_menu_ &&
+ view->GetNativeTheme() == ui::NativeThemeAura::instance()) {
// Normal buttons get a border drawn on the right side and the rest gets
// filled in. The left button however does not get a line to combine
// buttons.
@@ -291,6 +285,7 @@ class MenuButtonBackground : public views::Background {
}
const ButtonType type_;
+ const bool use_new_menu_;
// See description above setter for details.
CustomButton* left_button_;
@@ -337,7 +332,8 @@ string16 GetAccessibleNameForWrenchMenuItem(
class WrenchMenuView : public ScheduleAllView, public views::ButtonListener {
public:
WrenchMenuView(WrenchMenu* menu, MenuModel* menu_model)
- : menu_(menu), menu_model_(menu_model) {}
+ : menu_(menu),
+ menu_model_(menu_model) {}
TextButton* CreateAndConfigureButton(int string_id,
MenuButtonBackground::ButtonType type,
@@ -361,13 +357,15 @@ class WrenchMenuView : public ScheduleAllView, public views::ButtonListener {
button->set_tag(index);
button->SetEnabled(menu_model_->IsEnabledAt(index));
button->set_prefix_type(TextButton::PREFIX_HIDE);
- MenuButtonBackground* bg = new MenuButtonBackground(type);
+ MenuButtonBackground* bg =
+ new MenuButtonBackground(type, menu_->use_new_menu());
button->set_background(bg);
const MenuConfig& menu_config = menu_->GetMenuConfig();
button->SetEnabledColor(menu_config.text_color);
if (background)
*background = bg;
- button->set_border(new MenuButtonBorder(menu_config));
+ button->set_border(
+ new MenuButtonBorder(menu_config, menu_->use_new_menu()));
button->set_alignment(TextButton::ALIGN_CENTER);
button->SetFont(menu_config.font);
button->ClearMaxTextSize();
@@ -413,6 +411,13 @@ class ButtonContainerMenuItemView : public MenuItemView {
DISALLOW_COPY_AND_ASSIGN(ButtonContainerMenuItemView);
};
+bool IsAuraTheme(const ui::NativeTheme* theme) {
+#if defined(USE_AURA)
+ return theme == ui::NativeThemeAura::instance();
+#endif
+ return false;
+}
+
} // namespace
// CutCopyPasteView ------------------------------------------------------------
@@ -434,17 +439,14 @@ class WrenchMenu::CutCopyPasteView : public WrenchMenuView {
IDS_COPY, MenuButtonBackground::CENTER_BUTTON, copy_index,
&copy_background);
- bool is_new_menu = IsNewMenu();
-
TextButton* paste = CreateAndConfigureButton(
IDS_PASTE,
-#if !defined(OS_WIN)
- is_new_menu ? MenuButtonBackground::CENTER_BUTTON :
-#endif
+ menu_->use_new_menu() && menu_->supports_new_separators_ ?
+ MenuButtonBackground::CENTER_BUTTON :
MenuButtonBackground::RIGHT_BUTTON,
paste_index,
NULL);
- if (is_new_menu) {
+ if (menu_->use_new_menu()) {
cut->SetEnabledColor(kTouchButtonText);
copy->SetEnabledColor(kTouchButtonText);
paste->SetEnabledColor(kTouchButtonText);
@@ -517,16 +519,15 @@ class WrenchMenu::ZoomView : public WrenchMenuView,
zoom_label_->SetAutoColorReadabilityEnabled(false);
zoom_label_->SetHorizontalAlignment(Label::ALIGN_RIGHT);
- bool is_new_menu = IsNewMenu();
-
MenuButtonBackground* center_bg = new MenuButtonBackground(
-#if !defined(OS_WIN)
- is_new_menu ? MenuButtonBackground::RIGHT_BUTTON :
-#endif
- MenuButtonBackground::CENTER_BUTTON);
+ menu_->use_new_menu() && menu_->supports_new_separators_ ?
+ MenuButtonBackground::RIGHT_BUTTON :
+ MenuButtonBackground::CENTER_BUTTON,
+ menu_->use_new_menu());
zoom_label_->set_background(center_bg);
const MenuConfig& menu_config(menu->GetMenuConfig());
- zoom_label_->set_border(new MenuButtonBorder(menu_config));
+ zoom_label_->set_border(
+ new MenuButtonBorder(menu_config, menu->use_new_menu()));
zoom_label_->SetFont(menu_config.font);
AddChildView(zoom_label_);
@@ -543,7 +544,7 @@ class WrenchMenu::ZoomView : public WrenchMenuView,
ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
IDR_FULLSCREEN_MENU_BUTTON);
fullscreen_button_->SetImage(ImageButton::BS_NORMAL, full_screen_image);
- if (is_new_menu) {
+ if (menu_->use_new_menu()) {
zoom_label_->SetEnabledColor(kTouchButtonText);
decrement_button_->SetEnabledColor(kTouchButtonText);
increment_button_->SetEnabledColor(kTouchButtonText);
@@ -556,12 +557,13 @@ class WrenchMenu::ZoomView : public WrenchMenuView,
fullscreen_button_->set_tag(fullscreen_index);
fullscreen_button_->SetImageAlignment(
ImageButton::ALIGN_CENTER, ImageButton::ALIGN_MIDDLE);
- int horizontal_padding = IsNewMenu() ?
- kHorizontalTouchPadding : kHorizontalPadding;
+ int horizontal_padding =
+ menu_->use_new_menu() ? kHorizontalTouchPadding : kHorizontalPadding;
fullscreen_button_->set_border(views::Border::CreateEmptyBorder(
0, horizontal_padding, 0, horizontal_padding));
fullscreen_button_->set_background(
- new MenuButtonBackground(MenuButtonBackground::SINGLE_BUTTON));
+ new MenuButtonBackground(MenuButtonBackground::SINGLE_BUTTON,
+ menu_->use_new_menu()));
fullscreen_button_->SetAccessibleName(
GetAccessibleNameForWrenchMenuItem(
menu_model, fullscreen_index, IDS_ACCNAME_FULLSCREEN));
@@ -580,7 +582,7 @@ class WrenchMenu::ZoomView : public WrenchMenuView,
// The increment/decrement button are forced to the same width.
int button_width = std::max(increment_button_->GetPreferredSize().width(),
decrement_button_->GetPreferredSize().width());
- int zoom_padding = IsNewMenu() ? kTouchZoomPadding : kZoomPadding;
+ int zoom_padding = menu_->use_new_menu() ? kTouchZoomPadding : kZoomPadding;
int fullscreen_width = fullscreen_button_->GetPreferredSize().width() +
zoom_padding;
// Returned height doesn't matter as MenuItemView forces everything to the
@@ -608,11 +610,10 @@ class WrenchMenu::ZoomView : public WrenchMenuView,
bounds.set_width(button_width);
increment_button_->SetBoundsRect(bounds);
- bool is_new_menu = IsNewMenu();
- x += bounds.width() + (is_new_menu ? 0 : kZoomPadding);
+ x += bounds.width() + (menu_->use_new_menu() ? 0 : kZoomPadding);
bounds.set_x(x);
bounds.set_width(fullscreen_button_->GetPreferredSize().width() +
- (is_new_menu ? kTouchZoomPadding : 0));
+ (menu_->use_new_menu() ? kTouchZoomPadding : 0));
fullscreen_button_->SetBoundsRect(bounds);
}
@@ -714,14 +715,18 @@ class WrenchMenu::ZoomView : public WrenchMenuView,
// WrenchMenu ------------------------------------------------------------------
-WrenchMenu::WrenchMenu(Browser* browser)
+WrenchMenu::WrenchMenu(Browser* browser,
+ bool use_new_menu,
+ bool supports_new_separators)
: root_(NULL),
browser_(browser),
selected_menu_model_(NULL),
selected_index_(0),
bookmark_menu_(NULL),
feedback_menu_item_(NULL),
- first_bookmark_command_id_(0) {
+ first_bookmark_command_id_(0),
+ use_new_menu_(use_new_menu),
+ supports_new_separators_(supports_new_separators) {
registrar_.Add(this, chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
content::Source<Profile>(browser_->profile()));
}
@@ -973,8 +978,6 @@ void WrenchMenu::Observe(int type,
void WrenchMenu::PopulateMenu(MenuItemView* parent,
MenuModel* model,
int* next_id) {
- bool is_new_menu = IsNewMenu();
-
int index_offset = model->GetFirstItemIndex(NULL);
for (int i = 0, max = model->GetItemCount(); i < max; ++i) {
int index = i + index_offset;
@@ -982,7 +985,7 @@ void WrenchMenu::PopulateMenu(MenuItemView* parent,
// The button container menu items have a special height which we have to
// use instead of the normal height.
int height = 0;
- if (is_new_menu &&
+ if (use_new_menu_ &&
(model->GetCommandIdAt(index) == IDC_CUT ||
model->GetCommandIdAt(index) == IDC_ZOOM_MINUS))
height = kMenuItemContainingButtonsHeight;
@@ -1055,9 +1058,8 @@ MenuItemView* WrenchMenu::AppendMenuItem(MenuItemView* parent,
}
if (menu_item) {
- bool is_new_menu = IsNewMenu();
// Flush all buttons to the right side of the menu for the new menu type.
- menu_item->set_use_right_margin(!is_new_menu);
+ menu_item->set_use_right_margin(!use_new_menu_);
menu_item->SetVisible(model->IsVisibleAt(index));
if (menu_type == MenuModel::TYPE_COMMAND && model->HasIcons()) {
diff --git a/chrome/browser/ui/views/wrench_menu.h b/chrome/browser/ui/views/wrench_menu.h
index 059c191..c218b34 100644
--- a/chrome/browser/ui/views/wrench_menu.h
+++ b/chrome/browser/ui/views/wrench_menu.h
@@ -18,6 +18,10 @@
class BookmarkMenuDelegate;
class Browser;
+namespace ui {
+class NativeTheme;
+}
+
namespace views {
class MenuButton;
struct MenuConfig;
@@ -31,7 +35,10 @@ class WrenchMenu : public views::MenuDelegate,
public BaseBookmarkModelObserver,
public content::NotificationObserver {
public:
- explicit WrenchMenu(Browser* browser);
+ // TODO: remove |use_new_menu| and |supports_new_separators|.
+ WrenchMenu(Browser* browser,
+ bool use_new_menu,
+ bool supports_new_separators);
virtual ~WrenchMenu();
void Init(ui::MenuModel* model);
@@ -44,6 +51,8 @@ class WrenchMenu : public views::MenuDelegate,
const views::MenuConfig& GetMenuConfig() const;
+ bool use_new_menu() const { return use_new_menu_; }
+
// MenuDelegate overrides:
virtual string16 GetTooltipText(int id, const gfx::Point& p) const OVERRIDE;
virtual bool IsTriggerableEvent(views::MenuItemView* menu,
@@ -156,6 +165,10 @@ class WrenchMenu : public views::MenuDelegate,
content::NotificationRegistrar registrar_;
+ const bool use_new_menu_;
+
+ const bool supports_new_separators_;
+
DISALLOW_COPY_AND_ASSIGN(WrenchMenu);
};
diff --git a/ui/base/models/menu_separator_types.h b/ui/base/models/menu_separator_types.h
index 217bcee..32c573d 100644
--- a/ui/base/models/menu_separator_types.h
+++ b/ui/base/models/menu_separator_types.h
@@ -11,10 +11,13 @@ namespace ui {
enum MenuSeparatorType {
// Normal - top to bottom: Spacing, line, spacing
NORMAL_SEPARATOR,
+
// Upper - top to bottom: Line, spacing
UPPER_SEPARATOR,
+
// Lower - top to bottom: Spacing, line
LOWER_SEPARATOR,
+
// Spacing - top to bottom: Spacing only.
SPACING_SEPARATOR
};
diff --git a/ui/views/controls/menu/menu_config.cc b/ui/views/controls/menu/menu_config.cc
index 942114f..fbbd465 100644
--- a/ui/views/controls/menu/menu_config.cc
+++ b/ui/views/controls/menu/menu_config.cc
@@ -12,6 +12,7 @@ namespace views {
MenuConfig::MenuConfig(const ui::NativeTheme* theme)
: text_color(SK_ColorBLACK),
+ arrow_color(SK_ColorBLACK),
submenu_horizontal_margin_size(3),
submenu_vertical_margin_size(3),
submenu_horizontal_inset(3),
@@ -43,7 +44,8 @@ MenuConfig::MenuConfig(const ui::NativeTheme* theme)
show_accelerators(true),
always_use_icon_to_label_padding(false),
align_arrow_and_shortcut(false),
- offset_context_menus(false) {
+ offset_context_menus(false),
+ native_theme(theme) {
// Use 40px tall menu items when running in touch optimized mode.
// For Windows use 40px tall menu items when running in touch optimized mode.
if (ui::GetDisplayLayout() == ui::LAYOUT_TOUCH) {
diff --git a/ui/views/controls/menu/menu_config.h b/ui/views/controls/menu/menu_config.h
index 683a078..9be9921 100644
--- a/ui/views/controls/menu/menu_config.h
+++ b/ui/views/controls/menu/menu_config.h
@@ -29,6 +29,9 @@ struct VIEWS_EXPORT MenuConfig {
// Normal text color.
SkColor text_color;
+ // Color for the arrow to scroll bookmarks.
+ SkColor arrow_color;
+
// Submenu horizontal margin size.
int submenu_horizontal_margin_size;
@@ -121,6 +124,8 @@ struct VIEWS_EXPORT MenuConfig {
// True if the context menu's should be offset from the cursor position.
bool offset_context_menus;
+ const ui::NativeTheme* native_theme;
+
private:
// Configures a MenuConfig as appropriate for the current platform.
void Init(const ui::NativeTheme* theme);
diff --git a/ui/views/controls/menu/menu_config_views.cc b/ui/views/controls/menu/menu_config_views.cc
index 7a5c76d..4e53ed1 100644
--- a/ui/views/controls/menu/menu_config_views.cc
+++ b/ui/views/controls/menu/menu_config_views.cc
@@ -53,7 +53,7 @@ void MenuConfig::InitAura() {
const MenuConfig& MenuConfig::instance(const ui::NativeTheme* theme) {
static MenuConfig* views_instance = NULL;
if (!views_instance)
- views_instance = new MenuConfig(theme);
+ views_instance = new MenuConfig(ui::NativeTheme::instance());
return *views_instance;
}
#endif
diff --git a/ui/views/controls/menu/menu_config_win.cc b/ui/views/controls/menu/menu_config_win.cc
index 9b3b929..e0eb432 100644
--- a/ui/views/controls/menu/menu_config_win.cc
+++ b/ui/views/controls/menu/menu_config_win.cc
@@ -13,6 +13,7 @@
#include "base/win/win_util.h"
#include "ui/base/l10n/l10n_util_win.h"
#include "ui/base/native_theme/native_theme_win.h"
+#include "ui/gfx/color_utils.h"
#if defined(USE_AURA)
#include "ui/base/native_theme/native_theme_aura.h"
@@ -34,6 +35,8 @@ void MenuConfig::Init(const NativeTheme* theme) {
NativeThemeWin::MENU, MENU_POPUPITEM, MPI_NORMAL, TMT_TEXTCOLOR,
COLOR_MENUTEXT);
+ arrow_color = color_utils::GetSysSkColor(COLOR_MENUTEXT);
+
NONCLIENTMETRICS metrics;
base::win::GetNonClientMetrics(&metrics);
l10n_util::AdjustUIFont(&(metrics.lfMenuFont));
@@ -113,7 +116,7 @@ const MenuConfig& MenuConfig::instance(const ui::NativeTheme* theme) {
if (!theme || theme == NativeThemeWin::instance()) {
static MenuConfig* win_instance = NULL;
if (!win_instance)
- win_instance = new MenuConfig(theme);
+ win_instance = new MenuConfig(NativeThemeWin::instance());
return *win_instance;
}
static MenuConfig* views_instance = NULL;
diff --git a/ui/views/controls/menu/menu_item_view.h b/ui/views/controls/menu/menu_item_view.h
index c102c55..17cf889 100644
--- a/ui/views/controls/menu/menu_item_view.h
+++ b/ui/views/controls/menu/menu_item_view.h
@@ -345,6 +345,8 @@ class VIEWS_EXPORT MenuItemView : public View {
private:
friend class internal::MenuRunnerImpl; // For access to ~MenuItemView.
+ enum PaintButtonMode { PB_NORMAL, PB_FOR_DRAG };
+
// Calculates all sizes that we can from the OS.
//
// This is invoked prior to Running a menu.
@@ -382,7 +384,6 @@ class VIEWS_EXPORT MenuItemView : public View {
// Actual paint implementation. If mode is PB_FOR_DRAG, portions of the menu
// are not rendered.
- enum PaintButtonMode { PB_NORMAL, PB_FOR_DRAG };
void PaintButton(gfx::Canvas* canvas, PaintButtonMode mode);
#if defined(OS_WIN)
@@ -395,6 +396,10 @@ class VIEWS_EXPORT MenuItemView : public View {
const MenuConfig& config);
#endif
+#if defined(USE_AURA)
+ void PaintButtonAura(gfx::Canvas* canvas, PaintButtonMode mode);
+#endif
+
// Paints the accelerator.
void PaintAccelerator(gfx::Canvas* canvas);
diff --git a/ui/views/controls/menu/menu_item_view_views.cc b/ui/views/controls/menu/menu_item_view_views.cc
index 79fe29b..f26f646f 100644
--- a/ui/views/controls/menu/menu_item_view_views.cc
+++ b/ui/views/controls/menu/menu_item_view_views.cc
@@ -18,7 +18,13 @@
namespace views {
+#if !defined(OS_WIN)
void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
+ PaintButtonAura(canvas, mode);
+}
+#endif
+
+void MenuItemView::PaintButtonAura(gfx::Canvas* canvas, PaintButtonMode mode) {
const MenuConfig& config = GetMenuConfig();
bool render_selection =
(mode == PB_NORMAL && IsSelected() &&
diff --git a/ui/views/controls/menu/menu_item_view_win.cc b/ui/views/controls/menu/menu_item_view_win.cc
index a8b56e4..87a75ba 100644
--- a/ui/views/controls/menu/menu_item_view_win.cc
+++ b/ui/views/controls/menu/menu_item_view_win.cc
@@ -13,6 +13,10 @@
#include "ui/views/controls/menu/menu_config.h"
#include "ui/views/controls/menu/submenu_view.h"
+#if defined(USE_AURA)
+#include "ui/base/native_theme/native_theme_aura.h"
+#endif
+
using ui::NativeTheme;
namespace views {
@@ -20,6 +24,13 @@ namespace views {
void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
const MenuConfig& config = GetMenuConfig();
+#if defined(USE_AURA)
+ if (config.native_theme == ui::NativeThemeAura::instance()) {
+ PaintButtonAura(canvas, mode);
+ return;
+ }
+#endif
+
bool render_selection =
(mode == PB_NORMAL && IsSelected() &&
parent_menu_item_->GetSubmenu()->GetShowSelection(this) &&
@@ -53,11 +64,11 @@ void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
height());
AdjustBoundsForRTLUI(&gutter_bounds);
NativeTheme::ExtraParams extra;
- native_theme->Paint(canvas->sk_canvas(),
- NativeTheme::kMenuPopupGutter,
- NativeTheme::kNormal,
- gutter_bounds,
- extra);
+ config.native_theme->Paint(canvas->sk_canvas(),
+ NativeTheme::kMenuPopupGutter,
+ NativeTheme::kNormal,
+ gutter_bounds,
+ extra);
}
// Render the background.
@@ -66,7 +77,7 @@ void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
NativeTheme::ExtraParams extra;
extra.menu_item.is_selected = render_selection;
AdjustBoundsForRTLUI(&item_bounds);
- native_theme->Paint(canvas->sk_canvas(),
+ config.native_theme->Paint(canvas->sk_canvas(),
NativeTheme::kMenuItemBackground, control_state, item_bounds, extra);
}
@@ -121,7 +132,7 @@ void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
ui::NativeTheme::ExtraParams extra;
extra.menu_arrow.pointing_right = !base::i18n::IsRTL();
extra.menu_arrow.is_selected = render_selection;
- native_theme->Paint(canvas->sk_canvas(),
+ config.native_theme->Paint(canvas->sk_canvas(),
ui::NativeTheme::kMenuPopupArrow, control_state, arrow_bounds, extra);
}
}
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc
index 79a16cd..ccdf93a7 100644
--- a/ui/views/controls/menu/menu_scroll_view_container.cc
+++ b/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -15,7 +15,6 @@
#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/native_theme/native_theme.h"
#include "ui/gfx/canvas.h"
-#include "ui/gfx/color_utils.h"
#include "ui/views/border.h"
#include "ui/views/controls/menu/menu_config.h"
#include "ui/views/controls/menu/menu_controller.h"
@@ -87,11 +86,6 @@ class MenuScrollButton : public View {
GetNativeTheme()->Paint(canvas->sk_canvas(),
NativeTheme::kMenuItemBackground,
NativeTheme::kNormal, item_bounds, extra);
-#if defined(OS_WIN)
- SkColor arrow_color = color_utils::GetSysSkColor(COLOR_MENUTEXT);
-#else
- SkColor arrow_color = SK_ColorBLACK;
-#endif
// Then the arrow.
int x = width() / 2;
@@ -116,7 +110,7 @@ class MenuScrollButton : public View {
SkPaint paint;
paint.setStyle(SkPaint::kFill_Style);
paint.setAntiAlias(true);
- paint.setColor(arrow_color);
+ paint.setColor(config.arrow_color);
canvas->DrawPath(path, paint);
}
@@ -198,16 +192,10 @@ void MenuScrollViewContainer::OnPaintBackground(gfx::Canvas* canvas) {
return;
}
-#if defined(OS_WIN)
- HDC dc = canvas->BeginPlatformPaint();
-#endif
gfx::Rect bounds(0, 0, width(), height());
NativeTheme::ExtraParams extra;
GetNativeTheme()->Paint(canvas->sk_canvas(),
NativeTheme::kMenuPopupBackground, NativeTheme::kNormal, bounds, extra);
-#if defined(OS_WIN)
- canvas->EndPlatformPaint();
-#endif
}
void MenuScrollViewContainer::Layout() {
diff --git a/ui/views/controls/menu/menu_separator.h b/ui/views/controls/menu/menu_separator.h
index 3833177..4098ae8 100644
--- a/ui/views/controls/menu/menu_separator.h
+++ b/ui/views/controls/menu/menu_separator.h
@@ -16,14 +16,19 @@ class MenuItemView;
class MenuSeparator : public View {
public:
MenuSeparator(MenuItemView* parent, ui::MenuSeparatorType type)
- : type_(type),
- parent_menu_item_(parent) {}
+ : type_(type),
+ parent_menu_item_(parent) {}
// View overrides.
virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
virtual gfx::Size GetPreferredSize() OVERRIDE;
private:
+#if defined(USE_AURA)
+ void OnPaintAura(gfx::Canvas* canvas);
+ gfx::Size GetPreferredSizeAura();
+#endif
+
// The type of the separator.
const ui::MenuSeparatorType type_;
diff --git a/ui/views/controls/menu/menu_separator_views.cc b/ui/views/controls/menu/menu_separator_views.cc
index e2082e6..43a7632 100644
--- a/ui/views/controls/menu/menu_separator_views.cc
+++ b/ui/views/controls/menu/menu_separator_views.cc
@@ -18,7 +18,17 @@ const int kSeparatorHeight = 1;
namespace views {
+#if !defined(OS_WIN)
void MenuSeparator::OnPaint(gfx::Canvas* canvas) {
+ OnPaintAura(canvas);
+}
+
+gfx::Size MenuSeparator::GetPreferredSize() {
+ return GetPreferredSizeAura();
+}
+#endif
+
+void MenuSeparator::OnPaintAura(gfx::Canvas* canvas) {
int pos = 0;
switch (type_) {
case ui::LOWER_SEPARATOR:
@@ -37,7 +47,7 @@ void MenuSeparator::OnPaint(gfx::Canvas* canvas) {
ui::NativeTheme::kColorId_MenuSeparatorColor));
}
-gfx::Size MenuSeparator::GetPreferredSize() {
+gfx::Size MenuSeparator::GetPreferredSizeAura() {
const MenuConfig& menu_config = parent_menu_item_->GetMenuConfig();
int height = menu_config.separator_height;
switch(type_) {
diff --git a/ui/views/controls/menu/menu_separator_win.cc b/ui/views/controls/menu/menu_separator_win.cc
index 51e5e93..7a3d8f9 100644
--- a/ui/views/controls/menu/menu_separator_win.cc
+++ b/ui/views/controls/menu/menu_separator_win.cc
@@ -14,13 +14,24 @@
#include "ui/views/controls/menu/menu_config.h"
#include "ui/views/controls/menu/menu_item_view.h"
+#if defined(USE_AURA)
+#include "ui/base/native_theme/native_theme_aura.h"
+#endif
+
namespace views {
void MenuSeparator::OnPaint(gfx::Canvas* canvas) {
const MenuConfig& config = parent_menu_item_->GetMenuConfig();
+
+#if defined(USE_AURA)
+ if (config.native_theme == ui::NativeThemeAura::instance()) {
+ OnPaintAura(canvas);
+ return;
+ }
+#endif
+
// The gutter is rendered before the background.
int start_x = 0;
- const ui::NativeTheme* theme = GetNativeTheme();
if (config.render_gutter) {
// If render_gutter is true, we're on Vista and need to render the
// gutter, then indent the separator from the gutter.
@@ -28,21 +39,30 @@ void MenuSeparator::OnPaint(gfx::Canvas* canvas) {
config.gutter_to_label - config.gutter_width, 0,
config.gutter_width, height());
ui::NativeTheme::ExtraParams extra;
- theme->Paint(canvas->sk_canvas(), ui::NativeTheme::kMenuPopupGutter,
- ui::NativeTheme::kNormal, gutter_bounds, extra);
+ config.native_theme->Paint(
+ canvas->sk_canvas(), ui::NativeTheme::kMenuPopupGutter,
+ ui::NativeTheme::kNormal, gutter_bounds, extra);
start_x = gutter_bounds.x() + config.gutter_width;
}
gfx::Rect separator_bounds(start_x, 0, width(), height());
ui::NativeTheme::ExtraParams extra;
extra.menu_separator.has_gutter = config.render_gutter;
- theme->Paint(canvas->sk_canvas(), ui::NativeTheme::kMenuPopupSeparator,
- ui::NativeTheme::kNormal, separator_bounds, extra);
+ config.native_theme->Paint(
+ canvas->sk_canvas(), ui::NativeTheme::kMenuPopupSeparator,
+ ui::NativeTheme::kNormal, separator_bounds, extra);
}
gfx::Size MenuSeparator::GetPreferredSize() {
+ const MenuConfig& config = parent_menu_item_->GetMenuConfig();
+
+#if defined(USE_AURA)
+ if (config.native_theme == ui::NativeThemeAura::instance())
+ return GetPreferredSizeAura();
+#endif
+
return gfx::Size(10, // Just in case we're the only item in a menu.
- parent_menu_item_->GetMenuConfig().separator_height);
+ config.separator_height);
}
} // namespace views
diff --git a/ui/views/views.gyp b/ui/views/views.gyp
index 553c015..2b2e67e 100644
--- a/ui/views/views.gyp
+++ b/ui/views/views.gyp
@@ -486,6 +486,8 @@
['use_aura==1 and OS=="win"', {
'sources/': [
['include', 'controls/menu/menu_config_win.cc'],
+ ['include', 'controls/menu/menu_item_view_win.cc'],
+ ['include', 'controls/menu/menu_separator_win.cc'],
],
}],
['OS=="win"', {