Index: views/widget/drop_target_gtk.h |
diff --git a/views/widget/drop_target_gtk.h b/views/widget/drop_target_gtk.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..daa08f2e523ddce5b2111bac426f48a7c924cc3b |
--- /dev/null |
+++ b/views/widget/drop_target_gtk.h |
@@ -0,0 +1,120 @@ |
+// 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. |
+ |
+#ifndef VIEWS_WIDGET_DROP_TARGET_GTK_H_ |
+#define VIEWS_WIDGET_DROP_TARGET_GTK_H_ |
+#pragma once |
+ |
+#include <gtk/gtk.h> |
+#include <set> |
+ |
+#include "base/memory/scoped_ptr.h" |
+#include "ui/base/dragdrop/os_exchange_data.h" |
+#include "views/widget/drop_helper.h" |
+ |
+namespace ui { |
+class OSExchangeDataProviderGtk; |
+} |
+using ui::OSExchangeData; |
+using ui::OSExchangeDataProviderGtk; |
+ |
+namespace views { |
+ |
+class View; |
+namespace internal { |
+class RootView; |
+} |
+ |
+// DropTarget implementation for Gtk. |
+// |
+// The data for a drop is not immediately available on X. As such we lazily |
+// ask for data as necessary. Some Views require data before they can determine |
+// if the drop is going to be allowed. When such a View is encountered the |
+// relevant data is requested from the drag source. When the data is available |
+// the target is notified. Similarly if the drop completes and the data has |
+// not yet been fetched, it is fetched and the target then notified. |
+// |
+// When a drop finishes this class calls back to the containing NativeWidgetGtk |
+// which results in deleting the DropTargetGtk. |
+class DropTargetGtk { |
+ public: |
+ DropTargetGtk(internal::RootView* root_view, GdkDragContext* context); |
+ ~DropTargetGtk(); |
+ |
+ // If a drag and drop is underway and |view| is the current drop target, the |
+ // drop target is set to null. |
+ // 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); |
+ |
+ // Drop methods from Gtk. These are forwarded from the containing |
+ // NativeWidgetGtk. |
+ void OnDragDataReceived(GdkDragContext* context, |
+ gint x, |
+ gint y, |
+ GtkSelectionData* data, |
+ guint info, |
+ guint time); |
+ gboolean OnDragDrop(GdkDragContext* context, |
+ gint x, |
+ gint y, |
+ guint time); |
+ void OnDragLeave(GdkDragContext* context, guint time); |
+ gboolean OnDragMotion(GdkDragContext* context, |
+ gint x, |
+ gint y, |
+ guint time); |
+ |
+ private: |
+ // Invoked when the drop finishes AND all the data is available. |
+ void FinishDrop(GdkDragContext* context, gint x, gint y, guint time); |
+ |
+ // Returns in |f2| and |cf2| the intersection of |f1| |f2| and |
+ // |cf1|, |cf2|. |
+ void IntersectFormats(int f1, const std::set<GdkAtom>& cf1, |
+ int* f2, std::set<GdkAtom>* cf2); |
+ |
+ // Requests the formats in |formats| and the custom formats in |
+ // |custom_formats|. |
+ void RequestFormats(GdkDragContext* context, |
+ int formats, |
+ const std::set<GdkAtom>& custom_formats, |
+ guint time); |
+ |
+ // Reutrns the Provider of the OSExchangeData we created. |
+ OSExchangeDataProviderGtk& data_provider() const; |
+ |
+ // Manages sending the appropriate drop methods to the view the drop is over. |
+ DropHelper helper_; |
+ |
+ // The formats we've requested from the drag source. |
+ // |
+ // NOTE: these formats are the intersection of the formats requested by the |
+ // drop target and the formats provided by the source. |
+ int requested_formats_; |
+ std::set<GdkAtom> requested_custom_formats_; |
+ |
+ // The data. |
+ scoped_ptr<OSExchangeData> data_; |
+ |
+ // Are we waiting for data from the source before we can notify the view? |
+ // This is set in two distinct ways: when the view requires the data before |
+ // it can answer Can Drop (that is, AreDropTypesRequired returns true) and |
+ // when the user dropped the data but we didn't get it all yet. |
+ bool waiting_for_data_; |
+ |
+ // Has OnDragDrop been invoked? |
+ bool received_drop_; |
+ |
+ // The view under the mouse. This is not necessarily the same as |
+ // helper_.target_view(). The two differ if the view under the mouse requires |
+ // the data. |
+ View* pending_view_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DropTargetGtk); |
+}; |
+ |
+} // namespace views |
+ |
+#endif // VIEWS_WIDGET_DROP_TARGET_GTK_H_ |