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 "ui/views/controls/menu/menu.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Menu::Delegate::IsItemChecked(int id) const {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Menu::Delegate::IsItemDefault(int id) const {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 Menu::Delegate::GetLabel(int id) const {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return string16();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Menu::Delegate::GetAcceleratorInfo(int id, ui::Accelerator* accel) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::ImageSkia& Menu::Delegate::GetIcon(int id) const {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetEmptyIcon();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Menu::Delegate::GetItemCount() const {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Menu::Delegate::IsItemSeparator(int id) const {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Menu::Delegate::HasIcon(int id) const {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Menu::Delegate::SupportsCommand(int id) const {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Menu::Delegate::IsCommandEnabled(int id) const {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Menu::Delegate::GetContextualLabel(int id, string16* out) const {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Menu::Delegate::IsRightToLeftUILayout() const {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::i18n::IsRTL();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::ImageSkia& Menu::Delegate::GetEmptyIcon() const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const gfx::ImageSkia* empty_icon = new gfx::ImageSkia();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *empty_icon;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Menu::Menu(Delegate* delegate, AnchorPoint anchor)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(delegate),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      anchor_(anchor) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Menu::Menu(Menu* parent)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(parent->delegate_),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      anchor_(parent->anchor_) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Menu::~Menu() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Menu::AppendMenuItem(int item_id,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const string16& label,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          MenuItemType type) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMenuItem(-1, item_id, label, type);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Menu::AddMenuItem(int index,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int item_id,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const string16& label,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MenuItemType type) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == SEPARATOR)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddSeparator(index);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddMenuItemInternal(index, item_id, label, gfx::ImageSkia(), type);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Menu* Menu::AppendSubMenu(int item_id, const string16& label) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddSubMenu(-1, item_id, label);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Menu* Menu::AddSubMenu(int index, int item_id, const string16& label) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddSubMenuWithIcon(index, item_id, label, gfx::ImageSkia());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Menu* Menu::AppendSubMenuWithIcon(int item_id,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const string16& label,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const gfx::ImageSkia& icon) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddSubMenuWithIcon(-1, item_id, label, icon);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Menu::AppendMenuItemWithLabel(int item_id, const string16& label) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMenuItemWithLabel(-1, item_id, label);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Menu::AddMenuItemWithLabel(int index,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int item_id,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const string16& label) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMenuItem(index, item_id, label, Menu::NORMAL);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Menu::AppendDelegateMenuItem(int item_id) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddDelegateMenuItem(-1, item_id);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Menu::AddDelegateMenuItem(int index, int item_id) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMenuItem(index, item_id, string16(), Menu::NORMAL);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Menu::AppendSeparator() {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSeparator(-1);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Menu::AppendMenuItemWithIcon(int item_id,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const string16& label,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const gfx::ImageSkia& icon) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMenuItemWithIcon(-1, item_id, label, icon);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Menu::AddMenuItemWithIcon(int index,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int item_id,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const string16& label,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const gfx::ImageSkia& icon) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMenuItemInternal(index, item_id, label, icon, Menu::NORMAL);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Menu::Menu() : delegate_(NULL), anchor_(TOPLEFT) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
147