diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-08 06:57:27 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-08 06:57:27 +0000 |
commit | 166d7ffb4093ead55406315b191f6f491833eeda (patch) | |
tree | e9dff4c0024ccb8b30bba129437dc41e623d701c | |
parent | e9e27e4a6217ae193bd87c945fe79227cbc3eb49 (diff) | |
download | chromium_src-166d7ffb4093ead55406315b191f6f491833eeda.zip chromium_src-166d7ffb4093ead55406315b191f6f491833eeda.tar.gz chromium_src-166d7ffb4093ead55406315b191f6f491833eeda.tar.bz2 |
Get drag and drop working on Win Ash.
BUG=154081
Review URL: https://codereview.chromium.org/11787005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175494 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | ash/ash.gyp | 2 | ||||
-rw-r--r-- | ash/drag_drop/drag_drop_controller.cc | 27 | ||||
-rw-r--r-- | ash/drag_drop/drag_drop_controller_unittest.cc | 4 | ||||
-rw-r--r-- | ui/base/dragdrop/drag_utils_aura.cc | 7 | ||||
-rw-r--r-- | ui/base/dragdrop/drag_utils_win.cc | 8 | ||||
-rw-r--r-- | ui/base/dragdrop/os_exchange_data.h | 12 | ||||
-rw-r--r-- | ui/base/dragdrop/os_exchange_data_provider_aura.cc | 15 | ||||
-rw-r--r-- | ui/base/dragdrop/os_exchange_data_provider_aura.h | 14 | ||||
-rw-r--r-- | ui/base/dragdrop/os_exchange_data_provider_win.cc | 19 | ||||
-rw-r--r-- | ui/base/dragdrop/os_exchange_data_provider_win.h | 14 |
10 files changed, 85 insertions, 37 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp index 7fe58b7..420fc37 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -623,8 +623,6 @@ }], ['OS=="win"', { 'sources/': [ - # TODO(win_ash): implement DragDropController::StartDragAndDrop - ['exclude', 'drag_drop/drag_drop_controller_unittest.cc'], # TODO(zork): fix this test to build on Windows. See: crosbug.com/26906 ['exclude', 'focus_cycler_unittest.cc'], # All tests for multiple displays: not supported on Windows Ash. diff --git a/ash/drag_drop/drag_drop_controller.cc b/ash/drag_drop/drag_drop_controller.cc index 77fbd79..30362e2 100644 --- a/ash/drag_drop/drag_drop_controller.cc +++ b/ash/drag_drop/drag_drop_controller.cc @@ -19,7 +19,7 @@ #include "ui/aura/window.h" #include "ui/base/animation/linear_animation.h" #include "ui/base/dragdrop/drag_drop_types.h" -#include "ui/base/dragdrop/os_exchange_data_provider_aura.h" +#include "ui/base/dragdrop/os_exchange_data.h" #include "ui/base/events/event.h" #include "ui/base/events/event_utils.h" #include "ui/gfx/point.h" @@ -112,22 +112,10 @@ int DragDropController::StartDragAndDrop( if (IsDragDropInProgress()) return 0; -#if defined(OS_WIN) - // TODO(win_ash): need to figure out how this will work in Metro, since - // OSExchangeDataProviderAura isn't used in Windows builds. Two alternatives: - // 1) Use OSExchangeDataProviderAura in Ash and OSExchangeDataProviderWin - // elsewhere. This will complicate creating an ui::OSExchangeData to pass - // in more context. - // 2) Add methods to get the image and offset in the base interface of these - // implementations to get to this data here. - NOTIMPLEMENTED(); - return 0; -#else - const ui::OSExchangeDataProviderAura& provider = - static_cast<const ui::OSExchangeDataProviderAura&>(data.provider()); + const ui::OSExchangeData::Provider* provider = &data.provider(); // We do not support touch drag/drop without a drag image. if (source == ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH && - provider.drag_image().size().IsEmpty()) + provider->GetDragImage().size().IsEmpty()) return 0; current_drag_event_source_ = source; @@ -162,11 +150,11 @@ int DragDropController::StartDragAndDrop( gfx::Point start_location = root_location; ash::wm::ConvertPointToScreen(root_window, &start_location); drag_image_final_bounds_for_cancel_animation_ = gfx::Rect( - start_location - provider.drag_image_offset(), - provider.drag_image().size()); + start_location - provider->GetDragImageOffset(), + provider->GetDragImage().size()); drag_image_.reset(new DragImageView); - drag_image_->SetImage(provider.drag_image()); - drag_image_offset_ = provider.drag_image_offset(); + drag_image_->SetImage(provider->GetDragImage()); + drag_image_offset_ = provider->GetDragImageOffset(); gfx::Rect drag_image_bounds(start_location, drag_image_->GetPreferredSize()); drag_image_bounds = AdjustDragImageBoundsForScaleAndOffset(drag_image_bounds, drag_image_vertical_offset, drag_image_scale, &drag_image_offset_); @@ -197,7 +185,6 @@ int DragDropController::StartDragAndDrop( drag_source_window_->RemoveObserver(this); drag_source_window_ = NULL; } -#endif return drag_operation_; } diff --git a/ash/drag_drop/drag_drop_controller_unittest.cc b/ash/drag_drop/drag_drop_controller_unittest.cc index f52893a..a287ca8 100644 --- a/ash/drag_drop/drag_drop_controller_unittest.cc +++ b/ash/drag_drop/drag_drop_controller_unittest.cc @@ -233,8 +233,12 @@ class TestNativeWidgetAura : public views::NativeWidgetAura { // TODO(sky): this is for debugging, remove when track down failure. void SetCheckIfCaptureLost(views::Widget* widget, bool value) { + // On Windows, the DCHECK triggers when running on bot or locally through RDP, + // but not when logged in locally. +#if !defined(OS_WIN) static_cast<TestNativeWidgetAura*>(widget->native_widget())-> set_check_if_capture_lost(value); +#endif } views::Widget* CreateNewWidget() { diff --git a/ui/base/dragdrop/drag_utils_aura.cc b/ui/base/dragdrop/drag_utils_aura.cc index 07fd467..23c84fc 100644 --- a/ui/base/dragdrop/drag_utils_aura.cc +++ b/ui/base/dragdrop/drag_utils_aura.cc @@ -6,7 +6,6 @@ #include "base/logging.h" #include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/base/dragdrop/os_exchange_data_provider_aura.h" #include "ui/gfx/canvas.h" #include "ui/gfx/image/image_skia.h" #include "ui/gfx/size.h" @@ -18,10 +17,8 @@ void SetDragImageOnDataObject(const gfx::ImageSkia& image, const gfx::Size& size, const gfx::Vector2d& cursor_offset, ui::OSExchangeData* data_object) { - ui::OSExchangeDataProviderAura& provider( - static_cast<ui::OSExchangeDataProviderAura&>(data_object->provider())); - provider.set_drag_image(image); - provider.set_drag_image_offset(cursor_offset); + + data_object->provider().SetDragImage(image, cursor_offset); } } // namespace drag_utils diff --git a/ui/base/dragdrop/drag_utils_win.cc b/ui/base/dragdrop/drag_utils_win.cc index 9a3ab56..f03c9d7 100644 --- a/ui/base/dragdrop/drag_utils_win.cc +++ b/ui/base/dragdrop/drag_utils_win.cc @@ -68,6 +68,14 @@ void SetDragImageOnDataObject(const gfx::ImageSkia& image_skia, // Attach 'bitmap' to the data_object. SetDragImageOnDataObject(bitmap, size, cursor_offset, ui::OSExchangeDataProviderWin::GetIDataObject(*data_object)); + +#if defined(USE_AURA) + // TODO: the above code is used in non-Ash, while below is used in Ash. If we + // could figure this context out then we wouldn't do unnecessary work. However + // as it stands getting this information in ui/base would be a layering + // violation. + data_object->provider().SetDragImage(image_skia, cursor_offset); +#endif } } // namespace drag_utils diff --git a/ui/base/dragdrop/os_exchange_data.h b/ui/base/dragdrop/os_exchange_data.h index c99cf3a..5d89ebe 100644 --- a/ui/base/dragdrop/os_exchange_data.h +++ b/ui/base/dragdrop/os_exchange_data.h @@ -29,6 +29,11 @@ class GURL; class Pickle; +namespace gfx { +class ImageSkia; +class Vector2d; +} + namespace ui { /////////////////////////////////////////////////////////////////////////////// @@ -137,6 +142,13 @@ class UI_EXPORT OSExchangeData { virtual bool GetHtml(string16* html, GURL* base_url) const = 0; virtual bool HasHtml() const = 0; #endif + +#if defined(USE_AURA) + virtual void SetDragImage(const gfx::ImageSkia& image, + const gfx::Vector2d& cursor_offset) = 0; + virtual const gfx::ImageSkia& GetDragImage() const = 0; + virtual const gfx::Vector2d& GetDragImageOffset() const = 0; +#endif }; // Creates the platform specific Provider. diff --git a/ui/base/dragdrop/os_exchange_data_provider_aura.cc b/ui/base/dragdrop/os_exchange_data_provider_aura.cc index 8d6e2fc..34af849 100644 --- a/ui/base/dragdrop/os_exchange_data_provider_aura.cc +++ b/ui/base/dragdrop/os_exchange_data_provider_aura.cc @@ -162,6 +162,21 @@ bool OSExchangeDataProviderAura::HasHtml() const { return ((formats_ & OSExchangeData::HTML) != 0); } +void OSExchangeDataProviderAura::SetDragImage( + const gfx::ImageSkia& image, + const gfx::Vector2d& cursor_offset) { + drag_image_ = image; + drag_image_offset_ = cursor_offset; +} + +const gfx::ImageSkia& OSExchangeDataProviderAura::GetDragImage() const { + return drag_image_; +} + +const gfx::Vector2d& OSExchangeDataProviderAura::GetDragImageOffset() const { + return drag_image_offset_; +} + bool OSExchangeDataProviderAura::GetPlainTextURL(GURL* url) const { if ((formats_ & OSExchangeData::STRING) == 0) return false; diff --git a/ui/base/dragdrop/os_exchange_data_provider_aura.h b/ui/base/dragdrop/os_exchange_data_provider_aura.h index 14c684c..4b431d2 100644 --- a/ui/base/dragdrop/os_exchange_data_provider_aura.h +++ b/ui/base/dragdrop/os_exchange_data_provider_aura.h @@ -57,16 +57,10 @@ class UI_EXPORT OSExchangeDataProviderAura : public OSExchangeData::Provider { virtual void SetHtml(const string16& html, const GURL& base_url) OVERRIDE; virtual bool GetHtml(string16* html, GURL* base_url) const OVERRIDE; virtual bool HasHtml() const OVERRIDE; - - void set_drag_image(const gfx::ImageSkia& drag_image) { - drag_image_ = drag_image; - } - - const gfx::ImageSkia& drag_image() const { return drag_image_; } - void set_drag_image_offset(const gfx::Vector2d& drag_image_offset) { - drag_image_offset_ = drag_image_offset; - } - const gfx::Vector2d& drag_image_offset() const { return drag_image_offset_; } + virtual void SetDragImage(const gfx::ImageSkia& image, + const gfx::Vector2d& cursor_offset) OVERRIDE; + virtual const gfx::ImageSkia& GetDragImage() const OVERRIDE; + virtual const gfx::Vector2d& GetDragImageOffset() const OVERRIDE; private: typedef std::map<OSExchangeData::CustomFormat, Pickle> PickleData; diff --git a/ui/base/dragdrop/os_exchange_data_provider_win.cc b/ui/base/dragdrop/os_exchange_data_provider_win.cc index 65922f8..800f81a 100644 --- a/ui/base/dragdrop/os_exchange_data_provider_win.cc +++ b/ui/base/dragdrop/os_exchange_data_provider_win.cc @@ -499,6 +499,25 @@ void OSExchangeDataProviderWin::SetDownloadFileInfo( data_->contents_.push_back(info); } +#if defined(USE_AURA) + +void OSExchangeDataProviderWin::SetDragImage( + const gfx::ImageSkia& image, + const gfx::Vector2d& cursor_offset) { + drag_image_ = image; + drag_image_offset_ = cursor_offset; +} + +const gfx::ImageSkia& OSExchangeDataProviderWin::GetDragImage() const { + return drag_image_; +} + +const gfx::Vector2d& OSExchangeDataProviderWin::GetDragImageOffset() const { + return drag_image_offset_; +} + +#endif + /////////////////////////////////////////////////////////////////////////////// // DataObjectImpl, IDataObject implementation: diff --git a/ui/base/dragdrop/os_exchange_data_provider_win.h b/ui/base/dragdrop/os_exchange_data_provider_win.h index 9705d34..3381439 100644 --- a/ui/base/dragdrop/os_exchange_data_provider_win.h +++ b/ui/base/dragdrop/os_exchange_data_provider_win.h @@ -20,6 +20,8 @@ #include "base/win/scoped_comptr.h" #include "ui/base/dragdrop/os_exchange_data.h" #include "ui/base/ui_export.h" +#include "ui/gfx/image/image_skia.h" +#include "ui/gfx/vector2d.h" namespace ui { @@ -186,11 +188,23 @@ class UI_EXPORT OSExchangeDataProviderWin : public OSExchangeData::Provider { virtual bool HasCustomFormat(OSExchangeData::CustomFormat format) const; virtual void SetDownloadFileInfo( const OSExchangeData::DownloadFileInfo& download_info); +#if defined(USE_AURA) + virtual void SetDragImage(const gfx::ImageSkia& image, + const gfx::Vector2d& cursor_offset) OVERRIDE; + virtual const gfx::ImageSkia& GetDragImage() const OVERRIDE; + virtual const gfx::Vector2d& GetDragImageOffset() const OVERRIDE; +#endif private: scoped_refptr<DataObjectImpl> data_; base::win::ScopedComPtr<IDataObject> source_object_; +#if defined(USE_AURA) + // Drag image and offset data. Only used for Ash. + gfx::ImageSkia drag_image_; + gfx::Vector2d drag_image_offset_; +#endif + DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderWin); }; |