diff options
author | wez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-21 18:17:35 +0000 |
---|---|---|
committer | wez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-21 18:17:35 +0000 |
commit | 84ad47e975cb77a12881dc0c72053a22993950ca (patch) | |
tree | 343752188cf8571abc5533d9eb37efb1eab03ebd /views/widget/drop_helper.cc | |
parent | 586cf35708db57b9013a12adc8d8513163e558de (diff) | |
download | chromium_src-84ad47e975cb77a12881dc0c72053a22993950ca.zip chromium_src-84ad47e975cb77a12881dc0c72053a22993950ca.tar.gz chromium_src-84ad47e975cb77a12881dc0c72053a22993950ca.tar.bz2 |
Revert "views: Move widget/ directory to ui/views." properly.
Review URL: http://codereview.chromium.org/8562003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110960 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/widget/drop_helper.cc')
-rw-r--r-- | views/widget/drop_helper.cc | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/views/widget/drop_helper.cc b/views/widget/drop_helper.cc new file mode 100644 index 0000000..4e5ce109 --- /dev/null +++ b/views/widget/drop_helper.cc @@ -0,0 +1,156 @@ +// 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 "views/widget/drop_helper.h" + +#include "ui/base/dragdrop/drag_drop_types.h" +#include "views/view.h" +#include "views/widget/widget.h" + +namespace views { + +DropHelper::DropHelper(View* root_view) + : root_view_(root_view), + target_view_(NULL), + deepest_view_(NULL) { +} + +DropHelper::~DropHelper() { +} + +void DropHelper::ResetTargetViewIfEquals(View* view) { + if (target_view_ == view) + target_view_ = NULL; + if (deepest_view_ == view) + deepest_view_ = NULL; +} + +int DropHelper::OnDragOver(const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation) { + View* view = CalculateTargetViewImpl(root_view_location, data, true, + &deepest_view_); + + if (view != target_view_) { + // Target changed notify old drag exited, then new drag entered. + NotifyDragExit(); + target_view_ = view; + NotifyDragEntered(data, root_view_location, drag_operation); + } + + return NotifyDragOver(data, root_view_location, drag_operation); +} + +void DropHelper::OnDragExit() { + NotifyDragExit(); + deepest_view_ = target_view_ = NULL; +} + +int DropHelper::OnDrop(const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation) { + View* drop_view = target_view_; + deepest_view_ = target_view_ = NULL; + if (!drop_view) + return ui::DragDropTypes::DRAG_NONE; + + if (drag_operation == ui::DragDropTypes::DRAG_NONE) { + drop_view->OnDragExited(); + return ui::DragDropTypes::DRAG_NONE; + } + + gfx::Point view_location(root_view_location); + View* root_view = drop_view->GetWidget()->GetRootView(); + View::ConvertPointToView(root_view, drop_view, &view_location); + DropTargetEvent drop_event(data, view_location.x(), view_location.y(), + drag_operation); + return drop_view->OnPerformDrop(drop_event); +} + +View* DropHelper::CalculateTargetView( + const gfx::Point& root_view_location, + const OSExchangeData& data, + bool check_can_drop) { + return CalculateTargetViewImpl(root_view_location, data, check_can_drop, + NULL); +} + +View* DropHelper::CalculateTargetViewImpl( + const gfx::Point& root_view_location, + const OSExchangeData& data, + bool check_can_drop, + View** deepest_view) { + View* view = root_view_->GetEventHandlerForPoint(root_view_location); + if (view == deepest_view_) { + // The view the mouse is over hasn't changed; reuse the target. + return target_view_; + } + if (deepest_view) + *deepest_view = view; + // TODO(sky): for the time being these are separate. Once I port chrome menu + // I can switch to the #else implementation and nuke the OS_WIN + // implementation. +#if defined(OS_WIN) + // View under mouse changed, which means a new view may want the drop. + // Walk the tree, stopping at target_view_ as we know it'll accept the + // drop. + while (view && view != target_view_ && + (!view->IsEnabled() || !view->CanDrop(data))) { + view = view->parent(); + } +#else + int formats = 0; + std::set<OSExchangeData::CustomFormat> custom_formats; + while (view && view != target_view_) { + if (view->IsEnabled() && + view->GetDropFormats(&formats, &custom_formats) && + data.HasAnyFormat(formats, custom_formats) && + (!check_can_drop || view->CanDrop(data))) { + // Found the view. + return view; + } + formats = 0; + custom_formats.clear(); + view = view->parent(); + } +#endif + return view; +} + +void DropHelper::NotifyDragEntered(const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation) { + if (!target_view_) + return; + + gfx::Point target_view_location(root_view_location); + View::ConvertPointToView(root_view_, target_view_, &target_view_location); + DropTargetEvent enter_event(data, + target_view_location.x(), + target_view_location.y(), + drag_operation); + target_view_->OnDragEntered(enter_event); +} + +int DropHelper::NotifyDragOver(const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation) { + if (!target_view_) + return ui::DragDropTypes::DRAG_NONE; + + gfx::Point target_view_location(root_view_location); + View::ConvertPointToView(root_view_, target_view_, &target_view_location); + DropTargetEvent enter_event(data, + target_view_location.x(), + target_view_location.y(), + drag_operation); + return target_view_->OnDragUpdated(enter_event); +} + +void DropHelper::NotifyDragExit() { + if (target_view_) + target_view_->OnDragExited(); +} + +} // namespace views |