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 |