1/* 2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef DragController_h 27#define DragController_h 28 29#include "DragActions.h" 30#include "DragImage.h" 31#include "IntPoint.h" 32#include "KURL.h" 33 34namespace WebCore { 35 36 class Clipboard; 37 class Document; 38 class DragClient; 39 class DragData; 40 class Element; 41 class Frame; 42 class FrameSelection; 43 class HTMLInputElement; 44 class Image; 45 class IntRect; 46 class Node; 47 class Page; 48 class PlatformMouseEvent; 49 class Range; 50 51 struct DragSession; 52 struct DragState; 53 54 class DragController { 55 WTF_MAKE_NONCOPYABLE(DragController); WTF_MAKE_FAST_ALLOCATED; 56 public: 57 ~DragController(); 58 59 static PassOwnPtr<DragController> create(Page*, DragClient*); 60 61 DragClient* client() const { return m_client; } 62 63 DragSession dragEntered(DragData*); 64 void dragExited(DragData*); 65 DragSession dragUpdated(DragData*); 66 bool performDrag(DragData*); 67 68 // FIXME: It should be possible to remove a number of these accessors once all 69 // drag logic is in WebCore. 70 void setDidInitiateDrag(bool initiated) { m_didInitiateDrag = initiated; } 71 bool didInitiateDrag() const { return m_didInitiateDrag; } 72 DragOperation sourceDragOperation() const { return m_sourceDragOperation; } 73 const KURL& draggingImageURL() const { return m_draggingImageURL; } 74 void setDragOffset(const IntPoint& offset) { m_dragOffset = offset; } 75 const IntPoint& dragOffset() const { return m_dragOffset; } 76 DragSourceAction dragSourceAction() const { return m_dragSourceAction; } 77 78 Document* documentUnderMouse() const { return m_documentUnderMouse.get(); } 79 DragDestinationAction dragDestinationAction() const { return m_dragDestinationAction; } 80 DragSourceAction delegateDragSourceAction(const IntPoint& rootViewPoint); 81 82 Element* draggableElement(const Frame*, Element* start, const IntPoint&, DragState&) const; 83 void dragEnded(); 84 85 void placeDragCaret(const IntPoint&); 86 87 bool startDrag(Frame* src, const DragState&, DragOperation srcOp, const PlatformMouseEvent& dragEvent, const IntPoint& dragOrigin); 88 static const IntSize& maxDragImageSize(); 89 90 static const int LinkDragBorderInset; 91 static const int MaxOriginalImageArea; 92 static const int DragIconRightInset; 93 static const int DragIconBottomInset; 94 static const float DragImageAlpha; 95 96 private: 97 DragController(Page*, DragClient*); 98 99 bool dispatchTextInputEventFor(Frame*, DragData*); 100 bool canProcessDrag(DragData*); 101 bool concludeEditDrag(DragData*); 102 DragSession dragEnteredOrUpdated(DragData*); 103 DragOperation operationForLoad(DragData*); 104 bool tryDocumentDrag(DragData*, DragDestinationAction, DragSession&); 105 bool tryDHTMLDrag(DragData*, DragOperation&); 106 DragOperation dragOperation(DragData*); 107 void cancelDrag(); 108 bool dragIsMove(FrameSelection*, DragData*); 109 bool isCopyKeyDown(DragData*); 110 111 void mouseMovedIntoDocument(Document*); 112 113 void doImageDrag(Element*, const IntPoint&, const IntRect&, Clipboard*, Frame*, IntPoint&); 114 void doSystemDrag(DragImageRef, const IntPoint&, const IntPoint&, Clipboard*, Frame*, bool forLink); 115 void cleanupAfterSystemDrag(); 116 117 Page* m_page; 118 DragClient* m_client; 119 120 RefPtr<Document> m_documentUnderMouse; // The document the mouse was last dragged over. 121 RefPtr<Document> m_dragInitiator; // The Document (if any) that initiated the drag. 122 RefPtr<HTMLInputElement> m_fileInputElementUnderMouse; 123 bool m_documentIsHandlingDrag; 124 125 DragDestinationAction m_dragDestinationAction; 126 DragSourceAction m_dragSourceAction; 127 bool m_didInitiateDrag; 128 DragOperation m_sourceDragOperation; // Set in startDrag when a drag starts from a mouse down within WebKit 129 IntPoint m_dragOffset; 130 KURL m_draggingImageURL; 131 }; 132 133} 134 135#endif 136