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..849558fddb788ee84573ce3f003a4949f3d43f40 |
--- /dev/null |
+++ b/ui/views/controls/menu/menu_runner_impl_cocoa.mm |
@@ -0,0 +1,82 @@ |
+// 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); |
+} |
+ |
+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 |