Olivier Goffart <ogoffart@trolltech.com>
[WebKit-https.git] / WebCore / platform / qt / PasteboardQt.cpp
1 /*
2  * Copyright (C) 2006 Zack Rusin <zack@kde.org>
3  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
4  * Copyright (C) 2007 Trolltech ASA
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
26  */
27
28 #include "config.h"
29 #include "Pasteboard.h"
30
31 #include "DocumentFragment.h"
32 #include "Editor.h"
33 #include "Frame.h"
34 #include "Image.h"
35 #include "markup.h"
36 #include "RenderImage.h"
37
38 #include <qdebug.h>
39 #include <qclipboard.h>
40 #include <qmimedata.h>
41 #include <qapplication.h>
42 #include <qurl.h>
43
44 #define methodDebug() qDebug() << "PasteboardQt: " << __FUNCTION__;
45
46 namespace WebCore {
47     
48 Pasteboard::Pasteboard() 
49     : m_selectionMode(false)
50 {
51 }
52
53 Pasteboard* Pasteboard::generalPasteboard()
54 {
55     static Pasteboard* pasteboard = 0;
56     if (!pasteboard)
57         pasteboard = new Pasteboard();
58     return pasteboard;
59 }
60
61 void Pasteboard::writeSelection(Range* selectedRange, bool, Frame* frame)
62 {
63     QMimeData* md = new QMimeData;
64     QString text = frame->selectedText();
65     text.replace(QChar(0xa0), QLatin1Char(' '));
66     md->setText(text);
67     md->setHtml(createMarkup(selectedRange, 0, AnnotateForInterchange));
68     QApplication::clipboard()->setMimeData(md, m_selectionMode ? 
69             QClipboard::Selection : QClipboard::Clipboard);
70 }
71
72 bool Pasteboard::canSmartReplace()
73 {
74     return false;
75 }
76
77 String Pasteboard::plainText(Frame*)
78 {
79     return QApplication::clipboard()->text(m_selectionMode ? 
80             QClipboard::Selection : QClipboard::Clipboard);
81 }
82
83 PassRefPtr<DocumentFragment> Pasteboard::documentFragment(Frame* frame, PassRefPtr<Range> context,
84                                                           bool allowPlainText, bool& chosePlainText)
85 {
86     const QMimeData* mimeData = QApplication::clipboard()->mimeData(
87             m_selectionMode ? QClipboard::Selection : QClipboard::Clipboard);
88
89     chosePlainText = false;
90
91     if (mimeData->hasHtml()) {
92         QString html = mimeData->html();
93         if (!html.isEmpty()) {
94             RefPtr<DocumentFragment> fragment = createFragmentFromMarkup(frame->document(), html, "");
95             if (fragment)
96                 return fragment.release();
97         }
98     }
99
100     if (allowPlainText && mimeData->hasText()) {
101         chosePlainText = true;
102         RefPtr<DocumentFragment> fragment = createFragmentFromText(context.get(), mimeData->text());
103         if (fragment)
104             return fragment.release();
105     }
106
107     return 0;
108 }
109
110 void Pasteboard::writeURL(const KURL& _url, const String&, Frame*)
111 {
112     ASSERT(!_url.isEmpty());
113
114     QMimeData* md = new QMimeData;
115     QString url = _url.string();
116     md->setText(url);
117     md->setUrls(QList<QUrl>() << QUrl(url));
118     QApplication::clipboard()->setMimeData(md, m_selectionMode ?
119             QClipboard::Selection : QClipboard::Clipboard);
120 }
121
122 void Pasteboard::writeImage(Node* node, const KURL&, const String&)
123 {
124     ASSERT(node && node->renderer() && node->renderer()->isImage());
125
126     CachedImage* cachedImage = static_cast<RenderImage*>(node->renderer())->cachedImage();
127     ASSERT(cachedImage);
128
129     Image* image = cachedImage->image();
130     ASSERT(image);
131
132     QPixmap* pixmap = image->getPixmap();
133     ASSERT(pixmap);
134
135     QApplication::clipboard()->setPixmap(*pixmap, QClipboard::Clipboard);
136 }
137
138 /* This function is called from Editor::tryDHTMLCopy before actually set the clipboard
139  * It introduce a race condition with klipper, which will try to grab the clipboard 
140  * It's not required to clear it anyway, since QClipboard take care about replacing the clipboard
141  */
142 void Pasteboard::clear()
143 {
144 }
145
146 bool Pasteboard::isSelectionMode() const
147 {
148     return m_selectionMode;
149 }
150
151 void Pasteboard::setSelectionMode(bool selectionMode)
152 {
153     m_selectionMode = selectionMode;
154 }
155
156 }