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)        &copy_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