| // Copyright 2015 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/wm/public/scoped_drag_drop_disabler.h" |
| |
| #include "ui/aura/window.h" |
| #include "ui/wm/public/drag_drop_client.h" |
| |
| namespace aura { |
| namespace client { |
| |
| class NopDragDropClient : public DragDropClient { |
| public: |
| ~NopDragDropClient() override {} |
| int StartDragAndDrop(const ui::OSExchangeData& data, |
| aura::Window* root_window, |
| aura::Window* source_window, |
| const gfx::Point& screen_location, |
| int operation, |
| ui::DragDropTypes::DragEventSource source) override { |
| return 0; |
| } |
| void DragUpdate(aura::Window* target, |
| const ui::LocatedEvent& event) override {} |
| void Drop(aura::Window* target, const ui::LocatedEvent& event) override {} |
| void DragCancel() override {} |
| bool IsDragDropInProgress() override { |
| return false; |
| } |
| }; |
| |
| ScopedDragDropDisabler::ScopedDragDropDisabler(Window* window) |
| : window_(window), |
| old_client_(GetDragDropClient(window)), |
| new_client_(new NopDragDropClient()) { |
| SetDragDropClient(window_, new_client_.get()); |
| window_->AddObserver(this); |
| } |
| |
| ScopedDragDropDisabler::~ScopedDragDropDisabler() { |
| if (window_) { |
| window_->RemoveObserver(this); |
| SetDragDropClient(window_, old_client_); |
| } |
| } |
| |
| void ScopedDragDropDisabler::OnWindowDestroyed(Window* window) { |
| CHECK_EQ(window_, window); |
| window_ = NULL; |
| new_client_.reset(); |
| } |
| |
| } // namespace client |
| } // namespace aura |