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

Unified Diff: ui/base/accelerator_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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/base/accelerator_manager.h ('k') | ui/ui.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/accelerator_manager.cc
diff --git a/ui/base/accelerator_manager.cc b/ui/base/accelerator_manager.cc
new file mode 100644
index 0000000000000000000000000000000000000000..8ebfefd1383343b6c2b2a380150e4dcb5c753415
--- /dev/null
+++ b/ui/base/accelerator_manager.cc
@@ -0,0 +1,77 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/accelerator_manager.h"
+
+#include <algorithm>
+
+#include "base/logging.h"
+
+namespace ui {
+
+AcceleratorManager::AcceleratorManager() {
+}
+
+AcceleratorManager::~AcceleratorManager() {
+}
+
+void AcceleratorManager::Register(const Accelerator& accelerator,
+ AcceleratorTarget* target) {
+ AcceleratorTargetList& targets = accelerators_[accelerator];
+ DCHECK(std::find(targets.begin(), targets.end(), target) == targets.end())
+ << "Registering the same target multiple times";
+ targets.push_front(target);
+}
+
+void AcceleratorManager::Unregister(const Accelerator& accelerator,
+ AcceleratorTarget* target) {
+ AcceleratorMap::iterator map_iter = accelerators_.find(accelerator);
+ if (map_iter == accelerators_.end()) {
+ NOTREACHED() << "Unregistering non-existing accelerator";
+ return;
+ }
+
+ AcceleratorTargetList* targets = &map_iter->second;
+ AcceleratorTargetList::iterator target_iter =
+ std::find(targets->begin(), targets->end(), target);
+ if (target_iter == targets->end()) {
+ NOTREACHED() << "Unregistering accelerator for wrong target";
+ return;
+ }
+
+ targets->erase(target_iter);
+}
+
+void AcceleratorManager::UnregisterAll(AcceleratorTarget* target) {
+ for (AcceleratorMap::iterator map_iter = accelerators_.begin();
+ map_iter != accelerators_.end(); ++map_iter) {
+ AcceleratorTargetList* targets = &map_iter->second;
+ targets->remove(target);
+ }
+}
+
+bool AcceleratorManager::Process(const Accelerator& accelerator) {
+ AcceleratorMap::iterator map_iter = accelerators_.find(accelerator);
+ if (map_iter != accelerators_.end()) {
+ // We have to copy the target list here, because an AcceleratorPressed
+ // event handler may modify the list.
+ AcceleratorTargetList targets(map_iter->second);
+ for (AcceleratorTargetList::iterator iter = targets.begin();
+ iter != targets.end(); ++iter) {
+ if ((*iter)->AcceleratorPressed(accelerator))
+ return true;
+ }
+ }
+ return false;
+}
+
+AcceleratorTarget* AcceleratorManager::GetCurrentTarget(
+ const Accelerator& accelerator) const {
+ AcceleratorMap::const_iterator map_iter = accelerators_.find(accelerator);
+ if (map_iter == accelerators_.end() || map_iter->second.empty())
+ return NULL;
+ return map_iter->second.front();
+}
+
+} // namespace ui
« no previous file with comments | « ui/base/accelerator_manager.h ('k') | ui/ui.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698