| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "views/focus/focus_manager.h" | 5 #include "views/focus/focus_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
| 10 | 10 |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 } | 406 } |
| 407 | 407 |
| 408 if (v) | 408 if (v) |
| 409 return v; | 409 return v; |
| 410 | 410 |
| 411 starting_view = focus_traversable->GetFocusTraversableParentView(); | 411 starting_view = focus_traversable->GetFocusTraversableParentView(); |
| 412 parent_focus_traversable = | 412 parent_focus_traversable = |
| 413 parent_focus_traversable->GetFocusTraversableParent(); | 413 parent_focus_traversable->GetFocusTraversableParent(); |
| 414 } | 414 } |
| 415 | 415 |
| 416 if (!dont_loop) { | 416 // If we get here, we have reached the end of the focus hierarchy, let's |
| 417 // If we get here, we have reached the end of the focus hierarchy, let's | 417 // loop. Make sure there was at least a view to start with, to prevent |
| 418 // loop. | 418 // infinitely looping in empty windows. |
| 419 if (reverse) { | 419 if (!dont_loop && original_starting_view) { |
| 420 // When reversing from the top, the next focusable view is at the end | 420 // Easy, just clear the selection and press tab again. |
| 421 // of the focus hierarchy. | 421 // By calling with NULL as the starting view, we'll start from the |
| 422 return FindLastFocusableView(); | 422 // top_root_view. |
| 423 } else { | 423 return GetNextFocusableView(NULL, reverse, true); |
| 424 // Easy, just clear the selection and press tab again. | |
| 425 if (original_starting_view) { // Make sure there was at least a view to | |
| 426 // start with, to prevent infinitely | |
| 427 // looping in empty windows. | |
| 428 // By calling with NULL as the starting view, we'll start from the | |
| 429 // top_root_view. | |
| 430 return GetNextFocusableView(NULL, false, true); | |
| 431 } | |
| 432 } | |
| 433 } | 424 } |
| 434 } | 425 } |
| 435 return NULL; | 426 return NULL; |
| 436 } | 427 } |
| 437 | 428 |
| 438 View* FocusManager::FindLastFocusableView() { | |
| 439 // Just walk the entire focus loop from where we're at until we reach the end. | |
| 440 View* new_focused = NULL; | |
| 441 View* last_focused = focused_view_; | |
| 442 while ((new_focused = GetNextFocusableView(last_focused, false, true))) | |
| 443 last_focused = new_focused; | |
| 444 return last_focused; | |
| 445 } | |
| 446 | |
| 447 void FocusManager::SetFocusedView(View* view) { | 429 void FocusManager::SetFocusedView(View* view) { |
| 448 if (focused_view_ != view) { | 430 if (focused_view_ != view) { |
| 449 View* prev_focused_view = focused_view_; | 431 View* prev_focused_view = focused_view_; |
| 450 if (focused_view_) | 432 if (focused_view_) |
| 451 focused_view_->WillLoseFocus(); | 433 focused_view_->WillLoseFocus(); |
| 452 | 434 |
| 453 if (view) | 435 if (view) |
| 454 view->WillGainFocus(); | 436 view->WillGainFocus(); |
| 455 | 437 |
| 456 // Notified listeners that the focus changed. | 438 // Notified listeners that the focus changed. |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 std::find(focus_change_listeners_.begin(), focus_change_listeners_.end(), | 692 std::find(focus_change_listeners_.begin(), focus_change_listeners_.end(), |
| 711 listener); | 693 listener); |
| 712 if (place == focus_change_listeners_.end()) { | 694 if (place == focus_change_listeners_.end()) { |
| 713 NOTREACHED() << "Removing a listener that isn't registered."; | 695 NOTREACHED() << "Removing a listener that isn't registered."; |
| 714 return; | 696 return; |
| 715 } | 697 } |
| 716 focus_change_listeners_.erase(place); | 698 focus_change_listeners_.erase(place); |
| 717 } | 699 } |
| 718 | 700 |
| 719 } // namespace views | 701 } // namespace views |
| OLD | NEW |