| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h" | 5 #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 ui::MenuModel* context_menu_model = view_controller_->GetContextMenu(); | 267 ui::MenuModel* context_menu_model = view_controller_->GetContextMenu(); |
| 268 // It's possible the action doesn't have a context menu. | 268 // It's possible the action doesn't have a context menu. |
| 269 if (!context_menu_model) | 269 if (!context_menu_model) |
| 270 return; | 270 return; |
| 271 | 271 |
| 272 DCHECK(visible()); // We should never show a context menu for a hidden item. | 272 DCHECK(visible()); // We should never show a context menu for a hidden item. |
| 273 | 273 |
| 274 gfx::Point screen_loc; | 274 gfx::Point screen_loc; |
| 275 ConvertPointToScreen(this, &screen_loc); | 275 ConvertPointToScreen(this, &screen_loc); |
| 276 | 276 |
| 277 int run_types = views::MenuRunner::HAS_MNEMONICS | | 277 int run_types = |
| 278 views::MenuRunner::CONTEXT_MENU | views::MenuRunner::ASYNC; | 278 views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::CONTEXT_MENU; |
| 279 if (delegate_->ShownInsideMenu()) | 279 if (delegate_->ShownInsideMenu()) |
| 280 run_types |= views::MenuRunner::IS_NESTED; | 280 run_types |= views::MenuRunner::IS_NESTED; |
| 281 | 281 |
| 282 // RunMenuAt expects a nested menu to be parented by the same widget as the | 282 // RunMenuAt expects a nested menu to be parented by the same widget as the |
| 283 // already visible menu, in this case the Chrome menu. | 283 // already visible menu, in this case the Chrome menu. |
| 284 views::Widget* parent = delegate_->ShownInsideMenu() ? | 284 views::Widget* parent = delegate_->ShownInsideMenu() ? |
| 285 delegate_->GetOverflowReferenceView()->GetWidget() : | 285 delegate_->GetOverflowReferenceView()->GetWidget() : |
| 286 GetWidget(); | 286 GetWidget(); |
| 287 | 287 |
| 288 // Unretained() is safe here as ToolbarActionView will always outlive the | 288 // Unretained() is safe here as ToolbarActionView will always outlive the |
| 289 // menu. Any action that would lead to the deletion of |this| first triggers | 289 // menu. Any action that would lead to the deletion of |this| first triggers |
| 290 // the closing of the menu through lost capture. | 290 // the closing of the menu through lost capture. |
| 291 menu_adapter_.reset(new views::MenuModelAdapter( | 291 menu_adapter_.reset(new views::MenuModelAdapter( |
| 292 context_menu_model, | 292 context_menu_model, |
| 293 base::Bind(&ToolbarActionView::OnMenuClosed, base::Unretained(this)))); | 293 base::Bind(&ToolbarActionView::OnMenuClosed, base::Unretained(this)))); |
| 294 menu_ = menu_adapter_->CreateMenu(); | 294 menu_ = menu_adapter_->CreateMenu(); |
| 295 menu_runner_.reset(new views::MenuRunner(menu_, run_types)); | 295 menu_runner_.reset(new views::MenuRunner(menu_, run_types)); |
| 296 | 296 |
| 297 ignore_result( | 297 menu_runner_->RunMenuAt(parent, this, gfx::Rect(screen_loc, size()), |
| 298 menu_runner_->RunMenuAt(parent, this, gfx::Rect(screen_loc, size()), | 298 views::MENU_ANCHOR_TOPLEFT, source_type); |
| 299 views::MENU_ANCHOR_TOPLEFT, source_type)); | |
| 300 } | 299 } |
| 301 | 300 |
| 302 bool ToolbarActionView::CloseActiveMenuIfNeeded() { | 301 bool ToolbarActionView::CloseActiveMenuIfNeeded() { |
| 303 // If this view is shown inside another menu, there's a possibility that there | 302 // If this view is shown inside another menu, there's a possibility that there |
| 304 // is another context menu showing that we have to close before we can | 303 // is another context menu showing that we have to close before we can |
| 305 // activate a different menu. | 304 // activate a different menu. |
| 306 if (delegate_->ShownInsideMenu()) { | 305 if (delegate_->ShownInsideMenu()) { |
| 307 views::MenuController* menu_controller = | 306 views::MenuController* menu_controller = |
| 308 views::MenuController::GetActiveInstance(); | 307 views::MenuController::GetActiveInstance(); |
| 309 // If this is shown inside a menu, then there should always be an active | 308 // If this is shown inside a menu, then there should always be an active |
| 310 // menu controller. | 309 // menu controller. |
| 311 DCHECK(menu_controller); | 310 DCHECK(menu_controller); |
| 312 if (menu_controller->in_nested_run()) { | 311 if (menu_controller->in_nested_run()) { |
| 313 // There is another menu showing. Close the outermost menu (since we are | 312 // There is another menu showing. Close the outermost menu (since we are |
| 314 // shown in the same menu, we don't want to close the whole thing). | 313 // shown in the same menu, we don't want to close the whole thing). |
| 315 menu_controller->Cancel(views::MenuController::EXIT_OUTERMOST); | 314 menu_controller->Cancel(views::MenuController::EXIT_OUTERMOST); |
| 316 return true; | 315 return true; |
| 317 } | 316 } |
| 318 } | 317 } |
| 319 | 318 |
| 320 return false; | 319 return false; |
| 321 } | 320 } |
| OLD | NEW |