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 |