| Index: ui/views/controls/menu/menu_runner_impl_cocoa.mm
|
| diff --git a/ui/views/controls/menu/menu_runner_impl_cocoa.mm b/ui/views/controls/menu/menu_runner_impl_cocoa.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fec6ad3e885257b64479724552bffc13f1f4bad8
|
| --- /dev/null
|
| +++ b/ui/views/controls/menu/menu_runner_impl_cocoa.mm
|
| @@ -0,0 +1,86 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#import "ui/views/controls/menu/menu_runner_impl_cocoa.h"
|
| +
|
| +#import "ui/base/cocoa/menu_controller.h"
|
| +#include "ui/events/event_utils.h"
|
| +#include "ui/gfx/geometry/rect.h"
|
| +#include "ui/views/controls/menu/menu_runner_impl_adapter.h"
|
| +
|
| +namespace views {
|
| +namespace internal {
|
| +
|
| +// static
|
| +MenuRunnerImplInterface* MenuRunnerImplInterface::Create(
|
| + ui::MenuModel* menu_model,
|
| + int32 run_types) {
|
| + if ((run_types & MenuRunner::CONTEXT_MENU) != 0 &&
|
| + (run_types & MenuRunner::IS_NESTED) == 0) {
|
| + return new MenuRunnerImplCocoa(menu_model);
|
| + }
|
| +
|
| + return new MenuRunnerImplAdapter(menu_model);
|
| +}
|
| +
|
| +MenuItemView* MenuRunnerImplCocoa::GetMenu() const {
|
| + return NULL;
|
| +}
|
| +
|
| +MenuRunnerImplCocoa::MenuRunnerImplCocoa(ui::MenuModel* menu)
|
| + : delete_after_run_(false), closing_event_time_(base::TimeDelta()) {
|
| + menu_controller_.reset(
|
| + [[MenuController alloc] initWithModel:menu useWithPopUpButtonCell:NO]);
|
| +}
|
| +
|
| +bool MenuRunnerImplCocoa::IsRunning() const {
|
| + return [menu_controller_ isMenuOpen];
|
| +}
|
| +
|
| +void MenuRunnerImplCocoa::Release() {
|
| + if (IsRunning()) {
|
| + if (delete_after_run_)
|
| + return; // We already canceled.
|
| +
|
| + delete_after_run_ = true;
|
| + [menu_controller_ cancel];
|
| + } else {
|
| + delete this;
|
| + }
|
| +}
|
| +
|
| +MenuRunner::RunResult MenuRunnerImplCocoa::RunMenuAt(Widget* parent,
|
| + MenuButton* button,
|
| + const gfx::Rect& bounds,
|
| + MenuAnchorPosition anchor,
|
| + int32 run_types) {
|
| + DCHECK(run_types & MenuRunner::CONTEXT_MENU);
|
| + DCHECK(!IsRunning());
|
| + closing_event_time_ = base::TimeDelta();
|
| + [NSMenu popUpContextMenu:[menu_controller_ menu]
|
| + withEvent:[NSApp currentEvent]
|
| + forView:nil];
|
| + closing_event_time_ = ui::EventTimeForNow();
|
| +
|
| + if (delete_after_run_) {
|
| + delete this;
|
| + return MenuRunner::MENU_DELETED;
|
| + }
|
| +
|
| + return MenuRunner::NORMAL_EXIT;
|
| +}
|
| +
|
| +void MenuRunnerImplCocoa::Cancel() {
|
| + [menu_controller_ cancel];
|
| +}
|
| +
|
| +base::TimeDelta MenuRunnerImplCocoa::GetClosingEventTime() const {
|
| + return closing_event_time_;
|
| +}
|
| +
|
| +MenuRunnerImplCocoa::~MenuRunnerImplCocoa() {
|
| +}
|
| +
|
| +} // namespace internal
|
| +} // namespace views
|
|
|