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_runner.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/controls/menu/menu_runner_handler.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/menu/menu_runner_impl.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMenuRunner::MenuRunner(ui::MenuModel* menu_model, int32 run_types) 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : run_types_(run_types), 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch impl_(internal::MenuRunnerImplInterface::Create(menu_model, run_types)) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMenuRunner::MenuRunner(MenuItemView* menu_view, int32 run_types) 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : run_types_(run_types), impl_(new internal::MenuRunnerImpl(menu_view)) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MenuRunner::~MenuRunner() { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch impl_->Release(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MenuRunner::RunResult MenuRunner::RunMenuAt(Widget* parent, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuButton* button, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds, 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MenuAnchorPosition anchor, 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::MenuSourceType source_type) { 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (runner_handler_.get()) { 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return runner_handler_->RunMenuAt( 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parent, button, bounds, anchor, source_type, run_types_); 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parent of the nested menu will have created a DisplayChangeListener, so 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we avoid creating a DisplayChangeListener if nested. Drop menus are 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transient, so we don't cancel in that case. 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if ((run_types_ & (IS_NESTED | FOR_DROP)) == 0 && parent) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_change_listener_.reset( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::DisplayChangeListener::Create(parent, this)); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (run_types_ & CONTEXT_MENU) { 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch (source_type) { 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ui::MENU_SOURCE_NONE: 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ui::MENU_SOURCE_KEYBOARD: 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ui::MENU_SOURCE_MOUSE: 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu anchor = MENU_ANCHOR_TOPLEFT; 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ui::MENU_SOURCE_TOUCH: 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ui::MENU_SOURCE_TOUCH_EDIT_MENU: 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu anchor = MENU_ANCHOR_BOTTOMCENTER; 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) default: 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return impl_->RunMenuAt(parent, button, bounds, anchor, run_types_); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MenuRunner::IsRunning() const { 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return impl_->IsRunning(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MenuRunner::Cancel() { 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch impl_->Cancel(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeDelta MenuRunner::closing_event_time() const { 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return impl_->GetClosingEventTime(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void MenuRunner::SetRunnerHandler( 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<MenuRunnerHandler> runner_handler) { 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) runner_handler_ = runner_handler.Pass(); 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 80