| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/views/controls/menu/menu_controller.h" | 5 #include "ui/views/controls/menu/menu_controller.h" |
| 6 | 6 |
| 7 #include "base/i18n/case_conversion.h" | 7 #include "base/i18n/case_conversion.h" |
| 8 #include "base/i18n/rtl.h" | 8 #include "base/i18n/rtl.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 | 349 |
| 350 if (!blocking_run_) { | 350 if (!blocking_run_) { |
| 351 if (!is_nested_drag) { | 351 if (!is_nested_drag) { |
| 352 // Start the timer to hide the menu. This is needed as we get no | 352 // Start the timer to hide the menu. This is needed as we get no |
| 353 // notification when the drag has finished. | 353 // notification when the drag has finished. |
| 354 StartCancelAllTimer(); | 354 StartCancelAllTimer(); |
| 355 } | 355 } |
| 356 return NULL; | 356 return NULL; |
| 357 } | 357 } |
| 358 | 358 |
| 359 if (button) | 359 scoped_ptr<MenuButton::PressedLock>& pressed_lock = |
| 360 nested_menu ? nested_pressed_lock_ : pressed_lock_; |
| 361 if (button) { |
| 360 menu_button_ = button; | 362 menu_button_ = button; |
| 363 pressed_lock.reset(new MenuButton::PressedLock(menu_button_)); |
| 364 } |
| 361 | 365 |
| 362 // Make sure Chrome doesn't attempt to shut down while the menu is showing. | 366 // Make sure Chrome doesn't attempt to shut down while the menu is showing. |
| 363 if (ViewsDelegate::views_delegate) | 367 if (ViewsDelegate::views_delegate) |
| 364 ViewsDelegate::views_delegate->AddRef(); | 368 ViewsDelegate::views_delegate->AddRef(); |
| 365 | 369 |
| 366 // We need to turn on nestable tasks as in some situations (pressing alt-f for | 370 // We need to turn on nestable tasks as in some situations (pressing alt-f for |
| 367 // one) the menus are run from a task. If we don't do this and are invoked | 371 // one) the menus are run from a task. If we don't do this and are invoked |
| 368 // from a task none of the tasks we schedule are processed and the menu | 372 // from a task none of the tasks we schedule are processed and the menu |
| 369 // appears totally broken. | 373 // appears totally broken. |
| 370 message_loop_depth_++; | 374 message_loop_depth_++; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 // before that happens otherwise the menus will stay on screen. | 431 // before that happens otherwise the menus will stay on screen. |
| 428 CloseAllNestedMenus(); | 432 CloseAllNestedMenus(); |
| 429 SetSelection(NULL, SELECTION_UPDATE_IMMEDIATELY | SELECTION_EXIT); | 433 SetSelection(NULL, SELECTION_UPDATE_IMMEDIATELY | SELECTION_EXIT); |
| 430 | 434 |
| 431 // Set exit_all_, which makes sure all nested loops exit immediately. | 435 // Set exit_all_, which makes sure all nested loops exit immediately. |
| 432 if (exit_type_ != EXIT_DESTROYED) | 436 if (exit_type_ != EXIT_DESTROYED) |
| 433 SetExitType(EXIT_ALL); | 437 SetExitType(EXIT_ALL); |
| 434 } | 438 } |
| 435 } | 439 } |
| 436 | 440 |
| 437 // If we stopped running because one of the menus was destroyed chances are | 441 // Reset our pressed lock. The lock handles the case if the button was |
| 438 // the button was also destroyed. | 442 // destroyed. |
| 439 if (exit_type_ != EXIT_DESTROYED && menu_button_) { | 443 pressed_lock.reset(); |
| 440 menu_button_->SetState(CustomButton::STATE_NORMAL); | 444 |
| 441 menu_button_->SchedulePaint(); | |
| 442 } | |
| 443 return result; | 445 return result; |
| 444 } | 446 } |
| 445 | 447 |
| 446 void MenuController::Cancel(ExitType type) { | 448 void MenuController::Cancel(ExitType type) { |
| 447 // If the menu has already been destroyed, no further cancellation is | 449 // If the menu has already been destroyed, no further cancellation is |
| 448 // needed. We especially don't want to set the |exit_type_| to a lesser | 450 // needed. We especially don't want to set the |exit_type_| to a lesser |
| 449 // value. | 451 // value. |
| 450 if (exit_type_ == EXIT_DESTROYED || exit_type_ == type) | 452 if (exit_type_ == EXIT_DESTROYED || exit_type_ == type) |
| 451 return; | 453 return; |
| 452 | 454 |
| (...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1216 delegate_->SiblingMenuCreated(alt_menu); | 1218 delegate_->SiblingMenuCreated(alt_menu); |
| 1217 | 1219 |
| 1218 if (!button) { | 1220 if (!button) { |
| 1219 // If the delegate returns a menu, they must also return a button. | 1221 // If the delegate returns a menu, they must also return a button. |
| 1220 NOTREACHED(); | 1222 NOTREACHED(); |
| 1221 return false; | 1223 return false; |
| 1222 } | 1224 } |
| 1223 | 1225 |
| 1224 // There is a sibling menu, update the button state, hide the current menu | 1226 // There is a sibling menu, update the button state, hide the current menu |
| 1225 // and show the new one. | 1227 // and show the new one. |
| 1226 menu_button_->SetState(CustomButton::STATE_NORMAL); | |
| 1227 menu_button_->SchedulePaint(); | |
| 1228 menu_button_ = button; | 1228 menu_button_ = button; |
| 1229 menu_button_->SetState(CustomButton::STATE_PRESSED); | 1229 // We know that we need to reset the nested lock if it exists because we only |
| 1230 menu_button_->SchedulePaint(); | 1230 // support nesting menus that block runs (so we can't both have a nested menu |
| 1231 // *and* be updating the original). |
| 1232 scoped_ptr<MenuButton::PressedLock>& pressed_lock = |
| 1233 nested_pressed_lock_.get() ? nested_pressed_lock_ : pressed_lock_; |
| 1234 pressed_lock.reset(new MenuButton::PressedLock(menu_button_)); |
| 1231 | 1235 |
| 1232 // Need to reset capture when we show the menu again, otherwise we aren't | 1236 // Need to reset capture when we show the menu again, otherwise we aren't |
| 1233 // going to get any events. | 1237 // going to get any events. |
| 1234 did_capture_ = false; | 1238 did_capture_ = false; |
| 1235 gfx::Point screen_menu_loc; | 1239 gfx::Point screen_menu_loc; |
| 1236 View::ConvertPointToScreen(button, &screen_menu_loc); | 1240 View::ConvertPointToScreen(button, &screen_menu_loc); |
| 1237 | 1241 |
| 1238 // It is currently not possible to show a submenu recursively in a bubble. | 1242 // It is currently not possible to show a submenu recursively in a bubble. |
| 1239 DCHECK(!MenuItemView::IsBubble(anchor)); | 1243 DCHECK(!MenuItemView::IsBubble(anchor)); |
| 1240 // Subtract 1 from the height to make the popup flush with the button border. | 1244 // Subtract 1 from the height to make the popup flush with the button border. |
| (...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2309 } | 2313 } |
| 2310 } | 2314 } |
| 2311 | 2315 |
| 2312 gfx::Screen* MenuController::GetScreen() { | 2316 gfx::Screen* MenuController::GetScreen() { |
| 2313 Widget* root = owner_ ? owner_->GetTopLevelWidget() : NULL; | 2317 Widget* root = owner_ ? owner_->GetTopLevelWidget() : NULL; |
| 2314 return root ? gfx::Screen::GetScreenFor(root->GetNativeView()) | 2318 return root ? gfx::Screen::GetScreenFor(root->GetNativeView()) |
| 2315 : gfx::Screen::GetNativeScreen(); | 2319 : gfx::Screen::GetNativeScreen(); |
| 2316 } | 2320 } |
| 2317 | 2321 |
| 2318 } // namespace views | 2322 } // namespace views |
| OLD | NEW |