summaryrefslogtreecommitdiffstats
path: root/WebKit/mac/WebCoreSupport/WebDragClient.mm
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/mac/WebCoreSupport/WebDragClient.mm')
-rw-r--r--WebKit/mac/WebCoreSupport/WebDragClient.mm145
1 files changed, 145 insertions, 0 deletions
diff --git a/WebKit/mac/WebCoreSupport/WebDragClient.mm b/WebKit/mac/WebCoreSupport/WebDragClient.mm
new file mode 100644
index 0000000..42c3d33
--- /dev/null
+++ b/WebKit/mac/WebCoreSupport/WebDragClient.mm
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "WebDragClient.h"
+
+#import "WebArchive.h"
+#import "WebDOMOperations.h"
+#import "WebFrame.h"
+#import "WebFrameInternal.h"
+#import "WebHTMLViewInternal.h"
+#import "WebHTMLViewPrivate.h"
+#import "WebKitLogging.h"
+#import "WebNSPasteboardExtras.h"
+#import "WebNSURLExtras.h"
+#import "WebUIDelegate.h"
+#import "WebUIDelegatePrivate.h"
+#import "WebViewInternal.h"
+#import <WebCore/ClipboardMac.h>
+#import <WebCore/DragData.h>
+#import <WebCore/EventHandler.h>
+#import <WebCore/Frame.h>
+#import <WebCore/FrameView.h>
+#import <WebCore/Image.h>
+#import <WebCore/Page.h>
+
+using namespace WebCore;
+
+WebDragClient::WebDragClient(WebView* webView)
+ : m_webView(webView)
+{
+}
+
+static WebHTMLView *getTopHTMLView(Frame* frame)
+{
+ ASSERT(frame);
+ ASSERT(frame->page());
+ return (WebHTMLView*)[[kit(frame->page()->mainFrame()) frameView] documentView];
+}
+
+WebCore::DragDestinationAction WebDragClient::actionMaskForDrag(WebCore::DragData* dragData)
+{
+ return (WebCore::DragDestinationAction)[[m_webView _UIDelegateForwarder] webView:m_webView dragDestinationActionMaskForDraggingInfo:dragData->platformData()];
+}
+
+void WebDragClient::willPerformDragDestinationAction(WebCore::DragDestinationAction action, WebCore::DragData* dragData)
+{
+ [[m_webView _UIDelegateForwarder] webView:m_webView willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:dragData->platformData()];
+}
+
+
+WebCore::DragSourceAction WebDragClient::dragSourceActionMaskForPoint(const IntPoint& windowPoint)
+{
+ NSPoint viewPoint = [m_webView convertPoint:windowPoint fromView:nil];
+ return (DragSourceAction)[[m_webView _UIDelegateForwarder] webView:m_webView dragSourceActionMaskForPoint:viewPoint];
+}
+
+void WebDragClient::willPerformDragSourceAction(WebCore::DragSourceAction action, const WebCore::IntPoint& mouseDownPoint, WebCore::Clipboard* clipboard)
+{
+ ASSERT(clipboard);
+ [[m_webView _UIDelegateForwarder] webView:m_webView willPerformDragSourceAction:(WebDragSourceAction)action fromPoint:mouseDownPoint withPasteboard:static_cast<WebCore::ClipboardMac*>(clipboard)->pasteboard()];
+}
+
+void WebDragClient::startDrag(DragImageRef dragImage, const IntPoint& at, const IntPoint& eventPos, Clipboard* clipboard, Frame* frame, bool linkDrag)
+{
+ if (!frame)
+ return;
+ ASSERT(clipboard);
+ RetainPtr<WebHTMLView> htmlView = (WebHTMLView*)[[kit(frame) frameView] documentView];
+ if (![htmlView.get() isKindOfClass:[WebHTMLView class]])
+ return;
+
+ NSEvent *event = linkDrag ? frame->eventHandler()->currentNSEvent() : [htmlView.get() _mouseDownEvent];
+ WebHTMLView* topHTMLView = getTopHTMLView(frame);
+ RetainPtr<WebHTMLView> topViewProtector = topHTMLView;
+
+ [topHTMLView _stopAutoscrollTimer];
+ NSPasteboard *pasteboard = static_cast<ClipboardMac*>(clipboard)->pasteboard();
+
+ NSImage *dragNSImage = dragImage.get();
+ WebHTMLView *sourceHTMLView = htmlView.get();
+
+ id delegate = [m_webView UIDelegate];
+ SEL selector = @selector(webView:dragImage:at:offset:event:pasteboard:source:slideBack:forView:);
+ if ([delegate respondsToSelector:selector]) {
+ if ([m_webView _catchesDelegateExceptions]) {
+ @try {
+ [delegate webView:m_webView dragImage:dragNSImage at:at offset:NSZeroSize event:event pasteboard:pasteboard source:sourceHTMLView slideBack:YES forView:topHTMLView];
+ } @catch (id exception) {
+ ReportDiscardedDelegateException(selector, exception);
+ }
+ } else
+ [delegate webView:m_webView dragImage:dragNSImage at:at offset:NSZeroSize event:event pasteboard:pasteboard source:sourceHTMLView slideBack:YES forView:topHTMLView];
+ } else
+ [topHTMLView dragImage:dragNSImage at:at offset:NSZeroSize event:event pasteboard:pasteboard source:sourceHTMLView slideBack:YES];
+}
+
+DragImageRef WebDragClient::createDragImageForLink(KURL& url, const String& title, Frame* frame)
+{
+ if (!frame)
+ return nil;
+ WebHTMLView *htmlView = (WebHTMLView *)[[kit(frame) frameView] documentView];
+ NSString *label = 0;
+ if (!title.isEmpty())
+ label = title;
+ NSURL *cocoaURL = url;
+ return [htmlView _dragImageForURL:[cocoaURL _web_userVisibleString] withLabel:label];
+}
+
+
+void WebDragClient::declareAndWriteDragImage(NSPasteboard* pasteboard, DOMElement* element, NSURL* URL, NSString* title, WebCore::Frame* frame)
+{
+ ASSERT(pasteboard);
+ ASSERT(element);
+ WebHTMLView *source = getTopHTMLView(frame);
+ WebArchive *archive = [element webArchive];
+
+ [pasteboard _web_declareAndWriteDragImageForElement:element URL:URL title:title archive:archive source:source];
+}
+
+void WebDragClient::dragControllerDestroyed()
+{
+ delete this;
+}