Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Side by Side Diff: views/focus/focus_manager.cc

Issue 8508056: Split a part of code managing accelerators from views::FocusManager. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Address comments Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « views/focus/focus_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « views/focus/focus_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698