diff options
Diffstat (limited to 'WebKit/mac/WebCoreSupport/WebDragClient.mm')
-rw-r--r-- | WebKit/mac/WebCoreSupport/WebDragClient.mm | 145 |
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; +} |