| Index: ui/views/widget/widget_accelerator_handling_delegate.cc
|
| diff --git a/ui/views/widget/widget_accelerator_handling_delegate.cc b/ui/views/widget/widget_accelerator_handling_delegate.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..46bd333680e2235d83e86d045236ae942e77eaef
|
| --- /dev/null
|
| +++ b/ui/views/widget/widget_accelerator_handling_delegate.cc
|
| @@ -0,0 +1,72 @@
|
| +// Copyright (c) 2016 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/views/widget/widget_accelerator_handling_delegate.h"
|
| +
|
| +#include "ui/views/focus/focus_manager_delegate.h"
|
| +#include "ui/views/widget/widget.h"
|
| +
|
| +namespace views {
|
| +
|
| +namespace {
|
| +
|
| +class ForwardingFocusManagerDelegate : public FocusManagerDelegate {
|
| + public:
|
| + explicit ForwardingFocusManagerDelegate(
|
| + WidgetAcceleratorHandlingDelegate* owner)
|
| + : owner_(owner->GetWeakPtr()) {}
|
| + ~ForwardingFocusManagerDelegate() override = default;
|
| +
|
| + // Implements FocusManagerDelegate:
|
| + bool ProcessAccelerator(const ui::Accelerator& accelerator) override {
|
| + if (!owner_)
|
| + return false;
|
| + Widget* target = owner_->accelerator_target();
|
| + if (!target)
|
| + return false;
|
| + FocusManager* target_focus_manager = target->GetFocusManager();
|
| + if (!target_focus_manager)
|
| + return false;
|
| + return target_focus_manager->ProcessAccelerator(accelerator);
|
| + }
|
| +
|
| + private:
|
| + base::WeakPtr<WidgetAcceleratorHandlingDelegate> owner_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ForwardingFocusManagerDelegate);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +WidgetAcceleratorHandlingDelegate::WidgetAcceleratorHandlingDelegate(
|
| + Widget* accelerator_target)
|
| + : accelerator_target_(accelerator_target),
|
| + accelerator_target_observer_(this),
|
| + weak_factory_(this) {
|
| + DCHECK(accelerator_target_);
|
| + accelerator_target_observer_.Add(accelerator_target_);
|
| + accelerator_target_->AddHandleAcceleratorsOverride();
|
| +}
|
| +
|
| +WidgetAcceleratorHandlingDelegate::~WidgetAcceleratorHandlingDelegate() {
|
| + accelerator_target_->RemoveHandleAcceleratorsOverride();
|
| +}
|
| +
|
| +base::WeakPtr<WidgetAcceleratorHandlingDelegate>
|
| +WidgetAcceleratorHandlingDelegate::GetWeakPtr() {
|
| + return weak_factory_.GetWeakPtr();
|
| +}
|
| +
|
| +std::unique_ptr<FocusManagerDelegate>
|
| +WidgetAcceleratorHandlingDelegate::CreateFocusManagerDelegate() {
|
| + return base::MakeUnique<ForwardingFocusManagerDelegate>(this);
|
| +}
|
| +
|
| +void WidgetAcceleratorHandlingDelegate::OnWidgetDestroying(Widget* widget) {
|
| + DCHECK_EQ(accelerator_target_, widget);
|
| + accelerator_target_ = nullptr;
|
| + accelerator_target_observer_.Remove(widget);
|
| +}
|
| +
|
| +} // namespace views
|
|
|