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 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 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 "URL.h" 33 34namespace WebCore { 35 36 class DataTransfer; 37 class Document; 38 class DragClient; 39 class DragData; 40 class Element; 41 class Frame; 42 class FrameSelection; 43 class HTMLInputElement; 44 class IntRect; 45 class Page; 46 class PlatformMouseEvent; 47 48 struct DragState; 49 50 class DragController { 51 WTF_MAKE_NONCOPYABLE(DragController); WTF_MAKE_FAST_ALLOCATED; 52 public: 53 DragController(Page&, DragClient&); 54 ~DragController(); 55 56 static PassOwnPtr<DragController> create(Page*, DragClient*); 57 58 DragClient& client() const { return m_client; } 59 60 DragOperation dragEntered(DragData&); 61 void dragExited(DragData&); 62 DragOperation dragUpdated(DragData&); 63 bool performDragOperation(DragData&); 64 65 bool mouseIsOverFileInput() const { return m_fileInputElementUnderMouse; } 66 unsigned numberOfItemsToBeAccepted() const { return m_numberOfItemsToBeAccepted; } 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 URL& 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 bool dispatchTextInputEventFor(Frame*, DragData&); 98 bool canProcessDrag(DragData&); 99 bool concludeEditDrag(DragData&); 100 DragOperation dragEnteredOrUpdated(DragData&); 101 DragOperation operationForLoad(DragData&); 102 bool tryDocumentDrag(DragData&, DragDestinationAction, DragOperation&); 103 bool tryDHTMLDrag(DragData&, DragOperation&); 104 DragOperation dragOperation(DragData&); 105 void cancelDrag(); 106 bool dragIsMove(FrameSelection&, DragData&); 107 bool isCopyKeyDown(DragData&); 108 109 void mouseMovedIntoDocument(Document*); 110 111 void doImageDrag(Element&, const IntPoint&, const IntRect&, DataTransfer&, Frame&, IntPoint&); 112 void doSystemDrag(DragImageRef, const IntPoint&, const IntPoint&, DataTransfer&, Frame&, bool forLink); 113 void cleanupAfterSystemDrag(); 114 void declareAndWriteDragImage(DataTransfer&, Element&, const URL&, const String& label); 115 116 Page& m_page; 117 DragClient& m_client; 118 119 RefPtr<Document> m_documentUnderMouse; // The document the mouse was last dragged over. 120 RefPtr<Document> m_dragInitiator; // The Document (if any) that initiated the drag. 121 RefPtr<HTMLInputElement> m_fileInputElementUnderMouse; 122 unsigned m_numberOfItemsToBeAccepted; 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 URL m_draggingImageURL; 131 }; 132 133} 134 135#endif 136