diff options
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, ©_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"', { |