6c395c727ecbe28b5208e66ad02d1ab0b939402f
[WebKit-https.git] / WebKit / gtk / WebCoreSupport / DragClientGtk.cpp
1 /*
2  * Copyright (C) Igalia S.L.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Lesser General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public
15  *  License along with this library; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "config.h"
20 #include "DragClientGtk.h"
21
22 #include "ClipboardGtk.h"
23 #include "ClipboardUtilitiesGtk.h"
24 #include "DataObjectGtk.h"
25 #include "Document.h"
26 #include "DragController.h"
27 #include "Element.h"
28 #include "Frame.h"
29 #include "GOwnPtrGtk.h"
30 #include "GRefPtrGtk.h"
31 #include "GtkVersioning.h"
32 #include "NotImplemented.h"
33 #include "PasteboardHelper.h"
34 #include "RenderObject.h"
35 #include "webkitprivate.h"
36 #include "webkitwebview.h"
37 #include <gtk/gtk.h>
38
39 using namespace WebCore;
40
41 namespace WebKit {
42
43 DragClient::DragClient(WebKitWebView* webView)
44     : m_webView(webView)
45     , m_startPos(0, 0)
46 {
47 }
48
49 void DragClient::willPerformDragDestinationAction(DragDestinationAction, DragData*)
50 {
51 }
52
53 void DragClient::willPerformDragSourceAction(DragSourceAction, const IntPoint& startPos, Clipboard*)
54 {
55     m_startPos = startPos;
56 }
57
58 DragDestinationAction DragClient::actionMaskForDrag(DragData*)
59 {
60     notImplemented();
61     return DragDestinationActionAny;
62 }
63
64 DragSourceAction DragClient::dragSourceActionMaskForPoint(const IntPoint&)
65 {
66     notImplemented();
67     return DragSourceActionAny;
68 }
69
70 void DragClient::startDrag(DragImageRef image, const IntPoint& dragImageOrigin, const IntPoint& eventPos, Clipboard* clipboard, Frame* frame, bool linkDrag)
71 {
72     ClipboardGtk* clipboardGtk = reinterpret_cast<ClipboardGtk*>(clipboard);
73
74     WebKitWebView* webView = webkit_web_frame_get_web_view(kit(frame));
75     RefPtr<DataObjectGtk> dataObject = clipboardGtk->dataObject();
76     GRefPtr<GtkTargetList> targetList(clipboardGtk->helper()->targetListForDataObject(dataObject.get()));
77     GOwnPtr<GdkEvent> currentEvent(gtk_get_current_event());
78
79     GdkDragContext* context = gtk_drag_begin(GTK_WIDGET(m_webView), targetList.get(), dragOperationToGdkDragActions(clipboard->sourceOperation()), 1, currentEvent.get());
80     webView->priv->draggingDataObjects.set(context, dataObject);
81
82     if (image)
83         gtk_drag_set_icon_pixbuf(context, image, eventPos.x() - dragImageOrigin.x(), eventPos.y() - dragImageOrigin.y());
84     else
85         gtk_drag_set_icon_default(context);
86 }
87
88 DragImageRef DragClient::createDragImageForLink(KURL&, const String&, Frame*)
89 {
90     notImplemented();
91     return 0;
92 }
93
94 void DragClient::dragControllerDestroyed()
95 {
96     delete this;
97 }
98 }