| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 12 #include "ui/base/accelerator_manager.h" |
| 12 #include "ui/base/keycodes/keyboard_codes.h" | 13 #include "ui/base/keycodes/keyboard_codes.h" |
| 13 #include "ui/base/models/accelerator.h" | 14 #include "ui/base/models/accelerator.h" |
| 14 #include "views/focus/focus_search.h" | 15 #include "views/focus/focus_search.h" |
| 15 #include "views/focus/view_storage.h" | 16 #include "views/focus/view_storage.h" |
| 16 #include "views/focus/widget_focus_manager.h" | 17 #include "views/focus/widget_focus_manager.h" |
| 17 #include "views/view.h" | 18 #include "views/view.h" |
| 18 #include "views/widget/root_view.h" | 19 #include "views/widget/root_view.h" |
| 19 #include "views/widget/widget.h" | 20 #include "views/widget/widget.h" |
| 20 | 21 |
| 21 namespace views { | 22 namespace views { |
| 22 | 23 |
| 23 FocusManager::FocusManager(Widget* widget) | 24 FocusManager::FocusManager(Widget* widget) |
| 24 : widget_(widget), | 25 : widget_(widget), |
| 25 focused_view_(NULL), | 26 focused_view_(NULL), |
| 27 accelerator_manager_(new ui::AcceleratorManager), |
| 26 focus_change_reason_(kReasonDirectFocusChange), | 28 focus_change_reason_(kReasonDirectFocusChange), |
| 27 is_changing_focus_(false) { | 29 is_changing_focus_(false) { |
| 28 DCHECK(widget_); | 30 DCHECK(widget_); |
| 29 stored_focused_view_storage_id_ = | 31 stored_focused_view_storage_id_ = |
| 30 ViewStorage::GetInstance()->CreateStorageID(); | 32 ViewStorage::GetInstance()->CreateStorageID(); |
| 31 } | 33 } |
| 32 | 34 |
| 33 FocusManager::~FocusManager() { | 35 FocusManager::~FocusManager() { |
| 34 } | 36 } |
| 35 | 37 |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 false, | 356 false, |
| 355 &new_focus_traversable, | 357 &new_focus_traversable, |
| 356 &new_starting_view); | 358 &new_starting_view); |
| 357 } | 359 } |
| 358 return v; | 360 return v; |
| 359 } | 361 } |
| 360 | 362 |
| 361 void FocusManager::RegisterAccelerator( | 363 void FocusManager::RegisterAccelerator( |
| 362 const ui::Accelerator& accelerator, | 364 const ui::Accelerator& accelerator, |
| 363 ui::AcceleratorTarget* target) { | 365 ui::AcceleratorTarget* target) { |
| 364 AcceleratorTargetList& targets = accelerators_[accelerator]; | 366 accelerator_manager_->Register(accelerator, target); |
| 365 DCHECK(std::find(targets.begin(), targets.end(), target) == targets.end()) | |
| 366 << "Registering the same target multiple times"; | |
| 367 targets.push_front(target); | |
| 368 } | 367 } |
| 369 | 368 |
| 370 void FocusManager::UnregisterAccelerator(const ui::Accelerator& accelerator, | 369 void FocusManager::UnregisterAccelerator(const ui::Accelerator& accelerator, |
| 371 ui::AcceleratorTarget* target) { | 370 ui::AcceleratorTarget* target) { |
| 372 AcceleratorMap::iterator map_iter = accelerators_.find(accelerator); | 371 accelerator_manager_->Unregister(accelerator, target); |
| 373 if (map_iter == accelerators_.end()) { | |
| 374 NOTREACHED() << "Unregistering non-existing accelerator"; | |
| 375 return; | |
| 376 } | |
| 377 | |
| 378 AcceleratorTargetList* targets = &map_iter->second; | |
| 379 AcceleratorTargetList::iterator target_iter = | |
| 380 std::find(targets->begin(), targets->end(), target); | |
| 381 if (target_iter == targets->end()) { | |
| 382 NOTREACHED() << "Unregistering accelerator for wrong target"; | |
| 383 return; | |
| 384 } | |
| 385 | |
| 386 targets->erase(target_iter); | |
| 387 } | 372 } |
| 388 | 373 |
| 389 void FocusManager::UnregisterAccelerators(ui::AcceleratorTarget* target) { | 374 void FocusManager::UnregisterAccelerators(ui::AcceleratorTarget* target) { |
| 390 for (AcceleratorMap::iterator map_iter = accelerators_.begin(); | 375 accelerator_manager_->UnregisterAll(target); |
| 391 map_iter != accelerators_.end(); ++map_iter) { | |
| 392 AcceleratorTargetList* targets = &map_iter->second; | |
| 393 targets->remove(target); | |
| 394 } | |
| 395 } | 376 } |
| 396 | 377 |
| 397 bool FocusManager::ProcessAccelerator(const ui::Accelerator& accelerator) { | 378 bool FocusManager::ProcessAccelerator(const ui::Accelerator& accelerator) { |
| 398 AcceleratorMap::iterator map_iter = accelerators_.find(accelerator); | 379 return accelerator_manager_->Process(accelerator); |
| 399 if (map_iter != accelerators_.end()) { | |
| 400 // We have to copy the target list here, because an AcceleratorPressed | |
| 401 // event handler may modify the list. | |
| 402 AcceleratorTargetList targets(map_iter->second); | |
| 403 for (AcceleratorTargetList::iterator iter = targets.begin(); | |
| 404 iter != targets.end(); ++iter) { | |
| 405 if ((*iter)->AcceleratorPressed(accelerator)) | |
| 406 return true; | |
| 407 } | |
| 408 } | |
| 409 return false; | |
| 410 } | 380 } |
| 411 | 381 |
| 412 ui::AcceleratorTarget* FocusManager::GetCurrentTargetForAccelerator( | 382 ui::AcceleratorTarget* FocusManager::GetCurrentTargetForAccelerator( |
| 413 const ui::Accelerator& accelerator) const { | 383 const ui::Accelerator& accelerator) const { |
| 414 AcceleratorMap::const_iterator map_iter = accelerators_.find(accelerator); | 384 return accelerator_manager_->GetCurrentTarget(accelerator); |
| 415 if (map_iter == accelerators_.end() || map_iter->second.empty()) | |
| 416 return NULL; | |
| 417 return map_iter->second.front(); | |
| 418 } | 385 } |
| 419 | 386 |
| 420 void FocusManager::FocusNativeView(gfx::NativeView native_view) { | 387 void FocusManager::FocusNativeView(gfx::NativeView native_view) { |
| 421 widget_->FocusNativeView(native_view); | 388 widget_->FocusNativeView(native_view); |
| 422 } | 389 } |
| 423 | 390 |
| 424 // static | 391 // static |
| 425 bool FocusManager::IsTabTraversalKeyEvent(const KeyEvent& key_event) { | 392 bool FocusManager::IsTabTraversalKeyEvent(const KeyEvent& key_event) { |
| 426 return key_event.key_code() == ui::VKEY_TAB && !key_event.IsControlDown(); | 393 return key_event.key_code() == ui::VKEY_TAB && !key_event.IsControlDown(); |
| 427 } | 394 } |
| 428 | 395 |
| 429 void FocusManager::ViewRemoved(View* removed) { | 396 void FocusManager::ViewRemoved(View* removed) { |
| 430 // If the view being removed contains (or is) the focused view, | 397 // If the view being removed contains (or is) the focused view, |
| 431 // clear the focus. However, it's not safe to call ClearFocus() | 398 // clear the focus. However, it's not safe to call ClearFocus() |
| 432 // (and in turn ClearNativeFocus()) here because ViewRemoved() can | 399 // (and in turn ClearNativeFocus()) here because ViewRemoved() can |
| 433 // be called while the top level widget is being destroyed. | 400 // be called while the top level widget is being destroyed. |
| 434 if (focused_view_ && removed && removed->Contains(focused_view_)) | 401 if (focused_view_ && removed && removed->Contains(focused_view_)) |
| 435 SetFocusedView(NULL); | 402 SetFocusedView(NULL); |
| 436 } | 403 } |
| 437 | 404 |
| 438 void FocusManager::AddFocusChangeListener(FocusChangeListener* listener) { | 405 void FocusManager::AddFocusChangeListener(FocusChangeListener* listener) { |
| 439 focus_change_listeners_.AddObserver(listener); | 406 focus_change_listeners_.AddObserver(listener); |
| 440 } | 407 } |
| 441 | 408 |
| 442 void FocusManager::RemoveFocusChangeListener(FocusChangeListener* listener) { | 409 void FocusManager::RemoveFocusChangeListener(FocusChangeListener* listener) { |
| 443 focus_change_listeners_.RemoveObserver(listener); | 410 focus_change_listeners_.RemoveObserver(listener); |
| 444 } | 411 } |
| 445 | 412 |
| 446 } // namespace views | 413 } // namespace views |
| OLD | NEW |