1/*
2 * Copyright (C) 2007 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 DragData_h
27#define DragData_h
28
29#include "Color.h"
30#include "DragActions.h"
31#include "IntPoint.h"
32
33#include <wtf/Forward.h>
34#include <wtf/HashMap.h>
35#include <wtf/Vector.h>
36
37#if PLATFORM(MAC)
38#include <wtf/RetainPtr.h>
39#ifdef __OBJC__
40#import <Foundation/Foundation.h>
41#import <AppKit/NSDragging.h>
42typedef id <NSDraggingInfo> DragDataRef;
43@class NSPasteboard;
44#else
45typedef void* DragDataRef;
46class NSPasteboard;
47#endif
48#elif PLATFORM(QT)
49QT_BEGIN_NAMESPACE
50class QMimeData;
51QT_END_NAMESPACE
52typedef const QMimeData* DragDataRef;
53#elif PLATFORM(WIN)
54typedef struct IDataObject* DragDataRef;
55#include <wtf/text/WTFString.h>
56#elif PLATFORM(WX)
57typedef class wxDataObject* DragDataRef;
58#elif PLATFORM(GTK)
59namespace WebCore {
60class DataObjectGtk;
61}
62typedef WebCore::DataObjectGtk* DragDataRef;
63#elif defined ANDROID
64typedef void* DragDataRef;
65#elif PLATFORM(CHROMIUM)
66#include "DragDataRef.h"
67#elif PLATFORM(HAIKU)
68class BMessage;
69typedef class BMessage* DragDataRef;
70#elif PLATFORM(EFL) || PLATFORM(BREWMP)
71typedef void* DragDataRef;
72#endif
73
74
75namespace WebCore {
76
77class Frame;
78class DocumentFragment;
79class KURL;
80class Range;
81
82enum DragApplicationFlags {
83    DragApplicationNone = 0,
84    DragApplicationIsModal = 1,
85    DragApplicationIsSource = 2,
86    DragApplicationHasAttachedSheet = 4,
87    DragApplicationIsCopyKeyDown = 8
88};
89
90#if PLATFORM(WIN)
91typedef HashMap<UINT, Vector<String> > DragDataMap;
92#endif
93
94class DragData {
95public:
96    enum FilenameConversionPolicy { DoNotConvertFilenames, ConvertFilenames };
97
98    // clientPosition is taken to be the position of the drag event within the target window, with (0,0) at the top left
99    DragData(DragDataRef, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone);
100    DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone);
101#if PLATFORM(WIN)
102    DragData(const DragDataMap&, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags = DragApplicationNone);
103    const DragDataMap& dragDataMap();
104#endif
105    const IntPoint& clientPosition() const { return m_clientPosition; }
106    const IntPoint& globalPosition() const { return m_globalPosition; }
107    DragApplicationFlags flags() { return m_applicationFlags; }
108    DragDataRef platformData() const { return m_platformDragData; }
109    DragOperation draggingSourceOperationMask() const { return m_draggingSourceOperationMask; }
110    bool containsURL(Frame*, FilenameConversionPolicy filenamePolicy = ConvertFilenames) const;
111    bool containsPlainText() const;
112    bool containsCompatibleContent() const;
113    String asURL(Frame*, FilenameConversionPolicy filenamePolicy = ConvertFilenames, String* title = 0) const;
114    String asPlainText(Frame*) const;
115    void asFilenames(Vector<String>&) const;
116    Color asColor() const;
117    PassRefPtr<DocumentFragment> asFragment(Frame*, PassRefPtr<Range> context,
118                                            bool allowPlainText, bool& chosePlainText) const;
119    bool canSmartReplace() const;
120    bool containsColor() const;
121    bool containsFiles() const;
122#if PLATFORM(MAC)
123    NSPasteboard *pasteboard() { return m_pasteboard.get(); }
124#endif
125private:
126    IntPoint m_clientPosition;
127    IntPoint m_globalPosition;
128    DragDataRef m_platformDragData;
129    DragOperation m_draggingSourceOperationMask;
130    DragApplicationFlags m_applicationFlags;
131#if PLATFORM(MAC)
132    RetainPtr<NSPasteboard> m_pasteboard;
133#endif
134#if PLATFORM(WIN)
135    DragDataMap m_dragDataMap;
136#endif
137};
138
139}
140
141#endif // !DragData_h
142
143