| 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/focus/focus_manager.h" | 5 #include "ui/views/focus/focus_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 } | 132 } |
| 133 | 133 |
| 134 // Tests whether a view is valid, whether it still belongs to the window | 134 // Tests whether a view is valid, whether it still belongs to the window |
| 135 // hierarchy of the FocusManager. | 135 // hierarchy of the FocusManager. |
| 136 bool FocusManager::ContainsView(View* view) { | 136 bool FocusManager::ContainsView(View* view) { |
| 137 Widget* widget = view->GetWidget(); | 137 Widget* widget = view->GetWidget(); |
| 138 return widget ? widget->GetFocusManager() == this : false; | 138 return widget ? widget->GetFocusManager() == this : false; |
| 139 } | 139 } |
| 140 | 140 |
| 141 void FocusManager::AdvanceFocus(bool reverse) { | 141 void FocusManager::AdvanceFocus(bool reverse) { |
| 142 View* v = GetNextFocusableView(focused_view_, reverse, false); | 142 View* v = GetNextFocusableView(focused_view_, NULL, reverse, false); |
| 143 // Note: Do not skip this next block when v == focused_view_. If the user | 143 // Note: Do not skip this next block when v == focused_view_. If the user |
| 144 // tabs past the last focusable element in a webpage, we'll get here, and if | 144 // tabs past the last focusable element in a webpage, we'll get here, and if |
| 145 // the TabContentsContainerView is the only focusable view (possible in | 145 // the TabContentsContainerView is the only focusable view (possible in |
| 146 // fullscreen mode), we need to run this block in order to cycle around to the | 146 // fullscreen mode), we need to run this block in order to cycle around to the |
| 147 // first element on the page. | 147 // first element on the page. |
| 148 if (v) { | 148 if (v) { |
| 149 views::View* focused_view = focused_view_; | 149 views::View* focused_view = focused_view_; |
| 150 v->AboutToRequestFocusFromTabTraversal(reverse); | 150 v->AboutToRequestFocusFromTabTraversal(reverse); |
| 151 // AboutToRequestFocusFromTabTraversal() may have changed focus. If it did, | 151 // AboutToRequestFocusFromTabTraversal() may have changed focus. If it did, |
| 152 // don't change focus again. | 152 // don't change focus again. |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 pane->RequestFocus(); | 212 pane->RequestFocus(); |
| 213 focused_view = GetFocusedView(); | 213 focused_view = GetFocusedView(); |
| 214 if (pane == focused_view || pane->Contains(focused_view)) | 214 if (pane == focused_view || pane->Contains(focused_view)) |
| 215 return true; | 215 return true; |
| 216 } | 216 } |
| 217 | 217 |
| 218 return false; | 218 return false; |
| 219 } | 219 } |
| 220 | 220 |
| 221 View* FocusManager::GetNextFocusableView(View* original_starting_view, | 221 View* FocusManager::GetNextFocusableView(View* original_starting_view, |
| 222 Widget* starting_widget, |
| 222 bool reverse, | 223 bool reverse, |
| 223 bool dont_loop) { | 224 bool dont_loop) { |
| 224 FocusTraversable* focus_traversable = NULL; | 225 FocusTraversable* focus_traversable = NULL; |
| 225 | 226 |
| 226 // Let's revalidate the focused view. | 227 // Let's revalidate the focused view. |
| 227 ValidateFocusedView(); | 228 ValidateFocusedView(); |
| 228 | 229 |
| 229 View* starting_view = NULL; | 230 View* starting_view = NULL; |
| 230 if (original_starting_view) { | 231 if (original_starting_view) { |
| 231 // Search up the containment hierarchy to see if a view is acting as | 232 // Search up the containment hierarchy to see if a view is acting as |
| (...skipping 23 matching lines...) Expand all Loading... |
| 255 } | 256 } |
| 256 } else { | 257 } else { |
| 257 // When you are going back, starting view's FocusTraversable | 258 // When you are going back, starting view's FocusTraversable |
| 258 // should not be used. | 259 // should not be used. |
| 259 focus_traversable = | 260 focus_traversable = |
| 260 original_starting_view->GetWidget()->GetFocusTraversable(); | 261 original_starting_view->GetWidget()->GetFocusTraversable(); |
| 261 starting_view = original_starting_view; | 262 starting_view = original_starting_view; |
| 262 } | 263 } |
| 263 } | 264 } |
| 264 } else { | 265 } else { |
| 265 focus_traversable = widget_->GetFocusTraversable(); | 266 Widget* widget = starting_widget ? starting_widget : widget_; |
| 267 focus_traversable = widget->GetFocusTraversable(); |
| 266 } | 268 } |
| 267 | 269 |
| 268 // Traverse the FocusTraversable tree down to find the focusable view. | 270 // Traverse the FocusTraversable tree down to find the focusable view. |
| 269 View* v = FindFocusableView(focus_traversable, starting_view, reverse); | 271 View* v = FindFocusableView(focus_traversable, starting_view, reverse); |
| 270 if (v) { | 272 if (v) { |
| 271 return v; | 273 return v; |
| 272 } else { | 274 } else { |
| 273 // Let's go up in the FocusTraversable tree. | 275 // Let's go up in the FocusTraversable tree. |
| 274 FocusTraversable* parent_focus_traversable = | 276 FocusTraversable* parent_focus_traversable = |
| 275 focus_traversable->GetFocusTraversableParent(); | 277 focus_traversable->GetFocusTraversableParent(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 296 starting_view = focus_traversable->GetFocusTraversableParentView(); | 298 starting_view = focus_traversable->GetFocusTraversableParentView(); |
| 297 parent_focus_traversable = | 299 parent_focus_traversable = |
| 298 parent_focus_traversable->GetFocusTraversableParent(); | 300 parent_focus_traversable->GetFocusTraversableParent(); |
| 299 } | 301 } |
| 300 | 302 |
| 301 // If we get here, we have reached the end of the focus hierarchy, let's | 303 // If we get here, we have reached the end of the focus hierarchy, let's |
| 302 // loop. Make sure there was at least a view to start with, to prevent | 304 // loop. Make sure there was at least a view to start with, to prevent |
| 303 // infinitely looping in empty windows. | 305 // infinitely looping in empty windows. |
| 304 if (!dont_loop && original_starting_view) { | 306 if (!dont_loop && original_starting_view) { |
| 305 // Easy, just clear the selection and press tab again. | 307 // Easy, just clear the selection and press tab again. |
| 306 // By calling with NULL as the starting view, we'll start from the | 308 // By calling with NULL as the starting view, we'll start from either |
| 307 // top_root_view. | 309 // the starting views widget or |widget_|. |
| 308 return GetNextFocusableView(NULL, reverse, true); | 310 Widget* widget = original_starting_view->GetWidget(); |
| 311 if (widget->widget_delegate()->ShouldAdvanceFocusToTopLevelWidget()) |
| 312 widget = widget_; |
| 313 return GetNextFocusableView(NULL, widget, reverse, true); |
| 309 } | 314 } |
| 310 } | 315 } |
| 311 return NULL; | 316 return NULL; |
| 312 } | 317 } |
| 313 | 318 |
| 314 void FocusManager::SetFocusedViewWithReason( | 319 void FocusManager::SetFocusedViewWithReason( |
| 315 View* view, FocusChangeReason reason) { | 320 View* view, FocusChangeReason reason) { |
| 316 if (focused_view_ == view) | 321 if (focused_view_ == view) |
| 317 return; | 322 return; |
| 318 | 323 |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 } | 540 } |
| 536 if (key_code == ui::VKEY_RIGHT || key_code == ui::VKEY_DOWN) { | 541 if (key_code == ui::VKEY_RIGHT || key_code == ui::VKEY_DOWN) { |
| 537 AdvanceFocus(false); | 542 AdvanceFocus(false); |
| 538 return true; | 543 return true; |
| 539 } | 544 } |
| 540 | 545 |
| 541 return false; | 546 return false; |
| 542 } | 547 } |
| 543 | 548 |
| 544 } // namespace views | 549 } // namespace views |
| OLD | NEW |