1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/views/examples/menu_example.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "ui/base/models/simple_menu_model.h"
11 #include "ui/views/controls/button/menu_button.h"
12 #include "ui/views/controls/button/menu_button_listener.h"
13 #include "ui/views/controls/menu/menu_runner.h"
14 #include "ui/views/layout/fill_layout.h"
15 #include "ui/views/view.h"
16 #include "ui/views/widget/widget.h"
18 using base::ASCIIToUTF16
;
25 class ExampleMenuModel
: public ui::SimpleMenuModel
,
26 public ui::SimpleMenuModel::Delegate
{
30 // ui::SimpleMenuModel::Delegate:
31 bool IsCommandIdChecked(int command_id
) const override
;
32 bool IsCommandIdEnabled(int command_id
) const override
;
33 bool GetAcceleratorForCommandId(int command_id
,
34 ui::Accelerator
* accelerator
) override
;
35 void ExecuteCommand(int command_id
, int event_flags
) override
;
53 scoped_ptr
<ui::SimpleMenuModel
> submenu_
;
54 std::set
<int> checked_fruits_
;
55 int current_encoding_command_id_
;
57 DISALLOW_COPY_AND_ASSIGN(ExampleMenuModel
);
60 class ExampleMenuButton
: public MenuButton
, public MenuButtonListener
{
62 explicit ExampleMenuButton(const base::string16
& test
);
63 ~ExampleMenuButton() override
;
66 // MenuButtonListener:
67 void OnMenuButtonClicked(View
* source
, const gfx::Point
& point
) override
;
69 ui::SimpleMenuModel
* GetMenuModel();
71 scoped_ptr
<ExampleMenuModel
> menu_model_
;
72 scoped_ptr
<MenuRunner
> menu_runner_
;
74 DISALLOW_COPY_AND_ASSIGN(ExampleMenuButton
);
77 // ExampleMenuModel ---------------------------------------------------------
79 ExampleMenuModel::ExampleMenuModel()
80 : ui::SimpleMenuModel(this),
81 current_encoding_command_id_(COMMAND_SELECT_ASCII
) {
82 AddItem(COMMAND_DO_SOMETHING
, ASCIIToUTF16("Do Something"));
83 AddSeparator(ui::NORMAL_SEPARATOR
);
84 AddRadioItem(COMMAND_SELECT_ASCII
, ASCIIToUTF16("ASCII"),
86 AddRadioItem(COMMAND_SELECT_UTF8
, ASCIIToUTF16("UTF-8"),
88 AddRadioItem(COMMAND_SELECT_UTF16
, ASCIIToUTF16("UTF-16"),
90 AddSeparator(ui::NORMAL_SEPARATOR
);
91 AddCheckItem(COMMAND_CHECK_APPLE
, ASCIIToUTF16("Apple"));
92 AddCheckItem(COMMAND_CHECK_ORANGE
, ASCIIToUTF16("Orange"));
93 AddCheckItem(COMMAND_CHECK_KIWI
, ASCIIToUTF16("Kiwi"));
94 AddSeparator(ui::NORMAL_SEPARATOR
);
95 AddItem(COMMAND_GO_HOME
, ASCIIToUTF16("Go Home"));
97 submenu_
.reset(new ui::SimpleMenuModel(this));
98 submenu_
->AddItem(COMMAND_DO_SOMETHING
, ASCIIToUTF16("Do Something 2"));
99 AddSubMenu(0, ASCIIToUTF16("Submenu"), submenu_
.get());
102 bool ExampleMenuModel::IsCommandIdChecked(int command_id
) const {
104 if (command_id
== current_encoding_command_id_
)
108 if (checked_fruits_
.find(command_id
) != checked_fruits_
.end())
114 bool ExampleMenuModel::IsCommandIdEnabled(int command_id
) const {
115 // All commands are enabled except for COMMAND_GO_HOME.
116 return command_id
!= COMMAND_GO_HOME
;
119 bool ExampleMenuModel::GetAcceleratorForCommandId(
121 ui::Accelerator
* accelerator
) {
122 // We don't use this in the example.
126 void ExampleMenuModel::ExecuteCommand(int command_id
, int event_flags
) {
127 switch (command_id
) {
128 case COMMAND_DO_SOMETHING
: {
129 VLOG(0) << "Done something";
134 case COMMAND_SELECT_ASCII
: {
135 current_encoding_command_id_
= COMMAND_SELECT_ASCII
;
136 VLOG(0) << "Selected ASCII";
139 case COMMAND_SELECT_UTF8
: {
140 current_encoding_command_id_
= COMMAND_SELECT_UTF8
;
141 VLOG(0) << "Selected UTF-8";
144 case COMMAND_SELECT_UTF16
: {
145 current_encoding_command_id_
= COMMAND_SELECT_UTF16
;
146 VLOG(0) << "Selected UTF-16";
151 case COMMAND_CHECK_APPLE
:
152 case COMMAND_CHECK_ORANGE
:
153 case COMMAND_CHECK_KIWI
: {
154 // Print what fruit is checked.
155 const char* checked_fruit
= "";
156 if (command_id
== COMMAND_CHECK_APPLE
)
157 checked_fruit
= "Apple";
158 else if (command_id
== COMMAND_CHECK_ORANGE
)
159 checked_fruit
= "Orange";
160 else if (command_id
== COMMAND_CHECK_KIWI
)
161 checked_fruit
= "Kiwi";
163 // Update the check status.
164 std::set
<int>::iterator iter
= checked_fruits_
.find(command_id
);
165 if (iter
== checked_fruits_
.end()) {
166 DVLOG(1) << "Checked " << checked_fruit
;
167 checked_fruits_
.insert(command_id
);
169 DVLOG(1) << "Unchecked " << checked_fruit
;
170 checked_fruits_
.erase(iter
);
177 // ExampleMenuButton -----------------------------------------------------------
179 ExampleMenuButton::ExampleMenuButton(const base::string16
& test
)
180 : MenuButton(NULL
, test
, this, true) {
183 ExampleMenuButton::~ExampleMenuButton() {
186 void ExampleMenuButton::OnMenuButtonClicked(View
* source
,
187 const gfx::Point
& point
) {
188 menu_runner_
.reset(new MenuRunner(GetMenuModel(), MenuRunner::HAS_MNEMONICS
));
190 if (menu_runner_
->RunMenuAt(source
->GetWidget()->GetTopLevelWidget(),
192 gfx::Rect(point
, gfx::Size()),
193 MENU_ANCHOR_TOPRIGHT
,
194 ui::MENU_SOURCE_NONE
) ==
195 MenuRunner::MENU_DELETED
) {
200 ui::SimpleMenuModel
* ExampleMenuButton::GetMenuModel() {
201 if (!menu_model_
.get())
202 menu_model_
.reset(new ExampleMenuModel
);
203 return menu_model_
.get();
208 MenuExample::MenuExample() : ExampleBase("Menu") {
211 MenuExample::~MenuExample() {
214 void MenuExample::CreateExampleView(View
* container
) {
215 // We add a button to open a menu.
216 ExampleMenuButton
* menu_button
= new ExampleMenuButton(
217 ASCIIToUTF16("Open a menu"));
218 container
->SetLayoutManager(new FillLayout
);
219 container
->AddChildView(menu_button
);
222 } // namespace examples