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