15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/wrench_menu.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/host_zoom_map.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/canvas_image_source.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/text_utils.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/background.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/image_button.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/menu_button.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_config.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_item_view.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_runner.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_scroll_view_container.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/submenu_view.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_aura.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::HostZoomMap; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::MenuModel; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::CustomButton; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::ImageButton; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::Label; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using views::LabelButton; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::MenuConfig; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::MenuItemView; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::View; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Colors used for buttons. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kEnabledTouchBackgroundColor = SkColorSetARGB(247, 255, 255, 255); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kHoverTouchBackgroundColor = SkColorSetARGB(247, 242, 242, 242); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kFocusedTouchBackgroundColor = SkColorSetARGB(247, 235, 235, 235); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kTouchButtonText = 0xff5a5a5a; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Horizontal padding on the edges of the buttons. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kHorizontalPadding = 6; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Horizontal padding for a touch enabled menu. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kHorizontalTouchPadding = 15; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Menu items which have embedded buttons should have this height in pixel. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMenuItemContainingButtonsHeight = 43; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass of ImageButton whose preferred size includes the size of the border. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullscreenButton : public ImageButton { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FullscreenButton(views::ButtonListener* listener) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ImageButton(listener) { } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ImageButton. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size pref = ImageButton::GetPreferredSize(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (border()) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Insets insets = border()->GetInsets(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref.Enlarge(insets.width(), insets.height()); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pref; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FullscreenButton); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Border for buttons contained in the menu. This is only used for getting the 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// insets, the actual painting is done in MenuButtonBackground. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuButtonBorder : public views::Border { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBorder(const MenuConfig& config, bool use_new_menu) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : horizontal_padding_(use_new_menu ? 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHorizontalTouchPadding : kHorizontalPadding), 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) insets_(config.item_top_margin, horizontal_padding_, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.item_bottom_margin, horizontal_padding_) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::Border. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Painting of border is done in MenuButtonBackground. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Insets GetInsets() const OVERRIDE { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return insets_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The horizontal padding dependent on the layout. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int horizontal_padding_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Insets insets_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MenuButtonBorder); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Combination border/background for the buttons contained in the menu. The 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// painting of the border/background is done here as TextButton does not always 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// paint the border. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuButtonBackground : public views::Background { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ButtonType { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LEFT_BUTTON, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CENTER_BUTTON, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RIGHT_BUTTON, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SINGLE_BUTTON, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground(ButtonType type, bool use_new_menu) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_new_menu_(use_new_menu), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_button_(NULL), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_button_(NULL) {} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used when the type is CENTER_BUTTON to determine if the left/right edge 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // needs to be rendered selected. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetOtherButtons(CustomButton* left_button, CustomButton* right_button) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::i18n::IsRTL()) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_button_ = right_button; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_button_ = left_button; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_button_ = left_button; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_button_ = right_button; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::Background. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Paint(gfx::Canvas* canvas, View* view) const OVERRIDE { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton::ButtonState state = 170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (!strcmp(view->GetClassName(), views::Label::kViewClassName)) ? 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CustomButton::STATE_NORMAL : static_cast<CustomButton*>(view)->state(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w = view->width(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h = view->height(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_new_menu_ && 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->GetNativeTheme() == ui::NativeThemeAura::instance()) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Normal buttons get a border drawn on the right side and the rest gets 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // filled in. The left button however does not get a line to combine 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buttons. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int border = 0; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type_ != RIGHT_BUTTON) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) border = 1; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->FillRect(gfx::Rect(0, 0, border, h), 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BorderColor(view, CustomButton::STATE_NORMAL)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->FillRect(gfx::Rect(border, 0, w - border, h), 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_background_color(state)); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkColor background = BackgroundColor(view, state); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkColor border = BorderColor(view, state); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (TypeAdjustedForRTL()) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LEFT_BUTTON: 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(1, 1, w, h - 2), background); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(2, 0, w, 1), border); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(1, 1, 1, 1), border); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(0, 2, 1, h - 4), border); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(1, h - 2, 1, 1), border); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(2, h - 1, w, 1), border); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CENTER_BUTTON: { 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(1, 1, w - 2, h - 2), background); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor left_color = state != CustomButton::STATE_NORMAL ? 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) border : BorderColor(view, left_button_->state()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->FillRect(gfx::Rect(0, 0, 1, h), left_color); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(1, 0, w - 2, 1), border); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(1, h - 1, w - 2, 1), 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) border); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor right_color = state != CustomButton::STATE_NORMAL ? 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) border : BorderColor(view, right_button_->state()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->FillRect(gfx::Rect(w - 1, 0, 1, h), right_color); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case RIGHT_BUTTON: 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(0, 1, w - 1, h - 2), background); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(0, 0, w - 2, 1), border); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(w - 2, 1, 1, 1), border); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(w - 1, 2, 1, h - 4), border); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(w - 2, h - 2, 1, 1), border); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(0, h - 1, w - 2, 1), border); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SINGLE_BUTTON: 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(1, 1, w - 2, h - 2), background); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(2, 0, w - 4, 1), border); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(1, 1, 1, 1), border); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(0, 2, 1, h - 4), border); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(1, h - 2, 1, 1), border); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(2, h - 1, w - 4, 1), border); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(w - 2, 1, 1, 1), border); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(w - 1, 2, 1, h - 4), border); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(gfx::Rect(w - 2, h - 2, 1, 1), border); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static SkColor BorderColor(View* view, CustomButton::ButtonState state) { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme* theme = view->GetNativeTheme(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CustomButton::STATE_HOVERED: 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return theme->GetSystemColor( 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_HoverMenuButtonBorderColor); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CustomButton::STATE_PRESSED: 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return theme->GetSystemColor( 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_FocusedMenuButtonBorderColor); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return theme->GetSystemColor( 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_EnabledMenuButtonBorderColor); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static SkColor BackgroundColor(View* view, CustomButton::ButtonState state) { 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme* theme = view->GetNativeTheme(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CustomButton::STATE_HOVERED: 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return theme->GetSystemColor( 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_HoverMenuItemBackgroundColor); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CustomButton::STATE_PRESSED: 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return theme->GetSystemColor( 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_FocusedMenuItemBackgroundColor); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return theme->GetSystemColor( 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_MenuBackgroundColor); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static SkColor touch_background_color(CustomButton::ButtonState state) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CustomButton::STATE_HOVERED: return kHoverTouchBackgroundColor; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CustomButton::STATE_PRESSED: return kFocusedTouchBackgroundColor; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: return kEnabledTouchBackgroundColor; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ButtonType TypeAdjustedForRTL() const { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::i18n::IsRTL()) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return type_; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type_) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LEFT_BUTTON: return RIGHT_BUTTON; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case RIGHT_BUTTON: return LEFT_BUTTON; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: break; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return type_; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ButtonType type_; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool use_new_menu_; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See description above setter for details. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton* left_button_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton* right_button_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MenuButtonBackground); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 GetAccessibleNameForWrenchMenuItem( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuModel* model, int item_index, int accessible_string_id) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 accessible_name = l10n_util::GetStringUTF16(accessible_string_id); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 accelerator_text; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator menu_accelerator; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model->GetAcceleratorAt(item_index, &menu_accelerator)) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_text = 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator(menu_accelerator.key_code(), 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_accelerator.modifiers()).GetShortcutText(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MenuItemView::GetAccessibleNameForMenuItem( 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accessible_name, accelerator_text); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WrenchMenuView is a view that can contain label buttons. 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WrenchMenuView : public views::View, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public views::ButtonListener { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WrenchMenuView(WrenchMenu* menu, MenuModel* menu_model) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : menu_(menu), 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_model_(menu_model) {} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::View. 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SchedulePaintInRect(const gfx::Rect& r) OVERRIDE { 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Normally when the mouse enters/exits a button the buttons invokes 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SchedulePaint. As part of the button border (MenuButtonBackground) is 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // rendered by the button to the left/right of it SchedulePaint on the the 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // button may not be enough, so this forces a paint all. 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View::SchedulePaintInRect(gfx::Rect(size())); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* CreateAndConfigureButton(int string_id, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground::ButtonType type, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground** background) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateButtonWithAccName( 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_id, type, index, background, string_id); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* CreateButtonWithAccName(int string_id, 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MenuButtonBackground::ButtonType type, 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index, 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MenuButtonBackground** background, 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int acc_string_id) { 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* button = new LabelButton(this, gfx::RemoveAcceleratorChar( 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(string_id), '&', NULL, NULL)); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button->SetAccessibleName( 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAccessibleNameForWrenchMenuItem(menu_model_, index, acc_string_id)); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button->set_focusable(true); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button->set_request_focus_on_press(false); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button->set_tag(index); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button->SetEnabled(menu_model_->IsEnabledAt(index)); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground* bg = 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MenuButtonBackground(type, menu_->use_new_menu()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button->set_background(bg); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuConfig& menu_config = menu_->GetMenuConfig(); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button->SetTextColor(views::Button::STATE_NORMAL, menu_config.text_color); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (background) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *background = bg; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button->set_border( 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MenuButtonBorder(menu_config, menu_->use_new_menu())); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button->SetHorizontalAlignment(gfx::ALIGN_CENTER); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button->SetFont(menu_config.font); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(button); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return button; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hosting WrenchMenu. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WrenchMenu* menu_; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The menu model containing the increment/decrement/reset items. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuModel* menu_model_; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WrenchMenuView); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ButtonContainerMenuItemView : public MenuItemView { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructor for use with button containing menu items which have a 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different height then normal items. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ButtonContainerMenuItemView(MenuItemView* parent, int id, int height) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MenuItemView(parent, id, MenuItemView::NORMAL), 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) height_(height) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from MenuItemView. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetChildPreferredSize() OVERRIDE { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = MenuItemView::GetChildPreferredSize(); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When there is a height override given, we need to deduct our spacing 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // above and below to get to the correct height to return here for the 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // child item. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height = height_ - GetTopMargin() - GetBottomMargin(); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (height > size.height()) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.set_height(height); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height_; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ButtonContainerMenuItemView); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CutCopyPasteView ------------------------------------------------------------ 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CutCopyPasteView is the view containing the cut/copy/paste buttons. 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WrenchMenu::CutCopyPasteView : public WrenchMenuView { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CutCopyPasteView(WrenchMenu* menu, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuModel* menu_model, 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::NativeTheme* native_theme, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cut_index, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copy_index, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int paste_index) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : WrenchMenuView(menu, menu_model) { 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* cut = CreateAndConfigureButton( 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_CUT, MenuButtonBackground::LEFT_BUTTON, cut_index, NULL); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground* copy_background = NULL; 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* copy = CreateAndConfigureButton( 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_COPY, MenuButtonBackground::CENTER_BUTTON, copy_index, 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ©_background); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* paste = CreateAndConfigureButton( 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_PASTE, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_->use_new_menu() && menu_->supports_new_separators_ ? 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground::CENTER_BUTTON : 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground::RIGHT_BUTTON, 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paste_index, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (menu_->use_new_menu()) { 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cut->SetTextColor(views::Button::STATE_NORMAL, kTouchButtonText); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy->SetTextColor(views::Button::STATE_NORMAL, kTouchButtonText); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paste->SetTextColor(views::Button::STATE_NORMAL, kTouchButtonText); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor text_color = native_theme->GetSystemColor( 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_EnabledMenuItemForegroundColor); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cut->SetTextColor(views::Button::STATE_NORMAL, text_color); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy->SetTextColor(views::Button::STATE_NORMAL, text_color); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paste->SetTextColor(views::Button::STATE_NORMAL, text_color); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy_background->SetOtherButtons(cut, paste); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returned height doesn't matter as MenuItemView forces everything to the 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // height of the menuitemview. 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(GetMaxChildViewPreferredWidth() * child_count(), 0); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All buttons are given the same width. 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width = GetMaxChildViewPreferredWidth(); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < child_count(); ++i) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_at(i)->SetBounds(i * width, 0, width, height()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ButtonListener. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) OVERRIDE { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_->CancelAndEvaluate(menu_model_, sender->tag()); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the max preferred width of all the children. 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetMaxChildViewPreferredWidth() { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width = 0; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < child_count(); ++i) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width = std::max(width, child_at(i)->GetPreferredSize().width()); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return width; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CutCopyPasteView); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ZoomView -------------------------------------------------------------------- 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Padding between the increment buttons and the reset button. 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kZoomPadding = 6; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTouchZoomPadding = 14; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ZoomView contains the various zoom controls: two buttons to increase/decrease 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the zoom, a label showing the current zoom percent, and a button to go 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// full-screen. 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WrenchMenu::ZoomView : public WrenchMenuView { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZoomView(WrenchMenu* menu, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuModel* menu_model, 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::NativeTheme* native_theme, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int decrement_index, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int increment_index, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fullscreen_index) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : WrenchMenuView(menu, menu_model), 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_index_(fullscreen_index), 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zoom_callback_(base::Bind(&WrenchMenu::ZoomView::OnZoomLevelChanged, 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))), 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) increment_button_(NULL), 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_(NULL), 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_button_(NULL), 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_(NULL), 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_width_(0) { 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostZoomMap::GetForBrowserContext( 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu_->browser_->profile())->AddZoomLevelChangedCallback( 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zoom_callback_); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_button_ = CreateButtonWithAccName( 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ZOOM_MINUS2, MenuButtonBackground::LEFT_BUTTON, decrement_index, 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, IDS_ACCNAME_ZOOM_MINUS2); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_ = new Label( 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16Int(IDS_ZOOM_PERCENT, 100)); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_->SetAutoColorReadabilityEnabled(false); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_->SetHorizontalAlignment(gfx::ALIGN_RIGHT); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground* center_bg = new MenuButtonBackground( 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_->use_new_menu() && menu_->supports_new_separators_ ? 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground::RIGHT_BUTTON : 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButtonBackground::CENTER_BUTTON, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_->use_new_menu()); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_->set_background(center_bg); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuConfig& menu_config(menu->GetMenuConfig()); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_->set_border( 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MenuButtonBorder(menu_config, menu->use_new_menu())); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_->SetFont(menu_config.font); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(zoom_label_); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_width_ = MaxWidthForZoomLabel(); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) increment_button_ = CreateButtonWithAccName( 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ZOOM_PLUS2, MenuButtonBackground::RIGHT_BUTTON, increment_index, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, IDS_ACCNAME_ZOOM_PLUS2); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center_bg->SetOtherButtons(decrement_button_, increment_button_); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_ = new FullscreenButton(this); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* full_screen_image = 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_FULLSCREEN_MENU_BUTTON); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_button_->SetImage(ImageButton::STATE_NORMAL, full_screen_image); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (menu_->use_new_menu()) { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_->SetEnabledColor(kTouchButtonText); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrement_button_->SetTextColor(views::Button::STATE_NORMAL, 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTouchButtonText); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) increment_button_->SetTextColor(views::Button::STATE_NORMAL, 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTouchButtonText); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor enabled_text_color = native_theme->GetSystemColor( 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_EnabledMenuItemForegroundColor); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zoom_label_->SetEnabledColor(enabled_text_color); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrement_button_->SetTextColor(views::Button::STATE_NORMAL, 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_text_color); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) increment_button_->SetTextColor(views::Button::STATE_NORMAL, 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_text_color); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor disabled_text_color = native_theme->GetSystemColor( 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_DisabledMenuItemForegroundColor); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrement_button_->SetTextColor(views::Button::STATE_DISABLED, 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disabled_text_color); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) increment_button_->SetTextColor(views::Button::STATE_DISABLED, 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disabled_text_color); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_->set_focusable(true); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_->set_request_focus_on_press(false); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_->set_tag(fullscreen_index); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_->SetImageAlignment( 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageButton::ALIGN_CENTER, ImageButton::ALIGN_MIDDLE); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int horizontal_padding = 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_->use_new_menu() ? kHorizontalTouchPadding : kHorizontalPadding; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_->set_border(views::Border::CreateEmptyBorder( 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, horizontal_padding, 0, horizontal_padding)); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_->set_background( 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MenuButtonBackground(MenuButtonBackground::SINGLE_BUTTON, 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_->use_new_menu())); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_->SetAccessibleName( 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAccessibleNameForWrenchMenuItem( 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_model, fullscreen_index, IDS_ACCNAME_FULLSCREEN)); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(fullscreen_button_); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateZoomControls(); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ZoomView() { 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostZoomMap::GetForBrowserContext( 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu_->browser_->profile())->RemoveZoomLevelChangedCallback( 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zoom_callback_); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The increment/decrement button are forced to the same width. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int button_width = std::max(increment_button_->GetPreferredSize().width(), 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_button_->GetPreferredSize().width()); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int zoom_padding = menu_->use_new_menu() ? kTouchZoomPadding : kZoomPadding; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fullscreen_width = fullscreen_button_->GetPreferredSize().width() + 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_padding; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returned height doesn't matter as MenuItemView forces everything to the 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // height of the menuitemview. Note that we have overridden the height when 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constructing the menu. 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(button_width + zoom_label_width_ + button_width + 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_width, 0); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE { 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x = 0; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int button_width = std::max(increment_button_->GetPreferredSize().width(), 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_button_->GetPreferredSize().width()); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(0, 0, button_width, height()); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_button_->SetBoundsRect(bounds); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x += bounds.width(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x(x); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_width(zoom_label_width_); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_->SetBoundsRect(bounds); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x += bounds.width(); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x(x); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_width(button_width); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) increment_button_->SetBoundsRect(bounds); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x += bounds.width() + (menu_->use_new_menu() ? 0 : kZoomPadding); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x(x); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_width(fullscreen_button_->GetPreferredSize().width() + 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (menu_->use_new_menu() ? kTouchZoomPadding : 0)); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_button_->SetBoundsRect(bounds); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ButtonListener. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) OVERRIDE { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender->tag() == fullscreen_index_) { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_->CancelAndEvaluate(menu_model_, sender->tag()); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Zoom buttons don't close the menu. 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_model_->ActivatedAt(sender->tag()); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnZoomLevelChanged(const HostZoomMap::ZoomLevelChange& change) { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateZoomControls(); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateZoomControls() { 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enable_increment = false; 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enable_decrement = false; 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* selected_tab = 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu_->browser_->tab_strip_model()->GetActiveWebContents(); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int zoom = 100; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (selected_tab) 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zoom = selected_tab->GetZoomPercent(&enable_increment, &enable_decrement); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) increment_button_->SetEnabled(enable_increment); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrement_button_->SetEnabled(enable_decrement); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_->SetText( 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16Int(IDS_ZOOM_PERCENT, zoom)); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_label_width_ = MaxWidthForZoomLabel(); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculates the max width the zoom string can be. 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int MaxWidthForZoomLabel() { 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Font font = zoom_label_->font(); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int border_width = 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zoom_label_->border() ? zoom_label_->border()->GetInsets().width() : 0; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_w = 0; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* selected_tab = 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu_->browser_->tab_strip_model()->GetActiveWebContents(); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_tab) { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int min_percent = selected_tab->GetMinimumZoomPercent(); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_percent = selected_tab->GetMaximumZoomPercent(); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int step = (max_percent - min_percent) / 10; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = min_percent; i <= max_percent; i += step) { 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w = font.GetStringWidth( 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16Int(IDS_ZOOM_PERCENT, i)); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_w = std::max(w, max_w); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_w = font.GetStringWidth( 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16Int(IDS_ZOOM_PERCENT, 100)); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_w + border_width; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Index of the fullscreen menu item in the model. 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int fullscreen_index_; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::HostZoomMap::ZoomLevelChangedCallback zoom_callback_; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Button for incrementing the zoom. 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* increment_button_; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Label showing zoom as a percent. 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Label* zoom_label_; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Button for decrementing the zoom. 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* decrement_button_; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageButton* fullscreen_button_; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Width given to |zoom_label_|. This is the width at 100%. 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int zoom_label_width_; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ZoomView); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RecentTabsMenuModelDelegate ------------------------------------------------- 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Provides the ui::MenuModelDelegate implementation for RecentTabsSubMenuModel 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// items. 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WrenchMenu::RecentTabsMenuModelDelegate : public ui::MenuModelDelegate { 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecentTabsMenuModelDelegate(ui::MenuModel* model, 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::MenuItemView* menu_item) 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : model_(model), 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu_item_(menu_item) { 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->SetMenuModelDelegate(this); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~RecentTabsMenuModelDelegate() { 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->SetMenuModelDelegate(NULL); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ui::MenuModelDelegate implementation: 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnIconChanged(int index) OVERRIDE { 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |index| specifies position in children items of |menu_item_| starting at 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 0, its corresponding command id as used in the children menu item views 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // follows that of the parent menu item view |menu_item_|. 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int command_id = menu_item_->GetCommand() + 1 + index; 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::MenuItemView* item = menu_item_->GetMenuItemByID(command_id); 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(item); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Image icon; 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (model_->GetIconAt(index, &icon)) 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item->SetIcon(*icon.ToImageSkia()); 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Return the specific menu width of recent tab menu item if |command_id| 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // refers to one of recent tabs menu items, else return -1. 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int GetMaxWidthForMenu(MenuItemView* menu) { 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::SubmenuView* submenu = menu_item_->GetSubmenu(); 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!submenu) 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxMenuItemWidth = 320; 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return menu->GetCommand() >= menu_item_->GetCommand() && 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu->GetCommand() <= 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu_item_->GetCommand() + submenu->GetMenuItemCount() ? 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kMaxMenuItemWidth : -1; 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const gfx::Font* GetLabelFontAt(int index) const { 7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return model_->GetLabelFontAt(index); 7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 7687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool GetForegroundColor(int command_id, 7707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool is_hovered, 7717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SkColor* override_color) const { 7727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The items for which we get a font, should be shown in black. 7737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (GetLabelFontAt(command_id)) { 7747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *override_color = SK_ColorBLACK; 7757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 7767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 7777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 7787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 7797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::MenuModel* model_; 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::MenuItemView* menu_item_; 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RecentTabsMenuModelDelegate); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WrenchMenu ------------------------------------------------------------------ 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WrenchMenu::WrenchMenu(Browser* browser, 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_new_menu, 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool supports_new_separators) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : root_(NULL), 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_(browser), 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_menu_model_(NULL), 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_index_(0), 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_(NULL), 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) feedback_menu_item_(NULL), 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_bookmark_command_id_(0), 7997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) first_recent_tabs_command_id_(-1), 8007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_recent_tabs_command_id_(-1), 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_new_menu_(use_new_menu), 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supports_new_separators_(supports_new_separators) { 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(browser_->profile())); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WrenchMenu::~WrenchMenu() { 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bookmark_menu_delegate_.get()) { 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model = BookmarkModelFactory::GetForProfile( 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_->profile()); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->RemoveObserver(this); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::Init(ui::MenuModel* model) { 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!root_); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_ = new MenuItemView(this); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_->set_has_icons(true); // We have checks, radios and icons, set this 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we get the taller menu style. 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int next_id = 1; 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopulateMenu(root_, model, &next_id); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_bookmark_command_id_ = next_id + 1; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_runner_.reset(new views::MenuRunner(root_)); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::RunMenu(views::MenuButton* host) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_loc; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ConvertPointToScreen(host, &screen_loc); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(screen_loc, host->size()); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(UserMetricsAction("ShowAppMenu")); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (menu_runner_->RunMenuAt(host->GetWidget(), host, bounds, 8337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MenuItemView::TOPRIGHT, ui::MENU_SOURCE_NONE, 8347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) views::MenuRunner::HAS_MNEMONICS) == 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::MenuRunner::MENU_DELETED) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bookmark_menu_delegate_.get()) { 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model = BookmarkModelFactory::GetForProfile( 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_->profile()); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->RemoveObserver(this); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_menu_model_) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_menu_model_->ActivatedAt(selected_index_); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::IsShowing() { 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return menu_runner_.get() && menu_runner_->IsRunning(); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const ui::NativeTheme* WrenchMenu::GetNativeTheme() const { 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* browser_widget = views::Widget::GetWidgetForNativeView( 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_->window()->GetNativeWindow()); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(browser_widget); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser_widget->GetNativeTheme(); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const views::MenuConfig& WrenchMenu::GetMenuConfig() const { 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MenuConfig::instance(GetNativeTheme()); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const gfx::Font* WrenchMenu::GetLabelFont(int index) const { 8637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (is_recent_tabs_command(index)) { 8647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return recent_tabs_menu_model_delegate_->GetLabelFontAt( 8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index - first_recent_tabs_command_id_); 8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return NULL; 8687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool WrenchMenu::GetForegroundColor(int command_id, 8717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool is_hovered, 8727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SkColor* override_color) const { 8737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (is_recent_tabs_command(command_id)) { 8747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return recent_tabs_menu_model_delegate_->GetForegroundColor( 8757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) command_id - first_recent_tabs_command_id_, 8767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) is_hovered, 8777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) override_color); 8787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 8797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 8807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 WrenchMenu::GetTooltipText(int id, 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& p) const { 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_bookmark_command(id) ? 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->GetTooltipText(id, p) : string16(); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::IsTriggerableEvent(views::MenuItemView* menu, 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& e) { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_bookmark_command(menu->GetCommand()) ? 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->IsTriggerableEvent(menu, e) : 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuDelegate::IsTriggerableEvent(menu, e); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::GetDropFormats( 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* menu, 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* formats, 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<ui::OSExchangeData::CustomFormat>* custom_formats) { 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateBookmarkMenu(); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bookmark_menu_delegate_.get() && 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->GetDropFormats(menu, formats, custom_formats); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::AreDropTypesRequired(MenuItemView* menu) { 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateBookmarkMenu(); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bookmark_menu_delegate_.get() && 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->AreDropTypesRequired(menu); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::CanDrop(MenuItemView* menu, 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::OSExchangeData& data) { 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateBookmarkMenu(); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bookmark_menu_delegate_.get() && 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->CanDrop(menu, data); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WrenchMenu::GetDropOperation( 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* item, 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::DropTargetEvent& event, 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropPosition* position) { 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_bookmark_command(item->GetCommand()) ? 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->GetDropOperation(item, event, position) : 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DRAG_NONE; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WrenchMenu::OnPerformDrop(MenuItemView* menu, 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropPosition position, 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::DropTargetEvent& event) { 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_bookmark_command(menu->GetCommand())) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::DragDropTypes::DRAG_NONE; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = bookmark_menu_delegate_->OnPerformDrop(menu, position, event); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::ShowContextMenu(MenuItemView* source, 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& p, 9397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::MenuSourceType source_type) { 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_bookmark_command(id) ? 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->ShowContextMenu(source, id, p, 9427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) source_type) : 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::CanDrag(MenuItemView* menu) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_bookmark_command(menu->GetCommand()) ? 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->CanDrag(menu) : false; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::WriteDragData(MenuItemView* sender, 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData* data) { 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(is_bookmark_command(sender->GetCommand())); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bookmark_menu_delegate_->WriteDragData(sender, data); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WrenchMenu::GetDragOperations(MenuItemView* sender) { 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_bookmark_command(sender->GetCommand()) ? 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->GetDragOperations(sender) : 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuDelegate::GetDragOperations(sender); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WrenchMenu::GetMaxWidthForMenu(MenuItemView* menu) { 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_bookmark_command(menu->GetCommand())) 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bookmark_menu_delegate_->GetMaxWidthForMenu(menu); 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_width = -1; 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If recent tabs menu is available, it will decide if |menu| is one of recent 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tabs; if yes, it would return the menu width for recent tabs. 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // otherwise, it would return -1. 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (recent_tabs_menu_model_delegate_.get()) 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_width = recent_tabs_menu_model_delegate_->GetMaxWidthForMenu(menu); 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (max_width == -1) 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_width = MenuDelegate::GetMaxWidthForMenu(menu); 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_width; 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::IsItemChecked(int id) const { 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_bookmark_command(id)) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Entry& entry = id_to_entry_.find(id)->second; 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry.first->IsItemCheckedAt(entry.second); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::IsCommandEnabled(int id) const { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_bookmark_command(id)) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == 0) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // The root item. 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Entry& entry = id_to_entry_.find(id)->second; 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command_id = entry.first->GetCommandIdAt(entry.second); 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The items representing the cut menu (cut/copy/paste) and zoom menu 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (increment/decrement/reset) are always enabled. The child views of these 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // items enabled state updates appropriately. 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS || 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry.first->IsEnabledAt(entry.second); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::ExecuteCommand(int id, int mouse_event_flags) { 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_bookmark_command(id)) { 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->ExecuteCommand(id, mouse_event_flags); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not a bookmark 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Entry& entry = id_to_entry_.find(id)->second; 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command_id = entry.first->GetCommandIdAt(entry.second); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS) { 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These items are represented by child views. If ExecuteCommand is invoked 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it means the user clicked on the area around the buttons and we should 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not do anyting. 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return entry.first->ActivatedAt(entry.second, mouse_event_flags); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WrenchMenu::GetAccelerator(int id, ui::Accelerator* accelerator) { 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_bookmark_command(id)) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDToEntry::iterator ix = id_to_entry_.find(id); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ix == id_to_entry_.end()) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no entry for this id. 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Entry& entry = ix->second; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command_id = entry.first->GetCommandIdAt(entry.second); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS) { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These have special child views; don't show the accelerator for them. 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator menu_accelerator; 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry.first->GetAcceleratorAt(entry.second, &menu_accelerator)) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *accelerator = ui::Accelerator(menu_accelerator.key_code(), 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_accelerator.modifiers()); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::WillShowMenu(MenuItemView* menu) { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (menu == bookmark_menu_) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateBookmarkMenu(); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::WillHideMenu(MenuItemView* menu) { 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turns off the fade out animation of the wrench menus if 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |feedback_menu_item_| is selected. This excludes the wrench menu itself 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the snapshot in the feedback UI. 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (menu->HasSubmenu() && feedback_menu_item_ && 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) feedback_menu_item_->IsSelected()) { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's okay to just turn off the animation and no to take care the 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // animation back because the menu widget will be recreated next time 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's opened. See ToolbarView::RunMenu() and Init() of this class. 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu->GetSubmenu()->GetWidget()-> 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetVisibilityChangedAnimationsEnabled(false); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::BookmarkModelChanged() { 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(bookmark_menu_delegate_.get()); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bookmark_menu_delegate_->is_mutating_model()) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_->Cancel(); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::Observe(int type, 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED: 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A change in the global errors list can add or remove items from the 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // menu. Close the menu to avoid have a stale menu on-screen. 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_->Cancel(); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::PopulateMenu(MenuItemView* parent, 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuModel* model, 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* next_id) { 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0, max = model->GetItemCount(); i < max; ++i) { 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The button container menu items have a special height which we have to 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use instead of the normal height. 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height = 0; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_new_menu_ && 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (model->GetCommandIdAt(i) == IDC_CUT || 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model->GetCommandIdAt(i) == IDC_ZOOM_MINUS)) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) height = kMenuItemContainingButtonsHeight; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* item = AppendMenuItem( 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent, model, i, model->GetTypeAt(i), next_id, height); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) { 11017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool is_recent_tabs_menu = 11027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) model->GetCommandIdAt(i) == IDC_RECENT_TABS_MENU; 11037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (is_recent_tabs_menu) 11047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) first_recent_tabs_command_id_ = *next_id; 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PopulateMenu(item, model->GetSubmenuModelAt(i), next_id); 11067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (is_recent_tabs_menu) 11077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_recent_tabs_command_id_ = *next_id - 1; 11087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::NativeTheme* native_theme = GetNativeTheme(); 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (model->GetCommandIdAt(i)) { 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDC_CUT: 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(MenuModel::TYPE_COMMAND, model->GetTypeAt(i)); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(i + 2, max); 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(IDC_COPY, model->GetCommandIdAt(i + 1)); 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(IDC_PASTE, model->GetCommandIdAt(i + 2)); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->SetTitle(l10n_util::GetStringUTF16(IDS_EDIT2)); 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item->AddChildView(new CutCopyPasteView(this, model, native_theme, 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i, i + 1, i + 2)); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += 2; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDC_ZOOM_MINUS: 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(MenuModel::TYPE_COMMAND, model->GetTypeAt(i)); 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(IDC_ZOOM_PLUS, model->GetCommandIdAt(i + 1)); 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(IDC_FULLSCREEN, model->GetCommandIdAt(i + 2)); 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->SetTitle(l10n_util::GetStringUTF16(IDS_ZOOM_MENU2)); 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item->AddChildView(new ZoomView(this, model, native_theme, 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i, i + 1, i + 2)); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += 2; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDC_BOOKMARKS_MENU: 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!bookmark_menu_); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_ = item; 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDC_FEEDBACK: 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!feedback_menu_item_); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) feedback_menu_item_ = item; 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case IDC_RECENT_TABS_MENU: 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!recent_tabs_menu_model_delegate_.get()); 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recent_tabs_menu_model_delegate_.reset( 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new RecentTabsMenuModelDelegate(model->GetSubmenuModelAt(i), 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item)); 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MenuItemView* WrenchMenu::AppendMenuItem(MenuItemView* parent, 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuModel* model, 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuModel::ItemType menu_type, 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* next_id, 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height) { 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = (*next_id)++; 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_to_entry_[id].first = model; 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_to_entry_[id].second = index; 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* menu_item = NULL; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (height > 0) { 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For menu items with a special menu height we use our special class to be 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // able to modify the item height. 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_item = new ButtonContainerMenuItemView(parent, id, height); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->GetSubmenu()->AddChildView(menu_item); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For all other cases we use the more generic way to add menu items. 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_item = parent->AppendMenuItemFromModel(model, index, id); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (menu_item) { 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flush all buttons to the right side of the menu for the new menu type. 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_item->set_use_right_margin(!use_new_menu_); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_item->SetVisible(model->IsVisibleAt(index)); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (menu_type == MenuModel::TYPE_COMMAND && model->HasIcons()) { 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image icon; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model->GetIconAt(index, &icon)) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_item->SetIcon(*icon.ToImageSkia()); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return menu_item; 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::CancelAndEvaluate(MenuModel* model, int index) { 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_menu_model_ = model; 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_index_ = index; 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_->Cancel(); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WrenchMenu::CreateBookmarkMenu() { 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bookmark_menu_delegate_.get()) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Already created the menu. 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) BookmarkModel* model = 1205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) BookmarkModelFactory::GetForProfile(browser_->profile()); 1206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!model->loaded()) 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->AddObserver(this); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(oshima): Replace with views only API. 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* parent = views::Widget::GetWidgetForNativeWindow( 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_->window()->GetNativeWindow()); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_.reset( 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BookmarkMenuDelegate(browser_, 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_, 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent, 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_bookmark_command_id_)); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_menu_delegate_->Init( 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, bookmark_menu_, model->bookmark_bar_node(), 0, 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS, 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_utils::LAUNCH_WRENCH_MENU); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1224