OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef VIEWS_WIDGET_DROP_TARGET_GTK_H_ |
| 6 #define VIEWS_WIDGET_DROP_TARGET_GTK_H_ |
| 7 #pragma once |
| 8 |
| 9 #include <gtk/gtk.h> |
| 10 #include <set> |
| 11 |
| 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "ui/base/dragdrop/os_exchange_data.h" |
| 14 #include "views/widget/drop_helper.h" |
| 15 |
| 16 namespace ui { |
| 17 class OSExchangeDataProviderGtk; |
| 18 } |
| 19 using ui::OSExchangeData; |
| 20 using ui::OSExchangeDataProviderGtk; |
| 21 |
| 22 namespace views { |
| 23 |
| 24 class View; |
| 25 namespace internal { |
| 26 class RootView; |
| 27 } |
| 28 |
| 29 // DropTarget implementation for Gtk. |
| 30 // |
| 31 // The data for a drop is not immediately available on X. As such we lazily |
| 32 // ask for data as necessary. Some Views require data before they can determine |
| 33 // if the drop is going to be allowed. When such a View is encountered the |
| 34 // relevant data is requested from the drag source. When the data is available |
| 35 // the target is notified. Similarly if the drop completes and the data has |
| 36 // not yet been fetched, it is fetched and the target then notified. |
| 37 // |
| 38 // When a drop finishes this class calls back to the containing NativeWidgetGtk |
| 39 // which results in deleting the DropTargetGtk. |
| 40 class DropTargetGtk { |
| 41 public: |
| 42 DropTargetGtk(internal::RootView* root_view, GdkDragContext* context); |
| 43 ~DropTargetGtk(); |
| 44 |
| 45 // If a drag and drop is underway and |view| is the current drop target, the |
| 46 // drop target is set to null. |
| 47 // This is invoked when a View is removed from the RootView to make sure |
| 48 // we don't target a view that was removed during dnd. |
| 49 void ResetTargetViewIfEquals(View* view); |
| 50 |
| 51 // Drop methods from Gtk. These are forwarded from the containing |
| 52 // NativeWidgetGtk. |
| 53 void OnDragDataReceived(GdkDragContext* context, |
| 54 gint x, |
| 55 gint y, |
| 56 GtkSelectionData* data, |
| 57 guint info, |
| 58 guint time); |
| 59 gboolean OnDragDrop(GdkDragContext* context, |
| 60 gint x, |
| 61 gint y, |
| 62 guint time); |
| 63 void OnDragLeave(GdkDragContext* context, guint time); |
| 64 gboolean OnDragMotion(GdkDragContext* context, |
| 65 gint x, |
| 66 gint y, |
| 67 guint time); |
| 68 |
| 69 private: |
| 70 // Invoked when the drop finishes AND all the data is available. |
| 71 void FinishDrop(GdkDragContext* context, gint x, gint y, guint time); |
| 72 |
| 73 // Returns in |f2| and |cf2| the intersection of |f1| |f2| and |
| 74 // |cf1|, |cf2|. |
| 75 void IntersectFormats(int f1, const std::set<GdkAtom>& cf1, |
| 76 int* f2, std::set<GdkAtom>* cf2); |
| 77 |
| 78 // Requests the formats in |formats| and the custom formats in |
| 79 // |custom_formats|. |
| 80 void RequestFormats(GdkDragContext* context, |
| 81 int formats, |
| 82 const std::set<GdkAtom>& custom_formats, |
| 83 guint time); |
| 84 |
| 85 // Reutrns the Provider of the OSExchangeData we created. |
| 86 OSExchangeDataProviderGtk& data_provider() const; |
| 87 |
| 88 // Manages sending the appropriate drop methods to the view the drop is over. |
| 89 DropHelper helper_; |
| 90 |
| 91 // The formats we've requested from the drag source. |
| 92 // |
| 93 // NOTE: these formats are the intersection of the formats requested by the |
| 94 // drop target and the formats provided by the source. |
| 95 int requested_formats_; |
| 96 std::set<GdkAtom> requested_custom_formats_; |
| 97 |
| 98 // The data. |
| 99 scoped_ptr<OSExchangeData> data_; |
| 100 |
| 101 // Are we waiting for data from the source before we can notify the view? |
| 102 // This is set in two distinct ways: when the view requires the data before |
| 103 // it can answer Can Drop (that is, AreDropTypesRequired returns true) and |
| 104 // when the user dropped the data but we didn't get it all yet. |
| 105 bool waiting_for_data_; |
| 106 |
| 107 // Has OnDragDrop been invoked? |
| 108 bool received_drop_; |
| 109 |
| 110 // The view under the mouse. This is not necessarily the same as |
| 111 // helper_.target_view(). The two differ if the view under the mouse requires |
| 112 // the data. |
| 113 View* pending_view_; |
| 114 |
| 115 DISALLOW_COPY_AND_ASSIGN(DropTargetGtk); |
| 116 }; |
| 117 |
| 118 } // namespace views |
| 119 |
| 120 #endif // VIEWS_WIDGET_DROP_TARGET_GTK_H_ |
OLD | NEW |