Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(611)

Unified Diff: ui/aura_shell/shell.cc

Issue 8450018: First shot at implementing drag&drop for Aura (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: minor changes Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/aura_shell/shell.cc
diff --git a/ui/aura_shell/shell.cc b/ui/aura_shell/shell.cc
index 659bfc8bdf0e353b562504a1da9361e49eba00f3..f76927564e55e5b961d294b784efb5e45becedc9 100644
--- a/ui/aura_shell/shell.cc
+++ b/ui/aura_shell/shell.cc
@@ -8,6 +8,7 @@
#include "base/command_line.h"
#include "ui/aura/aura_switches.h"
#include "ui/aura/desktop.h"
+#include "ui/aura/event.h"
#include "ui/aura/screen_aura.h"
#include "ui/aura/toplevel_window_container.h"
#include "ui/aura/window.h"
@@ -20,8 +21,10 @@
#include "ui/aura_shell/shell_factory.h"
#include "ui/aura_shell/shell_window_ids.h"
#include "ui/aura_shell/workspace/workspace_controller.h"
+#include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
#include "ui/gfx/compositor/layer.h"
#include "ui/gfx/compositor/layer_animator.h"
+#include "views/controls/image_view.h"
#include "views/widget/native_widget_aura.h"
#include "views/widget/widget.h"
@@ -70,6 +73,19 @@ void CreateSpecialContainers(aura::Window::Windows* containers) {
containers->push_back(menu_container);
}
+
+Widget* CreateDragWidget() {
+ Widget* drag_widget = new Widget;
+ Widget::InitParams params;
+ params.type = Widget::InitParams::TYPE_TOOLTIP;
Ben Goodger (Google) 2011/11/07 20:33:36 I fear overloading types like this. It's not actua
varunjain 2011/11/08 21:59:35 My intention was to put it in the same container a
+ params.keep_on_top = true;
+ params.accept_events = false;
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ drag_widget->Init(params);
+ drag_widget->SetOpacity(0xFF);
+ return drag_widget;
+}
+
} // namespace
// static
@@ -79,7 +95,9 @@ Shell* Shell::instance_ = NULL;
// Shell, public:
Shell::Shell()
- : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
+ : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
+ drag_data_(NULL),
+ drag_widget_(NULL) {
aura::Desktop::GetInstance()->SetDelegate(this);
}
@@ -196,4 +214,65 @@ aura::Window* Shell::GetTopmostWindowToActivate(aura::Window* ignore) const {
return container->GetTopmostWindowToActivate(ignore);
}
+aura::DragDropController* Shell::GetDragDropController() const {
+#if defined(OS_WIN)
+ return NULL;
Ben Goodger (Google) 2011/11/07 20:33:36 why?
varunjain 2011/11/08 21:59:35 Done.
+#else
+ return const_cast<aura_shell::Shell*>(this);
+#endif
+}
+
+void Shell::StartDragAndDrop(const ui::OSExchangeData& data,
+ int operation,
+ const gfx::Point& location) {
+#if !defined(OS_WIN)
Ben Goodger (Google) 2011/11/07 20:33:36 why?
varunjain 2011/11/08 21:59:35 Done.
+ DCHECK(drag_data_ == NULL);
+ DCHECK(drag_widget_.get() == NULL);
+ drag_data_ = &data;
+ drag_widget_.reset(CreateDragWidget());
+ const ui::OSExchangeDataProviderAura& provider =
+ static_cast<const ui::OSExchangeDataProviderAura&>(data.provider());
+
+ views::ImageView* image_view = new views::ImageView();
+ image_view->SetImage(provider.drag_image());
+ drag_widget_->SetContentsView(image_view);
+ drag_widget_->SetBounds(gfx::Rect(location,
+ image_view->GetPreferredSize()));
+ drag_widget_->Show();
+#endif
+}
+
+void Shell::DragUpdate(const aura::MouseEvent& event) {
+#if !defined(OS_WIN)
Ben Goodger (Google) 2011/11/07 20:33:36 why?
varunjain 2011/11/08 21:59:35 Done.
+ // TODO(varunjain): forward drag update to the window under cursor:
+ aura::Window* window = aura::Desktop::GetInstance()->
+ GetEventHandlerForPoint(event.location());
+ // window->DragUpdate(data, event);
+
+ DCHECK(drag_widget_.get());
+ if (drag_widget_->IsVisible()) {
+ gfx::Rect bounds = drag_widget_->GetClientAreaScreenBounds();
+ bounds.set_origin(event.location());
+ drag_widget_->SetBounds(bounds);
+ }
+ NOTIMPLEMENTED();
+#endif
+}
+
+void Shell::Drop(const aura::MouseEvent& event) {
+#if !defined(OS_WIN)
Ben Goodger (Google) 2011/11/07 20:33:36 etc
varunjain 2011/11/08 21:59:35 Done.
+ // TODO(varunjain): forward drop event to the window under cursor
+ aura::Window* window = aura::Desktop::GetInstance()->
+ GetEventHandlerForPoint(event.location());
+ // if (window->CanDrop(data, event))
+ // window->Drop(data, event);
+ // else
+ // Do drag widget flying back animation
+ drag_widget_->Hide();
+ drag_widget_.reset();
+ drag_data_ = NULL;
+ NOTIMPLEMENTED();
+#endif
+}
+
} // namespace aura_shell

Powered by Google App Engine
This is Rietveld 408576698