diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-11 14:04:00 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-11 14:04:00 +0000 |
commit | c476652ae760b3dd16d26f4375d9f28fee42238d (patch) | |
tree | 46882f8a7b13e61052918b6dfbaac827cd515187 /views/widget/drop_helper.h | |
parent | 73704c8719ee45cbf0a92c16d2450952799dccac (diff) | |
download | chromium_src-c476652ae760b3dd16d26f4375d9f28fee42238d.zip chromium_src-c476652ae760b3dd16d26f4375d9f28fee42238d.tar.gz chromium_src-c476652ae760b3dd16d26f4375d9f28fee42238d.tar.bz2 |
Refactors RootViewDropTarget into a platform independent part,
DropHelper, and the platform specific part DropTarget. I've also moved
ownership/creation of the DropTarget to Widget. This makes it alot
easier for the windows side, in which DropTarget must implement
IDataObject.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/165155
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23020 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/widget/drop_helper.h')
-rw-r--r-- | views/widget/drop_helper.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/views/widget/drop_helper.h b/views/widget/drop_helper.h new file mode 100644 index 0000000..63bfa27 --- /dev/null +++ b/views/widget/drop_helper.h @@ -0,0 +1,104 @@ +// Copyright (c) 2006-2008 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. + +#ifndef VIEWS_WIDGET_DROP_HELPER_H_ +#define VIEWS_WIDGET_DROP_HELPER_H_ + +#include "base/basictypes.h" + +class OSExchangeData; + +namespace gfx { +class Point; +} // namespace gfx + +namespace views { + +class RootView; +class View; + +// DropHelper provides support for managing the view a drop is going to occur +// at during dnd as well as sending the view the appropriate dnd methods. +// DropHelper is intended to be used by a class that interacts with the system +// drag and drop. The system class invokes OnDragOver as the mouse moves, +// then either OnDragExit or OnDrop when the drop is done. +class DropHelper { + public: + explicit DropHelper(RootView* root_view); + ~DropHelper(); + + // Current view drop events are targeted at, may be NULL. + View* target_view() const { return target_view_; } + + // Returns the RootView the DropHelper was created with. + RootView* root_view() const { return root_view_; } + + // Resets the target_view_ to NULL if it equals view. + // + // This is invoked when a View is removed from the RootView to make sure + // we don't target a view that was removed during dnd. + void ResetTargetViewIfEquals(View* view); + + // Invoked when a the mouse is dragged over the root view during a drag and + // drop operation. This method returns a bitmask of the types in DragDropTypes + // for the target view. If no view wants the drop, DRAG_NONE is returned. + int OnDragOver(const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation); + + // Invoked when a the mouse is dragged out of the root view during a drag and + // drop operation. + void OnDragExit(); + + // Invoked when the user drops data on the root view during a drag and drop + // operation. See OnDragOver for details on return type. + // + // NOTE: implementations must invoke OnDragOver before invoking this, + // supplying the return value from OnDragOver as the drag_operation. + int OnDrop(const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation); + + // Calculates the target view for a drop given the specified location in + // the coordinate system of the rootview. This tries to avoid continually + // querying CanDrop by returning target_view_ if the mouse is still over + // target_view_. + View* CalculateTargetView(const gfx::Point& root_view_location, + const OSExchangeData& data, + bool check_can_drop); + + private: + // Implementation of CalculateTargetView. If |deepest_view| is non-NULL it is + // set to the deepest descendant of the RootView that contains the point + // |root_view_location| + View* CalculateTargetViewImpl(const gfx::Point& root_view_location, + const OSExchangeData& data, + bool check_can_drop, + View** deepest_view); + + // Methods to send the appropriate drop notification to the targeted view. + // These do nothing if the target view is NULL. + void NotifyDragEntered(const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation); + int NotifyDragOver(const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation); + void NotifyDragExit(); + + // RootView we were created for. + RootView* root_view_; + + // View we're targeting events at. + View* target_view_; + + // The deepest view under the current drop coordinate. + View* deepest_view_; + + DISALLOW_COPY_AND_ASSIGN(DropHelper); +}; + +} // namespace views + +#endif // VIEWS_WIDGET_DROP_HELPER_H_ |