| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "ui/views/widget/widget_accelerator_handling_delegate.h" |
| 6 |
| 7 #include "ui/views/focus/focus_manager_delegate.h" |
| 8 #include "ui/views/widget/widget.h" |
| 9 |
| 10 namespace views { |
| 11 |
| 12 namespace { |
| 13 |
| 14 class ForwardingFocusManagerDelegate : public FocusManagerDelegate { |
| 15 public: |
| 16 explicit ForwardingFocusManagerDelegate( |
| 17 WidgetAcceleratorHandlingDelegate* owner) |
| 18 : owner_(owner->GetWeakPtr()) {} |
| 19 ~ForwardingFocusManagerDelegate() override = default; |
| 20 |
| 21 // Implements FocusManagerDelegate: |
| 22 bool ProcessAccelerator(const ui::Accelerator& accelerator) override { |
| 23 if (!owner_) |
| 24 return false; |
| 25 Widget* target = owner_->accelerator_target(); |
| 26 if (!target) |
| 27 return false; |
| 28 FocusManager* target_focus_manager = target->GetFocusManager(); |
| 29 if (!target_focus_manager) |
| 30 return false; |
| 31 return target_focus_manager->ProcessAccelerator(accelerator); |
| 32 } |
| 33 |
| 34 private: |
| 35 base::WeakPtr<WidgetAcceleratorHandlingDelegate> owner_; |
| 36 |
| 37 DISALLOW_COPY_AND_ASSIGN(ForwardingFocusManagerDelegate); |
| 38 }; |
| 39 |
| 40 } // namespace |
| 41 |
| 42 WidgetAcceleratorHandlingDelegate::WidgetAcceleratorHandlingDelegate( |
| 43 Widget* accelerator_target) |
| 44 : accelerator_target_(accelerator_target), |
| 45 accelerator_target_observer_(this), |
| 46 weak_factory_(this) { |
| 47 DCHECK(accelerator_target_); |
| 48 accelerator_target_observer_.Add(accelerator_target_); |
| 49 accelerator_target_->AddHandleAcceleratorsOverride(); |
| 50 } |
| 51 |
| 52 WidgetAcceleratorHandlingDelegate::~WidgetAcceleratorHandlingDelegate() { |
| 53 accelerator_target_->RemoveHandleAcceleratorsOverride(); |
| 54 } |
| 55 |
| 56 base::WeakPtr<WidgetAcceleratorHandlingDelegate> |
| 57 WidgetAcceleratorHandlingDelegate::GetWeakPtr() { |
| 58 return weak_factory_.GetWeakPtr(); |
| 59 } |
| 60 |
| 61 std::unique_ptr<FocusManagerDelegate> |
| 62 WidgetAcceleratorHandlingDelegate::CreateFocusManagerDelegate() { |
| 63 return base::MakeUnique<ForwardingFocusManagerDelegate>(this); |
| 64 } |
| 65 |
| 66 void WidgetAcceleratorHandlingDelegate::OnWidgetDestroying(Widget* widget) { |
| 67 DCHECK_EQ(accelerator_target_, widget); |
| 68 accelerator_target_ = nullptr; |
| 69 accelerator_target_observer_.Remove(widget); |
| 70 } |
| 71 |
| 72 } // namespace views |
| OLD | NEW |